R group_by 평균 - R group_by pyeong-gyun

예를 들어 R 내장 데이터인 iris 데이터셋을 이용해보겠습니다. iris 데이터셋에는 Species 라는 범주형 변수와 꽃받침(Sepal) 의 길이와 너비, 꽃잎(Petal) 의 길이와 너비를 포함하고 있습니다.

R group_by 평균 - R group_by pyeong-gyun

iris 데이터의 구조를 보기 위해 str(iris) 라고 써주면 다음과 같은 결과가 나옵니다.

R group_by 평균 - R group_by pyeong-gyun

5개의 변수에 150개의 관측치과 각 변수 유형이 나와있습니다. Species 변수 유형은 factor 이고 나머지는 숫자형 변수로 구성되어 있네요. 이 때 Species 별로 각 변수의 요약통계량을 계산할 수 있습니다.

* 본격적으로 들어가기 전에 파이프라인(%>%) 에 대한 내용을 알아보겠습니다. 파이프라인은 dplyr 패키지 함수와 결합하여 사용하면 굉장히 유용합니다.  파이프라인은 다음과 같이 사용할 수 있습니다.

datasets %>% 사용할 함수 %>% 사용할 함수 %>% ...

이 전에 포스팅한 dplyr 함수를 바탕으로 몇 가지 예를 보겠습니다.

* iris 데이터에서 Sepal.Length, Sepal.Width 를 선택

iris %>% select(Sepal.Length, Sepal.Width)

R group_by 평균 - R group_by pyeong-gyun

* iris 데이터에서 Sepal.Length 가 7 이상인 데이터 추출

iris %>% filter(Sepal.Length>=7)

R group_by 평균 - R group_by pyeong-gyun

* iris 데이터에서 Sepal.Length 가 7 이상이고 Petal.Length 가 6 이상인 데이터 추출

iris %>% filter(Sepal.Length >=7 & Petal.Length>=6)

R group_by 평균 - R group_by pyeong-gyun

* iris 데이터에서 Sepal.Length 가 7 이상이고 Petal.Length 가 6 이상이고 Petal.Width 가 2 이상인 데이터 추출

iris %>% filter(Sepal.Length >=7 & Petal.Length>=6 & Petal.Width>=2)

R group_by 평균 - R group_by pyeong-gyun

< Species 별로 Sepal.Length의 요약통계량 계산>

iris 데이터에 Species 별로 그룹화하여 Sepal.Length 의 평균을 계산해보겠습니다.

iris %>% group_by(Species) %>% summarise(mean(Sepal.Length))

R group_by 평균 - R group_by pyeong-gyun

이제 추가적으로 표준편차, 중앙값, 최대값, 최소값을 구해보겠습니다.

iris %>% group_by(Species) %>% summarise(mean(Sepal.Length), sd(Sepal.Length), median(Sepal.Length), max(Sepal.Length), min(Sepal.Length))

R group_by 평균 - R group_by pyeong-gyun

summarise 함수에 mean(Sepal.Length), sd(Sepal.Length), median(Sepal.Length), max(Sepal.Length), min(Sepal.Length) 을 넣어주게되면 범주별 요약통계량 값이 나옵니다.

이제 각 변수 명을 따로 지정해주기 위해 다음과 같이 입력합니다.

iris %>% group_by(Species) %>% summarise(평균 = mean(Sepal.Length),

                                                           표준편차 = sd(Sepal.Length),

                                                          중앙값 = median(Sepal.Length),

                                                          최대값 = max(Sepal.Length),

                                                         최소값 = min(Sepal.Length))

R group_by 평균 - R group_by pyeong-gyun

* 요약 정리하면 다음과 같습니다.

R group_by 평균 - R group_by pyeong-gyun

이렇게 파이프라인과 각 함수를 함께 이용하면 코드를 구성할 때 큰 도움이 됩니다.  파이프연산자를 쓰지 않으면 코드 구성을 알아보기 힘들겠지만 위 그림과 같이 직관적으로 이해할 수 있습니다. group_by의 역할은 범주형 변수의 그룹화를 통해 summarise 함수로 요약통계량을 계산할 수 있습니다.  궁금한 점은 댓글로 남겨주세요!

속도면에서는 결과를 출력한 뒤에

sales %>%
    group_by(district) %>%
    summarise(sum.sales.num = sum(sales.num))
8를 빼는 것보다 먼저
sales %>%
    group_by(district) %>%
    summarise(sum.sales.num = sum(sales.num))
8를 미리 빼놓고 다음에 계산하는 것이 훨씬 좋다. 사실, 데이터가 크지 않으면 큰 차이가 없다.

sales %>%
    group_by(district)
1

sales %>%
    group_by(district)
0

group by (성별)

       city       district gender sales.nm sales.cd ymd      sales.num
1      서울특별시 강남구   남     스탑버스 12AA02   20140101 103      
2      서울특별시 강남구   여     키즈랜드 100101   20140101 309      
3      서울특별시 강남구   여     키즈랜드 100101   20140101 365      
4      서울특별시 강남구   남     스탑버스 12AA02   20140101 421      
7를 이용해
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
2 (성별)로 그룹핑을 한다. 결과로 성별별 판매건수 평균가 나온다.

sales %>%
    group_by(district)
3

sales %>%
    group_by(district)
4

NA

   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
3의
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
4는 R에서 특별하게 missing을 다루는 특정 값이다.
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
4가 들어가 있는 데이터를 필터링하기 위해
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
6 하면 잘 되지 않는데, 이유는 R에서 NA를 특별대우를 해주기 때문이다.

is.na

   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
4의 경우에만
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
3라는 함수가 별도로 존재한다.
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
3를 이용해
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
4 값만 골라낸다.
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
4가 아닌 것만 고르려면 앞에
sales %>%
    group_by(district) %>%
    summarise(mean.sales.num = mean(sales.num))
2를 붙여주면 된다.

sales %>%
    group_by(district) %>%
    summarise(mean.sales.num = mean(sales.num))
3을 이용해 성별이
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
4인 것은 제외한다.

sales %>%
    group_by(district)
5

sales %>%
    group_by(district)
6

기후 데이터로 실습

기후 데이터를 불러온다.

sales %>%
    group_by(district)
7

변수 이름 바꾸기

변수이름을 영어로 바꾼다.

sales %>%
    group_by(district)
8

group by(구)

       city       district gender sales.nm sales.cd ymd      sales.num
1      서울특별시 강남구   남     스탑버스 12AA02   20140101 103      
2      서울특별시 강남구   여     키즈랜드 100101   20140101 309      
3      서울특별시 강남구   여     키즈랜드 100101   20140101 365      
4      서울특별시 강남구   남     스탑버스 12AA02   20140101 421      
7를 이용해
       city       district gender sales.nm sales.cd ymd      sales.num
1      서울특별시 강남구   남     스탑버스 12AA02   20140101 103      
2      서울특별시 강남구   여     키즈랜드 100101   20140101 309      
3      서울특별시 강남구   여     키즈랜드 100101   20140101 365      
4      서울특별시 강남구   남     스탑버스 12AA02   20140101 421      
8 (구)별로 강수량의 합을 구한다.

sales %>%
    group_by(district)
9

       city       district gender sales.nm sales.cd ymd      sales.num
1      서울특별시 강남구   남     스탑버스 12AA02   20140101 103      
2      서울특별시 강남구   여     키즈랜드 100101   20140101 309      
3      서울특별시 강남구   여     키즈랜드 100101   20140101 365      
4      서울특별시 강남구   남     스탑버스 12AA02   20140101 421      
0

NA 관련 옵션

na.rm

R에서

sales %>%
    group_by(district) %>%
    summarise(sum.sales.num = sum(sales.num))
1이나
sales %>%
    group_by(district) %>%
    summarise(sum.sales.num = sum(sales.num))
4을 할 때 miising 값
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
4가 들어가 있으면 결과로
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
4가 출력한다.
   district mean.sales.num
1  강남구   250.7121      
2  강동구   248.9412      
3  강북구   250.7344      
4  강서구   249.9126      
1로 하여
   district sum.sales.num
1  강남구   2632978      
2  강동구   2623093      
3  강북구   2635469      
4  강서구   2637328      
4 값을 제거한다.