>RE::VISION CRM

R 데이터 분석

[kbdaa_bda] 데이터 처리 연습 GDA

YONG_X 2017. 9. 21. 15:35

#---- 분석용 데이터 준비 : 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월중 마지막 날짜는?


a <- as.character(unique(dau$log_date))[substr(as.character(unique(dau$log_date)), 6,7)=="08"]

max(a)



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

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

#   user의 id는?

#[4] 여성의 숫자는?

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

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

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

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

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

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