본문 바로가기
  • Let's go grab a data
Data/R

[R] 잡음 처리(MAF), 이상치 검출(카이제곱분포, LOF)

by pub-lican-ai 2016. 3. 31.
반응형

[R] 잡음 처리(MAF), 이상치 검출(카이제곱분포, LOF)


Moving Average Filter

n개의 데이터가 각rkr 1/n씩 가중치를 가짐


[데이터]

http://ps.cs.utwente.nl/Datasets.php 에서 제공하는 Physical Activity Recognition Dataset Using Smartphone Sensors을 다운받아(63MB) 사용 - Arm.csv 파일로드 하여 사용 하거나 첨부의 txt 파일 사용(일부 데이터)


arm.txt





[코드]


data <- read.csv("Arm.csv")

#첨부파일 사용시

#data <- read.table("arm.txt", stringsAsFactors = F, header = T)

mav <- function(x,n=5){filter(x,rep(1/n,n),sides = 2)}

accX = mav(data)

head(accX)

barplot(data$Ax[2:50000],col="blue",border = "blue",ylim = c(-20,20),cex.axis = 1)

par(new=T)

barplot(mav(data$Ax)[2:50000],col = "red", border = "red", ylim=c(-20,20),cex.axis = 1)

#첨부 파일 사용시

#barplot(data$Ax[2:200],col="blue",border = "blue",ylim = c(-20,20),cex.axis = 1)

#par(new=T)

#barplot(mav(data$Ax)[2:200],col = "red", border = "red", ylim=c(-20,20),cex.axis = 1)

전체 데이터 사용시



첨부파일 사용시

plot의 파란색이 기존 데이터, 빨간색이 MAF를 통해 잡음이 제거된 부분


Outlier 검출

[방법]

- 카이제곱 분포 이용 : 데이터가 정규분포를 따른다고 가정하고, k개의 서로 독립적인 표준 정규 확률 변수를 각각 제곱한 다음 합해서 얻어지는 분포에 의해 97.5%이상

- Local Outlier Factor 이용 : 샘플의 밀도를 측정하여 가장 밀도에서 벗어나는 데이터 즉, LOF값이 가장 큰 데이터를 이상치로 추정

 두 가지 방법으로 검출되는 outlier가 서로 다르다 이는 데이터의 특성을 plot으로 찍어보며 어떤 방법이 더 적합할지 찾아야 한다


[데이터]

첨부의 txt 파일 사용(일부 데이터) arm.txt


[필요패키지]

mvoutlier, DMwR, scatterplot3d


[코드]

data <- read.table("arm.txt", stringsAsFactors = F, header = T)

#카이제곱 분포 이용

install.packages("DMwR")

library(DMwR)

outlier.scores1 <- aq.plot(data[c("Ax","Ay")])





#LOF 이용

install.packages("mvoutlier")

library(mvoutlier)

outlier.scores <- lofactor(data$Ax[1:1000],k = 10)

outlier <- order(outlier.scores, decreasing = T)[1:10]

n<-1000

pch<-rep(".",n)

pch[outlier]<-"+"

col<-rep("black",n)

col[outlier]<-"red"

pairs(data[1:1000,2:3], pch=pch, col=col)


#3차원 산점도 출력

#

install.packages("scatterplot3d")

library(scatterplot3d)

outlier.scores2 <- aq.plot(data[c("Ax","Ay","Az")])

outlier <-which(outlier.scores2[[1]])

col<-rep("black",n)

col[outlier]<-"red"

scatterplot3d(x=data$Ax,y=data$Ay,z=data$Ax,color = col)


 


outlier.scores3 <- lofactor(data[,c(2,3,4)],k=10)

outlier <- order(outlier.scores3, decreasing = T)[1:100]

col<-rep("black",n)

col[outlier]<-"red"

scatterplot3d(x=data$Ax,y=data$Ay,z=data$Ax,color = col)



 





반응형