0Pricing
R Academy · 강의

그룹별 요약과 group_by()

그룹별로 데이터를 집계하고 그룹별 통계를 계산합니다.

그룹별 요약과 group_by()은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

데이터를 그룹화하는 이유

데이터 그룹화는 데이터 분석에서 가장 강력한 작업 중 하나입니다. 전체 데이터 세트에 대해 통계를 계산하는 대신 각 그룹 내에서 계산할 수 있습니다. 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)는 데이터 프레임을 표시하여 이후 작업이 그룹별로 수행되게 합니다. 데이터 자체를 변경하는 것이 아니라 그룹화 메타데이터를 추가합니다. 하나 또는 여러 열을 기준으로 그룹화할 수 있습니다.

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())는 각 그룹을 하나의 행으로 축약합니다. 새 열 이름과 적용할 요약 함수를 지정합니다. 자주 사용하는 함수로는 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))

여러 통계량으로 요약하기

하나의 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()는 각 그룹을 하나의 행으로 축약합니다. 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/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“그룹별 요약과 group_by()”에서 뭘 배우나요?

그룹별로 데이터를 집계하고 그룹별 통계를 계산합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“그룹별 요약과 group_by()” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 그룹별 요약과 group_by()
  2. 윈도 함수: lag, lead, cumsum
  3. dplyr의 다중 테이블 조인
  4. 정돈된 평가: {{ }} 및 .data
← R Academy(으)로 돌아가기