「あなたのデータ、本当にその仮説に合ってる?」📈 統計分析でよくあるこの疑問。
今回は、観測されたデータが、ある理論的な分布や比率にどれくらい「適合しているか」を科学的に評価する「適合度検定」について、基本から具体例、必要なサンプル数の計算の実践までを解説。
適合度検定とは
適合度検定は、観測されたデータが特定の理論的分布や比率にどれだけ当てはまるかを統計的に評価する手法だ。
例えば、「サイコロの各目の出方が均等か」といった疑問に答える際に用いる。
カイ二乗検定が一般的で、観測度数と期待度数のズレをカイ二乗値で数値化する。
この値とp値に基づき、データが理論に適合するかを判断する。
あるカテゴリカル変数が理論に適合するかを調べることが目的であり、独立性の検定とは異なる。
適合度検定の具体例
ある製薬会社が新薬の副作用について調査したとする。
過去のデータから、この種の薬では「頭痛」「吐き気」「発疹」の副作用がそれぞれ20%, 30%, 50%の割合で発生することが分かっていた。
新薬を100人の患者に投与したところ、頭痛が25人、吐き気が28人、発疹が47人に発生した。
ここで適合度検定を用いることで、「新薬の副作用の発生割合が、これまでの薬の発生割合と統計的に異なっているか?」を判断できる。
もしp値が有意水準(例えば5%)を下回れば、新薬の副作用の割合は過去の薬と異なると結論できるだろう。
R で計算する場合、以下のようなスクリプトになる。
# 1. 観測度数の定義
# 新薬を100人の患者に投与した結果
observed_counts <- c(
"頭痛" = 25,
"吐き気" = 28,
"発疹" = 47
)
# 2. 期待される比率(過去のデータ)の定義
# 過去のデータから、副作用の発生割合は「頭痛: 20%, 吐き気: 30%, 発疹: 50%」
expected_proportions <- c(
"頭痛" = 0.20,
"吐き気" = 0.30,
"発疹" = 0.50
)
# 3. カイ二乗適合度検定の実行
# chisq.test() 関数を使用し、観測度数 (x) と期待される比率 (p) を指定
chi_square_test_result <- chisq.test(x = observed_counts, p = expected_proportions)
# 4. 検定結果の表示
cat("--- 適合度検定の結果 ---\n")
print(chi_square_test_result)
検定結果は以下のとおりで、有意水準5%とすると、過去のデータと異なるとは言えないという結果になる。
> # 4. 検定結果の表示
> cat("--- 適合度検定の結果 ---\n")
--- 適合度検定の結果 ---
> print(chi_square_test_result)
Chi-squared test for given probabilities
data: observed_counts
X-squared = 1.5633, df = 2, p-value = 0.4576
適合度検定に必要なサンプル数の計算
適合度検定のサンプルサイズ計算をRで行うには、主にpwr
パッケージのpwr.chisq.test()
関数を使用する。
この関数を使うには、以下の情報が必要
w
(効果量 Cohen’s w): 検出したい効果の大きさ。カテゴリカルデータの場合、Cohen’s wが用いられる。小さい効果(0.1)、中程度の効果(0.3)、大きい効果(0.5)が目安とされる。df
(自由度): カテゴリの数から1を引いた値。例えば、3つのカテゴリがある場合、df = 3 – 1 = 2 となる。sig.level
(有意水準): 通常は0.05(5%)が用いられる。power
(検出力): 帰無仮説が偽である場合に、正しくそれを棄却できる確率。通常は0.8(80%)が目標とされる。N
(サンプルサイズ): これが計算したい値。
# pwrパッケージがインストールされていない場合はインストール
# install.packages("pwr")
# pwrパッケージを読み込む
library(pwr)
# 適合度検定のサンプルサイズ計算
# パラメータ設定:
# w: 効果量 (Cohen's w) - 中程度の効果を想定
# df: 自由度 (カテゴリ数 - 1)。例: 3つのカテゴリ (頭痛、吐き気、発疹) -> df = 2
# sig.level: 有意水準
# power: 検出力 (目標とする検出力)
sample_size_result <- pwr.chisq.test(
w = 0.3, # Cohen's w (効果量): 0.1(小), 0.3(中), 0.5(大)
df = 2, # 自由度: カテゴリ数 - 1
sig.level = 0.05, # 有意水準
power = 0.8, # 検出力
N = NULL # 計算したいNはNULLに設定
)
# 結果の表示
print(sample_size_result)
# サンプルサイズをより明確に表示
cat("\n必要なサンプルサイズ (N): ", ceiling(sample_size_result$N), "\n")
結果は以下のとおり、N = 108 と計算される
> print(sample_size_result)
Chi squared power calculation
w = 0.3
N = 107.0521
df = 2
sig.level = 0.05
power = 0.8
NOTE: N is the number of observations
> # サンプルサイズをより明確に表示
> cat("\n必要なサンプルサイズ (N): ", ceiling(sample_size_result$N), "\n")
必要なサンプルサイズ (N): 108
効果量 w の計算方法
ここで、効果量 w はどのようにして計算するか。
適合度検定における効果量として、一般的にCohen’s w (またはファイ係数 ϕ) が用いられる。これは、観測された度数と期待される度数の間の「ずれ」の大きさを標準化した指標である。
Cohen’s w は、以下の計算式で求められる。
$$ w=\sqrt{\frac{\chi^2}{N}} $$
ここで、
- χ2 は適合度検定によって得られたカイ二乗値
- N は総サンプルサイズ(観測度数の合計)
ここでは、先の「新薬の副作用」の例を使って、カイ二乗検定を行い、その結果からCohen’s wを計算するRスクリプトを示す。
例題: 新薬を100人の患者に投与したところ、
- 頭痛: 25人
- 吐き気: 28人
- 発疹: 47人 が発生した。
過去のデータから、副作用の発生割合は「頭痛: 20%, 吐き気: 30%, 発疹: 50%」と期待される。
# 1. 観測度数を定義
observed_counts <- c(25, 28, 47)
names(observed_counts) <- c("頭痛", "吐き気", "発疹")
# 2. 期待される比率を定義 (合計が1になるように)
expected_proportions <- c(0.20, 0.30, 0.50)
# 3. カイ二乗適合度検定を実行
# chisq.test() 関数は、引数 p に期待される比率を渡すことで適合度検定を行う
chi_square_test_result <- chisq.test(x = observed_counts, p = expected_proportions)
# 結果を表示
print(chi_square_test_result)
# 4. カイ二乗値と総サンプルサイズを取得
chi_square_value <- chi_square_test_result$statistic
total_sample_size <- sum(observed_counts)
# 5. Cohen's w を計算
cohens_w <- sqrt(chi_square_value / total_sample_size)
# 結果を表示
cat("\n適合度検定の結果:\n")
cat("カイ二乗値 (Chi-squared value):", chi_square_value, "\n")
cat("自由度 (df):", chi_square_test_result$parameter, "\n")
cat("p値 (p-value):", chi_square_test_result$p.value, "\n")
cat("総サンプルサイズ (Total N):", total_sample_size, "\n")
cat("Cohen's w (効果量):", cohens_w, "\n")
# 効果量の解釈の目安 (Cohen, 1988)
# w = 0.1: 小さい効果
# w = 0.3: 中程度の効果
# w = 0.5: 大きい効果
その結果、効果量 w は 約 0.125 と計算された
適合度検定の結果:
> cat("カイ二乗値 (Chi-squared value):", chi_square_value, "\n")
カイ二乗値 (Chi-squared value): 1.563333
> cat("自由度 (df):", chi_square_test_result$parameter, "\n")
自由度 (df): 2
> cat("p値 (p-value):", chi_square_test_result$p.value, "\n")
p値 (p-value): 0.4576426
> cat("総サンプルサイズ (Total N):", total_sample_size, "\n")
総サンプルサイズ (Total N): 100
> cat("Cohen's w (効果量):", cohens_w, "\n")
Cohen's w (効果量): 0.1250333
w = 0.125 で再計算すると、617 例必要と計算された。
> # w = 0.125 で再計算
> sample_size_result <- pwr.chisq.test(
+ w = 0.125, # Cohen's w (効果量): 0.1(小), 0.3(中), 0.5(大)
+ df = 2, # 自由度: カテゴリ数 - 1
+ sig.level = 0.05, # 有意水準
+ power = 0.8, # 検出力
+ N = NULL # 計算したいNはNULLに設定
+ )
> # 結果の表示
> print(sample_size_result)
Chi squared power calculation
w = 0.125
N = 616.6201
df = 2
sig.level = 0.05
power = 0.8
NOTE: N is the number of observations
> # サンプルサイズをより明確に表示
> cat("\n必要なサンプルサイズ (N): ", ceiling(sample_size_result$N), "\n")
必要なサンプルサイズ (N): 617
まとめ
適合度検定は、観測データがある理論的な分布や比率にどれほど「適合しているか」を評価する統計手法である。
サイコロの目の出方や新薬の副作用比率など、手元のデータが期待される割合と一致するかを判断する際に活用される。
主にカイ二乗検定を用い、観測度数と期待度数のズレから統計的有意性を評価する。
研究計画時には、Cohen’s wなどの効果量を考慮したサンプルサイズ計算が重要となる。
これにより、効率的かつ信頼性の高いデータ分析が可能となり、クリニカルクエスチョンに科学的な根拠を与えてくれる。
コメント