Step 29:グループ化と集計(groupby)

🔍 ステップ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

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE