이상치(Outlier)라고 하면 특정 데이터 변수의 분포에서 비정상적으로 벗어난 값을 뜻한다.

예를 들면 어떤 학생이 신체검사를 했다고 치자 A학생은 몸무게와 키가 각각 100kg, 150cm나왔다.

이 A학생은 일반적으로 생각했을때 키에 비해 몸무게가 많은 것으로 보인다. 

(여기서는 몸무게와 키는 상관관계가 높은 것으로 간주한다.)

그럼 이 A학생은 속한 학년 반 또는 또래 아이들에 비해 비정상(여기서 이상치)이 맞을까?


위 질문에 대한 이상치 분석을 한번 해보자.

이상치 분석을 위한 모델 데이터는  A학생이 포함된 반의 학생들의 몸무게, 키 데이터이며 변수는 몸무게, 키로만 한정지어 분석해보고자 한다. 모델에 대한 종속변수는 몸무게이며 설명변수는 키가 된다.


우선 데이터를 한번 만들어보자.(실제 데이터가 없으니 ^^;)



name,weight,tall

A,100,150

B,55,156

C,50,153

D,54,165

E,70,164

F,56,155

....생략....

Y,49,153

Z,43,151


 


 std.data <- read.csv("outlier.csv", header=T)
summary(std.data)
boxplot(std.data$weight)

우선샘플 데이터를 R에서 가져와 데이터 분포와 몸무게에 대한 boxplot을 확인해보자.


boxplot을 통해보면 상단 whisker의 몸무게 70kg이상은 이상치라고 판단하고 있으며 해당 데이터에서는 위 boxplot에서 100kg은 이상치라고 판단했다. boxplot에서의 이상치는 몸무게 데이터간의 이상치라고 볼 수 있다.

몸무게와 키와의 상관관계가 있다고 가정하며 키가 클수록 몸무게도 커지기 때문에 몸무게 변수하나로 이상치를 판단하기는 좀 무리가 있을 수 있겠다. (저 몸무게 100kg의 학생이 키가 2m일 수도 있지 않나?? ㅡㅡ;)


그렇다면 설명변수 키와 종속변수 몸무게를 이용하여 회귀분석 모델을 생성하여 이상치를 팓단해보자.

회귀분석 lm함수를 이용하여 lm(종속변수 ~ 설명변수, 모델데이터)로 회귀분석 모델을 생성한다.

library(car)
std.lm <- lm( weight ~ tall , data = std.data)
summary(std.lm)
outlierTest(std.lm)
std.data[1,]

생성한 회귀분석 모델에 의한 이상치 판단을 하기 위해 outlierTest 함수를 사용한다.

해당함수는 모델에 대한 이상치 데이터를 각종 수치와 함께 쉽게 나타내 준다. 단 해당 함수는 car 패키지를 설치 후 사용가능하다. 실행 결과를 보면 아래와 같다.


> outlierTest(std.lm)
  rstudent unadjusted p-value Bonferonni p
1  7.62756         9.6225e-08   2.5018e-06
> std.data[1,]
  name weight tall
1    A    100  150

std.data에서 1번째 데이터가 이상치라고 판단했으며 해당 데이터를 확인해보니 A학생으로 나오는 것을 확인할 수 있다.


전체 실행코드



지금까지 정말 정말 간단한 말도 안되는 데이터를 가지고 이상치 분석을 해보았다... ^^;

그렇다면 이상치 분석은 어떻게 활용할 수 있을까? 

데이터만 가지고 있다면 어디든 활용할 수 있을 것이다. 예를 들면 상품에 대한 가격 이상치라던지 서버 모니터 정보를 이용한 이상치 등등...


물론 실제 많은 설명변수들이 존재하는 데이터를 가지고 이상치 분석을 하기는 쉽지 않다.

데이터 전처리도 쉽지 않고 위에서 설명하지 않은 회귀분석 모델, outlierTest함수를 통해 나온 수치해석 등 통계적 지식이 꽤 많이 필요한 건 사실이지만... 재미로 내가 몸담고 있는 회사의 데이터를 가지고 테스트 해보는 것도 나쁘지 않겠다.

끝.

저작자 표시
신고

'R' 카테고리의 다른 글

R grep을 이용한 데이터프레임 필터링  (0) 2014.10.22
R을 이용한 이상치 분석  (0) 2014.10.01
R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

특정 데이터 분포를 쉽게 확인할 수 있는 수치로는 최소값, 중간값, 평균값, 최대값 그리고 사분위수가 있다.

사분위수는 데이터의 균등한 분할로 25%, 50%, 75%, 100%를 나타내며 1사분위수(1Q)는 25% 값에 해당한다.


사분위수를 알아내면 BOXPLOT과 같은 Chart를 통해 데이터 분포를 시각화 할 수 있을 것이다.

아쉽게도 R과 같은 통계언어의 경우는 쉽게 사분위수를 구할 수 있으나 MySQL의 경우는 지원하는 내장함수가 존재하지

않는다. 그래서 SQL를 통해 사분위수를 구할 수 있는 방법을 알아 보고자 한다.


boxplot 해석을 돕기 위한 그림(출처)



 
SET GROUP_CONCAT_MAX_LEN = 10485760;
SELECT
MIN(COLUMN_NAME) AS 'MIN',
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 5/100 * COUNT(*) + 1), ',', -1)  AS `5TH PER`,
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 25/100 * COUNT(*) + 1), ',', -1)  AS `1ST QU`,
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 50/100 * COUNT(*) + 1), ',', -1)  AS `MEDIAN`,
AVG(COLUMN_NAME) AS 'MEAN',
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 75/100 * COUNT(*) + 1), ',', -1)  AS `3RD QU`,
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY COLUMN_NAME SEPARATOR ','),',', 95/100 * COUNT(*) + 1), ',', -1)  AS `95TH PER`,
MAX(COLUMN_NAME) AS 'MAX'
FROM TABLE_NAME

