クロス集計したい(pandas.crosstab
)
1pd.crosstab(data["カラムA"], data["カラムB"])
pd.crosstab
で使ってクロス集計できます。
クロス集計すると、指定した2つのカテゴリカルデータ(離散変数)の頻度を確認できます。
トップレベルのメソッドなので、引数にはデータフレーム(というかpd.Series
)を指定します。
デフォルトでdropna=True
となっていて、すべての値がNaNのカラムは除外されます。
1table = pd.crosstab(data["q01"], data["q02"])
2
3print(table)
4q02 Male Female
5q01
620s 67 35
730s 52 34
840s 26 11
950s 25 5
1060s 16 3
1170s 5 0
1280s 2 0
上記はアンケート結果を集計したときのサンプルです。
回答者の年代(q01
)と性別(q02
)で集計しています。
注釈
pd.crosstab
で得られたデータフレームの並びを確認すると、
行方向がq02
、列方向がq01
となっています。
与えた引数の順番と逆になるので、クロス集計結果からヒートマップにする時は転置(.T
)する必要があります。
小計したい(margins
/ margins_name
)
1pd.crosstab(data["カラムA"], data["カラムB"], margins=True)
2pd.crosstab(data["カラムA"], data["カラムB"], margins=True, margins_name="小計")
列と行の末尾にそれぞれの小計を追加できます。
margins_name
で小計したカラムの名前を設定できます。デフォルトはAll
です。
人間が確認するためのデータの場合、追加しておくとよいと思います。
規格化したい(normalize
)
1pd.crosstab(data["カラムA"], data["カラムB"], normalize=True)
2
3# 行ごとの小計で規格化
4pd.crosstab(data["カラムA"], data["カラムB"], normalize="index")
5
6# 列ごとの小計で規格化
7pd.crosstab(data["カラムA"], data["カラムB"], normalize="columns")
全体の合計値でクロス集計表を規格化できます。
また、列ごとの小計(columns
)もしくは行ごとの小計(index
)でも規格化できます。
規格化したい基準が合っているかどうかはmargins=True
オプションで確認できます。
平均値したい(aggfunc
)
1# カラムA: 離散変数
2# カラムB: 離散変数
3# カラムC: 連続変数(数値)
4pd.crosstab(data["カラムA"], data["カラムB"], values=data["カラムC"], aggfunc="mean")
数値型のデータを集計したい場合は、values
とaggfunc
をセットで指定します。
平均値の他に、合計値(sum
)/最大値(max
)/中央値(median
)/最小値(min
)などで集計できます。