標籤:

數據分析利器之dplyr、ggplot2包

前言

正如前文提到的,數據分析有一半以上的時間會花在對原始數據的整理及變換上,包括選取特定的分析變數、匯總並篩選滿足條件的數據、排序、加工處理原始變數並生成新的變數、以及分組匯總數據等等。這一點,我想大部分使用EXCEL的童鞋都深有體會,寫論文時,這麼多的數據進行處理,手動匯總、篩選、變換,工作量實在是太大。

而本文介紹的dplyr包簡直就是Hadley Wickham (ggplot2包的作者,被稱作「一個改變R的人」)大神為我們提供的「數據再加工」神器啊。

正文

本文試圖通過一個案例,對神奇的dplyr包的一些常用功能做簡要介紹。在此拋磚引玉,歡迎廣大盆友拍磚。先放上實踐課的一個問題:航行距離與到達延誤時間有什麼關係??帶著這個問題,我們將首先使用dplyr包對給出的航班數據進行處理。

1.dplyr包的安裝載入與示例數據準備

1.1 安裝dplyr包

腳本輸入代碼:

install.packages("dplyr") #載入dplyr包

library(dplyr)

1.2 安裝 nycflights13包,該軟體包中的飛機航班數據將用於本文中dplyr包相關函數的演示。

腳本輸入代碼:

install.packages("nyclights13") #載入nyclights13

library(nyclights13)

flights #查看數據表

dim(flights) #查看變數的維數

輸出結果如下:

如圖可知,nycflights13是一個data.frame類型的對象,包含336776條數據記錄、19個變數。

在處理數據之前,讓我們再來回顧一下數據處理的一般步驟:

  • 選擇子集

  • 列名重命名

  • 刪除缺失數據

  • 處理日期

  • 數據類型轉換

  • 數據排序

接下來,就可以進行數據處理了:

2.數據處理

2.1 選擇子集

所謂選擇子集,就是選擇出能夠實現分析目標的變數,本次數據分析的目標是得出航行距離與延誤時間的關係,因此,相應的子集就是以下幾個欄位:

  • year 航班日期-年

  • month 航班日期-月

  • day 航班日期-月

  • dep_delay 起飛延遲時間(分)

  • arr_delay 到達延遲時間(分)

  • distance 航行里程(英里)

  • dest 目的地

為此,我們首先使用dpylr包里的select函數,進行變數篩選:

腳本輸入代碼:

myFlights <- select(flights, year,month, day,dep_delay,arr_delay,distance,dest) #篩選變數列

myFlights #查看數據表

如圖,子集選擇完畢。

2.2 列名重命名

為了讓列名簡單易懂,可以使用rename函數,進行列名重命名。

腳本輸入代碼:

myFlights <- rename(myFlights, destination = dest)

myFlights

重命名完畢。

2.3 刪除缺失數據

我們採用dplyr包中的filter()函數,進行缺失數據的刪除。腳本輸入代碼:

myFlights <- filter(myFlights,!is.na(dep_delay),!is.na(arr_delay))

myFlights

由圖可知,我們首先採用is.na()函數找出缺失值,再採用邏輯運算符「!X」將限定有效數據,最後用filter()函數「過濾」得到有效數據,成功地刪除了缺失數據(由原先的336,776個數據變為327,346個數據)。

2.4 數據排序

為了數據的整齊性,我們可以選擇相應的變數進行排序。這裡要穿插一個排序函數arrange(),默認情況下,為升序排列,也可以對列名加desc()進行降序排序。腳本輸入代碼:

myFlights <- arrange(myFlights, desc(arr_delay))

myFlights

如圖所示,數據按照變數arr_delay(到達延遲時間(分))進行降序排列。

3.數據計算

數據處理之後,就進入計算分析步驟啦。在這個環節,主要歷經三個過程:

  • 數據分組(Split):可以指定目標變數,將數據進行分組。由於本次分析的目標是找出航行距離與到達延誤時間的關係,所以我們得根據到達目的地對數據進行分組,從而計算出不同目的地的平行航行距離以及平均延誤時間;

  • 應用函數(Apply):對不同組的數據,應用相應函數獲取所需統計指標。比如本次不同目的地的平行航行距離以及平均延誤時間;

  • 組合結果(Combine):將計算後的統計指標值與第一步當中對應的分組進行組合。

