今回はRでクロス集計表を作成する方法を紹介します。
使用するデータセット
ggplot2に含まれるdiamondsデータを例として使用します。
中身も確認しておきましょう。
1 2 3 4 5 6 7 8 9 10 |
library(ggplot2) head(diamonds,5) # A tibble: 5 × 10 carat cut color clarity depth table price x y z <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 4 0.29 Premium I VS2 62.4 58 334 4.2 4.23 2.63 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 |
今回はクロス集計を行うため、数値データは扱わず、ダイヤモンドの色の品質を示す「color」と、ダイヤモンドのカットの質を示す「cut」を使用します。
クロス集計
総数のクロス集計
まずは単純集計のクロス表です。
Rでのクロス集計は
table(行, 列) で表現します。
1 2 3 4 5 6 7 8 9 10 |
table(diamonds$color,diamonds$cut) Fair Good Very Good Premium Ideal D 163 662 1513 1603 2834 E 224 933 2400 2337 3903 F 312 909 2164 2331 3826 G 314 871 2299 2924 4884 H 303 702 1824 2360 3115 I 175 522 1204 1428 2093 J 119 307 678 808 896 |
ちなみに、colorはDが最も品質が良く、cutはIdealが最も品質が良いものを示しています。
割合のクロス集計
クロス集計を割合で表記する場合はprop.table()を使用して
prop.table(テーブル) の形で表現します。
「テーブル」の箇所に入るのは先ほど作成したクロス集計表です。
見やすくするために、tblという変数に先ほど作成したクロス集計表を代入して作成してみます。
1 2 3 4 5 6 7 8 9 10 11 |
tbl <- table(diamonds$color,diamonds$cut) prop.table(tbl) Fair Good Very Good Premium Ideal D 0.003021876 0.012272896 0.028049685 0.029718205 0.052539859 E 0.004152762 0.017296997 0.044493882 0.043325918 0.072358176 F 0.005784205 0.016852058 0.040118650 0.043214683 0.070930664 G 0.005821283 0.016147571 0.042621431 0.054208380 0.090545050 H 0.005617353 0.013014461 0.033815350 0.043752317 0.057749351 I 0.003244346 0.009677419 0.022321098 0.026473860 0.038802373 J 0.002206155 0.005691509 0.012569522 0.014979607 0.016611049 |
これで全体に対する割合が0~1で表示されます。
%で表示する場合は100倍しましょう。
1 2 3 4 5 6 7 8 9 10 |
prop.table(tbl)*100 Fair Good Very Good Premium Ideal D 0.3021876 1.2272896 2.8049685 2.9718205 5.2539859 E 0.4152762 1.7296997 4.4493882 4.3325918 7.2358176 F 0.5784205 1.6852058 4.0118650 4.3214683 7.0930664 G 0.5821283 1.6147571 4.2621431 5.4208380 9.0545050 H 0.5617353 1.3014461 3.3815350 4.3752317 5.7749351 I 0.3244346 0.9677419 2.2321098 2.6473860 3.8802373 J 0.2206155 0.5691509 1.2569522 1.4979607 1.6611049 |
さらに、オプションをつけることで、列方向・行方向に対する割合も見ることができます。
行方向…prop.table(テーブル, 1)
列方向…prop.table(テーブル, 2)
まずは行方向(よこ方向)の割合を見てみましょう。
1 2 3 4 5 6 7 8 9 10 |
prop.table(tbl,1)*100 Fair Good Very Good Premium Ideal D 2.405904 9.771218 22.332103 23.660517 41.830258 E 2.286414 9.523323 24.497295 23.854241 39.838726 F 3.269755 9.526305 22.678684 24.428841 40.096416 G 2.780730 7.713425 20.359547 25.894439 43.251860 H 3.648844 8.453757 21.965318 28.420039 37.512042 I 3.227591 9.627444 22.205828 26.337145 38.601992 J 4.237892 10.933048 24.145299 28.774929 31.908832 |
この場合、行方向にすべてを足すと100%になります。
例えば、右上の部分は、colorが「D」の中でcutが「Ideal」の割合は約41.83%という解釈です。
続いて、列方向(たて方向)も同様にやってみます。
1 2 3 4 5 6 7 8 9 10 |
prop.table(tbl,2)*100 Fair Good Very Good Premium Ideal D 10.124224 13.493681 12.522761 11.623523 13.150202 E 13.913043 19.017530 19.864261 16.945834 18.110529 F 19.378882 18.528333 17.910942 16.902328 17.753237 G 19.503106 17.753771 19.028307 21.202233 22.662521 H 18.819876 14.309009 15.096838 17.112610 14.454086 I 10.869565 10.640033 9.965238 10.354579 9.711846 J 7.391304 6.257644 5.611654 5.858893 4.157580 |
今度は列方向に足すと100%になるような割合のクロス集計となりました。
おまけ:割合の表記は桁数を減らして見やすく!
今回はクロス集計表の説明のため、余計な関数は入れませんでしたが、その結果、数字ばかりで見づらかったかと思います。
round関数を組み合わせて桁数を減らすこともできるので、ぜひ使ってみてください。
書き方は
round(クロス集計表, 小数点以下の桁数) です。
小数点以下の桁数は四捨五入で表示されます。
今回の最後に使ったクロス集計表を、小数点以下1桁までの表示に変更してみます。
1 2 3 4 5 6 7 8 9 10 |
round(prop.table(tbl,2)*100,1) Fair Good Very Good Premium Ideal D 10.1 13.5 12.5 11.6 13.2 E 13.9 19.0 19.9 16.9 18.1 F 19.4 18.5 17.9 16.9 17.8 G 19.5 17.8 19.0 21.2 22.7 H 18.8 14.3 15.1 17.1 14.5 I 10.9 10.6 10.0 10.4 9.7 J 7.4 6.3 5.6 5.9 4.2 |
以上、クロス集計表の作り方の紹介でした!
コメント