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

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

题目

题目的内容大概如下:

有三个csv文件:

  1. users.csv, 用于存储用户ID和用户的注册日期:
  1. purchases.cvs, 存储用户的购买数量和用户的购买日期。
  1. 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

结论

无关联。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

测试思考拾叶集测试万能公式自动化测试自动化测试分层自动化测试框架工具平台数据准备服务Bug

须理清“SUT的功能”,“SUT的所有输入”,“每一个输入的取值范围”,“SUT的所有输出”,“根据功能推出每一个输出的预期值”。

1044
来自专栏IT 指南者专栏

五月福利,吐血整理,重磅推荐,我坚信总有你需要的

好了,废话就讲这么多,开始进入今天的主题。鉴于大家现在的需求,这个月主要分享以下几个福利:

1836
来自专栏web前端教室

怎么样才能提高自己的代码阅读能力?

首先说,做为一个前端开发工程师,阅读别人的代码就是一项必不可少的技能。因为你新入一个公司,第一件事情,就是打开项目文件,看代码。看不懂代码,就没有办法继续开发。...

24610
来自专栏软件测试经验与教训

软件测试从零开始

3006
来自专栏CSDN技术头条

如何为微服务选择数据库

作者 | Jeff Carpenter, InfoWorld 翻译 | Jackyrong 你的微服务架构需要多种数据模型。你是应该选择混合持久化呢还是多模型数...

24110
来自专栏haifeiWu与他朋友们的专栏

浅谈程序设计

快要毕业了,这里为同学们分享一下我学习编程的过程以及我的一些关于程序设计的理解,希望会对你们今后的学习有所帮助。如果有不同的观点,欢迎评论留言~

1292
来自专栏CSDN技术头条

十一款很酷的新编程工具

开发人员平时可能不太接触新的编程工具,或者找不到比现在用的更好的,所以只能使用那些过时的。本文作者介绍了11种新的编程工具,这些工具可以通过改变编码技能、共享终...

2056
来自专栏眯眯眼猫头鹰的小树杈

猫头鹰的深夜翻译:Pattern: Service Mesh

在十几年前,我们无法想象一个分布式系统会是什么样子。它给我们带来了全新的架构思路,但同时也引入了一些问题。 当时这些系统非常少有而且架构简单,工程师们通过尽可能...

1662
来自专栏Debian社区

使用 Go 语言的三个原因

几个星期前,我一个朋友问我:“为什么要关心 Go 语言”? 因为他们知道我热衷于 Go 语言,但他们想知道为什么我认为 其他人 也应该关心。本文包含三个我认为 ...

1523
来自专栏一个会写诗的程序员的博客

服务网格 Pattern: Service Mesh

自从几十年前首次引入以来,我们了解到分布式系统能够实现我们之前甚至无法思考的用例,但它们也会引入各种新问题。

1102

扫码关注云+社区

领取腾讯云代金券