쭈쌤
쭈쌤 Hello World

[R 데이터분석] 그룹분석

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터분석] 그룹분석≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[R 데이터분석] 그룹분석

그룹 분석이란 “학년별 국어평균”과 같이 데이터를 집단별로 나누어 그룹함수를 적용한 분석 방법입니다.

#01. 필요한 패키지 및 샘플 데이터 가져오기

1) 패키지 가져오기

1
2
3
4
REPO_URL <- "https://cran.seoul.go.kr/"

if (!require("dplyr"))     install.packages("dplyr", repos=REPO_URL)
library(dplyr)

2) 샘플데이터

1
2
성적표 <- read.csv("http://itpaper.co.kr/demo/r/grade.csv", stringsAsFactors=F, fileEncoding="euc-kr")
성적표
▶ 출력결과

A data.frame: 5 × 7

이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88

#02. 집계함수 사용하기

1) 각각의 열에 대한 집계

데이터 프레임에서 summarise() 함수를 통해 집계함수를 사용하면 열단위(세로방형)에 대해 수행된다.

단, 결측치(NA)가 포함된 열은 연산이 불가능하다.

사용 가능한 대표적인 집계 함수

  • mean(컬럼이름) : 평균
  • sd(컬럼이름) : 표준편차
  • sum(컬럼이름) : 합계
  • median(컬럼이름) : 중앙값
  • min(컬럼이름) : 최소값
  • max(컬럼이름) : 최대값
  • n(컬럼이름) : 빈도

과목별 총점 구하기

영어, 수학, 과학의 경우 결측치가 포함되어 있기 때문에 집계가 수행되지 않는다.

1
2
df <- 성적표 %>% summarise(국어총점=sum(국어), 영어총점=sum(영어), 수학총점=sum(수학), 과학총점=sum(과학))
df
▶ 출력결과

A data.frame: 1 × 4

국어총점영어총점수학총점과학총점
<int><int><int><int>
461NANANA

결측치를 제외한 집계 수행

집계함수에대해 na.rm=TRUE 파라미터를 설정한다.

1
2
3
4
5
6
df <- 성적표 %>% summarise(
                    국어평균=mean(국어, na.rm=TRUE),
                    영어평균=mean(영어, na.rm=TRUE),
                    수학평균=mean(수학, na.rm=TRUE),
                    과학평균=mean(과학, na.rm=TRUE))
df
▶ 출력결과

A data.frame: 1 × 4

국어평균영어평균수학평균과학평균
<dbl><dbl><dbl><dbl>
92.267.560.3333373.5

2) 각각의 행에 대한 집계

데이터 전치리 과정에서 사용한 mutate() 함수와 집계함수를 함께 사용하여 파생변수를 추가하는 형태로 접근할 수 있다.

사용 가능한 대표적인 집계 함수

  • rowMeans(데이터프레임[시작인덱스:끝인덱스]) : 평균
  • rowSums(데이터프레임[시작인덱스:끝인덱스]) : 합계
1
2
df <- 성적표 %>% mutate(총점=rowSums(성적표[4:7], na.rm=TRUE), 평균=rowMeans(성적표[4:7], na.rm=TRUE))
df
▶ 출력결과

A data.frame: 5 × 9

이름학년성별국어영어수학과학총점평균
<chr><int><chr><int><int><int><int><dbl><dbl>
철수1남자 98NA886425083.33333
영희2여자 8890627231278.00000
민수1남자 9270NANA16281.00000
수현3여자 6360317022456.00000
호영4남자12050NA8825886.00000

#03. 집단별로 나누기

  • 동일한 값을 갖는 데이터들끼리 그룹으로 묶고, 그 이외의 다른 데이터들에게 집계를 수행하는 형태.
  • SQL의 group by절과 같은 기능.

1) 샘플 데이터 만들기

1
2
인구조사 <- read.csv("http://itpaper.co.kr/demo/r/city_people.csv", stringsAsFactors=F, fileEncoding="euc-kr")
인구조사
▶ 출력결과

A data.frame: 8 × 4

도시연도인구지역
<chr><int><int><chr>
서울20159904312수도권
서울20109631482수도권
서울20059762546수도권
부산20153448737경상권
부산20103393191경상권
부산20053512547경상권
인천20152890451수도권
인천20102632035수도권

2) 15년간의 도시별 최대 인구수

하나의 컬럼을 집단별로 나누고 그룹분석 수행하기

1
2
3
4
df <- 인구조사 %>%
        group_by(도시) %>%
        summarise(최대인구수=max(인구, na.rm=TRUE))
df
▶ 출력결과

A tibble: 3 × 2

도시최대인구수
<chr><int>
부산3512547
서울9904312
인천2890451

2) 각 지역별로 5년단위 최대 인구수

두 개 이상의 컬럼을 집단별로 나누고 그룹분석 수행하기

1
2
3
4
df <- 인구조사 %>%
        group_by(지역, 연도) %>%
        summarise(최대인구수=max(인구, na.rm=TRUE))
df
▶ 출력결과

A grouped_df: 6 × 3

지역연도최대인구수
<chr><int><int>
경상권20053512547
경상권20103393191
경상권20153448737
수도권20059762546
수도권20109631482
수도권20159904312

3) 하나의 컬럼에 대해 여러 개의 집계함수 동시 사용

1
2
3
4
5
6
7
도시인구 <- 인구조사 %>%
                group_by(도시) %>%
                summarise(최소=min(인구, na.rm=TRUE),
                          최대=max(인구, na.rm=TRUE),
                          합계=sum(인구, na.rm=TRUE),
                          평균=mean(인구, na.rm=TRUE))
도시인구
▶ 출력결과

A tibble: 3 × 5

도시최소최대합계평균
<chr><int><int><int><dbl>
부산33931913512547103544753451492
서울96314829904312292983409766113
인천26320352890451 55224862761243

#04.피벗테이블

데이터 열 중 두 개의 열을 각각 행 인덱스, 열 인덱스로 사용하여 데이터를 재배치 한 것.

1) 피벗테이블 생성에 필요한 패키지 설치 및 로드

1
2
if (!require("reshape2"))     install.packages("reshape2", repos=REPO_URL)
library(reshape2)

2) dcast() 함수를 사용한 피벗테이블 만들기

1
dcast(데이터프레임, 인덱스이름~컬럼이름, value.var="집계대상컬럼", [집계함수이름 [,na.rm=TRUE]])
1
dcast(인구조사, 도시~연도, value.var="인구")
▶ 출력결과

A data.frame: 3 × 4

도시200520102015
<chr><int><int><int>
부산351254733931913448737
서울976254696314829904312
인천 NA26320352890451

2) 피벗테이블 생성 제약

컬럼과 인덱스이름으로 사용되는 데이터의 쌍이 중복되는 경우가 있다면 처리할 수 없다.

아래의 코드는 “수도권-2010”, “수도권-2015”의 경우가 각각 두 쌍씩 존재하므로 경고가 표시된다.

1
dcast(인구조사, 지역~연도, value.var="인구")
▶ 출력결과
1
Aggregation function missing: defaulting to length
▶ 출력결과

A data.frame: 2 × 4

지역200520102015
<chr><int><int><int>
경상권111
수도권122

이를 해결하기 위해서는 중복되는 경우에 수행할 집계함수를 명시해야 한다.

1
dcast(인구조사, 지역~연도, value.var="인구", mean, na.rm=TRUE)
▶ 출력결과

A data.frame: 2 × 4

지역200520102015
<chr><dbl><dbl><dbl>
경상권351254733931913448737
수도권976254661317596397382

3) 그룹분석 결과를 피벗테이블로 조합하기

그룹조회 결과로 생성된 데이터프레임을 다시 dcast() 함수를 사용해 가공한다.

1
2
3
4
5
6
7
df <- 인구조사 %>%
        group_by(지역, 연도) %>%
        summarise(평균인구=mean(인구, na.rm=TRUE))

pivot <- dcast(df, 지역~연도, value.var="평균인구")

pivot
▶ 출력결과

A data.frame: 2 × 4

지역200520102015
<chr><dbl><dbl><dbl>
경상권351254733931913448737
수도권976254661317596397382

일반적으로 축약해서 사용하면 아래와 같다.

1
2
3
4
dcast(인구조사 %>%
        group_by(지역, 연도) %>%
        summarise(평균인구=mean(인구, na.rm=TRUE)),
        지역~연도, value.var="평균인구")
▶ 출력결과

A data.frame: 2 × 4

지역200520102015
<chr><dbl><dbl><dbl>
경상권351254733931913448737
수도권976254661317596397382
Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터분석] 그룹분석≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus