🔍 ステップ29: グループ化と集計(groupby)
データを「〜ごと」にまとめて、集計できるようになろう!
ステップ28では、データ型の変換を学びました。今回は、groupby()を使ったグループ化と集計を学びます。「商品ごとの売上合計」「地域ごとの平均」など、データをグループに分けて集計する方法は、データ分析で最も重要なスキルの1つです。
📖 このステップで学ぶこと
・groupby()とは何か、なぜ必要なのか
・groupby()の基本的な使い方
・様々な集計関数(sum, mean, count など)
・agg()で複数の集計を一度に行う
・複数列でのグループ化
・実践例:売上分析
学習時間の目安: 3〜3.5時間
🎯 1. groupby()とは?
groupby()は、データをグループに分けて集計する機能です。「group by(〜でグループ化する)」という意味で、Excelのピボットテーブルに似た機能です。
🔰 なぜgroupby()が必要なのか?
データ分析では、「全体の合計」だけでなく「カテゴリごとの合計」を知りたいことが多いです。
💡 groupby()が必要な場面
・商品ごとの売上合計を知りたい
・地域ごとの平均売上を比較したい
・月ごとの売上推移を見たい
・担当者ごとの成績を集計したい
このような「〜ごとに」という集計には、groupby()が最適です。
📊 groupby()の仕組み
groupby()は、3つのステップで動作します。
📌 groupby()の3ステップ
| ステップ | 名前 | 説明 |
| 1 | Split(分割) | データをグループに分ける |
| 2 | Apply(適用) | 各グループに集計関数を適用する |
| 3 | Combine(結合) | 結果をまとめて返す |
例えば「商品ごとの売上合計」なら、①商品でグループに分ける → ②各グループの売上を合計する → ③結果をまとめる、という流れです。
📝 サンプルデータの準備
まず、この後の説明で使うサンプルデータを作成しましょう。
コード:サンプルデータの作成
import pandas as pd
# 売上データを作成
data = {
'日付': ['1/1', '1/1', '1/2', '1/2', '1/3', '1/3'],
'商品': ['りんご', 'バナナ', 'りんご', 'バナナ', 'りんご', 'みかん'],
'地域': ['東京', '大阪', '東京', '大阪', '名古屋', '東京'],
'売上': [1200, 900, 1500, 1100, 1000, 800],
'数量': [10, 6, 12, 7, 8, 5]
}
df = pd.DataFrame(data)
print("売上データ:")
print(df)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
売上データ: 日付 商品 地域 売上 数量 0 1/1 りんご 東京 1200 10 1 1/1 バナナ 大阪 900 6 2 1/2 りんご 東京 1500 12 3 1/2 バナナ 大阪 1100 7 4 1/3 りんご 名古屋 1000 8 5 1/3 みかん 東京 800 5
💡 このデータの構造
・6件の売上データがあります
・商品は「りんご」「バナナ」「みかん」の3種類
・地域は「東京」「大阪」「名古屋」の3地域
・このデータを使って、商品ごとや地域ごとの集計を学びます
📦 2. groupby()の基本
groupby()の基本的な使い方を学びましょう。
🔰 1つの列でグループ化
まずは、1つの列(商品)でグループ化して、売上を合計してみましょう。
📝 groupby()の書き方
df.groupby(‘グループ化する列’)[‘集計する列’].集計関数()
例:df.groupby(‘商品’)[‘売上’].sum()
・商品でグループ化して、売上を合計する
コード:商品ごとの売上合計
import pandas as pd
data = {
'日付': ['1/1', '1/1', '1/2', '1/2', '1/3', '1/3'],
'商品': ['りんご', 'バナナ', 'りんご', 'バナナ', 'りんご', 'みかん'],
'地域': ['東京', '大阪', '東京', '大阪', '名古屋', '東京'],
'売上': [1200, 900, 1500, 1100, 1000, 800],
'数量': [10, 6, 12, 7, 8, 5]
}
df = pd.DataFrame(data)
# 商品ごとの売上合計
product_sales = df.groupby('商品')['売上'].sum()
print("商品ごとの売上合計:")
print(product_sales)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
商品ごとの売上合計: 商品 みかん 800 バナナ 2000 りんご 3700 Name: 売上, dtype: int64
💡 コードの解説
df.groupby(‘商品’)
・「商品」列の値(りんご、バナナ、みかん)でグループに分ける
[‘売上’]
・集計したい列(売上)を指定
.sum()
・各グループの売上を合計する
結果の読み方
・みかんの売上合計: 800円(1件のみ)
・バナナの売上合計: 2000円(900 + 1100)
・りんごの売上合計: 3700円(1200 + 1500 + 1000)
📝 様々な集計関数
sum()以外にも、様々な集計関数を使えます。
📌 主な集計関数
| 関数 | 説明 | 使用例 |
| sum() | 合計 | 売上の合計 |
| mean() | 平均 | 平均売上 |
| count() | 件数 | 販売回数 |
| max() | 最大値 | 最高売上 |
| min() | 最小値 | 最低売上 |
| std() | 標準偏差 | 売上のばらつき |
| median() | 中央値 | 中央の売上 |
コード:様々な集計関数を使う
import pandas as pd
data = {
'商品': ['りんご', 'バナナ', 'りんご', 'バナナ', 'りんご', 'みかん'],
'売上': [1200, 900, 1500, 1100, 1000, 800]
}
df = pd.DataFrame(data)
# 商品ごとの様々な集計
print("【商品ごとの売上合計】")
print(df.groupby('商品')['売上'].sum())
print()
print("【商品ごとの売上平均】")
print(df.groupby('商品')['売上'].mean())
print()
print("【商品ごとの販売回数】")
print(df.groupby('商品')['売上'].count())
print()
print("【商品ごとの最高売上】")
print(df.groupby('商品')['売上'].max())
print()
print("【商品ごとの最低売上】")
print(df.groupby('商品')['売上'].min())
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【商品ごとの売上合計】 商品 みかん 800 バナナ 2000 りんご 3700 Name: 売上, dtype: int64 【商品ごとの売上平均】 商品 みかん 800.000000 バナナ 1000.000000 りんご 1233.333333 Name: 売上, dtype: float64 【商品ごとの販売回数】 商品 みかん 1 バナナ 2 りんご 3 Name: 売上, dtype: int64 【商品ごとの最高売上】 商品 みかん 800 バナナ 1100 りんご 1500 Name: 売上, dtype: int64 【商品ごとの最低売上】 商品 みかん 800 バナナ 900 りんご 1000 Name: 売上, dtype: int64
💡 結果の分析
りんご:3回売れて、合計3700円、平均約1233円
バナナ:2回売れて、合計2000円、平均1000円
みかん:1回売れて、合計800円
このように、商品ごとの販売状況が一目でわかります!
📊 3. agg()で複数の集計を一度に
agg()を使うと、複数の集計を一度に行えます。これにより、コードが短くなり、結果も見やすくなります。
🔰 agg()の基本
📝 agg()の書き方
df.groupby(‘列名’)[‘集計列’].agg([‘関数1’, ‘関数2’, …])
・リストで複数の集計関数を指定できます
コード:agg()で複数の集計
import pandas as pd
data = {
'商品': ['りんご', 'バナナ', 'りんご', 'バナナ', 'りんご', 'みかん'],
'売上': [1200, 900, 1500, 1100, 1000, 800]
}
df = pd.DataFrame(data)
# agg()で複数の集計を一度に
summary = df.groupby('商品')['売上'].agg(['sum', 'mean', 'count', 'max', 'min'])
print("商品ごとの詳細集計:")
print(summary)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
商品ごとの詳細集計:
sum mean count max min
商品
みかん 800 800.000000 1 800 800
バナナ 2000 1000.000000 2 1100 900
りんご 3700 1233.333333 3 1500 1000
💡 agg()のメリット
・1行のコードで複数の集計結果を取得できる
・結果がDataFrameで返されるので、そのまま分析や可視化に使える
・列名が自動的に集計関数名になる(sum, mean, count など)
📝 列ごとに異なる集計
agg()を使うと、列ごとに異なる集計関数を適用することもできます。
📝 列ごとに異なる集計の書き方
df.groupby(‘列名’).agg({‘列A’: ‘関数1’, ‘列B’: ‘関数2’})
・辞書形式で、列名と集計関数のペアを指定します
コード:列ごとに異なる集計
import pandas as pd
data = {
'地域': ['東京', '大阪', '東京', '大阪', '名古屋', '東京'],
'売上': [1200, 900, 1500, 1100, 1000, 800],
'数量': [10, 6, 12, 7, 8, 5]
}
df = pd.DataFrame(data)
# 列ごとに異なる集計
# 売上は合計と平均、数量は合計と最大
result = df.groupby('地域').agg({
'売上': ['sum', 'mean'],
'数量': ['sum', 'max']
})
print("地域ごとのカスタム集計:")
print(result)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
地域ごとのカスタム集計:
売上 数量
sum mean sum max
地域
名古屋 1000 1000.000000 8 8
大阪 2000 1000.000000 13 7
東京 4500 1500.000000 27 12
💡 結果の読み方
列が階層構造になっています:
・売上 – sum:売上の合計
・売上 – mean:売上の平均
・数量 – sum:数量の合計
・数量 – max:数量の最大値
このように、列ごとに必要な集計だけを行えます。
🔢 4. 複数列でグループ化
2つ以上の列でグループ化することもできます。「商品と地域の組み合わせ」で集計したい場合などに使います。
🔰 2つの列でグループ化
📝 複数列でグループ化の書き方
df.groupby([‘列1’, ‘列2’])[‘集計列’].集計関数()
・リストで複数の列を指定します
コード:商品と地域でグループ化
import pandas as pd
data = {
'商品': ['りんご', 'バナナ', 'りんご', 'バナナ', 'りんご', 'みかん'],
'地域': ['東京', '大阪', '東京', '大阪', '名古屋', '東京'],
'売上': [1200, 900, 1500, 1100, 1000, 800]
}
df = pd.DataFrame(data)
# 商品と地域の組み合わせで集計
result = df.groupby(['商品', '地域'])['売上'].sum()
print("商品×地域の売上合計:")
print(result)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
商品×地域の売上合計:
商品 地域
みかん 東京 800
バナナ 大阪 2000
りんご 名古屋 1000
東京 2700
Name: 売上, dtype: int64
💡 結果の読み方
・みかん × 東京:800円
・バナナ × 大阪:2000円(900 + 1100)
・りんご × 名古屋:1000円
・りんご × 東京:2700円(1200 + 1500)
このように、商品と地域の組み合わせごとに集計されます。
📝 reset_index()でDataFrame形式に
複数列でグループ化すると、結果がMultiIndex(階層インデックス)になります。reset_index()を使うと、通常のDataFrame形式に変換できます。
コード:reset_index()でDataFrame形式に
import pandas as pd
data = {
'商品': ['りんご', 'バナナ', 'りんご', 'バナナ', 'りんご', 'みかん'],
'地域': ['東京', '大阪', '東京', '大阪', '名古屋', '東京'],
'売上': [1200, 900, 1500, 1100, 1000, 800]
}
df = pd.DataFrame(data)
# reset_index()でDataFrame形式に変換
result = df.groupby(['商品', '地域'])['売上'].sum().reset_index()
print("DataFrame形式:")
print(result)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
DataFrame形式:
商品 地域 売上
0 みかん 東京 800
1 バナナ 大阪 2000
2 りんご 名古屋 1000
3 りんご 東京 2700
💡 reset_index()を使う理由
・DataFrame形式の方が扱いやすい
・そのままCSVに保存できる
・グラフを描く時に便利
・他の処理(並び替え、フィルタリングなど)がしやすい
📝 複数の列を集計
集計したい列も複数指定できます。
コード:売上と数量を同時に集計
import pandas as pd
data = {
'商品': ['りんご', 'バナナ', 'りんご', 'バナナ', 'りんご', 'みかん'],
'地域': ['東京', '大阪', '東京', '大阪', '名古屋', '東京'],
'売上': [1200, 900, 1500, 1100, 1000, 800],
'数量': [10, 6, 12, 7, 8, 5]
}
df = pd.DataFrame(data)
# 地域ごとに売上と数量を集計
# リストで複数の列を指定
result = df.groupby('地域')[['売上', '数量']].sum()
print("地域ごとの売上と数量:")
print(result)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
地域ごとの売上と数量:
売上 数量
地域
名古屋 1000 8
大阪 2000 13
東京 4500 27
📈 5. 実践例:売上分析
ここまで学んだことを使って、実践的な売上分析をしてみましょう。
📊 月別売上集計
コード:月別売上の分析
import pandas as pd
# 月別売上データ
data = {
'月': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'商品': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'売上': [100, 150, 120, 110, 160, 130, 105, 155, 125]
}
df = pd.DataFrame(data)
print("【元のデータ】")
print(df)
print()
# 月ごとの売上合計
print("【月別売上合計】")
monthly_total = df.groupby('月')['売上'].sum()
print(monthly_total)
print()
# 商品ごとの売上合計
print("【商品別売上合計】")
product_total = df.groupby('商品')['売上'].sum()
print(product_total)
print()
# 月×商品の売上
print("【月×商品の売上】")
monthly_product = df.groupby(['月', '商品'])['売上'].sum().reset_index()
print(monthly_product)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【元のデータ】 月 商品 売上 0 1 A 100 1 1 B 150 2 1 C 120 3 2 A 110 4 2 B 160 5 2 C 130 6 3 A 105 7 3 B 155 8 3 C 125 【月別売上合計】 月 1 370 2 400 3 385 Name: 売上, dtype: int64 【商品別売上合計】 商品 A 315 B 465 C 375 Name: 売上, dtype: int64 【月×商品の売上】 月 商品 売上 0 1 A 100 1 1 B 150 2 1 C 120 3 2 A 110 4 2 B 160 5 2 C 130 6 3 A 105 7 3 B 155 8 3 C 125
💡 分析結果からわかること
月別:2月が最も売上が高い(400)
商品別:商品Bが最も売れている(465)
詳細:2月の商品Bが最高売上(160)
📊 担当者別の成績分析
コード:担当者別の成績分析
import pandas as pd
# 担当者別売上データ
data = {
'担当者': ['田中', '佐藤', '田中', '佐藤', '田中', '鈴木', '鈴木'],
'地域': ['東京', '大阪', '東京', '大阪', '名古屋', '東京', '大阪'],
'売上': [120, 150, 135, 140, 110, 125, 145]
}
df = pd.DataFrame(data)
print("【元のデータ】")
print(df)
print()
# 担当者ごとの集計
print("【担当者別の成績】")
result = df.groupby('担当者').agg({
'売上': ['sum', 'mean', 'count']
})
# 列名をわかりやすく
result.columns = ['売上合計', '平均売上', '件数']
print(result)
print()
# 売上合計でランキング
print("【売上ランキング】")
ranking = df.groupby('担当者')['売上'].sum().sort_values(ascending=False)
print(ranking)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【元のデータ】
担当者 地域 売上
0 田中 東京 120
1 佐藤 大阪 150
2 田中 東京 135
3 佐藤 大阪 140
4 田中 名古屋 110
5 鈴木 東京 125
6 鈴木 大阪 145
【担当者別の成績】
売上合計 平均売上 件数
担当者
佐藤 290 145.000000 2
田中 365 121.666667 3
鈴木 270 135.000000 2
【売上ランキング】
担当者
田中 365
佐藤 290
鈴木 270
Name: 売上, dtype: int64
💡 分析結果からわかること
売上合計1位:田中さん(365円)- 件数が多い
平均売上1位:佐藤さん(145円)- 1件あたりの売上が高い
このように、合計と平均の両方を見ると、より深い分析ができます。
📝 練習問題
ここまで学んだことを、実際に手を動かして確認しましょう。
問題1:基本的なグループ化(初級)
📋 問題
以下のデータを「部門」ごとにグループ化し、「給料」の合計と平均を求めてください。
・名前: [‘太郎’, ‘花子’, ‘次郎’, ‘美咲’, ‘健太’]
・部門: [‘営業’, ‘開発’, ‘営業’, ‘開発’, ‘営業’]
・給料: [300, 350, 280, 380, 320]
解答例を見る
コード
import pandas as pd
data = {
'名前': ['太郎', '花子', '次郎', '美咲', '健太'],
'部門': ['営業', '開発', '営業', '開発', '営業'],
'給料': [300, 350, 280, 380, 320]
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print()
# 部門ごとの給料の合計
print("部門ごとの給料合計:")
print(df.groupby('部門')['給料'].sum())
print()
# 部門ごとの給料の平均
print("部門ごとの給料平均:")
print(df.groupby('部門')['給料'].mean())
print()
# まとめて表示
print("部門ごとの集計:")
print(df.groupby('部門')['給料'].agg(['sum', 'mean', 'count']))
実行結果
元のデータ:
名前 部門 給料
0 太郎 営業 300
1 花子 開発 350
2 次郎 営業 280
3 美咲 開発 380
4 健太 営業 320
部門ごとの給料合計:
部門
営業 900
開発 730
Name: 給料, dtype: int64
部門ごとの給料平均:
部門
営業 300.0
開発 365.0
Name: 給料, dtype: float64
部門ごとの集計:
sum mean count
部門
営業 900 300.0 3
開発 730 365.0 2
問題2:複数列の集計(初級)
📋 問題
以下のデータを「地域」ごとにグループ化し、「売上」と「数量」の両方の合計を求めてください。
・地域: [‘東京’, ‘大阪’, ‘東京’, ‘大阪’, ‘名古屋’]
・売上: [1200, 900, 1500, 1100, 1000]
・数量: [10, 6, 12, 7, 8]
解答例を見る
コード
import pandas as pd
data = {
'地域': ['東京', '大阪', '東京', '大阪', '名古屋'],
'売上': [1200, 900, 1500, 1100, 1000],
'数量': [10, 6, 12, 7, 8]
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print()
# 地域ごとに売上と数量の合計
result = df.groupby('地域')[['売上', '数量']].sum()
print("地域ごとの売上と数量:")
print(result)
実行結果
元のデータ:
地域 売上 数量
0 東京 1200 10
1 大阪 900 6
2 東京 1500 12
3 大阪 1100 7
4 名古屋 1000 8
地域ごとの売上と数量:
売上 数量
地域
名古屋 1000 8
大阪 2000 13
東京 2700 22
問題3:複数列でのグループ化(中級)
📋 問題
以下のデータを「地域」と「商品」でグループ化し、「売上」の合計を求めてください。結果はDataFrame形式で表示してください。
・地域: [‘東京’, ‘東京’, ‘大阪’, ‘大阪’, ‘名古屋’, ‘名古屋’]
・商品: [‘A’, ‘B’, ‘A’, ‘B’, ‘A’, ‘B’]
・売上: [100, 120, 90, 110, 95, 105]
解答例を見る
コード
import pandas as pd
data = {
'地域': ['東京', '東京', '大阪', '大阪', '名古屋', '名古屋'],
'商品': ['A', 'B', 'A', 'B', 'A', 'B'],
'売上': [100, 120, 90, 110, 95, 105]
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print()
# 地域と商品でグループ化(DataFrame形式)
result = df.groupby(['地域', '商品'])['売上'].sum().reset_index()
print("地域×商品の売上合計:")
print(result)
実行結果
元のデータ:
地域 商品 売上
0 東京 A 100
1 東京 B 120
2 大阪 A 90
3 大阪 B 110
4 名古屋 A 95
5 名古屋 B 105
地域×商品の売上合計:
地域 商品 売上
0 名古屋 A 95
1 名古屋 B 105
2 大阪 A 90
3 大阪 B 110
4 東京 A 100
5 東京 B 120
問題4:列ごとに異なる集計(中級)
📋 問題
以下のテストデータを「クラス」ごとにグループ化し、数学は平均点、英語は最高点、国語は最低点を求めてください。
・クラス: [‘A’, ‘A’, ‘B’, ‘B’, ‘A’, ‘B’]
・数学: [85, 92, 78, 88, 90, 82]
・英語: [90, 88, 85, 92, 87, 89]
・国語: [78, 85, 88, 82, 92, 86]
解答例を見る
コード
import pandas as pd
data = {
'クラス': ['A', 'A', 'B', 'B', 'A', 'B'],
'数学': [85, 92, 78, 88, 90, 82],
'英語': [90, 88, 85, 92, 87, 89],
'国語': [78, 85, 88, 82, 92, 86]
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print()
# 列ごとに異なる集計
result = df.groupby('クラス').agg({
'数学': 'mean',
'英語': 'max',
'国語': 'min'
})
print("クラスごとの集計:")
print(result.round(1))
実行結果
元のデータ:
クラス 数学 英語 国語
0 A 85 90 78
1 A 92 88 85
2 B 78 85 88
3 B 88 92 82
4 A 90 87 92
5 B 82 89 86
クラスごとの集計:
数学 英語 国語
クラス
A 89.0 90 78
B 82.7 92 82
問題5:総合演習 – 売上分析レポート(上級)
📋 問題
以下の売上データについて:
1. 月ごとの総売上を計算
2. 商品ごとの平均売上を計算
3. 最も売上が高かった月と商品の組み合わせを見つける
・月: [1, 1, 1, 2, 2, 2, 3, 3, 3]
・商品: [‘A’, ‘B’, ‘C’, ‘A’, ‘B’, ‘C’, ‘A’, ‘B’, ‘C’]
・売上: [120, 150, 130, 135, 160, 125, 140, 155, 135]
解答例を見る
コード
import pandas as pd
data = {
'月': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'商品': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'売上': [120, 150, 130, 135, 160, 125, 140, 155, 135]
}
df = pd.DataFrame(data)
print("="*40)
print("売上分析レポート")
print("="*40)
# 1. 月ごとの総売上
print("\n【1. 月ごとの総売上】")
monthly_total = df.groupby('月')['売上'].sum()
print(monthly_total)
# 2. 商品ごとの平均売上
print("\n【2. 商品ごとの平均売上】")
product_avg = df.groupby('商品')['売上'].mean().round(1)
print(product_avg)
# 3. 最も売上が高かった月×商品
print("\n【3. 最高売上の月×商品】")
monthly_product = df.groupby(['月', '商品'])['売上'].sum().reset_index()
max_idx = monthly_product['売上'].idxmax()
max_row = monthly_product.loc[max_idx]
print(f"{int(max_row['月'])}月の商品{max_row['商品']}: {int(max_row['売上'])}円")
実行結果
======================================== 売上分析レポート ======================================== 【1. 月ごとの総売上】 月 1 400 2 420 3 430 Name: 売上, dtype: int64 【2. 商品ごとの平均売上】 商品 A 131.7 B 155.0 C 130.0 Name: 売上, dtype: float64 【3. 最高売上の月×商品】 2月の商品B: 160円
問題6:顧客分析(上級)
📋 問題
以下の顧客データについて、年齢層ごとの購入金額の合計、平均、件数を集計してください。
・顧客ID: [1, 1, 2, 2, 3, 3, 4, 4]
・年齢層: [’20代’, ’20代’, ’30代’, ’30代’, ’40代’, ’40代’, ’20代’, ’20代’]
・購入金額: [3000, 2500, 5000, 4500, 6000, 5500, 2000, 2200]
解答例を見る
コード
import pandas as pd
data = {
'顧客ID': [1, 1, 2, 2, 3, 3, 4, 4],
'年齢層': ['20代', '20代', '30代', '30代', '40代', '40代', '20代', '20代'],
'購入金額': [3000, 2500, 5000, 4500, 6000, 5500, 2000, 2200]
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print()
# 年齢層ごとの分析
result = df.groupby('年齢層')['購入金額'].agg(['sum', 'mean', 'count'])
result.columns = ['合計', '平均', '件数']
print("年齢層別の購入分析:")
print(result)
print()
# 購入金額合計でランキング
print("購入金額合計ランキング:")
ranking = df.groupby('年齢層')['購入金額'].sum().sort_values(ascending=False)
print(ranking)
実行結果
元のデータ:
顧客ID 年齢層 購入金額
0 1 20代 3000
1 1 20代 2500
2 2 30代 5000
3 2 30代 4500
4 3 40代 6000
5 3 40代 5500
6 4 20代 2000
7 4 20代 2200
年齢層別の購入分析:
合計 平均 件数
年齢層
20代 9700 2425.0 4
30代 9500 4750.0 2
40代 11500 5750.0 2
購入金額合計ランキング:
年齢層
40代 11500
20代 9700
30代 9500
Name: 購入金額, dtype: int64
🎯 このステップのまとめ
✅ 学んだこと
✓ groupby()でデータをグループに分けて集計できる
✓ sum(), mean(), count()などの集計関数が使える
✓ agg()で複数の集計を一度に実行できる
✓ 複数列でグループ化できる
✓ 列ごとに異なる集計方法を指定できる
✓ reset_index()でDataFrame形式に変換できる
✓ 実務で使える売上分析の方法を学んだ
💡 次のステップに進む前に確認
以下のことができるようになったか確認しましょう:
□ groupby()でグループ化できますか?
□ 様々な集計関数を使えますか?
□ agg()で複数の集計ができますか?
□ 複数列でグループ化できますか?
□ 実務的な集計分析ができますか?
これらができたら、次のステップに進みましょう!
❓ よくある質問
Q1: groupby()とvalue_counts()の違いは?
A: value_counts()は各値の出現回数を数えるだけです。groupby()はグループごとに様々な集計(合計、平均など)ができます。value_counts()は、groupby()とcount()の特殊なケースと考えられます。
Q2: reset_index()はいつ使うべき?
A: groupby()の結果をDataFrameとして使いたいとき、グラフを描きたいとき、CSVに保存したいときに使います。reset_index()なしだとSeriesやMultiIndexになり、扱いにくい場合があります。
Q3: グループ化の順番は結果に影響しますか?
A: はい、groupby(['A', 'B'])とgroupby(['B', 'A'])では結果の並び順が変わります。ただし、集計値自体は同じです。インデックスの階層構造が変わるので、用途に応じて選んでください。
Q4: 集計結果に列名をつけたいです
A: result.columns = ['新しい列名1', '新しい列名2', ...]のように代入するか、rename()で後から変更できます。agg()の中で辞書形式で指定する方法もあります。
Q5: グループごとに上位N件を取得したいです
A: df.groupby('列名').head(N)を使うと、各グループの上位N件を取得できます。または、nlargest()やnsmallest()も便利です。
学習メモ
Pythonデータ分析入門 - Step 29