描述性统计、趋势分析、异常检测、假设检验以及关于何时对统计结论保持谨慎的指南。
根据数据选择合适的中心度量:
| 情况 | 使用 | 原因 |
|---|---|---|
| 对称分布,无异常值 | 均值 | 最有效的估计量 |
| 偏斜分布 | 中位数 | 对异常值稳健 |
| 分类或有序数据 | 众数 | 非数值数据的唯一选择 |
| 高度偏斜且有异常值(例如每用户收入) | 中位数 + 均值 | 同时报告;差异显示偏斜程度 |
对于业务指标,始终同时报告均值和中位数。 如果它们显著偏离,则数据偏斜,仅凭均值会产生误导。
报告关键百分位数,讲述比均值更丰富的故事:
p1: 底部 1%(下限 / 典型最小值)
p5: 正常范围的低端
p25: 第一四分位
p50: 中位数(典型用户)
p75: 第三四分位
p90: 前 10% / 重度用户
p95: 正常范围的高端
p99: 前 1% / 极端用户
示例叙述:"中位会话时长为 4.2 分钟,但前 10% 的用户每次会话花费超过 22 分钟,将均值拉高至 7.8 分钟。"
描述你分析的每个数值分布:
移动平均线用于平滑噪声:
# 7 天移动平均线(适用于具有周季节性的日度数据)
df['ma_7d'] = df['metric'].rolling(window=7, min_periods=1).mean()
# 28 天移动平均线(同时平滑周和月模式)
df['ma_28d'] = df['metric'].rolling(window=28, min_periods=1).mean()环比比较:
增长率:
简单增长:(当前 - 上一期)/ 上一期
复合年增长率:(期末 / 期初)^ (1 / 年数) - 1
对数增长:ln(当前 / 上一期) —— 更适合波动序列
检查周期性模式:
对于业务分析师(而非数据科学家),使用直接的方法:
始终传达不确定性。提供范围而非点估计:
何时升级给数据科学家:非线性趋势、多种季节性、外部因素(营销支出、节假日),或者当预测准确性对资源分配至关重要时。
Z 分数法(适用于正态分布数据):
z_scores = (df['value'] - df['value'].mean()) / df['value'].std()
outliers = df[abs(z_scores) > 3] # 超过 3 个标准差IQR 法(对非正态分布稳健):
Q1 = df['value'].quantile(0.25)
Q3 = df['value'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df['value'] < lower_bound) | (df['value'] > upper_bound)]百分位法(最简单):
outliers = df[(df['value'] < df['value'].quantile(0.01)) |
(df['value'] > df['value'].quantile(0.99))]不要自动移除异常值。而是:
报告你的处理方式:"我们排除了 47 条记录(0.3%),其交易金额超过 $50K,这些代表企业批量订单,已单独分析。"
检测时间序列中的异常值:
当需要确定观察到的差异是真实存在的还是可能由随机因素导致时,使用假设检验。常见场景:
| 场景 | 检验 | 何时使用 |
|---|---|---|
| 比较两个组均值 | t 检验(独立样本) | 正态数据,两组 |
| 比较两个组比例 | z 比例检验 | 转化率、二元结果 |
| 比较配对测量 | 配对 t 检验 | 同一实体的前后对比 |
| 比较 3+ 组均值 | 方差分析(ANOVA) | 多个细分或变体 |
| 非正态数据,两组 | Mann-Whitney U 检验 | 偏斜指标、有序数据 |
| 类别间关联 | 卡方检验 | 两个分类变量 |
统计显著性意味着差异不太可能是由偶然因素导致的。
实际显著性意味着差异足够大,对业务决策有意义。
差异可能具有统计显著性但在实际上无意义(在大样本中常见)。始终报告:
发现相关性时,明确考虑:
可以说:"使用功能 X 的用户留存率提高 30%" 没有更多证据不能说:"功能 X 导致留存率提高 30%"
当你检验多个假设时,有些会偶然"显著":
聚合数据中的趋势在细分数据时可能反转:
你只能分析"幸存"到数据集中的实体:
聚合趋势可能不适用于个体:
警惕虚假精确: