#=============
# http://blog.daum.net/revisioncrm/394 (
[CRMAJU2018] 고객데이터분석 using R ) 의 고객세분화 연습용 샘플 데이터 엑셀파일을
다운로드 받은 후 읽어들일 것
# cs1 <- read.csv("D:/workfolder/yong/bak20180427_Y/m1710/0_CRM_AJU_2018Spring/cust_seg_smpl_280122.csv")
# cs1 <- read.csv("D:/aFolder/cust_seg_smpl_280122.csv")
names(cs1) <- c("cust_name", "sex", "age", "location", "days_purchase",
"recency", "num_books", "amt_books", "amt_non_book",
"amt_total", "interest_genre", "num_genre",
"membership_period", "sms_optin" )
# 엑셀에서 사용되었던 천단위 comma가 포함된 것을 gsub 함수로 제거
cs1$amt_books <- as.numeric(gsub(",","",as.character(cs1$amt_books)))
cs1$amt_non_book <- as.numeric(gsub(",","",as.character(cs1$amt_non_book)))
탐색적 분포분석
도서와 비도서 구매금액의 산점도를 작성하라.
x, y양 축은 0에서 출발하도록 하라.
양축의 라벨은 한글명으로 변경하라.
plot(cs1$amt_books, cs1$amt_non_book,
xlim=c(0,max(cs1$amt_books)*1.05),
ylim=c(0,max(cs1$amt_non_book)*1.05),
xlab="도서구매금액",
ylab="비도서구맥금액")
그리드기반의 세분화
도서구매금액 기준으로 상위 20%에 포함되는 고객의 수는 몇명인가?
df1 <- head(cs1[order(-cs1$amt_books),], floor(nrow(cs1)*0.2))
nrow(df1)
상위 20%에 포함되는 고객의 이름을 출력하라.
df1$cust_name
세분집단 특성확인
이 고객세분집단의 도서와 비도서 구매금액의 스캐터플롯을 작성하라.
스캐터플롯의 양 축은 0에서 출발하도록 하라.
두 변수 각각의 중위수를 기준으로 abline 수직, 수평 보조선을 점선형식으로 추가하라.
plot(df1$amt_books, df1$amt_non_book,
xlim=c(0,max(df1$amt_books)*1.05),
ylim=c(0,max(df1$amt_non_book)*1.05))
abline(v=median(df1$amt_books), lty=2)
abline(h=median(df1$amt_non_book), lty=2)
해당 집단중 남녀 고객의 비율을 막대플롯으로 작성하라
남성의 막대는 파란색으로 여성의 막대는 핑크색으로 표시하라
barplot(table(df1$sex))
barplot(table(df1$sex)/nrow(df1), col=c("blue","pink"))
남성집단과 여성집단의 구매쟝르수 중위수를 집계한 후
하나의 데이터프레임으로 생성하라.
df2 <- aggregate(num_genre~sex, data=df1, FUN=median)
df2
names(df2) <- c("sex","med_n_genre")
남성집단과 여성집단 각각의 sms 수신동의 비율을 산출해 데이터프레임을 생성하라
df3 <- aggregate(cust_name~sex+sms_optin, data=df1, FUN=length)
df3
names(df3) <- c("sex","sms_optin", "cnt_cust_optin")
df4 <- as.data.frame(table(df1$sex))
names(df4) <- c("sex", "cnt_cust")
df5 <- merge(df3, df4, by="sex", all.x=T)
df6 <- df5[df5$sms_optin=="수신",]
df6$OIration <- df6$cnt_cust_optin / df6$cnt_cust
df6
성별 구매쟝르수 중위수와 sms 수신동의 비율을 결합한 하나의 데이터프레임을
생성하라.
수신동의비율을 백분률로 단위 변경하라
df7 <- merge(df2, df6, by="sex", all.x=T)
df7$OIration <- df7$OIration * 100
df7
클러스터링을 활용한 고객세분화
고객리스트 데이터 파일에서 변수별 데이터타입을 확인하라.
str(cs1)
가용한 데이터 항목 중 모든 수치형 항목을 사용하여 세개의 집단으로 군집화를 실시하라
cs3 <- cs1[,names(cs1) %in% c("days_purchase", "recency", "num_books",
"amt_books", "amt_non_book", "amt_total", "num_genre", "membership_period" )]
cs3$amt_total <- as.numeric(gsub(",","",as.character(cs1$amt_total)))
fit <- kmeans(cs3, 3)
클러스터 프로파일링
군집별 소속된 고객의 수를 산출하고, 이를 보여주는 플롯을 생성하라.
군집화에 사용된 변수들 중 임의의 4개를 선정하여 두개 씩의 조합으로
두개의 산점도를 작성하라.
군집별로 다른 색상을 지정하고 각 점이 겹치지 않도록하라.
table(fit$cluster)
# cor(as.numeric(fit$cluster), cs3)
plot(jitter(cs3$days_purchase), jitter(cs3$num_genre), col=fit$cluster, pch=19)
plot(jitter(cs3$recency), jitter(cs3$membership_period), col=fit$cluster, pch=19)
2번 클러스터 소속 고객들의 성비를 구하라
df7 <- cs1
df7$cluster <- fit$cluster
df8 <- df7[df7$cluster==2,]
table(df8$sex)
table(df8$sex)[1] / sum(table(df8$sex))
의사결정나무 - 트리를 작성하라
도서구매금액을 종속변수로하는 Decision Tree를 ctree 함수를 사용해 생성하라.
분기가이루어질 수 있도록 하나의 리프노드에 포함될 개체의 수를
minbucket 옵션을 활용하여 조절하라.
생성된 트리에서 가장 처음 분기에 사용된 변수를 제외한 후 다시 Decision Tree를 생성하라.
각각의 트리에 대한 플롯을 생성하라.
library(party)
# numeric variable estimation
t1 <- ctree(amt_books~.,
data=cs1)
plot(t1)
t1 <- ctree(amt_books~.,
controls = ctree_control(maxdepth = 4, minbucket=2),
data=cs1)
plot(t1)
cs2 <- cs1[,names(cs1)!="num_books"]
t1 <- ctree(amt_books~.,
controls = ctree_control(maxdepth = 4, minbucket=2),
data=cs2)
plot(t1)
첫번째 분기에 사용된 변수와 예측대상 타겟변수(종속변수) 간의 관계를
플롯으로 작성하라
plot(cs2$days_purchase, cs2$amt_books)
abline(lm(cs2$amt_books~cs2$days_purchase), lty=2)
트리를 이용한 예측값과 실제 값간의 관계를 보여주는 플롯을 작성하라.
폴리노미얼 추세 보조선을 추가하라
# 예측값과 실제값간 관계 확인
plot(jitter(cs2$amt_books), jitter(predict(t1, data=cs2)),
col=rgb(0,0,0,0.5), pch=19, cex=0.5)
predicted <- predict(t1, data=cs2)
lines(lowess(cs2$amt_books~predicted ), lty=2)
의사결정나무 생성 결과 나타난 구매금액이 낮은 집단의 특징을 설명하고
이 집단의 구매금액을 높이기 위한 방안으로 어떤 조치가 필요한가에 대한
나름대로의 의견을 제시하라.
필요시 해당 집단의 특성을 분기에 사용되지 않은 다른 변수들을 통해
확인하라 (프로파일링).
단, 만일 이 집단에 대해 조치를 하지 않는 것이 적절하다고 판단한다면
그 이유를 설명하라.
cs4 <- cs2[cs2$days_purchase<=5,]
boxplot(cs4$membership_period)
# 다수가 1년미만된 신규고객들임. 구매금액이 크지 않으나 우수하지 않은 고객으로 보기는
어려움. 유지 및 활성화를 위한 방안 접촉 필요. 예:10번째 구매일에 선물 제공
'R 데이터 분석' 카테고리의 다른 글
[KDDTprj4] decision tree sample (0) | 2018.08.04 |
---|---|
[KDBRBD] retail data analysis practice (0) | 2018.08.04 |
[ CRMAJU2018 ] 기말고사 (0) | 2018.06.20 |
[CRMAJU2018] 예측분석 Review (0) | 2018.06.15 |
rolling 2 (0) | 2018.05.12 |