PythonのPandasライブラリにおけるクロス集計(クロス集計表、交差表、Cross Tabulation)は、カテゴリデータの集計や相関分析を行ううえで非常に強力なツールです。
特にpd.crosstab()
関数を使うことで、複数のカテゴリ変数の組み合わせごとの頻度や集計統計を簡単に確認できます。
目次
クロス集計とは?
クロス集計とは、2つ以上のカテゴリ変数(例えば「性別」と「購入有無」など)の組み合わせに対して、その頻度や合計値・平均値などを表形式で集計する手法です。
マーケティング、アンケート分析、売上分析、ログ分析などで頻繁に用いられます。
pandas.crosstab()
の基本構文
pd.crosstab(index, columns, values=None, aggfunc=None, rownames=None, colnames=None, margins=False, normalize=False)
主な引数
引数 | 内容 |
---|---|
index | 行方向のカテゴリ変数(Seriesや列名) |
columns | 列方向のカテゴリ変数(Seriesや列名) |
values | 集計対象の値(数値列) |
aggfunc | 集計方法(例:’sum’, ‘mean’, ‘count’) |
margins | 行・列の合計を表示(True or False ) |
normalize | 比率に変換(True で全体比、'index' で行比、'columns' で列比) |
基本的な使用例:頻度カウント
import pandas as pd
# データフレームの作成
df = pd.DataFrame({
'性別': ['男', '女', '女', '男', '男'],
'購入': ['はい', 'いいえ', 'はい', 'はい', 'いいえ']
})
# クロス集計:性別 × 購入 の頻度
cross_tab = pd.crosstab(df['性別'], df['購入'])
print(cross_tab)
→ 「男」「女」と「購入の有無」の組み合わせごとの件数をカウントしています。
数値の集計:合計や平均など
import pandas as pd
# データフレームの作成
df = pd.DataFrame({
'店舗': ['A', 'A', 'B', 'B', 'A'],
'商品': ['X', 'Y', 'X', 'Y', 'X'],
'売上': [100, 150, 200, 300, 130]
})
# クロス集計:店舗 × 商品 ごとの売上合計
cross_sum = pd.crosstab(df['店舗'], df['商品'], values=df['売上'], aggfunc='sum')
print(cross_sum)
→ クロス集計を使って、数値の合計を集計しています。
行や列の合計を追加:margins=True
# 合計行・列を含めたクロス集計
cross_with_margins = pd.crosstab(df['店舗'], df['商品'], values=df['売上'], aggfunc='sum', margins=True)
print(cross_with_margins)
割合の表示:normalize
引数
# 全体に対する割合
cross_ratio_all = pd.crosstab(df['店舗'], df['商品'], normalize=True)
print("全体に対する割合:\n", cross_ratio_all)
# 行ごとの割合(行合計 = 1)
cross_ratio_index = pd.crosstab(df['店舗'], df['商品'], normalize='index')
print("行に対する割合:\n", cross_ratio_index)
# 列ごとの割合(列合計 = 1)
cross_ratio_columns = pd.crosstab(df['店舗'], df['商品'], normalize='columns')
print("列に対する割合:\n", cross_ratio_columns)
normalizeのオプション
値 | 内容 |
---|---|
True | 全体に対する割合 |
'index' | 行合計に対する割合 |
'columns' | 列合計に対する割合 |
複数の列に対してクロス集計
# より複雑なデータフレーム
df = pd.DataFrame({
'年': [2023, 2023, 2024, 2024, 2024],
'店舗': ['A', 'B', 'A', 'B', 'A'],
'商品': ['X', 'X', 'Y', 'X', 'Y'],
'売上': [100, 150, 200, 300, 130]
})
# 年 × 店舗 ごとの 商品別売上合計
cross_multi = pd.crosstab(
[df['年'], df['店舗']],
df['商品'],
values=df['売上'],
aggfunc='sum',
margins=True
)
print(cross_multi)
他の便利な使い方
集計結果をDataFrameとして保存・加工
# NaNを0に置換し、行合計列を追加
table = pd.crosstab(df['年'], df['商品'], values=df['売上'], aggfunc='sum')
table = table.fillna(0) # 欠損値の補完
table['合計'] = table.sum(axis=1) # 行方向の合計を追加
print(table)
pivot_table
との違い
特徴 | pd.crosstab() | DataFrame.pivot_table() |
---|---|---|
目的 | カテゴリデータの集計 | 柔軟なピボット集計 |
values の指定 | 任意(指定しなければ頻度) | 必須 |
集計関数 | aggfunc (単一) | aggfunc (複数可) |
対象 | 多くはカテゴリ変数 | 数値やカテゴリ混在可能 |
柔軟性 | やや低い | 非常に高い |
簡単に集計表を作るなら crosstab()
、柔軟な分析が必要なら pivot_table()
が適しています。
まとめ
pd.crosstab()
はカテゴリ変数の組み合わせによる集計表を簡単に作成可能- 頻度のカウント、数値の集計、合計・割合の表示などができる
- マーケティングやアンケート分析に非常に有効
pivot_table()
よりも簡易・高速にクロス集計を行える
以上、PythonのPandasのクロス集計についてでした。
最後までお読みいただき、ありがとうございました。