>RE::VISION CRM

R 데이터 분석

[kbdaa_bda] 빅데이터고객분석 GDA

YONG_X 2017. 9. 20. 08:18


#----[ GDA 연관성 분석 ]------ 




# 데이터 불러오기

# setwd("E:/restore_Yong/0_RnModeling20161215/GDA")


# [ 분석 데이터 준비 : Game Log 데이터 ] - 파일 온라인링크

dau <- read.csv("https://t1.daumcdn.net/cfile/blog/256C0D4B588ED29C26?download")

user <- read.csv("https://t1.daumcdn.net/cfile/blog/215C784B588ED2A133?download")



#---- dau 데이터 특성/구조 이해 ----

str(dau)

length(unique(dau$log_date))

min(as.character(dau$log_date))

max(as.character(dau$log_date))


tblog_date <- as.data.frame(table(as.character(dau$log_date)))

names(tblog_date) <- c("log_date", "Freq")

head(tblog_date)

plot(tblog_date$Freq, type="l")

plot(sort(tblog_date$Freq), type="l", ylim=c(0, max(tblog_date$Freq)))


length(unique(dau$app_name))

unique(dau$app_name)

# 모두 같은 이름이기 때문에 의미부여하지 않음


# user_id 컬럼 확인

length(unique(as.character(dau$user_id)))

min(dau$user_id))

max(dau$user_id)) 


tbuser_id <- as.data.frame(table(as.character(dau$user_id)))

names(tbuser_id) <- c("user_id", "Freq")

head(tbuser_id)


plot(tbuser_id$Freq, type="l", main="Freq by user_id")

# user_id가 순서대로 부여된 영향이 Freq에 나타남

plot(sort(tbuser_id$Freq), type="l", ylim=c(0, max(tbuser_id$Freq)))




#--- 연관성분석 데이터셋 만들기 ------


gda_item <- as.integer(log(runif(170360, min=1, max=200))) +1


plot(sort(gda_item))


dau$item_id <- gda_item

dau01 <- dau[, c("user_id", "item_id")]

dau02 <- unique(dau01)


head( table(dau02$item_id))


# 가상의 상품종류 부여 

dau02$item_nm <- ""

dau02$item_nm <- ifelse(dau02$item_id==1,'insurance',dau02$item_nm)

dau02$item_nm <- ifelse(dau02$item_id==2,'savings A',dau02$item_nm)

dau02$item_nm <- ifelse(dau02$item_id==3,'loan 21',dau02$item_nm)

dau02$item_nm <- ifelse(dau02$item_id==4,'credit card',dau02$item_nm)

dau02$item_nm <- ifelse(dau02$item_id==5,'deposit',dau02$item_nm)

dau02$item_nm <- ifelse(dau02$item_id==6,'savings C',dau02$item_nm)



d03 <- dau02[,c(1,3)]


write.csv(d03, "d03.csv", row.names=F)


# install.packages("arules")

# install.packages("arulesViz")


library(arules)

library(arulesViz)


tr <- read.transactions("d03.csv", format = "single", sep=',', 

  skip=1, rm.duplicates = FALSE, cols=c(1,2))

inspect(head(tr))


itemFrequencyPlot(tr,topN=5,type="absolute")



srules <- apriori(tr, parameter = list(supp = 0.05, conf = 0.4, minlen=2, maxlen=2))

# options(digits=3)

inspect(head(srules))

summary(srules)


plot(srules, method="graph", interactive=T, shading=NA)


subrules = srules[quality(srules)$lift > 1.4]

inspect(subrules)


plot(subrules, method="graph", interactive=T, shading=NA)






#---- 예측 분석용 데이터 준비 : Game Log 데이터 --------



# 데이터 불러오기

# setwd("E:/restore_Yong/0_RnModeling20161215/GDA")

# dau <- read.csv("section4-dau.csv")

# user <- read.csv("section4-user_info.csv")


# [ 분석 데이터 준비 : Game Log 데이터 ] - 파일 온라인링크

dau <- read.csv("https://t1.daumcdn.net/cfile/blog/256C0D4B588ED29C26?download")

user <- read.csv("https://t1.daumcdn.net/cfile/blog/215C784B588ED2A133?download")


#---- dau 데이터 특성/구조 이해 ----

str(dau)

length(unique(dau$log_date))

min(as.character(dau$log_date))

max(as.character(dau$log_date))


tblog_date <- as.data.frame(table(as.character(dau$log_date)))

names(tblog_date) <- c("log_date", "Freq")

head(tblog_date)

plot(tblog_date$Freq, type="l")

plot(sort(tblog_date$Freq), type="l", ylim=c(0, max(tblog_date$Freq)))


length(unique(dau$app_name))

unique(dau$app_name)

# 모두 같은 이름이기 때문에 의미부여하지 않음


# user_id 컬럼 확인

length(unique(as.character(dau$user_id)))

min(dau$user_id))

max(dau$user_id)) 


tbuser_id <- as.data.frame(table(as.character(dau$user_id)))

names(tbuser_id) <- c("user_id", "Freq")

head(tbuser_id)


plot(tbuser_id$Freq, type="l", main="Freq by user_id")

# user_id가 순서대로 부여된 영향이 Freq에 나타남

plot(sort(tbuser_id$Freq), type="l", ylim=c(0, max(tbuser_id$Freq)))



#---- 예측분석을 위한 테이블 생성 ----


# 예측분석 수행절차(예시)

# ....................

# 1. 무엇을 예측할 것인지 정의 (다음학기 휴학가능성)

# 1.1 기간 설정 (언제 기간의 데이터로 언제를 예측?)

# 2. 대상의 범위 설정 (예: 4학년 재학중 내국인 남학생)

# 3. 필요한 데이터 확보

# 4. 확보한 데이터에서 대상자 추출(예: 대상자 학번)

# 5. 변수(X)를 만들 데이터 분리

# 6. 타겟(Y)을 만들 데이터 분리


# (중간중간) 탐색적으로 데이터 구조, 분포, 관계 파악

#  === 탐색적 데이터 분석 (EDA)


# 7. 변수 설계 (아마도 여러개. 100개이상???)

# 8. 변수 생성 (하나씩 하나씩. NA처리, 정제 포함)

# 9. 생성된 변수와 대상자 리스트 결합

# 10. 타겟 생성

# 11. 타겟을 생성된 변수들의 Set와 결합


# 12. 모델 개발 (변수 선택, 추가변수 반영 포함)

# 13. 모델 평가 Assessment (잘맞는 것인지)

#-------------


head(tblog_date[order(tblog_date$log_date),], 10)


# 방향: 미래에 게임을 할 것인지 예측하는 모델을 생성

# 최종 7일 즉 1주일간의 데이터는 분리 - 예측 대상으로 사용 예정

ulog0 <- head(tblog_date[order(tblog_date$log_date),], nrow(tblog_date)-7)


ulog0$Freq <- 0 # 기간이 달라 의미없으므로 임시 생략 조치

daup <- dau[dau$log_date %in% ulog0$log_date,c(1,3)]


#[참고] %in% 연산자 활용 예제

# a <- c("red", "green", "blue")

# a[a %in% c("red", "green")]


uuserp <- as.data.frame(unique(daup$user_id))

names(uuserp)[1] <- "user_id"


# user별로 이용 일수를 집계

# user_days <- aggregate(log_date ~ user_id, data = daup, function(x) length(x))


user_days <- aggregate(log_date ~ user_id, data = daup, length)

head(user_days)

names(user_days)[2] <- "log_days"

plot(user_days$user_id, user_days$log_days)


# 최초, 최근 이용일 날짜를 산출

user_initial <- aggregate(log_date ~ user_id, data = daup, function(x) min(as.character(x)))

head(user_initial)

names(user_initial)[2] <- "log_init"


user_recent <- aggregate(log_date ~ user_id, data = daup, function(x) max(as.character(x)))

names(user_recent)[2] <- "log_rcnt"


# 하나의 데이터 프레임으로 결합

uuserp1 <- merge(uuserp, user_days, by="user_id", all.x=T)

uuserp1 <- merge(uuserp1, user_initial, by="user_id", all.x=T)

uuserp1 <- merge(uuserp1, user_recent, by="user_id", all.x=T)

head(uuserp1)


# initial과 recent에 대한 기간일수 산출

lastdayp <- max(as.character(daup$log_date))

uuserp1$longevity <- as.numeric(as.Date(lastdayp, format="%Y-%m-%d")- as.Date(uuserp1$log_init, format="%Y-%m-%d") + 1)

