statistical-analysis について
statistical-analysisは、SciPyやstatsmodelsなどのPythonライブラリを使った統計手法のガイドです。一般的な検定、信頼区間、相関、A/Bテストに加え、前提条件の確認やよくある誤りを扱います。
主な機能
- 01t検定、カイ二乗検定、ANOVA
- 02信頼区間と相関分析
- 03有意性を確認するA/Bテスト
- 04前提条件の確認とノンパラメトリックな代替手法
- 05多重検定と検出力分析の指針
活用シーン
- 01群の平均値やカテゴリーデータを比較
- 02区間を推定し相関を調べる
- 03A/Bテストの結果を評価
- 04前提条件を確認し多重比較に対処
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ pluginagentmarketplace/ custom-plugin-ai-data-scientist --skill statistical-analysisインストール後、Claude Code で/statistical-analysisを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/ab_test_config.yamlreferences/TEST_SELECTION_GUIDE.mdscripts/hypothesis_testing.py詳細
統計分析
統計手法を適用してデータを理解し、結果を検証します。
クイックスタート
from scipy import stats
import numpy as np
# Descriptive statistics
data = np.array([1, 2, 3, 4, 5])
print(f"Mean: {np.mean(data)}")
print(f"Std: {np.std(data)}")
# Hypothesis testing
group1 = [23, 25, 27, 29, 31]
group2 = [20, 22, 24, 26, 28]
t_stat, p_value = stats.ttest_ind(group1, group2)
print(f"P-value: {p_value}")
主な検定
t検定(平均値の比較)
# One-sample: Compare to population mean
stats.ttest_1samp(data, 100)
# Two-sample: Compare two groups
stats.ttest_ind(group1, group2)
# Paired: Before/after comparison
stats.ttest_rel(before, after)
カイ二乗検定(カテゴリーデータ)
from scipy.stats import chi2_contingency
observed = np.array([[10, 20], [15, 25]])
chi2, p_value, dof, expected = chi2_contingency(observed)
ANOVA(複数グループ)
f_stat, p_value = stats.f_oneway(group1, group2, group3)
信頼区間
from scipy import stats
confidence_level = 0.95
mean = np.mean(data)
se = stats.sem(data)
ci = stats.t.interval(confidence_level, len(data)-1, mean, se)
print(f"95% CI: [{ci[0]:.2f}, {ci[1]:.2f}]")
相関
# Pearson (linear)
r, p_value = stats.pearsonr(x, y)
# Spearman (rank-based)
rho, p_value = stats.spearmanr(x, y)
分布
# Normal
x = np.linspace(-3, 3, 100)
pdf = stats.norm.pdf(x, loc=0, scale=1)
# Sampling
samples = np.random.normal(0, 1, 1000)
# Test normality
stat, p_value = stats.shapiro(data)
A/Bテストのフレームワーク
def ab_test(control, treatment, alpha=0.05):
"""
Run A/B test with statistical significance
Returns: significant (bool), p_value (float)
"""
t_stat, p_value = stats.ttest_ind(control, treatment)
significant = p_value < alpha
improvement = (np.mean(treatment) - np.mean(control)) / np.mean(control) * 100
return {
'significant': significant,
'p_value': p_value,
'improvement': f"{improvement:.2f}%"
}
解釈
P値 < 0.05:帰無仮説を棄却します(統計的に有意です)
P値 >= 0.05:帰無仮説を棄却できません(有意ではありません)
よくある落とし穴
- 多重検定を補正せずに行う
- サンプルサイズが小さい
- 仮定(正規性、独立性)を無視する
- 相関と因果関係を混同する
- pハッキング(有意性を探し回る)
トラブルシューティング
よくある問題
問題:t検定を行うにはデータが正規分布していない
# Check normality first
stat, p = stats.shapiro(data)
if p < 0.05:
# Use non-parametric alternative
stat, p = stats.mannwhitneyu(group1, group2) # Instead of ttest_ind
問題:多重比較によって偽陽性が増加する
from statsmodels.stats.multitest import multipletests
# Apply Bonferroni correction
p_values = [0.01, 0.03, 0.04, 0.02, 0.06]
rejected, p_adjusted, _, _ = multipletests(p_values, method='bonferroni')
問題:検出力が不足している研究(サンプルが少なすぎる)
from statsmodels.stats.power import TTestIndPower
# Calculate required sample size
power_analysis = TTestIndPower()
sample_size = power_analysis.solve_power(
effect_size=0.5, # Medium effect (Cohen's d)
power=0.8, # 80% power
alpha=0.05 # 5% significance
)
print(f"Required n per group: {sample_size:.0f}")
問題:分散が不均一
# Check with Levene's test
stat, p = stats.levene(group1, group2)
if p < 0.05:
# Use Welch's t-test (default in scipy)
t, p = stats.ttest_ind(group1, group2, equal_var=False)
問題:外れ値が結果に影響する
from scipy.stats import zscore
# Detect outliers (|z| > 3)
z_scores = np.abs(zscore(data))
clean_data = data[z_scores < 3]
# Or use robust statistics
median = np.median(data)
mad = np.median(np.abs(data - median)) # Median Absolute Deviation
デバッグ用チェックリスト
- サンプルサイズが十分か確認する(検出力分析)
- 正規性の仮定を検定する(Shapiro-Wilk検定)
- 分散の均一性を検定する(Levene検定)
- 外れ値を確認する(zスコア、IQR)
- 必要に応じて多重検定を補正する
- p値だけでなく、効果量も報告する
コメント
Markdown 対応