0Pricing
R Academy · レッスン

グループ別集計とgroup_by()

グループごとにデータを集計し、各グループの統計量を計算します。

「グループ別集計とgroup_by()」はCoddyKit上の無料R Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

データをグループ化する理由

データのグループ化は、データ分析で最も強力な操作の 1 つです。データセット全体で統計量を計算するのではなく、各グループ内で計算します。dplyr パッケージでは、group_by() に続けて summarize() を使うことで、直感的に実行できます。

library(dplyr)

# Sample sales data
sales <- data.frame(
  region = c('North','North','South','South','East'),
  revenue = c(120, 95, 200, 175, 88),
  units = c(10, 8, 15, 12, 7)
)

print(sales)

group_by() の基本

group_by(col) は、後続の操作がグループごとに行われるようデータフレームに印を付けます。データ自体は変更せず、グループ化のメタデータを追加します。1 列でも複数列でもグループ化できます。

library(dplyr)

sales <- data.frame(
  region = c('North','North','South','South','East'),
  revenue = c(120, 95, 200, 175, 88),
  units = c(10, 8, 15, 12, 7)
)

# Group by region
grouped <- sales %>% group_by(region)
print(grouped)
print(group_keys(grouped))

group_by() の後の summarize()

summarize()(または summarise())は、各グループを 1 行にまとめます。新しい列名と、適用する集計関数を指定します。よく使う関数には、n()、mean()、sum()、min()、max() があります。

library(dplyr)

sales <- data.frame(
  region = c('North','North','South','South','East'),
  revenue = c(120, 95, 200, 175, 88),
  units = c(10, 8, 15, 12, 7)
)

sales %>%
  group_by(region) %>%
  summarize(
    n = n(),
    mean_revenue = mean(revenue),
    total_units = sum(units)
  )

n() によるカウント

summarize() 内の n() は、各グループの行数を返します。引数は必要ありません。条件に一致する行を数えるには、sum(condition) を使います。n_distinct(col) は一意な値の数を数えます。

library(dplyr)

employees <- data.frame(
  dept = c('HR','HR','Eng','Eng','Eng','Sales'),
  salary = c(55000, 60000, 95000, 105000, 90000, 70000),
  senior = c(FALSE, TRUE, TRUE, TRUE, FALSE, FALSE)
)

employees %>%
  group_by(dept) %>%
  summarize(
    count = n(),
    senior_count = sum(senior),
    avg_salary = mean(salary)
  )

複数列によるグループ化

group_by() には複数の列を渡せます。データに存在する値のあらゆる組み合わせによってグループが作られます。クロス集計や階層的な集計に便利です。

library(dplyr)

orders <- data.frame(
  region = c('North','North','South','South','North','South'),
  product = c('A','B','A','B','A','A'),
  sales = c(100, 200, 150, 250, 120, 180)
)

orders %>%
  group_by(region, product) %>%
  summarize(
    total_sales = sum(sales),
    orders = n(),
    .groups = 'drop'
  )

.groups 引数

summarize() の後、結果は最後のグループ化変数以外のすべてで引き続きグループ化されています。.groups 引数でこの動作を制御できます。

  • 'drop_last' — デフォルト。最後のグループ階層を削除します
  • 'drop' — すべてのグループ化を解除します
  • 'keep' — すべてのグループ化を保持します
library(dplyr)

df <- data.frame(
  year = c(2022,2022,2023,2023),
  quarter = c('Q1','Q2','Q1','Q2'),
  revenue = c(100, 120, 130, 150)
)

# .groups = 'drop' ensures ungrouped result
result <- df %>%
  group_by(year, quarter) %>%
  summarize(total = sum(revenue), .groups = 'drop')

print(result)
print(is.grouped_df(result))  # FALSE

ungroup() による明示的な解除

いつでも ungroup() を呼び出して、データフレームからグループ化のメタデータを削除できます。後続の操作をグループごとではなくデータ全体に対して行いたい場合に重要です。

library(dplyr)

df <- data.frame(
  dept = c('HR','HR','Eng','Eng'),
  salary = c(55000, 60000, 95000, 105000)
)

