[R 데이터 탐색] 1. 데이터요약, 기술통계량

수진·2020년 2월 12일
2

R

목록 보기
2/12
post-thumbnail

 R로 데이터를 파악하는 방법은 무수히 많습니다. 처음엔 한 게시물에 데이터 요약과 NA값, 변수별 상관성 등등 모든 파악방법을 다 다루려고 했는데 생각보다 내용이 방대할 듯 하여 여러 글로 나누어 정리해보려 합니다. 😊

 오늘은 아래의 세 가지를 기준으로 작성하였습니다.

🍏 전체 데이터 보기
🍏 데이터 일부 보기
🍏 기술통계량

 예제 데이터는 지난 boxplot 그리는 방법에서도 사용했던 ggplot2의 diamonds를 활용하였습니다.

🍏 예제 데이터를 활용한 데이터 파악 실습 in R

1) 전체 데이터 보기
 View 함수를 통해 아래 이미지와 같이 테이블을 새 창으로 불러올 수 있습니다.
 R은 대소문자를 구분하므로 V를 대문자로 표기해야 하는 점 유의해 주세요.

View(diamonds) # View(데이터 명)

 어느 세월에 전체 테이터를 새 창으로 불러와 다 살펴 보나요..? 특히 데이터가 엄청나게 클 경우 View함수를 막 써버리면 파일을 불러오는데 시간만 오래 걸릴 수도 있습니다. 지금부터는 출력창에 데이터의 일부 혹은 요약을 확인하는 법에 대해 알아봅시다.👁👁

2) 데이터 일부 보기

  • 데이터 상위/하위 n개 행까지 출력
    n = 6이 디폴트 값이기 때문에 n을 별도로 지정하지 않을 경우 자동으로 상위 6개 행이 불러와집니다.
# 위에서부터 행 출력 : head(데이터 명, n = 출력하고 싶은 데이터 내 행의 수
> head(diamonds, n = 10) 

# A tibble: 10 x 11
   carat cut       color clarity depth table price     x     y     z carat_group
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct>      
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43 0이상~2미만
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31 0이상~2미만
 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31 0이상~2미만
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63 0이상~2미만
 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75 0이상~2미만
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48 0이상~2미만
 7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47 0이상~2미만
 8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53 0이상~2미만
 9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49 0이상~2미만
10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39 0이상~2미만

# 밑에서부터 행 출력 : tail(데이터 명, n = 출력하고 싶은 데이터 내 행의 수
> tail(diamonds, n = 10) 

# A tibble: 10 x 11
   carat cut       color clarity depth table price     x     y     z carat_group
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct>      
 1  0.71 Premium   E     SI1      60.5    55  2756  5.79  5.74  3.49 0이상~2미만
 2  0.71 Premium   F     SI1      59.8    62  2756  5.74  5.73  3.43 0이상~2미만
 3  0.7  Very Good E     VS2      60.5    59  2757  5.71  5.76  3.47 0이상~2미만
 4  0.7  Very Good E     VS2      61.2    59  2757  5.69  5.72  3.49 0이상~2미만
 5  0.72 Premium   D     SI1      62.7    59  2757  5.69  5.73  3.58 0이상~2미만
 6  0.72 Ideal     D     SI1      60.8    57  2757  5.75  5.76  3.5  0이상~2미만
 7  0.72 Good      D     SI1      63.1    55  2757  5.69  5.75  3.61 0이상~2미만
 8  0.7  Very Good D     SI1      62.8    60  2757  5.66  5.68  3.56 0이상~2미만
 9  0.86 Premium   H     SI2      61      58  2757  6.15  6.12  3.74 0이상~2미만
10  0.75 Ideal     D     SI2      62.2    55  2757  5.83  5.87  3.64 0이상~2미만
  • 데이터 구조 출력
    • 기본 함수 vs dplyr 패키지 함수
      두 함수 모두 보여주는 데이터는 (1) 데이터의 행과 변수의 수 (2) 각 변수의 명과 속성 (3) 상위 수치들로 비슷합니다.
      다른점은, 기본 함수는 데이터의 속성이 무엇인지 보여주고, dplyr 패키지의 glimpse 함수는 변수의 속성을 세분화 한 점과 조금 더 예쁘게 정리되어 있어 보기 좋다는 점이 있습니다.
      개인적으로 glimpse가 더 편합니다.
