Pandas

[Python/Pandas] pivot_tableの使い方 – ピボットテーブルの作成

PythonのPandasライブラリのpivot_tableは、データフレームを集計・再構成するための便利なメソッドです。

index、列columns、集計対象valuesを指定し、aggfuncで集計方法(例: 平均、合計、カウントなど)を設定します。

例えば、df.pivot_table(index='A', columns='B', values='C', aggfunc='mean')は、列Bごとに列Cの平均を計算し、行Aで整理されたピボットテーブルを作成します。

データの要約や分析に役立ちます。

ピボットテーブルとは

ピボットテーブルは、データの集計や分析を行うための強力なツールです。

特に、データの要約や視覚化を簡単に行うことができるため、データ分析の現場で広く利用されています。

PythonのPandasライブラリを使用することで、ピボットテーブルを簡単に作成することができます。

ピボットテーブルの特徴

  • データの集約: 複数のデータを集約し、要約することができる。
  • 柔軟なレイアウト: 行や列の配置を自由に変更でき、異なる視点からデータを分析できる。
  • 複数の集計関数: 合計、平均、カウントなど、さまざまな集計関数を使用できる。
  • 売上データの分析
  • 顧客データのセグメンテーション
  • 時系列データのトレンド分析

ピボットテーブルを使用することで、データの洞察を得やすくなり、意思決定をサポートします。

次のセクションでは、Pandasのpivot_tableメソッドの基本構文について詳しく見ていきます。

pivot_tableメソッドの基本構文

Pandasのpivot_tableメソッドは、データフレームからピボットテーブルを作成するための関数です。

基本的な構文は以下の通りです。

import pandas as pd
pivot_table = pd.pivot_table(
    data,                # 入力データフレーム
    values=None,        # 集計対象の列名
    index=None,         # 行に設定する列名
    columns=None,       # 列に設定する列名
    aggfunc='mean',     # 集計関数(デフォルトは平均値)
    fill_value=None,    # 欠損値を埋める値
    margins=False,      # 合計行を追加するかどうか
    margins_name='All'  # 合計行の名前
)

引数の説明

引数名説明
dataピボットテーブルを作成する元のデータフレーム
values集計対象の列名(数値データ)
index行に設定する列名(カテゴリカルデータ)
columns列に設定する列名(カテゴリカルデータ)
aggfunc使用する集計関数(例: ‘mean’, ‘sum’, ‘count’)
fill_value欠損値を埋めるための値
margins合計行を追加するかどうか(True/False)
margins_name合計行の名前

この構文を使うことで、データを柔軟に集計し、視覚化することが可能になります。

次のセクションでは、pivot_tableの基本的な使い方について具体的な例を交えて解説します。

pivot_tableの基本的な使い方

Pandasのpivot_tableメソッドを使って、基本的なピボットテーブルを作成する方法を具体的な例を通じて説明します。

以下のサンプルデータを使用します。

サンプルデータの作成

まず、サンプルデータを作成します。

以下のコードを実行して、売上データのデータフレームを作成します。

import pandas as pd
# サンプルデータの作成
data = {
    '店舗': ['A', 'A', 'B', 'B', 'C', 'C'],
    '商品': ['リンゴ', 'バナナ', 'リンゴ', 'バナナ', 'リンゴ', 'バナナ'],
    '売上': [100, 150, 200, 250, 300, 350]
}
df = pd.DataFrame(data)
print(df)
店舗    商品   売上
0  A  リンゴ   100
1  A  バナナ   150
2  B  リンゴ   200
3  B  バナナ   250
4  C  リンゴ   300
5  C  バナナ   350

ピボットテーブルの作成

次に、店舗ごとの売上の合計を集計するピボットテーブルを作成します。

以下のコードを実行します。

# ピボットテーブルの作成
pivot_table = pd.pivot_table(
    df,
    values='売上',      # 集計対象の列
    index='店舗',       # 行に設定する列
    aggfunc='sum'      # 集計関数(合計)
)
print(pivot_table)
売上
店舗        
A     250
B     450
C     650

この例では、pivot_tableメソッドを使用して、各店舗ごとの売上の合計を計算しました。

values引数には集計対象の列(売上)、index引数には行に設定する列(店舗)を指定しています。

aggfunc引数には合計を計算するために'sum'を指定しました。

このように、pivot_tableを使うことで、簡単にデータを集約し、視覚化することができます。

次のセクションでは、複数の集計関数を使用する方法について解説します。

実践例:シンプルなピボットテーブルの作成

ここでは、実際にシンプルなピボットテーブルを作成する例を示します。

前回のサンプルデータを引き続き使用し、店舗ごとの商品別売上の合計を集計します。

サンプルデータの確認

まず、前回作成したサンプルデータを再確認します。

以下のコードを実行します。

import pandas as pd
# サンプルデータの作成
data = {
    '店舗': ['A', 'A', 'B', 'B', 'C', 'C'],
    '商品': ['リンゴ', 'バナナ', 'リンゴ', 'バナナ', 'リンゴ', 'バナナ'],
    '売上': [100, 150, 200, 250, 300, 350]
}
df = pd.DataFrame(data)
print(df)
店舗    商品   売上
0  A  リンゴ   100
1  A  バナナ   150
2  B  リンゴ   200
3  B  バナナ   250
4  C  リンゴ   300
5  C  バナナ   350

ピボットテーブルの作成

次に、店舗ごとの商品別売上の合計を集計するピボットテーブルを作成します。

以下のコードを実行します。

# ピボットテーブルの作成
pivot_table = pd.pivot_table(
    df,
    values='売上',      # 集計対象の列
    index='店舗',       # 行に設定する列
    columns='商品',     # 列に設定する列
    aggfunc='sum',      # 集計関数(合計)
    fill_value=0        # 欠損値を0で埋める
)
print(pivot_table)
商品    バナナ  リンゴ
店舗               
A      150   100
B      250   200
C      350   300

この例では、pivot_tableメソッドを使用して、店舗ごとの商品別売上の合計を計算しました。

values引数には集計対象の列(売上)、index引数には行に設定する列(店舗)、columns引数には列に設定する列(商品)を指定しています。

aggfunc引数には合計を計算するために'sum'を指定し、fill_value引数には欠損値を0で埋めるように設定しました。

このように、シンプルなピボットテーブルを作成することで、データを視覚的に整理し、分析しやすくなります。

次のセクションでは、複数の集計関数を使用する方法について解説します。

複数の集計関数を使用する方法

Pandasのpivot_tableメソッドでは、複数の集計関数を同時に使用することができます。

これにより、同じデータに対して異なる視点からの分析が可能になります。

ここでは、店舗ごとの商品別売上に対して、合計と平均の両方を計算する例を示します。

サンプルデータの確認

前回と同じサンプルデータを使用します。

以下のコードを実行して、データを確認します。

import pandas as pd
# サンプルデータの作成
data = {
    '店舗': ['A', 'A', 'B', 'B', 'C', 'C'],
    '商品': ['リンゴ', 'バナナ', 'リンゴ', 'バナナ', 'リンゴ', 'バナナ'],
    '売上': [100, 150, 200, 250, 300, 350]
}
df = pd.DataFrame(data)
print(df)
店舗    商品   売上
0  A  リンゴ   100
1  A  バナナ   150
2  B  リンゴ   200
3  B  バナナ   250
4  C  リンゴ   300
5  C  バナナ   350

ピボットテーブルの作成

次に、店舗ごとの商品別売上に対して、合計と平均の両方を計算するピボットテーブルを作成します。

以下のコードを実行します。

# ピボットテーブルの作成
pivot_table = pd.pivot_table(
    df,
    values='売上',                  # 集計対象の列
    index='店舗',                   # 行に設定する列
    columns='商品',                 # 列に設定する列
    aggfunc=['sum', 'mean'],        # 集計関数(合計と平均)
    fill_value=0                    # 欠損値を0で埋める
)
print(pivot_table)
sum         mean        
商品    バナナ  リンゴ  バナナ  リンゴ
店舗                                
A      150   100   75.0   50.0
B      250   200  125.0  100.0
C      350   300  175.0  150.0

この例では、aggfunc引数にリストを指定することで、合計'sum'と平均'mean'の両方を計算しました。

出力結果は、各店舗ごとの商品別に売上の合計と平均が表示されています。

  • sum行には、各店舗ごとの商品別売上の合計が表示されています。
  • mean行には、各店舗ごとの商品別売上の平均が表示されています。

このように、複数の集計関数を使用することで、データをより詳細に分析することが可能になります。

次のセクションでは、欠損値の処理について解説します。

欠損値の処理

データ分析において、欠損値はしばしば問題となります。

Pandasのpivot_tableメソッドでは、欠損値を適切に処理するためのオプションが用意されています。

ここでは、欠損値を処理する方法について説明します。

欠損値の発生

まず、サンプルデータに意図的に欠損値を追加してみます。

以下のコードを実行します。

import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
    '店舗': ['A', 'A', 'B', 'B', 'C', 'C'],
    '商品': ['リンゴ', 'バナナ', 'リンゴ', 'バナナ', 'リンゴ', 'バナナ'],
    '売上': [100, np.nan, 200, 250, 300, np.nan]  # バナナの売上に欠損値を追加
}
df = pd.DataFrame(data)
print(df)
店舗    商品   売上
0  A  リンゴ  100.0
1  A  バナナ    NaN
2  B  リンゴ  200.0
3  B  バナナ  250.0
4  C  リンゴ  300.0
5  C  バナナ    NaN

ピボットテーブルの作成と欠損値の処理

次に、欠損値を含むデータを使ってピボットテーブルを作成します。

fill_value引数を使用して、欠損値を0で埋める方法を示します。

以下のコードを実行します。

# ピボットテーブルの作成
pivot_table = pd.pivot_table(
    df,
    values='売上',                  # 集計対象の列
    index='店舗',                   # 行に設定する列
    columns='商品',                 # 列に設定する列
    aggfunc='sum',                  # 集計関数(合計)
    fill_value=0                    # 欠損値を0で埋める
)
print(pivot_table)
商品    バナナ  リンゴ
店舗               
A        0   100
B      250   200
C        0   300

この例では、fill_value引数を使用して、欠損値を0で埋めるように設定しました。

これにより、バナナの売上が欠損している店舗(AとC)に対して、0が表示されました。

  • fill_value=0を指定することで、欠損値を0で埋めることができ、データの整合性を保つことができます。
  • 欠損値をそのままにしておくと、集計結果が不正確になる可能性があるため、適切な処理が重要です。

このように、pivot_tableメソッドを使用することで、欠損値を適切に処理しながらデータを集計することができます。

次のセクションでは、ピボットテーブルの応用例について解説します。

ピボットテーブルの応用例

ピボットテーブルは、さまざまなデータ分析のシナリオで活用できます。

ここでは、実際のビジネスシーンを想定した応用例をいくつか紹介します。

これにより、ピボットテーブルの柔軟性と有用性を理解することができます。

売上データの分析

例えば、店舗ごとの月別売上を分析する場合、以下のようなデータフレームを考えます。

import pandas as pd
# サンプルデータの作成
data = {
    '店舗': ['A', 'A', 'B', 'B', 'C', 'C', 'A', 'B', 'C'],
    '月': ['2023-01', '2023-02', '2023-01', '2023-02', '2023-01', '2023-02', '2023-03', '2023-03', '2023-03'],
    '売上': [100, 150, 200, 250, 300, 350, 400, 450, 500]
}
df = pd.DataFrame(data)
print(df)
店舗      月   売上
0  A  2023-01   100
1  A  2023-02   150
2  B  2023-01   200
3  B  2023-02   250
4  C  2023-01   300
5  C  2023-02   350
6  A  2023-03   400
7  B  2023-03   450
8  C  2023-03   500

このデータを使って、店舗ごとの月別売上の合計を集計するピボットテーブルを作成します。

# ピボットテーブルの作成
pivot_table = pd.pivot_table(
    df,
    values='売上',
    index='月',
    columns='店舗',
    aggfunc='sum',
    fill_value=0
)
print(pivot_table)
店舗        A    B    C
月                    
2023-01  100  200  300
2023-02  150  250  350
2023-03  400  450  500

顧客データのセグメンテーション

顧客データを分析する際にもピボットテーブルは有効です。

例えば、顧客の年齢層ごとの購入回数を集計する場合、以下のようなデータを考えます。

data = {
    '顧客ID': [1, 2, 3, 4, 5, 6],
    '年齢層': ['20代', '30代', '20代', '40代', '30代', '40代'],
    '購入回数': [5, 3, 2, 4, 6, 1]
}
df_customers = pd.DataFrame(data)
print(df_customers)
顧客ID 年齢層  購入回数
0      1  20代      5
1      2  30代      3
2      3  20代      2
3      4  40代      4
4      5  30代      6
5      6  40代      1

このデータを使って、年齢層ごとの購入回数の合計を集計します。

# ピボットテーブルの作成
pivot_table_customers = pd.pivot_table(
    df_customers,
    values='購入回数',
    index='年齢層',
    aggfunc='sum',
    fill_value=0
)
print(pivot_table_customers)
年齢層
20代    7
30代    9
40代    5

時系列データのトレンド分析

時系列データを分析する際にもピボットテーブルは役立ちます。

例えば、日別の売上データを集計し、週ごとのトレンドを把握することができます。

data = {
    '日付': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-08', '2023-01-09'],
    '売上': [100, 150, 200, 250, 300]
}
df_sales = pd.DataFrame(data)
df_sales['日付'] = pd.to_datetime(df_sales['日付'])
df_sales['週'] = df_sales['日付'].dt.isocalendar().week
print(df_sales)
日付  売上  週
0 2023-01-01  100  52
1 2023-01-02  150   1
2 2023-01-03  200   1
3 2023-01-08  250   1
4 2023-01-09  300   2

このデータを使って、週ごとの売上の合計を集計します。

# ピボットテーブルの作成
pivot_table_sales = pd.pivot_table(
    df_sales,
    values='売上',
    index='週',
    aggfunc='sum',
    fill_value=0
)
print(pivot_table_sales)
売上
週        
52  100
1   600
2   300

これらの応用例からもわかるように、ピボットテーブルは多様なデータ分析に対応できる強力なツールです。

売上データの分析、顧客データのセグメンテーション、時系列データのトレンド分析など、さまざまなシナリオで活用できます。

次のセクションでは、pivot_tablegroupbyの違いについて解説します。

pivot_tableとgroupbyの違い

Pandasにはデータを集約するためのメソッドとしてpivot_tablegroupbyがありますが、これらは異なる目的や使い方を持っています。

ここでは、両者の違いについて詳しく解説します。

基本的な違い

特徴pivot_tablegroupby
目的データのピボット(行と列の再配置)データのグループ化と集約
出力形式データフレームの形式でピボットデータフレームまたはシリーズ
欠損値の処理fill_valueで指定可能欠損値はデフォルトで無視される
複数の集計関数複数の集計関数を同時に使用可能複数の集計関数を適用可能

pivot_tableの使用例

pivot_tableを使用して、店舗ごとの商品別売上の合計を計算する例を見てみましょう。

import pandas as pd
# サンプルデータの作成
data = {
    '店舗': ['A', 'A', 'B', 'B', 'C', 'C'],
    '商品': ['リンゴ', 'バナナ', 'リンゴ', 'バナナ', 'リンゴ', 'バナナ'],
    '売上': [100, 150, 200, 250, 300, 350]
}
df = pd.DataFrame(data)
# ピボットテーブルの作成
pivot_table = pd.pivot_table(
    df,
    values='売上',
    index='店舗',
    columns='商品',
    aggfunc='sum',
    fill_value=0
)
print(pivot_table)
商品    バナナ  リンゴ
店舗               
A      150   100
B      250   200
C      350   300

groupbyの使用例

次に、同じデータをgroupbyを使って集約する例を見てみましょう。

# groupbyの使用
grouped = df.groupby(['店舗', '商品'])['売上'].sum().unstack(fill_value=0)
print(grouped)
商品    バナナ  リンゴ
店舗               
A      150   100
B      250   200
C      350   300

使い分けのポイント

  • データの再配置が必要な場合: データを行と列に分けて視覚的に整理したい場合はpivot_tableを使用します。
  • 単純なグループ化が必要な場合: データをグループ化して集約するだけであればgroupbyが適しています。
  • 欠損値の処理: 欠損値を特定の値で埋めたい場合はpivot_tableが便利です。

groupbyでは欠損値は無視されます。

pivot_tablegroupbyは、データの集約においてそれぞれ異なる特性を持っています。

目的に応じて使い分けることで、データ分析をより効果的に行うことができます。

次のセクションでは、記事の内容を振り返り、重要なポイントを整理します。

まとめ

この記事では、Pandasのpivot_tableメソッドを使ったピボットテーブルの作成方法や、データの集約におけるgroupbyとの違いについて詳しく解説しました。

ピボットテーブルは、データを視覚的に整理し、分析を行うための強力なツールであり、さまざまなビジネスシーンでの応用が可能です。

データ分析を行う際には、これらの手法を活用して、より効果的な意思決定を行うための一歩を踏み出してみてください。

関連記事

Back to top button