カテゴリデータ(名義・順序尺度):数値ではなく,グループや分類を表すデータ
| カテゴリデータの例 | 連続データとの違い |
|---|---|
| 性別(男・女) | 平均が計算できない |
| 学部(文・理・医…) | 「文学部の平均」は意味をなさない |
| 回答(はい・いいえ) | 頻度(件数)で分析する |
2つのカテゴリ変数の組み合わせごとの件数を表にしたものです。
「性別と生存率は独立(無関係)か,それとも関連があるか?」
期待度数(H₀が正しいとしたときの理論上の頻度)と観測度数の差から計算します。
\[\chi^2 = \sum \frac{(観測度数 - 期待度数)^2}{期待度数}\]
## Survived
## Sex No Yes
## Male 1364 367
## Female 126 344
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tab
## X-squared = 454.5, df = 1, p-value < 2.2e-16
Pearson's Chi-squared test with Yates' continuity correction
X-squared = 454.5, df = 1, p-value < 2.2e-16
| 項目 | 意味 |
|---|---|
X-squared |
カイ二乗統計量 χ² |
df |
自由度(= (行数-1)×(列数-1)) |
p-value |
p値 |
p < .05 ならば「性別と生存は独立でない」(関連がある)と結論できます。
p値は「統計的に有意かどうか」を示しますが, 「効果の大きさ」は別途,効果量で表します。
\[V = \sqrt{\frac{\chi^2}{n \cdot (k-1)}}\]
(n = 総度数,k = 行数・列数の小さい方)
# 効果量の計算(手動)
chi2 <- chisq.test(tab)$statistic
n <- sum(tab)
k <- min(nrow(tab), ncol(tab))
V <- sqrt(chi2 / (n * (k - 1)))
round(V, 3)## X-squared
## 0.454
| V の値 | 効果の大きさ |
|---|---|
| 0.1〜0.3 | 小 |
| 0.3〜0.5 | 中 |
| 0.5〜 | 大 |
titanic_pct <- titanic_summary |>
group_by(Sex) |>
mutate(pct = Freq / sum(Freq) * 100)
ggplot(titanic_pct, aes(x = Sex, y = pct, fill = Survived)) +
geom_col() +
scale_fill_manual(values = c("No" = "#E74C3C", "Yes" = "#2ECC71"),
labels = c("No" = "死亡", "Yes" = "生存")) +
labs(title = "タイタニック:性別と生存率",
x = "性別", y = "割合(%)", fill = "生存") +
theme_bw()論文・レポートでの記述例:
性別と生存の独立性を検定するためにカイ二乗検定を実施した。 その結果,性別と生存の間には有意な関連が認められた, χ²(1, N = 2201) = 454.5, p < .001, V = .45。
mtcars
データを使って,シリンダー数(cyl)とトランスミッション(am)の
クロス集計表を作成してください。
演習1のクロス集計表を使って,カイ二乗検定を実施し,結果を解釈してください。
chisq.test() を実行するmtcars の cyl(シリンダー数)と
am(0=オートマ, 1=マニュアル)の
関係を積み上げ棒グラフで表現してください。
mtcars |>
mutate(
am = factor(am, labels = c("オートマ", "マニュアル")),
cyl = factor(cyl, labels = c("4気筒", "6気筒", "8気筒"))
) |>
group_by(cyl, am) |>
summarise(n = n(), .groups = "drop") |>
group_by(cyl) |>
mutate(pct = n / sum(n) * 100) |>
ggplot(aes(x = cyl, y = pct, fill = am)) +
geom_col() +
labs(title = "シリンダー数とトランスミッションの関係",
x = "シリンダー数", y = "割合(%)", fill = "トランスミッション") +
theme_bw()table() / xtabs()
でクロス集計表を作成chisq.test() で独立性を検定