R 일변량 연속형 자료 요약 - (3) 분포형태와 대칭정도(distrubution, symmetry) : 왜도(skewness), 첨도(kurtosis), 분위수-분위수(Quantile-Qunantile)
R 분석과 프로그래밍/R 통계분석 2015. 10. 12. 10:38일변량 연속형 자료에 대해 기술통계량(descriptive statistics)을 이용한 자료의 요약과 정리는 크게
- (1) 중심화 경향 (central tendency)
: 산술평균, 중앙값, 최빈값, 기하평균, CAGR, 조화평균, 가중평균
: 분산, 표준편차, 변이계수, 범위, IQR, 백분위수
- (3) 분포형태와 대칭정도 (distribution)
: 왜도, 첨도, 분위수-분위수
의 3가지로 구분할 수 있습니다.
이번 포스팅에서는 일변량 연속형 자료의 (3) 분포형태와 대칭 정도 (distribution and symmetry)에 대해 통계 이론과 활용 상의 주의점을 알아보고, R 함수를 가지고 예를 들어보겠습니다.
다시 한번 말씀드리지만, 위의 3개의 카테고리는 설명을 쉽게 하기 위해 구조화한 것이며, 실제 분석업무할 때는 중심 경향, 퍼짐 정도, 분포형태와 대칭 정도의 통계량을 같이 봐야 하며, 그래프도 병행해서 보면서 해석을 하는 것이 중요합니다. 통계량을 단편적으로 보거나, 통계량만 보는 것은 잘못된 해석, 판단으로 이끌 수 있는 위험이 있습니다.
[ 산술통계량(descriptive statistics)과 R function ]
산술통계 |
통계량 (statistics) |
R function |
중심화 경향 (central tendency) |
산술평균 (arithmetic mean) |
mean() |
중앙값 (median) | median() | |
최빈값 (mode) |
which.max(table()) | |
기하평균 (geometric mean) |
prod(x)^(1/n)1/mean(1/x) where, n = length(x) | |
연평균성장률 (CAGR : Componded Average Growth Rate) |
(FV/IV)^(1/n)-1 where, IV : initial value of an investment | |
조화평균 (harmonic mean) |
1/mean(1/x) | |
가중평균 (weighted average) |
weighted.mean() | |
퍼짐 정도 (dispersion) |
분산 (variance) |
var() |
표준편차 (standard deviation) | sd() | |
변이계수 (coefficient of variation) |
100*sd(x)/mean(x) | |
범위 (range) |
diff(range()) | |
IQR (Inter Quartile Range) |
IQR() | |
최소값 (min) |
min() | |
최대값 (max) |
max() | |
백분위수(percentile) |
quantile(x, probs=c(,,,,)) | |
분포형태와 대칭정도 (distribution, symmetry) |
왜도 (skewness) |
skewness(), fBasics package |
첨도 (kurtosis) |
kurtosis(), fBasics package | |
분위수-분위수(Quantile-Quantile) |
qqnorm(), qqline(), qqplot() |
※ 중심화 경향, 퍼짐 정도, 분포형태와 대칭정도의 통계량을 함께 봐야함
※ 통계량과 함께 그래프를 함께 봐야함
R 실습에는 MASS 패키지 내 Cars93 데이터의 차종(Type), 가격(Price) 변수를 활용하겠습니다.
> library(MASS) > str(Cars93) 'data.frame': 93 obs. of 27 variables: $ Manufacturer : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ... $ Model : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ... $ Type : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ... $ Min.Price : num 12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ... $ Price : num 15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ... $ Max.Price : num 18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ... $ MPG.city : int 25 18 20 19 22 22 19 16 19 16 ... $ MPG.highway : int 31 25 26 26 30 31 28 25 27 25 ... $ AirBags : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ... $ DriveTrain : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ... $ Cylinders : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ... $ EngineSize : num 1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ... $ Horsepower : int 140 200 172 172 208 110 170 180 170 200 ... $ RPM : int 6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ... $ Rev.per.mile : int 2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ... $ Man.trans.avail : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ... $ Fuel.tank.capacity: num 13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ... $ Passengers : int 5 5 5 6 4 6 6 6 5 6 ... $ Length : int 177 195 180 193 186 189 200 216 198 206 ... $ Wheelbase : int 102 115 102 106 109 105 111 116 108 114 ... $ Width : int 68 71 67 70 69 69 74 78 73 73 ... $ Turn.circle : int 37 38 37 37 39 41 42 45 41 43 ... $ Rear.seat.room : num 26.5 30 28 31 27 28 30.5 30.5 26.5 35 ... $ Luggage.room : int 11 15 14 17 13 16 17 21 14 18 ... $ Weight : int 2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ... $ Origin : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ... $ Make : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 . |
Histogram으로 살펴본 차종별 가격(Price by Type)의 분포는 아래와 같으며, 그래프를 통해 차종별 가격의 왜도(좌우 대칭 정도)와 첨도(정규분포 대비 봉우리 높이 정도)를 가늠해 볼 수 있습니다.
> library(ggplot2) > ggplot(Cars93, aes(x=Price)) + + geom_histogram(binwidth=3, fill = "blue", colour = "black") + + ggtitle("Histogram, Price by Type") + + facet_grid(Type ~ .) |
fBasics package를 먼저 설치, 호출한 후에 왜도 skewness() 함수, 첨도 kurtosis() 함수를 사용해보겠습니다.
> install.packages("fBasics") Installing package into ‘C:/Users/user/Documents/R/win-library/3.2’ (as ‘lib’ is unspecified) trying URL 'http://cran.rstudio.com/bin/windows/contrib/3.2/fBasics_3011.87.zip' Content type 'application/zip' length 1553624 bytes (1.5 MB) downloaded 1.5 MB package ‘fBasics’ successfully unpacked and MD5 sums checked The downloaded binary packages are in C:\Users\user\AppData\Local\Temp\Rtmpu6UbP8\downloaded_packages > library(fBasics) 필요한 패키지를 로딩중입니다: timeDate 필요한 패키지를 로딩중입니다: timeSeries Rmetrics Package fBasics Analysing Markets and calculating Basic Statistics Copyright (C) 2005-2014 Rmetrics Association Zurich Educational Software for Financial Engineering and Computational Science Rmetrics is free software and comes with ABSOLUTELY NO WARRANTY. https://www.rmetrics.org --- Mail to: info@rmetrics.org
|
R의 fBasics 패키지를 활용해 왜도(skewness), 첨도(kurtosis)를 분석해보겠습니다.
(1) 왜도 (skewness) : skewness()
왜도(skewness)는 자료의 대칭성을 알아보는 측도입니다. 좌우 대칭형태를 띠는 정규분포는 왜도(β3) 점수가 '0' 이며, 오른쪽으로 꼬리가 긴 분포 (right-skewed distribution)은 왜도 점수가 '0'보다 크며(β3 > 0), 왼쪽으로 꼬리가 긴 분포(left-skewed distribution)은 왜도 점수가 '0'보다 작습니다((β3 < 0). 이는 위의 수식을 보면 기본적으로 관측값에서 평균을 뺀 값을 세제곱한 후에 더했기 때문입니다.
위의 Histogram을 보면 Cars93의 Type별 Price를 보면 전반적으로 오른쪽으로 꼬리가 긴 형태를 띠고 있는데요, 아래의 왜도를 구한 값을 보면 모두 양수 임을 알 수 있고, 특히 오른쪽으로 꼬리가 긴 Midsize와 Sporty type은 왜도 점수가 높음을 알 수 있습니다.
> # skewness : skewness() > skewness(Cars93$Price) [1] 1.483982 attr(,"method") [1] "moment" > > with(Cars93, tapply(Price, Type, skewness)) Compact Large Midsize Small Sporty Van 0.7797609 0.8152686 1.0600340 1.0068697 1.0286200 0.1655290 |
(2) 첨도 (kurtosis) : kurtosis()
첨도(kurtosis)는 정규분포 대비 봉오리의 높이를 알아보는 측도입니다. 첨도가 '0'보다 크면 (β4 > 0) 정규분
포보다 뾰족하다는 의미이며, 첨도가 '0'보다 작으면 (β4 < 0) 정규분포보다 납작하다는 뜻으로 해석하면 되겠습니다.
더불어, 첨도(kurtosis, β4)는 데이터가 이봉분포(two mountaintop distribution)에 대해서 얼마나 단봉분포(one mountaintop distribution)에 가깝게 있는가를 판단하는데도 사용합니다.
아래에는 차종(Type)별 가격(Price)의 첨도를 계산해 놓았는데요, Midsize와 Small type이 양수로 나와서 정규분포보다 뾰족한 형태를 취하고 있다고 볼 수 있겠습니다. (위의 histogram 을 봤을 때, Van이 음수로 나온게 의외네요)
> # kurtosis : kurtosis() > > kurtosis(Cars93$Price) [1] 3.051418 attr(,"method") [1] "excess" > > with(Cars93, tapply(Price, Type, kurtosis)) Compact Large Midsize Small Sporty Van -0.8006747 -1.0263810 0.6455252 1.0822979 -0.1019349 -0.5974974 |
마지막으로 정규분포 형태를 띠는지의 검정 및 그래프 확인하는 방법은 아래의 포스팅을 참조하시기 바랍니다.
☞ R 단일 모집단 분포의 정규성 검정 : shapiro.test(), qqnorm(), qqline()
☞ R 데이터 변환 (2) 정규분포화 log(), sqrt()
많은 도움 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^