Chapter 3 二元クロス集計表の処理

3.1 周辺度数の追加

すでに見た夫婦の学歴組み合わせのクロス集計表には行方向・列方向ともに周辺度数(marginal frequency)がついていない。これはxtabs()table()などの関数を用いて個票データからクロス集計表を作成した場合も同様である。クロス集計表に周辺度数を追加するためにはaddmargins()を用いる。

# 行周辺度数
addmargins(EduWH1980, margin = 1)
##        EduH
## EduW          JHS         HS      VC/JC        UNI
##   JHS   1825957.2  692306.05  25961.477   43269.13
##   HS     744229.0 3106723.41 164422.687  856728.74
##   VC/JC   34615.3  207691.82  69230.605  493268.06
##   UNI         0.0   25961.48   8653.826  337499.20
##   Sum   2604801.5 4032682.75 268268.595 1730765.13
# 列周辺度数
addmargins(EduWH1980, margin = 2)
##        EduH
## EduW          JHS         HS      VC/JC       UNI       Sum
##   JHS   1825957.2  692306.05  25961.477  43269.13 2587493.9
##   HS     744229.0 3106723.41 164422.687 856728.74 4872103.8
##   VC/JC   34615.3  207691.82  69230.605 493268.06  804805.8
##   UNI         0.0   25961.48   8653.826 337499.20  372114.5
# 行/列周辺度数
addmargins(EduWH1980, margin = c(1,2))
##        EduH
## EduW          JHS         HS      VC/JC        UNI       Sum
##   JHS   1825957.2  692306.05  25961.477   43269.13 2587493.9
##   HS     744229.0 3106723.41 164422.687  856728.74 4872103.8
##   VC/JC   34615.3  207691.82  69230.605  493268.06  804805.8
##   UNI         0.0   25961.48   8653.826  337499.20  372114.5
##   Sum   2604801.5 4032682.75 268268.595 1730765.13 8636518.0

3.2 比率(proportion)の算出

クロス集計表の分析においておそらく最も頻繁に行うのが比率(proportion)の計算である。Rにはこれを可能にする数多くのパッケージおよび関数が存在するが、以下ではbaseに組み込まれているproportions()、およびRcmdrMiscパッケージのrowPercents()colPercents()を紹介する。

3.2.1 proportions()

この関数はmarginという引数を持ち、1は行方向、2は列方向にそれぞれ算出した「比率」を返す。

proportions(EduWH1980, margin = 1) * 100 # 行パーセント
##        EduH
## EduW          JHS        HS    VC/JC       UNI
##   JHS   70.568562 26.755853 1.003344  1.672241
##   HS    15.275311 63.765542 3.374778 17.584369
##   VC/JC  4.301075 25.806452 8.602151 61.290323
##   UNI    0.000000  6.976744 2.325581 90.697674
proportions(EduWH1980, margin = 2) * 100 # 列パーセント
##        EduH
## EduW          JHS         HS     VC/JC  UNI
##   JHS   70.099668 17.1673820  9.677419  2.5
##   HS    28.571429 77.0386266 61.290323 49.5
##   VC/JC  1.328904  5.1502146 25.806452 28.5
##   UNI    0.000000  0.6437768  3.225806 19.5
# 有効桁数を減らしたい場合は"round"で丸めるとよい
round(proportions(EduWH1980, margin = 1) * 100, digits = 1) # "digits = "は省略してもよい
##        EduH
## EduW     JHS   HS VC/JC  UNI
##   JHS   70.6 26.8   1.0  1.7
##   HS    15.3 63.8   3.4 17.6
##   VC/JC  4.3 25.8   8.6 61.3
##   UNI    0.0  7.0   2.3 90.7

tableの次元に名前がついている場合、marginには次元名を指定することもできる

proportions(EduWH1980, margin = "EduW")
##        EduH
## EduW           JHS         HS      VC/JC        UNI
##   JHS   0.70568562 0.26755853 0.01003344 0.01672241
##   HS    0.15275311 0.63765542 0.03374778 0.17584369
##   VC/JC 0.04301075 0.25806452 0.08602151 0.61290323
##   UNI   0.00000000 0.06976744 0.02325581 0.90697674
proportions(EduWH1980, margin = "EduH")
##        EduH
## EduW           JHS          HS      VC/JC   UNI
##   JHS   0.70099668 0.171673820 0.09677419 0.025
##   HS    0.28571429 0.770386266 0.61290323 0.495
##   VC/JC 0.01328904 0.051502146 0.25806452 0.285
##   UNI   0.00000000 0.006437768 0.03225806 0.195

周辺度数をつけてからproportions()に引き渡せば行全体あるいは列全体の変数の分布を算出できる。

EduWH1980_wRMar <- addmargins(EduWH1980, margin = 1)  # w/ row margins
round(proportions(EduWH1980_wRMar, margin = 1) * 100, digits = 1)
##        EduH
## EduW     JHS   HS VC/JC  UNI
##   JHS   70.6 26.8   1.0  1.7
##   HS    15.3 63.8   3.4 17.6
##   VC/JC  4.3 25.8   8.6 61.3
##   UNI    0.0  7.0   2.3 90.7
##   Sum   30.2 46.7   3.1 20.0
EduWH1980_wCMar <- addmargins(EduWH1980, margin = 2)  # w/ column margins
round(proportions(EduWH1980_wCMar, margin = 2) * 100, digits = 1)
##        EduH
## EduW     JHS   HS VC/JC  UNI  Sum
##   JHS   70.1 17.2   9.7  2.5 30.0
##   HS    28.6 77.0  61.3 49.5 56.4
##   VC/JC  1.3  5.2  25.8 28.5  9.3
##   UNI    0.0  0.6   3.2 19.5  4.3

3.2.2 rowPercents()colPercents()

RcmdrMiscパッケージのrowPercents()colPercents()を使っても行パーセントや列パーセントを算出できる。proportions()と比較した際のこれらの関数の便利な点は、デフォルトで周辺度数を出力結果に返してくれることである。

library(RcmdrMisc)
rowPercents(EduWH1980, digits = 1)
##        EduH
## EduW     JHS   HS VC/JC  UNI Total     Count
##   JHS   70.6 26.8   1.0  1.7 100.1 2587493.9
##   HS    15.3 63.8   3.4 17.6 100.1 4872103.8
##   VC/JC  4.3 25.8   8.6 61.3 100.0  804805.8
##   UNI    0.0  7.0   2.3 90.7 100.0  372114.5
colPercents(EduWH1980, digits = 1)
##        EduH
## EduW          JHS        HS    VC/JC       UNI
##   JHS        70.1      17.2      9.7       2.5
##   HS         28.6      77.0     61.3      49.5
##   VC/JC       1.3       5.2     25.8      28.5
##   UNI         0.0       0.6      3.2      19.5
##   Total     100.0     100.0    100.0     100.0
##   Count 2604801.5 4032682.8 268268.6 1730765.1