R 집계 함수: Summarise & Group_by() 예제

변수 요약은 데이터에 대한 아이디어를 갖는 데 중요합니다. 하지만, 그룹별로 변수를 요약하면 데이터 분포에 대한 더 나은 정보를 제공합니다.

이 튜토리얼에서는 dplyr 라이브러리를 사용하여 그룹별로 데이터 세트를 요약하는 방법을 알아봅니다.

이 튜토리얼에서는 타구 데이터 세트를 사용합니다. 원래 데이터 세트에는 102816개의 관측치와 22개의 변수가 포함되어 있습니다. 이 데이터 세트의 20%만 사용하고 다음 변수를 사용합니다.

  • playerID: 플레이어 ID 코드입니다. 요인
  • yearID: 연도. 요인
  • 팀ID: 팀. 요인
  • lgID: 리그. 계수: AA AL FL NL PL UA
  • AB: 타석에서요. 숫자
  • G: 게임: 플레이어의 게임 수입니다. 숫자
  • R: 달린다. 숫자
  • HR: 홈런. 숫자
  • SH: 희생이 안타죠. 숫자

요약을 수행하기 전에 다음 단계를 거쳐 데이터를 준비합니다.

  • 1단계: 데이터 가져오기
  • 2단계: 관련 변수 선택
  • 3단계: 데이터 정렬
library(dplyr)

# Step 1
data <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/lahman-batting.csv") % > %

# Step 2
select(c(playerID, yearID, AB, teamID, lgID, G, R, HR, SH))  % > % 

# Step 3
arrange(playerID, teamID, yearID)

데이터세트를 가져올 때 좋은 방법은 잠깐 보기() 함수를 사용하여 데이터세트의 구조에 대한 아이디어를 얻는 것입니다.

# Structure of the data
glimpse(data)

출력:

Observations: 104,324
Variables: 9
$ playerID <fctr> aardsda01, aardsda01, aardsda01, aardsda01, aardsda01, a...
$ yearID   <int> 2015, 2008, 2007, 2006, 2012, 2013, 2009, 2010, 2004, 196...
$ AB       <int> 1, 1, 0, 2, 0, 0, 0, 0, 0, 603, 600, 606, 547, 516, 495, ...
$ teamID   <fctr> ATL, BOS, CHA, CHN, NYA, NYN, SEA, SEA, SFN, ATL, ATL, A...
$ lgID     <fctr> NL, AL, AL, NL, AL, NL, AL, AL, NL, NL, NL, NL, NL, NL, ...
$ G        <int> 33, 47, 25, 45, 1, 43, 73, 53, 11, 158, 155, 160, 147, 15...
$ R        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 113, 84, 100, 103, 95, 75...
$ HR       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 39, 29, 44, 38, 47, 34, 40...
$ SH       <int> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, ...

요약()

summarise()의 구문은 기본적이며 dplyr 라이브러리에 포함된 다른 동사와 일관성을 유지합니다.

summarise(df, variable_name=condition) 
arguments: 
- `df`: Dataset used to construct the summary statistics 
- `variable_name=condition`: Formula to create the new variable

아래 코드를 보세요:

summarise(data, mean_run =mean(R))

코드 설명

  • summarise(data, mean_run = mean(R)): 데이터 세트의 열 실행 평균인 mean_run이라는 변수를 생성합니다.

출력:

##   mean_run
## 1 19.20114

원하는 만큼 많은 변수를 추가할 수 있습니다. 플레이한 평균 게임과 평균 희생 타수를 반환합니다.

summarise(data, mean_games = mean(G),
    mean_SH = mean(SH, na.rm = TRUE))

코드 설명

  • mean_SH = mean(SH, na.rm = TRUE): 두 번째 변수를 요약합니다. 열 SH에 누락된 관측치가 포함되어 있으므로 na.rm = TRUE로 설정합니다.

출력:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by 대 group_by 없음

group_by()가 없는 summerise() 함수는 의미가 없습니다. 그룹별 요약통계를 생성합니다. 도서관 dplyr group_by 동사 내부에 전달한 그룹에 자동으로 함수를 적용합니다.

