Field note · October 25, 2026

172 zeros in dep_delay_min, and what they mean

2.2% of one column is exactly zero. Whether that is a measurement or an absence changes every aggregate built on it.

1 min read ·Data quality ·quality statistics

dep_delay_min on flight-delays is zero in 172 of 8,000 rows — 2.2% of the column.

Zero in a numeric column almost always means one of two things, and they need different handling. Either the thing was measured and came out zero, or the thing did not happen and zero is standing in for absence. 2.2% of this column is zero, which is far too much to be an accident of measurement.

Averaging across both meanings gives you a number that describes neither group. The mean of dep_delay_min including zeros is 10. Excluding them it is roughly 10 — a different number about a different population.

sql
select
  count(*) filter (where dep_delay_min = 0)  as zero_rows,
  count(*) filter (where dep_delay_min > 0)  as positive_rows,
  avg(dep_delay_min)                          as mean_all,
  avg(dep_delay_min) filter (where dep_delay_min > 0) as mean_positive
from flight_delays;

The reporting version is usually two numbers rather than one: the rate at which the thing happens, and the size when it does. Those move independently, and a single average hides which one changed. A drop in the combined mean could be fewer events or smaller events, and you cannot tell them apart after the fact.

Same shape as the null problem, except nothing warns you, because zero is a perfectly valid number and every aggregate happily includes it.