Pole Inspection Risk
Turning 13 years of messy utility inspection records into a risk model that tells crews which poles to look at first.
- Timeline
- Jan 2026 – June 2026 · Complete
- Role
- Data Scientist (capstone), Tacoma Public Utilities
- Modality
- Tabular · Geospatial
- Evaluated on
- Recall on failures · SHAP plausibility
- Records
- 152,000+
- Source files
- 367
- Circuits mapped
- 217
- Est. risk reduction
- ~18%
The problem
A public utility had 152,000+ pole inspection records spread across 367 separate files going back to 2013, written by different vendors who each named things their own way. Nobody could answer a simple question: which poles are most likely to fail?
What I built
A Python ETL pipeline that consolidated all 367 files into one analysis-ready dataset, normalizing 100+ vendor-specific attribute spellings with regex. On top of that, reject/pass risk classifiers (logistic regression, XGBoost, LightGBM) over ~49,000 imbalanced records using SMOTE and stratified splits. I used SHAP to identify shell rot and decay as the dominant failure drivers, mapped risk across 217 circuits with geospatial features (pyproj, Folium) inside an FMEA/RPN framework, and shipped production Tableau dashboards for 5+ stakeholder groups. I later re-engineered the pipeline to be event-driven, so new inspection data triggers reprocessing and pushes updated scores to the dashboards without a manual refresh. I also set the data-governance standards so quality holds as new data lands.
How I knew it worked
Class imbalance was the central risk: a model that calls everything “pass” scores well and is useless. I used stratified splits and SMOTE, and judged the model on its ability to catch the failures rather than on overall accuracy. SHAP was there to check the model was keying on physically sensible drivers rather than on artifacts of a particular vendor's formatting. The FMEA/RPN scoring translated model output into a prioritized inspection plan, which cut estimated failure risk by ~18%.