導讀:無論你的工作內容是什麼,掌握一定的資料分析能力,都可以幫你更好的認識世界,更好的提升工作效率。資料分析除了包含傳統意義上的統計分析之外,也包含尋找有效特徵、進行機器學習建模的過程,以及探索資料價值、找尋資料本根的過程。
作者:馬海平 於俊 呂昕 向海
本文摘編自《Spark機器學習進階實戰》,如需轉載請聯絡我們
01 資料分析流程
資料分析可以幫助我們從資料中發現有用資訊,找出有建設性的結論,並基於分析結論輔助決策。如圖1所示,資料分析流程主要包括業務調研、明確標的、資料準備、特徵處理、模型訓練與評估、輸出結論等六個關鍵環節。
▲圖1 資料分析流程
資料分析能力並非一朝一夕養成的,需要長期紮根業務進行積累,需要長期根據資料分析流程一步一個腳印分析問題,培養自己對資料的敏感度,從而養成用資料分析、用資料說話的習慣。當你可以基於一些資料,根據自己的經驗做出初步的判斷和預測,你就基本擁有資料思維了。
02 資料分析基本方法
資料分析是以標的為導向的,透過標的實現選擇資料分析的方法,常用的分析方法是統計分析,資料挖掘則需要使用機器學習構建模型。接下來介紹一些簡單的資料分析方法。
1. 彙總統計
統計是指用單個數或者數的小集合捕獲很大值集的特徵,透過少量數值來瞭解大量資料中的主要資訊,常見統計指標包括:
-
分佈度量:機率分佈表、頻率表、直方圖
-
頻率度量:眾數
-
位置度量:均值、中位數
-
散度度量:極差、方差、標準差
-
多元比較:相關係數
-
模型評估:準確率、召回率
彙總統計對一個彈性分散式資料集RDD進行概括統計,它透過呼叫Statistics的colStats方法實現。colStats方法可以傳回RDD的最大值、最小值、均值、方差等,程式碼實現如下:
import
org.apache.spark.MLlib.linalg.Vector
import
org.apache.spark.MLlib.stat.{MultivariateStatisticalSummary, Statistics}
// 向量[Vector]資料集
val
data
:
RDD[Vector]
=
...
// 彙總統計資訊
val
summary
:
statisticalSummary
=
Statistics.colStats(data)
// 平均值和方差
println(summary.mean)
println(summary.variance)
2. 相關性分析
相關性分析是指透過分析尋找不用商品或不同行為之間的關係,發現使用者的習慣,計算兩個資料集的相關性是統計中的常用操作。
在MLlib中提供了計算多個資料集兩兩相關的方法。目前支援的相關性方法有皮爾遜(Pearson)相關和斯皮爾曼(Spearman)相關。一般對於符合正態分佈的資料使用皮爾遜相關係數,對於不符合正態分佈的資料使用斯皮爾曼相關係數。
皮爾遜相關係數是用來反映兩個變數相似程度的統計量,它常用於計算兩個向量的相似度,皮爾遜相關係數計算公式如下:
其中表示兩組變數,表示兩個變數的平均值,皮爾遜相關係數可以理解為對兩個向量進行歸一化以後,計算其餘弦距離(即使用餘弦函式cos計算相似度,用向量空間中兩個向量的夾角的餘弦值來衡量兩個文字間的相似度),皮爾遜相關大於0表示兩個變數正相關,小於0表示兩個變數負相關,皮爾遜相關係數為0時,表示兩個變數沒有相關性。
呼叫MLlib計算兩個RDD皮爾遜相關性的程式碼如下,輸入的資料可以是RDD[Double]也可以是RDD[Vector],輸出是一個Double值或者相關性矩陣。
import
org.apache.spark.SparkContext
import
org.apache.spark.MLlib.linalg.
_
import
org.apache.spark.MLlib.stat.Statistics
// 建立應用入口
val
sc
:
SparkContext
=
...
// X變數
val
seriesX
:
RDD[Double]
=
...
// Y變數,分割槽和基數同seriesX
val
seriesY
:
RDD[Double]
=
...
// 使用Pearson方法計算相關性,斯皮爾曼的方法輸入“spearman”
val
correlation
:
Double
=
Statistics.corr(seriesX, seriesY,
"pearson"
)
// 向量資料集
val
data
:
RDD[Vector]
=
...
val
correlMatrix
:
Matrix
=
Statistics.corr(data,
"pearson"
)
皮爾遜相關係數在機器學習的效果評估中經常使用,如使用皮爾遜相關係數衡量推薦系統推薦結果的效果。
3. 分層抽樣
分層抽樣先將資料分為若干層,然後再從每一層內進行隨機抽樣組成一個樣本。MLlib提供了對資料的抽樣操作,分層抽樣常用的函式是sampleByKey和sampleByKeyExact,這兩個函式是在key-value對的RDD上操作,用key來進行分層。
其中,sampleByKey方法透過擲硬幣的方式進行抽樣,它需要指定需要的資料大小;sampleByKeyExact抽取個樣本,表示期望獲取鍵為key的樣本比例,表示鍵為key的鍵值對的數量。sampleByKeyExact能夠獲取更準確的抽樣結果,可以選擇重覆抽樣和不重覆抽樣,當withReplacement為true時是重覆抽樣,false時為不重覆抽樣。重覆抽樣使用泊松抽樣器,不重覆抽樣使用伯努利抽樣器。
分層抽樣的程式碼如下:
import
org.apache.spark.SparkContext
import
org.apache.spark.SparkContext.
_
import
org.apache.spark.rdd.PairRDDFunctions
val
sc
:
SparkContext
=
...
// RDD[(K, V)]形式的鍵值對
val
data
=
...
//指定每個鍵所需的份數
val
fractions
:
Map[K, Double]
=
...
//從每個層次獲取確切的樣本
val
approxSample
=
data.sampleByKey(withReplacement
=
false
, fractions)
val
exactSample
=
data.sampleByKeyExact(withReplacement
=
false
, fractions)
透過使用者特徵、使用者行為對使用者進行分類分層,形成精細化運營、精準化業務推薦,進一步提升運營效率和轉化率。
4. 假設檢驗
假設檢驗是統計中常用的工具,它用於判斷一個結果是否在統計上是顯著的、這個結果是否有機會發生。透過資料分析發現異常情況,找到解決異常問題的方法。
MLlib目前支援皮爾森卡方檢驗,對應的函式是Statistics類的chiSqTest,chiSqTest支援多種輸入資料型別,對不同的輸入資料型別進行不同的處理,對於Vector進行擬合優度檢驗,對於Matrix進行獨立性檢驗,對於RDD用於特徵選擇,使用chiSqTest方法進行假設檢驗的程式碼如下:
import
org.apache.spark.SparkContext
import
org.apache.spark.MLlib.linalg.
_
import
org.apache.spark.MLlib.regression.LabeledPoint
import
org.apache.spark.MLlib.stat.Statistics.
_
val
sc
:
SparkContext
=
...
// 定義一個由事件頻率組成的向量
val
vec
:
Vector
=
...
// 作皮爾森擬合優度檢驗
val
goodnessOfFitTestResult
=
Statistics.chiSqTest(vec)
println(goodnessOfFitTestResult)
// 定義一個檢驗矩陣
val
mat
:
Matrix
=
...
// 作皮爾森獨立性檢測
val
independenceTestResult
=
Statistics.chiSqTest(mat)
// 檢驗總結:包括假定值(p-value)、自由度(degrees of freedom)
println(independenceTestResult)
// pairs(feature, label).
val
obs
:
RDD[LabeledPoint]
=
...
// 獨立性檢測用於特徵選擇
val
featureTestResults
:
Array[ChiSqTestResult]
=
Statistics.chiSqTest(obs)
var
i
=
1
featureTestResults.foreach { result
=
>
println(s
"Column $i:\n$result"
)
i +
=
1
}
03 簡單的資料分析實踐
為了更清楚的說明簡單的資料分析實現,搭建Spark開發環境,並使用gowalla資料集進行簡單的資料分析,該資料集較小,可在Spark本地樣式下,快速執行實踐。
實踐步驟如下:
1)環境準備:準備開發環境並載入專案程式碼;
2)資料準備:資料預處理及one-hot編碼;
3)資料分析:使用均值、方差、皮爾遜相關性計算等進行資料分析。
簡單資料分析實踐的詳細程式碼參考:ch02\GowallaDatasetExploration.scala,本地測試引數和值如表1所示。
本地測試引數 |
引數值 |
mode |
local[2] |
input |
2rd_data/ch02/Gowalla_totalCheckins.txt |
▲表1 本地測試引數和值
1. 環境準備
Spark程常用IntelliJ IDEA工具進行開發,下載地址:www.jetbrains.com/idea/,一般選擇Community版,當前版本:ideaIC-2017.3.4,支援Windows、Mac OS X、Linux,可以根據自己的情況選擇適合的作業系統進行安裝。
(1)安裝scala-intellij外掛
啟動IDEA程式,進入“Configure”介面,選擇“Plugins”,點選安裝介面左下角的“Install JetBrains plugin”選項,進入JetBrains外掛選擇頁面,輸入“Scala”來查詢Scala外掛,點選“Install plugin”按鈕進行安裝。(如果網路不穩定,可以根據頁面提示的地址下載,然後選擇“Install plugin from disk”本地載入外掛),外掛安裝完畢,重啟IDEA。
(2)建立專案開發環境
啟動IDEA程式,選擇“Create New Project”,進入建立程式介面,選擇Scala對應的sbt選項,設定Scala工程名稱和本地目錄(以book2-master為例),選擇SDK、SBT、Scala版本(作者的開發環境:Jdk->1.8.0_162、sbt->1.1.2、scala->2.11.12),點選“Finish”按鈕完成工程的建立。
匯入Spark開發包,具體步驟為:File->Project Structure->Libraries->+New Project Library(Java),選擇spark jars(如:spark-2.3.0-bin-hadoop2.6/jars)和本地libs(如:\book2-master\libs,包括:nak_2.11-1.3、scala-logging-api_2.11-2.1.2、scala-logging-slf4j_2.11-2.1.2)。
(3)複製專案程式碼
複製原始碼中的2rd_data、libs、output、src改寫本地開發專案目錄,即可完成開發環境搭建。
除此之外,也可以透過Maven方式Import Project。
2. 準備資料
我們提供的資料格式:
使用者[user] 簽到時間[check-in time] 維度[latitude] 精度[longitude] 位置標識[location id]
資料樣例如下:
準備資料的步驟如下。
(1)資料清洗
在資料清洗階段過濾掉不符合規範的資料,並將資料進行格式轉換,保證資料的完整性、唯一性、合法性、一致性,並按照CheckIn類填充資料,具體實現方法如下:
// 定義資料類CheckIn
case
class
CheckIn(user
:
String, time
:
String, latitude
:
Double, longitude
:
Double, location
:
String)
// 實體化應用程式入口
val
conf
=
new
SparkConf().setAppName(
this
.getClass.getSimpleName).setMaster(mode)
val
sc
=
new
SparkContext(conf)
val
gowalla
=
sc.textFile(input).map(
_
.split(
"\t"
)).mapPartitions{
case
iter
=
>
val
format
=
DateTimeFormat.forPattern(
"yyyy-MM-dd\'T\'HH:mm:ss\'Z\'"
)
iter.map {
// 填充資料類
case
terms
=
> CheckIn(terms(
0
), terms(
1
).substring(
0
,
10
), terms(
2
).toDouble, terms(
3
).toDouble,terms(
4
))
}
}
(2)資料轉換
在資料轉化階段,將資料轉換成Vectors的形式,供後面資料分析使用。
// 欄位:user, checkins, checkin days, locations
val
data
=
gowalla.map{
case
check
:
CheckIn
=
> (check.user, (
1
L, Set(check.time), Set(check.location)))
}.reduceByKey {
// 並集 union
case
(left, right)
=
>(left.
_
1
+ right.
_
1
,left.
_
2
.union(right.
_
2
),left.
_
3
.union(right.
_
3
))
}.map {
case
(user, (checkins, days
:
Set[String], locations
:
Set[String]))
=
>
Vectors.dense(checkins.toDouble,days.size.toDouble,
locations.size.toDouble)
}
3. 資料分析
透過簡單的資料分析流程,實現均值、方差、非零元素的目錄的統計,以及皮爾遜相關性計算,來實現對資料分析的流程和方法的理解。
簡單的資料分析程式碼示例如下:
// 統計分析
val
summary
:
MultivariateStatisticalSummary
=
Statistics.colStats(data)
// 均值、方差、非零元素的目錄
println(
"Mean"
+summary.mean)
println(
"Variance"
+summary.variance)
println(
"NumNonzeros"
+summary.numNonzeros)
// 皮爾遜
val
correlMatrix
:
Matrix
=
Statistics.corr(data,
"pearson"
)
println(
"correlMatrix"
+correlMatrix.toString)
簡單資料分析應用執行結果如下:
均值:[
60.16221566503564
,
25.30645613117692
,
37.17676390393301
]
方差
:
[
18547.42981193066
,
1198.630729157736
,
7350.7365871949905
]
非零元素
:
[
107092.0
,
107092.0
,
107092.0
]
皮爾遜相關性矩陣
:
1.0
0.7329442022276709
0.9324997691135504
0.7329442022276709
1.0
0.5920355112372706
0.9324997691135504
0.5920355112372706
1.0
本文摘編自《Spark機器學習進階實戰》,經出版方授權釋出。
延伸閱讀《Spark機器學習進階實戰》
點選上圖瞭解及購買
轉載請聯絡微信:togo-maruko
推薦語:科大訊飛大資料專家撰寫,從基礎到應用,面面俱到。
更多精彩
在公眾號後臺對話方塊輸入以下關鍵詞
檢視更多優質內容!
PPT | 報告 | 讀書 | 書單
Python | 機器學習 | 深度學習 | 神經網路
區塊鏈 | 揭秘 | 乾貨 | 數學
猜你想看
Q: 資料分析的方法你掌握了多少?
歡迎留言與大家分享
覺得不錯,請把這篇文章分享給你的朋友
轉載 / 投稿請聯絡:baiyu@hzbook.com
更多精彩,請在後臺點選“歷史文章”檢視
點選閱讀原文,瞭解更多