[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_table
とgroupby
の違いについて解説します。
pivot_tableとgroupbyの違い
Pandasにはデータを集約するためのメソッドとしてpivot_table
とgroupby
がありますが、これらは異なる目的や使い方を持っています。
ここでは、両者の違いについて詳しく解説します。
基本的な違い
特徴 | pivot_table | groupby |
---|---|---|
目的 | データのピボット(行と列の再配置) | データのグループ化と集約 |
出力形式 | データフレームの形式でピボット | データフレームまたはシリーズ |
欠損値の処理 | 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_table
とgroupby
は、データの集約においてそれぞれ異なる特性を持っています。
目的に応じて使い分けることで、データ分析をより効果的に行うことができます。
次のセクションでは、記事の内容を振り返り、重要なポイントを整理します。
まとめ
この記事では、Pandasのpivot_table
メソッドを使ったピボットテーブルの作成方法や、データの集約におけるgroupby
との違いについて詳しく解説しました。
ピボットテーブルは、データを視覚的に整理し、分析を行うための強力なツールであり、さまざまなビジネスシーンでの応用が可能です。
データ分析を行う際には、これらの手法を活用して、より効果的な意思決定を行うための一歩を踏み出してみてください。