統計分析 は何をしますか?
概要
仮説検定(t検定、ANOVA、カイ二乗検定)、回帰分析、相関分析、ベイズ分析を実施し、系統的な仮定チェック、効果量、APAスタイルのレポート作成を行います。目標は、査読者が批判できない分析、すなわち適切な検定、検証済みの仮定、正直な効果量、完全なレポートを作成することです。
このスキルを使うべきタイミング
以下の場合にこのスキルを使用してください:
- 統計的仮説検定(t検定、ANOVA、カイ二乗検定、ノンパラメトリック検定)を実施する場合
- 回帰分析または相関分析を実行する場合
- ベイズ統計分析を実行する場合
- 統計的仮定と診断をチェックする場合
- 効果量を計算し、検出力分析を実施する場合
- 統計結果をAPA形式で報告する場合
- 実験データまたは観察データを研究目的で分析する場合
インストール
uv を使用して、このスキルで使用するライブラリをインストールします。本番環境ではバージョンを固定し、探索目的の場合は固定しなくても問題ありません。
# コアの頻度論スタック(Python 3.10+、最新のSciPy/ArviZには3.12+推奨)
uv pip install "pingouin>=0.6" "scipy>=1.11" "statsmodels>=0.14.6" pandas matplotlib seaborn
# ベイズモデリング(PyMC 5 + ArviZ)
uv pip install "pymc>=5.0" "arviz>=1.0"
互換性に関する注意事項(2026年時点、pingouin 0.6.1、statsmodels 0.14.6、arviz 1.2で検証済み):
- 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列)を返し、幅パラメータはci_prob(hdi_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 スキルを参照してください。
分析ワークフロー
健全な分析はすべて同じ流れをたどります。ステップをスキップすると分析が撤回される原因になるため、順番に処理し、各ステップで何をしたかを必ず述べてください。
- データに触れる前に問いを組み立てる。 仮説、結果変数と予測変数、デザイン(独立 vs. 対応、グループ数)を明確に述べてください。今、計画された検定を決定します — 結果を見てから検定を選ぶのは、たとえ無邪気に行われたとしてもp-hackingです。
- データを検査する。 グループごとに:n、平均、SD、中央値、欠損値。検定の前に生データ(ヒストグラムまたは箱ひげ図)をプロットします。グループサイズの不均等、欠損、フロア/シーリング効果、外れ値はすべて適切な検定を変えます — 黙って回避するのではなく、ユーザーに明示してください。
- テストを選択する 以下のクイックリファレンス、または基本を超えたデザイン(度数、生存時間、信頼性、要因計画)については
references/test_selection_guide.mdを参照してください。 - 仮定をチェックする
scripts/assumption_checks.pyを使用します。仮定が満たされない場合は、修正検定(以下の表)に切り替え、計画と変更の両方を報告します。 - テストを実行し、常に効果量を一緒に計算します — p値は効果が存在することを示しますが、効果量は誰かが気にする必要があるかどうかを示します。
- 以下のAPAテンプレートを使用して報告する、記述統計、正確な統計量、信頼区間付きの効果量、実施した仮定チェックを含めます。
ユーザーが1つのステップだけを必要とする場合(例:「必要な参加者数は何人ですか?」)、そのセクションに直接ジャンプしても構いません — ただし、計算の前提となるデザインの仮定を確認してください。
テスト選択ガイド
クイックリファレンス:適切なテストの選択
包括的なガイダンス(度数、生存、信頼性、要因計画)については references/test_selection_guide.md を参照してください。クイックリファレンス:
2グループの比較:
- 独立、連続、正規 → 独立したt検定
- 独立、連続、非正規 → Mann-WhitneyのU検定
- 対応、連続、正規 → 対応のあるt検定
- 対応、連続、非正規 → Wilcoxonの符号付き順位検定
- 二値結果 → カイ二乗検定またはFisherの正確確率検定
3グループ以上の比較:
- 独立、連続、正規 → 一元配置分散分析
- 独立、連続、非正規 → Kruskal-Wallis検定
- 対応、連続、正規 → 反復測定分散分析
- 対応、連続、非正規 → Friedman検定
関係:
- 2つの連続変数 → 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
)
ターゲットを絞ったチェックの場合は、個別の関数をインポートします:
from assumption_checks import (
check_normality, # Shapiro-Wilk + Q-Qプロット + ヒストグラム
check_normality_per_group,
check_homogeneity_of_variance, # Levene検定 + 箱ひげ図
check_linearity, # 単回帰用の散布図 + 残差プロット
check_regression_diagnostics, # 完全なOLS診断(以下の回帰セクションを参照)
detect_outliers # IQRまたはzスコア法
)
result = check_normality(data=df['score'], name='テストスコア', 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' は分散が等しくない場合にWelchの補正を適用
result = pg.ttest(group_a, group_b, correction='auto')
# Pingouin >= 0.6 の列名
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] # 平均差の信頼区間
print(f"t({df:.0f}) = {t_stat:.2f}, p = {p_value:.3f}, d = {cohens_d:.2f}")
事後検定付き分散分析
import pingouin as pg
aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print(aov)
# 効果量:偏イータ二乗
eta_p2 = aov['np2'].values[0]
# 有意な場合、事後検定を実施(Tukey HSDは家族生得誤差を制御)
if aov['p_unc'].values[0] < 0.05:
posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
print(posthoc) # ペアごとのHedges' gを含む
診断付き線形回帰
import statsmodels.api as sm
from assumption_checks import check_regression_diagnostics
X = sm.add_constant(X_predictors) # 切片を追加
model = sm.OLS(y, X).fit()
print(model.summary())
# 4パネル残差プロット + Shapiro-Wilk、Breusch-Pagan、Durbin-Watson、VIF
diag = check_regression_diagnostics(model)
print(diag['interpretation'])
print(diag['vif'])
# 不均一分散がフラグされた場合、代わりに頑健標準誤差を報告
robust = model.get_robustcov_results('HC3')
ベイズ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)
# ArviZ 1.x はデフォルトで89%区間を返します。報告には明示的に95%を要求
print(az.summary(trace, var_names=['difference'], ci_prob=0.95))
# 直接的な確率文(これが片側の問いの扱い方です)
prob_greater = np.mean(trace.posterior['difference'].values > 0)
print(f"P(mu1 > mu2 | データ) = {prob_greater:.3f}")
# ArviZ 1.x は az.plot_posterior を削除しました。代わりに plot_dist を使用(0.xでは plot_posterior がまだ動作します)
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 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はテストとともに効果量を返します(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検定:d = 0.5 を検出するためにグループあたり必要なnは?
n_required = tt_ind_solve_power(
effect_size=0.5,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"グループあたりの必要n: {n_required:.0f}")
# 一元配置分散分析:Cohen's f = 0.25 を検出するために必要なnは?
# 注:パラメータは k_groups、effect_size は Cohen's f (f = sqrt(eta2/(1-eta2)));
# そして solve_power はグループあたりのnではなく、TOTALサンプルサイズを返します。
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"必要な総N: {math.ceil(n_total)} (1グループあたり {math.ceil(n_total / 3)})")
感度分析(研究後)
研究がどの効果量を検出できたかを決定します:
# グループあたりn=50の場合、80%の検出力でどのような効果を検出できるか?
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"研究は d >= {detectable_d:.2f} を検出可能")
注意:事後検出力(観測された効果から検出力を計算する)は循環論法で誤解を招きます — p値の決定論的な関数です。研究が終了し、誰かが検出力について尋ねてきた場合は、代わりに感度分析を実行してください。
詳細なガイダンスについては references/effect_sizes_and_power.md を参照してください。
結果の報告
APAスタイルについては references/reporting_standards.md に従ってください。すべてのレポートには以下が必要です:
- 記述統計:すべてのグループ/変数のM、SD、n
- 検定統計量:検定名、統計量、df、正確なp値(
p = .034、p < .05ではない。.001未満の場合のみp < .001を使用) - 効果量:信頼区間付き
- 仮定チェック:実行したテスト、結果、取った措置
- 計画されたすべての分析:有意でない結果も含める — 省略はチェリーピッキングです
レポートテンプレートの例
独立したt検定
グループA(n = 48, M = 75.2, SD = 8.5)は、グループB(n = 52, M = 68.3, SD = 9.2)よりも有意に高いスコアを示した、t(98) = 4.12, p < .001, d = 0.79 [95% CI: 0.38, 1.20]。