mcpField
S
statistical-analysis

statistical-analysis

github.com/kalarislabsデータ・データベース7969 回インストール5 日前に更新
リポジトリ

statistical-analysis について

statistical-analysisは、実験データや観察データを分析する研究スキルです。頻度論・ベイズ統計の検定、仮定の確認、効果量の算出、APA形式での報告を扱います。

主な機能

  1. 01一般的な研究課題に応じた検定選択
  2. 02仮定の確認と診断
  3. 03頻度論・ベイズ分析
  4. 04効果量と信頼区間
  5. 05検出力と感度分析
  6. 06APA形式の結果報告

活用シーン

  1. 01t検定やANOVAによる群間比較
  2. 02相関や回帰による変数間の分析
  3. 03結果の解釈前のモデル仮定の確認
  4. 04効果量を含む統計レポートの作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kalarislabs/research-agent-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)
uv pip install "pymc>=5.0" "arviz>=1.0"

互換性に関する注意事項(pingouin 0.6.1、statsmodels 0.14.6、arviz 1.2、2026 年のバージョンで確認済み):

  • Pingouin 0.6.0 では、特殊文字を取り除くために出力列名が変更されました。p_val、cohen_d、CI95、p_unc となっています(0.5.x ではそれぞれ p-val、cohen-d、CI95%、p-unc でした)。以下の例では現在の列名を使用しています。0.5.x を使用している場合は、ハイフン付きの列名を使用してください。
  • statsmodels + SciPy:SciPy 1.16 以降で _lazywhere のインポートエラーを避けるため、statsmodels>=0.14.6 と scipy>=1.11 を使用してください。
  • ArviZ 1.x:az.summary() のデフォルトが 89% 区間(eti89 列)になり、幅を指定するパラメーターは hdi_prob ではなく ci_prob になりました。標準的な 95% 信用区間を報告するには、az.summary(trace, ci_prob=0.95) を渡してください。
  • Pingouin では片側ベイズファクターが廃止されました:pg.ttest(..., alternative='greater') は BF10 列を警告なしで削除し、pg.bayesfactor_ttest は片側検定を指定するとエラーを発生させます。片側ベイズ検定には、PyMC を直接使用する(方向性のある仮説の事後確率を計算する)か、JASP/R の BayesFactor を使用してください。

モデル固有の API(OLS、GLM、ARIMA)については、statsmodels スキルを参照してください。PyMC のワークフローについては、pymc スキルを参照してください。


分析ワークフロー

妥当な分析はすべて、同じ流れに沿って進みます。手順を省くと分析が撤回されるような事態につながるため、順番どおりに進め、各手順で行ったことを説明してください。

  1. データに触れる前に問いを定めます。 仮説、結果変数と予測変数、デザイン(独立群か対応ありか、群数)を明確にします。あらかじめ使用する検定を決めてください。結果を確認してから検定を選ぶのは、たとえ悪意がなくても p ハッキングです。
  2. データを確認します。 群ごとに n、平均、SD、中央値、欠損値を確認します。検定を行う前に、生データをプロットします(ヒストグラムまたは箱ひげ図)。群サイズの不均衡、欠損、床効果・天井効果、外れ値は、適切な検定を左右します。黙って対処するのではなく、こうした点をユーザーに伝えてください。
  3. 検定を選択します。 以下のクイックリファレンスを使用するか、基本的な範囲を超えるデザイン(度数、イベント発生までの時間、信頼性、要因計画)については references/test_selection_guide.md を参照してください。
  4. scripts/assumption_checks.py を使って前提条件を確認します。前提条件を満たさない場合は、以下の表に従って代替検定に切り替え、その計画と変更の両方を報告してください。
  5. 検定を実行し、必ず効果量もあわせて計算します。p 値は効果が存在することを示し、効果量はその効果を誰かが気にするほど重要かどうかを示します。
  6. 以下の APA 形式のテンプレートを使って報告します。記述統計量、正確な統計量、信頼区間付きの効果量、実施した前提条件の確認を含めてください。

