mcpField
S
statistical-analysis

statistical-analysis

github.com/anthropics数据与数据库33.6k4.6k 次安装1 天前更新
代码仓库

关于 statistical-analysis

面向业务分析人员的统计分析技能,涵盖描述统计、趋势分析、异常检测和假设检验。它还提供统计结论的谨慎解读方法,提醒区分相关性与因果关系及统计意义与实际意义。

主要功能

  1. 01选择合适的集中趋势和离散指标
  2. 02分析趋势、季节性并进行简单预测
  3. 03使用统计方法检测和处理异常值
  4. 04选择常见假设检验方法
  5. 05评估效应量、置信区间和样本量
  6. 06识别统计结论中的常见偏差

适用场景

  1. 01总结业务指标的分布和波动
  2. 02比较不同时间段或用户群体
  3. 03检查实验结果是否显著且有实际意义
  4. 04评估预测或相关性结论的局限

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/anthropics/knowledge-work-plugins --skill statistical-analysis

安装后在 Claude Code 中输入/statistical-analysis确认已加载。

详细介绍

统计分析技能

描述性统计、趋势分析、异常值检测、假设检验,以及关于何时对统计结论保持谨慎的指引。

描述性统计方法

集中趋势

根据数据选择合适的集中趋势度量:

情况使用原因
分布对称、无异常值均值最有效的估计量
分布偏斜中位数对异常值稳健
类别型或有序型数据众数非数值数据的唯一选择
高度偏斜且有异常值(例如每用户收入)中位数 + 均值同时报告两者;两者的差距反映偏斜程度

对于业务指标,始终同时报告均值和中位数。 如果两者差异显著,说明数据存在偏斜,仅看均值会产生误导。

离散程度与变异性
  • 标准差:数值通常偏离均值的程度。适用于正态分布数据。
  • 四分位距(IQR):p25 与 p75 之间的距离。对异常值稳健。适用于偏斜数据。
  • 变异系数(CV):标准差 / 均值。用于比较量纲不同的指标之间的变异性。
  • 极差:最大值减最小值。对异常值敏感,但能快速反映数据的范围。
面向业务场景的百分位数

报告关键百分位数,比单看均值能更完整地说明问题:

p1:   Bottom 1% (floor / minimum typical value)
p5:   Low end of normal range
p25:  First quartile
p50:  Median (typical user)
p75:  Third quartile
p90:  Top 10% / power users
p95:  High end of normal range
p99:  Top 1% / extreme users

示例表述:"会话时长的中位数为 4.2 分钟,但前 10% 的用户每次会话时长超过 22 分钟,将均值拉高到 7.8 分钟。"

描述分布

对每一个进行分析的数值分布,都要加以刻画:

  • 形态:正态、右偏、左偏、双峰、均匀、重尾
  • 中心:均值与中位数(以及两者之间的差距)
  • 离散程度:标准差或 IQR
  • 异常值:数量多少及极端程度
  • 边界:是否存在自然下限(零)或上限(100%)?

趋势分析与预测

识别趋势

使用移动平均平滑噪声:

# 7-day moving average (good for daily data with weekly seasonality)
df['ma_7d'] = df['metric'].rolling(window=7, min_periods=1).mean()

# 28-day moving average (smooths weekly AND monthly patterns)
df['ma_28d'] = df['metric'].rolling(window=28, min_periods=1).mean()

环比期间对比:

  • 周环比(WoW):与上周同一天对比
  • 月环比(MoM):与上一个同月对比
  • 年同比(YoY):季节性业务的黄金标准
  • 去年同日:与去年的具体某一天对比

增长率:

Simple growth: (current - previous) / previous
CAGR: (ending / beginning) ^ (1 / years) - 1
Log growth: ln(current / previous)  -- better for volatile series
季节性检测

检查是否存在周期性模式:

  1. 绘制原始时间序列——先进行可视化检查
  2. 计算星期几的平均值:是否存在明显的每周模式?
  3. 计算各月份的平均值:是否存在年度周期?
  4. 对比不同期间时,始终使用同比或同期对比,以避免将趋势与季节性混为一谈
