🐍

(学習ログ)Python013:購買データの月別・商品別クロス集計

に公開

1. はじめに

この記事の目的

Pandasを使って、購買データを月別・商品別にクロス集計する方法を学びます。実務でよく使われるpivot_tableメソッドの基本的な使い方を解説します。

この記事の概要

  • CSVとExcelファイルからデータを読み込む方法
  • 日付データを月単位に変換する手法
  • ピボットテーブルを使った集計テクニック

2. サンプルコード

コード全文

import pandas as pd

# CSVファイルから売上データを読み込む
sample_uriage_data = pd.read_csv("002_サンプル/sample_uriage_data.csv")

# Excelファイルから顧客台帳を読み込む
sample_customer_ledger = pd.read_excel("002_サンプル/sample_customer_ledger.xlsx")

# purchase_date列を文字列からdatetime型に変換
sample_uriage_data["purchase_date"] = pd.to_datetime(sample_uriage_data["purchase_date"])

# 日付から年月(YYYYMM形式)を抽出して新しい列を作成
sample_uriage_data["purchase_month"] = sample_uriage_data["purchase_date"].dt.strftime("%Y%m")

# 月別・商品別のクロス集計表を作成(購入回数をカウント)
res = sample_uriage_data.pivot_table(
    index="purchase_month",      # 行に月を配置
    columns="item_name",          # 列に商品名を配置
    aggfunc="size",               # 件数をカウント
    fill_value=0                  # 欠損値を0で埋める
)

# 結果を表示
res

コード解説

1行目:ライブラリのインポート

import pandas as pd

データ分析に必須のPandasライブラリを読み込みます。pdという短い名前で使えるようにしています。

3〜6行目:データの読み込み

sample_uriage_data = pd.read_csv("002_サンプル/sample_uriage_data.csv")
sample_customer_ledger = pd.read_excel("002_サンプル/sample_customer_ledger.xlsx")

売上データをCSVから、顧客台帳をExcelから読み込みます。

8〜9行目:日付データの変換

sample_uriage_data["purchase_date"] = pd.to_datetime(sample_uriage_data["purchase_date"])

文字列として読み込まれた日付を、Pythonが日付として認識できるdatetime型に変換します。これにより、月や年の抽出が簡単になります。

11〜12行目:年月の抽出

sample_uriage_data["purchase_month"] = sample_uriage_data["purchase_date"].dt.strftime("%Y%m")

日付から年月だけを抽出して、202401のような6桁の文字列に変換します。.dt.strftime()は日付を好きな形式に整形できます。

14〜19行目:ピボットテーブルの作成

res = sample_uriage_data.pivot_table(
    index="purchase_month",
    columns="item_name",
    aggfunc="size",
    fill_value=0
)

pivot_tableメソッドで、月別(縦軸)×商品別(横軸)のクロス集計表を作成します。

  • index:行に表示する項目(月)
  • columns:列に表示する項目(商品名)
  • aggfunc="size":各セルに件数を表示
  • fill_value=0:データがない箇所を0で埋める

実行結果例

売上データが以下のような内容だった場合:

元データ(sample_uriage_data.csv)の一部

purchase_date,item_name,customer_id,price
2024-01-15,ノートPC,C001,98000
2024-01-20,マウス,C002,2500
2024-01-25,ノートPC,C003,98000
2024-02-10,キーボード,C001,5500
2024-02-15,ノートPC,C004,98000
2024-02-20,マウス,C002,2500

実行結果

item_name     キーボード  ノートPC  マウス
purchase_month                   
202401             0      2    1
202402             1      1    1

この表から「2024年1月にノートPCが2回、マウスが1回購入された」といったことが一目でわかります。

3. エラーと確認のポイント

代表的なエラー文

エラー1:ファイルが見つからない

FileNotFoundError: [Errno 2] No such file or directory: '002_サンプル/sample_uriage_data.csv'

原因:指定したパスにファイルが存在しないか、作業ディレクトリが異なっています。os.getcwd()で現在のディレクトリを確認しましょう。

エラー2:日付変換に失敗

ParserError: Unknown datetime string format

原因:日付の形式が想定と異なる可能性があります。pd.to_datetime()formatパラメータを指定すると解決できます。

エラー3:キーエラー

KeyError: 'purchase_date'

原因:指定した列名がデータに存在しません。列名のスペルミスや全角・半角の違いを確認してください。

よく使う確認メソッドと出力例

データの形状を確認

print(sample_uriage_data.shape)
# 出力例: (150, 4)  # 150行、4列のデータ

列名の一覧を確認

print(sample_uriage_data.columns)
# 出力例: Index(['purchase_date', 'item_name', 'customer_id', 'price'], dtype='object')

最初の5行を確認

print(sample_uriage_data.head())
# 出力例:
#   purchase_date item_name customer_id  price
# 0    2024-01-15    ノートPC        C001  98000
# 1    2024-01-20      マウス        C002   2500
# 2    2024-01-25    ノートPC        C003  98000
# ...

データ型を確認

print(sample_uriage_data.dtypes)
# 出力例:
# purchase_date    datetime64[ns]  # datetime型に変換された
# item_name        object
# customer_id      object
# price            int64

ピボットテーブルの形状を確認

print(res.shape)
# 出力例: (12, 5)  # 12ヶ月分、5種類の商品

4. まとめ

本記事で理解できるようになったことを整理します。

  • 異なる形式のファイル読み込みread_csv()read_excel()を使い分けることで、様々なデータソースに対応できるようになりました
  • 日付データの加工pd.to_datetime()dt.strftime()を組み合わせることで、日付を自在に変換・集約できるようになりました
  • クロス集計の作成pivot_table()メソッドを使うことで、複雑な集計作業を数行のコードで実現できるようになりました

Discussion