統計の準備

統計について思い出さないといけなくなった。(元々わかってない)

t検定、z検定、studentのt検定、Welch’s t検定、等分散、F検定、Levene検定、Bartlett検定、t統計量、効果量、信頼区間、Cohenのd などなど。
t検定周りでもこれだけは理解が必要🥺

カイ二乗検定、カプラン・マイヤー法、回帰分析、ロジスティック回帰分析、相関係数など

いっぱいある。

Pythonでの実験を含めて勉強する予定。

—————————————————————————————————-

まずは等分散かどうかを調べるみたい。

2群比較ならF検定、Levene検定。それ以上ならLevene検定(ルビーン)かBartlett検定(バートレット)。

F test
2つのグループのばらつきが等しい(等分散)か、等しくないかを判断。
t検定の事前確認: 平均値を比較するt検定を行う際、等分散か不等分散かによって使用する計算手法(スチューデント型かウェルチ型か)を選択するため。
2つのサンプルの不偏分散(大きい方の分散 ÷ 小さい方の分散)を計算し、F値を求める。

import numpy as np
from scipy import stats

# サンプルデータ
x = [18, 21, 23, 17, 20, 19, 22, 18, 20, 19]
y = [25, 30, 22, 28, 26, 29, 24, 27, 26, 25]

# 分散と自由度の計算
var1 = np.var(x, ddof=1)
var2 = np.var(y, ddof=1)
df1 = len(x) - 1
df2 = len(y) - 1

# F値の計算
f_stat = var1 / var2

# 両側p値の計算
p_value = 2 * min(stats.f.cdf(f_stat, df1, df2), 1 - stats.f.cdf(f_stat, df1, df2))

print(f"F値: {f_stat}")
print(f"p値: {p_value}")

算出したF値に対応するp値を取得

import scipy.stats as stats

# 各種パラメータの設定
f_value = 3.5    # 算出したF値
n1 = 11          # グループ1のデータ数
n2 = 13          # グループ2のデータ数

df1 = n1 - 1     # 自由度1 (10)
df2 = n2 - 1     # 自由度2 (12)

# 片側(上側)の確率を求め、2倍して両側p値を算出
p_value = (1 - stats.f.cdf(f_value, df1, df2)) * 2
print(f"p値: {p_value}")

有意水準(通常は5% = 0.05)とp値を比較し、p < 0.05 ならば帰無仮説を棄却し「分散に差がある」と判断。

Levene’s test

Levene検定・Brown-Forsythe検定は、ともにグループ間の分散の差(等分散性)を検定
 - 帰無仮説:すべてのグループで分散は等しい(=等分散)
 - 対立仮説:いずれかのグループで分散が異なる(両側検定) ※片側検定は存在しない

import scipy.stats as stats

# グループごとのデータ例
group1 = [18, 20, 22, 19, 21]
group2 = [25, 30, 28, 27, 29]
group3 = [15, 22, 35, 18, 20]

# Levene検定の実行(デフォルトは中央値 center='median')
stat, p_value = stats.levene(group1, group2, group3)

print(f"統計量 (W): {stat}")
print(f"p値: {p_value}")

if p_value < 0.05:
    print("分散は等しくありません(等分散性を棄却)")
else:
    print("分散は等しいとみなせます(等分散性を採択)")
```

## 主なパラメータ (`center`)

`center` 引数で、中心の計算方法を変更できます。
* `'median'`(デフォルト):中央値を使用します(Brown-Forsythe検定とも呼ばれます)。
* `'mean'`:平均値を使用します。
* `'trimmed'`:トリム平均(両端の一定割合を除外した平均)を使用します。

<FollowUp>
もし特定の**データフレーム(Pandas)**を使った集計や、**正規性の確認(シャピロ-ウィルク検定など)**と組み合わせたコードを知りたい場合は、お知らせください。
</FollowUp>

Bartlett’s test

・主な用途: 分散分析やt検定など、等分散を前提とするパラメトリック検定を行う前の事前確認
・2群間の分散の比較にはF検定を使い、3群以上の比較にはバートレット検定
・前提条件: データが正規分布に従っている。従わない場合は、ルビーン検定(Levene’s test)

import scipy.stats as stats

# 各グループのデータを用意(例:3つのグループ)
group1 = [23, 25, 29, 30, 32]
group2 = [18, 20, 22, 25, 28]
group3 = [21, 23, 25, 27, 30]

# バートレット検定の実行
stat, p_value = stats.bartlett(group1, group2, group3)

print(f"統計量 (Statistic): {stat:.4f}")
print(f"p値 (p-value): {p_value:.4f}")

# 有意水準0.05で判定
if p_value < 0.05:
    print("帰無仮説を棄却:分散は等しくありません(等分散性なし)")
else:
    print("帰無仮説を採用:分散は等しいとみなせます(等分散性あり)")

正規分布に従っているかどうか?
シャピロ-ウィルク検定(Shapiro-Wilk test)
サンプル数が非常に多いと、わずかなズレでも「正規分布ではない」と判定されやすい。
逆にサンプル数が少ないと、正規分布から外れていても「正規分布ではないとは言えない」という結果になりがちで、検定だけに頼らずグラフの形(Q-Qプロットなど)を併せて確認する。
scipyのshapiro関数

W, shapiro_p_value = stats.shapiro(data)
print(f'Shapiro-Wilk test statistic: {W}, p-value: {shapiro_p_value}')