预测(简单方法)

面向业务分析师(而非数据科学家),使用简单直接的方法:

  • 朴素预测:明天 = 今天。用作基准。
  • 季节性朴素预测:明天 = 上周或去年的同一天。
  • 线性趋势:对历史数据拟合一条直线。仅适用于明显线性的趋势。
  • 移动平均预测:以滚动平均值作为预测值。

始终说明不确定性。给出区间,而不是单点估计:

  • "基于近 3 个月的趋势,我们预计下个月注册人数为 1 万至 1.2 万"
  • 而不是 "我们预计下个月注册人数恰好为 11,234"

何时交由数据科学家处理:非线性趋势、多重季节性、外部因素(营销投入、节假日),或预测准确性对资源分配至关重要时。

异常值与异常检测

统计方法

Z 分数法(适用于正态分布数据):

z_scores = (df['value'] - df['value'].mean()) / df['value'].std()
outliers = df[abs(z_scores) > 3]  # More than 3 standard deviations

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))]
处理离群值

不要自动删除离群值。应当:

  1. 调查:这是数据错误、真实的极端值,还是不同的群体?
  2. 数据错误:修正或删除(例如负数年龄、1970 年的时间戳)
  3. 真实极端值:保留它们,但考虑使用稳健统计量(用中位数代替均值)
  4. 不同群体:将其分离出来单独分析(例如企业客户与中小企业客户)

报告你所做的处理:"我们排除了 47 条(0.3%)交易金额超过 5 万美元的记录,这些记录代表大宗企业订单,已单独分析。"

时间序列异常检测

用于检测时间序列中的异常值:

  1. 计算期望值(移动平均或去年同期值)
  2. 计算与期望值的偏差
  3. 标记超出阈值的偏差(通常为残差的 2 至 3 个标准差)
  4. 区分单点异常(单个异常值)与变化点(持续性偏移)

假设检验基础

适用场景

当你需要判断观察到的差异是真实存在,还是可能由随机波动造成时,使用假设检验。常见场景包括:

  • A/B 测试结果:变体 B 是否真的优于 A?
  • 前后对比:产品变更是否真的带动了指标变化?
  • 分群比较:企业客户的留存率是否真的更高?
基本框架
  1. 原假设(H0):不存在差异(默认假设)
  2. 备择假设(H1):存在差异
  3. 选择显著性水平(alpha):通常为 0.05(5% 的假阳性概率)
  4. 计算检验统计量和 p 值
  5. 解释结果:若 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% 的留存率提升"

多重比较问题

当你检验大量假设时,有些结果会因偶然而呈现"显著":

  • 对 20 个指标在 p=0.05 水平下进行检验,大约会有 1 个被误判为显著
  • 如果你在找到一个有差异的细分群体之前查看了许多细分群体,请注明这一点
  • 使用 Bonferroni 校正(将显著性水平 alpha 除以检验次数)进行多重比较校正,或报告共进行了多少次检验
辛普森悖论

当数据被细分后,聚合数据中的趋势可能发生逆转:

  • 始终检查结论在关键细分群体中是否依然成立
  • 示例:总体转化率上升,但在每一个细分群体中转化率都下降了,原因是样本构成向转化率更高的细分群体偏移
幸存者偏差

你只能分析那些"幸存"下来、进入数据集的对象:

  • 只分析活跃用户,会忽略已流失的用户
  • 只分析成功的公司,会忽略已倒闭的公司
  • 始终自问:"这个数据集遗漏了谁?如果把他们纳入,结论是否会改变?"
生态谬误

群体层面的趋势不一定适用于个体:

  • "X 越高的国家,Y 也越高"并不意味着"X 越高的个人,Y 也越高"
  • 将群体层面的发现套用到个案时要格外谨慎
过度依赖具体数字

警惕虚假的精确性:

  • "下个季度流失率将为 4.73%"所传达的确定性超出了实际依据
  • 更推荐使用区间:"根据历史规律,我们预计流失率在 4%–6% 之间"
  • 恰当取整:"约 5%"往往比"4.73%"更诚实

评论

支持 Markdown