这次的作业主要是以对一个非常简单的数据分析问题进行实践的形式呈现出来,对于《R语言实战》第一二章的内容已经体现在了对问题的解析的过程中,所以就不再将学习的过程贴出来了。
题目
题目的内容大概如下:
有三个csv文件:
-
users.csv, 用于存储用户ID和用户的注册日期:
-
purchases.cvs, 存储用户的购买数量和用户的购买日期。
-
messages.csv, 用于存储用户收到的短信条数和收到的短信日期:
根据所给的数据回答以下三个问题:
- 有多少百分比的用户在注册后的90天内(不包括注册日)购买了产品?
- 注册后90天内购买的用户中有多少百分比在注册后购买前收到了短信通知?
- 收到注册90天内收到的短信数量与用户90天内产品是否有关联?
答案
第一题
加载必要的库
library(Rcpp)
library(Amelia)
library(dplyr)
载入csv文件,去掉列名,并不需要将字符型的列转为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("”))
查看载入的数据结构
str(users)
str(messages)
str(purchases)
查看数据总量
summary(users)
summary(messages)
summary(purchases)
直观的查看一下是否有缺失值,有208个注册日期为空的记录
missmap(users, main="user miss map")
去掉注册日期为空的用户,剩下的为已经注册的用户
users_signup <- na.omit(users)
统计有多少注册日期为空的行
sum(is.na(users$signup.date))
日期格式转换
users_signup$signup.date <- as.Date(users_signup$signup.date)
载入购买数据
purchases = read.csv("~/Desktop/purchases.csv", stringsAsFactors = F, header = T)
查看是否有缺失值 (无缺失值)
missmap(purchases)
转换日期格式
purchases$purchase.date <- as.Date(purchases$purchase.date)
过滤掉最早注册日之前的购买
purchases <- purchases[(purchases$purchase.date >= as.Date("2013-04-28", "%Y-%m-%d")), ]
合并注册用户和购买数据的信息
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), ]
读取短信信息,并转换短信数据框中的日期类型。
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")),]
合并九十天内购买用户信息和短信通知信息,并填补空缺数据,造成空缺的原因是有2个九十天内购买的用户从来都没有收到过短信。
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
过滤出在注册后收到短信并且在第一次购买前收到短信的用户,并去除重复。
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), ]
结论
共23841名用户注册,6369名用户在注册90天内购买,占比26.71%,这6369名用户中有2871名用户在第一次购买前收到了短信。
第二题
载入dplyr库,通过获取全部注册用户和九十天内购买用户的差集,拿到九天内未购买用户的数据。
require(dplyr)
not_in_90 <- anti_join(users_signup, in_90)
合并九十天内的用户信息和短信信息,并转换日期格式,处理空缺值。
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
查询注册后,且注册九十天内收到短信的用户数量。
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))
结论
17472个用户在注册后的90天内(不包括注册当日)没有发生购买行为。在这些17472个用户中, 有93.996% (16423)人在注册后的90天内(不包括注册当日)收到了短信。
第三题
将注册日间从字符串转换为double
user$signup.date <- as.Date(user$signup.date)
合并用户和短信通知记录
user_message <- merge(x=users, y=messages, all.y=T)
只保留注册九十天内的短信通知记录
user_message <- filter(user_message, (user_message$message.date - user_message$signup.date) <91 & (user_message$message.date - user_message$signup.date) > 1 )
将所有短信通知记录的短信条数求和
user_message <- ddply(user_message, 'user.id', function(x) data.frame(message.count.sum = sum(x$message.count)))
新增一个90到180天间购买的标示
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
按照新增标识和用户ID降序排序,来保证下一步获取每个用户ID的唯一记录时,可以将90·180天内购买的标识为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), ]
将短信数量信息和购买信息合并
user_purchase_unique_message <- merge(x=user_purchase_unique, y=user_message, all.x=T)
填补空缺的短信数量记录
user_purchase_unique_message$message.count.sum[is.na(user_purchase_unique_message$message.count.sum)] <- 0
计算90天内收到短信数量和90到180天间购买的关联度。
cor(user_purchase_unique_message$buy_in_180, user_purchase_unique_message$message.count.sum)
[1] -0.008017904
结论
无关联。