group_by는 다른 모든 동사(예: mutate(), filter(), alignment(), …)와 완벽하게 작동합니다.

여러 단계가 있을 때 파이프라인 연산자를 사용하면 편리합니다. 야구 리그별 평균 홈런을 계산할 수 있습니다.

data % > %
	group_by(lgID) % > %
	summarise(mean_run = mean(HR))

코드 설명

  • data: 요약 통계를 구성하는 데 사용되는 데이터 세트
  • group_by(lgID): `lgID' 변수를 그룹화하여 요약을 계산합니다.
  • summarise(mean_run = mean(HR)): 평균 홈런을 계산합니다.

출력:

## 
# A tibble: 7 x 2
##     lgID  mean_run
##   <fctr>     <dbl>
## 1     AA 0.9166667
## 2     AL 3.1270988
## 3     FL 1.3131313
## 4     NL 2.8595953
## 5     PL 2.5789474
## 6     UA 0.6216216
## 7   <NA> 0.2867133	

파이프 연산자는 ggplot()에서도 작동합니다. 그래프로 요약 통계를 쉽게 표시할 수 있습니다. 그래프가 플롯될 때까지 모든 단계가 파이프라인 내부로 푸시됩니다. 막대 문자로 리그별 평균 홈런을 보는 것이 더 시각적으로 보입니다. 아래 코드는 group_by(), summarise() 및 ggplot()을 함께 결합하는 힘을 보여줍니다.

다음 단계를 수행하세요.

  • 1단계: 데이터 프레임 선택
  • 2단계: 그룹 데이터
  • 3단계: 데이터 요약
  • 4단계: 요약 통계 도표화
library(ggplot2)
# Step 1
data % > % 
#Step 2
group_by(lgID) % > % 
#Step 3
summarise(mean_home_run = mean(HR)) % > % 
#Step 4
ggplot(aes(x = lgID, y = mean_home_run, fill = lgID)) +
    geom_bar(stat = "identity") +
    theme_classic() +
    labs(
        x = "baseball league",
        y = "Average home run",
        title = paste(
            "Example group_by() with summarise()"
        )
    )

출력:

요약을 사용한 Group_by 예제

summarise()의 함수

동사 summarise()는 R의 거의 모든 함수와 호환됩니다. summarise()와 함께 사용할 수 있는 유용한 함수의 짧은 목록은 다음과 같습니다.

목표 함수 기술설명
Basic 평균() 벡터 x의 평균
중앙값() 벡터 x의 중앙값
합집합() 벡터 x의 합
변화 SD() 벡터 x의 표준편차
IQR() 벡터 x의 사분위수
범위 분 () 벡터 x의 최소값
max () 벡터 x의 최대값
분위수() 벡터 x의 분위수
직책 먼저() group_by()와 함께 사용 그룹의 첫 번째 관찰
마지막() group_by()와 함께 사용합니다. 그룹의 마지막 관찰
n번째() group_by()와 함께 사용합니다. 그룹의 n번째 관찰
카운트 엔() group_by()와 함께 사용합니다. 행 수 계산
n_distinct() group_by()와 함께 사용합니다. 고유한 관측치 수 계산

표 1의 모든 기능에 대한 예를 살펴보겠습니다.

기본 기능

이전 예에서는 데이터 프레임에 요약 통계를 저장하지 않았습니다.

요약에서 날짜 프레임을 생성하려면 다음 두 단계를 진행할 수 있습니다.

  • 1단계: 추가 사용을 위해 데이터 프레임 저장
  • 2단계: 데이터세트를 사용하여 선 그림 만들기

단계 1) 연간 평균 경기 수를 계산합니다.

## Mean
ex1 <- data % > %
	group_by(yearID) % > %
	summarise(mean_game_year = mean(G))
head(ex1)

코드 설명

  • 타격 데이터 세트의 요약 통계는 데이터 프레임 ex1에 저장됩니다.

출력:

## # A tibble: 6 x 2
##   yearID mean_game_year
##    <int>          <dbl>
## 1   1871       23.42308
## 2   1872       18.37931
## 3   1873       25.61538
## 4   1874       39.05263
## 5   1875       28.39535
## 6   1876       35.90625	

단계 2) 선 도표로 요약 통계를 표시하고 추세를 확인합니다.

# Plot the graph
ggplot(ex1, aes(x = yearID, y = mean_game_year)) +
    geom_line() +
    theme_classic() +
    labs(
        x = "Year",
        y = "Average games played",
        title = paste(
            "Average games played from 1871 to 2016"
        )
    )

출력:

기본 기능 예

부분 집합

summarise() 함수는 부분 집합화와 호환됩니다.

## Subsetting + Median
data % > %
group_by(lgID) % > %
summarise(median_at_bat_league = median(AB), 
	#Compute the median without the zero 
	median_at_bat_league_no_zero = median(AB[AB > 0]))

코드 설명

  • median_at_bat_league_no_zero = median(AB[AB > 0]): 변수 AB에는 0이 많이 포함되어 있습니다. 타석에 들어가 0이 있는 변수와 없는 변수.

출력:

## # A tibble: 7 x 3
##     lgID median_at_bat_league median_at_bat_league_no_zero
##   <fctr>                <dbl>                        <dbl>
## 1     AA                  130                          131
## 2     AL                   38                           85
## 3     FL                   88                           97
## 4     NL                   56                           67
## 5     PL                  238                          238
## 6     UA                   35                           35
## 7   <NA>                  101                          101	

합계

변수를 집계하는 또 다른 유용한 함수는 sum()입니다.

홈런이 많은 리그를 확인할 수 있습니다.

## Sum
data % > %
	group_by(lgID) % > %
	summarise(sum_homerun_league = sum(HR))

출력:

## # A tibble: 7 x 2
##     lgID sum_homerun_league
##   <fctr>              <int>
## 1     AA                341
## 2     AL              29426
## 3     FL                130
## 4     NL              29817
## 5     PL                 98
## 6     UA                 46
## 7   <NA>                 41	

표준 편차

데이터의 확산은 R의 표준편차 또는 sd()를 사용하여 계산됩니다.

# Spread
data % > %
	group_by(teamID) % > %
	summarise(sd_at_bat_league = sd(HR))

출력:

## # A tibble: 148 x 2
##    teamID sd_at_bat_league
##    <fctr>            <dbl>
##  1    ALT               NA
##  2    ANA        8.7816395
##  3    ARI        6.0765503
##  4    ATL        8.5363863
##  5    BAL        7.7350173
##  6    BFN        1.3645163
##  7    BFP        0.4472136
##  8    BL1        0.6992059
##  9    BL2        1.7106757
## 10    BL3        1.0000000
## # ... with 138 more rows		

각 팀의 홈런 개수에는 불평등이 많이 존재합니다.

최소 및 최대

min() 및 max() 함수를 사용하여 벡터의 최소값과 최대값에 액세스할 수 있습니다.

아래 코드는 선수가 한 시즌 동안 출장한 가장 낮은 경기 수와 가장 높은 경기 수를 반환합니다.

# Min and max
data % > %
	group_by(playerID) % > %
	summarise(min_G = min(G),
    max_G = max(G))

출력:

## # A tibble: 10,395 x 3
##     playerID min_G max_G
##       <fctr>       <int>
##  1 aardsda01    53    73
##  2 aaronha01   120   156
##  3  aasedo01    24    66
##  4  abadfe01    18    18
##  5 abadijo01    11    11
##  6 abbated01     3   153
##  7 abbeybe01    11    11
##  8 abbeych01    80   132
##  9 abbotgl01     5    23
## 10 abbotji01    13    29
## # ... with 10,385 more rows

카운트

그룹별로 관찰 횟수를 계산하는 것은 항상 좋은 생각입니다. R을 사용하면 n()으로 발생 횟수를 집계할 수 있습니다.

예를 들어, 아래 코드는 각 선수가 몇 년 동안 뛰었는지 계산합니다.

# count observations
data % > %
	group_by(playerID) % > %
	summarise(number_year = n()) % > %
	arrange(desc(number_year))

출력:

## # A tibble: 10,395 x 2
##     playerID number_year
##       <fctr>       <int>
##  1 pennohe01          11
##  2 joosted01          10
##  3 mcguide01          10
##  4  rosepe01          10
##  5 davisha01           9
##  6 johnssi01           9
##  7  kaatji01           9
##  8 keelewi01           9
##  9 marshmi01           9
## 10 quirkja01           9
## # ... with 10,385 more rows

처음과 마지막

그룹의 첫 번째, 마지막 또는 n번째 위치를 선택할 수 있습니다.

예를 들어, 각 플레이어의 첫 번째 연도와 마지막 연도를 찾을 수 있습니다.

# first and last
data % > %
	group_by(playerID) % > %
	summarise(first_appearance = first(yearID),
		last_appearance = last(yearID))

출력:

## # A tibble: 10,395 x 3
##     playerID first_appearance last_appearance
##       <fctr>            <int>           <int>
##  1 aardsda01             2009            2010
##  2 aaronha01             1973            1975
##  3  aasedo01             1986            1990
##  4  abadfe01             2016            2016
##  5 abadijo01             1875            1875
##  6 abbated01             1905            1897
##  7 abbeybe01             1894            1894
##  8 abbeych01             1895            1897
##  9 abbotgl01             1973            1979
## 10 abbotji01             1992            1996
## # ... with 10,385 more rows

n번째 관찰

nth() 함수는 first() 및 last()를 보완합니다. 반환할 인덱스를 사용하여 그룹 내의 n번째 관측값에 액세스할 수 있습니다.

예를 들어, 팀이 2년차에 출전한 내용만 필터링할 수 있습니다.

# nth
data % > %
	group_by(teamID) % > %
	summarise(second_game = nth(yearID, 2)) % > %
	arrange(second_game)

출력:

## # A tibble: 148 x 2
##    teamID second_game
##    <fctr>       <int>
##  1    BS1        1871
##  2    CH1        1871
##  3    FW1        1871
##  4    NY2        1871
##  5    RC1        1871
##  6    BR1        1872
##  7    BR2        1872
##  8    CL1        1872
##  9    MID        1872
## 10    TRO        1872
## # ... with 138 more rows

관찰 횟수가 뚜렷함

n() 함수는 현재 그룹의 관측치 수를 반환합니다. n()에 대한 닫힌 함수는 고유한 값의 수를 계산하는 n_distinct()입니다.

다음 예에서는 모든 기간 동안 팀이 영입한 총 선수 수를 더합니다.

# distinct values
data % > %
	group_by(teamID) % > %
	summarise(number_player = n_distinct(playerID)) % > %
	arrange(desc(number_player))

코드 설명

  • group_by(teamID): 연도별 그룹화 그리고
  • 요약(플레이어 수 = n_distinct(playerID)): 팀별 고유 플레이어 수를 계산합니다.
  • 배열(desc(number_player)): 플레이어 수에 따라 데이터를 정렬합니다.

출력:

## # A tibble: 148 x 2
##    teamID number_player
##    <fctr>         <int>
##  1    CHN           751
##  2    SLN           729
##  3    PHI           699
##  4    PIT           683
##  5    CIN           679
##  6    BOS           647
##  7    CLE           646
##  8    CHA           636
##  9    DET           623
## 10    NYA           612
## # ... with 138 more rows

여러 그룹

요약 통계는 여러 그룹 간에 실현될 수 있습니다.

# Multiple groups
data % > %
	group_by(yearID, teamID) % > %
	summarise(mean_games = mean(G)) % > %
	arrange(desc(teamID, yearID))

코드 설명

  • group_by(yearID, teamID): 연도별 그룹화 그리고
  • summarise(mean_games = mean(G)): 게임 플레이어 수를 요약합니다.
  • 배열(desc(teamID, yearID)): 팀 및 연도별로 데이터를 정렬합니다.

출력:

## # A tibble: 2,829 x 3
## # Groups:   yearID [146]
##    yearID teamID mean_games
##     <int> <fctr>      <dbl>
##  1   1884    WSU   20.41667
##  2   1891    WS9   46.33333
##  3   1886    WS8   22.00000
##  4   1887    WS8   51.00000
##  5   1888    WS8   27.00000
##  6   1889    WS8   52.42857
##  7   1884    WS7    8.00000
##  8   1875    WS6   14.80000
##  9   1873    WS5   16.62500
## 10   1872    WS4    4.20000
## # ... with 2,819 more rows

필터

작업을 하려고 하기 전에 데이터 세트를 필터링할 수 있습니다. 데이터 세트는 1871년부터 시작하며 분석에는 1980년 이전의 연도는 필요하지 않습니다.

# Filter
data % > %
	filter(yearID > 1980) % > %
	group_by(yearID) % > %
	summarise(mean_game_year = mean(G))

코드 설명

  • filter(yearID > 1980): 관련 연도(예: 1980년 이후)만 표시하도록 데이터를 필터링합니다.
  • group_by(yearID): 연도별 그룹화
  • summarise(mean_game_year = mean(G)): 데이터 요약

출력:

## # A tibble: 36 x 2
##    yearID mean_game_year
##     <int>          <dbl>
##  1   1981       40.64583
##  2   1982       56.97790
##  3   1983       60.25128
##  4   1984       62.97436
##  5   1985       57.82828
##  6   1986       58.55340
##  7   1987       48.74752
##  8   1988       52.57282
##  9   1989       58.16425
## 10   1990       52.91556
## # ... with 26 more rows

그룹 해제

마지막으로 계산 수준을 변경하기 전에 그룹화를 제거해야 합니다.

# Ungroup the data
data % > %
	filter(HR > 0) % > %
	group_by(playerID) % > %
	summarise(average_HR_game = sum(HR) / sum(G)) % > %
	ungroup() % > %
	summarise(total_average_homerun = mean(average_HR_game))

코드 설명

  • filter(HR >0) : 홈런 제로 제외
  • group_by(playerID): 플레이어별로 그룹화
  • summarise(average_HR_game = sum(HR)/sum(G)): 선수별 평균 홈런 계산
  • ungroup(): 그룹화 제거
  • summarise(total_average_homerun = mean(average_HR_game)): 데이터 요약

출력:

## # A tibble: 1 x 1
##   total_average_homerun
##                   <dbl>
## 1            0.06882226	

제품 개요

그룹별로 요약을 반환하려면 다음을 사용할 수 있습니다.

# group by X1, X2, X3
group(df, X1, X2, X3)

다음을 사용하여 데이터 그룹을 해제해야 합니다.

ungroup(df)

아래 표는 summarise()로 학습한 함수를 요약한 것입니다.

방법 함수 암호
평균 평균
summarise(df,mean_x1 = mean(x1))
중앙 분리대 중앙 분리대
summarise(df,median_x1 = median(x1))
summarise(df,sum_x1 = sum(x1))
표준 편차 sd
summarise(df,sd_x1 = sd(x1))
사분위수 아이큐알
summarise(df,interquartile_x1 = IQR(x1))
최저한의
summarise(df,minimum_x1 = min(x1))
최고 최대
summarise(df,maximum_x1 = max(x1))
분위수 분위수
summarise(df,quantile_x1 = quantile(x1))
첫 번째 관찰 먼저
summarise(df,first_x1 = first(x1))
마지막 관찰 지난
summarise(df,last_x1 = last(x1))
n번째 관찰 n 번째
summarise(df,nth_x1 = nth(x1, 2))
발생 횟수 n
summarise(df,n_x1 = n(x1))
뚜렷한 발생 횟수 n_distinct
summarise(df,n_distinct _x1 = n_distinct(x1))