기계 학습의 첫 단계는 데이터를 이해하는 것이다. 데이터의 특징은 값의 최소, 최대, 평균 등의 기술 통계를 구해보거나 데이터를 시각화해 이해할 수 있다.
기술 통계
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을 이용한 데이터 처리&분석 실무 中