Files
2026-07-13 21:36:15 +08:00

19 KiB
Raw Permalink Blame History

name, description, license, metadata
name description license metadata
statistical-analysis 引导式统计分析,包含检验选择与报告输出。当你需要为数据选择合适的检验方法、进行假设检验、功效分析以及生成 APA 格式结果时使用。适用于学术研究报告撰写和检验方法选择指导。如需以编程方式实现特定模型,请使用 statsmodels。 MIT license
version skill-author
1.0 K-Dense Inc.

统计分析

概述

统计分析是检验假设和量化关系的系统性过程。可进行假设检验(t 检验、ANOVA、卡方检验)、回归分析、相关分析以及贝叶斯分析,附带假设检验和 APA 格式报告。将此技能用于学术研究。

何时使用此技能

以下情况应使用此技能:

  • 进行统计假设检验(t 检验、ANOVA、卡方检验)
  • 执行回归分析或相关分析
  • 运行贝叶斯统计分析
  • 检查统计假设与诊断
  • 计算效应量并进行功效分析
  • 以 APA 格式报告统计结果
  • 分析研究中的实验或观测数据

安装

使用 uv 安装此技能所需的库。在生产环境中锁定版本;探索性分析中不锁定版本亦可。

# 核心频率主义库栈(Python 3.10+;推荐 3.12+ 以获得最新版 SciPy/ArviZ
uv pip install "pingouin>=0.6" "scipy>=1.11" "statsmodels>=0.14.6" pandas matplotlib seaborn

# 贝叶斯建模(PyMC 5 + ArviZArviZ 0.23+ 需要 Python 3.12+
uv pip install "pymc>=5.0" "arviz>=0.17"

兼容性说明(20252026):

  • Pingouin 0.5+ 重命名了输出列名(p_valcohen_dCI95p_unc)——以下示例使用当前名称。
  • statsmodels + SciPy:使用 statsmodels>=0.14.6 搭配 scipy>=1.11,以避免 SciPy 1.16+ 上的 _lazywhere 导入错误。
  • Pingouin 贝叶斯因子:t 检验的单侧 BF 已在 0.5+ 中移除;如需假设检验,请使用专用包(例如 JASP、通过 R 使用的 BayesFactor)或 PyMC。

如需特定模型 API(OLS、GLM、ARIMA),请参见 statsmodels 技能。如需 PyMC 工作流,请参见 pymc 技能。


核心能力

1. 检验选择与规划

  • 根据研究问题和数据特征选择合适的统计检验
  • 进行先验功效分析,确定所需样本量
  • 规划分析策略,包括多重比较校正

2. 假设检验

  • 在执行检验前自动验证所有相关假设
  • 提供诊断可视化图表(Q-Q 图、残差图、箱线图)
  • 当假设被违反时推荐补救措施

3. 统计检验

  • 假设检验:t 检验、ANOVA、卡方检验、非参数替代方法
  • 回归分析:线性、多元、逻辑回归,附带诊断
  • 相关分析:Pearson 相关、Spearman 相关,附带置信区间
  • 贝叶斯替代方法:贝叶斯 t 检验、ANOVA、含贝叶斯因子的回归

4. 效应量与解释

  • 为所有分析计算并解释合适的效应量
  • 提供效应估计的置信区间
  • 区分统计显著性与实际显著性

5. 专业报告

  • 生成 APA 格式的统计报告
  • 创建可发表的图表和表格
  • 提供包含所有必要统计量的完整解释

工作流决策树

使用此决策树确定分析路径:

开始
│
├─ 需要选择统计检验?
│  └─ 是 → 参见「检验选择指南」
│  └─ 否 → 继续
│
├─ 准备检查假设?
│  └─ 是 → 参见「假设检验」
│  └─ 否 → 继续
│
├─ 准备运行分析?
│  └─ 是 → 参见「运行统计检验」
│  └─ 否 → 继续
│
└─ 需要报告结果?
   └─ 是 → 参见「报告结果」

检验选择指南

快速参考:选择合适的检验

完整指南请参见 references/test_selection_guide.md。快速参考:

比较两组:

  • 独立、连续、正态 → 独立样本 t 检验
  • 独立、连续、非正态 → Mann-Whitney U 检验
  • 配对、连续、正态 → 配对样本 t 检验
  • 配对、连续、非正态 → Wilcoxon 符号秩检验
  • 二元结果 → 卡方检验或 Fisher 精确检验

比较三组及以上:

  • 独立、连续、正态 → 单因素 ANOVA
  • 独立、连续、非正态 → Kruskal-Wallis 检验
  • 配对、连续、正态 → 重复测量 ANOVA
  • 配对、连续、非正态 → Friedman 检验

关系分析:

  • 两个连续变量 → Pearson 相关(正态)或 Spearman 相关(非正态)
  • 连续结果变量 + 预测变量 → 线性回归
  • 二元结果变量 + 预测变量 → 逻辑回归

贝叶斯替代方法: 所有检验都有对应的贝叶斯版本,提供:

  • 关于假设的直接概率陈述
  • 量化证据的贝叶斯因子
  • 支持零假设的能力
  • 详见 references/bayesian_statistics.md

假设检验

系统性假设验证

在解释检验结果之前,务必检查假设。

使用附带的 scripts/assumption_checks.py 模块进行自动检查。在技能目录(skills/statistical-analysis/)下运行 Python,或将 scripts/ 添加到 sys.path

from assumption_checks import comprehensive_assumption_check

# 带可视化的全面检查
results = comprehensive_assumption_check(
    data=df,
    value_col='score',
    group_col='group',  # 可选:用于组间比较
    alpha=0.05
)

该函数执行:

  1. 异常值检测IQR 和 z 分数法)
  2. 正态性检验Shapiro-Wilk 检验 + Q-Q 图)
  3. 方差齐性检验Levene 检验 + 箱线图)
  4. 解释与建议

单项假设检查

如需针对性地检查,可使用单项函数:

from assumption_checks import (
    check_normality,
    check_normality_per_group,
    check_homogeneity_of_variance,
    check_linearity,
    detect_outliers
)

# 示例:带可视化的正态性检验
result = check_normality(
    data=df['score'],
    name='Test Score',
    alpha=0.05,
    plot=True
)
print(result['interpretation'])
print(result['recommendation'])

假设被违反时如何处理

正态性被违反:

  • 轻度违反 + 每组 n > 30 → 使用参数检验(稳健)
  • 中度违反 → 使用非参数替代方法
  • 严重违反 → 对数据进行变换或使用非参数检验

方差齐性被违反:

  • t 检验 → 使用 Welch t 检验
  • ANOVA → 使用 Welch ANOVA 或 Brown-Forsythe ANOVA
  • 回归分析 → 使用稳健标准误或加权最小二乘法

线性被违反(回归):

  • 添加多项式项
  • 对变量进行变换
  • 使用非线性模型或 GAM

完整指南请参见 references/assumptions_and_diagnostics.md


运行统计检验

Python 库

统计分析的主要库:

  • scipy.stats:核心统计检验
  • statsmodels:高级回归与诊断
  • pingouin:用户友好的统计检验,附带效应量
  • pymc:贝叶斯统计建模
  • arviz:贝叶斯可视化与诊断

分析示例

含完整报告的 T 检验

import pingouin as pg
import numpy as np

# 运行独立样本 t 检验
result = pg.ttest(group_a, group_b, correction='auto')

# 提取结果(Pingouin 0.5+ 列名)
t_stat = result['T'].values[0]
df = result['dof'].values[0]
p_value = result['p_val'].values[0]
cohens_d = result['cohen_d'].values[0]
ci = result['CI95'].values[0]
ci_lower, ci_upper = ci[0], ci[1]

# 报告
print(f"t({df:.0f}) = {t_stat:.2f}, p = {p_value:.3f}")
print(f"Cohen's d = {cohens_d:.2f}, 95% CI [{ci_lower:.2f}, {ci_upper:.2f}]")

含事后检验的 ANOVA

import pingouin as pg

# 单因素 ANOVA
aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print(aov)

# 若显著,进行事后检验
if aov['p_unc'].values[0] < 0.05:
    posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
    print(posthoc)

# 效应量
eta_squared = aov['np2'].values[0]  # 偏 η²
print(f"Partial η² = {eta_squared:.3f}")

含诊断的线性回归

import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# 拟合模型
X = sm.add_constant(X_predictors)  # 添加截距项
model = sm.OLS(y, X).fit()

# 汇总
print(model.summary())

# 检查多重共线性(VIF
vif_data = pd.DataFrame()
vif_data["Variable"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)

# 检查假设
residuals = model.resid
fitted = model.fittedvalues

# 残差图
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 残差 vs 拟合值
axes[0, 0].scatter(fitted, residuals, alpha=0.6)
axes[0, 0].axhline(y=0, color='r', linestyle='--')
axes[0, 0].set_xlabel('Fitted values')
axes[0, 0].set_ylabel('Residuals')
axes[0, 0].set_title('Residuals vs Fitted')

# Q-Q 图
from scipy import stats
stats.probplot(residuals, dist="norm", plot=axes[0, 1])
axes[0, 1].set_title('Normal Q-Q')

# 尺度-位置图
axes[1, 0].scatter(fitted, np.sqrt(np.abs(residuals / residuals.std())), alpha=0.6)
axes[1, 0].set_xlabel('Fitted values')
axes[1, 0].set_ylabel('√|Standardized residuals|')
axes[1, 0].set_title('Scale-Location')

# 残差直方图
axes[1, 1].hist(residuals, bins=20, edgecolor='black', alpha=0.7)
axes[1, 1].set_xlabel('Residuals')
axes[1, 1].set_ylabel('Frequency')
axes[1, 1].set_title('Histogram of Residuals')

plt.tight_layout()
plt.show()

贝叶斯 T 检验

import pymc as pm
import arviz as az
import numpy as np

with pm.Model() as model:
    # 先验
    mu1 = pm.Normal('mu_group1', mu=0, sigma=10)
    mu2 = pm.Normal('mu_group2', mu=0, sigma=10)
    sigma = pm.HalfNormal('sigma', sigma=10)

    # 似然
    y1 = pm.Normal('y1', mu=mu1, sigma=sigma, observed=group_a)
    y2 = pm.Normal('y2', mu=mu2, sigma=sigma, observed=group_b)

    # 导出量
    diff = pm.Deterministic('difference', mu1 - mu2)

    # 采样
    trace = pm.sample(2000, tune=1000, return_inferencedata=True)

# 汇总
print(az.summary(trace, var_names=['difference']))

# group1 > group2 的概率
prob_greater = np.mean(trace.posterior['difference'].values > 0)
print(f"P(μ₁ > μ₂ | data) = {prob_greater:.3f}")

# 绘制后验分布
az.plot_posterior(trace, var_names=['difference'], ref_val=0)

效应量

始终计算效应量

效应量量化效应的大小,而 p 值仅指示效应是否存在。

完整指南请参见 references/effect_sizes_and_power.md

快速参考:常见效应量

检验 效应量
T 检验 Cohen's d 0.20 0.50 0.80
ANOVA η²_p 0.01 0.06 0.14
相关 r 0.10 0.30 0.50
回归 0.02 0.13 0.26
卡方检验 Cramér's V 0.07 0.21 0.35

重要提示:这些基准仅供参考,具体情境决定实际意义!

计算效应量

大多数效应量由 pingouin 自动计算:

# T 检验返回 Cohen's d
result = pg.ttest(x, y)
d = result['cohen_d'].values[0]

# ANOVA 返回偏 eta 平方
aov = pg.anova(dv='score', between='group', data=df)
eta_p2 = aov['np2'].values[0]

# 相关:r 本身就是效应量
corr = pg.corr(x, y)
r = corr['r'].values[0]

效应量的置信区间

始终报告置信区间以显示精度:

from pingouin import compute_effsize_from_t

# 对于 t 检验
d, ci = compute_effsize_from_t(
    t_statistic,
    nx=len(group1),
    ny=len(group2),
    eftype='cohen'
)
print(f"d = {d:.2f}, 95% CI [{ci[0]:.2f}, {ci[1]:.2f}]")

功效分析

先验功效分析(研究规划)

在收集数据前确定所需样本量:

from statsmodels.stats.power import (
    tt_ind_solve_power,
    FTestAnovaPower
)

# T 检验:检测 d = 0.5 需要多少样本?
n_required = tt_ind_solve_power(
    effect_size=0.5,
    alpha=0.05,
    power=0.80,
    ratio=1.0,
    alternative='two-sided'
)
print(f"Required n per group: {n_required:.0f}")

# ANOVA:检测 f = 0.25 需要多少样本?
anova_power = FTestAnovaPower()
n_per_group = anova_power.solve_power(
    effect_size=0.25,
    ngroups=3,
    alpha=0.05,
    power=0.80
)
print(f"Required n per group: {n_per_group:.0f}")

敏感度分析(研究后)

确定能够检测到的效应量:

# 每组 n=50,能检测到多大的效应?
detectable_d = tt_ind_solve_power(
    effect_size=None,  # 求解此值
    nobs1=50,
    alpha=0.05,
    power=0.80,
    ratio=1.0,
    alternative='two-sided'
)
print(f"Study could detect d ≥ {detectable_d:.2f}")

注意:一般不推荐在研究后进行事后功效分析(计算已得结果的检验功效)。请改用敏感度分析。

详见 references/effect_sizes_and_power.md


报告结果

APA 格式统计报告

遵循 references/reporting_standards.md 中的指南。

基本报告要素

  1. 描述性统计:所有组/变量的 M、SD、n
  2. 检验统计量:检验名称、统计量、自由度、精确 p 值
  3. 效应量:附带置信区间
  4. 假设检验:进行了哪些检验、结果、采取的措施
  5. 所有计划的分析:包括不显著的结果

报告模板示例

独立样本 T 检验

Group A (n = 48, M = 75.2, SD = 8.5) scored significantly higher than
Group B (n = 52, M = 68.3, SD = 9.2), t(98) = 3.82, p < .001, d = 0.77,
95% CI [0.36, 1.18], two-tailed. Assumptions of normality (Shapiro-Wilk:
Group A W = 0.97, p = .18; Group B W = 0.96, p = .12) and homogeneity
of variance (Levene's F(1, 98) = 1.23, p = .27) were satisfied.

单因素 ANOVA

A one-way ANOVA revealed a significant main effect of treatment condition
on test scores, F(2, 147) = 8.45, p < .001, η²_p = .10. Post hoc
comparisons using Tukey's HSD indicated that Condition A (M = 78.2,
SD = 7.3) scored significantly higher than Condition B (M = 71.5,
SD = 8.1, p = .002, d = 0.87) and Condition C (M = 70.1, SD = 7.9,
p < .001, d = 1.07). Conditions B and C did not differ significantly
(p = .52, d = 0.18).

多元回归

Multiple linear regression was conducted to predict exam scores from
study hours, prior GPA, and attendance. The overall model was significant,
F(3, 146) = 45.2, p < .001, R² = .48, adjusted R² = .47. Study hours
(B = 1.80, SE = 0.31, β = .35, t = 5.78, p < .001, 95% CI [1.18, 2.42])
and prior GPA (B = 8.52, SE = 1.95, β = .28, t = 4.37, p < .001,
95% CI [4.66, 12.38]) were significant predictors, while attendance was
not (B = 0.15, SE = 0.12, β = .08, t = 1.25, p = .21, 95% CI [-0.09, 0.39]).
Multicollinearity was not a concern (all VIF < 1.5).

贝叶斯分析

A Bayesian independent samples t-test was conducted using weakly
informative priors (Normal(0, 1) for mean difference). The posterior
distribution indicated that Group A scored higher than Group B
(M_diff = 6.8, 95% credible interval [3.2, 10.4]). The Bayes Factor
BF₁₀ = 45.3 provided very strong evidence for a difference between
groups, with a 99.8% posterior probability that Group A's mean exceeded
Group B's mean. Convergence diagnostics were satisfactory (all R̂ < 1.01,
ESS > 1000).

贝叶斯统计

何时使用贝叶斯方法

以下情况考虑使用贝叶斯方法:

  • 你有可以纳入分析的先验信息
  • 你想对假设做出直接的概率陈述
  • 样本量较小或计划序贯收集数据
  • 你需要量化支持零假设的证据
  • 模型较为复杂(分层模型、缺失数据处理)

关于以下内容的完整指南,请参见 references/bayesian_statistics.md

  • 贝叶斯定理与解释
  • 先验设定(信息性先验、弱信息先验、无信息先验)
  • 使用贝叶斯因子进行贝叶斯假设检验
  • 可信区间 vs 置信区间
  • 贝叶斯 t 检验、ANOVA、回归与分层模型
  • 模型收敛性检验与后验预测检验

关键优势

  1. 直观解释:「给定数据,参数有 95% 的概率落在此区间内」
  2. 支持零假设:可以量化支持无效应存在的证据
  3. 灵活:无 p-hacking 之虞,可以边收集数据边分析
  4. 不确定性量化:完整的后验分布

资源

此技能包含全面的参考资料:

参考文档目录

  • test_selection_guide.md:选择合适统计检验的决策树
  • assumptions_and_diagnostics.md:检查和处理假设违反的详细指南
  • effect_sizes_and_power.md:计算、解释和报告效应量;进行功效分析
  • bayesian_statistics.md:贝叶斯分析方法的完整指南
  • reporting_standards.mdAPA 格式报告指南及示例

脚本目录

  • assumption_checks.py:带可视化的自动假设检验
    • comprehensive_assumption_check():完整工作流
    • check_normality():正态性检验 + Q-Q 图
    • check_homogeneity_of_variance()Levene 检验 + 箱线图
    • check_linearity():回归线性检验
    • detect_outliers()IQR 和 z 分数异常值检测

最佳实践

  1. 预注册分析方案,尽可能区分验证性分析与探索性分析
  2. 始终检查假设,然后再解释结果
  3. 报告效应量,并附带置信区间
  4. 报告所有计划的分析,包括不显著的结果
  5. 区分统计显著性与实际显著性
  6. 在分析前后均进行数据可视化
  7. 检查回归/ANOVA 的诊断结果(残差图、VIF 等)
  8. 进行敏感度分析,以评估结果的稳健性
  9. 共享数据和代码,确保可复现性
  10. 保持透明,说明假设违反、数据变换和分析决策

应避免的常见陷阱

  1. P-hackingP 值操纵):不要尝试多种检验方式直到找到显著结果
  2. HARKing(事后假设):不要将探索性发现呈现为验证性结论
  3. 忽略假设:务必检查并报告违反情况
  4. 混淆显著性与重要性:p < .05 ≠ 有意义的效应
  5. 不报告效应量:这是解释结果的关键
  6. 选择性报告结果:应报告所有计划的分析
  7. 误读 p 值p 值并非假设为真的概率
  8. 多重比较问题:必要时进行族系误差率校正
  9. 忽略缺失数据:理解缺失机制(MCAR、MAR、MNAR
  10. 过度解读不显著的结果:证据缺失 ≠ 缺失的证据

入门检查清单

开始统计分析时:

  • 定义研究问题和假设
  • 确定合适的统计检验(使用 test_selection_guide.md
  • 进行功效分析以确定样本量
  • 加载并检查数据
  • 检查缺失数据和异常值
  • 使用 assumption_checks.py 验证假设
  • 运行主要分析
  • 计算效应量并附带置信区间
  • 必要时进行事后检验(含校正)
  • 创建可视化图表
  • 按照 reporting_standards.md 撰写结果
  • 进行敏感度分析
  • 共享数据和代码

支持与进一步阅读

如有疑问,请参见:

  • 检验选择:见 references/test_selection_guide.md
  • 假设检验:见 references/assumptions_and_diagnostics.md
  • 效应量:见 references/effect_sizes_and_power.md
  • 贝叶斯方法:见 references/bayesian_statistics.md
  • 报告规范:见 references/reporting_standards.md

重要参考书

  • Cohen, J. (1988). Statistical Power Analysis for the Behavioral Sciences
  • Field, A. (2013). Discovering Statistics Using IBM SPSS Statistics
  • Gelman, A., & Hill, J. (2006). Data Analysis Using Regression and Multilevel/Hierarchical Models
  • Kruschke, J. K. (2014). Doing Bayesian Data Analysis

在线资源