Rでクロス集計表(table)

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)