mcpField
S
statistical-analysis

statistical-analysis

github.com/eturkes数据与数据库049 次安装18 周前更新
代码仓库

关于 statistical-analysis

statistical-analysis 是面向研究工作的 Python 统计分析技能,涵盖分析规划与执行。它包括假设检查、频率学派和贝叶斯方法、效应量、功效分析及 APA 格式报告。

主要功能

  1. 01指导选择统计检验
  2. 02检查假设与诊断指标
  3. 03涵盖频率学派和贝叶斯分析
  4. 04计算效应量和置信区间
  5. 05支持功效与样本量分析
  6. 06生成 APA 格式报告

适用场景

  1. 01为实验数据选择检验方法
  2. 02解释结果前检查统计假设
  3. 03规划研究时估算样本量
  4. 04为学术报告整理统计结果

安装

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

$npx skills add https://github.com/eturkes/claude-scientific-skills --skill statistical-analysis

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

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
assumptions_and_diagnostics.md
bayesian_statistics.md
effect_sizes_and_power.md
reporting_standards.md
test_selection_guide.md
scripts/
assumption_checks.py

详细介绍

统计分析

概述

统计分析是一种系统性的假设检验和关系量化过程。通过假设检验(t 检验、ANOVA、卡方检验)、回归、相关性分析和贝叶斯分析开展研究,并进行假设检查和 APA 格式报告。此技能适用于学术研究。

何时使用此技能

在以下情况下应使用此技能:

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

安装

使用 uv 安装此技能所用的库。在生产环境中固定版本;探索时可以不固定版本。

# Core frequentist stack (Python 3.10+; 3.12+ recommended for latest SciPy/ArviZ)
uv pip install "pingouin>=0.6" "scipy>=1.11" "statsmodels>=0.14.6" pandas matplotlib seaborn

# Bayesian modeling (PyMC 5 + ArviZ; ArviZ 0.23+ requires Python 3.12+)
uv pip install "pymc>=5.0" "arviz>=0.17"

兼容性说明(2025–2026):

  • Pingouin 0.5+ 重命名了输出列(p_val、cohen_d、CI95、p_unc)——以下示例使用当前名称。
  • statsmodels + SciPy:使用 statsmodels>=0.14.6 和 scipy>=1.11,以避免 SciPy 1.16+ 中出现 _lazywhere 导入错误。
  • Pingouin 贝叶斯因子:0.5+ 移除了 t 检验的单侧 BF;请使用专用软件包(例如 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 格式的统计报告
  • 创建可用于发表的图表和表格
  • 提供包含所有必需统计数据的完整解读

工作流决策树

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

START
│
├─ Need to SELECT a statistical test?
│  └─ YES → See "Test Selection Guide"
│  └─ NO → Continue
│
├─ Ready to check ASSUMPTIONS?
│  └─ YES → See "Assumption Checking"
│  └─ NO → Continue
│
├─ Ready to run ANALYSIS?
│  └─ YES → See "Running Statistical Tests"
│  └─ NO → Continue
│
└─ Need to REPORT results?
   └─ YES → See "Reporting Results"

检验选择指南

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

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

比较两组:

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

比较 3 组及以上:

  • 独立、连续、正态 → 单因素 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

# Comprehensive check with visualizations
results = comprehensive_assumption_check(
    data=df,
    value_col='score',
    group_col='group',  # Optional: for group comparisons
    alpha=0.05
)

该模块会执行:

  1. 异常值检测(IQR 和 z-score 方法)
  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
)

# Example: Check normality with visualization
result = check_normality(
    data=df['score'],
    name='Test Score',
    alpha=0.05,
    plot=True
)
print(result['interpretation'])
print(result['recommendation'])
假设不成立时的处理方法

正态性假设不成立:

  • 轻微偏离,且每组 n > 30 → 使用参数检验(较稳健)
  • 中度偏离 → 使用非参数替代方法
  • 严重偏离 → 转换数据或使用非参数检验

方差齐性假设不成立:

  • 对于 t 检验 → 使用 Welch's t-test
  • 对于 ANOVA → 使用 Welch's 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

# Run independent t-test
result = pg.ttest(group_a, group_b, correction='auto')

# Extract results (Pingouin 0.5+ column names)
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]

# Report
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

# One-way ANOVA
aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print(aov)

