這次的作業(yè)主要是以對一個非常簡單的數(shù)據(jù)分析問題進(jìn)行實踐的形式呈現(xiàn)出來莺奸,對于《R語言實戰(zhàn)》第一二章的內(nèi)容已經(jīng)體現(xiàn)在了對問題的解析的過程中,所以就不再將學(xué)習(xí)的過程貼出來了冀宴。
題目
題目的內(nèi)容大概如下:
有三個csv文件:
-
users.csv, 用于存儲用戶ID和用戶的注冊日期:
-
purchases.cvs, 存儲用戶的購買數(shù)量和用戶的購買日期灭贷。
-
messages.csv, 用于存儲用戶收到的短信條數(shù)和收到的短信日期:
根據(jù)所給的數(shù)據(jù)回答以下三個問題:
- 有多少百分比的用戶在注冊后的90天內(nèi)(不包括注冊日)購買了產(chǎn)品?
- 注冊后90天內(nèi)購買的用戶中有多少百分比在注冊后購買前收到了短信通知花鹅?
- 收到注冊90天內(nèi)收到的短信數(shù)量與用戶90天內(nèi)產(chǎn)品是否有關(guān)聯(lián)氧腰?
答案
第一題
加載必要的庫
library(Rcpp)
library(Amelia)
library(dplyr)
載入csv文件,去掉列名刨肃,并不需要將字符型的列轉(zhuǎn)為factor
users <- read.csv("~/Desktop/users.csv", stringsAsFactors = F, header = T, na.strings = c(""))
messages <- read.csv("~/Desktop/messages.csv", stringsAsFactors = F, header = T, na.strings = c(""))
purchases <- read.csv("~/Desktop/purchases.csv", stringsAsFactors = F, header = T, na.strings = c("”))
查看載入的數(shù)據(jù)結(jié)構(gòu)
str(users)
str(messages)
str(purchases)
查看數(shù)據(jù)總量
summary(users)
summary(messages)
summary(purchases)
直觀的查看一下是否有缺失值古拴,有208個注冊日期為空的記錄
missmap(users, main="user miss map")
去掉注冊日期為空的用戶,剩下的為已經(jīng)注冊的用戶
users_signup <- na.omit(users)
統(tǒng)計有多少注冊日期為空的行
sum(is.na(users$signup.date))
日期格式轉(zhuǎn)換
users_signup$signup.date <- as.Date(users_signup$signup.date)
載入購買數(shù)據(jù)
purchases = read.csv("~/Desktop/purchases.csv", stringsAsFactors = F, header = T)
查看是否有缺失值 (無缺失值)
missmap(purchases)
轉(zhuǎn)換日期格式
purchases$purchase.date <- as.Date(purchases$purchase.date)
過濾掉最早注冊日之前的購買
purchases <- purchases[(purchases$purchase.date >= as.Date("2013-04-28", "%Y-%m-%d")), ]
合并注冊用戶和購買數(shù)據(jù)的信息
in_90 <- merge(x=users_signup, y=purchases, all.y=T)
in_90 <- na.omit(in_90)
in_90 <- in_90[((in_90$purchase.date - in_90$signup.date) <=90 & (in_90$purchase.date - in_90$signup.date) >=1), ]
summary(unique(in_90$user.id))
6369 % 23841 = 26.71%
in_90 <- in_90[!duplicated(in_90$user.id), ]
讀取短信信息真友,并轉(zhuǎn)換短信數(shù)據(jù)框中的日期類型黄痪。
messages <- read.csv("~/Desktop/messages.csv", stringsAsFactors = F, header = T)
messages$message.date <- as.Date(messages$message.date)
messages <- messages[(messages$message.date > as.Date("2013-04-28", "%Y-%m-%d")),]
合并九十天內(nèi)購買用戶信息和短信通知信息,并填補空缺數(shù)據(jù)盔然,造成空缺的原因是有2個九十天內(nèi)購買的用戶從來都沒有收到過短信桅打。
in_90_message <- merge(x=in_90, y=messages, by="user.id", all.x = T)
in_90_message$message.date[is.na(in_90_message$message.date)] <- as.Date("2014-04-29", "%Y-%m-%d")
in_90_message$message.count[is.na(in_90_message$message.count)] <- 0
過濾出在注冊后收到短信并且在第一次購買前收到短信的用戶,并去除重復(fù)愈案。
in_90_message_1 <- in_90_message[((in_90_message$message.date > in_90_message$signup.date) & (in_90_message$purchase.date > in_90_message$message.date)) , ]
in_90_message_1 <- in_90_message_1[!duplicated(in_90_message_1$user.id), ]
結(jié)論
共23841名用戶注冊挺尾,6369名用戶在注冊90天內(nèi)購買,占比26.71%站绪,這6369名用戶中有2871名用戶在第一次購買前收到了短信遭铺。
第二題
載入dplyr庫,通過獲取全部注冊用戶和九十天內(nèi)購買用戶的差集恢准,拿到九天內(nèi)未購買用戶的數(shù)據(jù)魂挂。
require(dplyr)
not_in_90 <- anti_join(users_signup, in_90)
合并九十天內(nèi)的用戶信息和短信信息,并轉(zhuǎn)換日期格式馁筐,處理空缺值涂召。
not_in_90_message <- merge(x=not_in_90, y=messages, by="user.id", all.x = T)
not_in_90_message$message.date[is.na(not_in_90_message$message.date)] <- as.Date("2014-04-27", "%Y-%m-%d”)
not_in_90_message$message.count[is.na(not_in_90_message$message.count)] <- 0
查詢注冊后,且注冊九十天內(nèi)收到短信的用戶數(shù)量敏沉。
not_in_90_message_1 <- not_in_90_message[((not_in_90_message$message.date - not_in_90_message$signup.date) <= 90) & (not_in_90_message$message.date > not_in_90_message$signup.date), ]
summary(unique(not_in_90_message_1$user.id))
結(jié)論
17472個用戶在注冊后的90天內(nèi)(不包括注冊當(dāng)日)沒有發(fā)生購買行為果正。在這些17472個用戶中, 有93.996% (16423)人在注冊后的90天內(nèi)(不包括注冊當(dāng)日)收到了短信炎码。
第三題
將注冊日間從字符串轉(zhuǎn)換為double
user$signup.date <- as.Date(user$signup.date)
合并用戶和短信通知記錄
user_message <- merge(x=users, y=messages, all.y=T)
只保留注冊九十天內(nèi)的短信通知記錄
user_message <- filter(user_message, (user_message$message.date - user_message$signup.date) <91 & (user_message$message.date - user_message$signup.date) > 1 )
將所有短信通知記錄的短信條數(shù)求和
user_message <- ddply(user_message, 'user.id', function(x) data.frame(message.count.sum = sum(x$message.count)))
新增一個90到180天間購買的標(biāo)示
user_purchase$buy_in_180 <- 0
user_purchase$buy_in_180[(user_purchase$purchase.date - user_purchase$signup.date) <=180 & (user_purchase$purchase.date - user_purchase$signup.date) > 91 & (user_purchase$purchase.count > 1)] <- 1
按照新增標(biāo)識和用戶ID降序排序,來保證下一步獲取每個用戶ID的唯一記錄時舱卡,可以將90·180天內(nèi)購買的標(biāo)識為1的記錄保留下來
user_purchase <- user_purchase[order(user_purchase$user.id, user_purchase$buy_in_180, decreasing = F), ]
獲取每個用戶ID的唯一記錄
user_purchase_unique <- user_purchase[!duplicated(user_purchase$user.id, fromLast = T), ]
將短信數(shù)量信息和購買信息合并
user_purchase_unique_message <- merge(x=user_purchase_unique, y=user_message, all.x=T)
填補空缺的短信數(shù)量記錄
user_purchase_unique_message$message.count.sum[is.na(user_purchase_unique_message$message.count.sum)] <- 0
計算90天內(nèi)收到短信數(shù)量和90到180天間購買的關(guān)聯(lián)度辅肾。
cor(user_purchase_unique_message$buy_in_180, user_purchase_unique_message$message.count.sum)
[1] -0.008017904
結(jié)論
無關(guān)聯(lián)队萤。