近年來,隨着分佈式數據處理技術的不斷革新,Hive、Spark、Kylin、Impala、Presto 等工具不斷推陳出新,對大數據集合的計算和存儲成爲現實,數據倉庫/商業分析部門日益成爲各種企業和機構的標配。在這種背景下,是否能探索和挖掘數據價值,具有精細化數據運營的能力,就成爲斷定一個數據團隊成功與否的關鍵。html
在數據從後臺走向前臺的過程當中,數據展現是最後一步關鍵環節。與冰冷的表格展現相比,將數據轉化成圖表並進行適當的內容組織,每每能更快速、更直觀的傳遞信息,進而更好的提供決策支持。從結構化數據到最終的展現,須要經過一系列的探索和分析過程去完成產品思路的沉澱,這個過程也伴隨着大量的數據二次處理。前端
上述這些場合 R 語言有着獨特的優點。本文將基於美團到店餐飲技術部的精細化數據運營實踐,介紹 R 在數據分析與可視化方面的工程能力,但願可以拋磚引玉,也歡迎業界同行給咱們提供更多的建議。sql
在企業數據運營過程當中,考慮使用場景、產品特色、實施角色以及可利用的工具,大體能夠將數據運營需求分爲四類,以下表所示:編程
產品 | 應用場景 | 產品特色 | 實施角色 | 工具 |
---|---|---|---|---|
分析報告 | 對模式不固定的數據進行探索、組織與解釋,造成一次性數據分析報告並提供決策支持 | 基於人對數據的解讀;需求發散 | 數據分析師、數據工程師 | Excel、SQL、R、Tableau 等 |
報表型產品 | 經過拖拽式或簡單代碼方式進行開發,對模式固定的數據組裝和報表展示 | 開發效率高,開發門檻低;報表表達能力差 | 數據分析師 | 報表工具 |
定製式分析型產品 | 對固定模式的數據和分析方法,造成可重複式的數據分析產品並提供決策支持 | 開發效率較高,支持對數據的深度應用,開發過程可複用、可擴展,對有必定編程能力的開發者開發門檻較低;產品交互能力較弱 | 數據分析師、數據工程師 | Python、R、Tableau 等 |
定製式展現型產品 | 對固定模式的數據進行產品的高度定製,經過強化交互和用戶體驗,知足個性化的數據展現需求 | 展示樣式豐富、交互能力強;僅適合有前端能力的開發者,開發效率較低,數據二次處理能力較差 | 前端工程師 | ECharts、Highcharts 等 |
如上節所述,在精細化數據運營過程當中,常常須要使用高度定製的數據處理、可視化、分析等手段,這些過程 Excel、Tableau、企業級報表工具都沒法面面俱到,而剛好是 R 的強項。通常來講,R 具有的以下特徵,讓其有了「數據分析領域的瑞士軍刀」的名號:緩存
對於以數據爲中心的應用來講,Python 和 R 都是不錯的選擇,兩門語言在發展過程當中也互有借鑑。「越接近統計研究與數據分析,越傾向 R;越接近工程開發工程環境的人,越傾向 Python」,Python 是一個全能型「運動員」,R 則更像是一個統計分析領域的「劍客」,「Python 並未創建起一個能與 CRAN 媲美的巨大的代碼庫,R 在這方面具備絕對領先優點。統計學並非 Python 的核心使命」。各技術網站上有大量「Python VS R 」的討論,感興趣的讀者能夠自行了解和做出選擇。安全
對於具有編程能力的分析師或者具有分析能力的開發人員來講,在進行一系列長期的數據分析工程時,使用 R 既能夠知足「一次開發,終身受用」,又能夠知足「調整靈活,圖形豐富」的要求。下文將分別介紹 R 的數據處理能力、可視化能力和可重複性數據分析能力。markdown
在企業級數據系統中,數據清洗、計算和整合工做會經過數據倉庫、Hive、Spark、Kylin 等工具完成。對於數據運營項目,雖然 R 操做的是結果數據集,但也不能避免須要在查詢層進行二次數據處理。前端工程師
在數據查詢層,R 生態現成就存在衆多的組件支持,例如能夠經過 RMySQL 包進行 MySQL 庫表的查詢,可使用 Elastic 包對 Elasticsearch 索引文檔進行搜索。對於 Kylin 等新技術,在 R 生態的組件支持沒有跟上時,能夠經過使用 Python、Java 等系統語言進行查詢接口封裝,在 R 內部使用 rPython、rJava 組件進行第三方查詢接口調用。經過查詢組件獲取的數據通常以 data.frame、list 等類型對象存在。數據結構
另外 R 自己也擁有比較完備的二次數據處理能力。例如能夠經過 sqldf 使用 sql 對 data.frame 對象進行數據處理,可使用 reshape2 進行寬格式和窄格式的轉化,可使用 stringr 完成各類字符串處理,其餘如排序、分組處理、缺失值填充等功能,也都具有完善的語言自己和生態的支持。架構
數據可視化是數據探索過程和結果呈現的關鍵環節,而 「R is a free software environment for statistical computing and graphics. 」,繪圖(可視化)系統也是 R 的最大優點之一。
目前 R 主流支持的有三套可視化系統:
實際數據運營分析過程當中,能夠固化常規的圖表展示和可視化分析過程,實現代碼複用,提升開發效率。下圖是美團到店餐飲技術部數據團隊積累的部分可視化組件示例:
基於可視化組件庫,一個可視化過程只須要一行代碼便可完成,能極大提高開發效率。上圖中最後的四象限矩陣分析示例圖的代碼以下:
vis_4quadrant(iris, 'Sepal.Length', 'Petal.Length', label = 'Species', tooltip = 'tooltip', title = '', xtitle = '萼片長度', ytitle = '花瓣長度', pointSize = 1, annotationSize = 1)
複製代碼
茲再附四象限矩陣分析可視化組件的函數聲明:
vis_4quadrant <- function(df, x, y,
label = '', tooltip = '', title = '', xtitle = '', ytitle = '',
showLegend = T, jitter = T, centerType = 'mean',
pointShape = 19, pointSize = 5, pointColors = collocatcolors2,
lineSize = 0.4, lineType = 'dashed', lineColor = 'black',
annotationFace = 'sans serif', annotationSize = 5, annotationColor = 'black', annotationDeviationRatio = 15,
gridAnnotationFace = 'sans serif', gridAnnotationSize = 6, gridAnnotationColor = 'black', gridAnnotationAlpha = 0.6,
titleFace = 'sans serif', titleSize = 12, titleColor = 'black',
xyTitleFace = 'sans serif', xyTitleSize = 8, xyTitleColor = 'black',
gridDesc = c('A 區', 'B 區', 'C 區', 'D 區'), dataMissingInfo = '數據不完整', renderType = 'widget') {
# 繪製分組散點圖
#
# Args:
# df: 數據框;必要字段;須要進行圖形繪製的數據,至少應該有三列
# x: 字符串;必要字段;映射到 X 軸的列名,對應 df 的某一列,此列必須是數值類型或日期類型
# y: 字符串;必要字段;映射到 Y 軸的列名,對應 df 的某一列
# label: 字符串;映射到點上的文字註釋
# tooltip: 字符串;映射到點上的懸浮信息
# title: 字符串;標題
# xtitle: 字符串;X 軸標題
# ytitle: 字符串;Y 軸標題
# showLegend: bool;定義分區圖例是否展現
# jitter: bool;定義是否擾動
# centerType: 字符串;定義中心點類型,mean 表明平均值,median 表明中位數
# pointShape: 整形;定義點型
# pointSize: 數值;定義點大小
# lineSize: 數值;定義線寬
# lineType: 字符串;定義線型
# lineColor: 字符串;定義線色
# annotationFace: 字符串;定義註釋字體
# annotationSize: 數值;定義註釋字體大小
# annotationColor: 字符串;定義註釋字體顏色
# annotationDeviationRatio: 數值;定義註釋文本向上偏移係數
# gridAnnotationFace: 字符串;定義網格註釋字體
# gridAnnotationSize: 數值;定義網格註釋字體大小
# gridAnnotationColor: 字符串;定義網格註釋字體顏色
# gridAnnotationAlpha: 數值;定義網格註釋文本透明度
# titleFace: 字符串;定義標題字體
# titleSize: 數值;定義標題字體大小
# titleColor: 字符串;定義標題字體顏色
# xyTitleFace: 字符串;定義 X、Y 軸標題字體
# xyTitleSize: 數值;定義 X、Y 軸標題字體大小
# xyTitleColor: 字符串;定義 X、Y 軸標題字體顏色
# gridDesc: 長度爲 4 的字符串向量
# dataMissingInfo: 字符串;數據問題提示文本
# renderType: 字符串;定義渲染結果類型,widget 對應 htmlwidget 組件,html 對應 html 內容
# 代碼實現略
}
複製代碼
數據運營分析每每是一個重複性的、重人工參與的過程,最終會落地一套數據分析框架,這套數據分析框架適配具體的數據,用於支持企業數據決策。
RStudio 經過 rmarkdown + knitr 的方式提供了一套基於文學編程的數據分析報告產出方案,開發者能夠將 R 代碼嵌入 Markdown 文檔中執行並獲得渲染結果(渲染結果能夠是 HTML、PDF、Word 文檔格式),實際數據分析過程當中,開發者最終能造成一套數據分析模版,每次適配不一樣的數據,就能產出一份新的數據分析報告。
rmarkdown 自己具有簡單的頁面佈局能力並可使用 flexdashboard 進行擴展,所以這套方案不只能實現重複性分析過程,還能實現分析結果的高度定製化展現,可使用 HTML、CSS、JavaScript 前端三大件對數據分析報告進行展現和交互的細節調整。最終實現人力的節省和數據分析結果的快速、高效產出。
R 自己既是一門語言、也是一個跨平臺的操做環境,具有強大的數據處理、數據分析、和數據可視化能力。除了在我的電腦的 Windows/MacOS 環境中上充當我的統計分析工具外,也能夠運行在 Linux 服務環境中,所以能夠將 R 做爲分析展示引擎,外圍經過 Java 等系統開發語言完成緩存、安全檢查、權限控制等功能,開發企業報表系統或數據分析(挖掘)框架,而不只僅只是將 R 做爲一個桌面軟件。
企業報表系統或數據分析(挖掘)框架設計方案以下圖所示:
做爲一門統計學家開發的解釋性語言,R 運行的是 CPU 單核上的單線程程序、而且須要將所有數據加載到內存進行處理,所以和 Java、Python 等系統語言相比,計算性能是 R 的軟肋。對於大數據集合的計算場景,須要儘可能將數據計算部分經過 Hive、Kylin 等分佈式計算引擎完成,儘可能讓 R 只處理結果數據集;另外也能夠經過 doParallel + foreach 方案,經過多核並行提高計算效率,代碼示例以下:
library(doParallel)
library(foreach)
registerDoParallel(cores = detectCores())
vis_process1 <- function() {
# 可視化過程1 ...
}
vis_process2 <- function() {
# 可視化過程2 ...
}
data_process1 <- function() {
# 數據處理過程1 ...
}
data_process2 <- function() {
# 數據處理過程2 ...
}
processes <- c('vis_process1', 'vis_process2', 'data_process1', 'data_process2')
process_res <- foreach(i = 1:length(process), .packages = c('magrittr')) %dopar% {
do.call(processes[i], list())
}
vis_process1_res <- process_res[[1]]
vis_process2_res <- process_res[[2]]
data_process1_res <- process_res[[3]]
data_process2_res <- process_res[[4]]
複製代碼
在數據分析過程當中,R 最重要的是充當圖形引擎的角色,所以有必要了解其圖形渲染性能。針對主流的基於 rmarkdown + flexdashboard 的數據分析報告渲染方案,其性能測試結果以下:
系統環境:
測試方法:
測試結果:
渲染模式 | 併發度 1 | 併發度 2 | 併發度 3 | 併發度 4 | 併發度 5 | 併發度 6 |
---|---|---|---|---|---|---|
rmarkdown + flexdashboard | 1m14.087s | 0m39.192s | 0m28.299s | 0m20.795s | 0m21.471s | 0m19.755s |
rmarkdown + flexdashboard + dygraphs | 1m48.771s | 0m52.716s | 0m39.051s | 0m27.012s | 0m30.224s | 0m28.948s |
rmarkdown + flexdashboard + ggplot2 | 2m6.840s | 1m1.529s | 0m42.351s | 0m31.596s | 0m35.546s | 0m34.992s |
rmarkdown + flexdashboard + ggplot2 + dygraph | 2m30.586s | 1m16.696s | 0m51.277s | 0m40.651s | 0m41.406s | 0m41.288s |
根據測試結果可知:
美團到店餐飲數據團隊從 2015 年開始逐步將 R 做爲數據產品的輔助開發語言,截至 2018 年 8 月,已經成功應用在面向管理層的日周月數據報告、面向數據倉庫治理的分析工具、面向內部運營與分析師的數據 Dashboard、面向大客戶銷售的品牌商家數據分析系統等多個項目中。目前全部的面向部門內部的定製式分析型產品,都首選使用 R 進行開發。
另外咱們也在逐步沉澱 R 可視化與分析組件、開發基於 R 引擎的配置化 BI 產品開發框架,以期進一步下降 R 的使用門檻、提高 R 的普及範圍。
下圖是美團到店餐飲數據團隊在數據治理過程當中,使用 R 開發的 ETL 間依賴關係可視化工具:
綜上所述,R 能夠在企業數據運營實踐中扮演關鍵技術槓桿,但做爲一門面向統計分析的領域語言,在很長一段時間,R 的發展主要由統計學家驅動。隨着近年的數據爆發式增加與應用浪潮,R 獲得愈來愈多工業界的支持,譬如微軟收購基於 R 的企業級數據解決方案提供商 Revolution Analytics、在 SQL Server 2016 集成 R、並從 Visual Studio 2015 開始正式經過 RTVS 集成了 R 開發環境,一系列事件標誌着微軟在數據分析領域對 R 的高度重視。
在國內,由統計之都發起的中國 R 會議,從 2008 年起已舉辦了 11 屆,推進了 R 用戶在國內的發展壯大。截至 2018 年 8 月,美團的 R 開發者大體在 200 人左右。但相比 Java/Python 等系統語言,R 的用戶和應用面仍相對狹窄。
做者撰寫本文的目的,也是但願給從事數據相關工做的同窗們一個新的、更具優點的可選項。
喻燦,美團到店餐飲技術部數據系統與數據產品團隊負責人,2015 年加入美團,長期從事數據平臺、數據倉庫、數據應用方面的開發工做。從 2013 年開始接觸 R,在利用 R 快速知足業務需求和節省研發成本上,有一些心得和產出。同時也在美團研發和商業分析團隊中積極推進 R 的發展。
對數據工程和將數據經過服務業務釋放價值感興趣的同窗,能夠發送簡歷到 yucan@meituan.com。咱們在數據倉庫、數據治理、數據產品開發框架、數據可視化、面向銷售和商家側的數據型創新產品層面,都有不少未知但有意義的領域等你來開拓。