サイトアイコン アマチュア無線局JS2IIU

【Pandas】ピボットテーブルを使いこなす

こんにちは、JS2IIUです。
データ分析において、データを集計・要約し、多角的な視点から分析することは非常に重要です。そのための強力なツールの一つが「ピボットテーブル」です。この記事では、PythonのPandasライブラリにおけるピボットテーブルの作成方法と、その応用について詳しく解説します。

1. ピボットテーブルとは

定義と目的: ピボットテーブルは、大量のデータを要約し、整理するための表です。行と列を入れ替えたり、集計方法を変えたりすることで、様々な角度からデータを分析できます。データ分析の現場では、データ全体の傾向を把握したり、特定の条件を満たすデータの集計を行ったりする際によく用いられます。

Excelとの比較: ピボットテーブルはExcelでもおなじみの機能です。ExcelのピボットテーブルとPandasのピボットテーブルは、概念的には非常に似ています。しかし、PandasではPythonの豊富なライブラリと連携することで、より柔軟で高度なデータ操作や分析、可視化が可能になります。

2. Pandasにおけるピボットテーブルの作成 (pivot_table関数)

Pandasでピボットテーブルを作成するには、pivot_table関数を使用します。基本的な構文は以下の通りです。

Python
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)

各引数の説明:

なお、本記事を書いた2024年12月の時点でPandasのバージョンは2.2.3になっています。

簡単な例:

以下のような売上データDataFrameを例に、ピボットテーブルを作成してみましょう。

Python
import pandas as pd
import numpy as np

data = {'Shop': ['A', 'A', 'B', 'B', 'A', 'B'],
        'Product': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
        'Sales': [100, 150, 200, 250, 120, 180]}
df = pd.DataFrame(data)
print(df)

出力:

Plaintext
  Shop Product  Sales
0    A       X    100
1    A       Y    150
2    B       X    200
3    B       Y    250
4    A       X    120
5    B       Y    180

店舗ごとの売上合計を計算するピボットテーブルを作成します。集計する列として'Sales'(売上)、集計する列を'Shop'(店舗)とします。aggfunc集計関数にsumを指定して、各店舗における売上の合計を表示します。

Python
pivot_table = pd.pivot_table(df, values='Sales', index='Shop', aggfunc='sum')
print(pivot_table)

出力:

Plaintext
      Sales
Shop       
A       370
B       630

3. aggfuncの応用

複数の集計関数:

商品ごとの売上合計と平均を同時に計算するには、aggfuncにリストを指定します。

Python
pivot_table = pd.pivot_table(df, values='Sales', index='Product', aggfunc=['sum', 'mean'])
print(pivot_table)

出力:

Plaintext
          sum        mean
        Sales       Sales
Product                  
X         420  140.000000
Y         580  193.333333

カスタム集計関数:

例えば、最大値と最小値の差を計算する関数を定義してaggfuncに渡すことができます。

Python
def range_func(x):
    return x.max() - x.min()

pivot_table = pd.pivot_table(df, values='Sales', index='Shop', aggfunc=range_func)
print(pivot_table)

出力:

Plaintext
      Sales
Shop       
A        50
B        70

4. マルチインデックス(階層的なインデックス)

複数のindexcolumnsの指定:

店舗と商品ごとの売上を計算するには、indexに複数の列を指定します。

Python
pivot_table = pd.pivot_table(df, values='Sales', index=['Shop', 'Product'], aggfunc='sum')
print(pivot_table)

出力:

マルチインデックス('Shop', 'Product')を持つDataFrameとして出力されました。

Plaintext
              Sales
Shop Product       
A    X          220
     Y          150
B    X          200
     Y          430

stackunstack:

stackは列インデックスを最下層の行インデックスに移動し、unstackはその逆を行います。

Python
stacked = pivot_table.stack()
print(stacked)

unstacked = stacked.unstack()
print(unstacked)
Plaintext
# print(stacked)
Shop  Product       
A     X        Sales    220
      Y        Sales    150
B     X        Sales    200
      Y        Sales    430
dtype: int64
Plaintext
# print(unstacked)
              Sales
Shop Product       
A    X          220
     Y          150
B    X          200
     Y          430

5. 欠損値の扱い (fill_value)

データに欠損値がある場合、fill_valueで埋めることができます。下の例ではfill_value=0としているので、欠損値に対してゼロで埋めていきます。

Python
data_with_nan = {'Shop': ['A', 'A', 'B'], 'Product': ['X', 'Y', 'X'], 'Sales': [100, np.nan, 200]}
df_with_nan = pd.DataFrame(data_with_nan)

pivot_table_with_nan = pd.pivot_table(df_with_nan, values='Sales', index='Shop', aggfunc='sum', fill_value=0)
print(pivot_table_with_nan)
Plaintext
      Sales
Shop       
A     100.0
B     200.0

6. マージン(合計)の表示 (margins)

margins=Trueで合計を表示します。

Python
pivot_table_with_margins = pd.pivot_table(df, values='Sales', index='Shop', aggfunc='sum', margins=True, margins_name='Sum')
print(pivot_table_with_margins)
Plaintext
      Sales
Shop       
A       370
B       630
Sum    1000

7. 実践的な応用例

例えば、顧客のアンケートデータを用いて、性別ごとの満足度を分析することができます。また、売上データと広告データを組み合わせて、広告の効果を分析することもできます。作成したピボットテーブルを元にMatplotlibやSeabornでグラフを作成することで、分析結果を視覚的に表現できます。

8. その他の高度なトピック

その他のトピックについては、別の記事にしたいと思います。

関連するWEBサイト

今回も少しだけPRです。

Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。

「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。

最後まで読んでいただきありがとうございます。73

モバイルバージョンを終了