>RE::VISION CRM

R 데이터 분석

[R 데이터 분석 연습] 플롯과 heatmap을 통한 추가적 EDA 탐색적 분석

YONG_X 2013. 2. 8. 16:28

 

# 데이터 마이닝 과정에서 매우 빈번하게 사용되는 변수간 관계의 시각적 확인

# 탐색적 분석을 위해 기초적인 플롯이나 그래프를 그린 후 시각적 의미 파악 가능 하도록

# 데이터와 그래픽 옵션을 조절해나가는 과정이 필요

 

# 앞서 플롯을 사용해 변수간 관계를 확인하기 위해 수행했던 기초적인 작업 복습

# M 과 타겟 변수간 관계 (미래 1년간 구매액)

plot(v_m, v_mf)

 

 

# 눈으로 보기에는 그래프상의 수천개 data point의 패턴이 드러나지 않으므로

# 두 변수간의 회귀선을 plot에 추가

# add regression line
abline(lm(v_mf~v_m, data=tb_tr0011), col="red") 

 

# 보기에는 그냥 뭉뜽그려져 있어 보였던 M과 mf 간의 관계는 양의 선형 관계임을 확인

# 즉, 전년에 구매액이 많았을 수록 다음 해에 1년간 구매액은 클 것으로 예상됨

# 참고로 금액단위는 dollar, F의 단위는 구매상품건수

 

# 그러나 여전히 뭉뜽그려진 한 덩어리내의 구조에 대해서는 시각적으로는 확인 어려움

# 한쪽 축을 구간화(discretization) 시켜 단순화를 시도

# M은 연속형 숫자이므로 넓은 구간에 분포, 이를 단순화 시키기 위해 100으로 나누고

# 정수로 바꾸면서 소수점이하의 숫자를 제거하게 되어 100 단위의 집단으로 변환

# 집단을 단위로 플롯을 그리기 위해 데이터 타입을 character로 변환

 

tr0001$gv_m <- as.character(as.integer(v_m/100))

 

# 박스 플롯을 그리기 위해 ggplot2 패키지를 설치

install.packages("ggplot2")
library(ggplot2)

 

# qplot() 함수를 사용하여 플롯 그리기

qplot(gv_m, v_mf, data=tr0001, geom=c("boxplot","jitter"),
       fill=gv_m, main="Future spending by past spending group",
       xlab="Past spending group : gv_m (u:$100)", ylab="Future spending : v_mf (u: $)")

 

 

 

 

# 구간별로 박스 플롯이 작성되기는 했으나 문제는 여전히 구간이 많아서 관계가

# 눈에 잘 보이지 않음 

 

# jitter를 제거

# 1000불을 기준으로 그 이하의 값만을 박스 플롯에 포함

# 대부분의 고객이 속하는 구간에서 10개 집단으로만 나눠 단순화하여 관계 확인

 

# refined plot: scope adjustment and removal of jitter

qplot(gv_m, v_mf, data=subset(tr0001, v_m <= 1000), geom=c("boxplot"),
       fill=gv_m, main="Future spending by past spending group",
       xlab="Past spending group (u:$100)", ylab="Future spending(u: $)")

 

 

# 박스플롯에서 평균값이  past spending group(gv_m) 값의 증가에 따라 거의 일정하게

# 증가하고 있음을 시각적으로 확인 가능

# past spending group(gv_m) 값이 커질 수록 Future spending 값의 분포가 넓은 영역에

# 걸쳐 나타남도 보여짐

# 색상은 구간 변수인 gv_m의 값을 나타냄 

 

# 같은 방식으로 다른 변수와의 관계도 플롯 생성

 

# 이번에는 recency에 대한 관계를 생성

# a plot for recency

# 같은 방식으로 R 변수를 구간화 (30일 단위)
tr0001$gv_r <- as.character(as.integer(v_r/30))

 

# gv_r을 변수로 지정하고, 극단적으로 v_mf 즉 미래 1년 이용금액이 큰 일부 고객을 제외
qplot(gv_r, v_mf, data=subset(tr0001, v_r <= 180 & v_mf <=2000), geom=c("boxplot"),
       fill=gv_r, main="Future spending by past spending group",
       xlab="Recency group (u:30d)", ylab="Future spending(u: $)")

 

 

 

# 대부분의 고객이 180일 이내, 미래 2000불 이내의 구간에 속하므로 구간을 좁혀 단순화

# 시각적인 분석을 위해서는 관심있는 영역으로 시각화 범위를 좁히는 것 매우 중요

 

# Recency 경우에는 최근에 구매했을 수록 즉, v_r 값이 작을 수록 future spending의

# 평균값이 높음이 나타남. 최종구매후 2개월이상이 되면 미래 이용금액이

# Recency에 따라 크게 차이나지 않는 패턴이 됨

 

# 두 변수 모두를 구간화한 후 heatmap을 생성

# 구간별 frequency를 시각적으로 확인하기 위해 사용

# M과 R 간의 관계에 대한 heatmap

tr0001$gv_m <- as.character(as.integer(v_m/100))
tr0001$gv_r <- as.character(as.integer(v_r/30))

 

# 큰 값들에 대한 구간은 대상에서 제외. 구간을 나타내는 변수들만 선택

tr0002 <- subset(tr0001, v_m<1000 & v_r<180, select=c("gv_m", "gv_r"))

 

# heatmap에는 matrix 포맷의 데이터가 입력되어야 함

# table 함수를 이용하여 두 변수로 매트릭스 생성

rm_ctb<-table(tr0002$gv_r,tr0002$gv_m)

# 생성된 테이블의 값 확인

rm_ctb

 

      0   1   2   3   4   5   6   7   8   9
  0 243 185 161 131  96  75  47  39  32  25
  1  93  99  50  38  43  21  15  11  10   5
  2  76  54  41  23  25  13  13   4   7   1
  3  88  61  29  18  12   8   5   4   5   5
  4  95  67  46  35  14   8  13   3   5   3
  5 107  58  46  22   9  12   7   6   2   4

 

# heatmap 생성. x축과 y축에 라벨을 지정하고 col = 옵션에는 heat.color를 지정

# heatmap은 자동으로 계층적 클러스터링을 수행함

hm_tr0002<-heatmap(rm_ctb, Rowv=F, Colv=F,  col = heat.colors(256), scale="column", xlab =  "spending group" , ylab = "recency group" , margins=c(5,10))

 

 

 

# 생성된 heatmap은 클러스터링에 따라 라벨의 순서가 섞여있음

 

# 이번에는 M과 MF 즉 미래 구매액간의 관계에 대한 heatmap 생성

tr0001$gv_mf <- as.character(as.integer(v_mf/100))
tr0002 <- subset(tr0001, v_m<1000 & v_mf<1000, select=c("gv_m", "gv_mf"))

rm_ctb<-table(tr0002$gv_m,tr0002$gv_mf)
rm_ctb

 

# 생성된 테이블의 값 확인

    0   1   2   3   4   5   6   7   8   9
  0 845 162  61  50  22  15  17  10   5   6
  1 443 119  70  44  23  19  19  15   6   3
  2 220  76  62  25  29  18  10  12   8   7
  3 127  45  49  26  28  13   8   8   7   4
  4  78  38  23  21  15  13  11  12   6   3
  5  40  21  19  11  17  11   4   7  12   3
  6  31  15  15   8  10   8   1   4   5   3
  7  16   8   7  11   5   6   3   4   4   3
  8  16   6  11   5   1   7   4   4   2   1
  9   8   5   4   7   1   0   1   6   3   0

 

# heatmap에 클러스터링이 적용되지 않도록 Rowv와 Colv를 NA로 지정

# heat.colors의 값을 조절하여 구별이 용이하도록

 hm_tr0002<-heatmap(rm_ctb,  Rowv=NA, Colv=NA, col = heat.colors(100),
   xlab =  "future spending group" , ylab = "past spending group" , scale="column")

 

 

# 0-0 cell에 white 색이 되었고 반대로 9-9 cell은 red

# white가 frequency가 높은 cell

# 과거와 미래 모두에서 금액이 작은 집단에 돗수가 많음이 보임

# 과거에 금액이 작아도 미래에 금액이 큰 고객도 상당수 있음을 알수 있음