통계는 크게 표본의 (a) 도수 분포와 중심화 경향, 그리고 퍼짐 정도를 측정하여 집단의 특성에 대해서 기술하는 기술통계(descriptive statistics)와, (b) 기술통계량을 가지고 모집단의 parameter 값 (모평균, 모분산 등)을 추정하고 가설을 검증하는 추정통계(inferential statistics)로 구분할 수 있습니다.
이번 포스팅에서는 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)
> 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" 등의 옵션을 제공합니다.