本文目录导读:

你提到"这个Python案例",但我没有看到具体的代码或数据,不过关于数据统计的差距,我可以从几个常见角度帮你分析,你可以对照你的案例看看属于哪种情况:
先定位"差距"的类型
数据统计出现差距,通常来自这几类原因:
口径不一致(最常见)
- 分母不同:一个按"订单数"算,一个按"用户数"算
- 时间窗口不同:自然月 vs 滚动30天;含不含当天
- 去重逻辑不同:
COUNT(*)vsCOUNT(DISTINCT user_id) - 过滤条件不同:是否剔除测试账号、退款单、异常值
👉 检查:两边的 SQL/代码里 WHERE、GROUP BY、时间边界是否完全对齐。
数据源与同步延迟
- 埋点表 vs 业务库 vs 数仓,更新频率不同
- 实时流有延迟,离线 T+1 还没跑完
- 主从库读写分离导致短暂不一致
精度与舍入
- 浮点数累加误差(
1+0.2 != 0.3) - 百分比四舍五入方向不同
floatvsDecimal
缺失值与重复值
NULL参与聚合时的行为(SUM忽略 NULL,COUNT(*)不忽略)JOIN时一对多导致行数膨胀(这是统计翻倍的经典坑)
抽样与估算
- 用了
sample()或近似算法(HyperLogLog 估 UV) - 大数据量下的近似聚合
排查方法(建议按顺序)
# 1. 先对齐"总数",再看"分组" # 2. 逐步加 WHERE 条件,看差距在哪一步出现 # 3. 用集合运算定位差异行 diff = set(df_a.index) ^ set(df_b.index)
具体步骤:
- 对总数:两边都算
COUNT(DISTINCT 主键),先看总量差多少 - 逐层下钻:按维度(日期/渠道/地区)分组对比,找出差异集中的切片
- 定位到行:用
merge(indicator=True)找出left_only/right_only - 看 NULL 和重复:
df.isna().sum()、df.duplicated().sum()
怎么"看待"这个差距
关键判断:差距是"可解释的"还是"不可解释的"。
- ✅ 可解释:口径不同、延迟、舍入——记录下来,统一口径即可
- ⚠️ 需警惕:JOIN 膨胀、NULL 处理、去重逻辑——这类会系统性放大误差
- ❌ 不可解释:找不到原因且差距稳定存在——说明有隐藏的数据质量问题
经验法则:差距 < 0.1% 通常是舍入/延迟;1%~5% 多半是口径;>10% 基本是逻辑 bug(JOIN 膨胀、重复计数)。