Workforce Demand Forecasting
Overview
Section titled “Overview”The Workforce Demand Forecasting model predicts the number of field crew hours required across skill categories over an 18-month forward horizon. It uses a Prophet + XGBoost ensemble architecture, with Prophet modelling temporal structure (trend, seasonality) and XGBoost modelling exogenous business drivers (capex programs, vegetation seasons, storm events).
Model Architecture
Section titled “Model Architecture”# Ensemble structureclass WorkforceForecastEnsemble: """ Stage 1: Prophet models temporal patterns Stage 2: XGBoost models residuals using exogenous features Final: Blend Prophet base + XGBoost adjustment """
def __init__(self): self.prophet_models = {} # One per skill category self.xgb_models = {} # One per skill category self.blend_weights = {} # Learned blending weights
def predict(self, horizon_months: int, exog_features: dict) -> pd.DataFrame: prophet_forecast = self.prophet_predict(horizon_months) xgb_adjustment = self.xgb_predict(exog_features) return prophet_forecast + xgb_adjustmentModel Performance
Section titled “Model Performance”| Metric | Value | Notes |
|---|---|---|
| MAE | 124 crew-hours/month | Absolute error per skill category |
| MAPE | 4.2% | Percentage error |
| Forecast horizon | 18 months | Beyond 12 months, interval widens significantly |
| Update frequency | Monthly | Retrains on full history + new actuals |
Prophet Components
Section titled “Prophet Components”The Prophet base model captures:
Long-Term Trend
Section titled “Long-Term Trend”Workforce requirements grow with network expansion (capex programs, DER connections). The trend is modelled as a piecewise linear function with change points at regulatory period boundaries.
Annual Seasonality
Section titled “Annual Seasonality”- Summer peak (Nov–Feb): +35–80% above base for vegetation clearance during bushfire season
- Autumn taper (Mar–Apr): +15% above base for post-summer remediation
- Winter base (May–Aug): lowest demand, focus on planned asset replacement
- Spring ramp (Sep–Oct): pre-season vegetation clearance preparation
Weekly Seasonality
Section titled “Weekly Seasonality”- Monday: peak of planned work (fresh week)
- Friday: reduced (most crews return to depot)
- Saturday/Sunday: emergency response only (small baseline)
XGBoost Exogenous Features
Section titled “XGBoost Exogenous Features”| Feature | Lag | Description |
|---|---|---|
approved_capex_qtr | 0 | Approved capex for next quarter ($M) |
vegetation_program_km | 0 | Planned vegetation clearance km |
scheduled_replacements | 0 | Count of scheduled asset replacements |
storm_season_flag | 0 | Binary: Oct–Mar bushfire/storm season |
public_holiday_density | 0 | Number of public holidays in month |
prior_month_actual | 1 | Prior month actual crew-hours (lag 1) |
prior_year_actual | 12 | Same month prior year (lag 12) |
Skill Category Forecasts
Section titled “Skill Category Forecasts”The model produces separate forecasts for 6 skill categories:
| Skill Category | Description | Forecast Accuracy (MAPE) |
|---|---|---|
| HV Linesperson | High-voltage overhead line work | 3.8% |
| LV Linesperson | Low-voltage and service work | 4.1% |
| Cable Jointer | Underground cable work | 5.2% |
| Protection Engineer | Protection relay testing and design | 6.1% |
| Project Manager | Capital project management | 5.8% |
| Field Inspector | Vegetation and asset inspections | 3.4% |
Prediction Intervals
Section titled “Prediction Intervals”The model produces P10/P50/P90 prediction intervals:
# Prediction interval calculationdef get_prediction_intervals(forecast: np.ndarray, residuals_std: np.ndarray) -> dict: """ P10 (lower bound): 10th percentile — used for minimum staffing planning P50 (base case): median — primary planning figure P90 (upper bound): 90th percentile — contingency staffing buffer """ return { "P10": forecast - 1.28 * residuals_std, "P50": forecast, "P90": forecast + 1.28 * residuals_std }Interval width increases with horizon:
- 1–3 months: ±8% (narrow)
- 4–12 months: ±15% (moderate)
- 13–18 months: ±25% (wide)
Skills Gap Analysis
Section titled “Skills Gap Analysis”The skills gap is computed by comparing forecast demand against current workforce capacity:
Gap_month_skill = Forecast_demand_month_skill - (FTE_count_skill × Available_hours_per_FTE)Positive gap = shortage (need contractors or hire) Negative gap = surplus (potential redeployment or reduced contractor spend)
Bushfire Seasonality
Section titled “Bushfire Seasonality”Bushfire season creates the most significant demand spikes. The model explicitly incorporates:
- Historical fire weather index: days above Fire Danger Rating thresholds per region
- DNSP vegetation risk scores: aggregate risk score drives inspection and clearance demand
- Post-fire remediation factor: after significant fire events, network rebuilding demand is elevated for 6–12 months
API Endpoints
Section titled “API Endpoints”# 18-month workforce demand forecastGET /api/dnsp/workforce/forecast?dnsp=ausgrid&horizon=18m
# Specific skill categoryGET /api/dnsp/workforce/forecast?dnsp=ergon&skill=hv_linesperson&horizon=12m
# Skills gap analysisGET /api/dnsp/workforce/skills-gap?dnsp=sa_power_networks&horizon=12m
# Forecast with prediction intervalsGET /api/dnsp/workforce/forecast?dnsp=energex&include_intervals=true