クロス集計表とは
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
書籍