>RE::VISION CRM

R 데이터 분석

[R 분석 연습] 2차원 플롯 : 밀집 영역 플로팅

YONG_X 2013. 6. 14. 21:02

 

[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에 제공되는 패키지의 사용법이 간단하므로 폭넓은 활용 가능 할 것

tb_rfmv01.txt
0.11MB