열렬히.뛰기

13. 커널 분포 추정

수학 & 통계 > 탐색적 자료분석 > 탐색적 자료분석 : 목차 > 13. 커널 분포 추정

모형과 분포

모형의 종류

  • 모수 (parametric)
  • 비모수 (non-parametric)
  • 준모수 (semi-parametric)

이 중에서 모수 기반 모델은 반드시 분포를 가정해야 한다.

histogram을 그린 뒤, 그래프의 특정 부분이 outlier인지 아닌지를 확인가능.

분포 확인하기

이 3가지 그래프와 그 단점을 극복할 방안을 생각해보자.

  1. histogram
  2. boxplot
  3. q-q plot

히스토그램과 KDE

히스토그램

  • 연속형 자료일 때 확인
  • 구간의 길이(width of bin)에 민감
  • 빈도 히스토그램 → 같은 구간의 길이. 면적 = 샘플 수
  • 상대빈도 히스토그램 → 면적이 1이 되도록 설정

커널 밀도 추정(KDE)

  • 히스토그램의 단점 : 연속형 자료 → 이산형 자료
  • 이대로 분포를 추정하면 뭔가 잘 맞지 않는다.
  • 이를 극복하기 위해 커널 밀도 추정을 활용

커널 밀도 추정 : 특징

  • 비모수적인 방법이다.
  • 연속형 자료에만 적용한다.
  • 샘플을 커널함수에 넣고, 다 더한 뒤 샘플 수 \times h 로 나눠 분포를 만든다.
\hat f_h(x) = \dfrac{1}{nh} \sum_{i=1}^{n}~ K\bigg(\dfrac{x-x_i}{h}\bigg)

n = 표본 수.

K = 커널함수.

  • 특정 분포로 만들어주는 함수
  • 정규분포, 균등분포 등등

h = 대역폭(bandwidth)

  • 커널의 모수를 평활화(smoothing parameter)
  • 모수를 변화시켜주기 때문에 hist의 모양이 바뀐다.

만약 K가 가우시안 함수(정규분포)면,

\dfrac{1}{\sigma}~ f_z\bigg(\dfrac{x-\mu}{\sigma}\bigg) = \dfrac{1}{nh}~ K\bigg(\dfrac{x-x_i}{h}\bigg)

이때 k값은 \sigma, 즉 분산을 의미하기에 그래프 모양에 영향을 미친다.

Boxplot과 이상치

Boxplot (상자그림)

  • 상자그림을 그리기 위해서는 quantile이 필요.
  • IQR (interquartile range): 전체 데이터의 50%를 찾아내는 기법
IQR = q(0.75) - q(0.25)

이상치 다루기

  • 상자그림의 최대 단점 : 이상치

  • 이상치를 구분짓는 기준 : Adjacent Values(근접값)

    보통 LL과 UL은 다음 방식으로 설정한다.

    \begin{align*} LL &= q(0.25) - 1.5 \times IQR \\ UL &= q(0.25) + 1.5 \times IQR \end{align*}

boxplot의 단점

  • 보이는 것이 전부가 아니다.
  • ex. 세 가지 시뮬레이션 샘플의 boxplot과 KDE

  1. 평범한 표준정규분포

  2. 균등분포 + 2개의 이상치

  3. 정규분포 3개의 혼합 = 봉우리가 3개인 모델

    f_X(x) = \sum_i p_i~f_i(x~|~\mu_i, \sigma_i^2).~\sum p_i = 1

boxplot은 비슷해 보일지언정, 분포는 다를 수 있다.

Quantile plot

  • 사분위수 기반의 그림은 이론적인 분포와 샘플을 비교하는데 좋다.

    ex) 회귀분석 → 잔차가 정규분포를 따르는지 확인!

probability plot

한 축에는 x_i들을, 다른 축에는 F^{-1}\bigg(\dfrac{i-0.5}{n}\bigg) 을 놓는다.

  1. 샘플 cdf의 역함수인 empirical distirbution을 그린다.

    (Empirical distribution은 step function의 형태)

  2. 또, 정규분포의 역함수를 그래프에 그린다.

  3. 둘을 비교해 본다.

Q-Q plot

  • probability plot = Q-Q plot의 특정한 형태

  • 단, 두 랜덤 샘플을 비교해서 결과를 얻는 것임을 생각해야 한다.

    샘플 사이즈가 작으면 생각보다 결과가 좋지 않을 수 있다.

예시 : 갤럭시 데이터

데이터 준비

해답
r
### 데이터 준비
rm(list=ls())
setwd("C:/Users/dlsfu/Desktop/EDA_rawData")
load("galaxy.RData")
attach(data)
str(data)

히스토그램과 kde

데이터의 히스토그램을 그려보자.

해답
r
## 히스토그램
par(mfrow = c(1, 2))
hist(EastWest, ylim=c(0, 70), 
     main="Galaxy Data")
hist(EastWest, freq=F, ylim=c(0, 0.04), 
     main="Galaxy Data")

커널밀도추정을 시행.

해답
r
## 커널밀도추정
d = density(EastWest) # 밀도 파악
str(d) # 밀도의 구조
d$bw # 커널의 대역폭

커널의 히스토그램과 실제 데이터를 비교해보자.

해답
r
# 커널의 히스토그램과 실제 데이터
windows()
par(mfrow = c(1, 2))
plot(d, main="Kernel density of Galaxy")
hist(EastWest, freq=F, main="Galaxy Data", 
     ylim=c(0, 0.04), xlim=c(-40, 40))
lines(d, lty=2, lwd=2)

대역폭(bandwidth)가 미치는 영향 역시 확인해보자.

해답
r
# 대역폭이 미치는 영향
bandwidth = c(0.5, 1, 3, 7)
title = "Kernel density of Galaxy \n with bandwidth of "

windows()
par(mfrow=c(2, 2))
for(i in bandwidth){
    dens_galaxy = density(EastWest, bw=i)
    plot(dens_galaxy,
         xlim=c(-40, 40), ylim=c(0, 0.06),
         main = paste(title, i, sep=""))
}

박스플롯과 kde

데이터가 들어갈 빈 행렬을 우선 만든다.

해답
r
### 상자그림
## 데이터 만들기
set.seed(101)
n = 400
simul = matrix(0, n, 3)

빈 행렬 속 각 열에 데이터를 채워넣는다.

  1. 정규분포에서 추출
  2. 균등분포에서 추출 + 이상치 첨가
  3. 정규분포 3개를 혼합
해답
r
# 정규분포 추출
simul[, 1] = rnorm(n)

# 균등분포 추출 + 이상치
simul[1:(n-2), 2] = runif(n-2) * 2.4 - 1.2
simul[(n-1):n, 2] = c(-2.9, 2.9)

# 정규분포 3개의 혼합
tmp1 = rnorm(300) * 0.5
tmp2 = rnorm(50) * 0.4 - 2
tmp3 = rnorm(50) * 0.4 + 2

simul[, 3] = c(tmp1, tmp2, tmp3)

# 이름 붙이기
colnames(simul) = c("std. normal", "uniform + outlier", "mixed 3 normal")

각 열의 커널밀도를 추정한다.

해답
r
# 커널밀도추정
dens_simul1 = density(simul[,1])
dens_simul2 = density(simul[,2])
dens_simul3 = density(simul[,3])

이후 시각화 진행.

해답
r
# 그래프
text2 = c("표준정규", "균등 + 이상치", "혼합")
windows()
par(mfrow=c(1, 2))
boxplot(simul, ylab="Values", 
        main="3 sample의 boxplot")
plot(dens_simul1, xlim=c(-4, 4), 
     ylim=c(0, 0.8), main="커널 밀도추정")
lines(dens_simul2, col=2)
lines(dens_simul3, col=4)
legend("topleft", text2, lty=1, col=c(1,2,4))

Q-Q plot 보기

확률을 얻고, 이론적으로 표준정규분포에 어디에 매칭되는지 확인.

해답
r
### 확률플롯
# 확률 얻기
sort_ew = sort(EastWest)
num = length(sort_ew)
probs = ((1:num)-0.5)/num

# 이론적인 표준정규분포 확인
q = qnorm(probs)

이후 확률플롯을 확인한다.

해답
r
# 확률플롯 확인
par(mfrow=c(1, 1))
plot(q, sort_ew, xlab = "표준정규분포", 
     ylab = "sorted EastWest")

이론적인 분포와 정렬 데이터를 비교해보자.

해답
r
# 이론적 분포 vs 정렬데이터
q_ew = quantile(EastWest, prob=(0:99)/100)
q_std = qnorm((0:99)/100)
    
windows()
par(mfrow=c(1, 3))
plot(q, sort_ew, xlab="표준정규 사분위수",
     ylab="sorted EastWest",
     main="EastWest의 확률플롯")
plot(q_std, q_ew, xlab="표준정규분포",
     ylab="sample 사분위수",
     main="EastWest의 QQ플롯")
qqnorm(EastWest)