R 語言實(shí)戰(zhàn)第一,二章 R 語言版

這次的作業(yè)主要是以對一個(gè)非常簡單的數(shù)據(jù)分析問題進(jìn)行實(shí)踐的形式呈現(xiàn)出來,對于《R語言實(shí)戰(zhàn)》第一二章的內(nèi)容已經(jīng)體現(xiàn)在了對問題的解析的過程中,所以就不再將學(xué)習(xí)的過程貼出來了。

題目

題目的內(nèi)容大概如下:

有三個(gè)csv文件:

  1. users.csv, 用于存儲用戶ID和用戶的注冊日期:


  2. purchases.cvs, 存儲用戶的購買數(shù)量和用戶的購買日期。


  3. messages.csv, 用于存儲用戶收到的短信條數(shù)和收到的短信日期:


根據(jù)所給的數(shù)據(jù)回答以下三個(gè)問題:

  • 有多少百分比的用戶在注冊后的90天內(nèi)(不包括注冊日)購買了產(chǎn)品?
  • 注冊后90天內(nèi)購買的用戶中有多少百分比在注冊后購買前收到了短信通知?
  • 收到注冊90天內(nèi)收到的短信數(shù)量與用戶90天內(nèi)產(chǎn)品是否有關(guān)聯(lián)?

答案

第一題

加載必要的庫

library(Rcpp)
library(Amelia)
library(dplyr)

載入csv文件,去掉列名,并不需要將字符型的列轉(zhuǎn)為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("”))

查看載入的數(shù)據(jù)結(jié)構(gòu)

str(users)
str(messages)
str(purchases)

查看數(shù)據(jù)總量

summary(users)
summary(messages)
summary(purchases)

直觀的查看一下是否有缺失值,有208個(gè)注冊日期為空的記錄

missmap(users, main="user miss map")

去掉注冊日期為空的用戶,剩下的為已經(jīng)注冊的用戶

users_signup <- na.omit(users)

統(tǒng)計(jì)有多少注冊日期為空的行

sum(is.na(users$signup.date))

日期格式轉(zhuǎn)換

users_signup$signup.date <- as.Date(users_signup$signup.date)

載入購買數(shù)據(jù)

purchases = read.csv("~/Desktop/purchases.csv", stringsAsFactors = F, header = T)

查看是否有缺失值 (無缺失值)

missmap(purchases)

轉(zhuǎn)換日期格式

purchases$purchase.date <- as.Date(purchases$purchase.date)

過濾掉最早注冊日之前的購買

purchases <- purchases[(purchases$purchase.date >= as.Date("2013-04-28", "%Y-%m-%d")), ]

合并注冊用戶和購買數(shù)據(jù)的信息

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), ]

讀取短信信息,并轉(zhuǎn)換短信數(shù)據(jù)框中的日期類型。

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")),]

合并九十天內(nèi)購買用戶信息和短信通知信息,并填補(bǔ)空缺數(shù)據(jù),造成空缺的原因是有2個(gè)九十天內(nèi)購買的用戶從來都沒有收到過短信。

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

過濾出在注冊后收到短信并且在第一次購買前收到短信的用戶,并去除重復(fù)。

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), ]

結(jié)論

共23841名用戶注冊,6369名用戶在注冊90天內(nèi)購買,占比26.71%,這6369名用戶中有2871名用戶在第一次購買前收到了短信。

第二題

載入dplyr庫,通過獲取全部注冊用戶和九十天內(nèi)購買用戶的差集,拿到九天內(nèi)未購買用戶的數(shù)據(jù)。

require(dplyr)
not_in_90 <- anti_join(users_signup, in_90)

合并九十天內(nèi)的用戶信息和短信信息,并轉(zhuǎn)換日期格式,處理空缺值。

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

查詢注冊后,且注冊九十天內(nèi)收到短信的用戶數(shù)量。

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))

結(jié)論

17472個(gè)用戶在注冊后的90天內(nèi)(不包括注冊當(dāng)日)沒有發(fā)生購買行為。在這些17472個(gè)用戶中, 有93.996% (16423)人在注冊后的90天內(nèi)(不包括注冊當(dāng)日)收到了短信。

第三題

將注冊日間從字符串轉(zhuǎn)換為double

user$signup.date <- as.Date(user$signup.date)

合并用戶和短信通知記錄

user_message <- merge(x=users, y=messages, all.y=T)

只保留注冊九十天內(nèi)的短信通知記錄

user_message <- filter(user_message, (user_message$message.date - user_message$signup.date) <91 & (user_message$message.date - user_message$signup.date) > 1 )

將所有短信通知記錄的短信條數(shù)求和

user_message <- ddply(user_message, 'user.id', function(x) data.frame(message.count.sum = sum(x$message.count)))

新增一個(gè)90到180天間購買的標(biāo)示

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

按照新增標(biāo)識和用戶ID降序排序,來保證下一步獲取每個(gè)用戶ID的唯一記錄時(shí),可以將90·180天內(nèi)購買的標(biāo)識為1的記錄保留下來

user_purchase <- user_purchase[order(user_purchase$user.id, user_purchase$buy_in_180, decreasing = F), ]

獲取每個(gè)用戶ID的唯一記錄

user_purchase_unique <- user_purchase[!duplicated(user_purchase$user.id, fromLast = T), ]

將短信數(shù)量信息和購買信息合并

user_purchase_unique_message <- merge(x=user_purchase_unique, y=user_message, all.x=T)

填補(bǔ)空缺的短信數(shù)量記錄

user_purchase_unique_message$message.count.sum[is.na(user_purchase_unique_message$message.count.sum)] <- 0

計(jì)算90天內(nèi)收到短信數(shù)量和90到180天間購買的關(guān)聯(lián)度。

cor(user_purchase_unique_message$buy_in_180, user_purchase_unique_message$message.count.sum)
 
[1] -0.008017904

結(jié)論

無關(guān)聯(lián)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 這是之前使用R語言完成的一道簡單的數(shù)據(jù)統(tǒng)計(jì)題目鏈接:https://zhuanlan.zhihu.com/p/27...
    blackpiglet閱讀 353評論 0 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,337評論 25 708
  • 《易效能時(shí)間管理100講》聽課筆記(51-60講) 總覺得時(shí)間不夠用。每天都在忙個(gè)不停,但總也完不成工作。一件事總...
    撿丹閱讀 251評論 0 1
  • 時(shí)常在我一個(gè)人很安靜的時(shí)候,或是漫步在江灘的蘆葦蕩,或是蹲坐在江水拍打的青石板,一邊享受著如此靜謐的漫時(shí)光,一邊沉...
    筆默書生閱讀 261評論 0 1
  • 博弈論,又稱為對策論,主要研究: 公式化后的激勵(lì)結(jié)構(gòu)間的相互關(guān)系;(標(biāo)準(zhǔn)規(guī)則下,參與者之間的明爭暗斗) 具有斗爭或...
    火山僧閱讀 5,275評論 0 2