본문 바로가기

■ 프로그래밍/R

[R 기초] 기술통계량 (대표값, 산포) -1

[ R : 기술통계량 (대표값, 산포) -1 ]


# 주석

## 결과값


패키지 설치 및 로딩하기

install.packages("ggplot2") 
install.packages("RColorBrewer")
install.packages("data.table")
library(ggplot2)
library(RColorBrewer)
library(data.table)


1. 기술통계량 = 요약통계량

(1) 중심 = 대표값

  • 특징: 원본과 샘플이 비슷해야 함
  • 평균, 절사평균, 중위수(중앙값), 최빈수(최빈값)
  • 양적인 자료의 값들을 대표해 주는 값을 구해야 함


i. 평균 = 전체값의 합 / 자유도(df = degree of freedom)

mean(c(1, 2, 8, 9))   ## 5
mean(c(1, 2, 8, 89))  ## 25
mean(c(1, 2, 8, 989)) ## 250

실제 데이터 분석을 할 때 양이 많으면 모든 데이터를 다 보지 못한 상태에서 대표값을 구한다.
따라서, 대표값을 정하는 것이 무척 중요하다.
위에 값만 보더라도, 마지막 숫자 하나만 바꾸었을 뿐인데 평균 값의 차이가 엄청 크다. 여기서 평균은 대표값의 역할을 제대로 수행하지 못했다.
그만큼 평균은 outlier(이상치)에 영향을 많이 받는다.


저번 게시글에서 썼던 ggplot2::diamonds를 예로 보자.

mean(diamonds$carat) ## 0.7979397

outlier가 없다는 가정 하에, 대부분의 데이터가 0.8과 비슷하지 않을까? 라고 추측 가능


[ missing value를 처리 방법 ]
1. 제거
2. imputation(대체) : 평균 or 중위수
- 예측력 or 분류를 더 높여준다면 그게 맞는 방법
- 항상 그 방법이 통하리란 법은 없음, 그에 맞는 가장 좋은 방법 찾기!

}
age <- c(10, NA, 20, 30)
mean(age)                 
mean(age, na.rm = TRUE)   # NA를 빼고 3으로 나눈 값


ii. 5% 절사평균(5% Trimmed Mean) = 절단된 평균

데이터를 작은 것 부터 큰거로 정렬 후,Min과 Max 값을 잠시 제외(outlier 처리).
중간에 남은 데이터들로 평균을 구한 것을 “절사(절삭) 평균”이라 함
가장 많이 쓰이는 것이 5% 절사평균 (가장 작은 쪽 5%, 가장 큰 쪽 5%를 뺀 값)
i. 에서도 봤듯이, 평균이 outlier에 영향을 많이 받으니까 채택한 방법

mean(diamonds$carat, trim = 0.05) ## 0.7569029

그냥 평균 값이 약 0.8이고, 절사평균이 0.76임을 보아 이상치가 없다고 판단한다.


iii. 중위수(Median)

median(c(1, 1, 3, 7, 10)) # 3
median(c(1, 2, 8, 9))     # 5
median(c(1, 2, 8, 89))    # 5
  • 중위수는 숫자를 차례대로 나열한 후, 가장 중간에 있는 값을 칭한다.
  • 짝수일 경우, 가장 중간의 두 숫자의 평균 값이다.
  • 특징: 평균보다 이상치의 영향을 덜 받는다.
median(diamonds$carat)  # 0.7

caret의 평균, 중앙값, 중위수 모두 비슷한 값이기 때문에 평균을 대표값으로 설정한다.


iv. 최빈수(Mode)

  • 최빈수(값): 제일 많은 숫자
1, 1, 2, 2, 2, 3, 4 # 2가 최빈값
  • 아래의 최빈수는?
1, 2, 3, 4

존재하지 않음. 최빈수는 두 개 이상의 숫자가 존재할 때만 있음.


  • 데이터의 최빈값과 위치 찾기
money <- c(30, 50, 30, 50, 100, 30, 200, 40, 40)
table(money) # 작은 값부터 큰 값까지 나열하고, 각 데이터의 개수를 보여줌
## money
##  30  40  50 100 200 
##   3   2   2   1   1
which.max(table(money)) # 최빈값의 데이터와 위치를 알려줌
## 30 
##  1


“prettyR” package의 Mode함수는 바로 어떤 값이 최빈수인지 알려준다.

install.packages("prettyR")
library(prettyR)


which.max(table(diamonds$carat))
## 0.3 
##  11
prettyR::Mode(diamonds$carat)
## [1] "0.3"


(2) 퍼짐 = 산포 = 다름

데이터를 보고 생각해야 할 3가지
1. 해당 데이터, 집단에 “다름”이 얼마나 있을까?
2. 이 “다름”은 무시해도 되는가? 아니면 의미를 둬야 하나?
3. 이 “다름”은 왜 발생했는가?


i. 범위(Range) : 최대값 - 최소값

                |  평균  중위수  최빈수 | 범위
 A : 1, 2, 8, 9 |   5     5      x     |  8 
 B : 3, 4, 6, 7 |   5     5      x     |  4 
 C : 5, 5, 5, 5 |   5     5      5     |  0
  • 범위(최대값-최소값)가 작을 수록, 데이터가 비슷함
  • 가장 비슷한 데이터: C
  • 가장 다른 데이터 : A (범위가 가장 많이 차이나서)

      Q1 Q2 Q3                   
       |  |  |      범위   중위수
     A : 1, 2, 8, 9   |  8   |  6
     B : 3, 4, 6, 89  |  88  |  6
     C : 5, 5, 5, 989 |  988 |  6
  • 범위는 이상치의 영향을 상당히 많이 받음
  • 범위와 사분위범위와 비슷하면 이상치가 없는 것
  • 범위가 데이터와 비교하여 작은 수치라 느껴지면 데이터에 다름이 별로 없음
  • 반대로 데이터 수치가 크다고 느껴진다면, 데이터에 다름이 큼을 뜻함


range(diamonds$carat)       # min, max 값을 보여줌
## [1] 0.20 5.01
diff(range(diamonds$carat)) # 범위(max - min)
## [1] 4.81


ii. 사분위범위 = 사분위수범위 = IQR(Inter Quartile Range)

IQR(diamonds$carat)
## [1] 0.64

범위와 IQR의 차이가 많이 나기 때문에, 이상치가 있다고 판단


iii. (표본)분산(Variance)

var(diamonds$carat) ## 0.2246867

분산은 해당 데이터와 같이 단위가 있다면 해석이 어려움


iv. (표본)표준편차(SD: Standard Deviation)

sd(diamonds$carat) ## 0.4740112

해석: 평균 8과 0.47정도 차이 남


v. 중위수 절대편차(MAD: Median Absolute Deviation)

mad(diamonds$carat) ## 0.474432
## [1] 0.474432

중위수와 표준편차가 별로 차이가 안나기 때문에, 이상치가 없다고 판단


(3) 분포의 모양

install.packages("e1071")
library(e1071)


i. 왜도(Skweness)

  • 대칭 여부를 알려줌
e1071::skewness(diamonds$carat) ## 1.116584

0과 가깝다면 대칭
0보다 작으면 오른쪽으로 치우쳐짐
0보다 크면 왼쪽으로 치우쳐짐


ii. 첨도(Kurtosis)

  • 중심이 얼마나 뾰족한지 알려줌
e1071::kurtosis(diamonds$carat) ## 1.25625

0과 가까우면 대칭
0보다 작으면 완만함
0보다 크면 뾰족함


carat의 왜도, 첨도

hist(diamonds$carat)


- skewness와 kurtosis 모두 0보다 크기 때문에, 뾰족하면서도 왼쪽으로 치우져진 hsitogram을 볼 수 있다.


(4) 기타

i. 최소값(Min)

min(diamonds$carat) ## 0.2


ii. 최대값(Max)

max(diamonds$carat) ## 5.01