← All work

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%.