-
R 다변량 통계 분석 - 3. 다변량 정규성 이상치 검토(outlier) classical Mahalanobis distance, robust Mahalanobis distance, Local Outlier Factors, 이상치 제거 (outlier cut-off)R + Statsitic (통계학) 2020. 4. 28. 20:23
아래 내용은 <R과 함께하는 다변량 자료분석을 위한 추정과 검정, 최용석 지음, 2019>에서 대부분 발췌하였습니다
다변량 통계 분석에서 정규성 검정, 시각화 방법 등에 필요한 라이브러리 입니다
library(MVT)
library(MVN)
library(dplyr)
library(car)
library(multifluo)library(chemometrics)
library(DMwR)
#### 다변량 정규성에 영향을 미치는 이상치 검토하기
### 마할라노비스 거리(mahalanobis distance)로 이상치 구하기
마할라노비스 거리로 examScor 데이터의 이상치를 구해보겠습니다
library(chemometrics)를 불러옵니다
이야기 전개를 쉽게하기 위해 두 개념을 살펴보고 가겠습니다
# 마할라노비스 거리(Mahalanobis distance)
https://en.wikipedia.org/wiki/Mahalanobis_distance
"The Mahalanobis distance is a measure of the distance between a point P and a distribution D, introduced by P. C. Mahalanobis in 1936. It is a multi-imensional generalization of the idea of measuring how many standard deviations away P is from the mean of D."
마할라노비스 거리는 다변량 혹은 다차원에서 특정 P와 분포 D사이의 거리가 어느정도(단위 : 표준편차) 인지를 측정합니다
즉, 다시 말하자면 다변량(다차원)의 데이터에서 분포의 형태까지 고려한 거리(Distance)입니다
고등학교 수학에서 배우는 표준정규분포 Z값을 구하는것이 Mahalanobis Distance를 구하는 과정입니다
우리가 통상적으로 구하는 거리(피타고라스 정리로 구하는) 거리는 Euclidean distance입니다다변량, 다차원에서 이상치를 구하기 위해서 필요합니다. 특정 P와 분포 D사이의 거리가 매우 길다면 이를 이상치로 판단하는 원리입니다
# 분위수(Quantile)
https://en.wikipedia.org/wiki/Quantile
"In statistics and probability quantiles are cut points dividing the range of a probability distribution into continuous intervals with equal probabilities, or dividing the observations in a sample in the same way."
통계 및 확률에서 Quantile은 확률 분포의 범위를 동일한 확률로 연속적인 간격으로 나누거나 동일한 방식으로 표본으로 관측치를 나눈 절단 점입니다
예를 들어 4분위수는 확률 분포 범위를 4조각으로 나눈 것입니다
다변량 뿐만 아니라 통계학 수업, 세미나를 들으실때 반드시 접할 수 밖에 없는 개념이라 언급하였습니다
두 개념을 이해했으면 이상치를 찾아봅시다
examScor_outlier_m <- examScor %>% Moutlier(quantile = 0.99) # 1-0.99%를 이상치로 분류하겠단 의미입니다 결과값을 해석해보겠습니다
#$md
일반적인 마할라노비스 거리(classical Mahalanobis distance)입니다
#$rd
로버스트 마할라노비스 거리(robust Mahalanobis distance)입니다
#$cutoff
이상치를 판단하는 값(cut-off value)입니다. 이 값을 넘어가면 이상치로 분류합니다
한가지 짚고 넘어갑시다
로버스트(robust)가 무엇일까요?
로버스트의 사전적 정의는 "원기왕성한", "팔팔한"이란 뜻을 가진 형용사입니다
통계학에서 로버스트 특정값(이상치)에 영향을 크게 받지 않은 통계량(statistic)을 의미합니다
classical Mahalanobis distance(md)와 robust Mahalanobis distance(rd)는 값이 분명이 차이가 있습니다
각각 어떻게 계산하는지 Moutlier함수를 뜯어봅시다
Moutlier md는 계산에 평균(mean)과 공분산(covariace)를 사용하고,
rd는 Minimum Covariance Determinant (MCD) estimator(covMcd 함수)의 the final estimate of location과 공분산을 사용합니다
md는 알겠는데 rd.....이게 무슨말이지?!? 하실수도 있습니다
쉽게 말하자면 md를 보다 centered(즉, 로버스트)하게 계산한 것 이 바로 rd(robust Mahalanobis distance)입니다
centered하다는 것은 무엇이냐?
통계학에서 centered하다는 것은 분포(distribution)이나 관측치(observation)이 특정 분포(normal, chi-squared, t 등등), 혹은 그 모수(parameter)에 가깝게 근사한다는 말입니다
자..자... 다시 말해서..
rd(robust Mahalanobis distance)는 md(Mahalanobis distance)를 보다 특정값이 치우치지 않도록 수정하여 계산한 값이라 할 수 있습니다
그럼 이를 시각화한 plot을 보면서 이상치인지 확인해보겠습니다
설명이 지저분하고 복잡했지만..;; 이를 시각화 했을때 이상치를 판단하는 것은 간단합니다
cut-off value보다 높은 관측치가 바로 이상치 입니다
그럼 이상치를 특정해봅시다
## 일반적인 마할라노비스 거리(classical Mahalanobis distance : md)
for 문으로 cut-off value보다 높은 관측치를 특정하겠습니다
가장 먼저 cut-off value를 examScor_outlier_cut에 저장하겠습니다examScor_outlier_cut <- examScor_outlier_m$cutoff
examScor_outlier_cut <- examScor_outlier_cut %>% as.vector()
examScor_outlier_cut <- examScor_outlier_cut %>% unlist()
examScor_outlier_cut <- examScor_outlier_cut %>% as.numeric()# examScor$cutoff 값을 변환합니다
cut-off value는 3.884105입니다
이를 활용하여 이상치 여부를 판단합니다
Moutlier결과 값을 변환하겠습니다
그리고 for문으로 cut-off보다 큰 관측치를 vector공간에 저장하겠습니다
md값의 이상치를 판단합니다
examScor_outlier_md <- examScor_outlier_m$md
examScor_outlier_md <- examScor_outlier_md %>% as.vector()
examScor_outlier_md <- examScor_outlier_md %>% unlist()
examScor_outlier_md <- examScor_outlier_md %>% as.numeric()# examScor$md 값을 변환합니다
outlier_md <- c() # 이상치를 담을 vector 공간을 만듭니다
for(i in 1:length(examScor_outlier_md)){
if (examScor_outlier_md[i] >= examScor_outlier_cut) { # cut-off value보다 크면 outlier_md에 저장합니다
outlier_cmi <- print(i)
outlier_cm <- append(outlier_cm, outlier_cmi)}
}81번째 관측치가 이상치입니다
## 로버스트 마할라노비스 거리(robust Mahalanobis distance : md)
rd값의 이상치를 판단합니다
examScor_outlier_rd <- examScor_outlier_m$rd
examScor_outlier_rd <- examScor_outlier_rd %>% as.vector()
examScor_outlier_rd <- examScor_outlier_rd %>% unlist()
examScor_outlier_rd <- examScor_outlier_rd %>% as.numeric()# examScor$rd 값을 변환합니다
outlier_rd <- c() # 이상치를 담을 vector 공간을 만듭니다
for(i in 1:length(examScor_outlier_rd)){
if (examScor_outlier_rd[i] >= examScor_outlier_cut) { # cut-off value보다 크면 outlier_rd에 저장합니다
outlier_rdi <- print(i)
outlier_rd <- append(outlier_rd, outlier_rdi)}
}54, 61, 81번째 값이 이상치입니다
아무래도 rd가 좀 더 보수적으로 관측치를 이상치로 판단합니다
### Local Outlier Factor로 이상치 구하기
Local Outlier Factor로 examScor 데이터의 이상치를 구해보겠습니다
library(DMwR)를 불러옵니다
# Local Outlier Factor
https://en.wikipedia.org/wiki/Local_outlier_factor
"The local outlier factor is based on a concept of a local density, where locality is given by "k" nearest neighbors, whose distance is used to estimate the density. By comparing the local density of an object to the local densities of its neighbors..."
Local Outlier Factor방법은 관측치의 밀도(density)를 고려하여 이상치를 판별합니다. 어느 정도 밀도인지는 연구자가 "k"값으로 조정할 수 있습니다. 여기서 k값은 k-distance(A)인데 관측히 A에서 k-최근접 이웃(k-th nearest neighbor)입니다. 자세한 사항은 머신러닝(machine learning) k-최근접 이웃 알고리즘을 참고해주세요
저는 적당하게 k값을 4로 조정하여 이상치를 구하겠습니다
examScor_outlier_L <- examScor %>% lofactor(k = 4)
examScor_outlier_L_density <- examScor_outlier_L %>% density()examScor의 density 결과입니다
솔직히 x, y가 무엇을 말하는지 잘 모르겠습니다...
이를 plot으로 그려봅시다
examScor_outlier_L_plot <- examScor_outlier_L_density %>% plot(main = "Local Outlier Factor score") 시각적으로 봤을때 x축이 1.6이하에 대부분 밀집되어있습니다
그러니 1.6이상 인것은 이상치로 분류할 수 있습니다
1.6이상 관측치를 특정하도록 하겠습니다
outlier_LOF <- c()
for(i in 1:length(examScor_outlier_L)){
if (examScor_outlier_L[i] >= 1.6) { # 1.6 보다 크면 outlier_LOF에 저장합니다
outlier_LOFi <- print(i)
outlier_LOF <- append(outlier_LOF, outlier_LOFi)}
}81번째 값이 이상치입니다
#### 이상치를 제거하여 다변량 정규분포의 정규성 검정하기
이상치를 특정하는 이유는 그것을 제거하기 위함입니다
어떤 방법으로 이상치를 특정하는 것이 좋으냐?
그것은 이상치를 제외한 뒤 정규성 검정 등의 방법으로 개선이 크게 된 방법이 좋은 방법이라 할 수 있습니다
그러면 이상치를 제외하고 정규성 검정을 해보겠습니다
앞서 이상치 다양한 방법으로 구하였고 vector에 저장하였습니다
이상치 판별 방법 vector 일반적인 마할라노비스 거리
(classical Mahalanobis distance : md)
outlier_md 로버스트 마할라노비스 거리
(robust Mahalanobis distance : md)
outlier_rd Local Outlier Factor outlier_LOF 벡터에 저장한 관측치를 전체 데이터에서 제거하도록 합니다
그리고 이상치가 있을때와 없을때 정규성을 비교하도록 하겠습니다
대표적으로 outlier_md를 제외한 경우만 해보겠습니다
나머지는 같은방법으로 하면 됩니다
outlier제거_md <- examScor[-outlier_md,] # 이상치(outlier_md)제거
examScor_mvn <- mvn(examScor, multivariatePlot = "qq")
outlier제거_md_mvn <- mvn(outlier제거_md, multivariatePlot = "qq")
다음에는 다변량 정규성을 상관계수와 주성분 분석으로 검정 및 시각화를 알아보겠습니다
'R + Statsitic (통계학)' 카테고리의 다른 글