uuserp1$recency <- as.numeric(as.Date(lastdayp, format="%Y-%m-%d")- as.Date(uuserp1$log_rcnt, format="%Y-%m-%d") + 1)

plot(uuserp1$recency, uuserp1$longevity)

# 분석기간 중 최초 일자는 마지막 이용 일자보다는 이전인 관계 확인


plot(jitter(uuserp1$recency), jitter(uuserp1$longevity))


plot(uuserp1$log_days, uuserp1$recency)



# 미래 - 종속변수 생성

dauf <- dau[!(dau$log_date %in% ulog0$log_date), c(1,3)]

uuserf <- as.data.frame(unique(dauf$user_id))

names(uuserf)[1] <- "user_id"


user_daysf <- aggregate(log_date ~ user_id, data = dauf, function(x) length(x))

head(user_daysf)

names(user_daysf)[2] <- "log_daysf"


# 과거(X) 와 미래(Y) 데이터 결합

uuserp1 <- merge(uuserp1, user_daysf, by="user_id", all.x=T)

# NA 값을 모두 0으로 대체

uuserp1$log_daysf[is.na(uuserp1$log_daysf)] <- 0

# 1보다 큰 값을 모두 1로 변환 - binary 형식의 종속변수 후보

uuserp1$loggedf <- ifelse(uuserp1$log_daysf>=1, 1, 0) 


# 초기 회귀분석 실시

lm1 <- lm(log_daysf~log_days + longevity + recency , data=uuserp1)

summary(lm1)


plot(jitter(uuserp1$log_days), jitter(uuserp1$longevity), 

  col=grey(1- uuserp1$log_daysf/max(uuserp1$log_daysf)),

  pch=19, cex=0.6)


# 평균적인 이용주기 파생변수 생성

uuserp1$log_cycle <- uuserp1$longevity / uuserp1$log_days


plot(jitter(uuserp1$log_cycle), jitter(uuserp1$longevity), 

  col=grey(1- uuserp1$log_daysf/max(uuserp1$log_daysf)),

  pch=19, cex=0.6)

plot(jitter(uuserp1$log_cycle), jitter(uuserp1$longevity), 

  col=rgb( .5, (1- uuserp1$log_daysf/max(uuserp1$log_daysf)), .5, alpha=.6),

  pch=19, cex=0.6)

plot(jitter(uuserp1$log_cycle), jitter(uuserp1$recency), 

  col=rgb( .3, (1- uuserp1$log_daysf/max(uuserp1$log_daysf)), .7, alpha=.5),

  pch=19, cex=0.5)


# 이용자 개인정보 구조 파악

str(user)

length(unique(user$user_id))

length(unique(user$user_id, user$install_date))


user_instfrq <- aggregate(install_date ~ user_id, data = user, function(x) length(x))

head(user_instfrq)

names(user_instfrq)[2] <- "instfrq"


plot(user_instfrq$instfrq)

range(user_instfrq$instfrq)


# user 항목 결합

uuserp1 <- merge(uuserp1, user, by="user_id", all.x=T)

uuserp1$inst_age <- as.numeric(as.Date(lastdayp, format="%Y-%m-%d")- as.Date(uuserp1$install_date, format="%Y-%m-%d") + 1)

plot(uuserp1$inst_age)

range(uuserp1$inst_age)


names(user)




#---- 완성된 데이터 셋 분포 확인 ---------

mean(uuserp1$log_daysf)


# 가설: 과거에 많이 이용했다면 미래 이용도 많을 것

plot(uuserp1$log_daysf, uuserp1$log_days)

plot(uuserp1$log_days, uuserp1$log_daysf)


plot(uuserp1$log_days, jitter(uuserp1$log_daysf))

plot(jitter(uuserp1$log_daysf)~uuserp1$log_days)

plot(jitter(uuserp1$log_daysf)~ jitter(uuserp1$log_days))


plot(uuserp1$log_days, uuserp1$log_daysf)

# 겹침으로 인해 분포의 의미 파악 불가능


plot(jitter(uuserp1$log_days), jitter(uuserp1$log_daysf))

abline(lm(uuserp1$log_daysf~uuserp1$log_days), col="red")

cor(uuserp1$log_daysf, uuserp1$log_days)


