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_dcliffs_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.testcliffs_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. まとめ

  1. p値の罠に注意:N数(データ量)が多いと、実質的に無意味な差でもp値は有意になる。p値だけでの判断は危険です。
  2. 効果量と信頼区間を見る:「差の大きさ」を示す効果量と、その信頼区間 (CI) を確認するのが誠実。
    CIが0をまたいでいれば、実質的な差はない(または非常に小さい)可能性が高いです。
  3. 分布がすべてを決める:分析手法(t検定かWilcoxonか)は、データの分布を視覚化してから決定することが推奨される。
    Rがエラーを出してくれないので、分析者が選択してください。

前の記事

Ma.04.ggplot2 グラフ作成 復習