# 기본 함수 : str(데이터 명)
> str(diamonds) 

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	53940 obs. of  11 variables:
 $ carat      : num  0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
 $ cut        : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
 $ color      : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
 $ clarity    : Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
 $ depth      : num  61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
 $ table      : num  55 61 65 58 58 57 57 55 61 61 ...
 $ price      : int  326 326 327 334 335 336 336 337 337 338 ...
 $ x          : num  3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
 $ y          : num  3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
 $ z          : num  2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
 $ carat_group: Factor w/ 3 levels "0이상~2미만",..: 1 1 1 1 1 1 1 1 1 1 ...
 
# dplyr은 tidyverse 로드 시 함께 불러와집니다.
# dplyr 패키지 함수 : str(데이터 명)
library(tidyverse) 
> dplyr::glimpse(diamonds) 

Observations: 53,940
Variables: 10
$ carat       <dbl> 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0.23, 0.30, 0…
$ cut         <ord> Ideal, Premium, Good, Premium, Good, Very Good, Very Good, Very Goo…
$ color       <ord> E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J, J, J, I, E, H…
$ clarity     <ord> SI2, SI1, VS1, VS2, SI2, VVS2, VVS1, SI1, VS2, VS1, SI1, VS1, SI1, …
$ depth       <dbl> 61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4, 64.0, 6…
$ table       <dbl> 55, 61, 65, 58, 58, 57, 57, 55, 61, 61, 55, 56, 61, 54, 62, 58, 54,…
$ price       <int> 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339, 340, 342, 34…
$ x           <dbl> 3.95, 3.89, 4.05, 4.20, 4.34, 3.94, 3.95, 4.07, 3.87, 4.00, 4.25, 3…
$ y           <dbl> 3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, 4.05, 4.28, 3…
$ z           <dbl> 2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, 2.39, 2.73, 2
  • 데이터 요약 출력
    양적 변수는 기술통계량을, 질적 변수는 각 그룹별 데이터의 수를 요약하여 줍니다. 수치를 확인하며 입력오류가 있는지 더블체크 할 수 있습니다.
 # summary(데이터 명)
> summary(diamonds)

     carat               cut        color        clarity          depth      
 Min.   :0.2000   Fair     : 1610   D: 6775   SI1    :13065   Min.   :43.00  
 1st Qu.:0.4000   Good     : 4906   E: 9797   VS2    :12258   1st Qu.:61.00  
 Median :0.7000   Very Good:12082   F: 9542   SI2    : 9194   Median :61.80  
 Mean   :0.7979   Premium  :13791   G:11292   VS1    : 8171   Mean   :61.75  
 3rd Qu.:1.0400   Ideal    :21551   H: 8304   VVS2   : 5066   3rd Qu.:62.50  
 Max.   :5.0100                     I: 5422   VVS1   : 3655   Max.   :79.00  
                                    J: 2808   (Other): 2531                  
     table           price             x                y                z         
 Min.   :43.00   Min.   :  326   Min.   : 0.000   Min.   : 0.000   Min.   : 0.000  
 1st Qu.:56.00   1st Qu.:  950   1st Qu.: 4.710   1st Qu.: 4.720   1st Qu.: 2.910  
 Median :57.00   Median : 2401   Median : 5.700   Median : 5.710   Median : 3.530  
 Mean   :57.46   Mean   : 3933   Mean   : 5.731   Mean   : 5.735   Mean   : 3.539  
 3rd Qu.:59.00   3rd Qu.: 5324   3rd Qu.: 6.540   3rd Qu.: 6.540   3rd Qu.: 4.040  
 Max.   :95.00   Max.   :18823   Max.   :10.740   Max.   :58.900   Max.   :31.800  

3) 변수별 기술 통계량 확인

  • 평균, 절사평균, 중위수, 최빈수 각각 구하기
library(prettyR) # 최빈수를 구하기 위해 e1071 패키지 로드
mean(diamonds$carat) # 평균 : mean(데이터 명$변수 명)
mean(diamonds$carat, trim = 0.05) # 5% 절사평균 : trim = 절사할 값 추가
median(diamonds$carat) # 중위수 : mean(데이터 명$변수 명)
prettyR::Mode(diamonds$carat) # 최빈수 : Mode(데이터 명$변수 명)
  • 최솟값, 최댓값, 범위, 분산, 표준편차(SD), 절대편차(MAD) 각각 구하기
