지난 포스팅에서 연속형 변수(continuous variable)의 중심화 경향(central tendancy), 퍼짐 정도(dispersion), 분포형태 및 대칭정도 (distribution and symmetry) 등의 R 함수에 대해 알아보았습니다.

 

R에서는 이들 개별 통계량에 대해 개별 R 함수를 제공함과 동시에, 참 편리하게도 한방에(!) 연속형 변수의 기술통계량을 볼 수 있게 해주는 함수들이 있는데요,

 

(1) 연속형 변수 요약통계 한번에 보기

  :  summary(), stat.desc(), describe()

 

(2) 연속형 변수 그룹별(요인별) 요약통계 비교하기

  : tapply(var, factor, summary), aggregate(), summaryBy(), describe.by()

 

로 나누어서 소개해보겠습니다. 

 

먼저, 한국 아침 드라마 초간단 요약 사진을 보면서 자료 정리 및 요약의 효용에 대해 직관적으로 이해를 한 후에, R을 이용한 (1) 연속형 변수 요약통계 한번에 보기를 시작하겠습니다.

 

 

[ 한국 아침 드라마 초간단 요약, ㅋㅋ~ ]

(* 사진출처 : 미상)

 

 

[ 연속형 변수 요약통계 한번에 보기 package & function 요약 ]

 

 category

 package

function 

statistics 

 (1)

descriptive

statistics

summary

base

summary() 

 min, 1Q, median, mean, 3Q, max

pastecs

 stat.desc()

 nbr.val, nbr.null, nbr.na, min, max, range, sum,

 median, mean, var, std.dev, coef.var,

 skewness, kurtosis, normtest.W, normtest.p,

 SE.mean, CI.mean.p

psych 

describe() 

 n, mean, std.dev, median, trimmed, mad,

 min, max, range, skew, kurtosis, se

 (2)

descriptive

statistics

comparison

by group (factor)

 base

tapply(var, factor, summary) 

 summary: min, 1Q, median, mean, 3Q, max,

 (user defined) functions...

 base

by() 

 (user defined) functions... 

 stats

aggregate() 

 (user defined) functions...

 doBy

summaryBy() 

 (user defined) functions... 

 psych

describeBy() 

 n, mean, sd, median, trimmed, mad,

 min, max, range, skew, kurtosis, se

 

 

MASS package 내 Cars93 데이터프레임의 가격(Price), 고속도로연비(MPG.highway) 연속형 변수에 대해서 요약통계를 계산해보겠습니다.

 

 
> 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 ...

 

 

 

 

 각 package별 R 함수 사용예는 아래와 같습니다.

 

(1) base package : summary()

 

 

> ##--- (1) base package : summary()
> 
> # summary of one variable
> summary(Cars93$Price)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      7      12      18      20      23      62 
> 
> # summary of muliple variables
> summary(Cars93[c("Price", "MPG.highway")])
     Price     MPG.highway
 Min.   : 7   Min.   :20  
 1st Qu.:12   1st Qu.:26  
 Median :18   Median :28  
 Mean   :20   Mean   :29  
 3rd Qu.:23   3rd Qu.:31  
 Max.   :62   Max.   :50

 

 

base package의 summary() 함수는 중심화 경향과 퍼짐정도에 대해서 quick 하게 볼 수 있는 통계량들을 제공합니다.  base package에 들어있으므로 사용하기에 편리한 반면, 약간 부족한 듯한 면이 있습니다.

  •  summary() : min, 1Q, median, mean, 3Q, max

 

 

(2) pastecs package : stat.desc()

 

 

> ##--- (2) pastecs package : stat.desc()
> install.packages("pastecs")
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/pastecs_1.3-18.zip'
Content type 'application/zip' length 1636171 bytes (1.6 MB)
downloaded 1.6 MB

package ‘pastecs’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\user\AppData\Local\Temp\RtmpILyJlg\downloaded_packages
> library(pastecs)
필요한 패키지를 로딩중입니다: boot

다음의 패키지를 부착합니다: ‘boot’

The following object is masked from ‘package:survival’:

    aml

 

> # summary statistics of "Price", "MPG.highway" by stat.desc() function

> round(
+   stat.desc(Cars93[c("Price", "MPG.highway")], # dataframe[c(variable name)]
+                 basic = TRUE, # nbr.val, nbr.null, nbr.na, min, max, range, sum
+                 desc = TRUE, # median, mean, var, std.dev, coef.var
+                 norm = TRUE, # skewness, kurtosis, normtest.W, normtest.p
+                 p = 0.90 # SE.mean, CI.mean.p
+             )
+   , 2)
              Price MPG.highway
nbr.val       93.00       93.00
nbr.null       0.00        0.00
nbr.na         0.00        0.00
min            7.40       20.00
max           61.90       50.00
range         54.50       30.00
sum         1814.40     2705.00
median        17.70       28.00
mean          19.51       29.09
SE.mean        1.00        0.55
CI.mean.0.9    1.66        0.92
var           93.30       28.43
std.dev        9.66        5.33
coef.var       0.50        0.18
skewness       1.48        1.19
skew.2SE       2.97        2.38
kurtosis       3.05        2.30
kurt.2SE       3.08        2.32
normtest.W     0.88        0.92
normtest.p     0.00        0.00

 

 

 

stat.desc() 함수의 옵션 별로 제공하는 통계량은 아래와 같습니다.  IQR, quantile 빼고 다 있구요, 화면에 제시해주는 포맷도 아주 깔끔해서 보기에 좋아서 제가 제일 선호하는 함수이기도 합니다.

  • basic = TRUE : 관측치 개수, null 개수, NA 개수, 최소값, 최대값, 범위, 합
  • desc = TRUE : 중앙값, 평균, 분산, 표준편차, 변이계수
  • norm = TRUE : 왜도, 첨도, 정규성 검정통계량, 정규성 검정 P-value
  • p = 0.90 :  신뢰계수 90% (유의수준 10%) 값 => 90% 신뢰구간은 평균 ± CI.mean.0.9 값
    (위의 예 Price의 90% 신뢰구간은 19.51 ± 1.66)

 

 

 

(3) psych package : describe()

 

 > install.packages("psych")
> library(psych)
> 
> describe(Cars93[c("Price", "MPG.highway")], 
+          na.rm = TRUE, # missing value is not included 
+          interp = TRUE, # method of median calculation
+          skew = TRUE, # skewness, kurtosis
+          ranges = TRUE, # ragne
+          trim = 0.1 # trimmed mean
+          )

vars n mean sd median trimmed mad min max range skew kurtosis se Price 1 93 20 9.7 18 18 8.3 7.4 62 54 1.5 3.0 1.00 MPG.highway 2 93 29 5.3 28 29 4.4 20.0 50 30 1.2 2.3 0.55

 

 psych package의 describe() 함수는 summary() 보다는 많고 stat.desc() 보다는 적은 기술통계량을 보여줍니다. 

 

  • describe() : 관측값 개수(n), 평균(mean), 표준편차(sd), 중앙값(median), 절삭평균(10% 절삭평균), 중위값절대편차(from 중위값) (MAD, median absolute deviation), 최소값(min), 최대값(max), 범위(range), 왜도(skew), 첨도(kurtosis), 표준오차(SE, standard error)


[참고]

중위값 절대 편차 (MAD, median absolute deviation) = median(|X - median(X)|) * 1.4826 
(이때 1.4826은 scaling factor (또는 normalizing constant) 이며, 정규적인 자료에서 scaling factor를 곱해주면 표준편차와 비슷해짐)

(* 댓글남겨주신 데이터과학자님, 감사드립니다)


summary()와 stat.desc() 함수가 column에 variable을 row에 statistics를 보여주는 반면, describe() 함수는 반대로 row에 variable을, column에 statistics를 보여줍니다. 

 

원하는 제시 포맷을 선택하고, 원하는 기술통계량을 옵션에서 선택해서 연속형 자료를 일목요연하게 정리, 요약하면 되겠습니다.

 

많은 도움 되었기를 바랍니다.  

질문은 댓글로 남겨주세요. 

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^

 

728x90
반응형
Posted by Rfriend
,

통계는 크게 표본의 (a) 도수 분포와 중심화 경향, 그리고 퍼짐 정도를 측정하여 집단의 특성에 대해서 기술하는 기술통계(descriptive statistics)와, (b) 기술통계량을 가지고 모집단의 parameter 값 (모평균, 모분산 등)을 추정하고 가설을 검증하는 추정통계(inferential statistics)로 구분할 수 있습니다.

 

