name: 统计分析 description: 应用统计方法,包括描述性统计、趋势分析、异常检测和假设测试。当分析分布、测试显著性、检测异常、计算相关性或解释统计结果时使用。
统计分析技能
描述性统计、趋势分析、异常检测、假设测试,以及何时对统计声明保持谨慎的指导。
描述性统计方法论
中心趋势
根据数据选择合适的中心度量:
| 情况 | 使用 | 原因 |
|---|---|---|
| 对称分布,无异常值 | 均值 | 最有效的估计量 |
| 偏态分布 | 中位数 | 对异常值稳健 |
| 分类或顺序数据 | 众数 | 非数值数据的唯一选择 |
| 高度偏态且有异常值(如每用户收入) | 中位数 + 均值 | 报告两者;差距显示偏态 |
对于业务指标,始终同时报告均值和中位数。 如果它们显著不同,数据是偏态的,仅用均值会误导。
离散性和变异性
- 标准差:值通常离均值有多远。用于正态分布数据。
- 四分位距(IQR):从 p25 到 p75 的距离。对异常值稳健。用于偏态数据。
- 变异系数(CV):标准差 / 均值。用于比较不同尺度指标的变异性。
- 范围:最大值减去最小值。对异常值敏感,但快速给出数据范围。
业务背景下的百分位数
报告关键百分位数,以讲述比仅用均值更丰富的故事:
p1: 底部 1%(地板 / 最小典型值)
p5: 正常范围低端
p25: 第一四分位数
p50: 中位数(典型用户)
p75: 第三四分位数
p90: 前 10% / 高级用户
p95: 正常范围高端
p99: 前 1% / 极端用户
示例叙述:“中位数会话时长为 4.2 分钟,但前 10% 的用户每次会话花费超过 22 分钟,将均值拉高到 7.8 分钟。”
描述分布
描述您分析的每个数值分布:
- 形状:正态、右偏、左偏、双峰、均匀、厚尾
- 中心:均值和中位数(及其差距)
- 离散:标准差或 IQR
- 异常值:有多少及多极端
- 边界:是否有自然地板(零)或天花板(100%)?
趋势分析和预测
识别趋势
移动平均以平滑噪声:
# 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()
期间对比:
- 周环比(WoW):与上周同一天比较
- 月环比(MoM):与上个月比较
- 年同比(YoY):季节性业务的黄金标准
- 去年同期:比较特定日历日
增长率:
简单增长:(当前 - 前一期) / 前一期
复合年增长率(CAGR):(结束 / 开始) ^ (1 / 年数) - 1
对数增长:ln(当前 / 前一期) —— 对于波动序列更好
季节性检测
检查周期性模式:
- 绘制原始时间序列 —— 首先视觉检查
- 计算星期几平均值:是否有明显的每周模式?
- 计算月份平均值:是否有年度周期?
- 比较期间时,始终使用年同比或同期比较,以避免将趋势与季节性混淆
预测(简单方法)
对于业务分析师(非数据科学家),使用直接方法:
- 朴素预测:明天 = 今天。用作基线。
- 季节性朴素:明天 = 上周/去年同一天。
- 线性趋势:对历史数据拟合直线。仅适用于明显线性趋势。
- 移动平均预测:使用滞后平均作为预测。
始终传达不确定性。提供范围,而非点估计:
- “基于 3 个月趋势,我们预计下个月将有 10K-12K 注册”
- 而非“下个月我们将恰好获得 11,234 注册”
何时升级到数据科学家:非线性趋势、多个季节性、外部因素(营销支出、节假日),或当预测准确性对资源分配至关重要时。
异常值和异常检测
统计方法
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))]
处理异常值
不要自动删除异常值。相反:
- 调查:这是数据错误、真正的极端值,还是不同群体?
- 数据错误:修复或删除(例如,负年龄、1970 年时间戳)
- 真实极端:保留它们,但考虑使用稳健统计(用中位数代替均值)
- 不同群体:将它们分割出来进行单独分析(例如,企业客户 vs SMB 客户)
报告您所做的:“我们排除了 47 条记录(0.3%),交易金额 >$50K,这些代表批量企业订单,单独分析。”
时间序列异常检测
用于检测时间序列中的异常值:
- 计算预期值(移动平均或去年同期)
- 计算与预期的偏差
- 标记超出阈值的偏差(通常是残差标准差的 2-3 倍)
- 区分点异常(单个异常值)和变化点(持续偏移)
假设测试基础
何时使用
当您需要确定观察到的差异是真实还是可能是随机变化时,使用假设测试。常见场景:
- A/B 测试结果:变体 B 是否真的比 A 好?
- 前后比较:产品变更是否真的移动了指标?
- 群体比较:企业客户是否真的有更高的留存率?
框架
- 零假设(H0):没有差异(默认假设)
- 备择假设(H1):有差异
- 选择显著性水平(alpha):通常为 0.05(5% 假阳性几率)
- 计算测试统计量和 p 值
- 解释:如果 p < alpha,拒绝 H0(存在真实差异的证据)
常见测试
| 场景 | 测试 | 何时使用 |
|---|---|---|
| 比较两个群体均值 | t 检验(独立) | 正态数据,两个群体 |
| 比较两个群体比例 | 比例 z 检验 | 转化率、二元结果 |
| 比较配对测量值 | 配对 t 检验 | 同一实体的前后测量 |
| 比较 3+ 群体均值 | 方差分析(ANOVA) | 多个群体或变体 |
| 非正态数据,两个群体 | Mann-Whitney U 检验 | 偏态指标、顺序数据 |
| 类别间关联 | 卡方检验 | 两个分类变量 |
实际显著性与统计显著性
统计显著性意味着差异不太可能由机会引起。
实际显著性意味着差异足够大,对业务决策重要。
差异可能统计显著但实际无意义(常见于大样本)。始终报告:
- 效应大小:差异有多大?(例如,“变体 B 将转化率提高了 0.3 个百分点”)
- 置信区间:真实效应的可能范围是什么?
- 业务影响:这转化为多少收入、用户或其他业务术语?
样本量考虑
- 小样本产生不可靠的结果,即使 p 值显著
- 对于比例的经验法则:每个群体至少需要 30 个事件以获得基本可靠性
- 检测小效应(例如,1% 转化率变化)可能需要每个群体数千个观测值
- 如果样本量小,说明:“每个群体仅有 200 个观测值,我们检测小于 X% 效应的能力有限”
何时对统计声明保持谨慎
相关性不等于因果性
当发现相关性时,明确考虑:
- 反向因果:可能是 B 导致 A,而不是 A 导致 B
- 混淆变量:可能是 C 导致 A 和 B
- 巧合:变量足够多时,虚假相关性不可避免
您可以说的:“使用功能 X 的用户有 30% 更高的留存率” 在没有更多证据时不能说的:“功能 X 导致 30% 更高的留存率”
多重比较问题
当测试许多假设时,一些会因机会而“显著”:
- 在 p=0.05 下测试 20 个指标意味着约 1 个会是假显著
- 如果您在找到差异之前查看了许多群体,注意这一点
- 使用 Bonferroni 校正(将 alpha 除以测试次数)或报告运行了多少测试
辛普森悖论
聚合数据中的趋势在数据分割时可能反转:
- 始终检查结论是否在关键群体中成立
- 示例:整体转化率上升,但每个群体转化率下降 —— 因为混合转向了更高转化的群体
幸存者偏差
您只能分析“幸存”到数据集中的实体:
- 分析活跃用户忽略了那些流失的用户
- 分析成功公司忽略了那些失败的公司
- 始终问:“谁缺失于此数据集,他们的加入是否会改变结论?”
生态学谬误
聚合趋势可能不适用于个体:
- “X 更高的国家有更高的 Y”并不意味着“X 更高的个体有更高的 Y”
- 小心将群体层面发现应用于个体案例
锚定于特定数字
警惕虚假精度:
- “下季度流失率将为 4.73%”暗示了超出实际的确定性
- 更喜欢范围:“基于历史模式,我们预计流失率在 4-6%”
- 适当舍入:“约 5%”通常比“4.73%”更诚实