Pythonデータ分析レシピ集

Python Pandasでデータをグループ化して集計する:groupby活用の基本レシピ

Tags: Python, Pandas, データ分析, グループ化, 集計

はじめに

データ分析において、大量のデータをただ眺めるだけでは、そこから意味のある洞察を得ることは困難です。多くの場合、特定の基準に基づいてデータを「グループ化」し、それぞれのグループ内で合計値や平均値、最大値などの「集計」を行うことで、データの傾向やパターンを明確に把握できるようになります。例えば、顧客の購入履歴データから製品カテゴリごとの総売上を調べたり、地域ごとの平均気温を比較したりする際に、このグループ化と集計の処理が不可欠となります。

この記事では、Pythonのデータ分析ライブラリであるPandasのgroupby()メソッドを活用し、データを効率的にグループ化して集計する基本的な手順と、その詳細な解説を提供します。このレシピを通じて、お手元のデータを自在に集計し、ビジネスや研究における重要な意思決定に役立てるための第一歩を踏み出せるでしょう。

問題提起:データの集計タスクを効率化したい

あなたは以下のようなデータ分析タスクに直面していませんか。

これらのタスクは、データフレーム全体に対して単純な統計関数を適用するだけでは解決できません。特定の基準(カテゴリ、店舗、月、地域など)でデータを分割し、それぞれのグループ内で集計処理を行う必要があります。手動でデータをフィルタリングしては集計を繰り返す方法は、データ量が増えるにつれて非効率的になり、ミスも発生しやすくなります。

Pandasのgroupby()メソッドは、このような複雑な集計タスクを効率的かつ正確に実行するための強力なツールです。このメソッドは、「分割(Split)」「適用(Apply)」「結合(Combine)」という3つのステップを経て集計を行います。

解決策(コードレシピ):Pandas groupby()によるデータ集計

ここでは、架空の売上データを用いて、groupby()メソッドによる基本的な集計方法を紹介します。

1. 必要なライブラリのインポートとサンプルデータの準備

まず、Pandasライブラリをインポートし、分析に使用するサンプルデータ(DataFrame)を作成します。

import pandas as pd
import numpy as np

# サンプルデータの作成
data = {
    '支店': ['東京', '大阪', '東京', '名古屋', '大阪', '東京', '名古屋', '大阪'],
    '商品カテゴリ': ['家電', '食品', '家電', '日用品', '食品', '日用品', '家電', '日用品'],
    '売上': [10000, 5000, 15000, 3000, 7000, 4000, 12000, 6000],
    '数量': [2, 1, 3, 1, 2, 1, 2, 1],
    '評価': [4, 5, 3, 4, 5, 3, 4, 4]
}
df = pd.DataFrame(data)

print("元のデータフレーム:")
print(df)

2. 単一の基準でグループ化し、単一の集計関数を適用する

最も基本的な集計方法として、「支店」ごとに「売上」の合計を計算してみましょう。

# 支店ごとの売上合計
sales_by_branch = df.groupby('支店')['売上'].sum()

print("\n支店ごとの売上合計:")
print(sales_by_branch)

3. 複数の基準でグループ化し、単一の集計関数を適用する

次に、「支店」と「商品カテゴリ」の組み合わせごとに「売上」の平均を計算してみます。

# 支店と商品カテゴリごとの売上平均
avg_sales_by_branch_category = df.groupby(['支店', '商品カテゴリ'])['売上'].mean()

print("\n支店と商品カテゴリごとの売上平均:")
print(avg_sales_by_branch_category)

4. 複数の集計関数を適用する(agg()メソッドの利用)

一つのグループに対して、複数の統計量(合計、平均、個数など)を一度に計算したい場合があります。その際にはagg()メソッドが非常に便利です。

# 商品カテゴリごとの売上合計、平均、件数を計算
summary_by_category = df.groupby('商品カテゴリ')['売上'].agg(['sum', 'mean', 'count'])

print("\n商品カテゴリごとの売上サマリー:")
print(summary_by_category)

5. agg()メソッドで列ごとに異なる集計関数を適用し、新しい列名を指定する

さらに柔軟に、異なる列に対して異なる集計関数を適用し、結果の列に分かりやすい名前をつけたい場合は、辞書形式でagg()メソッドに渡します。

# 支店ごとに、売上合計、数量の平均、評価の最大値を計算
custom_summary_by_branch = df.groupby('支店').agg(
    合計売上=('売上', 'sum'),
    平均数量=('数量', 'mean'),
    最高評価=('評価', 'max')
)

print("\n支店ごとのカスタムサマリー:")
print(custom_summary_by_branch)

6. グループ化結果のインデックスをリセットする

groupby()の実行結果は、グループ化に使用した列がインデックスとなる場合があります。これを通常のデータ列として扱いたい場合は、reset_index()を使用します。

# 支店ごとの売上合計を計算し、インデックスをリセット
sales_by_branch_reset = df.groupby('支店')['売上'].sum().reset_index()

print("\n支店ごとの売上合計 (インデックスリセット後):")
print(sales_by_branch_reset)

コードの詳細解説

ここでは、上記のコードレシピで紹介したPandas groupby()メソッドと関連機能について、一つずつ丁寧に解説していきます。

1. df.groupby('列名')またはdf.groupby(['列名1', '列名2'])

2. ['集計対象列名'].集計関数()

3. agg()メソッド

4. reset_index()

よくあるエラーとその解決策

まとめ

この記事では、Pandasライブラリのgroupby()メソッドを用いたデータ集計の基本的なレシピと、その詳細な解説を提供しました。

groupby()はデータ分析において非常に強力で頻繁に利用される機能の一つです。このレシピで学んだ知識とコードを活用することで、お手元のデータを様々な角度から分析し、より深い洞察を得ることが可能になります。ぜひ、ご自身のデータで試して、その便利さを実感してください。