이번 포스팅에서는 R에서 벡터를 대상으로 사용할 수 있는 기술 통계 관련 함수에 대해서 알아보겠습니다.

 

R 기술통계 함수

 

-- 분포 및 중심화 경향 --

 

(1) 평균 : mean(x)

 

> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
> mean(x)
[1] 5.5 

 

 

(2) 중앙값 : median(x)

 

> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
> median(x)
[1] 5.5
> y <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
> median(y)
[1] 5

 

벡터 x가 홀수개이면 정 가운데 값을 중앙값을 가져오지만, 위의 case와 같이 x가 짝수개 이면 정가운데의 양쪽 두개의 값을 가져다가 평균을 내서 중앙값을 계산합니다.

 

 

(3) 최소값 : min(x)

 

> min(x)
[1] 1
> min(y)
[1] 1 

 

 

which.min(my_vec) 은 최소값이 있는 위치의 index 를 반환합니다. NA가 포함되어 있는 vector의 경우 min(my_vec) 이 NA를 반환한데 반해서 (NA에 대한 전처리 필요), my_vec[wich.min(my_vec)] 처럼 최소값을 ndexing을 해오면 '-12'를 반환했습니다.

 

 

> my_vec <- c(-5, 3, 10, 3, -12, NA)
> my_vec
[1]  -5   3  10   3 -12  NA
> 
> min(my_vec)
[1] NA
> 
> which.min(my_vec) # index of min value in 'my_vec' vector
[1] 5
> 
> my_vec[which.min(my_vec)]
[1] -12

 

 

 

 

(4) 최대값 : max(x)

 

> max(x)
[1] 10
> max(y) 

 

> my_vec <- c(-5, 3, 10, 3, -12, NA)
> my_vec
[1]  -5   3  10   3 -12  NA
> 
> max(my_vec)
[1] NA
> 
> which.max(my_vec) # index of max value in 'my_vec' vector
[1] 3
> 
> my_vec[which.max(my_vec)]
[1] 10 

 

 

 

(5) 범위 : range(x)

 

> range(x)
[1]  1 10
> range(y)
[1] 1 9 

 

 

(6) IQR(Inter-Quartile Range) : IQR(x)

 

> IQR(x)
[1] 4.5
> IQR(y)
[1] 4 

 

 

(7) 중심화 경향 및 분포 요약 : summary(x)

 

> summary(x)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    3.25    5.50    5.50    7.75   10.00 

 

숫자형 벡터의 경우 summary() 함수가 위의 1번에서 6번까지 함수를 한번에 처리할 수 있는 유용한 함수가 되겠습니다.

 

 

-- 퍼짐 정도 --

 

(8) 분산 : var(x)

 

> var(x)
[1] 9.166667
> var(y)
[1] 7.5 

 

 

(9) 표준편차 : sd(x)

 

> sd(x); sd(y)
[1] 3.02765
[1] 2.738613 

 

참고) 세미콜론 ';' 을 사용하면 같은 줄에 R 명령어를 연속으로 해서 쓸 수 있습니다

 

 

-- 확률분포의 비대칭 정도 --

 

(10) 왜도

 

> install.packages("fBasics") # 왜도, 첨도 분석 가능한 package 설치 > library(fBasics) # package 호출 > hist(mtcars$mpg)

 

 

 

 

 

 

> skewness(mtcars$mpg) [1] 0.610655 attr(,"method") [1] "moment"

 

 

R에 왜도와 첨도를 위한 함수가 내장되어 있지 않기 때문에 별도 패키지(fBasics)를 설치해야 합니다.

자동차 정보가 들어있는 mtcars 데이터 프레임의 연비에 대해서 히스토그램을 그려보니 평균보다 왼쪽으로 치우쳐 있고 오른쪽으로 꼬리가 긴 분포를 띠고 있네요. 그러면 왜도(skewness) 가 '0'보다 크게 나타납니다. (공식이 평균에서 관측치를 뺀 값을 3제곱 하기 때문이예요) 위 예에서는 왜도가 0.61로 '0'보다 크게 나왔지요. 정규분포의 평균과 일치하면 왜도는 '0'이 되고, 반대로 평균보다 오른쪽으로 값이 치우쳐 있고 왼쪽으로 꼬리가 길면 왜도는 '0'보다 작은 값이 나옵니다.

 

 

(11) 첨도

 

> kurtosis(mtcars$mpg)
[1] -0.372766
attr(,"method")
[1] "excess"

 

관측값이 정규분포보다 뾰쪽한가 아닌가를 가늠하는 쳑도가 첨도입니다. '3'보다 크면 정규분포보다 더 뾰족한 모양이고, '3'보다 작으면 정규분포보다 덜 뾰족한 모양이라고 해석하면 되겠습니다. (패키지에 따라서는 '3'을 빼서 '0'으로 표준화해서 값을 제시하기도 합니다)

 

 

-- 기타 함수 --

 

(12) 합 : sum(x)

 

> sum(x)
[1] 55
> sum(y)
[1] 45

 

 

(13) n차 차분 : diff(x, lag=n)

 

> diff(x, lag=1)
[1] 1 1 1 1 1 1 1 1 1
> diff(x, lag=2)
[1] 2 2 2 2 2 2 2 2
> diff(x, lag=3)
[1] 3 3 3 3 3 3 3 

 

관측값에서 직전 관측값을 뺀 차분을 구하는 함수입니다. 시계열분석할 때 정상화하기 위해서 차분을 이용하는데요, 시차(lag)를 분석 목적에 따라 또 데이터 특성에 따라서 입력해주면 됩니다. 디폴트는 lag=1 이 되겠습니다.

 

 

(14) 길이, 관측값 개수 : length()

 

> # 벡터에 length() 사용 시
> length(x)
[1] 10
> length(y)
[1] 9 
> 

> # 데이터 프레임에 length()사용 시

> length(mtcars)
[1] 11
> 

> # 데이터 프레임의 특정 변수에 length($) 사용 시

> length(mtcars$mpg)
[1] 32

 

벡터에서 length()는 관측값 개수를 계산해서 보여줍니다.

데이터 프레임에서는 column 개수를 나타내주고요, 데이터 프레임의 특정 변수를 지정하면 그 특정 변수의 관측값의 개수를 세서 보여줍니다.

 

 

(15) 순위 : rank()

 

> rank(x) [1] 1 2 3 4 5 6 7 8 9 10 >
>
rank(-x) [1] 10 9 8 7 6 5 4 3 2 1 >

> mtcars$mpg
 [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5
[23] 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4

>

> rank(mtcars$mpg, 
+      na.last = TRUE, 
+      ties.method = c("max"))
 [1] 20 20 25 22 15 14  4 26 25 17 13 11 12  8  2  2  5 31 30 32 23  9  8  3 17 28 27 30 10 18  6 22

 

> ##----------------------- > ## rank() {base package} > ##----------------------- > > # if there are no ties(i.e., equal values), no problem at all > x <- c(1, 5, 9, 7) > rank(x) [1] 1 2 4 3 > > > # if there are ties, ties can be handled in several ways > y <- c(1, 1, 1, 5, 9, 7) > > # returns average, default setting > rank(y) [1] 2 2 2 4 6 5 > rank(y, ties.method = c("average")) [1] 2 2 2 4 6 5 > > # first occurrence wins > rank(y, ties.method = c("first")) [1] 1 2 3 4 6 5 > > # ties broken at random > rank(y, ties.method = c("random")) [1] 3 2 1 4 6 5 > > rank(y, ties.method = c("random")) # ...random one more time [1] 1 3 2 4 6 5 > > rank(y, ties.method = c("random")) # ...random...again [1] 1 2 3 4 6 5 > > # rank by max value as used classically > rank(y, ties.method = c("max")) [1] 3 3 3 4 6 5 > > # rank by min value as in Sports > rank(y, ties.method = c("min")) [1] 1 1 1 4 6 5

 

rank는 순위대로 정렬해주는게 아니라 순위의 색인을 나타내줍니다.

디폴트는 작은 값부터 1을 부여해주고, 큰 것 부터 1을 부여하려면 '-'를 붙여주면 됩니다.

 

동일한 값(Ties, i.e, equal values)이 있을 경우 rank() 함수는 "average" (default), "first", "random", "max", "min" 등의 옵션을 제공합니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.

 

728x90
반응형
Posted by Rfriend
,