R語言實戰第一, 二章 實踐

這次的作業主要是以對一個非常簡單的數據分析問題進行實踐的形式呈現出來,對於《R語言實戰》第一二章的內容已經體現在了對問題的解析的過程中,所以就不再將學習的過程貼出來了。

題目的內容大概如下:

有三個csv文件:

users.csv, 用於存儲用戶ID和用戶的註冊日期:

purchases.cvs, 存儲用戶的購買數量和用戶的購買日期。

messages.csv, 用於存儲用戶收到的簡訊條數和收到的簡訊日期:

根據所給的數據回答以下三個問題:

1. 有多少百分比的用戶在註冊後的90天內(不包括註冊日)購買了產品?

2. 註冊後90天內購買的用戶中有多少百分比在註冊後購買前收到了簡訊通知?

3. 收到註冊90天內收到的簡訊數量與用戶90天內產品是否有關聯?

以下是三道題的解答過程和答案。

第一題

library(Rcpp)library(Amelia)library(dplyr)# 載入csv文件,去掉列名,並不需要將字元型的列轉為factorusers <- 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)# 將用戶和購買信息表合併user_purchase = merge(x=users, y=purchases, by="user.id", all.x = T)str(user_purchase)# 查看user_purchase數據量是否和users一致summary(user_purchase)# 查看user_purchase表中是否存在同一用戶多次購買的行為duplicated(user_purchase$user.id)user_purchase[user_purchase$user.id==「4e90f26215b30dde9be59d36",]# 轉換日期格式user_purchase$signup.date <- as.Date(user_purchase$signup.date, "%Y-%m-%d」)user_purchase$purchase.date <- as.Date(user_purchase$purchase.date, "%Y-%m-%d」)# 查看有多少缺失的值missmap(user_purchase, main="test」)#轉換日期格式user_purchase$signup.date <- as.Date(user_purchase$signup.date, "%Y-%m-%d」)user_purchase$purchase.date <- as.Date(user_purchase$purchase.date, "%Y-%m-%d」)# 填補空缺址:# 用一個肯定大於註冊時間90天的日期填補空缺的購買日期user_purchase$purchase.date[is.na(user_purchase$purchase.date)] <- as.Date("2019-1-1", "%Y-%m-%d")# 用中位數填補註冊時間的空缺址user_purchase$signup.date[is.na(user_purchase$signup.date)] <- median(user_purchase$signup.date, na.rm=T)# 過濾註冊九十天(不包括註冊日)內購買的用戶user_purchase_in_90 = user_purchase[(user_purchase$purchase.date - user_purchase$signup.date) <=91 & (user_purchase$purchase.date - user_purchase$signup.date) > 1, ]# 根據購買日期進行降序排序user_purchase_in_90 = user_purchase_in_90[order(user_purchase_in_90$user.id, user_purchase_in_90$purchase.date, decreasing = T), ]user_purchase_in_90 <-user_purchase_in_90[!is.na(user_purchase_in_90$user.id),]# 通過去掉重複行,過濾掉用戶多次購買的情況。user_purchase_in_90_unique = user_purchase_in_90[!duplicated(user_purchase_in_90$user.id, fromLast = T),]

# 結論

user_purchase_in_90: 18732

user_purchase_in_90_unique: 4714

users: 24049

19.601% users purchased in 90 days after sign up.

第二題

# 刪除早於最早的註冊日期的簡訊發送記錄messages$ <- messages[!(messages$message.date < as.Date("2013-04-28", "%Y-%m-%d")),]# 日期格式轉換messages$message.date <- as.Date(messages$message.date, "%Y-%m-%d」)# 按照日期和用戶聯合降序排序messages <- messages[order(messages$user.id, messages$message.date, decreasing = T), ]# 去除給同一人發送多次簡訊的行數,只保留髮送日期最早的一條記錄messages_unique <- messages[!duplicated(messages$user.id, fromLast = T), ]# 與用戶購買記錄合併user_purchase_in_90_unique_message <- merge(x=user_purchase_in_90_unique, y=messages_unique, all.x=T)# 轉換日期格式user_purchase_in_90_unique_message$message.date <- as.Date(user_purchase_in_90_unique_message$message.date, "%Y-%m-%d」)# 計算收到簡訊早於購買日期的用戶數量second_result = user_purchase_in_90_unique_message[user_purchase_in_90_unique_message$purchase.date - user_purchase_in_90_unique_message$message.date > 0, ]

# 結論

summary(second_result)

user.id signup.date purchase.date

Length:4682

99.321%

第三題

# 將註冊日間從字元串轉換為doubleuser$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)))# left join合併購買信息和短息通知信息user_message_purchase <- left_join(user_message, user_purchase_in_90_unique, by="user.id」)# 將合併後的記錄中90天內購買標準為空的標示置為0user_message_purchase$buy_in_90[is.na(user_message_purchase$buy_in_90)] <- 0# 計算簡訊通知條數和是否購買的關聯度cor(user_message_purchase$message.count.sum, user_message_purchase$buy_in_90)

# 結論,關聯性不大。

[1] 0.1128223

總結

這次學習和實踐的過程讓我更加的明白,紙上得來終覺淺,原知此事要躬行。讀書的時候覺得自己理解的還挺深入的,但是做起題來,遇到的小困難就只能求助於google和stack overflow了。就像李笑來老師說的,學不會就別學了,直接開始用吧。實踐才是最好的學習。

題圖是在google上搜索到的,卡達爾海邊思考的老人銅像,算是對《R語言實戰》封面中的「來自卡達爾的男人」的一種呼應吧。第一次用圖,不知道隨便用搜到的會不會侵權。


推薦閱讀:

數據分析:IMDB電影分析報告
聲音信號處理的筆記
產品經理如何培養數據分析能力
原來電影數據可以這麼玩 - 第一彈:賣座電影最青睞的海報色調
治療癌症的有效解藥--基因數據

TAG:數據 | R編程語言 |