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()" ) )
출력:
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)) |