ユーザーが必要としているのが一つの手順だけの場合(例:「参加者は何人必要ですか?」)、そのセクションに直接進んで構いません。ただし、計算の根拠となるデザインの前提条件は必ず確認してください。


検定の選択ガイド

クイックリファレンス:適切な検定の選び方

包括的なガイダンス(件数、生存、信頼性、要因計画)については、references/test_selection_guide.md をご覧ください。クイックリファレンス:

2群の比較:

  • 独立、連続、正規分布 → 独立 t 検定
  • 独立、連続、非正規分布 → Mann-Whitney U 検定
  • 対応あり、連続、正規分布 → 対応のある t 検定
  • 対応あり、連続、非正規分布 → Wilcoxon 符号付順位検定
  • 二値アウトカム → カイ二乗検定または Fisher の正確確率検定

3群以上の比較:

  • 独立、連続、正規分布 → 一元配置 ANOVA
  • 独立、連続、非正規分布 → Kruskal-Wallis 検定
  • 対応あり、連続、正規分布 → 反復測定 ANOVA
  • 対応あり、連続、非正規分布 → Friedman 検定

関係性:

  • 2つの連続変数 → Pearson 相関(正規分布)または Spearman 相関(非正規分布)
  • 連続アウトカムと予測変数 → 線形回帰
  • 二値アウトカムと予測変数 → ロジスティック回帰

ベイズ統計による代替手法: すべての検定には、仮説に関する直接的な確率表現、エビデンスを定量化する Bayes Factor、帰無仮説を支持できる機能を備えたベイズ版があります。references/bayesian_statistics.md をご覧ください。


仮定の確認

検定結果を解釈する前に、必ず仮定を確認し、確認結果を報告してください。査読者は確認結果を求めます。

同梱の scripts/assumption_checks.py モジュールを使用します。スキルディレクトリ(skills/statistical-analysis/)から Python を実行するか、scripts/ を sys.path に追加してください。

from assumption_checks import comprehensive_assumption_check

# Outliers + normality (per group) + homogeneity of variance, with plots
results = comprehensive_assumption_check(
    data=df,
    value_col='score',
    group_col='group',  # Optional: for group comparisons
    alpha=0.05
)

対象を絞って確認するには、個々の関数をインポートします。

from assumption_checks import (
    check_normality,                # Shapiro-Wilk + Q-Q plot + histogram
    check_normality_per_group,
    check_homogeneity_of_variance,  # Levene's test + box plots
    check_linearity,                # scatter + residual plot for simple regression
    check_regression_diagnostics,   # full OLS diagnostics (see Regression below)
    detect_outliers                 # IQR or z-score methods
)

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 検定を使用します(pg.ttest は correction='auto' で自動的に適用します)
  • ANOVA の場合 → Welch の ANOVA(pg.welch_anova)または Brown-Forsythe を使用します
  • 回帰の場合 → 頑健標準誤差または加重最小二乗法を使用します

線形性に違反している場合(回帰):

  • 多項式項を追加する、変数を変換する、または非線形モデル/GAM を使用します

標本数 n が増えると形式的な検定は過敏になります。n ≥ 100 の場合は、Shapiro-Wilk の p 値よりも Q-Q プロットを重視してください。包括的なガイダンスについては、references/assumptions_and_diagnostics.md をご覧ください。


統計検定の実行

主なライブラリ:

  • pingouin:デフォルトで効果量を返す、使いやすい検定です。標準的な検定にはこちらを優先してください
  • scipy.stats:基本的な統計検定
  • statsmodels:回帰、診断、検出力分析
  • pymc + arviz:ベイズモデリングと診断
報告に必要な情報を網羅した t 検定
import pingouin as pg

# correction='auto' applies Welch's correction when variances are unequal
result = pg.ttest(group_a, group_b, correction='auto')

# Pingouin >= 0.6 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_lower, ci_upper = result['CI95'].values[0]  # CI for the mean difference

