はじめに
実務におけるデータ分析では、「都道府県ごと」「男女別」などのカテゴリごとの集計は頻出です。
Excelのピボットテーブルで行っていた処理を、Pythonとpandasで再現できれば、作業効率は劇的にアップします。
本記事では、pandasを用いて以下のような分析を行う方法を、具体的なサンプルデータを使ってわかりやすく解説します。
1. 使用データ(例)
今回は以下のような簡易データを使って解説します:
| 氏名 | 都道府県 | 性別 | 購入金額 |
|---|---|---|---|
| 太郎 | 東京都 | 男 | 1200 |
| 花子 | 大阪府 | 女 | 900 |
| 次郎 | 東京都 | 男 | 1500 |
| さくら | 福岡県 | 女 | 1300 |
| 健 | 大阪府 | 男 | 800 |
import pandas as pd
df = pd.DataFrame({
"氏名": ["太郎", "花子", "次郎", "さくら", "健"],
"都道府県": ["東京都", "大阪府", "東京都", "福岡県", "大阪府"],
"性別": ["男", "女", "男", "女", "男"],
"購入金額": [1200, 900, 1500, 1300, 800]
})2. 都道府県別の売上合計(groupby)
まずは単純に、都道府県ごとの合計金額を出してみましょう。
df.groupby("都道府県")["購入金額"].sum()出力:
大阪府 1700
福岡県 1300
東京都 2700
Name: 購入金額, dtype: int64groupby()はカテゴリ別集計の基本です- 集計関数として
sum(),mean(),count()などが使えます
3. 都道府県 × 性別 のクロス集計(pivot_table)
次に、「都道府県ごと・性別ごと」に売上を分けて見てみましょう。
pd.pivot_table(df, index="都道府県", columns="性別", values="購入金額", aggfunc="sum", fill_value=0)出力:
性別 女 男
都道府県
大阪府 900 800
福岡県 1300 0
東京都 0 2700
index: 行にしたいカテゴリ(都道府県)columns: 列にしたいカテゴリ(性別)values: 集計対象の数値列(購入金額)aggfunc="sum":合計で集計fill_value=0:空欄(NaN)を0で埋める
4. 合計列・合計行の追加
集計表に「合計」列や行をつけたい場合:
table = pd.pivot_table(
df, index="都道府県", columns="性別",
values="購入金額", aggfunc="sum", fill_value=0
)
# 合計列(男女合算)
table["合計"] = table.sum(axis=1)
# 合計行(都道府県合算)
table.loc["全国合計"] = table.sum(axis=0)
print(table)出力:
性別 女 男 合計
都道府県
大阪府 900 800 1700
福岡県 1300 0 1300
東京都 0 2700 2700
全国合計 2200 3500 5700✅ 全国合計を最後に表示すると、レポート・資料にもそのまま使える形になります!
5. クロス集計の可視化(棒グラフ)
棒グラフで都道府県別売上を視覚的に表現したいとき:
import matplotlib.pyplot as plt
table[["女", "男"]].plot(kind="bar", stacked=True)
plt.title("都道府県別・男女別売上(棒グラフ)")
plt.ylabel("購入金額")
plt.xlabel("都道府県")
plt.tight_layout()
plt.show()stacked=Trueで男女の合算を「積み上げ棒グラフ」で表示- グラフ化することで、数値では気づきにくい地域差や男女比が一目瞭然に
✅ まとめ
| 処理内容 | 使用関数 |
|---|---|
| 都道府県別売上合計 | groupby("都道府県")["購入金額"].sum() |
| 男女別クロス集計 | pivot_table() |
| 合計列/行追加 | sum(axis=1) / sum(axis=0) |
| グラフ化 | plot(kind="bar") |
pandasを使えば、クロス集計もグラフ化も一貫してスムーズに行えます。
手作業やExcelでは面倒だった処理が、数行のコードで自動化できるのは大きなメリットです。

コメント