🐍

(学習ログ)Python010:複数CSVの結合と売上集計グラフ化

に公開

1. はじめに

  • この記事の目的
    本記事では、複数のCSVファイルを読み込み、データを結合・加工し、最後に売上をグラフ化する一連の流れを学びます。

  • この記事の概要

    • CSVファイルを pandas で読み込む方法
    • merge を使ったデータ結合の方法
    • 列の計算や日付処理の基本
    • ピボットテーブルとグラフ描画の実装

2. サンプルコード

from ast import increment_lineno
import pandas as pd

# --- トランザクションデータを結合 ---
sample_transaction1 = pd.read_csv('001_サンプル/sample_transaction_data1.csv')
sample_transaction2 = pd.read_csv('001_サンプル/sample_transaction_data2.csv')
sample_transaction = pd.concat([sample_transaction1, sample_transaction2], ignore_index=True)

# --- トランザクション詳細を結合 ---
sample_transaction_detail1 = pd.read_csv('001_サンプル/sample_transaction_detail1.csv')
sample_transaction_detail2 = pd.read_csv('001_サンプル/sample_transaction_detail2.csv')
sample_transaction_detail = pd.concat([sample_transaction_detail1, sample_transaction_detail2], ignore_index=True)

# --- トランザクションと詳細を結合 ---
sample_join_data = pd.merge(
    sample_transaction_detail,
    sample_transaction[["transaction_id", "payment_date", "customer_id"]],
    on='transaction_id', how="left"
)

# --- 顧客情報を結合 ---
sample_file = pd.read_csv('001_サンプル/sample_file.csv')
sample_join_data = pd.merge(sample_join_data, sample_file, on="customer_id", how="left")

# --- 商品情報を結合 ---
sample_item_list = pd.read_csv('001_サンプル/sample_item_list.csv')
sample_join_data = pd.merge(sample_join_data, sample_item_list, on="item_id", how="left")

# --- 売上計算 ---
sample_join_data["price"] = sample_join_data["quantity"] * sample_join_data["item_price"]

# --- 日付を加工 ---
sample_join_data["payment_date"] = pd.to_datetime(sample_join_data["payment_date"])
sample_join_data["payment_month"] = sample_join_data["payment_date"].dt.strftime("%Y%m")

# --- ピボットテーブルで集計 ---
sample_graph_data = pd.pivot_table(
    sample_join_data,
    index='payment_month',
    columns='item_name',
    values='price',
    aggfunc='sum'
)

# --- グラフ描画 ---
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(list(sample_graph_data.index), sample_graph_data['PC-A'], label='PC-A')
plt.plot(list(sample_graph_data.index), sample_graph_data['PC-B'], label='PC-B')
plt.plot(list(sample_graph_data.index), sample_graph_data['PC-C'], label='PC-C')
plt.plot(list(sample_graph_data.index), sample_graph_data['PC-D'], label='PC-D')
plt.plot(list(sample_graph_data.index), sample_graph_data['PC-E'], label='PC-E')
plt.legend()

行ごとの解説

  • pd.read_csv(...) : CSVファイルを読み込み、DataFrameを作成します。
  • pd.concat([...]) : 複数ファイルを縦方向に結合します。
  • pd.merge(...) : 共通キー(例:transaction_id)でテーブルを結合します。
  • ["price"] = quantity * item_price : 新しい列を計算して追加します。
  • pd.to_datetime : 文字列を日付型に変換します。
  • .dt.strftime("%Y%m") : 年月の形に整形します。
  • pd.pivot_table : クロス集計(売上×商品×月)を作成します。
  • plt.plot(...) : 折れ線グラフを描画します。

実行結果例

ピボットテーブル例:

payment_month PC-A PC-B PC-C PC-D PC-E
202401 300000 150000 120000 90000 110000
202402 250000 180000 130000 95000 120000
202403 320000 160000 140000 97000 100000

グラフ例:

   |                ■PC-A
売 |          ■PC-B
上 |      ■PC-C
  |   ■PC-D
額 | ■PC-E
   +---------------------------------
      202401   202402   202403
                月

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

代表的なエラー文

  • FileNotFoundError: [Errno 2] No such file or directory
    → パスが間違っているか、ファイルが存在しません。
  • KeyError: 'item_name'
    → 結合後のDataFrameに指定した列が存在しないときに出ます。

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

sample_join_data.shape
# 出力例: (1200, 10) → 行数と列数を確認できる

sample_join_data.columns
# 出力例: Index(['transaction_id','payment_date','customer_id','item_id','quantity','item_price','price'], dtype='object')

sample_join_data.head()
# 出力例: 先頭5行のデータを確認

4. まとめ

  • 複数のCSVファイルを pandas で結合し、1つのデータにまとめる方法を学んだ。
  • mergeconcat の違い、日付処理や新しい列の追加方法を理解した。
  • pivot_tablematplotlib を組み合わせて、売上の推移を可視化できるようになった。

Discussion