본문 바로가기

R/R을 이용한 데이터 처리&분석 실무

데이터 탐색

반응형

기계 학습의 첫 단계는 데이터를 이해하는 것이다. 데이터의 특징은 값의 최소, 최대, 평균 등의 기술 통계를 구해보거나 데이터를 시각화해 이해할 수 있다.

 

기술 통계

summary()는 "summaryBy()" 절에서 살펴본 함수로, 데이터에 대한 간략한 분포 정보를 알려준다. Hmisc에는 기술 통계 정보를 알려주는 describe()와 summary.formula()가 있다. 이 절에서는 이들 세 함수를 사용한 데이터 탐색 방법을 알아본다.

 

-Hmisc::describe : 통계 요약 정보를 구한다.

Hmisc::describe(
  x, # 데이터 프레임
  # NA만 저장된 변수에 대한 처리를 지정한다. TRUE일 경우 출력의 맨 뒤에 NA만 저장한 변수를
  # 나열한다. FALSE일 경우 NA만 저장된 변수에 대한 기술 통계도 출력한다. 그러나 NA만 저장된
  # 변수의 경우 기술 통계 결과에 별 의미는 없을 것이다.
  exclude.missing=TRUE
)

Hmisc::describe(
  x,     # 포뮬러
  data,  # 포뮬러를 적용할 데이터
  # NA를 처리할 방법. 기본값은 na.retain으로, NA를 유지한다. na.omit 또는 na.delete를 지정해
  # NA를 제외할 수 있다.
  na.action
)

 

 

-Hmisc::summary.formula : 포뮬러를 사용해 데이터를 요약한다.

Hmisc::summary.formula(
  formula,
  data,
  na.action=NULL,
  fun=NULL, # 데이터를 요약할 때 사용할 함수. 이 값을 지정하지 않으면 mean이 사용된다.
  # method의 기본값은 response이며, formula에서 '~' 좌측(이하 lhs)에 있는 하나 또는 그 이상의
  # 반응 변수를 '~' 우측(이하 rhs)의 설명 변수 각각으로 요약한다. reverse의 경우 formula의
  # lhs에 하나의 범주형 변수를 적고 rhs에 변수를 나열하면 rhs의 변수가 lhs의 범주형 변수로
  # 하나하나 분할되어 요약된다. cross의 경우 lhs의 변수들을 rhs 변수의 조합에 따라 분할해
  # 요약한다.
method = c("response", "reverse", "cross")
)

 

 

이 절에서는 1974년에 미국의 모터 트렌드 잡지에 실린 1973 ~ 1974년 자동차 모델의 연료 소비, 10가지 디자인 요소, 성능을 비교한 mtcars 데이터에 대해 요약해본다. 다음은 mtcars 데이터의 모양이다.

>str(mtcars)
'data.frame': 32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

 

이 데이터에 describe()를 적용해보자. describe()는 summary()와 유사하지만 결측치의 수(missing), 서로 다른 값의 수(unique), 데이터의 분포, 합, 평균 등 좀 더 다양한 요약 정보를 제시한다.

>describe(mtcars)
mtcars 

 11  Variables      32  Observations
--------------------------------------------------------------------------
mpg 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      32        0       25    0.999    20.09    6.796    12.00    14.34 
     .25      .50      .75      .90      .95 
   15.43    19.20    22.80    30.09    31.30 

lowest : 10.4 13.3 14.3 14.7 15.0, highest: 26.0 27.3 30.4 32.4 33.9
--------------------------------------------------------------------------
cyl 
       n  missing distinct     Info     Mean      Gmd 
      32        0        3    0.866    6.188    1.948 
                            
Value          4     6     8
Frequency     11     7    14
Proportion 0.344 0.219 0.438
--------------------------------------------------------------------------
disp 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      32        0       27    0.999    230.7    142.5    77.35    80.61 
     .25      .50      .75      .90      .95 
  120.83   196.30   326.00   396.00   449.00 

lowest :  71.1  75.7  78.7  79.0  95.1, highest: 360.0 400.0 440.0 460.0 472.0
--------------------------------------------------------------------------
hp 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      32        0       22    0.997    146.7    77.04    63.65    66.00 
     .25      .50      .75      .90      .95 
   96.50   123.00   180.00   243.50   253.55 

lowest :  52  62  65  66  91, highest: 215 230 245 264 335
--------------------------------------------------------------------------
drat 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      32        0       22    0.997    3.597   0.6099    2.853    3.007 
     .25      .50      .75      .90      .95 
   3.080    3.695    3.920    4.209    4.314 

lowest : 2.76 2.93 3.00 3.07 3.08, highest: 4.08 4.11 4.22 4.43 4.93
--------------------------------------------------------------------------
wt 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      32        0       29    0.999    3.217    1.089    1.736    1.956 
     .25      .50      .75      .90      .95 
   2.581    3.325    3.610    4.048    5.293 

lowest : 1.513 1.615 1.835 1.935 2.140, highest: 3.845 4.070 5.250 5.345 5.424
--------------------------------------------------------------------------
qsec 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      32        0       30        1    17.85    2.009    15.05    15.53 
     .25      .50      .75      .90      .95 
   16.89    17.71    18.90    19.99    20.10 

lowest : 14.50 14.60 15.41 15.50 15.84, highest: 19.90 20.00 20.01 20.22 22.90
--------------------------------------------------------------------------
vs 
       n  missing distinct     Info      Sum     Mean      Gmd 
      32        0        2    0.739       14   0.4375   0.5081 

--------------------------------------------------------------------------
am 
       n  missing distinct     Info      Sum     Mean      Gmd 
      32        0        2    0.724       13   0.4062    0.498 

--------------------------------------------------------------------------
gear 
       n  missing distinct     Info     Mean      Gmd 
      32        0        3    0.841    3.688   0.7863 
                            
Value          3     4     5
Frequency     15    12     5
Proportion 0.469 0.375 0.156
--------------------------------------------------------------------------
carb 
       n  missing distinct     Info     Mean      Gmd 
      32        0        6    0.929    2.812    1.718 

lowest : 1 2 3 4 6, highest: 2 3 4 6 8
                                              
Value          1     2     3     4     6     8
Frequency      7    10     3    10     1     1
Proportion 0.219 0.312 0.094 0.312 0.031 0.031
--------------------------------------------------------------------------

 

같은 데이터에 summary()를 적용한 결과는 다음과 같다.

>summary(mtcars)
      mpg             cyl             disp             hp       
 Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
 1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
 Median :19.20   Median :6.000   Median :196.3   Median :123.0  
 Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
 3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
 Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
      drat             wt             qsec             vs        
 Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
 1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
 Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
 Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
 3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
 Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
       am              gear            carb      
 Min.   :0.0000   Min.   :3.000   Min.   :1.000  
 1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
 Median :0.0000   Median :4.000   Median :2.000  
 Mean   :0.4062   Mean   :3.688   Mean   :2.812  
 3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
 Max.   :1.0000   Max.   :5.000   Max.   :8.000 

 

Hmisc의 summary.formula는 포뮬러를 인자로 지정할 수 있으며, 지정한 포뮬러에 따라 데이터를 분할하여 분석할 수 있고, 분석 함수를 자유로이 지정할 수 있는 편리한 함수다. summary.formula()의 요약 방식은 method 값에 따라 달라진다.

method=“response”인 경우 ~의 우측에 나열한 변수(이하 rhs) 각각이 ~의 좌측에 나열한 변수(이하 lhs)를 요약한다. mtcars 데이터에서 mpg(1갤런당 주행 마일)를 cyl(실린더의 수), hp(마력)에 따라 요약해보자.

>summary(mpg ~ cyl + hp, data=mtcars)  # method의 기본값은 response다.
mpg    N=32

+-------+---------+--+--------+
|       |         |N |mpg     |
+-------+---------+--+--------+
|cyl    |4        |11|26.66364|
|       |6        | 7|19.74286|
|       |8        |14|15.10000|
+-------+---------+--+--------+
|hp     |[ 52, 97)| 8|27.50000|
|       |[ 97,150)| 9|21.31111|
|       |[150,205)| 8|17.15000|
|       |[205,335]| 7|13.41429|
+-------+---------+--+--------+
|Overall|         |32|20.09062|
+-------+---------+--+--------+

 

코드 실행 결과 cyl의 값(4, 6, 8)에 따른 mpg, hp의 범위에 따른 mpg가 요약된 것을 볼 수 있다. 이때 요약에 사용되는 함수는 mean이다. fun에 함수를 지정하여 다른 요약 값을 얻을 수 있다. 다음은 평균 대신 분산을 구한 예다.

> summary(mpg ~ cyl + hp, data=mtcars, fun=var)
mpg    N=32

+-------+---------+--+---------+
|       |         |N |mpg mpg  |
+-------+---------+--+---------+
|cyl    |4        |11|20.338545|
|       |6        | 7| 2.112857|
|       |8        |14| 6.553846|
+-------+---------+--+---------+
|hp     |[ 52, 97)| 8|18.494286|
|       |[ 97,150)| 9|13.743611|
|       |[150,205)| 8| 3.431429|
|       |[205,335]| 7| 4.804762|
+-------+---------+--+---------+
|Overall|         |32|36.324103|
+-------+---------+--+---------+

 

method=“reverse”인 경우 lhs에는 범주형 변수를 적고 rhs에 변수들을 적으면 lhs의 분류에 따라 rhs가 요약된다. 다음은 cyl에 따라 mpg, hp를 요약한 예다.

>summary(cyl ~ mpg + hp, data=mtcars, method="reverse")
Descriptive Statistics by cyl

+---+--------------------+--------------------+--------------------+
|   |4                   |6                   |8                   |
|   |(N=11)              |(N=7)               |(N=14)              |
+---+--------------------+--------------------+--------------------+
|mpg| 22.80/26.00/30.40  | 18.65/19.70/21.00  | 14.40/15.20/16.25  |
+---+--------------------+--------------------+--------------------+
|hp | 65.50/ 91.00/ 96.00|110.00/110.00/123.00|176.25/192.50/241.25|
+---+--------------------+--------------------+--------------------+

 

method=“cross”는 rhs에 나열한 변수의 조합으로 lhs를 요약할 때 사용한다. mpg를 cyl과 hp의 조합에 따라 요약한 결과, 표의 각 셀에는 N(개수)과 평균 mpg가 나타난다.

>summary(mpg ~ cyl + hp, data=mtcars, method="cross")

mean by cyl, hp

+---+
|N  |
|mpg|
+---+
+---+---------+---------+---------+---------+--------+
|cyl|[ 52, 97)|[ 97,150)|[150,205)|[205,335]| ALL    |
+---+---------+---------+---------+---------+--------+
|4  | 8       | 3       | 0       | 0       |11      |
| | 27.50000| 24.43333| | |26.66364|
+---+---------+---------+---------+---------+--------+
|6  | 0       | 6       | 1       | 0       | 7      |
|   |         | 19.75000| 19.70000|         |19.74286|
+---+---------+---------+---------+---------+--------+
|8  | 0       | 0       | 7       | 7       |14      |
|   |         |         | 16.78571| 13.41429|15.10000|
+---+---------+---------+---------+---------+--------+
|ALL| 8       | 9       | 8       | 7       |32      |
|   | 27.50000| 21.31111| 17.15000| 13.41429|20.09062|
+---+---------+---------+---------+---------+--------+

 

summary.formula에는 test=TRUE를 지정하면 다양한 가설 검정을 수행하는 등의 기능도 포함되어 있다. example(summary.formula)로 어떤 기능이 지원되는지 살펴보기 바란다.

 

 

데이터 시각화

가장 간단한 데이터 시각화 방법은 책에서 살펴본 plot()을 이용하는 것이다. plot()은 데이터를 크게 신경 쓰지 않고 넘겨주어도 자동으로 적절한 형태의 그래프를 찾아서 그려준다. 두 번째로 사용할 만한 함수는 caret::featurePlot()이다.

 

-caret::featurePlot : 예측 변수(피처)와 분류 간의 그래프를 그린다.

caret::featurePlot(
  x,  # 행렬 또는 데이터 프레임
  y,  # 분류를 뜻하는 팩터
  # 그래프의 종류 : 상자(box), 줄무늬(strip), 밀도(density), 산점도(pairs), 타원(ellipse)
  plot=if(is.factor(y)) "strip" else "scatter"
)

 

 

다음은 아이리스 데이터를 plot()해본 예다.

> plot(iris)
> plot(iris$Sepal.Length)
> plot(iris$Species)

 

plot( )에서 그래프에 표시된 데이터가 붓꽃의 어느 종인지를 표현하기 위해 포뮬러를 사용해 데이터를 붓꽃 종별로 분리해 그릴 수도 있고, 산점도의 점 모양을 붓꽃 종에 따라 다르게 지정할 수도 있다. 포뮬러를 사용한 예를 보자.

>plot(Species ~ Sepal.Length, data=iris)

 

다음 코드에서는 팩터 타입의 Species를 숫자로 변환해 점의 모양pch에 지정했다.

> with(iris,{
+   plot(Sepal.Length, Sepal.Width,pch=as.numeric(Species))
+   legend("topright",legend=levels(iris$Species),pch=1:3)})

 

caret 패키지에는 피처와 분류 간의 관련성을 쉽게 시각화해주는 featurePlot( ) 함수가 있다. 다음은 아이리스의 모든 변수를 iris$Speices에 따라 그리되, Speices별 구분을 타원으로 표시한 예다. 그림 9-6에서 보다시피 붓꽃 종별로 데이터의 분포를 한눈에 파악할 수 있어 Species를 피처 변수들로 알아낼 수 있는지 판단하는 데 좋은 자료가 된다.

>install.packages("caret")
>library(caret)
>featurePlot(iris[,1:4],iris$Species,"ellipse")

 

 

R을 이용한 데이터 처리&분석 실무 中

반응형

'R > R을 이용한 데이터 처리&분석 실무' 카테고리의 다른 글

전처리-2  (0) 2020.02.10
전처리-1  (0) 2020.02.09
변수 선택  (0) 2020.02.08
이상치  (0) 2020.02.08
중선형 회귀  (0) 2020.02.08