(学習ログ)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