【実践編】pandasで都道府県別・男女別売上を集計する

はじめに

実務におけるデータ分析では、「都道府県ごと」「男女別」などのカテゴリごとの集計は頻出です。
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: int64
  • groupby() はカテゴリ別集計の基本です
  • 集計関数として 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では面倒だった処理が、数行のコードで自動化できるのは大きなメリットです。

🧭 参考リンク・シリーズナビ

コメント

タイトルとURLをコピーしました