print(f"t({df:.0f}) = {t_stat:.2f}, p = {p_value:.3f}, d = {cohens_d:.2f}")
事後検定を伴う ANOVA
import pingouin as pg

aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print(aov)

# Effect size: partial eta-squared
eta_p2 = aov['np2'].values[0]

# If significant, conduct post-hoc tests (Tukey HSD controls family-wise error)
if aov['p_unc'].values[0] < 0.05:
    posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
    print(posthoc)  # includes Hedges' g per pair
診断を伴う線形回帰
import statsmodels.api as sm
from assumption_checks import check_regression_diagnostics

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

# 4-panel residual plot + Shapiro-Wilk, Breusch-Pagan, Durbin-Watson, VIF
diag = check_regression_diagnostics(model)
print(diag['interpretation'])
print(diag['vif'])

# If heteroscedasticity was flagged, report robust standard errors instead
robust = model.get_robustcov_results('HC3')
ベイズ 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)

    trace = pm.sample(2000, tune=1000)

# ArviZ 1.x defaults to 89% intervals; request 95% explicitly for reporting
print(az.summary(trace, var_names=['difference'], ci_prob=0.95))

# Direct probability statement (this is what one-sided questions become)
prob_greater = np.mean(trace.posterior['difference'].values > 0)
print(f"P(mu1 > mu2 | data) = {prob_greater:.3f}")

# ArviZ 1.x removed az.plot_posterior; use plot_dist (on 0.x, plot_posterior still works)
az.plot_dist(trace, var_names=['difference'], ci_prob=0.95)

事前分布のスケールはデータに合わせてください(例:SD が 10 前後のアウトカムには sigma=10 が適しています。観測された SD を目安にしてください)。また、レポートには事前分布を記載してください。


効果量

効果量は大きさを定量化します。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 は検定とともに効果量を返します(pg.ttest の cohen_d、pg.anova の np2、pg.pairwise_tukey の hedges。pg.corr の r はそれ自体がすでに効果量です)。

効果量の信頼区間

効果量の精度を示すため、効果量の信頼区間を報告します。pg.compute_esci を使用してください(注:pg.compute_effsize_from_t は点推定値のみを返し、信頼区間は返しません)。

import pingouin as pg

d = pg.compute_effsize(group_a, group_b, eftype='cohen')
ci_lower, ci_upper = pg.compute_esci(stat=d, nx=len(group_a), ny=len(group_b),
                                     eftype='cohen', confidence=0.95)
print(f"d = {d:.2f}, 95% CI [{ci_lower:.2f}, {ci_upper:.2f}]")

検出力分析

事前検出力分析(研究計画)

データ収集前に必要なサンプルサイズを決定します。

from statsmodels.stats.power import tt_ind_solve_power, FTestAnovaPower

# T-test: What n per group 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}")

# One-way ANOVA: What n is needed to detect Cohen's f = 0.25?
# Notes: the parameter is k_groups; effect_size is Cohen's f (f = sqrt(eta2/(1-eta2)));
# and solve_power returns the TOTAL sample size, not n per group.
import math
anova_power = FTestAnovaPower()
n_total = anova_power.solve_power(
    effect_size=0.25,
    k_groups=3,
    alpha=0.05,
    power=0.80
)
print(f"Required total N: {math.ceil(n_total)} ({math.ceil(n_total / 3)} per group)")
感度分析(研究後)

研究で検出可能な効果量を決定します。

# With n=50 per group, what effect could we detect at 80% power?
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}")

注:事後的な「観測検出力」(観測された効果から検出力を算出すること)は循環論法であり、誤解を招きます。これは p 値の決定論的な関数です。研究が実施済みで、検出力について尋ねられた場合は、代わりに感度分析を行ってください。

詳しいガイダンスについては、references/effect_sizes_and_power.md を参照してください。


結果の報告

