Data audit (P1)
- File: data/firms.csv, SHA-256 34aa682e59ef64cfc56931ea33bb809797cd53eca83edfe370c31aeaa8e8b7df
- 1200 rows (excl. header) x 4 columns: firm_id int (1001-2200, unique), skill_index float (std index, mean -0.001, sd 0.99, range -3.83..2.96), training_hours float (hours/employee, mean 19.9, sd 8.2, range -7.59..51.77), productivity_growth float (% change, mean 7.08, sd 4.02, range -4.04..19.39).
- Missing values: none. Duplicate rows: 0. Duplicate firm_id: 0.
- Anomaly: 12 rows with negative training_hours (-7.585 to -0.133) — physically impossible (hours cannot be negative). All have low skill_index (-3.0 to -1.0). Decision: exclude from main analysis (both models estimated on the same 1188 rows); sensitivity analysis on all 1200 rows reported.
- Correlations: skill_index vs training_hours 0.69, skill_index vs growth -0.79, training_hours vs growth -0.28 -> strong confounding by skill expected (naive slope sign opposite to adjusted).
- Information availability: skill_index is measured the year before the programme (pre-treatment) -> legitimate control. No violating inputs.