Diagnosing Missing-Data Mechanisms
A survey dataset of 20,000 customers has three columns with missing values:
household_income: 28% missing. Missingness is 45% among customers aged 55+, 12% among under-35s.satisfaction_score: 9% missing. Missing rows are concentrated among customers who later churned.device_os: 1.5% missing, uniformly across every segment you check; the collection library had a known intermittent bug that month.
- Classify each column's likely mechanism (MCAR / MAR / MNAR) and justify.
- For each, state what naive listwise deletion (dropping any row with a missing value) would do to an analysis of the relationship between income and satisfaction.
- Propose a handling strategy for each column, including whether a missing indicator is worth adding.
1. Mechanisms
household_income— MAR (probably). Missingness depends strongly on age, which is observed. Conditional on age, it may be close to random; that is the MAR assumption. Caveat: it could also be partly MNAR (very high or very low earners declining regardless of age); MAR is the working assumption you can act on, not a proven fact.satisfaction_score— MNAR (likely). Missingness relates to churn, and dissatisfied customers are both more likely to skip the question and more likely to churn. The probability of being missing depends on the unobserved value itself (low satisfaction). Nothing in the observed columns fully explains it.device_os— MCAR. A known random technical fault, no relationship to any segment. This is the one case where dropping is harmless beyond the small loss of rows.
2. Effect of listwise deletion on income vs satisfaction
Dropping every row with any missing value removes about a third of the
data and, worse, removes it selectively: older customers (income
missing) and unhappy/churning customers (satisfaction missing) vanish
disproportionately. The remaining sample is younger and happier than the
population. Any income–satisfaction relationship estimated on it is
biased toward that surviving subgroup — for instance, if older customers
have both higher income and lower satisfaction, deleting them attenuates
or even flips the correlation. The device_os deletions, by contrast,
just shrink n by 1.5% without bias.
3. Handling
household_income(MAR): impute conditionally — group-wise median by age band (and other observed predictors), or a regression/iterative imputer using age, tenure, region. Addincome_missingas an indicator: older customers' non-response is informative in its own right and a downstream model can use it. Report results with and without imputation as a sensitivity check.satisfaction_score(MNAR): no imputation from observed data will be unbiased. Options: treat "did not answer" as an explicit category and keep those rows; bound the estimate by imputing worst-case and best-case values (sensitivity analysis); seek an external proxy (support tickets, NPS from another channel). Definitely add the indicator — here missingness is the signal.device_os(MCAR): drop the rows, or mode-impute if you need every row; an indicator adds nothing because missingness carries no information. Note the bug and the affected date range in the findings note.
Share this question