>RE::VISION CRM

R 데이터 분석

[CRMAJU2018] 기말고사 후보답안 예시

YONG_X 2018. 6. 20. 17:35


#=============

# 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