クロス集計したい(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)などで集計できます。