2変量の関連(2)

2つのカテゴリカル変数を分析する方法をまとめておきます。大きく分けて、母比率に差があるかどうかを調べる方法と、2変数の関連を調べる方法があります。

このページでも、データはすでに読み込んでいるという前提でコードを書いております。

2つのカテゴリカル変数の母比率の比較

2つのカテゴリカル変数の母比率の比較は、prop.test()関数を用いて行います。

prop.test(成功した数のベクトル, 試行した数のベクトル)

例えば、ある試験の合格数で、男性が180人(3000人中)、女性が4人(40人中)となっていたとき、合格率は女性の方が10%と高く、そこに性差別があったのかどうかを調べることができます。

## 2つのカテゴリカル変数の母比率の比較の検定

2つのカテゴリカル変数の母比率の比較する場合に用いられる。

```{r prop}

prop.test(c(180, 4), c(3000, 40))

```

> prop.test(c(180, 4), c(3000, 40))

2-sample test for equality of proportions with
continuity correction

data: c(180, 4) out of c(3000, 40)
X-squared = 0.51864, df = 1, p-value = 0.4714
alternative hypothesis: two.sided
95 percent confidence interval:
-0.14602352 0.06602352
sample estimates:
prop 1 prop 2
0.06 0.10

Warning message: In prop.test(c(180, 4), c(3000, 40)) : カイ自乗近似は不正確かもしれません

結果から、どちらかの性別に有利であったという証拠は存在しなかったと判断できます。ただし、今回の例の女性群のように、少ない標本においては、少しの変化が大きな影響を与えることがあるので、注意が必要だといえます。例えば、「prop.test(c(180, 7), c(3000, 50))」のように、女性の受験者が10人増えて、3人合格すると、すぐに結果が変わってしまいます。

カテゴリカル変数同士の関連

2変数の関連を調べる方法としては、カイ2乗検定が良く用いられます。カイ2乗検定は、xtabs()関数を用いて、クロス表を作成した後、chisq.test()関数を用いて行います。

xtabs(~ 関連を調べる変数 + 関連を調べる変数, data = データフレーム名)
chisq.test(データフレーム名$関連を調べる変数, データフレーム名$関連を調べる変数)
chisq.test(xtabs(~ 関連を調べる変数 + 関連を調べる変数, data = データフレーム名))

たとえば、例で読み込んだデータで男女間で病気の罹患に関連があるかを調べる場合は、下のようなコードになります。

## 2つのカテゴリカル変数の独立性の検定

2つのカテゴリカル変数の関連を調べる。

```{r chisq}

dat$disease = factor(dat$disease)

xt = xtabs(~ disease + sex, data = dat)

chisq.test(xt)

```

> xt = xtabs(~ disease + sex, data = dat)
> xt
     sex
disease  f  m
   0 0 41 34
   1 1 12 12
> chisq.test(xt)

Pearson's Chi-squared test

data: xt
X-squared = 3.1862, df = 2, p-value = 0.2033

警告メッセージ:
chisq.test(xt) で: カイ自乗近似は不正確かもしれません

diseaseは0か1で入っているので、Rは数値として扱ってしまいます。factor()関数を用いて、因子に変更しましょう。結果からは、病気と性別に関連があるとは言えないことがわかります。

Rでは、もちろんフィッシャーの正確な確率検定も用意されています。周辺度数を固定して全ての組み合わせを考えるため、計算量が多くなりますが、最近のコンピュータでは問題にならないので、よほど大きなデータでなければ、こちらの検定を行うべきだと言われています。この検定は、fisher.test()関数を用いますが、使い方はchisq.test()関数と同じです。

## フィッシャーの正確な確率検定

2つのカテゴリカル変数の関連を調べる。

```{r fisher}

fisher.test(xt)

```

> fisher.test(xt)

Fisher's Exact Test for Count Data

data: xt
p-value = 0.3266
alternative hypothesis: two.sided