关于 statistical-analysis
statistical-analysis 是面向研究工作的 Python 统计分析技能,涵盖分析规划与执行。它包括假设检查、频率学派和贝叶斯方法、效应量、功效分析及 APA 格式报告。
主要功能
- 01指导选择统计检验
- 02检查假设与诊断指标
- 03涵盖频率学派和贝叶斯分析
- 04计算效应量和置信区间
- 05支持功效与样本量分析
- 06生成 APA 格式报告
适用场景
- 01为实验数据选择检验方法
- 02解释结果前检查统计假设
- 03规划研究时估算样本量
- 04为学术报告整理统计结果
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ eturkes/ claude-scientific-skills --skill statistical-analysis安装后在 Claude Code 中输入/statistical-analysis确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/assumptions_and_diagnostics.mdbayesian_statistics.mdeffect_sizes_and_power.mdreporting_standards.mdtest_selection_guide.mdscripts/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
)
该模块会执行:
- 异常值检测(IQR 和 z-score 方法)
- 正态性检验(Shapiro-Wilk 检验 + Q-Q 图)
- 方差齐性检验(Levene 检验 + 箱线图)
- 解释与建议
单项假设检验
如需进行针对性检查,请使用单项函数:
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 d | 0.20 | 0.50 | 0.80 |
| ANOVA | η²_p | 0.01 | 0.06 | 0.14 |
| 相关性 | r | 0.10 | 0.30 | 0.50 |
| 回归 | R² | 0.02 | 0.13 | 0.26 |
| 卡方检验 | Cramér's V | 0.07 | 0.21 | 0.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 中的指南。
必要的报告要素
- 描述性统计:所有组/变量的 M、SD、n
- 检验统计量:检验名称、统计量、df、精确 p 值
- 效应量:附置信区间
- 假设检查:进行了哪些检验、结果如何、采取了哪些措施
- 所有计划中的分析:包括不显著的结果
报告模板示例
独立样本 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、回归和分层模型
- 模型收敛性检查和后验预测检查
主要优势
- 直观易懂的解释:“给定这些数据,该参数有 95% 的概率落在此区间内”
- 支持零假设的证据:可量化无效应的支持程度
- 灵活:无需担心 p 值操纵;可随着数据到来逐步分析
- 不确定性量化:完整的后验分布
资源
此技能包含全面的参考资料:
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 分数检测离群值
最佳实践
- 尽可能预注册分析,以区分验证性分析和探索性分析
- 解释结果前务必检查假设
- 报告效应量及其置信区间
- 报告所有计划的分析,包括不显著的结果
- 区分统计显著性与实际意义
- 分析前后都要可视化数据
- 检查回归/ANOVA 的诊断结果(残差图、VIF 等)
- 进行敏感性分析以评估稳健性
- 共享数据和代码以确保可复现性
- 如实说明假设违背、数据转换和决策
应避免的常见陷阱
- P 值操纵:不要尝试多种方法,直到得到显著结果
- HARKing:不要把探索性发现表述为验证性发现
- 忽视假设:检查假设并报告违背情况
- 混淆显著性与重要性:p < .05 ≠ 有意义的效应
- 不报告效应量:效应量对结果解释至关重要
- 挑选结果:报告所有计划的分析
- 误解 p 值:它们并不是假设为真的概率
- 多重比较:适当时校正家族错误率
- 忽视缺失数据:了解其机制(MCAR、MAR、MNAR)
- 过度解读不显著结果:没有证据 ≠ 证据表明不存在
入门检查清单
开始统计分析时:
- 明确研究问题和假设
- 确定合适的统计检验(使用 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). 贝叶斯数据分析
在线资源:
- APA 风格指南:https://apastyle.apa.org/
- 统计咨询:Cross Validated (stats.stackexchange.com)