R 语言实战第一,二章 R 语言版

简介: 这次的作业主要是以对一个非常简单的数据分析问题进行实践的形式呈现出来,对于《R语言实战》第一二章的内容已经体现在了对问题的解析的过程中,所以就不再将学习的过程贴出来了。

这次的作业主要是以对一个非常简单的数据分析问题进行实践的形式呈现出来,对于《R语言实战》第一二章的内容已经体现在了对问题的解析的过程中,所以就不再将学习的过程贴出来了。

题目

题目的内容大概如下:

有三个csv文件:

  1. users.csv, 用于存储用户ID和用户的注册日期:


    img_2be8091330d002402119e6bf96ff393b.jpe
  2. purchases.cvs, 存储用户的购买数量和用户的购买日期。


    img_a6c9370b3b578f051097621c838f2ae5.jpe
  3. messages.csv, 用于存储用户收到的短信条数和收到的短信日期:


    img_94cc8be055207e12ea665dd53c4f9294.jpe

根据所给的数据回答以下三个问题:

  • 有多少百分比的用户在注册后的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

结论

无关联。

目录
相关文章
|
机器学习/深度学习 数据采集 算法
全网最快入门———R语言机器学习实战篇8《主成分分析》
R 语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析、绘图、数据挖掘。 机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
全网最快入门———R语言机器学习实战篇8《主成分分析》
【R语言实战】——带有高斯新息的金融时序的GARCH模型拟合预测及VAR/ES风险度量
【R语言实战】——带有高斯新息的金融时序的GARCH模型拟合预测及VAR/ES风险度量
|
7月前
|
数据可视化 数据挖掘 API
【R语言实战】聚类分析及可视化
【R语言实战】聚类分析及可视化
【R语言实战】——带有新息为标准学生t分布的金融时序的GARCH模型拟合预测
【R语言实战】——带有新息为标准学生t分布的金融时序的GARCH模型拟合预测
|
7月前
|
数据可视化
【R语言实战】——金融时序分布拟合
【R语言实战】——金融时序分布拟合
【R语言实战】——fGARCH包在金融时序上的模拟应用
【R语言实战】——fGARCH包在金融时序上的模拟应用
|
7月前
|
数据可视化 算法
【R语言实战】——kNN和朴素贝叶斯方法实战
【R语言实战】——kNN和朴素贝叶斯方法实战
|
7月前
|
数据采集 数据可视化
利用R语言进行因子分析实战(数据+代码+可视化+详细分析)
利用R语言进行因子分析实战(数据+代码+可视化+详细分析)
利用R语言进行典型相关分析实战
利用R语言进行典型相关分析实战
|
7月前
|
数据可视化
【R语言实战】——金融时序ARIMA建模
【R语言实战】——金融时序ARIMA建模
下一篇
DataWorks