crosstable

Author

データサイエンス関連基礎調査WG

Published

August 1, 2025

パッケージの概要

crosstableは、クロス集計表を作成するためのツールです。複数の変数に基づいてデータを集計し、頻度等を表示します。このパッケージを使用すると、変数間の関係を簡単に分析でき、データの要約を視覚化することができます。

使用するデータ

クロス集計表を作成するにあたり、ここでは当パッケージに含まれるデータセットのmtcars2を使用するものとします。mtcars2はR標準のデータセットであるmtcarsに対して次の修正を加えたデータセットです。なお、mtcarsは1974年に発行されたMotor Trend US Magazineに基づき32台の異なる自動車についての情報を収めたものです。

  • 各列にラベル(説明)を追加
  • rownamesを新たな列「model」としてデータフレームの一部にする
  • gear(ギア数)と cyl(シリンダー数)をカテゴリカル変数として扱う
  • vs(エンジンの種類)とam(トランスミッション)を文字列型に変換し、カテゴリデータとして扱う
head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
head(mtcars2)
# A tibble: 6 × 14
  model        mpg   cyl   disp  hp    drat  wt    qsec  vs    am    gear  carb 
  <labelled>   <lab> <fct> <lab> <lab> <lab> <lab> <lab> <lab> <lab> <fct> <lab>
1 Mazda RX4    21.0  6     160   110   3.90  2.620 16.46 vsha… manu… 4     4    
2 Mazda RX4 W… 21.0  6     160   110   3.90  2.875 17.02 vsha… manu… 4     4    
3 Datsun 710   22.8  4     108    93   3.85  2.320 18.61 stra… manu… 4     1    
4 Hornet 4 Dr… 21.4  6     258   110   3.08  3.215 19.44 stra… auto  3     1    
5 Hornet Spor… 18.7  8     360   175   3.15  3.440 17.02 vsha… auto  3     2    
6 Valiant      18.1  6     225   105   2.76  3.460 20.22 stra… auto  3     1    
# ℹ 2 more variables: hp_date <date>, qsec_posix <dttm>

クロス集計表の作成

まずはcrosstable関数に他の引数を何も設定せずにmtcars2をそのまま入れてみます。このままではよくわかりません。

crosstable(mtcars2)
# A tibble: 78 × 4
   .id   label variable           value    
   <chr> <chr> <chr>              <chr>    
 1 model Model AMC Javelin        1 (3.12%)
 2 model Model Cadillac Fleetwood 1 (3.12%)
 3 model Model Camaro Z28         1 (3.12%)
 4 model Model Chrysler Imperial  1 (3.12%)
 5 model Model Datsun 710         1 (3.12%)
 6 model Model Dodge Challenger   1 (3.12%)
 7 model Model Duster 360         1 (3.12%)
 8 model Model Ferrari Dino       1 (3.12%)
 9 model Model Fiat 128           1 (3.12%)
10 model Model Fiat X1-9          1 (3.12%)
# ℹ 68 more rows

次に、wt(車の重量)とcyl(シリンダー数)について、vs(エンジンの種類)ごとに集計してみます。なお、vs(エンジンの種類)はstraight(直列エンジン)とvshaped(V型エンジン)の2通りです。

crosstable(mtcars2, c(wt, cyl), by=vs)
# A tibble: 7 × 5
  .id   label               variable   straight      vshaped      
  <chr> <chr>               <chr>      <chr>         <chr>        
1 wt    Weight (1000 lbs)   Min / Max  1.5 / 3.5     2.1 / 5.4    
2 wt    Weight (1000 lbs)   Med [IQR]  2.6 [2.0;3.2] 3.6 [3.2;3.8]
3 wt    Weight (1000 lbs)   Mean (std) 2.6 (0.7)     3.7 (0.9)    
4 wt    Weight (1000 lbs)   N (NA)     14 (0)        18 (0)       
5 cyl   Number of cylinders 4          10 (90.91%)   1 (9.09%)    
6 cyl   Number of cylinders 6          4 (57.14%)    3 (42.86%)   
7 cyl   Number of cylinders 8          0 (0%)        14 (100.00%) 

なお、as_flextable関数を使うと、クロス集計表がflextableオブジェクトに変換され、整った見やすい表になります。

crosstable(mtcars2, c(wt, cyl), by=vs) %>% as_flextable()

label

variable

Engine

straight

vshaped

Weight (1000 lbs)

Min / Max

1.5 / 3.5

2.1 / 5.4

Med [IQR]

2.6 [2.0;3.2]

3.6 [3.2;3.8]

Mean (std)

2.6 (0.7)

3.7 (0.9)

N (NA)

14 (0)

18 (0)

Number of cylinders

4

10 (90.91%)

1 (9.09%)

6

4 (57.14%)

3 (42.86%)

8

0 (0%)

14 (100.00%)

出力された集計表から、wt(車の重量)について次のことがわかります。vshapedはstraightよりも重い車が多く、またばらつきが大きいようです。

  • Min / Max:
    • straight:車の重さは1.5〜3.5千ポンド
    • vshaped: 車の重さは2.1〜5.4千ポンド
  • Med [IQR](中央値と四分位範囲):
    • straight:中央値は2.6千ポンド、四分位範囲は[2.0, 3.2]千ポンド
    • vshaped:中央値は3.6千ポンド、四分位範囲は[3.2, 3.8]千ポンド
  • Mean(std)(平均値と標準偏差):
    • straight:平均値は2.6千ポンド、標準偏差は0.7千ポンド
    • vshaped:平均値は3.7千ポンド、標準偏差は0.9千ポンド
  • N(NA)(データ数と欠損値数):
    • straight: データ数は14件、欠損値は0
    • vshaped: データ数は18件、欠損値は0