APA スタイルについては、references/reporting_standards.md に従ってください。すべての報告には次の項目が必要です。

  1. 記述統計:すべての群/変数の M、SD、n
  2. 検定統計量:検定名、統計量、自由度、正確な p 値(p = .034。p < .05 ではなく、.001 未満の場合のみ p < .001 を使用)
  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.
一元配置分散分析
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, 10) for group means). The posterior
distribution indicated that Group A scored higher than Group B
(M_diff = 6.8, 95% credible interval [3.2, 10.4]), with a 99.8%
posterior probability that Group A's mean exceeded Group B's mean.
Convergence diagnostics were satisfactory (all R-hat < 1.01, ESS > 1000).

ノンパラメトリック検定を使用した場合は、平均値ではなく中央値、U/W/H 統計量、および順位に基づく効果量(例:順位双列相関。pg.mwu では RBC として返されます)を報告してください。


ベイズ統計

次の場合は、ベイズアプローチを検討してください。

  • 組み込むべき事前情報がある
  • 仮説について直接的な確率の記述を行いたい(「効果がこの区間にある確率は 95% です」)
  • サンプルサイズが小さい、またはデータ収集を逐次的に行う(任意停止に対する補正は不要です)
  • 帰無仮説を支持する証拠を定量化する必要がある
  • モデルが複雑である(階層構造、欠測データ)

事前分布の指定、ベイズファクター、信用区間、階層モデル、収束の確認(R-hat < 1.01、十分な ESS、事後予測チェック)については、references/bayesian_statistics.md を参照してください。


同梱リソース

参考資料(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()、check_normality_per_group():Q-Q プロットを用いた Shapiro-Wilk 検定
    • check_homogeneity_of_variance():箱ひげ図を用いた Levene 検定
    • check_regression_diagnostics():適合済み OLS モデルの 4 パネル残差プロット、および Shapiro-Wilk、Breusch-Pagan、Durbin-Watson、VIF
    • check_linearity()、detect_outliers()

統計的な完全性

分析の妥当性を保つための実践方法です。最もよくある統計上の失敗は計算ミスではなく、結果が出るまで検定を繰り返すといった気づかれにくい柔軟な分析や、都合のよい結果だけを報告することだからです。

  1. 確認的分析と探索的分析を区別します。 分析を実行する前に、予定している分析を明示します。分析の過程で見つかったものは、すべて探索的分析として位置づけます。
  2. 有意差を求めて検定を試し続けないでください。 予定していた検定で有意でなければ、それが結果です。p < .05 になるまで別の検定、サブグループ、外れ値の除外方法を試すと、p 値の妥当性が損なわれます。
  3. 検定を複数回行う場合は、多重比較を補正します。(事後 ANOVA には Tukey HSD、それ以外の検定群には Holm 法または Benjamini-Hochberg FDR を使用します。)どの補正を使用したかも明記します。
  4. 有意でない結果は、効果がないことの証拠ではありません。 n が小さい場合、単に検出力が不足していた可能性があります。感度分析を行うか、ベイズ分析または同等性検定を用いて、帰無仮説を実際にどの程度支持できるかを定量化します。
  5. 統計的有意性は実務上の重要性を意味しません。 n が大きいと、ごく小さな効果でも p < .001 になります。効果量を中心に解釈を述べます。
  6. 行を削除する前に、欠損データを把握します。 リストワイズ削除が安全なのは、データが完全にランダムに欠損している場合だけです。それ以外の場合は、多重代入を検討し、実施した方法を明記します。
  7. 再現可能な状態にします。 乱数シードを設定し、シミュレーションベースの手法ではライブラリのバージョンを報告し、分析を実行可能なスクリプトにまとめます。

関連スキル

  • statistical-power:研究計画のためのサンプルサイズと統計的検出力の計算。
  • statsmodels:Python 用の統計モデルライブラリ。
  • bgpt-paper-search:BGPT MCP サーバーを介して、科学論文を検索し、全文研究から抽出された構造化実験データを取得します。

コメント