boxplot(uuserp1$log_days~ uuserp1$log_daysf)

boxplot(uuserp1$log_daysf~uuserp1$log_days)

boxplot(uuserp1$log_daysf~as.integer(uuserp1$log_days/10))

grid()


#--- 데이터 처리 >> 변수생성 연습 --------


#[1]  8월중 마지막 날짜는?

#[2]  9월중 마지막 날짜는?

#[3] 전체 user중에서 10번째로 많은 방문일수를 가진 

#   user의 id는?

#[4] 여성의 숫자는?

#[5] 여성이면서 10대는 몇명인가?

#[6] 여성중 가장 마지막 날 사용한 사람들 명단은?

#[7] 연령대별 인원수는?

#[8] 연령대별 평균게임일수는?

#[9] 50대 여성중 가장 처음 한명이라도 게임을 한 날과

#   가장 마지막으로 게임을 한 날의 간격은?


#[1]  8월중 마지막 날짜는?

udate <- as.character(unique(dau$log_date))

udatedf <- as.data.frame(udate)

udatedf$month <- substr(udate, 6, 7)

udatedf1 <- udatedf[udatedf$month=="08",]

head(udatedf1) ; tail(udatedf1)

tail(sort(udatedf1$udate),1)

udatedf1[order(udatedf1$udate), ][nrow(udatedf1),1]


#[2]  9월중 마지막 날짜는?



#[3] 전체 user중에서 10번째로 많은 방문일수를 가진 

#   user의 id는?

days1 <- aggregate(log_date ~ user_id , data = dau, length)


dau_u <- unique(dau)

days1.1 <- aggregate(log_date ~ user_id , data = dau_u, length)


days2 <- aggregate(log_date ~ user_id , data = dau, function(x) {length(unique(x))})


head(days1[order(-days1$log_date), ], 10)[10,1]

tail(head(days1[order(-days1$log_date), ], 10),1)[,1]

tail(head(days1[order(-days1$log_date), ], 10),1)$user_id


#[4] 여성의 숫자는?

nrow(user[user$gender=="F",])

length(user$gender[user$gender=="F"])


#[5] 여성이면서 10대는 몇명인가?

nrow(user[user$gender=="F" & user$generation==10,])


#[6] 여성중 가장 마지막 날 사용한 사람들 명단은?

#[7] 연령대별 인원수는?

table(user$generation)

u0 <- aggregate(.~generation, data=user, length)

#[8] 연령대별 평균게임일수는?

u1 <- user[,c("user_id", "generation")]

u2 <- merge(dau, u1, by="user_id")

u3 <- aggregate(.~generation, data=u2, mean)

u4 <- merge(u0, u3, by="generation")

plot(u4[,2], u4[,7])


#[9] 50대 여성중 가장 처음 한명이라도 게임을 한 날과

#   가장 마지막으로 게임을 한 날의 간격은?



#------- 선형회귀분석 -----------

lm2 <- lm(log_daysf~log_days + longevity + recency + gender + generation + device_type + inst_age, data=uuserp1)

summary(lm2)




#--- device_type 의미 파악 ----

boxplot(uuserp1$log_daysf~ uuserp1$device_type)

grid(10)


nrow(uuserp1[ uuserp1$log_daysf>=1 & uuserp1$device_type=="Android",]) / nrow(uuserp1[  uuserp1$device_type=="Android",])

nrow(uuserp1[ uuserp1$log_daysf>=1 & uuserp1$device_type=="iOS",]) / nrow(uuserp1[  uuserp1$device_type=="iOS",])


mean(uuserp1[ uuserp1$device_type=="Android",]$log_daysf) 

mean(uuserp1[ uuserp1$device_type=="iOS",]$log_daysf) 


plot(sort(uuserp1[ uuserp1$device_type=="iOS",]$log_daysf), type="l")

lines(sort(uuserp1[ uuserp1$device_type=="Android",]$log_daysf), col="red", lty=2)


tmp <- uuserp1[order(uuserp1$log_daysf),]

plot(tmp[ tmp$device_type=="iOS",]$log_daysf, type="l")

lines(tmp[ tmp$device_type=="Android",]$log_daysf,  col="red", lty=2)


plot(jitter(jitter(tmp$log_daysf)), pch=19, cex=0.7,

  col=ifelse(tmp$device_type=="Android","blue","red"))