3.1 數據分組

dplyr包里的分組是由group_by()函數實現的,腳本輸入代碼:

by_dest <- group_by(myFlights, destination)

class(by_dest)

by_dest

由圖可知,經分組後,一共有104組數據,即本次分析的目的地有104個。

3.2 應用函數及組合結果

我們使用dplyr包中的summarize()函數,進行數據統計指標的獲取及組合。計算出不同目的地的平行航行距離以及平均延誤時間。腳本輸入代碼:

delay_sum <- summarise(by_dest, count = n(),#統計各分組目的地的航班數

dist = mean(distance, na.rm = TRUE),

delay = mean(arr_delay, na.rm = TRUE))

delay_sum <- arrange(delay_sum, desc(count)) #按照航班數降序排列

delay_sum

從上圖可得知104個目的地的航班數排序。為了統計的科學合理性,需要對數據量太少的組別進行剔除,即剔除噪音數據,再次使用filter()函數剔除,剔除限度設為count>20。腳本輸入代碼:

delay_sum <- arrange(delay_sum, desc(count))

delay_sum <- filter(delay_sum , count > 20)

如上圖可知,剩餘97組數據,即本次參與統計的目的地有97個。

PS.這裡穿插一個好用的工具,「管道」,即通過使用操作符把數據集名作為開頭, 然後依次對此數據進行多步操作。這種運算符的編寫方式使得編程者可以按數據處理時的思路寫代碼, 一步一步操作不斷疊加,在程序上就可以非常清晰的體現數據處理的步驟與背後的邏輯。

通過管道的連接方式,讓數據或表達式的傳遞更高效,使用向右操作符%>%,可以直接把數據傳遞給下一個函數調用或表達式。(%>%是最常用的一個操作符,就是把左側準備的數據或表達式,傳遞給右側的函數調用或表達式進行運行,可以連續操作就像一個鏈條一樣。)拿上述的代碼進行舉例,在沒用管道之前,代碼是這樣的:

by_dest <- group_by(myFlights, destination)#按目的地分組

delay_sum <- summarise(by_dest, count = n(),#統計各分組目的地的航班數

dist = mean(distance, na.rm = TRUE),#計算平均航行距離

delay = mean(arr_delay, na.rm = TRUE))#計算平均延誤時間

delay_sum <- arrange(delay_sum, desc(count)) #按照航班數降序排列

delay_sum <- filter(delay_sum , count > 20)#剔除噪音數據

delay_sum#顯示列表

用了管道「%>%」,代碼是這樣的:

delay_sum <- myFlights %>% #將右側航行數據賦值給左側delay_sum

group_by(destination) %>% #對delay_sum進行分組

summarise( count = n(),

dist = mean(distance, na.rm = TRUE),

delay = mean(arr_delay, na.rm = TRUE)

) %>% #對分組後的delay_sum進行計算統計

filter(count > 20)#對統計結果進行噪音剔除

delay_sum#顯示列表

果然簡潔了很多!

4.數據顯示

所謂一圖勝千言啊,在大數據可視化普及的今天更是這樣。本次同樣使用Hadley Wickham 大神(ggplot2包的作者)貢獻的ggplot2包進行繪圖。調用ggplot()函數進行繪圖,ggplot()函數的調用模式如下圖所示:

腳本輸入代碼:

ggplot(data = delay_sum) +

geom_point(mapping = aes(x = dist, y = delay)) +#繪製平均航程(dist)和平均延誤時間(delay)的散點圖

geom_smooth(mapping = aes(x = dist, y = delay))#擬合一條平滑曲線(注意,連接符號+不可省略)

所得結果如下所示:

由上圖,我們就可以初步分析航程和延誤時間並非線性關係,至於這種非線性關係該怎麼解釋,仍需進一步統計調查分析。


推薦閱讀:

Learn R | 字元串處理之stringr包(上)
【譯文】用R語言做網頁爬蟲和文本分析-Part2
R 學習筆記: Par 函數
【R語言基礎】02. 基本數據結構
翻譯:用R語言進行數據清洗

TAG:R编程语言 |