Ma.05.差の検定
データセット(df)を使い、統計的検定と効果量の使い方を確認しました。
var_A: 正規分布に近いと仮定する変数(t検定やANOVAの練習用)var_B: 分布に歪みがあると仮定する変数(ノンパラメトリック検定の練習用)sex: 2群比較用の変数age_g: 3群比較用の変数(1:若年, 2:中年, 3:高齢)
ゴール: p値だけに頼らず、①データの分布(視覚化)、②検定の前提条件、③効果量と信頼区間の3点を確認する習慣をつけます。
1. 2群の比較 (性別: sex)
1-1. 視覚化:分布の確認
検定の前に、データの形をヒストグラムで確認しました。
# var_A (正規分布に近い)
ggplot(df, aes(var_A)) +
geom_histogram() +
facet_wrap(~sex)
# var_B (歪んでいる)
ggplot(df, aes(var_B)) +
geom_histogram() +
facet_wrap(~sex, ncol = 1)
- ポイント
- var_B のように分布が歪んでいる場合、t検定の前提(正規分布)を満たしません。
- 図示の演習で身につけた、Facet_wrapを活用することで解釈しやすくなります。
1-2. 分析 (var_A):パラメトリック検定
var_A は分布がきれいなので、t検定とWilcoxon検定の両方を試します。
# t検定 (パラメトリック)
t.test(var_A ~ sex, data = df)
# 効果量 (effectsize パッケージ)
library(effectsize)
cohens_d(var_A ~ sex, data = df, ci = 0.95) # t検定に対応
- ポイント
- N数(サンプルサイズ)が大きいデータでは、ごく僅かな差でもp値は小さく(有意に)なりがちです。
- 重要なのは効果量とその信頼区間 (CI) を見ることです。
cohens_dやcliffs_deltaの信頼区間が 0をまたいでいる 場合、「実質的な差はほぼ無い」と判断します。
- 出力での確認ポイント(最小)
- 95% confidence interval (平均値の差): 0をまたいでいないか?
- sample estimates (各群の平均値): 実際の差を直感的に把握 (例: 69.7 vs 68.9)
- Cohen’s d (効果量) とそのCI: 実質的な差の大きさ (dの値) とその信頼性を評価
1-3. 分析 (var_B):ノンパラメトリック検定
var_B は分布が歪んでいるため、ノンパラメトリック検定(Wilcoxon検定)が適切です。
# 【間違い】前提条件を無視したt検定
t.test(var_B ~ sex, data = df)
# 【正しい】分布の形を問わないWilcoxon検定
wilcox.test(var_B ~ sex, data = df, conf.int = TRUE)
# 効果量 (Wilcoxon検定に対応)
cliffs_delta(var_B ~ sex, data = df, ci = 0.95)
- ポイント:
- 前提条件を無視して
t.test(var_B ~ sex)を実行してもRはエラーを出しません。 - データの分布(歪んでいる)に基づき、
wilcox.testとcliffs_deltaの結果を採用します。
- 前提条件を無視して
- 出力での確認ポイント(最小)
- 95% confidence interval (中央値の差): [4.06e-05, 4.11e-05]。0をまたいでいないか?
- difference in location (推定値): 4.27e-05。推定される差は、実質的にほぼ0であるかを確認。
- Cliff’s delta (効果量): 0.03 [CI: 0.01, 0.05]。実質的な差の大きさ
2. 3群の比較 (年齢層: age_g)
2-1. 分析 (var_A):パラメトリック検定 (ANOVA)
var_A(正規分布に近い)の3群比較には、分散分析(ANOVA)を使います。
# 1. ANOVA (分散分析)
# 「3群のうち、どこか1組でも差があるか?」を調べる(群間分散VS郡内分散)
ano <- aov(var_A ~ age_g, data = df)
summary(ano)
# 2. 多重比較 (TukeyHSD法)
# 「どの群とどの群に差があるか?」を調べる
TukeyHSD(ano)
# 3. 効果量 (イータ二乗)
# 「age_gの違いが、var_Aの変動をどの程度説明しているか?」
eta_squared(ano)
# 4. 視覚化
ggplot(df, aes(var_A)) +
geom_histogram() +
facet_wrap("age_g", ncol = 1)
- ポイント:
- 出力での確認ポイント(最小)
- summary(ano) の Pr(>F) (<2e-16): 3群以上のグループ間のどこかに差があるか確認
- TukeyHSD の p adj と信頼区間 (lwr, upr): 具体的に「どのペア」に差があるか(しか見れない)。
- eta_squared の Eta2 (0.02): age_g の違いが q3 の変動を説明する割合
- 解釈: 。
2-2. 分析 (var_B):ノンパラメトリック検定
var_B(歪んだ分布)の3群比較には、Kruskal-Wallis検定を使います。
# 1. Kruskal-Wallis検定 (ノンパラメトリック版ANOVA)
kruskal.test(var_B ~ age_g, data = df)
# 2. 多重比較 (Dunn検定)
# (KWで有意差があった場合)
library(FSA)
dunnTest(var_B ~ age_g, data = df, method = "holm") # p値を調整
# 3. 効果量 (ペアごと)
# Dunn検定で有意だったペアの効果量を算出
cliffs_delta(kessler6 ~ droplevels(age_g),
data = subset(naiman_c12, age_g %in% c(1, 2)),
conf.level = 0.95)
cliffs_delta(kessler6 ~ droplevels(age_g),
data = subset(naiman_c12, age_g %in% c(1, 3)),
conf.level = 0.95)
cliffs_delta(kessler6 ~ droplevels(age_g),
data = subset(naiman_c12, age_g %in% c(2, 3)),
conf.level = 0.95)
# 4. 視覚化 (中央値の比較は箱ひげ図が適する)
ggplot(df, aes(x = age_g, y = var_B)) +
geom_boxplot()
- ポイント:
dunnTestの結果(どのペアに差があるか)と、geom_boxplot()の視覚的な結果、cliffs_deltaの効果量が一致していることを確認。- dunnTestでは、P.adj(調整済みp値)で有意差を確認した後、Z値の符号(+ / -)を見るのが重要です。
Z:2群間の平均順位の差が、標準誤差の何倍あるか。 - この符号は、Comparison(例: 1 – 2)で示されたペアの「どちらが値(順位)が高いか」という差の方向性を示しています。
(例:1 – 2 のZ値がプラスなら「1群 > 2群」、マイナスなら「1群 < 2群」と解釈
- 出力での確認ポイント(最小)
- kruskal.test の p-value (<2e-16): 3群以上のグループ間のどこかに「統計的な差」があるか確認。
- dunnTest の P.adj (調整済みp値): 具体的に「どのペア」に有意差があるか、Z値の絶対値、Z値の符号。
- cliffs_delta の値 (それぞれ見る): 有意だった各ペアの「実質的な差の大きさ」を評価
3. まとめ
- p値の罠に注意:N数(データ量)が多いと、実質的に無意味な差でもp値は有意になる。p値だけでの判断は危険です。
- 効果量と信頼区間を見る:「差の大きさ」を示す効果量と、その信頼区間 (CI) を確認するのが誠実。
CIが0をまたいでいれば、実質的な差はない(または非常に小さい)可能性が高いです。 - 分布がすべてを決める:分析手法(t検定かWilcoxonか)は、データの分布を視覚化してから決定することが推奨される。
Rがエラーを出してくれないので、分析者が選択してください。

