[R 분석 연습] 2차원 플롯 : 밀집 영역 플로팅 연습
# 이번에는 1차원이 아닌 2 차원으로 플롯을 생성한 후 그 안에서
# 밀집된 영역을 시각화하는 hdrcde 패키지를 활용하는 연습
# 아래는 hdrcde 패키지의 설명에 들어 있는 기본 예제를 그대로 실행한 모습
install.packages("hdrcde")
require(hdrcde)
x <- c(rnorm(200,0,1),rnorm(200,4,1))
y <- c(rnorm(200,0,1),rnorm(200,4,1))
par(mfrow=c(1,2))
plot(x,y, pch="+", cex=.5)
hdr.boxplot.2d(x,y)
# 실행한 결과는 플롯과 hdr 플롯 두가지를 비교한 모습으로 보여짐
# help에서 hdrcde 패키지에 대한 설명 보기
?hdr.boxplot.2d
# 패키지 설명을 참고해서 보면 hdr은 highest density region. 2차원상에서 개체가 밀집된 영역을
# 알고리즘에 의해 찾아서 시각적으로 플롯에 표현해주는 것
# 왜 이런 시각화가 필요한가?
# 1차원적인 분포는 하나의 플롯에 두가지 즉 관찰하고 싶은 값과 해당 구간별의 돗수를
# 표시하는 정도의 방식으로 보편화된 그래프 작성 툴을 사용해도 문제되지 않으나
# 2차원일 경우에는 영역을 등고선과 같이 표시해야 밀집도를 눈으로 볼 수 있기 때문
# ---- kbo batterbox 데이터 셋에 hdr 적용하는 예제 ---------------
k3 <- read.table("kbo_batterbox.txt", header=TRUE, sep=",")
attach(k3)
plot(atbat, rhit, pch="+", xlab="타수", ylab="타율")
# 플롯을 그리기는 했으나, 여러 값들이 흩어져서 나타난 플롯으로 부터 패턴을 파악하기가
# 곤란한 문제점을 가지고 있음
# 예에서 타수와 타율간의 관계도 잘 드러나지 않으며, 2차원상의 어느 영역에 많은 값이
# 분포하는가도 파악하기 어려움
hdr.boxplot.2d(atbat,rhit, xlab="타수", ylab="타율")
# 0 처럼 표시된 영역은 중심점 (Mode). 타율과 타수가 2차원으로 표시되었을 때 많은 타자가
# 분포하는 영역이 어느 영역인가 (즉, 빈도가 가장 높은 구간) 의 의미.
# 검정색 점으로 표시된 값들은 아웃라이어. 즉, 일정 수준 이상의 빈도 범위를 넘는 특이한 값
# hrd 폴롯을 보면, 타율과 타수간의 관계가 그리 극명하지는 않아 보임
# 타율에 상관없이 타수가 160~200 까지 분산되어 있음이 나타남
# 극단적인 아웃라이어가 한명 있음 (한화의 김태균 -- 지속 출장함에도 불구하고
# 시즌 중반까지 타율이 4할대였음. 시즌 초반 표본이 부족한 시점을 넘어서도 4할을 유지했기 때문)
# 참고: 데이터는 2012년 중반, 규정타석 이상의 상위 50명 가량의 타자에 대한 것
# 이번에는 홈런과 스트라이크아웃과의 관계
# 통상적인 가설은 홈런을 많이 치는 타자는 스트라이크아웃도 많이 당할 것이다
# 그러나, 데이터가 보여주는 것은 반드시 그렇지만은 않다는 것
plot(hr, SO, xlab="home run", ylab="strike out", pch="O")
# 참고로, plot의 옵션에서 pch 옵션에 키보드 상의 특정 문자를 지정하면 그대로 해당 값 표시에 사용됨
# + , * , o , O 등의 활용 가능
hdr.boxplot.2d(hr, SO, xlab="home run", ylab="strike out")
# 홈런이 10개 미만인 구간에서는 홈런과 삼진간의 관계가 좀 보이지만
# 상당한 숫자의 홈런을 치는 타자의 경우 홈런의 수가 많다고 해서 반드시 삼진이 많다고
# 할 수 없어 보인다. 홈런이 많은 타자의 경우 삼진이 일정수 이상인 경우가 많지만,
# 진짜 홈런타자는 선구안도 좋기에 삼진이 아주 많아지지는 않는다는 의미일지도
# 이번에는 상관성이 매우 높은 두 변수간의 관계를 플롯으로 살펴보는 예
# robase는 출루율 = 출루 / 타석 OPS = (출루율 + 장타율) / 타수
# 장타율 (Slugging) = 총진루 / 타수
# 출루율은 OPS에 사용된 극단적으로 상관성이 높은 변수
# 데이터 마이닝에서는 leak로 간주하고 이 두 변수를 동시에 모델링에 사용하지 않음
plot(robase, OPS, xlab=on base rate", ylab="ob-base plus slugging", pch="O")
# 눈으로 봐도 두 변수간의 상관관계가 매우 높고, 선형적으로 보임
hdr.boxplot.2d(robase, OPS, xlab=on base rate", ylab="ob-base plus slugging")
# 밀집도를 보면 출루율 0.3~0.4, OPS 0.6~0.8 구간에 대부분의 타자가 분포해 있음
# 이 영역을 벗어나서는 자료수의 한계로 인해 파악되는 관계가 명확하지 않을 수 있어 보임
# 참고로 아래는 2013. 06. 14 기준 추신수 Shin-Soo Choo 의 2013 stat (source : mlb.com)
G | AB | R | H | TB | 2B | 3B | HR | RBI | BB | IBB | SO | SB | CS | AVG | OBP | SLG | OPS | GO/AO | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SEASON | 65 | 244 | 48 | 68 | 117 | 17 | 1 | 10 | 22 | 47 | 4 | 63 | 6 | 2 | .279 | .430 | .480 | .910 | 1.64 |
# OBP (on-base percentage) 0.430, OPS 0.910
# 몸에 맞는 공에 의한 출루가 많다보니 출루율은 높아도 OPS가 매우 높지는 않음
# 그러나 작년 KBO 스탯의 분포를 기준으로 비교해 봐도 무척이나 양호한 기록임은 분명
# --------- RFM 분석 예제에의 적용 -----------------------
# kbo batter box 데이터는 데이터가 작은 수인 경우이지만
# 데이터의 갯수 (i.e. number of records)가 많은 경우 이런 플로팅은 더 유용할 것
# 48개 값을 가진 kbo 타자 데이터 대신 5천개 가량의 값으로 된 RFM 분석용 예제를 사용
# RFM 데이터 생성 과정 보기 : http://blog.daum.net/revisioncrm/175
# 앞선 포스팅에서 생성된 데이터를 바로 읽어 들일수 있도록 저장
# write.table(tr0011, "tb_rfmv01.txt", sep=",")
# 저장된 파일을 불러들이기
tr0011 <- read.table("tb_rfmv01.txt", header=TRUE, sep=",")
# 이 파일에는 미리 데이터준비가 마쳐진 데이터 포함 (CSV 포맷 ) ==> tb_rfmv01.txt
# 파일의 데이터 내용 확인
head(tr0011)
customer_id v_f v_r v_m v_mf
1 5878 2 220 234.19 1234.37
2 7085 2 214 2.75 0.00
3 7864 11 0 244.31 194.42
4 8286 12 25 323.67 849.71
5 12646 4 122 123.08 53.85
6 13520 5 269 205.97 60.00
# 변수 설명: v_f 구매빈도 v_r 최근성(최종구매후 경과된 일수) v_m 최근 1년간 구매금액 합계
# v_mf 기준 기간 (rfm 변수 생성에 사용된 기간. 여기서는 1년) 이후 1년간의 구매금액 합계
plot(tr0011$v_f, tr0011$v_mf, xlab="Frequency", ylab="M in the Next Year" )
# 사용하는 데이터에 수천개 값이 존재하므로 플롯으로 본다해도 분포가 집중되어 있는 곳이
# 명확하게 보이지 않으며 두 변수간의 관계도 파악하기 어려움
hdr.boxplot.2d(tr0011$v_f, tr0011$v_mf, xlab="Frequency", ylab="M in the Next Year")
# hdr 폴롯의 사용으로 어느 정도를 벗어나는 영역이면 outlier라고 봐도 될 것인지를 시각적 확인 가능
# prob 옵션의 활용 방법
# 우선, default 값과 같은 값을 prob 옵션에 지정
# use default probability
hdr.boxplot.2d(tr0011$v_f, tr0011$v_mf, xlab="Frequency", ylab="M in the Next Year", prob=c(0.01,0.50))
# use an ajusted probability
# 옵션의 값을 0.05로 바꾼 경우. 즉, 5% 빈도 내를 벗어나는 값들은 아웃라이어로 간주하도록 지정
hdr.boxplot.2d(tr0011$v_f, tr0011$v_mf, xlab="Frequency", ylab="M in the Next Year", prob=c(0.05,0.50))
# 2차원 상에서는 넓은 영역을 차지하지만 극단적인 값들이 5% 이내의 빈도를 차지함을 확인
# 상식적으로 1년간 한 브랜드에서 30번 이상 구매하는 고객이 많을리 없음을 시사함
# 이번에는 상관관계가 그리 크지 않을만한 두 변수를 사용
hdr.boxplot.2d(tr0011$v_f, tr0011$v_r, xlab="Frequency", ylab="Recency")
# 50% 영역과 99% 영역의 모양이 원에 가깝다는 것은 두변수 즉 구매빈도와 최근성 간에
# 관계가 그리 강하지는 않다는 점을 시사
# 추가적으로 특이한 값은 구매빈도가 극히 높은 쪽에 존재한다는 점을 보여줌
# 정리 : 2차원상에서 밀집 영역을 파악해 시각화한다면 변수들간의 관계에 대한
# 현실적인 이해 가능
# R에 제공되는 패키지의 사용법이 간단하므로 폭넓은 활용 가능 할 것
'R 데이터 분석' 카테고리의 다른 글
Error in solve.default(sigma): system is computationally singular (0) | 2013.09.25 |
---|---|
twitter access tmp (0) | 2013.08.29 |
랜덤 포리스트 random forest 응용 [R 마이닝 ] (0) | 2013.06.04 |
랜덤 포리스트 random forest [R 마이닝] (0) | 2013.06.04 |
[빅 데이터, 그리고] 데이터 사이언스와 데이터 마이닝 - Using R <강좌 예고> (0) | 2013.05.09 |