大數據分析-快速指南(上)

小楊談技術 發佈 2020-06-25T07:27:00+00:00

# the left outer join, sometimes just called left join will return the。# Only the rows that match c1 in both A and B are returned。

目錄:

大數據分析教程

  • 大數據分析-概述
  • 大數據分析-數據生命周期
  • 大數據分析-方法論
  • 核心成果
  • 主要利益相關者
  • 大數據分析-數據分析師
  • 大數據分析-數據科學家

大數據分析項目

  • 數據分析-問題定義
  • 大數據分析-數據收集
  • 大數據分析-清理數據
  • 大數據分析-總結
  • 大數據分析-數據探索
  • 數據可視化

大數據分析方法

  • 大數據分析-R簡介
  • 數據分析-SQL簡介
  • 大數據分析-圖表
  • 大數據分析-數據工具
  • 數據分析-統計方法

進階方法

  • 機器學習進行數據分析
  • 樸素貝葉斯分類器
  • K均值聚類
  • 關聯規則
  • 大數據分析-決策樹
  • 邏輯回歸
  • 大數據分析-時間序列
  • 大數據分析-文本分析
  • 大數據分析-在線學習


(注:大數據分析-快速指南(上) 截至 數據可視化。)

大數據分析-概述

在過去的十年中,必須處理的數據量激增至不可思議的水平,與此同時,數據存儲的價格已系統地降低了。私人公司和研究機構從其手機,汽車等設備中捕獲有關其用戶交互,業務,社交媒體以及傳感器的TB級數據。這個時代的挑戰師要理解這片海量的數據。這是大數據分析應運而生的地方。

大數據分析主要涉及從不同來源收集數據,對數據進行整理以使其可供分析師使用,最後提供對組織業務有用的數據產品。


從不同來源檢索到的大量非結構化原始數據轉換為對組織有用的數據產品的過程,構成了大數據分析的核心。

大數據分析-數據生命周期

傳統數據挖掘生命周期

為了提供一個框架來組織組織所需的工作並從大數據中獲得清晰的見解,將其視為具有不同階段的循環是很有用的。它絕不是線性的,意味著所有階段都是相互關聯的。此循環與CRISP方法中描述的更傳統的數據挖掘循環有表面上的相似之處。

CRISP-DM方法論

代表跨行業數據挖掘標準流程的CRISP-DM方法論描述了數據挖掘專家用來解決傳統BI數據挖掘問題的常用方法。傳統的BI數據挖掘團隊仍在使用它。

看一下下圖。它顯示了CRISP-DM方法所描述的周期的主要階段以及它們之間的相互關係。



CRISP-DM於1996年構思,第二年作為ESPRIT資助計劃下的歐盟項目而進行。該項目由五家公司領導:SPSS,Teradata,戴姆勒公司,NCR公司和OHRA(保險公司)。該項目最終併入SPSS。該方法非常詳細地針對應如何指定數據挖掘項目。

現在讓我們學習一下CRISP-DM生命周期中涉及的每個階段的更多信息-

  • 業務理解 -此初始階段的重點是從業務角度理解項目目標和需求,然後將這些知識轉換為數據挖掘問題定義。初步計劃旨在實現這些目標。可以使用決策模型,尤其是使用決策模型和表示法標準構建的決策模型。
  • 數據理解 -數據理解階段從初始數據收集開始,然後進行一些活動,以便熟悉數據,識別數據質量問題,發現對數據的初步見解或檢測有趣的子集以形成隱藏的假設信息。
  • 數據準備 -數據準備階段涵蓋了從初始原始數據構建最終數據集(將被饋送到建模工具的數據)的所有活動。數據準備任務可能會多次執行,而不是按任何規定的順序執行。任務包括表,記錄和屬性選擇以及建模工具的數據轉換和清理。
  • 建模 -在此階段,選擇並應用了各種建模技術,並將它們的參數校準為最佳值。通常,對於相同的數據挖掘問題類型,有多種技術。一些技術對數據形式有特定要求。因此,通常需要退回到數據準備階段。
  • 評估 -在項目的此階段,從數據分析的角度來看,您已經構建了一個看起來高質量的模型。在繼續進行模型的最終部署之前,重要的是要徹底評估模型並查看為構建模型而執行的步驟,以確保模型能夠正確實現業務目標。一個主要目標是確定是否存在一些尚未被充分考慮的重要業務問題。在此階段結束時,應就使用數據挖掘結果做出決定。
  • 部署 -模型的創建通常不是項目的結束。即使模型的目的是增加數據知識,所獲得的知識也需要以對客戶有用的方式進行組織和呈現。根據需求,部署階段可以像生成報告一樣簡單,也可以像實現可重複的數據評分(例如,段分配)或數據挖掘過程一樣複雜。

在許多情況下,執行部署步驟的將是客戶而不是數據分析師。即使分析師部署了該模型,對於客戶來說,也必須預先了解要實際使用所創建的模型所需執行的操作,這一點很重要。

SEMMA方法論

SEMMA是SAS為數據挖掘建模開發的另一種方法。它代表著小號充足,ē Xplore資料庫,中號 odify,中號奧德爾,和一個小規模企業。這是其階段的簡要說明-

  • 樣本 -過程從數據採樣開始,例如,選擇要建模的數據集。數據集應足夠大以包含足以檢索的信息,但又應足夠小以有效使用。此階段還涉及數據分區。
  • 探索 -該階段通過在數據可視化的幫助下發現變量之間的預期和意外關係以及異常,從而涵蓋了對數據的理解。
  • 修改 -修改階段包含選擇,創建和轉換變量的方法,以準備進行數據建模。
  • 模型 -在模型階段,重點是在準備好的變量上應用各種建模(數據挖掘)技術,以創建可能提供所需結果的模型。
  • 評估 -對建模結果的評估顯示了所創建模型的可靠性和有用性。

CRISM-DM和SEMMA之間的主要區別在於SEMMA專注於建模方面,而CRISP-DM在建模之前更加重視周期的各個階段,例如了解要解決的業務問題,理解和預處理要處理的數據。用作輸入,例如機器學習算法。

大數據生命周期

在當今的大數據環境中,以前的方法要麼不完整,要麼不理想。例如,SEMMA方法論完全忽略了不同數據源的數據收集和預處理。這些階段通常構成成功的大數據項目中的大部分工作。

大數據分析周期可以通過以下階段來描述-

  • 業務問題定義
  • 研究
  • 人力資源評估
  • 數據採集
  • 數據整理
  • 數據存儲
  • 探索性數據分析
  • 建模和評估的數據準備
  • 造型
  • 實作

在本節中,我們將介紹大數據生命周期的每個階段。

業務問題定義

這是傳統BI和大數據分析生命周期中常見的一點。通常,定義問題並正確評估組織可能獲得多少潛在收益是大數據項目的重要階段。提到這一點似乎很明顯,但是必須評估該項目的預期收益和成本是多少。

研究

分析其他公司在相同情況下所做的事情。這涉及尋找適合您公司的解決方案,即使它涉及使其他解決方案適應您公司的資源和要求也是如此。在此階段,應定義未來階段的方法。

人力資源評估

確定問題後,有理由繼續分析當前員工是否能夠成功完成項目。傳統的BI團隊可能無法為所有階段提供最佳解決方案,因此,如果需要外包項目的一部分或雇用更多的人,則應在開始項目之前考慮它。

數據採集

本節是大數據生命周期的關鍵。它定義了交付結果數據產品所需的配置文件類型。數據收集是該過程的重要步驟。它通常涉及從不同來源收集非結構化數據。舉個例子,它可能涉及編寫搜尋器以從網站檢索評論。這涉及到處理文本,也許以不同的語言處理文本,通常需要大量時間才能完成。

數據整理

例如,從網絡上檢索到數據後,就需要以易於使用的格式存儲數據。為了繼續審閱示例,讓我們假設數據是從不同的站點檢索的,每個站點都有不同的數據顯示。

假設一個數據源根據星級進行評論,因此可以將其作為響應變量y∈{1,2,3,4,5}的映射來讀取。另一個數據源使用兩個箭頭系統提供評論,一個用於上投票,另一個用於下投票。這意味著形式為y∈{positive,negative}的響應變量。

為了合併兩個數據源,必須做出決定以使這兩個響應表示等效。這可能涉及將第一個數據源響應表示形式轉換為第二種形式,將一顆星視為負數,將五顆星視為正數。此過程通常需要大量時間才能以高質量交付。

數據存儲

處理完數據後,有時需要將其存儲在資料庫中。關於這一點,大數據技術提供了許多替代方案。最常見的替代方法是使用Hadoop文件系統進行存儲,該存儲為用戶提供了有限版本的SQL,稱為HIVE查詢語言。從用戶的角度來看,這允許大多數分析任務以與傳統BI數據倉庫中類似的方式完成。其他要考慮的存儲選項是MongoDB,Redis和SPARK。

就人力資源知識實施不同體系結構的能力而言,該周期的這一階段與人力資源知識有關。傳統數據倉庫的修改版本仍在大規模應用中使用。例如,teradata和IBM提供了可以處理TB級數據的SQL資料庫。諸如postgreSQL和MySQL之類的開源解決方案仍在用於大型應用程式。

儘管不同存儲在後台的工作方式有所不同,但從客戶端來看,大多數解決方案都提供了SQL API。因此,對SQL的深入理解仍然是大數據分析的一項關鍵技能。

先驗階段似乎是最重要的話題,實際上,這是不正確的。這甚至不是必不可少的階段。可以實現一個可以處理實時數據的大數據解決方案,因此,在這種情況下,我們只需要收集數據來開發模型,然後實時實施即可。因此,根本就不需要正式存儲數據。

探索性數據分析

一旦以可以從中獲取見解的方式清理並存儲了數據,則數據探索階段是必不可少的。此階段的目的是了解數據,通常使用統計技術完成此工作並繪製數據。這是評估問題定義是否合理或可行的好階段。

建模和評估的數據準備

此階段涉及重塑先前獲取的清理數據,並對缺失值進行歸因,離群值檢測,歸一化,特徵提取和特徵選擇使用統計預處理。

造型

前一階段應該已經生成了一些用於訓練和測試的數據集,例如預測模型。這個階段涉及嘗試不同的模型,並期待解決眼前的業務問題。在實踐中,通常希望模型能夠對業務有所了解。最後,選擇最佳模型或模型組合以評估其在遺漏數據集上的性能。

實作

在此階段,開發的數據產品將在公司的數據管道中實施。這涉及在數據產品運行時設置驗證方案,以跟蹤其性能。例如,在實施預測模型的情況下,此階段將涉及將模型應用於新數據,一旦響應可用,就對模型進行評估。

大數據分析-方法論

就方法論而言,大數據分析與實驗設計的傳統統計方法大不相同。分析從數據開始。通常,我們以解釋響應的方式對數據建模。該方法的目的是預測響應行為或了解輸入變量與響應之間的關係。通常,在統計實驗設計中,開發實驗並作為結果檢索數據。這允許以統計模型可以使用的方式生成數據,其中某些假設成立,例如獨立性,正態性和隨機性。

在大數據分析中,我們將獲得數據。我們無法設計滿足我們最喜歡的統計模型的實驗。在分析的大規模應用中,僅需要清理數據就需要大量工作(通常需要80%的工作量),因此機器學習模型可以使用它。

在實際的大型應用程式中,我們沒有遵循的獨特方法。通常,一旦定義了業務問題,就需要研究階段來設計要使用的方法。但是,一般性準則值得一提,並且適用於幾乎所有問題。

大數據分析中最重要的任務之一是統計建模,這意味著有監督和無監督的分類或回歸問題。一旦數據經過清洗和預處理(可用於建模),則應謹慎評估具有合理損失指標的不同模型,然後在實施模型後,應報告進一步的評估和結果。預測建模中的一個常見陷阱是僅實現模型而從不衡量其性能。

大數據分析-核心交付成果

如大數據生命周期中所述,在大多數情況下,開發大數據產品所產生的數據產品包括:

  • 機器學習實現 -可以是分類算法,回歸模型或細分模型。
  • 推薦系統 -目標是開發一種系統,該系統根據用戶行為來推薦選擇。Netflix是此數據產品的典型示例,其中根據用戶的評級推薦其他電影。
  • 儀錶板 -業務通常需要使用工具來可視化聚合數據。儀錶板是使這些數據可訪問的圖形機制。
  • 即席分析 -通常的業務領域有疑問,假設或可回答做與數據即席分析神話。

大數據分析-主要利益相關者

在大型組織中,為了成功開發大數據項目,需要讓管理人員備份該項目。這通常涉及尋找一種方法來顯示項目的業務優勢。對於找到項目的發起人的問題,我們沒有唯一的解決方案,但是下面給出了一些指導原則-

  • 檢查與您感興趣的其他項目相似的其他項目的贊助者和地點。
  • 在關鍵管理職位中建立私人聯繫會有所幫助,因此,如果項目有希望,則可以觸發任何聯繫。
  • 誰將從您的項目中受益?一旦項目按計劃進行,誰將是您的客戶?
  • 制定一個簡單,清晰,可行的建議,並與組織中的主要參與者共享。

為項目尋找贊助者的最佳方法是了解問題以及一旦實施該數據產品將是什麼。這種理解將為說服大數據項目的重要性管理提供優勢。

大數據分析-數據分析師

數據分析師具有面向報告的配置文件,具有使用SQL從傳統數據倉庫中提取和分析數據的經驗。他們的任務通常是在數據存儲方面或在報告一般業務結果方面。數據倉庫絕非簡單,它與數據科學家所做的只是不同。

許多組織都在努力尋找市場上合格的數據科學家。但是,最好選擇潛在的數據分析師並教給他們相關的技能以成為數據科學家。這絕不是一項瑣碎的任務,通常會涉及在定量領域獲得碩士學位的人,但這絕對是一個可行的選擇。勝任的數據分析師必須具備的基本技能如下:

  • 業務了解
  • SQL編程
  • 報告設計與實施
  • 儀錶板開發

大數據分析-數據科學家

數據科學家的角色通常與諸如預測建模,開發細分算法,推薦系統,A / B測試框架之類的任務相關聯,並且經常與原始非結構化數據一起工作。

他們的工作性質要求對數學,應用統計和編程有深入的了解。數據分析師和數據科學家之間有一些共同的技能,例如查詢資料庫的能力。兩者都可以分析數據,但是數據科學家的決定可以對組織產生更大的影響。

這是數據科學家通常需要具備的一組技能-

  • 使用統計包(例如R,Python,SAS,SPSS或Julia)進行編程
  • 能夠清理,提取和探索來自不同來源的數據
  • 統計模型的研究,設計和實施
  • 深入的統計,數學和計算機科學知識

在大數據分析中,人們通常會將數據科學家的角色與數據架構師的角色混淆。實際上,區別很簡單。數據架構師定義了存儲數據的工具和架構,而數據科學家則使用此架構。當然,如果臨時項目需要,數據科學家應該能夠設置新工具,但是基礎結構定義和設計不應成為他的任務的一部分。

大數據分析-問題定義

通過本教程,我們將開發一個項目。本教程的後續各章在「小型項目」部分中討論了較大項目的一部分。人們認為這是一個實用的教程部分,它將提供對實際問題的了解。在這種情況下,我們將從項目的問題定義開始。

項目介紹

該項目的目標是開發一種機器學習模型,以使用其履歷(CV)文本作為輸入來預測人們的時薪。

使用上面定義的框架,很容易定義問題。我們可以將X = {x 1,x 2,…,x n }定義為用戶的簡歷,其中每個功能都可以以最簡單的方式表示該單詞出現的次數。然後,響應才是真正有價值的,我們正在嘗試以美元為單位預測個人的小時工資。

這兩個考慮因素足以得出結論,可以使用監督回歸算法解決存在的問題。

問題定義

問題定義可能是大數據分析流程中最複雜,最被忽略的階段之一。為了定義數據產品可以解決的問題,必須具備經驗。在此階段,大多數數據科學家有抱負的經驗很少或沒有經驗。

大多數大數據問題可以按以下方式分類-

  • 監督分類
  • 有監督的回歸
  • 無監督學習
  • 學習排名

現在讓我們詳細了解這四個概念。

監督分類

給定特徵矩陣X = {x 1,x 2,...,x n },我們開發了一個模型M來預測定義為y = {c 1,c 2,...,c n }的不同類別。例如:給定保險公司中客戶的交易數據,可以開發一個模型來預測客戶是否流失。後者是一個二進位分類問題,其中存在兩個類或目標變量:攪動和不攪動。

其他問題涉及預測一個以上的類,我們可能會對數字識別感興趣,因此響應矢量將定義為:y = {0,1,2,3,4,5,6,7,8,9},最先進的模型將是卷積神經網絡,特徵矩陣將定義為圖像的像素。

監督回歸

在這種情況下,問題的定義與前面的示例非常相似。差異取決於響應。在回歸問題中,響應y∈ℜ,這意味著該響應是實數值。例如,我們可以開發一個模型來預測給定其簡歷的個人的時薪。

無監督學習

管理人員通常渴望獲得新的見解。細分模型可以提供這種見解,以便營銷部門針對不同的細分市場開發產品。開發細分模型而不是思考算法的一種好方法是選擇與所需細分相關的特徵。

例如,在一家電信公司中,按照客戶的手機使用情況對其進行細分很有趣。這將涉及忽略與分割目標無關的特徵,而僅包括那些與分割目標無關的特徵。在這種情況下,這將選擇功能,例如一個月中使用的SMS數量,入站和出站分鐘數等。

學習排名

該問題可以看作是回歸問題,但是它具有特定的特徵,值得單獨處理。該問題涉及給定的文檔集合,我們試圖在給定查詢的情況下找到最相關的順序。為了開發監督學習算法,需要在給定查詢的情況下標記排序的相關性。

值得注意的是,為了開發一種監督學習算法,需要標記訓練數據。這意味著,為了訓練一個模型,該模型將例如識別圖像中的數字,我們需要手工標記大量示例。有些Web服務可以加快此過程,並且通常用於此任務,例如Amazon Mechanical Turk。事實證明,學習算法在提供更多數據時會提高其性能,因此在監督學習中標記大量的示例實際上是必需的。

大數據分析-數據收集

數據收集在大數據周期中扮演著最重要的角色。網際網路為各種主題提供了幾乎無限的數據源。該領域的重要性取決於業務類型,但是傳統行業可以獲取多種外部數據源,並將其與交易數據相結合。

例如,假設我們要構建一個推薦餐廳的系統。第一步是收集數據,在這種情況下,是來自不同網站的餐廳評論,並將其存儲在資料庫中。由於我們對原始文本感興趣,並將其用於分析,因此用於存儲模型開發數據的位置並不重要。這聽起來可能與大數據主要技術相矛盾,但是為了實現大數據應用程式,我們只需要使其實時工作即可。

Twitter迷你項目

定義問題後,下一步就是收集數據。以下微型項目的想法是致力於從Web上收集數據並將其構造為在機器學習模型中使用。我們將使用R程式語言從twitter rest API中收集一些推文。

首先創建一個Twitter帳戶,然後按照twitteR包插圖中的說明創建一個Twitter開發者帳戶。這是這些說明的摘要-

  • 轉到https://twitter.com/apps/new並登錄。
  • 填寫基本信息後,轉到「設置」選項卡,然後選擇「讀取,寫入和訪問直接消息」。
  • 完成此操作後,請確保單擊保存按鈕
  • 在「詳細信息」標籤中,記下您的消費者密鑰和消費者秘密
  • 在您的R會話中,您將使用API​​密鑰和API機密值
  • 最後運行以下腳本。這將從其在github的存儲庫中安裝twitteR軟體包。
install.packages(c("devtools", "rjson", "bit64", "httr"))  

# Make sure to restart your R session at this point 
library(devtools) 
install_github("geoffjentry/twitteR") 

我們有興趣獲取包含字符串「 big mac」的數據,並找出與此相關的主題。為此,第一步是從Twitter收集數據。下面是我們的R腳本,用於從Twitter收集所需的數據。此代碼也可在bda / part1 / collect_data / collect_data_twitter.R文件中找到。

rm(list = ls(all = TRUE)); gc() # Clears the global environment
library(twitteR)
Sys.setlocale(category = "LC_ALL", locale = "C")

### Replace the xxx’s with the values you got from the previous instructions

# consumer_key = "xxxxxxxxxxxxxxxxxxxx"
# consumer_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# access_token = "xxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# access_token_secret= "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# Connect to twitter rest API
setup_twitter_oauth(consumer_key, consumer_secret, access_token, access_token_secret)

# Get tweets related to big mac
tweets <- searchTwitter(』big mac』, n = 200, lang = 』en』)
df <- twListToDF(tweets)

# Take a look at the data
head(df)

# Check which device is most used
sources <- sapply(tweets, function(x) x$getStatusSource())
sources <- gsub("</a>", "", sources)
sources <- strsplit(sources, ">")
sources <- sapply(sources, function(x) ifelse(length(x) > 1, x[2], x[1]))
source_table = table(sources)
source_table = source_table[source_table > 1]
freq = source_table[order(source_table, decreasing = T)]
as.data.frame(freq)

#                       Frequency
# Twitter for iPhone       71
# Twitter for Android      29
# Twitter Web Client       25
# recognia                 20

大數據分析-清理數據

一旦收集了數據,我們通常會獲得具有不同特徵的各種數據源。最直接的步驟是使這些數據源同質並繼續開發我們的數據產品。但是,這取決於數據的類型。我們應該問問自己,使數據均勻化是否可行。

也許數據來源是完全不同的,如果將這些來源同質化,信息損失將很大。在這種情況下,我們可以考慮其他選擇。一個數據源可以幫助我建立回歸模型,另一個數據源可以幫助分類模型嗎?是否可以利用異質性來發揮我們的優勢,而不僅僅是失去信息?做出這些決定是使分析變得有趣和具有挑戰性的原因。

對於審閱,可以為每個數據源使用一種語言。同樣,我們有兩個選擇-

  • 同質化 -涉及將不同的語言翻譯成我們擁有更多數據的語言。轉換服務的質量是可以接受的,但是如果我們想使用API​​轉換大量數據,則成本將會很高。有可用於此任務的軟體工具,但這也很昂貴。
  • 異構化 -是否有可能為每種語言開發解決方案?由於檢測語料庫的語言很簡單,因此我們可以為每種語言開發推薦器。在根據可用語言的數量調整每個推薦器方面,這將涉及更多工作,但是如果我們有幾種語言可用,那麼絕對是一個可行的選擇。

