落ちこぼれナースの統計チャレンジ

元落ちこぼれ看護師(保健師)が、私と同じく統計にドキドキしている看護学生や保健師さんに、簡単な言葉で届けるために始めたブログです。

カイ二乗検定 ~因縁の関係の真相を暴け~


あれれ〜?おかしいぞ?

あなたはとある企業の保健師です。
従業員と面談している中で、最近、やけに「不眠」の相談が多いことに気づきました。

しかも夜勤明けの人に多いような気がする。

……気がする。

「気がする」という感覚も大切ですが、それだけ言っても他の保健師に「根拠は?」と尋ねられるのがオチです。

華麗に登場、クロス集計表

果たして、本当に不眠の相談は夜勤明けの人に多いのだろうか?
その謎を解明するため、我々調査隊はアマゾンの奥地へと向かった――。

ではなく、クロス集計表を作ったーー。
こちらが、観測値のクロス集計表です。

 不眠あり(人)不眠なし(人)合計(人)
夜勤あり302050
夜勤なし203050
合計5050100

ここで「夜勤ある人、不眠多くね?」という疑惑が再燃しました。

でも、これだけでは断定できません。

次のステップに進みましょう。

カイ二乗検定、登場

お待たせしました。ここで現れるのが今回の主人公、カイ二乗検定です。

カイ二乗検定はχ2検定とも表記しますが、ギリシャ文字なので日本人の我々には話しかけてくれません。無口です。

でも、目で訴えてきます。

「怪しいぞ…」って。

まず、期待度数をExcelで計算してみます。

どういうことやねん、と思う方もいるかもしれませんが、今回の場合は「もし夜勤と不眠は関係ないとしたら、クロス集計表はどうなる?」と言う場合の期待値の分割表を作ります。

とある青い狸みたいなロボットが出してくれる「もしもボックス」みたいですね。

そして出来上がった期待値の分割表はこちら。

 不眠あり(人)不眠なし(人)合計(人)
夜勤あり252550
夜勤なし252550
合計5050100

この表では、夜勤の有無に関わらず不眠の有無の割合が変わりません。
もし夜勤と不眠が全く関係ないのだとしたら、不眠がある人の中で夜勤がある人は25人、ない人は25人になります。

では、最初に作ったクロス集計表に戻ります。

 不眠あり(人)不眠なし(人)合計(人)
夜勤あり302050
夜勤なし203050
合計5050100

……お分かりいただけただろうか。
実際のデータでは不眠がある人で夜勤ありは30人、夜勤なしは20人です。

さっきの期待値の分割の結果と大きくズレている気がしますね。

χ²値を出そう

観測 − 期待の ズレが大きいかどうかを「χ²値」で評価します。

χ² = Σ{(観測値 − 期待値)² ÷ 期待値}

結局どうすんねん、と思うかもしれませんが、上の図の

  • B3 と B9(夜勤あり × 不眠あり)
  • C3 と C9(夜勤あり × 不眠なし)
  • B4 と B10(夜勤なし × 不眠あり)
  • C4 と C10(夜勤なし × 不眠なし)

を比較します。

まず、B3とB9(夜勤あり × 不眠あり)を比較します。

(観測値 − 期待値)² ÷ 期待値なので、この図の場合は(B3-B9)^2/B9となります。

そして、他の組み合わせも同じように計算します。
その後、全ての組み合わせを足します。これがχ2値です。

結果、今回のχ2値は4でした。
この値が大きいほど、観測値と期待値のズレが大きくなります。

またしても登場、p値

Excelでのカイ二乗検定のp値の求め方は、

=CHISQ.DIST.RT(χ²値, 自由度)

自由度 = (行数 − 1)×(列数 − 1)

今回の自由度は、2×2のクロス表を使っているため、(2-1)×(2-1)=1です。

p値を計算した結果、0.0455002638963584でした。有意水準の0.05を下回っています。

つまり、観測値と期待値のズレは「たまたま」では片付けられないレベルだったのです。

ただし、カイ二乗検定は観測値と期待値が「ズレていること」は密かに教えてくれますが、「因果関係」までは教えてくれません。
人間関係で言うと、「一緒にいることが多い」≠「付き合っている」です。

そのため、今回は

❌「夜勤が不眠の元凶である」
⭕️「夜勤と不眠の間に統計的に有意な関連が認められた(p < 0.05)」と結論づけます。

カイ二乗検定の前提条件ってあるの?

今回はカイ二乗検定を使用しましたが、実は使うための前提条件があります。

  • 変数がカテゴリ(名義尺度)であること

例:夜勤あり/なし、不眠あり/なしなど

  • 各セルの期待度数が5以上

通常、「すべてのセルが5以上」が推奨されます(特に今回のような2×2表では)
もし期待度数が5未満のセルがある場合は、フィッシャーの正確確率検定(Fisher’s Exact Test)が推奨されます。
カイ二乗検定(χ²検定)は、実際の分布を、理想的な分布(カイ二乗分布)で近似する方法です。
この「近似」が上手くいくには、ある程度データが大きくないといけないのです。

  • 観測値が独立している

例:同じ人が複数回カウントされていない

  • サンプルサイズが十分にある

少なくとも表全体の人数が20人以上推奨

  • ランダムに抽出されたサンプル

理想的には母集団から無作為抽出されたもの

まとめ

「気のせい」と「気のせいじゃない」の境界線を、 ただただ冷静に炙り出す。
それがカイ二乗検定です。

あなたの「気のせい」が本当かどうか、カイ二乗検定に確かめてもらいませんか?

おまけ Pythonを使ったカイ二乗検定

import numpy as np
from scipy.stats import chi2_contingency

# 観測度数(実際のデータ)
# 行:夜勤あり・夜勤なし
# 列:不眠あり・不眠なし
data = np.array([
    [30, 20],  # 夜勤あり
    [20, 30]   # 夜勤なし
])

# カイ二乗検定(Yates補正なし)
chi2, p, dof, expected = chi2_contingency(data, correction=False)

# 結果表示
print("Yates補正なし")
print(f"カイ二乗値: {chi2:.3f}")
print(f"p値: {p:.5f}")
print(f"自由度: {dof}")
print("期待度数:")
print(expected)

# カイ二乗検定(Yates補正あり)
chi2, p, dof, expected = chi2_contingency(data)

# 結果表示
print("Yates補正あり")
print(f"カイ二乗値: {chi2:.3f}")
print(f"p値: {p:.5f}")
print(f"自由度: {dof}")
print("期待度数:")
print(expected)

出力:

Yates補正なし
カイ二乗値: 4.000
p値: 0.04550
自由度: 1
期待度数:
[[25. 25.]
[25. 25.]]

Yates補正あり
カイ二乗値: 3.240
p値: 0.07186
自由度: 1
期待度数:
[[25. 25.]
[25. 25.]]

Yates補正とは?

カイ二乗検定は「連続値で近似」する検定ですが、今回のような2×2表のデータは「離散的(整数)」です。
2×2表の現実のデータは「カクカク」してるのに、無理矢理なめらかな曲線に当てはめて評価しようとしています。
そのため、χ²分布での近似が少し過剰になる(=偽陽性が起きやすい)傾向があります。

そのため、「観測値と期待値の差を少し縮めて調整する」のがYates補正です。
Yates補正がある場合、

(|観測値 – 期待値| – 0.5)^2 / 期待値

でχ²値を求めます。そのため、Yates補正では全体のχ²値が小さくなります

データ数が少ない2×2表では、Yates補正ありを使うのが「保守的で安全」とされます。

ただし、補正が過剰すぎてp値が有意水準を超えてしまうことがあります。

そのため、まずはYates補正ありのカイ二乗検定を行い、フィッシャー検定と一緒に見ることもあります。

今回のExcelを使った分析はYates補正なしですが、PythonのデフォルトはYates補正ありです。


コメントを残す