統計について思い出さないといけなくなった。(元々わかってない)
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}')