# Without ungroup: rank is within group
df %>%
  group_by(dept) %>%
  mutate(rank_in_dept = rank(salary)) %>%
  ungroup() %>%
  mutate(rank_overall = rank(salary))

group_keys() と n_groups()

group_keys() は、一意なグループの組み合わせを示すデータフレームを返します。n_groups() はグループ数を返します。グループ化された操作を実行する前の確認に便利です。

library(dplyr)

df <- data.frame(
  country = c('US','US','UK','UK','DE'),
  category = c('A','B','A','A','B'),
  value = c(10, 20, 15, 25, 30)
)

grouped <- df %>% group_by(country, category)

cat('Number of groups:', n_groups(grouped), '\n')
print(group_keys(grouped))

複数の統計量による集計

1 回の summarize() 呼び出しで、多くの要約統計量を計算できます。カウント、平均、中央値、標準偏差、最小値、最大値、カスタム計算を一度に組み合わせられます。

library(dplyr)

scores <- data.frame(
  class = c('A','A','A','B','B','B','C','C'),
  score = c(85, 90, 78, 92, 88, 95, 70, 75)
)

scores %>%
  group_by(class) %>%
  summarize(
    n = n(),
    mean_score = round(mean(score), 1),
    median_score = median(score),
    sd_score = round(sd(score), 2),
    min_score = min(score),
    max_score = max(score)
  )

グループ対応の mutate()

group_by() の後に mutate() を使うと、各グループ内で値を計算しながら、すべての行を保持します(summarize() とは異なります)。各行に付加したいグループ単位の指標を計算するのに最適です。

library(dplyr)

sales <- data.frame(
  region = c('East','East','West','West','West'),
  rep = c('Alice','Bob','Carol','Dave','Eve'),
  revenue = c(150, 200, 120, 180, 160)
)

sales %>%
  group_by(region) %>%
  mutate(
    region_total = sum(revenue),
    pct_of_region = round(100 * revenue / sum(revenue), 1)
  ) %>%
  ungroup()

グループ内のフィルタリング

group_by() の後に filter() を使うと、グループ単位の条件に基づいて行をフィルタリングできます。たとえば、地域ごとの上位成績者だけを残したり、グループ平均を上回る値の行だけを残したりできます。

library(dplyr)

sales <- data.frame(
  region = c('East','East','West','West','North','North'),
  rep = c('Alice','Bob','Carol','Dave','Eve','Frank'),
  revenue = c(150, 200, 120, 180, 95, 130)
)

# Keep the top rep per region
sales %>%
  group_by(region) %>%
  filter(revenue == max(revenue)) %>%
  ungroup()

クイックチェック

summarize() の .groups = 'drop' 引数は何をしますか?

まとめ: グループ化した集計

グループ化した集計の重要ポイント:

  • group_by(col) はグループ化を追加します。データは変わりませんが、操作がグループを意識したものになります
  • summarize() は各グループを 1 行にまとめます。n()、mean()、sum() などを使います
  • .groups = 'drop' は結果のグループ化を解除します
  • ungroup() は任意の時点でグループ化を削除します
  • group_keys() はグループ階層を確認し、n_groups() はその数を数えます
  • mutate() + group_by() は、行をまとめずにグループ単位の列を追加します
library(dplyr)

# Full pipeline example
data.frame(
  dept = c('Eng','Eng','HR','HR','Sales'),
  salary = c(95000, 110000, 60000, 65000, 75000)
) %>%
  group_by(dept) %>%
  summarize(
    headcount = n(),
    avg_salary = mean(salary),
    .groups = 'drop'
  ) %>%
  arrange(desc(avg_salary))

よくある質問

「グループ別集計とgroup_by()」レッスンは無料ですか?

はい。「グループ別集計とgroup_by()」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「グループ別集計とgroup_by()」で何を学びますか?

グループごとにデータを集計し、各グループの統計量を計算します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「グループ別集計とgroup_by()」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. グループ別集計とgroup_by()
  2. ウィンドウ関数:lag、lead、cumsum
  3. dplyrでの複数テーブル結合
  4. Tidy評価:{{ }}と.data
← R Academyに戻る