본문 바로가기

■ 프로그래밍/R

[R 기초] 기술통계량 함수(psych, dplyr, funModeling) -2

[ R : 기술통계량 함수(psych, dplyr, funModeling) -2 ]



# 주석

## 결과값



패키지 설치 및 로딩하기

install.packages("ggplot2")
library(ggplot2)


1. 기술통계량을 구해주는 유용한 함수들

(1) summary(data$variable)

summary(diamonds$carat)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.2000  0.4000  0.7000  0.7979  1.0400  5.0100
  • 평균을 제외한 5개의 값: 다섯수치요약(Five Numbers summary)
  • Min, Q1, Median, Q3, Max


(2) by(data$variable, data$variable, functionName)

  • by(양적 자료, 질적 자료, functionName)
  • functionName에는 mean, sd, summary, hist가 있음
  • 집단 별로 양적 자료에 대해 처리할 때 사용함
by(diamonds$carat, diamonds$cut, mean) # 각 cut(5종류)의 carat의 평균값
## diamonds$cut: Fair
## [1] 1.046137
## -------------------------------------------------------- 
## diamonds$cut: Good
## [1] 0.8491847
## -------------------------------------------------------- 
## diamonds$cut: Very Good
## [1] 0.8063814
## -------------------------------------------------------- 
## diamonds$cut: Premium
## [1] 0.8919549
## -------------------------------------------------------- 
## diamonds$cut: Ideal
## [1] 0.702837


(3) psych::describe(양적자료), describeBy(양적자료, 질적자료)

  • by함수가 하나씩 functionName을 줘야했다면, describe는 한 번에 결과 값을 볼 수 있음
install.packages("psych")
library(psych)


i. describe()

carat에 대한 결과 값

psych::describe(diamonds$carat)
##    vars     n mean   sd median trimmed  mad min  max range skew kurtosis
## X1    1 53940  0.8 0.47    0.7    0.73 0.47 0.2 5.01  4.81 1.12     1.26
##    se
## X1  0


ii. describeBy()

각 cut별 carat의 결과 값

psych::describeBy(diamonds$carat, diamonds$cut)
## 
##  Descriptive statistics by group 
## group: Fair
##    vars    n mean   sd median trimmed  mad  min  max range skew kurtosis
## X1    1 1610 1.05 0.52      1    0.98 0.43 0.22 5.01  4.79 1.68     5.31
##      se
## X1 0.01
## -------------------------------------------------------- 
## group: Good
##    vars    n mean   sd median trimmed  mad  min  max range skew kurtosis
## X1    1 4906 0.85 0.45   0.82     0.8 0.43 0.23 3.01  2.78 1.03     1.22
##      se
## X1 0.01
## -------------------------------------------------------- 
## group: Very Good
##    vars     n mean   sd median trimmed  mad min max range skew kurtosis se
## X1    1 12082 0.81 0.46   0.71    0.75 0.46 0.2   4   3.8 0.99     0.89  0
## -------------------------------------------------------- 
## group: Premium
##    vars     n mean   sd median trimmed  mad min  max range skew kurtosis
## X1    1 13791 0.89 0.52   0.86    0.83 0.56 0.2 4.01  3.81 0.86     0.43
##    se
## X1  0
## -------------------------------------------------------- 
## group: Ideal
##    vars     n mean   sd median trimmed  mad min max range skew kurtosis se
## X1    1 21551  0.7 0.43   0.54    0.64 0.33 0.2 3.5   3.3 1.34     1.63  0


- 혼자 수행해보기

psych::describe(diamonds[ , c(1, 5:10)])
psych::describeBy(diamonds[ , c(1, 5:10)], diamonds$cut)


(4) dplyr::summarise()

  • “dplyr” package는 데이터의 양이 많아 전처리르 해야할 경우 유용하게 쓰인다
  • %>% (Pipe Operator, 단축키: ctrl+shift+m) : 합집합이라 생각하면 된다
install.packages("dplyr")
library(dplyr)


diamonds의 데이터를 예로 들겠다.

diamonds %>%                             # diamonds 데이터 선택
  dplyr::select(carat) %>%               # select는 열을 선택
  dplyr::summarise(N = n(),              # summarise는 데이터 요약. n은 데이터 개수
                   Mean = mean(carat),   # mead = 평균
                   SD   = sd(carat))     # 표준편차
## # A tibble: 1 x 3
##       N  Mean    SD
##   <int> <dbl> <dbl>
## 1 53940 0.798 0.474
  • 응용
diamonds %>% 
  dplyr::select(carat, cut) %>%          # carat과 cut 열 선택
  dplyr::group_by(cut) %>%               # cut으로 그룹을 짓겠다 선언
  dplyr::summarise(N = n(),              # summarise는 group_by 뒤에 와야 함
                   Mean = mean(carat),
                   SD   = sd(carat)) %>% 
  dplyr::arrange(desc(Mean)) %>%         # 평균을 기준으로 내림차순 정렬
  head(n = 3)                            # 맨 위의 3번 째 줄까지만 표시
## # A tibble: 3 x 4
##   cut         N  Mean    SD
##   <ord>   <int> <dbl> <dbl>
## 1 Fair     1610 1.05  0.516
## 2 Premium 13791 0.892 0.515
## 3 Good     4906 0.849 0.454


문제1. carat이 4.0 이상, price는 10000 이상인 데이터의 depth에 대해서 clarity별로 n, Mean, SD를 구한 결과의 평균을 기준으로 top3를 알아내라.


  • 새로운 열 추가하기
diamonds <- dplyr::mutate(diamonds, xyz.mean = (x + y + z)/3)


dplyr 패키지 정리
- filter : 행 추출
- select : 열 추출
- mutate : 새로운 변수 생성
- summarise : 기술통계량
- group_by : 집단으로 구분
- arrange : 정렬


(5) funModeling 패키지

  • 데이터의 생김새를 보고 싶을때 사용하면 유용하다.
  • 기술통계량 포스트에서 다루었던 거의 모든 내용을 이 코드 한줄로 다 커버할 수 있다.
install.packages("funModeling")
library(funModeling)
  • 시간이 있다면 한 번 해보는 것을 추천한다.
funModeling::df_status(diamonds)
funModeling::plot_num(diamonds)
funModeling::profiling_num(diamonds)
funModeling::freq(diamonds$cut)


[ 정답 ] 

문제 1.

diamonds %>% 
  dplyr::filter(carat >= 4.0 & price >= 10000) %>% 
  dplyr::select(depth, clarity) %>% 
  dplyr::group_by(clarity) %>% 
  dplyr::summarise(N = n(),
                   Mean = mean(depth),
                   SD = sd(depth)) %>% 
  dplyr::arrange(desc(Mean)) %>% 
  head(n = 3)