Twitter迷你項目

在當前情況下,我們需要先清理非結構化數據,然後將其轉換為數據矩陣,以便對其應用主題建模。通常,從Twitter獲取數據時,至少在數據清理過程的第一階段,會有幾個我們不希望使用的字符。

例如,獲得鳴叫後,我們得到以下奇怪的字符:「 <ed> <U + 00A0> <U + 00BD> <ed> <U + 00B8> <U + 008B>」。這些可能是表情符號,因此為了清除數據,我們將使用以下腳本刪除它們。該代碼也可在bda / part1 / collect_data / cleaning_data.R文件中找到。

rm(list = ls(all = TRUE)); gc() # Clears the global environment
source('collect_data_twitter.R')
# Some tweets
head(df$text)

[1] "I』m not a big fan of turkey but baked Mac &
cheese <ed><U+00A0><U+00BD><ed><U+00B8><U+008B>"
[2] "@Jayoh30 Like no special sauce on a big mac. HOW"
### We are interested in the text - Let’s clean it!

# We first convert the encoding of the text from latin1 to ASCII
df$text <- sapply(df$text,function(row) iconv(row, "latin1", "ASCII", sub = ""))

# Create a function to clean tweets
clean.text <- function(tx) {
  tx <- gsub("htt.{1,20}", " ", tx, ignore.case = TRUE)
  tx = gsub("[^#[:^punct:]]|@|RT", " ", tx, perl = TRUE, ignore.case = TRUE)
  tx = gsub("[[:digit:]]", " ", tx, ignore.case = TRUE)
  tx = gsub(" {1,}", " ", tx, ignore.case = TRUE)
  tx = gsub("^\\s+|\\s+$", " ", tx, ignore.case = TRUE)
  return(tx)
}  

clean_tweets <- lapply(df$text, clean.text)

# Cleaned tweets
head(clean_tweets)
[1] " WeNeedFeminlsm MAC s new make up line features men woc and big girls "
[1] " TravelsPhoto What Happens To Your Body One Hour After A Big Mac "

數據清理迷你項目的最後一步是清理文本,我們可以將其轉換為矩陣並對其應用算法。從clean_tweets向量中存儲的文本中,我們可以輕鬆地將其轉換為一個單詞矩陣,並應用無監督的學習算法。

大數據分析-匯總數據

報告在大數據分析中非常重要。每個組織必須定期提供信息以支持其決策過程。這項任務通常由具有SQL和ETL(提取,傳輸和加載)經驗的數據分析師處理。

負責此任務的團隊負責將大數據分析部門產生的信息傳播到組織的不同區域。

下面的示例演示數據匯總的含義。導航到bda / part1 / summarize_data文件夾,然後在該文件夾內部,雙擊打開summary_data.Rproj文件。然後,打開summary_data.R腳本並看一下代碼,然後按照給出的說明進行操作。

# Install the following packages by running the following code in R. 
pkgs = c('data.table', 'ggplot2', 'nycflights13', 'reshape2') 
install.packages(pkgs)

