カテゴリカルデータの解析 (その1)
カテゴリカルデータの解析
「アンケート」などに代表されるカテゴリカルデータの解析法についてざっとまとめました.Kashiwa.R#3で発表する内容を文章にしたものです.
内容のほぼすべては,『カテゴリカルデータ解析 (Rで学ぶデータサイエンス 1)』 藤井良宜 2010年 共立出版 を大いに参考にしています.
要約
- xtab()で集計
- 変数間の関係性を調べるいろいろな方法がある
- みかけ上の相関に注意
カテゴリカルデータとは?
連続変数ではなくて,グループで分類されるような変数をもつデータです.「アンケート」が良い例.グループには,順序グループ (例: なし,軽度,重度) と名義グループ (例: 男性,女性,その他) の2種類があります.
ここでは,データの項目のひとつを「変数」と呼び (例: 症状,性別),項目に含まれる分類を「カテゴリー」と呼びます (例: {なし,軽度,重度},{男性,女性,その他}).
データをR上に載せるまで
省略します….read.table()関数を使ったり,直にデータフレームを打ち込んだりしてみてください.
個票データと集計データ
個票データ
個票データはひとつひとつの個体情報のリストです.たとえば,vcdパッケージに含まれるArthritis.これは,関節炎に関する臨床試験のデータで,84人の患者さんひとりひとりの情報が行ごとに記録されているようです.
> install.packages("vcd")
> library(vcd)
> head(Arthritis)
ID Treatment Sex Age Improved
1 57 Treated Male 27 Some
2 46 Treated Male 29 None
3 77 Treated Male 30 None
4 17 Treated Male 32 Marked
5 36 Treated Male 46 Marked
6 23 Treated Male 58 Marked
個票データの場合,summary()でそれぞれの変数の概要を知ることができます.
> summary(Arthritis)
ID Treatment Sex Age Improved
Min. : 1.00 Placebo:43 Female:59 Min. :23.00 None :42
1st Qu.:21.75 Treated:41 Male :25 1st Qu.:46.00 Some :14
Median :42.50 Median :57.00 Marked:28
Mean :42.50 Mean :53.36
3rd Qu.:63.25 3rd Qu.:63.00
Max. :84.00 Max. :74.00
集計データ
集計データは,ひとつひとつの個体情報の集計結果です.同じくvcdパッケージに含まれるDanishWelfareがこれ.アルコール消費量,収入,婚姻状況,住居の情報について,それぞれの変数のそれぞれのカテゴリーの組み合わせごとに,頻度が記録されています.
> head(DanishWelfare) Freq Alcohol Income Status Urban 1 1 <1 0-50 Widow Copenhagen 2 4 <1 0-50 Widow SubCopenhagen 3 1 <1 0-50 Widow LargeCity 4 8 <1 0-50 Widow City 5 6 <1 0-50 Widow Country 6 14 <1 0-50 Married Copenhagen
集計データの場合は,単にsummary()を適用しても意味がありません.
どちらにしてもxtab()
それではどうするかというと,個票データでも集計データでも,まずはxtab()を適用します.xtab()を使うことで,ひとつ以上の変数について,各カテゴリーの組み合わせごとの度数を表す表形式のデータ (クロス表) が得られます.> # Arthritisで,処置 (Treatment) と病状がどれだけ改善したか (Improved) の
> # カテゴリーの組み合わせごとの頻度.
> (arthritis.imp.tre <- xtabs(~ Improved + Treatment, data = Arthritis))
Treatment
Improved Placebo Treated
None 29 13
Some 7 7
Marked 7 21
> # DanishWalfareで,アルコール消費量 (Alcohol) と収入 (Income) の
> # カテゴリーの組み合わせごとの頻度.
> (danish.alc.inc <- xtabs(Freq ~ Alcohol + Income, data = DanishWelfare))
Income
Alcohol 0-50 50-100 100-150 >150
<1 382 748 273 936
1-2 150 567 437 929
>2 34 161 144 383個票データではデータのカウント数を指定しないのに対し,集計データでは頻度 (Freq) を指定しているのに注意してください.
なんとも簡単に集計作業ができてしまいます:)
度数でなく割合を見たいときにはprop.table()関数を使います.
marginで,何に対する割合にするかを指定します.
> round(prop.table(arthritis.imp.tre, margin = 2), 2)
Treatment
Improved Placebo Treated
None 0.67 0.32
Some 0.16 0.17
Marked 0.16 0.51
> # アルコール摂取量 (Alcohol) ごとのそれぞれの収入状況 (Income) の割合
> round(prop.table(danish.alc.inc, margin = 1), 2)
Income
Alcohol 0-50 50-100 100-150 >150
<1 0.16 0.32 0.12 0.40
1-2 0.07 0.27 0.21 0.45
>2 0.05 0.22 0.20 0.53
xtabs()を用いた操作をマスターすれば,カテゴリカルデータを解析する作業が非常に楽になります.
table()関数でも同じことができるようですが,ここでは省略してしまいます:(
その2 につづく