Rのbaseパッケージにあるtable関数を使ったクロス集計表の作り方です。実数表や件数表、GT表といった様々な呼び方をされているカテゴリ別の件数表も紹介します。クロス集計表はカテゴリカルデータを分析に役立ちます。
データ準備
以下のデータを活用してサンプルを作っていきます。
d <- read.csv('https://raw.githubusercontent.com/maruko-rosso/datasciencehenomiti/master/data/ShopSales.csv',header = T)
head(d)
## itemA itemB itemC itemD itemE itemF itemG itemH itemI
## Dawn 29 27 15 40 41 22 19 2 0
## Donna 13 33 5 25 45 26 11 0 3
## Hank 7 11 9 3 12 7 3 0 1
## Kory 21 17 2 29 43 26 8 2 1
## Rachel 216 290 93 238 285 227 90 12 9
## Richard 32 35 10 32 43 28 13 3 1
## Rose 9 11 2 12 12 10 5 0 0
件数表作成
table(d$staff)
## Dawn Donna Hank Kory Rachel Richard Rose
## 195 161 53 149 1460 197 61
クロス集計表(件数)
table(d$staff, d$item)
## itemA itemB itemC itemD itemE itemF itemG itemH itemI
## Dawn 29 27 15 40 41 22 19 2 0
## Donna 13 33 5 25 45 26 11 0 3
## Hank 7 11 9 3 12 7 3 0 1
## Kory 21 17 2 29 43 26 8 2 1
## Rachel 216 290 93 238 285 227 90 12 9
## Richard 32 35 10 32 43 28 13 3 1
## Rose 9 11 2 12 12 10 5 0 0
クロス集計表(横%、縦%)
d_cross <- table(d$staff,d$item) # 表作成
prop.table(d_cross,margin = 1) # 横%
## itemA itemB itemC itemD itemE
## Dawn 0.148717949 0.138461538 0.076923077 0.205128205 0.210256410
## Donna 0.080745342 0.204968944 0.031055901 0.155279503 0.279503106
## Hank 0.132075472 0.207547170 0.169811321 0.056603774 0.226415094
## Kory 0.140939597 0.114093960 0.013422819 0.194630872 0.288590604
## Rachel 0.147945205 0.198630137 0.063698630 0.163013699 0.195205479
## Richard 0.162436548 0.177664975 0.050761421 0.162436548 0.218274112
## Rose 0.147540984 0.180327869 0.032786885 0.196721311 0.196721311
## itemF itemG itemH itemI
## Dawn 0.112820513 0.097435897 0.010256410 0.000000000
## Donna 0.161490683 0.068322981 0.000000000 0.018633540
## Hank 0.132075472 0.056603774 0.000000000 0.018867925
## Kory 0.174496644 0.053691275 0.013422819 0.006711409
## Rachel 0.155479452 0.061643836 0.008219178 0.006164384
## Richard 0.142131980 0.065989848 0.015228426 0.005076142
## Rose 0.163934426 0.081967213 0.000000000 0.000000000
prop.table(d_cross,margin = 2) # 縦%
## itemA itemB itemC itemD itemE
## Dawn 0.088685015 0.063679245 0.110294118 0.105540897 0.085239085
## Donna 0.039755352 0.077830189 0.036764706 0.065963061 0.093555094
## Hank 0.021406728 0.025943396 0.066176471 0.007915567 0.024948025
## Kory 0.064220183 0.040094340 0.014705882 0.076517150 0.089397089
## Rachel 0.660550459 0.683962264 0.683823529 0.627968338 0.592515593
## Richard 0.097859327 0.082547170 0.073529412 0.084432718 0.089397089
## Rose 0.027522936 0.025943396 0.014705882 0.031662269 0.024948025
## itemF itemG itemH itemI
## Dawn 0.063583815 0.127516779 0.105263158 0.000000000
## Donna 0.075144509 0.073825503 0.000000000 0.200000000
## Hank 0.020231214 0.020134228 0.000000000 0.066666667
## Kory 0.075144509 0.053691275 0.105263158 0.066666667
## Rachel 0.656069364 0.604026846 0.631578947 0.600000000
## Richard 0.080924855 0.087248322 0.157894737 0.066666667
## Rose 0.028901734 0.033557047 0.000000000 0.000000000
クロス集計表(比率)の四捨五入
round関数を使います。桁数は以下の数値を変更してください。
d_cross_prob <- prop.table(d_cross,margin = 1) # 縦%
d_cross_prob_02 <- round(d_cross_prob,2)
## itemA itemB itemC itemD itemE itemF itemG itemH itemI
## Dawn 0.15 0.14 0.08 0.21 0.21 0.11 0.10 0.01 0.00
## Donna 0.08 0.20 0.03 0.16 0.28 0.16 0.07 0.00 0.02
## Hank 0.13 0.21 0.17 0.06 0.23 0.13 0.06 0.00 0.02
## Kory 0.14 0.11 0.01 0.19 0.29 0.17 0.05 0.01 0.01
## Rachel 0.15 0.20 0.06 0.16 0.20 0.16 0.06 0.01 0.01
## Richard 0.16 0.18 0.05 0.16 0.22 0.14 0.07 0.02 0.01
## Rose 0.15 0.18 0.03 0.20 0.20 0.16 0.08 0.00 0.00
クロス集計表のデータフレームへ変換
table関数のままだとRの値オブジェクトとして認識されます。このクロス集計表をデータフレームとして認識するには以下のようにします。注意点として縦持ちのクロス集計表に変換されますので必要に応じてspread関数で横持ちに直して活用するようにしてください。
df <- as.data.frame(d_cross_prob)