max(diamonds$carat) # 최댓값
min(diamonds$carat) # 최솟값
range(diamonds$carat) # 범위 (최솟값, 최댓값 한번에 출력
diff(range(diamonds$carat)) # 최솟값과 최댓값의 차를 알고 싶다면
IQR(diamonds$carat) # 사분위 범위 
var(diamonds$carat) # 분산
sd(diamonds$carat) # 표준편차
mad(diamonds$carat) # 절대편차
  • 분포의 모양 각각 구하기
    • 왜도(skewness) : 대칭 여부를 알려줌
    • 첨도(kurtosis) : 중심의 뽀족함 정도를 알려줌
library(e1071) # 왜도와 첨도를 구하기 위해 e1071 패키지 로드
e1071::skewness(diamonds$carat) # 왜도
e1071::kurtosis(iamonds$carat) # 첨도
  • 위의 것들을 한번에 출력하기
    (저렇게 각각 하면 출력도 각각 되는데, 보기에 깔끔하진 않겠죠?)

     🌈dplyr 패키지의 summarise를 활용
       summarise 안에 위의 함수들을 몽땅 넣어주면 됩니다.
       최빈수를 반환해주는 PrettyR 패키지의 Mode 함수는 문자 형태로 출력됩니다. 때문에 속성을 숫자형으로 바꾸려고 as.numeric 함수를 사용하였습니다.

> diamonds %>% 
+   dplyr::summarise(n           = n(),
+                    Mean        = mean(carat),
+                    TrimmedMean = mean(carat, trim = 0.05),
+                    Mediam      = median(carat),
+                    Mode        = as.numeric(prettyR::Mode(carat)),
+                    Range       = diff(range(carat)),
+                    IQR         = IQR(carat),
+                    VAR         = var(carat),
+                    SD          = sd(carat),
+                    MAD         = mad(carat),
+                    SKEW        = e1071::skewness(carat),
+                    KURT        = e1071::kurtosis(carat))

# A tibble: 1 x 12
      n  Mean TrimmedMean Mediam  Mode Range   IQR   VAR    SD   MAD  SKEW  KURT
  <int> <dbl>       <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 53940 0.798       0.757    0.7   0.3  4.81  0.64 0.225 0.474 0.474  1.12  1.26


 🌈psych 패키지의 describe를 활용
  저렇게 길게 썼던 코드가 아래의 한줄로 모두 해결됩니다.
  trimmed를 별도로 설정하지 않을 시 10% 절사 평균으로 나옵니다.
  (참고로, 요 함수를 for문이나 purrr의 map 함수와 활용하면 데이터 내 모든 수량적 변수의 기술통계량을 한번에 뽑아낼 수 있겠죠! => 포스팅 했습니다! 보러가기)

# psych 패키지 설치 및 로드
> install.packages("psych")
> library(psych)

# psych::describe(데이터)
# trimmed :  5% 절사평균
> psych::describe(diamonds$carat, trim = 0.05) 

   vars     n mean   sd median trimmed  mad min  max range skew kurtosis se
X1    1 53940  0.8 0.47    0.7    0.76 0.47 0.2 5.01  4.81 1.12     1.26  0

 데이터를 분석하기에 앞서 데이터가 어떤 데이터인지, 업종에 따른 특성은 무엇이 있는지, 숫자의 특징은 무엇이 있는지 등등을 아는 것은 매우 중요합니다.

 예를 들어, 음악 앱 관련된 데이터를 분석한다면 해당 데이터 내에 포함된 변수(장르, 음악 템포, 가수, 별점 ...)가 무엇을 뜻하는지와 어떤 형태로 분포되어 있는지, 숫자형 데이터인지, 문자형 데이터인지, 단순 데이터 내의 내용을 넘어 요즘 음악 앱 트렌드는 어떤지, 사용 성연령대는 어떠한지, 유저의 라이프 스타일은 어떠할지 등등을 알고 있어야 더 유의미한 인사이트를 얻을 수 있습니다. 이에 대해 R은 쉽고 빠르게 수량적 정보를 파악할 수 있게 해주니 참 유용하네요😎

 위 내용과 관련하여 더 쉽게 데이터 살필 수 있는 코드를 알게된다면 계속해서 추가해볼게요. 그럼 감사합니다.

profile
안녕하세요! 이것저것 하고 있습니다 👩‍🔧

0개의 댓글