plot(table(tmp$log_daysf, tmp$device_type)[,1] / (table(tmp$log_daysf, tmp$device_type)[,1] + table(tmp$log_daysf, tmp$device_type)[,2]), 

  type="b", main="PCNT of Android by log_datsf" )


log_daysf <- c(0:7)

andr_cnt <- table(tmp$log_daysf, tmp$device_type)[,1]

all_cnt <- table(tmp$log_daysf, tmp$device_type)[,1] + table(tmp$log_daysf, tmp$device_type)[,2]

log_daysf_dvc_type <- data.frame(log_daysf, andr_cnt, all_cnt)

log_daysf_dvc_type$andr_r <- log_daysf_dvc_type$andr_cnt / log_daysf_dvc_type$all_cnt


plot(log_daysf_dvc_type$log_daysf, log_daysf_dvc_type$andr_r, type="b")

points(log_daysf_dvc_type$log_daysf, log_daysf_dvc_type$all_cnt/25000, type="l", lty=2)





#-------[모델 평가시 ] 실제값과 예측값 관계 확인 --------


plot(jitter(uuserp1$log_daysf), jitter(predict(lm2, data=uuserp1)),

  main="Predicted Vs. Actual")

# 실제값과 예측오차값 관계 확인

aa <- uuserp1$log_daysf-predict(lm2, data=uuserp1)

abline(lm(aa~uuserp1$log_daysf), col="red")


uuserp1$predicted <- predict(lm2, data=uuserp1)


plot(sort(uuserp1$log_daysf-predict(lm2, data=uuserp1)), 

  main="Residual distribution", ylab="Residual")

abline(0,0) # 대각선 추가


plot(jitter(uuserp1$log_daysf), jitter(uuserp1$log_daysf)-predict(lm2, data=uuserp1))

abline(0,1, lty=2)

plot(jitter(predict(lm2, data=uuserp1)), 

  jitter(jitter(uuserp1$log_daysf)-jitter(predict(lm2, data=uuserp1))), 

  main="Residual Vs. Fitted")


# plot(lm2, which=c(2)) # 예측 오차의 분포 확인

# plot(lm2, which=c(1:6)) # 모델 확인 - 오차의 정규성 등 qqplot



#---- 의사결정나무 분석 ------------

require(party)

t1 <- ctree(log_daysf~log_days + longevity + recency + gender + generation + device_type + inst_age, data=uuserp1, controls = ctree_control(maxdepth = 3, minbucket=100))

plot(t1)


plot(jitter(uuserp1$log_days), jitter(uuserp1$recency), 

  col=rgb( .3, (1- uuserp1$log_daysf/max(uuserp1$log_daysf)), .7, alpha=.5),

  pch=19, cex=0.5)



# 회귀분석모델의 예측 결과를 저장

uuserp1$actual <- uuserp1$log_daysf

uuserp1$predicted_lm <- predict(lm2, data=uuserp1)

uuserp1$predicted_dt <- predict(t1, data=uuserp1)[,1]


#---- 모델별 평균 절대 오차 계산 ----

uuserp1$diff_lm <- uuserp1$actual - uuserp1$predicted_lm

uuserp1$diff_dt <- uuserp1$actual - uuserp1$predicted_dt


mean(abs(uuserp1$diff_lm)) # 회귀모델 오차

mean(abs(uuserp1$diff_dt)) # DT모델 오차




#------- [모델 유의성 검증]-----------------



par(mfrow=c(2,2))

plot(lm2)

par(mfrow=c(1,1))


uuserp1$log_log_daysf <- log(uuserp1$log_daysf+1)

lm2lg <- lm(log_log_daysf~log_days + longevity + recency + gender + generation + device_type + inst_age, data=uuserp1)


par(mfrow=c(2,2))

plot(lm2lg)

par(mfrow=c(1,1))



plot(uuserp1$log_daysf, predict(lm2))

abline(0,1)


plot(jitter(uuserp1$log_daysf), jitter(predict(lm2)))

abline(0,1, col="red")


boxplot(predict(lm2)~uuserp1$log_daysf, xlab="Actual", ylab="Fitted")

abline(-1,1, col="red")


qqplot(uuserp1$log_daysf, predict(lm2))

abline(0,1)


mean(uuserp1$log_daysf); mean(predict(lm2))

var(uuserp1$log_daysf); var(predict(lm2))


cor(uuserp1$log_daysf, predict(lm2))


# 두 집단간에 평균에 차이가 있는지 검증

# 먼저 분산의 차이 검증

var.test(uuserp1$log_daysf, predict(lm2))

# 귀무가설 기각 == 두 변수간 분산 같다고 볼 수 없음

t.test(uuserp1$log_daysf, predict(lm2)) 

# p-value = 1

# 유의한 차이가 있다고 볼수 없음 


plot(density(uuserp1$log_daysf))


# 오차 정규성 심층 확인

library(car)

qqPlot(lm2,id.method="identify",simulate=TRUE,main="Q-Q_ plot")


# 정규분포 여부 시각적 확인

z<- rstudent(lm2lg)

hist(z, breaks=10, freq=FALSE,xlab="Studentized Residual",

   main="Distribution of Errors")

rug(jitter(z), col="brown")

curve(dnorm(x, mean=mean(z), sd=sd(z)),add=TRUE, col="blue", lwd=2)

lines(density(z)$x, density(z)$y,col="red", lwd=2, lty=2)

legend("topright",legend = c( "Normal Curve", "Kernel Density Curve"),

   lty=1:2, col=c("blue","red"), cex=.7)


# 오차항이 정규성을 갖지 않는 경우에는 종속변수를 변수변환하거나 

# 모형에 설명변수들을 추가 또는 삭제해서 오차항이 정규성 확보 시도


# 변수별 선형성 확인 - partial-residual plots

crPlots(lm2)


# 다중공선성 확인 

vif(lm2)

# 5 이상 정도의 값을 가지면 통상 높은 다중공선성으로 간주


#--------[ 회귀분석 가정 충족여부 확인 ]--

# 회귀분석의 기본가정(위키피디아)


# 1. 오차항(residuals)은 모든 독립변수 값에 대하여 동일한 분산을 갖는다.

# 2. 오차항의 평균(기대값)은 0이다.

# 3. 수집된 데이터의 분산은 정규분포를 이루고 있다.

# 4. 독립변수 상호간에는 상관관계가 없어야 한다.

# 5. 시간에 따라 수집한 데이터들은 잡음의 영향을 받지 않아야 한다.


par(mfrow=c(2,2))

plot(lm2)

par(mfrow=c(1,1))


uuserp1$log_daysbyrcnc <- uuserp1$log_days / uuserp1$recency

uuserp1$log_daysbyinstag <- uuserp1$log_days / uuserp1$inst_age

uuserp1$log_dayssqr <- uuserp1$log_days ^2

uuserp1$log_dayslog <- log(uuserp1$log_days)

uuserp1$lngvtybyrcncy <- uuserp1$longevity / uuserp1$recency

uuserp1$log_dayssqrt <- sqrt(uuserp1$log_days)

uuserp1$log_daysbylngvty <- uuserp1$log_days / uuserp1$longevity


lm2_1 <- lm(log_daysf~longevity + recency + gender + generation + device_type + inst_age + log_daysbyrcnc + log_daysbyinstag + log_dayslog + lngvtybyrcncy + log_dayssqrt+ log_daysbylngvty + log_days_r2w + log_days_r1w + log_days_r3d, 

data=uuserp1)


a_long <- predict(lm2_1, newdata = uuserp1) - uuserp1$log_daysf


# plot(uuserp1$log_daysf, uuserp1$log_dayssqrt)

# cor(uuserp1$log_daysf, uuserp1$log_dayssqrt)



lm2_1 <- lm(log_daysf~longevity + recency + gender + generation + device_type + inst_age + log_daysbyrcnc + log_daysbyinstag + log_dayslog + lngvtybyrcncy + log_dayssqrt+ log_daysbylngvty, 

data=uuserp1)


a_short <- predict(lm2_1, newdata = uuserp1) - uuserp1$log_daysf


plot(a_long,a_short)

abline(lm(a_short~a_long))

abline(lm(a_short~a_long), col="red")

abline(h=4)

abline(v=4)

abline(h=-3)

abline(v=-3)

var(a_long)

var(a_short)

plot(sort(a_long^2))

lines(sort(a_short^2), col="red")

sum(a_short^2) ; sum(a_long^2)

sum(a_short^2) / sum(a_long^2)


summary(lm2_1)

par(mfrow=c(2,2))

plot(lm2_1)

par(mfrow=c(1,1))



plot(jitter(predict(lm2_1, newdata = uuserp1)), jitter(uuserp1$log_daysf))


plot(jitter(uuserp1$inst_age), jitter(uuserp1$recency), pch=19, col=rgb(1,1-(uuserp1$log_daysf/max(uuserp1$log_daysf)),0, alpha=0.5), cex=0.5)

plot(sort(uuserp1$recency))



#--- 파생변수추가 : 최근 활동 기간별 변수 생성 -------

# 최종 7일 즉 1주일간의 데이터(미래) 이전의 14일(2주) 행동을 집계


ulog1 <- tail(head(tblog_date[order(tblog_date$log_date),], nrow(tblog_date)-7), 14)

ulog1$Freq <- 0 # 임시 생략 조치 - 혼동 방지

daup1 <- dau[dau$log_date %in% ulog1$log_date,c(1,3)]


# user별로 최근2주간 이용 일수를 집계

user_days1 <- aggregate(log_date ~ user_id, data = daup1, function(x) length(x))

names(user_days1)[2] <- "log_days_r2w"

head(user_days1)

plot(user_days1$user_id, user_days1$log_days_r2w)

uuserp1 <- merge(uuserp1, user_days1, by="user_id", all.x=T)

uuserp1$log_days_r2w[is.na(uuserp1$log_days_r2w)] <- 0 # NA값 0으로 대체


# 최종 7일 즉 1주일간의 데이터(미래) 이전의 7일(1주) 행동을 집계


ulog2 <- tail(head(tblog_date[order(tblog_date$log_date),], nrow(tblog_date)-7), 7)

ulog2$Freq <- 0 # 임시 생략 조치 - 혼동 방지

daup2 <- dau[dau$log_date %in% ulog2$log_date,c(1,3)]


# user별로 최근 1주간 이용 일수를 집계

user_days2 <- aggregate(log_date ~ user_id, data = daup2, function(x) length(x))

names(user_days2)[2] <- "log_days_r1w"

head(user_days2)

plot(user_days2$user_id, user_days2$log_days_r1w)

uuserp1 <- merge(uuserp1, user_days2, by="user_id", all.x=T)

uuserp1$log_days_r1w[is.na(uuserp1$log_days_r1w)] <- 0 # NA값 0으로 대체


# 최종 7일 즉 1주일간의 데이터(미래) 이전의 3일 행동을 집계


ulog3 <- tail(head(tblog_date[order(tblog_date$log_date),], nrow(tblog_date)-7), 3)

ulog3$Freq <- 0 # 임시 생략 조치 - 혼동 방지

daup3 <- dau[dau$log_date %in% ulog3$log_date,c(1,3)]


# user별로 최근 3일간 이용 일수를 집계

user_days3 <- aggregate(log_date ~ user_id, data = daup3, function(x) length(x))

names(user_days3)[2] <- "log_days_r3d"

head(user_days3)

plot(user_days3$user_id, user_days3$log_days_r1w)

uuserp1 <- merge(uuserp1, user_days3, by="user_id", all.x=T)

uuserp1$log_days_r3d[is.na(uuserp1$log_days_r3d)] <- 0 # NA값 0으로 대체


#-------------




#----[ GDA 연관성 분석 ]------ 


# 데이터셋 만들기 

gda_item <- as.integer(log(runif(170360, min=1, max=200))) +1

plot(sort(gda_item))

dau$item_id <- gda_item

head(dau)

table(dau$item_id)

# 가상의 상품종류 부여 
dau$item_nm <- ifelse(dau$item_id==1,'insurance',dau$item_nm)
dau$item_nm <- ifelse(dau$item_id==2,'savings A',dau$item_nm)
dau$item_nm <- ifelse(dau$item_id==3,'loan 21',dau$item_nm)
dau$item_nm <- ifelse(dau$item_id==4,'credit card',dau$item_nm)
dau$item_nm <- ifelse(dau$item_id==5,'deposit',dau$item_nm)
dau$item_nm <- ifelse(dau$item_id==6,'savings C',dau$item_nm)

head(dau, 50)