원리는 간단하다. GROUP_CONCAT 함수로 데이터를 합쳐서 분위수에 해당하는 수치를 구해 SUBSTRING_INDEX함수로 데이터를 추출하는 방법이다. 참 쉽죠? 

아! 그리고  합쳐지는 데이터가 많을 경우 꼭 SET GROUP_CONCAT_MAX_LEN = 10485760; 와 같은 설정이 필요함


끝.

참고 : http://web.performancerasta.com/metrics-tips-calculating-95th-99th-or-any-percentile-with-single-mysql-query/



저작자 표시
신고

'rdb' 카테고리의 다른 글

Hive GROUP_CONCAT  (0) 2015.04.09
MySQL(MariaDB) 사분위수 구하기  (0) 2014.09.02
Oracle FlashBack  (0) 2011.04.05
DB 파티셔닝  (0) 2011.03.07

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

R on Hadoop and Amazon EMR

R 2014.08.19 15:44

Amazon EMR은 R을 지원한다. 

AMI Versions 3.0.0 이상부터는 Hadoop과 함께 R 3.0.2버전이 함께 Includes되어 설치된다.

현재 R최신버전은 3.1.1이지만 R 3.0.2버전이면 거의 최신버전이라고 할 수 있다.


Amazon 서비스에서 R을 지원하기 때문에 EMR을 이용하여 R Script를 실행하는 방법을 알아보고자 한다.


우선 고려해야 될 사항을 나열해보면 아래와 같다.

첫째 AMI를 통해 설치되는 R버전이 내가 사용하고자 하는 R package에서 지원하는 버전대인지?

둘째 EMR Hadoop Cluster 세팅 시 R은 설치 되지만 R Package는 설치되지 않기 때문에 설치가 가는한지?


우선 첫번째 문제부터 살펴보면 R 3.0.2버전이면 거의 왠만한 R package는 사용가능하다. 

rdocumentation.org 에서 제공하는 R package rank내의 ggplot2, plyr등 모두 사용가능하며 이슈는 없다.

둘째로는 사용하고자 하는 R package가 설치가 가능한지인데 이 부분도 EMR에서는 Bootstrap Actions라는 기능이 있다. 해당 기능을 통해서 R package뿐만 아니라 기타 여러 패키지가 설치 가능하다.


그럼 이제 EMR에서 R Script를 실행하는 방법을 알아보자.


AMI version

위에서 언급한 바와 같이 3.0.0이상 가장 최신버전을 선택하도록 하자.


Bootstrap Actions

Bootstrap Custom Actions을 통해 R Script에서 사용할 package와 기타 필요한 패키지들을 설치할 수 있도록 해야 한다.

여기서는 R package 하나와 mysql을 설치하도록 지정했다.

아래와 같이 shell script파일을 생성한다.

 
#!/bin/bash
sudo yum -y install mysql mysql-server mysql-connector-odbc mysql-devel
wget http://cran.r-project.org/src/contrib/DBI_0.2-7.tar.gz
sudo R CMD INSTALL DBI_0.2-7.tar.gz

만약 설치되어야 하는 R package가 많다면  아래와 같이 RScript Install.package구문으로도 가능하다.

 
 sudo Rscript -e "install.packages(c('DBI', 'rJava', 'etc'),repos='http://ftp.heanet.ie/mirrors/cran.r-project.org/')"

mysql설치는 apt-get 명령어가 아닌 yum을 사용했다. AMI 3.x대 버전 이후 부터는 apt-get이 아닌 yum을 이용하여

필요한 패키지들을 설치할 수 있다. 해당 shell script를 S3내의 내 버킷공간에 저장해 둔다.


S3에 저장한 shell script를 S3 location에 Path를 지정한 후 Add해주면 Bootstrap Action설정은 모두 끝난다.


Steps

R Script 작성 시 맨 상단에 "#! /usr/bin/env Rscript" 해당 구문을 추가해주어야 한다.

추가하지 않으면 EMR에서 R Script를 해석하지 못한다.

#! /usr/bin/env Rscript
library(DBI, quietly=TRUE)
.....

실행할 R Script를 Bootstrap의 Shell script와 마찬가지로 S3내의 내 버컷공간에 저장해 둔다.

그리고 Streaming program을 선택 후 Step을 추가해주면 된다.



Mapper, Reduce에서 싫행될 R Script를 각각 지정 후 Input, Output 장소도 지정한다.

Output의 경우 Reduce에서 실행되는 R Script의 실행 결과물이 파일로 저장된다.



위와 같이 최종 설정 후 Create cluster를 생성하면 EMR내에서 R Script가 실행가능하다.



참고
http://www.joyofdata.de/blog/mapreduce-r-hadoop-amazon-emr/
https://forums.cascading.io/index.php?/topic/9-unable-to-run-emr-bootstrapscript/
http://mrjob.readthedocs.org/en/latest/guides/emr-bootstrap-cookbook.html#ami-2-x-and-ami-3-x-version-differences


저작자 표시
신고

'R' 카테고리의 다른 글

R을 이용한 이상치 분석  (0) 2014.10.01
R on Hadoop and Amazon EMR  (0) 2014.08.19
R Oracle Connection  (4) 2014.02.24
R svn commit history 시각화  (0) 2014.02.21

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret