Pandasの groupby
と agg
は、データ分析で最もよく使われる強力な集計手法です。
特に大量のデータをカテゴリー別にまとめて統計値を算出する場面で大活躍します。
ここでは基礎から実践的なテクニックまで、できるだけ詳しく解説します。
目次
基本の流れ
Pandasでの典型的な集計手順は以下のようになります。
df.groupby("列名").agg(集計方法)
※このコード単体では、出力はできません。
つまり、
- groupby で「どの列を基準にグループ化するか」を指定
- agg で「各グループに対してどんな計算を行うか」を指定
シンプルな例
データ例
import pandas as pd
data = {
"部署": ["営業", "営業", "開発", "開発", "総務", "営業", "総務"],
"社員": ["A", "B", "C", "D", "E", "F", "G"],
"売上": [100, 200, 150, 120, 90, 300, 50],
"残業時間": [10, 5, 20, 15, 2, 7, 1]
}
df = pd.DataFrame(data)
print(df)
部署ごとの売上合計
df.groupby("部署")["売上"].sum()
複数列を集計する
agg
を使うと、1つの列に対して複数の集計関数を適用できます。
df.groupby("部署")["売上"].agg(["sum", "mean", "max"])
複数列を同時に集計
列ごとに違う関数を適用することも可能です。
df.groupby("部署").agg({
"売上": ["sum", "mean"],
"残業時間": ["mean", "max"]
})
集計結果にカスタム関数を使う
例えば「残業効率 = 売上 ÷ 残業時間」を計算したい場合。
df.groupby("部署").apply(lambda g: g["売上"].sum() / g["残業時間"].sum())
グループ化を複数キーで行う
部署と社員の両方でグループ化も可能です。
df.groupby(["部署", "社員"])["売上"].sum()
インデックスをフラットにする
groupbyの結果は階層化されやすいですが、reset_index
を使ってフラットにできます。
df.groupby("部署", as_index=False).agg({"売上": "sum", "残業時間": "mean"})
よく使われる集計関数
sum()
:合計mean()
:平均max()
/min()
:最大・最小count()
:件数nunique()
:ユニーク数median()
:中央値std()
:標準偏差first()
/last()
:最初・最後の値
実務での活用例
- 売上データ → 商品カテゴリ別の売上合計・平均
- アクセスログ → ユーザーごとのアクセス回数、平均滞在時間
- 製造データ → ライン別の不良率
- マーケティング分析 → 広告キャンペーンごとのCPA(顧客獲得単価)
まとめ
groupby
は「どうグループ化するか」を指定agg
は「グループごとにどんな集計を行うか」を指定- 複数列・複数関数・カスタム関数も利用可能
- 実務でも売上・アクセス解析・製造分析など幅広く活用できる
以上、PythonのPandasのgroupby・aggでのデータ集計方法についてでした。
最後までお読みいただき、ありがとうございました。