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

结论

无关联。

目录
相关文章
|
7天前
|
数据采集 数据可视化 数据挖掘
《Python 语音转换简易速速上手小册》第2章 Python 编程基础(2024 最新版)(上)
《Python 语音转换简易速速上手小册》第2章 Python 编程基础(2024 最新版)
27 0
|
7天前
|
机器学习/深度学习 IDE 开发工具
《Python 语音转换简易速速上手小册》第2章 Python 编程基础(2024 最新版)(下)
《Python 语音转换简易速速上手小册》第2章 Python 编程基础(2024 最新版)
23 1
|
8天前
|
存储 索引 Python
《Python 简易速速上手小册》第2章:Python 基础语法和概念(2024 最新版)
《Python 简易速速上手小册》第2章:Python 基础语法和概念(2024 最新版)
19 0
|
8天前
|
安全 数据处理 开发者
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
19 1
|
8月前
|
数据可视化 数据挖掘 项目管理
R 语言入门与介绍
R 语言入门与介绍
58 0
|
8月前
|
Python
|
10月前
|
机器学习/深度学习 人工智能 数据挖掘
一文了解Python编程语言及安装
一文了解Python编程语言及安装
151 0
|
存储 前端开发 JavaScript
【零基础学Python】后端开发篇第二十节--Python Web开发一:Web开发简介
【零基础学Python】后端开发篇第二十节--Python Web开发一:Web开发简介
631 0
|
算法 Unix 程序员
轻轻松松学会Python入门二:Python语言概述和环境配置
Python是初学者的语言:Python对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到WWW浏览器,再到游戏。
113 0
轻轻松松学会Python入门二:Python语言概述和环境配置
|
Java 编译器 Go
Go Web编程实战(5)----面向对象编程(一)
Go Web编程实战(5)----面向对象编程(一)
123 0