GGPLOT2包是偉大的數據可視化。該data.table包是一個很好的選擇,以做快速和高效存儲技術綜述[R 。最新的基準測試表明,它甚至比用於類似任務的python庫pandas還要快。

使用以下代碼查看數據。此代碼也可在bda / part1 / summarize_data / summarize_data.Rproj文件中找到。

library(nycflights13) 
library(ggplot2) 
library(data.table) 
library(reshape2)  

# Convert the flights data.frame to a data.table object and call it DT 
DT <- as.data.table(flights)  

# The data has 336776 rows and 16 columns 
dim(DT)  

# Take a look at the first rows 
head(DT) 

#   year    month  day   dep_time  dep_delay  arr_time  arr_delay  carrier 
# 1: 2013     1     1      517       2         830         11       UA 
# 2: 2013     1     1      533       4         850         20       UA 
# 3: 2013     1     1      542       2         923         33       AA 
# 4: 2013     1     1      544      -1        1004        -18       B6 
# 5: 2013     1     1      554      -6         812        -25       DL 
# 6: 2013     1     1      554      -4         740         12       UA  

#     tailnum  flight  origin   dest    air_time   distance    hour   minute 
# 1:  N14228   1545     EWR      IAH      227        1400       5       17 
# 2:  N24211   1714     LGA      IAH      227        1416       5       33 
# 3:  N619AA   1141     JFK      MIA      160        1089       5       42 
# 4:  N804JB    725     JFK      BQN      183        1576       5       44 
# 5:  N668DN    461     LGA      ATL      116        762        5       54 
# 6:  N39463   1696     EWR      ORD      150        719        5       54

以下代碼提供了數據匯總的示例。

### Data Summarization
# Compute the mean arrival delay  
DT[, list(mean_arrival_delay = mean(arr_delay, na.rm = TRUE))] 
#        mean_arrival_delay 
# 1:           6.895377  
# Now, we compute the same value but for each carrier 
mean1 = DT[, list(mean_arrival_delay = mean(arr_delay, na.rm = TRUE)), 
   by = carrier] 
print(mean1) 
#      carrier    mean_arrival_delay 
# 1:      UA          3.5580111 
# 2:      AA          0.3642909 
# 3:      B6          9.4579733 
# 4:      DL          1.6443409 
# 5:      EV         15.7964311 
# 6:      MQ         10.7747334 
# 7:      US          2.1295951 
# 8:      WN          9.6491199 
# 9:      VX          1.7644644 
# 10:     FL         20.1159055 
# 11:     AS         -9.9308886 
# 12:     9E          7.3796692
# 13:     F9         21.9207048 
# 14:     HA         -6.9152047 
# 15:     YV         15.5569853 
# 16:     OO         11.9310345

# Now let’s compute to means in the same line of code 
mean2 = DT[, list(mean_departure_delay = mean(dep_delay, na.rm = TRUE), 
   mean_arrival_delay = mean(arr_delay, na.rm = TRUE)), 
   by = carrier] 
print(mean2) 

#       carrier    mean_departure_delay   mean_arrival_delay 
# 1:      UA            12.106073          3.5580111 
# 2:      AA             8.586016          0.3642909 
# 3:      B6            13.022522          9.4579733 
# 4:      DL             9.264505          1.6443409 
# 5:      EV            19.955390         15.7964311 
# 6:      MQ            10.552041         10.7747334 
# 7:      US             3.782418          2.1295951 
# 8:      WN            17.711744          9.6491199 
# 9:      VX            12.869421          1.7644644 
# 10:     FL            18.726075         20.1159055 
# 11:     AS             5.804775         -9.9308886 
# 12:     9E            16.725769          7.3796692 
# 13:     F9            20.215543         21.9207048 
# 14:     HA             4.900585         -6.9152047 
# 15:     YV            18.996330         15.5569853 
# 16:     OO            12.586207         11.9310345

### Create a new variable called gain 
# this is the difference between arrival delay and departure delay 
DT[, gain:= arr_delay - dep_delay]  

# Compute the median gain per carrier 
median_gain = DT[, median(gain, na.rm = TRUE), by = carrier] 
print(median_gain)

大數據分析-數據探索

探索性數據分析是約翰·塔克(John Tuckey,1977)提出的一個概念,它基於統計學的新觀點。Tuckey的想法是,在傳統統計中,數據不是以圖形方式進行探索,而只是用於檢驗假設。開發工具的第一次嘗試是在斯坦福進行的,該項目稱為prim9。該工具能夠在九個維度上可視化數據,因此能夠提供數據的多元視角。

近年來,探索性數據分析是必須的,並且已包含在大數據分析生命周期中。強大的EDA功能助長了在組織中發現洞察力並進行有效溝通的能力。

基於Tuckey的想法,貝爾實驗室開發了S程式語言,以便提供進行統計的交互式介面。S的想法是通過一種易於使用的語言提供廣泛的圖形功能。在當今世界中,在大數據的背景下,基於S程式語言的R是最受歡迎的分析軟體。

以下程序演示了探索性數據分析的用法。

以下是探索性數據分析的示例。該代碼在part1 / eda / exploratory_data_analysis.R文件中也可用。

library(nycflights13) 
library(ggplot2) 
library(data.table) 
library(reshape2)  

# Using the code from the previous section 
# This computes the mean arrival and departure delays by carrier. 
DT <- as.data.table(flights) 
mean2 = DT[, list(mean_departure_delay = mean(dep_delay, na.rm = TRUE), 
   mean_arrival_delay = mean(arr_delay, na.rm = TRUE)), 
   by = carrier]  

# In order to plot data in R usign ggplot, it is normally needed to reshape the data 
# We want to have the data in long format for plotting with ggplot 
dt = melt(mean2, id.vars = 』carrier』)  

# Take a look at the first rows 
print(head(dt))  

# Take a look at the help for ?geom_point and geom_line to find similar examples 
# Here we take the carrier code as the x axis 
# the value from the dt data.table goes in the y axis 

# The variable column represents the color 
p = ggplot(dt, aes(x = carrier, y = value, color = variable, group = variable)) +
   geom_point() + # Plots points 
   geom_line() + # Plots lines 
   theme_bw() + # Uses a white background 
   labs(list(title = 'Mean arrival and departure delay by carrier', 
      x = 'Carrier', y = 'Mean delay')) 
print(p)  

# Save the plot to disk 
ggsave('mean_delay_by_carrier.png', p,  
   width = 10.4, height = 5.07)

該代碼應產生如下圖像:

大數據分析-數據可視化

為了理解數據,通常將其可視化很有用。通常,在大數據應用程式中,人們的興趣在於尋找見識,而不僅僅是做出漂亮的圖。以下是使用圖解理解數據的不同方法的示例。

要開始分析航班數據,我們可以先檢查數字變量之間是否存在相關性。此代碼也可在bda / part1 / data_visualization / data_visualization.R文件中找到。

# Install the package corrplot by running
install.packages('corrplot')  

# then load the library 
library(corrplot)  

# Load the following libraries  
library(nycflights13) 
library(ggplot2) 
library(data.table) 
library(reshape2)  

# We will continue working with the flights data 
DT <- as.data.table(flights)  
head(DT) # take a look  

# We select the numeric variables after inspecting the first rows. 
numeric_variables = c('dep_time', 'dep_delay',  
   'arr_time', 'arr_delay', 'air_time', 'distance')

# Select numeric variables from the DT data.table 
dt_num = DT[, numeric_variables, with = FALSE]  

# Compute the correlation matrix of dt_num 
cor_mat = cor(dt_num, use = "complete.obs")  

print(cor_mat) 
### Here is the correlation matrix 
#              dep_time   dep_delay   arr_time   arr_delay    air_time    distance 
# dep_time   1.00000000  0.25961272 0.66250900  0.23230573 -0.01461948 -0.01413373 
# dep_delay  0.25961272  1.00000000 0.02942101  0.91480276 -0.02240508 -0.02168090 
# arr_time   0.66250900  0.02942101 1.00000000  0.02448214  0.05429603  0.04718917 
# arr_delay  0.23230573  0.91480276 0.02448214  1.00000000 -0.03529709 -0.06186776 
# air_time  -0.01461948 -0.02240508 0.05429603 -0.03529709  1.00000000  0.99064965 
# distance  -0.01413373 -0.02168090 0.04718917 -0.06186776  0.99064965  1.00000000  

# We can display it visually to get a better understanding of the data 
corrplot.mixed(cor_mat, lower = "circle", upper = "ellipse")  

# save it to disk 
png('corrplot.png') 
print(corrplot.mixed(cor_mat, lower = "circle", upper = "ellipse")) 
dev.off()

此代碼生成以下相關矩陣可視化-

在圖中可以看到,數據集中的某些變量之間存在很強的相關性。例如,到達延遲和離開延遲似乎高度相關。我們可以看到這一點,因為橢圓顯示出兩個變量之間幾乎呈線性關係,但是,從該結果中查找因果關係並不容易。

我們不能說因為兩個變量是相關的,所以一個變量會影響另一個變量。我們還在圖中發現空中時間與距離之間存在很強的相關性,這是可以合理預期的,因為隨著距離的增加,飛行時間會增加。

我們還可以對數據進行單變量分析。可視化分布的一種簡單有效的方法是箱形圖。以下代碼演示了如何使用ggplot2庫生成箱形圖和格子圖。此代碼也可在bda / part1 / data_visualization / boxplots.R文件中找到。

source('data_visualization.R') 
### Analyzing Distributions using box-plots  
# The following shows the distance as a function of the carrier 

p = ggplot(DT, aes(x = carrier, y = distance, fill = carrier)) + # Define the carrier 
   in the x axis and distance in the y axis 
   geom_box-plot() + # Use the box-plot geom 
   theme_bw() + # Leave a white background - More in line with tufte's 
      principles than the default 
   guides(fill = FALSE) + # Remove legend 
   labs(list(title = 'Distance as a function of carrier', # Add labels 
      x = 'Carrier', y = 'Distance')) 
p   
# Save to disk 
png(『boxplot_carrier.png』) 
print(p) 
dev.off()   

# Let's add now another variable, the month of each flight 
# We will be using facet_wrap for this 
p = ggplot(DT, aes(carrier, distance, fill = carrier)) + 
   geom_box-plot() + 
   theme_bw() + 
   guides(fill = FALSE) +  
   facet_wrap(~month) + # This creates the trellis plot with the by month variable
   labs(list(title = 'Distance as a function of carrier by month', 
      x = 'Carrier', y = 'Distance')) 
p   
# The plot shows there aren't clear differences between distance in different months  

# Save to disk 
png('boxplot_carrier_by_month.png') 
print(p) 
dev.off()

關鍵字: