開發技術分享:美團R語言資料運營實戰!
近年來,隨著分散式資料處理技術的不斷革新,Hive、Spark、Kylin、Impala、Presto 等工具不斷推陳出新,對大資料集合的計算和儲存成為現實,資料倉儲/商業分析部門日益成為各類企業和機構的標配。在這種背景下,是否能探索和挖掘資料價值,具備精細化資料運營的能力,就成為判定一個資料團隊成功與否的關鍵。
在資料從後臺走向前臺的過程中,資料展示是最後一步關鍵環節。與冰冷的表格展示相比,將資料轉化成圖表並進行適當的內容組織,往往能更快速、更直觀的傳遞資訊,進而更好的提供決策支援。從結構化資料到最終的展示,需要通過一系列的探索和分析過程去完成產品思路的沉澱,這個過程也伴隨著大量的資料二次處理。
上述這些場合 R 語言有著獨特的優勢。本文將基於美團到店餐飲技術部的精細化資料運營實踐,介紹 R 在資料分析與視覺化方面的工程能力,希望能夠拋磚引玉,也歡迎業界同行給我們提供更多的建議。
資料運營產品分類與 R 的優勢
資料運營產品分類
在企業資料運營過程中,考慮使用場景、產品特點、實施角色以及可利用的工具,大致可以將資料運營需求分為四類,如下表所示:
如上節所述,在精細化資料運營過程中,經常需要使用高度定製的資料處理、視覺化、分析等手段,這些過程 Excel、Tableau、企業級報表工具都無法面面俱到,而恰好是 R 的強項。一般來說,R 具備的如下特徵,讓其有了“資料分析領域的瑞士軍刀”的名號:
-
免費、開源、可擴充套件:截至到 2018-08-02,“ The CRAN package repository features 12858 available packages. ”,CRAN 上的軟體包涉及貝葉斯分析、運籌學、金融、基因分析、遺傳學等方方面面,並在持續新增和迭代。
-
可程式設計:R 本身是一門解釋型語言,可以通過程式碼控制執行過程,並能通過 rPython、rJava 等軟體包實現和 Python、Java 語言的互相呼叫。
-
強大的資料操控能力:
-
資料來源接入:通過 RMySQL、SparkR、elastic 等軟體包,可以實現從 MySQL、Spark、Elasticsearch 等外部資料引擎獲取資料。
-
資料處理:內建 vector、list、matrix、data.frame 等資料結構,並能通過 sqldf、tidyr、dplyr、reshape2 等軟體包實現對資料的二次加工。
-
資料視覺化:ggplot2、Plotly、dygraph 等視覺化包可以實現高度定製化的圖表渲染。
-
資料分析與挖掘:R 本身是一門由統計學家發起的面向統計分析的語言,通過自行程式設計實現或者第三方軟體包呼叫,可以輕鬆實現線性迴歸、方差分析、主成分分析等分析與挖掘功能。
-
初具雛形的服務框架:
-
Web 程式設計框架:例如不精通前端和系統開發的同學,通過 shiny 軟體包開發自己的資料應用。
-
服務化能力:例如通過 rserve 包,可以實現 R 和其他語言通訊的 C/S 架構服務。
對於以資料為中心的應用來說,Python 和 R 都是不錯的選擇,兩門語言在發展過程中也互有借鑑。“越接近統計研究與資料分析,越傾向 R;越接近工程開發工程環境的人,越傾向 Python”,Python 是一個全能型“運動員”,R 則更像是一個統計分析領域的“劍客”,“Python 並未建立起一個能與 CRAN 媲美的巨大的程式碼庫,R 在這方面具有絕對領先優勢。統計學並不是 Python 的核心使命”。各技術網站上有大量“Python VS R ”的討論,感興趣的讀者可以自行了解和作出選擇。
R 的資料處理、視覺化、可重複性資料分析能力
對於具備程式設計能力的分析師或者具備分析能力的開發人員來說,在進行一系列長期的資料分析工程時,使用 R 既可以滿足“一次開發,終身受用”,又可以滿足“調整靈活,圖形豐富”的要求。下文將分別介紹 R 的資料處理能力、視覺化能力和可重複性資料分析能力。
資料處理
在企業級資料系統中,資料清洗、計算和整合工作會通過資料倉儲、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 主流支援的有三套視覺化系統:
-
內建系統:包括有 base、grid 和 lattice 三個內建發行包,支援以相對比較樸素的方式完成圖形繪製。
-
ggplot2:由 RStudio 的首席科學家 Hadley Wickham 開發,ggplot2 通過一套圖形語法支援,支援通過圖層疊加以組合的方式支援高度定製的視覺化。這一理念也逐步影響了包括 Plotly、阿里 AntV 等國內外資料視覺化解決方案。截至到 2018-08-02,CRAN 已經落地了 40 個 ggplot2 擴充套件包,參考 連結 。
-
htmlwidgets for R:這一系統是在 RStudio 支援下於 2016 年開始逐步發展壯大,提供基於 JavaScript 視覺化的 R 介面。htmlwidgets for R 作為前端視覺化(for 前端工程師)和資料分析視覺化(for 資料工程師)的橋樑,發揮了兩套技術領域之間的組合優勢。截至到 2018-08-02,經過兩年多的發展,目前 CRAN 上已經有 101 個基於 htmlwidgets 開發的第三方包,參考 連結 。
實際資料運營分析過程中,可以固化常規的圖表展現和視覺化分析過程,實現程式碼複用,提高開發效率。下圖是美團到店餐飲技術部資料團隊積累的部分視覺化元件示例:
基於視覺化元件庫,一個視覺化過程只需要一行程式碼即可完成,能極大提升開發效率。上圖中最後的四象限矩陣分析示例圖的程式碼如下:
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 服務化框架
R 本身既是一門語言、也是一個跨平臺的操作環境,具備強大的資料處理、資料分析、和資料視覺化能力。除了在個人電腦的 Windows/MacOS 環境中上充當個人統計分析工具外,也可以執行在 Linux 服務環境中,因此可以將 R 作為分析展現引擎,外圍通過 Java 等系統開發語言完成快取、安全檢查、許可權控制等功能,開發企業報表系統或資料分析(挖掘)框架,而不僅僅只是將 R 作為一個桌面軟體。
企業報表系統或資料分析(挖掘)框架設計方案如下圖所示:
foreach + doParallel 多核並行方案
作為一門統計學家開發的解釋性語言,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 的資料分析報告渲染方案,其效能測試結果如下:
系統環境
-
4 核 CPU,8 G 記憶體,2.20GHz 主頻
-
Linux version 3.10.0-123.el7.x86_64
測試方法
-
測試在不同併發度下、不同複雜度的渲染模式下,重複渲染 100 次的耗時。
測試結果
-
單應用平均渲染時長在 0.74s 以上,具體的渲染時長視計算複雜度而定(可以通過上節介紹的“foreach + doParallel 多核並行方案 ”加快處理過程)。根據經驗,大部分應用能在秒級完成渲染。
-
由於單核單執行緒模式所限,當併發請求超過 CPU 核數時,渲染吞吐量並不會相應提升。需要根據實際業務場景匹配對應的服務端機器配置,並在請求轉發時設定併發執行上限。對於內部運營性質的資料系統,單臺 4 核 8 G 機器基本能滿足要求。
R 在美團資料產品中的落地實踐
美團到店餐飲資料團隊從 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 的發展。
【本文轉載自美團技術團隊微信公眾號,原文連結:https://mp.weixin.qq.com/s/83494v_5XDPlyNIccMINtQ】
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31077337/viewspace-2187229/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- R語言實戰(1) 資料集的建立R語言
- R語言批量建立資料框R語言
- R語言資料質量分析R語言
- GO 語言 Web 開發實戰一GoWeb
- R語言實戰試卷 第二章R語言
- mpvue實戰開發美團外賣小程式Vue
- 實戰區塊鏈技術培訓之Go語言區塊鏈Go
- R語言連線資料庫(MySQL)R語言資料庫MySql
- R語言入門與資料分析R語言
- 技術架構分享:美團配送系統架構演進實踐架構
- Windows配置R語言、RStudio開發環境WindowsR語言開發環境
- Jenkins技術概述與開發實戰Jenkins
- Python自然語言處理實戰(3):中文分詞技術Python自然語言處理中文分詞
- Java技術分享:NIO實戰教程!Java
- 雲端計算開發技術Python自動化運維開發實戰二Python運維
- R語言學習-高階資料管理R語言
- Dapr + .NET Core實戰(十三)跨語言開發
- 美團智慧客服核心技術與實踐
- 佛薩奇2.0(Forsage)系統開發技術丨python技術語言Python
- 開源資料庫大會技術分享資料庫
- 【R語言入門】R語言中的變數與基本資料型別R語言變數資料型別
- 技術團隊運用度量驅動開發提升質量:策略與實踐
- r語言R語言
- Go語言專案實戰:基於開源資料的成語查詢Go
- 美團點評資料平臺Kerberos優化實戰ROS優化
- 實驗一 c語言開發環境使用和資料型別、運算子、表示式C語言開發環境資料型別
- 實驗1 C語言開發環境使用和資料型別,運算子,表示式C語言開發環境資料型別
- 實驗一 C語言開發環境使用和資料型別,運算子,表示式C語言開發環境資料型別
- 實驗1 C語言開發環境使用和資料型別、運算子、表示式C語言開發環境資料型別
- 市商LP算力挖礦/系統技術開發/市商開發python技術語言Python
- 分析服務實時概覽資料助力開發者資料運營
- 索拉迪(SolaRoad)系統開發技術/Solidity語言Solid
- SWP智慧合約語言系統技術開發搭建
- 《R語言入門與資料分析》——向量索引R語言索引
- R語言批量提取excel當中的資料R語言Excel
- 【R語言入門】R語言環境搭建R語言
- Java技術分享之函數語言程式設計!Java函數程式設計
- Java技術分享之函數語言程式設計Java函數程式設計