>RE::VISION CRM

CRM

[CRMAJU2018] Class 과제 :: 은행마케팅 - 20대 고객 탐색적 데이터 분석

YONG_X 2018. 5. 10. 08:18

# CRM 2018. Class 과제 :: 은행마케팅 - 20대 고객 탐색적 데이터 분석



은행 마케팅 데이터를 불러온 후 20대와 30대까지의연령대에 해당하는 고객들의 일부 변수들만을 추출한다.

이 데이터 부분집합을 활용하여 데이터 처리와 탐색적 시각적 분석을 실시한다.

이 중 20대에 해당하는 고객들만을 다시 구분하여 부분집합을 만든다.

20대 고객들은 어떤 특성을 가지고 있는가? 데이터만을 활용하여 이 집단의 특성을 파악하라.

집계와 챠트를 생성하여 특성을 보여주는 다음의 요구사항에 해당하는 스크립트를 작성하라.


- 연령의 분포를 보여주는 플롯을 작성하라.

- duratiion의 분포를 보여주는 플롯을 작성하라.

- 연령과 잔고의 scatterplot을 작성하라.

- 동일한 연령이 많이 존재하므로 jitter를 활용한 플롯을 작성하고 플롯의 point를 반투명한 blue 색상으로 변경하라.

- 결혼상태별 고객수를 막대챠트로 작성하고 <20대의 결혼상태 분포>라는 제목을 추가하라.


- 잔고와 duration간의 분포를 보여주는 scatterplot을 작성하고, 선형회귀선을 추가하라.

- 결혼상태가 single인 경우는 blue, 아니라면 red인 반투명 point로 색상을 변경하라.

- duration과 balance 각각에 대한 중위수를 기준으로 수직,수평의 보조 구분선을 추가하라.

- 개인대출여부 (loan) 별 잔고 분포를 box plot을 사용하여 나타내라.


- 직업별 잔고의 중위수를 집계 산출하고, 막대 플롯을 작성하라. 

- 직업이 학생이면 blue로 아니면 grey로 색상을 지정하라.

- 20대 전체의 잔고 중위수 값을 기준으로 수평 보조선을 추가하라.



- 20대의 직업별 고객수 비율을 table 명령을 활용하여 구하고

20대 뿐 아닌 전체 고객의 직업별 비율을 역시 같은 방식으로 구한후

두 가지를 하나의 데이터프레임으로 결합해서 생성하라

20대와 전체의 각 직업별 구성비 차이를 비교해 함께 보여주는 막대플롯을 작성하라


- 30대 고객의 연령과 잔고간 scatterplot과 20대에 대한 그 것을 각각이 플롯으로 비교해 보여주는 한 장의 그림을 작성하라 (par mfrow 활용)


* 제출은 이메일 xyxonxyxon@empas.com 으로, 기한은 5월 14일 오후 3시. 단, 과제가 성적에 반영되지는 않음




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

# 참고 답안


# import bank marketing data

bnk01 <- read.csv('https://t1.daumcdn.net/cfile/blog/99E6173359C44CE507?download')

names(bnk01)


# subset 20~39 age group

bnk02 <- bnk01[bnk01$age>=20 & bnk01$age<40, c("age", "marital", "job", "balance", "duration", "loan")]


dim(bnk02)

str(bnk02)


# check numeric vars

plot(bnk02$age)

plot(bnk02$balance)

plot(bnk02$duration)


hist(bnk02$age)

hist(bnk02$balance)



# 20 sth only -------


bnk02a <- bnk02[bnk02$age<30,]

plot(bnk02a$age)

plot(bnk02a$balance)

plot(bnk02a$duration)


plot(bnk02a$age, bnk02a$balance)

plot(jitter(bnk02a$age), jitter(bnk02a$balance), pch=19, col=rgb(0,0,1,0.2))


sort(table(bnk02$job))


plot(jitter(bnk02a$age), jitter(bnk02a$balance), pch=19, 

  col=ifelse(bnk02a$job=="student", rgb(0,0,1,0.2), rgb(1,0,0,0.2)),

  sub="blue: student")

abline(lm(balance~age, data=bnk02a), col="darkgrey", lwd=2, lty=2)


hist(bnk02a$duration)

plot(sort(bnk02a$balance))


barplot(table(bnk02a$marital), col=rgb(0,0,1,0.75),

  main="20s' marital status distribution")


barplot(table(bnk02a$marital)*100/nrow(bnk02a), col=rgb(0,0,1,0.75),

  main="20s' marital status distribution %")

abline(h=100/3, lty=2)


plot(jitter(bnk02a$balance), jitter(bnk02a$duration), pch=19, 

  col=ifelse(bnk02a$marital=="single", rgb(0,0,1,0.2), rgb(1,0,0,0.2)),

  sub="blue: single")

abline(lm(duration~balance, data=bnk02a), col="darkgrey", lwd=2, lty=2)

abline(h=median(bnk02a$duration), lty=2)

abline(v=median(bnk02a$balance), lty=2)


plot(jitter(bnk02a$balance), jitter(bnk02a$duration), pch=19, 

  col=ifelse(bnk02a$loan=="yes", rgb(1,0,0,0.2), rgb(0,0,1,0.2)),

  sub="blue: loan")

abline(lm(duration~balance, data=bnk02a), col="darkgrey", lwd=2, lty=2)

abline(h=median(bnk02a$duration), lty=2)

abline(v=median(bnk02a$balance), lty=2)


boxplot(balance~loan,data=bnk02a, main="개인대출여부별 잔고", 

  ylab="잔고", ylim=c(-1000,4000))

grid()



counts <- t(table(bnk02a$job, bnk02a$marital))

par_def <- par() # 현재의 설정을 임시 저장

par(cex.axis=0.6)

barplot(counts, main="직업별 결혼상태별 고객수 분포",

  xlab="직업", 

  col=c("red", "darkblue", "lightgreen"),

  legend = rownames(counts),

  beside=TRUE)

par(par_def) # 본래의 설정으로 되돌리기



# 직업별 잔고의 중위수 산출


agg1 <-aggregate(bnk02a$balance, by=list(bnk02a$job), 

   FUN=median)

names(agg1) <- c("job","mdn_bal")

barplot(agg1$mdn_bal, names.arg=agg1$job,

  col=ifelse(agg1$job=="student","blue","grey"))

abline(h=median(bnk02a$balance), lty=2)


agg2 <-aggregate(bnk02a$age, by=list(bnk02a$job), 

   FUN=mean)

names(agg2) <- c("job","avg_age")


rloan01 <- table(bnk02a$job, bnk02a$loan)[,3]/table(bnk02a$job, bnk02a$loan)[,1]

rloan02 <- rloan01[!is.nan(rloan01)]


barplot(agg2$avg_age, names.arg=agg2$job,

  col=rgb(rloan02,0,rloan02,0.8), 

  ylab="age", xlab="job")

abline(h=median(bnk02a$age), col="grey", lty=2)



# compare to the entire customer base

tb01 <- table(bnk02a$job)/nrow(bnk02a)

jobnames <- names(tb01)

tb01 <- as.numeric(tb01)

tb02 <- as.numeric(table(bnk01$job)/nrow(bnk01))

dfjobcnt <- data.frame(tb01, tb02)

row.names(dfjobcnt) <- jobnames

names(dfjobcnt) <- c("20_sth", "all")

tbjobcnt <- as.table(as.matrix(dfjobcnt))


barplot(t(tbjobcnt), beside=TRUE,  legend = colnames(tbjobcnt))



# 30 sth only -------


bnk02b <- bnk02[bnk02$age>=30,]

plot(jitter(bnk02b$age), jitter(bnk02b$balance), pch=19, 

  col=ifelse(bnk02b$job=="student", rgb(0,0,1,0.2), rgb(1,0,0,0.2)),

  sub="blue: student")