# 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")
'CRM' 카테고리의 다른 글
[CRMAJU2018] R데이터분석 - 탐색적 고객세분화 :: 서점 데이터 활용 (0) | 2018.05.22 |
---|---|
[CRMAJU2018] kmeans 예제 - 은행마케팅 (0) | 2018.05.16 |
앙상블 :: ensemble 배깅 그리고 random forest 개념 (0) | 2015.07.10 |
How Insensitive [Lyrics] (0) | 2015.01.01 |
장바구니분석과 연관성분석 응용 (0) | 2014.03.10 |