Pandasでピボットテーブルを作成し集計する方法

プログラミング

Pandasでピボットテーブルを作成し集計する方法

Pandasライブラリは、Pythonにおけるデータ分析のための強力なツールであり、その中でもpivot_table関数は、データの集計と再構成を直感的に行うための非常に便利な機能です。この関数を用いることで、複雑なデータセットから特定の視点での洞察を得ることが容易になります。

pivot_table関数の基本構造

pivot_table関数は、主に以下の引数を受け取ります。

  • data: 集計対象のDataFrame。
  • values: 集計する対象の列名(複数指定可能)。
  • index: 集計結果の行に表示する列名(複数指定可能)。
  • columns: 集計結果の列に表示する列名(複数指定可能)。
  • aggfunc: 集計関数を指定します。デフォルトは'mean'(平均)です。'sum'(合計)、'count'(件数)、'min'(最小値)、'max'(最大値)なども指定できます。複数の関数をリストで指定することも可能です。
  • fill_value: 集計結果で欠損値(NaN)になった部分を埋める値を指定します。
  • margins: Trueに設定すると、行と列の合計(総計)が表示されます。デフォルトはFalseです。
  • margins_name: margins=Trueの場合の合計行・列の名前を指定します。デフォルトは'All'です。

実践的な例:売上データの集計

例えば、以下のような売上データがあるとします。

import pandas as pd

data = {
    '地域': ['東日本', '東日本', '西日本', '東日本', '西日本', '東日本', '西日本', '西日本', '東日本', '西日本'],
    '商品': ['A', 'B', 'A', 'A', 'B', 'C', 'A', 'C', 'B', 'A'],
    '売上': [100, 150, 200, 120, 180, 90, 220, 110, 160, 230]
}
df = pd.DataFrame(data)
print("元のDataFrame:")
print(df)

このデータを用いて、地域ごとの商品別売上合計を計算してみましょう。

pivot_df_sum = pd.pivot_table(df, values='売上', index='地域', columns='商品', aggfunc='sum')
print("n地域ごとの商品別売上合計:")
print(pivot_df_sum)

このコードは、「地域」を行、「商品」を列とし、各セルの値として「売上」の合計を計算します。結果として、地域ごとにどの商品がどれだけ売れたかの全体像を把握できます。

集計関数の変更と複数集計

aggfunc引数を変更することで、様々な集計が可能です。例えば、平均売上を計算したい場合は、aggfunc='mean'とします。

pivot_df_mean = pd.pivot_table(df, values='売上', index='地域', columns='商品', aggfunc='mean')
print("n地域ごとの商品別平均売上:")
print(pivot_df_mean)

さらに、複数の集計関数を同時に適用することもできます。例えば、売上合計と平均売上を同時に表示したい場合は、aggfuncにリストで指定します。

pivot_df_multi_agg = pd.pivot_table(df, values='売上', index='地域', columns='商品', aggfunc=['sum', 'mean'])
print("n地域ごとの商品別売上合計と平均:")
print(pivot_df_multi_agg)

行・列の複数指定と総計の表示

indexcolumnsに複数の列を指定することで、より詳細な階層構造を持つピボットテーブルを作成できます。例えば、「地域」と「月」(架空のデータ)で集計する場合などです。

また、margins=Trueを設定することで、各行・各列の合計値(総計)を簡単に表示させることができます。これは、全体の傾向を把握する上で非常に役立ちます。

pivot_df_margins = pd.pivot_table(df, values='売上', index='地域', columns='商品', aggfunc='sum', margins=True, margins_name='総計')
print("n総計付きの地域ごとの商品別売上合計:")
print(pivot_df_margins)

欠損値の処理 (fill_value)

データによっては、特定の組み合わせが存在しないために、ピボットテーブルのセルが欠損値(NaN)になることがあります。このような場合、fill_value引数を使って、これらの欠損値を任意の数値(例えば0)で埋めることができます。

# 例として、商品'C'が西日本に存在しない場合を想定
# (実際のデータでは上記例では存在するので、ここでは仮のデータで説明)
pivot_df_fill = pd.pivot_table(df, values='売上', index='地域', columns='商品', aggfunc='sum', fill_value=0)
print("n欠損値を0で埋めた地域ごとの商品別売上合計:")
print(pivot_df_fill)

pivot_tableとgroupbyの比較

pivot_tableは、groupbyメソッドと集計関数を組み合わせたものと似ていますが、pivot_tableはより視覚的に分かりやすい形式で結果を提示することに特化しています。特に、columns引数を使ってデータを広げたい場合や、行・列に複数の要素を配置したい場合に、pivot_tableが優位性を発揮します。

しかし、単純な集計(例: 地域ごとの売上合計のみ)であれば、groupbyの方が簡潔に記述できる場合もあります。

groupby_sum = df.groupby('地域')['売上'].sum()
print("ngroupbyによる地域ごとの売上合計:")
print(groupby_sum)

pivot_tableは、データの「棚卸し」や「クロス集計」という観点から、データ分析において非常に強力なツールです。提供される多様なオプションを理解し、活用することで、データからより深い洞察を引き出すことが可能になります。

まとめ

Pandasのpivot_table関数は、データの集計、変換、および要約を行うための非常に強力で柔軟なツールです。indexcolumnsvaluesaggfuncといった主要な引数を組み合わせることで、多角的な分析が可能になります。特に、クロス集計表の作成や、複数の集計軸を設定したい場合にその真価を発揮します。fill_valuemarginsといったオプションを活用することで、より見やすく、実用的な分析結果を得ることができます。groupbyと比較検討しながら、状況に応じて適切な関数を選択することが、効果的なデータ分析への近道となるでしょう。