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

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

题目

题目的内容大概如下:

有三个csv文件:

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


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


  3. 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

结论

无关联。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • 这是之前使用R语言完成的一道简单的数据统计题目链接:https://zhuanlan.zhihu.com/p/27...
    blackpiglet阅读 331评论 0 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,065评论 25 707
  • 《易效能时间管理100讲》听课笔记(51-60讲) 总觉得时间不够用。每天都在忙个不停,但总也完不成工作。一件事总...
    捡丹阅读 240评论 0 1
  • 时常在我一个人很安静的时候,或是漫步在江滩的芦苇荡,或是蹲坐在江水拍打的青石板,一边享受着如此静谧的漫时光,一边沉...
    笔默书生阅读 226评论 0 1
  • 博弈论,又称为对策论,主要研究: 公式化后的激励结构间的相互关系;(标准规则下,参与者之间的明争暗斗) 具有斗争或...
    火山僧阅读 4,908评论 0 2