現在の見出し:2.2節:ピボットテーブル機能の構築
見出し一覧
- 2.2節:ピボットテーブル機能の構築
- - pd.pivot_table()による地域別売上集計機能の実装
- - unstack()による商品別推移データ作成機能の追加
【PR】『Python』を学べる企業・個人向けのプログラミングコース
pd.pivot_table()による地域別売上集計機能の実装
前節(第2章 2.1節)で作成したコードを基盤として、pd.pivot_table()による地域別の売上集計機能を実装します。現在の基本集計では月別・商品別の1次元集計しかできないため、地域間のパフォーマンス比較や地域別の時系列トレンド分析が困難な状況です。
pd.pivot_table()関数関数は一定の処理をまとめたプログラムの塊です。は、複数の軸を組み合わせたクロス集計表(ピボットテーブル)を作成する専用関数です。Excelのピボットテーブル機能と同様に、データを行と列の2次元で整理して分析できます。月×地域の組み合わせによって、どの地域がいつ好調だったかを一目で把握できる分析表を作成します。
引数 | 役割 | 設定例 | 効果 |
---|---|---|---|
index | 行軸の設定 | 'Date' | 月ごとに行を分ける |
columns | 列軸の設定 | 'Area' | 地域ごとに列を分ける |
values | 集計対象データ | 'Price' | 売上金額を集計 |
aggfunc | 集計方法 | 'sum' | 合計値を計算 |
fill_value | 欠損値の処理 | 0 | 空白セルを0で埋める |
以下が前節のコードに「ピボットテーブル分析機能」を追加したプログラムプログラムはコンピュータに対して何をすべきかを指示する一連の命令です。です。create_pivot_analysis関数を新規追加することで、基本分析と高度分析を分離して管理します。既存の分析結果辞書に新しい集計データを追加する方式により、前節の機能を保持しながら段階的に分析機能を拡張できます。
# コード
import pandas as pd
import os
def load_sales_data(filepath):
"""売上データの読み込み"""
if not os.path.exists(filepath):
print(f"エラー: ファイルが見つかりません - {filepath}")
return None
df = pd.read_excel(filepath)
print(f"データ読み込み完了: {len(df)}行, {len(df.columns)}列")
print("データ構造:")
print(df.head())
return df
def preprocess_data(df):
"""データ前処理"""
if df is None:
return None
print(f"元データ: {len(df)}行")
# 日付変換
df['Date'] = pd.to_datetime(df['Date']).dt.strftime("%Y-%m")
print("日付変換完了")
# 欠損値除去
original_rows = len(df)
df = df.dropna()
print(f"欠損値除去: {original_rows - len(df)}行削除")
print("処理済みデータ:")
print(df.head())
return df
def analyze_basic_sales(df):
"""基本売上分析"""
if df is None:
return None
# 商品・地域リスト抽出
products = sorted(df['Product'].unique())
areas = sorted(df['Area'].unique())
print(f"商品数: {len(products)}")
print(f"地域数: {len(areas)}")
print(f"商品リスト: {products}")
print(f"地域リスト: {areas}")
# 月別商品別集計
monthly_product_sales = df.groupby(['Date', 'Product'])['Price'].sum().reset_index()
print("\n月別商品別売上:")
print(monthly_product_sales.head(10))
return {
'products': products,
'areas': areas,
'monthly_product': monthly_product_sales
}
def create_pivot_analysis(df, basic_results):
"""ピボット分析"""
if df is None or basic_results is None:
return basic_results
# ピボットテーブル作成(月×地域)
pivot_table = pd.pivot_table(df,
index='Date',
columns='Area',
values='Price',
aggfunc='sum',
fill_value=0)
print("\n地域別売上ピボットテーブル:")
print(pivot_table)
# 既存結果に新しい分析結果を追加
basic_results['pivot_table'] = pivot_table
return basic_results
# メイン処理
def main():
filepath = "sample.xlsx"
df = load_sales_data(filepath)
if df is not None:
print("読み込み成功!")
processed_df = preprocess_data(df)
if processed_df is not None:
print(f"最終データ: {len(processed_df)}行")
print("データ型:")
print(processed_df.dtypes)
analysis_results = analyze_basic_sales(processed_df)
if analysis_results:
print(f"\n基本分析完了 - 商品数: {len(analysis_results['products'])}")
# ピボット分析の実行
full_results = create_pivot_analysis(processed_df, analysis_results)
print(f"ピボット分析完了 - 地域数: {len(full_results['areas'])}")
else:
print("読み込み失敗")
if __name__ == "__main__":
main()
# 実行結果
データ読み込み完了: 5行, 4列
データ構造:
Product Area Date Price
0 ProductA Tokyo 2024-01-15 1000
1 ProductB Osaka 2024-01-16 1500
2 ProductC Tokyo 2024-01-17 2000
3 ProductA Nagoya 2024-01-18 1200
4 ProductB Tokyo 2024-01-19 1800
読み込み成功!
元データ: 5行
日付変換完了
欠損値除去: 0行削除
処理済みデータ:
Product Area Date Price
0 ProductA Tokyo 2024-01 1000
1 ProductB Osaka 2024-01 1500
2 ProductC Tokyo 2024-01 2000
3 ProductA Nagoya 2024-01 1200
4 ProductB Tokyo 2024-01 1800
最終データ: 5行
データ型:
Product object
Area object
Date object
Price int64
dtype: object
商品数: 3
地域数: 3
商品リスト: ['ProductA', 'ProductB', 'ProductC']
地域リスト: ['Nagoya', 'Osaka', 'Tokyo']
月別商品別売上:
Date Product Price
0 2024-01 ProductA 2200
1 2024-01 ProductB 3300
2 2024-01 ProductC 2000
基本分析完了 - 商品数: 3
地域別売上ピボットテーブル:
Area Nagoya Osaka Tokyo
Date
2024-01 1200 1500 4800
ピボット分析完了 - 地域数: 3
行数 | 種別 | コード | 解説 |
---|---|---|---|
62行目 | 新規 | def create_pivot_analysis(df, basic_results): |
ピボット分析専用の関数を定義します。基本分析結果を受け取って拡張分析を実行し、多次元データ分析機能を提供します。 |
68行目 | 新規 | pivot_table = pd.pivot_table(df, |
ピボットテーブル作成を開始します。複数の引数を使用して2次元クロス集計表を構築するための処理です。 |
69行目 | 新規 | index='Date', |
ピボットテーブルの行軸として日付列を指定します。時系列での売上推移を行方向に表示するための設定です。 |
70行目 | 新規 | columns='Area', |
列軸として地域列を指定して、地域間の売上比較を列方向で可能にします。地理的分析の基盤となる重要な設定です。 |
73行目 | 新規 | fill_value=0) |
欠損値を0で埋めて完全なマトリックス形式を作成します。データが存在しない月・地域の組み合わせを明示的に0として扱います。 |
78行目 | 新規 | basic_results['pivot_table'] = pivot_table |
作成したピボットテーブルを既存の分析結果辞書に追加します。基本分析を拡張して多次元分析機能を統合します。 |
100行目 | 新規 | full_results = create_pivot_analysis(processed_df, analysis_results) |
ピボット分析関数を呼び出して高度な分析を実行します。基本分析結果を拡張してより詳細な洞察を得られます。 |