# If significant, conduct post-hoc tests
if aov['p_unc'].values[0] < 0.05:
    posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
    print(posthoc)

# Effect size
eta_squared = aov['np2'].values[0]  # Partial eta-squared
print(f"Partial η² = {eta_squared:.3f}")
带诊断的线性回归
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# Fit model
X = sm.add_constant(X_predictors)  # Add intercept
model = sm.OLS(y, X).fit()

# Summary
print(model.summary())

# Check multicollinearity (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)

# Check assumptions
residuals = model.resid
fitted = model.fittedvalues

# Residual plots
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# Residuals vs fitted
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 plot
from scipy import stats
stats.probplot(residuals, dist="norm", plot=axes[0, 1])
axes[0, 1].set_title('Normal Q-Q')

# Scale-Location
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')

# Residuals histogram
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:
    # Priors
    mu1 = pm.Normal('mu_group1', mu=0, sigma=10)
    mu2 = pm.Normal('mu_group2', mu=0, sigma=10)
    sigma = pm.HalfNormal('sigma', sigma=10)

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

    # Derived quantity
    diff = pm.Deterministic('difference', mu1 - mu2)

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

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

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

# Plot posterior
az.plot_posterior(trace, var_names=['difference'], ref_val=0)

效应量

务必计算效应量

效应量用于量化效应大小,而 p 值仅表示效应是否存在。

详见 references/effect_sizes_and_power.md,获取全面指导。

快速参考:常见效应量
检验效应量小中大
T 检验Cohen's d0.200.500.80
ANOVAη²_p0.010.060.14
相关性r0.100.300.50
回归R²0.020.130.26
卡方检验Cramér's V0.070.210.35

重要:参考标准仅供参考,具体情况也很重要!

计算效应量

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

# T-test returns Cohen's d
result = pg.ttest(x, y)
d = result['cohen_d'].values[0]

# ANOVA returns partial eta-squared
aov = pg.anova(dv='score', between='group', data=df)
eta_p2 = aov['np2'].values[0]

# Correlation: r is already an effect size
corr = pg.corr(x, y)
r = corr['r'].values[0]
效应量的置信区间

务必报告置信区间以展示精度:

from pingouin import compute_effsize_from_t

# For t-test
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-test: What n is needed to detect 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: What n is needed to detect 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}")
敏感性分析(研究结束后)

确定可检测到的效应量:

# With n=50 per group, what effect could we detect?
detectable_d = tt_ind_solve_power(
    effect_size=None,  # Solve for this
    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. 检验统计量:检验名称、统计量、df、精确 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,了解以下内容的全面指导:

  • 贝叶斯定理及其解释
  • 先验设定(信息性、弱信息性、非信息性)
  • 使用贝叶斯因子进行贝叶斯假设检验
  • 可信区间与置信区间的区别
  • 贝叶斯 t 检验、ANOVA、回归和分层模型
  • 模型收敛性检查和后验预测检查
主要优势
  1. 直观易懂的解释:“给定这些数据,该参数有 95% 的概率落在此区间内”
  2. 支持零假设的证据:可量化无效应的支持程度
  3. 灵活:无需担心 p 值操纵;可随着数据到来逐步分析
  4. 不确定性量化:完整的后验分布

资源

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

References 目录
  • test_selection_guide.md:选择适当统计检验的决策树
  • assumptions_and_diagnostics.md:检查和处理假设违背情况的详细指导
  • effect_sizes_and_power.md:效应量的计算、解释和报告;功效分析
  • bayesian_statistics.md:贝叶斯分析方法完整指南
  • reporting_standards.md:符合 APA 风格的报告指南及示例
Scripts 目录
  • 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 值操纵:不要尝试多种方法,直到得到显著结果
  2. HARKing:不要把探索性发现表述为验证性发现
  3. 忽视假设:检查假设并报告违背情况
  4. 混淆显著性与重要性:p < .05 ≠ 有意义的效应
  5. 不报告效应量:效应量对结果解释至关重要
  6. 挑选结果:报告所有计划的分析
  7. 误解 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). 行为科学的统计功效分析
  • Field, A. (2013). 使用 IBM SPSS Statistics 学习统计学
  • Gelman, A., & Hill, J. (2006). 使用回归和多层次/层级模型进行数据分析
  • Kruschke, J. K. (2014). 贝叶斯数据分析

在线资源:

评论

支持 Markdown