また、cyl(シリンダー数)については次のことがわかります。straightでは4シリンダーの車が多い一方で、vshapedでは8シリンダーの車がほとんどです。

  • 4シリンダー車:
    • straight: 10台(90.91%)
    • vshaped: 1台(9.09%)
  • 6シリンダー車:
    • straight: 4台(57.14%)
    • vshaped: 3台(42.86%)
  • 8シリンダー車:
    • straight: 0台(0%)
    • vshaped: 14台(100%)

次に、vs(エンジンの種類)に加えてam(トランスミッション)により分割します。margin=c(“row”, “col”)により行方向、列方向それぞれによる各頻度の占率を出力します。total = “both”により合計行、合計列の両方が追加されます。

crosstable(mtcars2, c(wt, cyl), by=c(am, vs),
           margin=c("row", "col"), total = "both") %>% as_flextable()

Engine

straight

vshaped

Total

Transmission

auto

manual

auto

manual

Weight (1000 lbs)

Min / Max

2.5 / 3.5

1.5 / 2.8

3.4 / 5.4

2.1 / 3.6

1.5 / 5.4

Med [IQR]

3.2 [3.2;3.4]

1.9 [1.7;2.3]

3.8 [3.6;4.4]

2.8 [2.7;3.1]

3.3 [2.6;3.6]

Mean (std)

3.2 (0.3)

2.0 (0.4)

4.1 (0.8)

2.9 (0.5)

3.2 (1.0)

N (NA)

7 (0)

7 (0)

12 (0)

6 (0)

32 (0)

Number of cylinders

4

3 (42.86% / 27.27%)

7 (100.00% / 63.64%)

0 (0% / 0%)

1 (16.67% / 9.09%)

11 (34.38%)

6

4 (57.14% / 57.14%)

0 (0% / 0%)

0 (0% / 0%)

3 (50.00% / 42.86%)

7 (21.88%)

8

0 (0% / 0%)

0 (0% / 0%)

12 (100.00% / 85.71%)

2 (33.33% / 14.29%)

14 (43.75%)

Total

7 (21.88%)

7 (21.88%)

12 (37.50%)

6 (18.75%)

32 (100.00%)

最後に、引数effectをTRUEに設定することで、効果推定を出力することもできます。

crosstable(mtcars2, where(is.numeric), by=vs, effect=TRUE) %>% as_flextable()

label

variable

Engine

effect

straight

vshaped

Miles/(US) gallon

Min / Max

17.8 / 33.9

10.4 / 26.0

Difference in means (t-test CI), ref='straight'
vshaped minus straight: -7.94 [-11.27 to -4.61]

Med [IQR]

22.8 [21.4;29.6]

15.6 [14.8;19.1]

Mean (std)

24.6 (5.4)

16.6 (3.9)

N (NA)

14 (0)

18 (0)

Displacement (cu.in.)

Min / Max

71.1 / 258.0

120.3 / 472.0

Difference in means (Welch CI), ref='straight'
vshaped minus straight: 174.69 [114.36 to 235.02]

Med [IQR]

120.5 [83.0;162.4]

311.0 [275.8;360.0]

Mean (std)

132.5 (56.9)

307.1 (106.8)

N (NA)

14 (0)

18 (0)

Gross horsepower

Min / Max

52.0 / 123.0

91.0 / 335.0

Difference in means (Welch CI), ref='straight'
vshaped minus straight: 98.37 [66.06 to 130.67]

Med [IQR]

96.0 [66.0;109.8]

180.0 [156.2;226.2]

Mean (std)

91.4 (24.4)

189.7 (60.3)

N (NA)

14 (0)

18 (0)

Rear axle ratio

Min / Max

2.8 / 4.9

2.8 / 4.4

Difference in means (bootstrap CI), ref='straight'
vshaped minus straight: -0.47 [-0.80 to -0.13]

Med [IQR]

3.9 [3.7;4.1]

3.2 [3.1;3.7]

Mean (std)

3.9 (0.5)

3.4 (0.5)

N (NA)

14 (0)

18 (0)

Weight (1000 lbs)

Min / Max

1.5 / 3.5

2.1 / 5.4

Difference in means (t-test CI), ref='straight'
vshaped minus straight: 1.08 [0.48 to 1.68]

Med [IQR]

2.6 [2.0;3.2]

3.6 [3.2;3.8]

Mean (std)

2.6 (0.7)

3.7 (0.9)

N (NA)

14 (0)

18 (0)

1/4 mile time

Min / Max

16.9 / 22.9

14.5 / 18.0

Difference in means (t-test CI), ref='straight'
vshaped minus straight: -2.64 [-3.52 to -1.76]

Med [IQR]

19.2 [18.6;20.0]

17.0 [16.0;17.4]

Mean (std)

19.3 (1.4)

16.7 (1.1)

N (NA)

14 (0)

18 (0)

Number of carburetors

Min / Max

1.0 / 4.0

2.0 / 8.0

Difference in means (bootstrap CI), ref='straight'
vshaped minus straight: 1.83 [0.93 to 2.72]

Med [IQR]

1.5 [1.0;2.0]

4.0 [2.2;4.0]

Mean (std)

1.8 (1.1)

3.6 (1.5)

N (NA)

14 (0)

18 (0)