クロス集計表の作成(pythonコードあり)

クロス集計表とは

2つのカテゴリーに属するデータをそれぞれのカテゴリーで分類、集計した表のこと。
行、列にそれぞれのカテゴリーを記入し、各カテゴリが交わるセルにカウントデータを記入する。

クロス集計表の作成方法

次のような各生徒の性別所属する部活のデータがあったとする。

このデータを用いてクロス集計表を作成すると次のようになる。

例えば、男子かつサッカー部に所属している生徒は2人いるため、クロス集計表で男子の行サッカーの列が交わるセルの中は2となる。

行比率, 列比率, セル比率とは

各カテゴリ(列や行)の方向の合計や全体の合計を100%とみなした時の各セルの割合のこと。
(事象の起こりやすさを求める際に、分析の目的に応じて求められる)

  • 行比率:行ごとの合計数を100にした場合の比率(もしくは百分率)
  • 列比率:列ごとの合計数を100にした場合の比率(もしくは百分率)
  • セル比率:全体の合計数を100にした場合の比率(もしくは百分率)

行比率

(行ごとの合計数を100にした場合の比率)
それぞれのセルの値を以下の式で計算する。
$$\frac{それぞれのセルの値}{そのセルがある行の合計値}\times 100$$

例えば男子全体のうち、男子でサッカー部に所属する生徒の割合は、
$$ 2/7=28.6\% $$

となる。

列比率

(列ごとの合計数を100にした場合の比率)
それぞれのセルの値を以下の式で計算する。

$$\frac{それぞれのセルの値}{そのセルがある列の合計値}\times 100$$

例えばサッカー部に所属する生徒のうち男子の割合は、
$$ 2/4=50\% $$

となる。

セル比率

(全体の合計数を100にした場合の比率)

$$\frac{それぞれのセルの値}{総数}\times 100$$

例えば生徒全体のうち、サッカー部に所属する男子生徒の割合は、
$$ 2/12=16.7\% $$

Pythonでのクロス集計表の作成

Pythonでは pandas.crosstab()関数を使うことでクロス集計分析ができる。

kaggleのタイタニックのデータを使用して、乗客の生存 or 死亡(0 or 1)と、性別の2つのカテゴリでクロス集計表を作成してみる。

import pandas as pd
df = pd.read_csv(r'titanic/train.csv', index_col=0)
df.drop(['Name', 'Ticket', 'SibSp', 'Parch','Pclass','Age','Fare','Cabin','Embarked'], axis=1, inplace=True)

クロス集計表の作成

# crosstabを使ってクロス集計表を作成する。
# 第1引数に行見出し、第2引数に列見出しを指定する。
# margins=Trueとすることで合計値を算出できる。
df_cross = pd.crosstab(df['Survived'], df['Sex'], margins=True)
print(df_cross)
"""output
    Sex       female  male  All
    Survived                   
    0             81   468  549
    1            233   109  342
    All          314   577  891
"""

行比率, 列比率, セル比率の計算

引数normalizeで指定できる。
※ 合計値は100ではなく1になっていることに注意。また、指定した行、列の合計比率(1)は省略されている。

# normalize='index' とすることで行比率を計算できる。
df_cross_index = pd.crosstab(df['Survived'], df['Sex'], margins=True, normalize='index')
print(df_cross_index)
"""output
       Sex         female      male
    Survived                    
    0         0.147541  0.852459
    1         0.681287  0.318713
    All       0.352413  0.647587
"""

# normalize='columns' とすることで行比率を計算できる。
df_cross_columns = pd.crosstab(df['Survived'], df['Sex'], margins=True, normalize='columns')
print(df_cross_columns)
"""output
    Sex         female      male       All
    Survived                              
    0         0.257962  0.811092  0.616162
    1         0.742038  0.188908  0.383838
"""

# normalize='all' とすることでセル比率比率を計算できる。
df_cross_all = pd.crosstab(df['Survived'], df['Sex'], margins=True, normalize='all')
print(df_cross_all)
"""output
    Sex         female      male       All
    Survived                              
    0         0.090909  0.525253  0.616162
    1         0.261504  0.122334  0.383838
    All       0.352413  0.647587  1.000000
"""

参考

HP

書籍




udemy講座

【はじめての統計学】
エクセルで学ぶマーケティング統計分析&戦略