目錄 1 描述性統計是什麼?2 使用NumPy和SciPy進行數值分析 2.1 基本概念 2.2 中心位置(均值、中位數、眾數) 2.3 發散程度(極差,方差、標準差、變異繫數) 2.4 偏差程度(z-分數) 2.5 相關程度(協方差,相關係數) 2.6 回顧3 使用Matplotlib進行圖分析 ...
目錄
1 描述性統計是什麼?
2 使用NumPy和SciPy進行數值分析
2.1 基本概念
2.2 中心位置(均值、中位數、眾數)
2.3 發散程度(極差,方差、標準差、變異繫數)
2.4 偏差程度(z-分數)
2.5 相關程度(協方差,相關係數)
2.6 回顧
3 使用Matplotlib進行圖分析
3.1 基本概念
3.2 頻數分析
3.2.1 定性分析(柱狀圖、餅形圖)
3.2.2 定量分析(直方圖、累積曲線)
3.3 關係分析(散點圖)
3.4 探索分析(箱形圖)
3.5 回顧
4 總結
5 參考資料
1 描述性統計是什麼?
描述性統計是藉助圖表或者總結性的數值來描述數據的統計手段。數據挖掘工作的數據分析階段,我們可藉助描述性統計來描繪或總結數據的基本情況,一來可以梳理自己的思維,二來可以更好地向他人展示數據分析結果。數值分析的過程中,我們往往要計算出數據的統計特征,用來做科學計算的NumPy和SciPy工具可以滿足我們的需求。Matpotlob工具可用來繪製圖,滿足圖分析的需求。
2 使用NumPy和SciPy進行數值分析
2.1 基本概念
與Python中原生的List類型不同,Numpy中用ndarray類型來描述一組數據:
1 from numpy import array 2 from numpy.random import normal, randint 3 #使用List來創造一組數據 4 data = [1, 2, 3] 5 #使用ndarray來創造一組數據 6 data = array([1, 2, 3]) 7 #創造一組服從正態分佈的定量數據 8 data = normal(0, 10, size=10) 9 #創造一組服從均勻分佈的定性數據 10 data = randint(0, 10, size=10)
2.2 中心位置(均值、中位數、眾數)
數據的中心位置是我們最容易想到的數據特征。藉由中心位置,我們可以知道數據的一個平均情況,如果要對新數據進行預測,那麼平均情況是非常直觀地選擇。數據的中心位置可分為均值(Mean),中位數(Median),眾數(Mode)。其中均值和中位數用於定量的數據,眾數用於定性的數據。
對於定量數據(Data)來說,均值是總和除以總量(N),中位數是數值大小位於中間(奇偶總量處理不同)的值:
均值相對中位數來說,包含的信息量更大,但是容易受異常的影響。使用NumPy計算均值與中位數:
1 from numpy import mean, median 2 3 #計算均值 4 mean(data) 5 #計算中位數 6 median(data)
對於定性數據來說,眾數是出現次數最多的值,使用SciPy計算眾數:
1 from scipy.stats import mode 2 3 #計算眾數 4 mode(data)
2.3 發散程度(極差、方差、標準差、變異繫數)
對數據的中心位置有所瞭解以後,一般我們會想要知道數據以中心位置為標準有多發散。如果以中心位置來預測新數據,那麼發散程度決定了預測的準確性。數據的發散程度可用極差(PTP)、方差(Variance)、標準差(STD)、變異繫數(CV)來衡量,它們的計算方法如下:
極差是只考慮了最大值和最小值的發散程度指標,相對來說,方差包含了更多的信息,標準差基於方差但是與原始數據同量級,變異繫數基於標準差但是進行了無量綱處理。使用NumPy計算極差、方差、標準差和變異繫數:
1 from numpy import mean, ptp, var, std 2 3 #極差 4 ptp(data) 5 #方差 6 var(data) 7 #標準差 8 std(data) 9 #變異繫數 10 mean(data) / std(data)
2.4 偏差程度(z-分數)
之前提到均值容易受異常值影響,那麼如何衡量偏差,偏差到多少算異常是兩個必須要解決的問題。定義z-分數(Z-Score)為測量值距均值相差的標準差數目:
當標準差不為0且不為較接近於0的數時,z-分數是有意義的,使用NumPy計算z-分數:
1 from numpy import mean, std 2 3 #計算第一個值的z-分數 4 (data[0]-mean(data)) / std(data)
通常來說,z-分數的絕對值大於3將視為異常。
2.5 相關程度
有兩組數據時,我們關心這兩組數據是否相關,相關程度有多少。用協方差(COV)和相關係數(CORRCOEF)來衡量相關程度:
協方差的絕對值越大表示相關程度越大,協方差為正值表示正相關,負值為負相關,0為不相關。相關係數是基於協方差但進行了無量綱處理。使用NumPy計算協方差和相關係數:
1 from numpy import array, cov, corrcoef 2 3 data = array([data1, data2]) 4 5 #計算兩組數的協方差 6 #參數bias=1表示結果需要除以N,否則只計算了分子部分 7 #返回結果為矩陣,第i行第j列的數據表示第i組數與第j組數的協方差。對角線為方差 8 cov(data, bias=1) 9 10 #計算兩組數的相關係數 11 #返回結果為矩陣,第i行第j列的數據表示第i組數與第j組數的相關係數。對角線為1 12 corrcoef(data)
2.6 回顧
庫包 | 方法 | 說明 |
numpy | array | 創造一組數 |
numpy.random | normal | 創造一組服從正態分佈的定量數 |
numpy.random | randint | 創造一組服從均勻分佈的定性數 |
numpy | mean | 計算均值 |
numpy | median | 計算中位數 |
scipy.stats | mode | 計算眾數 |
numpy | ptp | 計算極差 |
numpy | var | 計算方差 |
numpy | std | 計算標準差 |
numpy | cov | 計算協方差 |
numpy | corrcoef | 計算相關係數 |
3 使用Matplotlib進行圖分析
3.1 基本概念
使用圖分析可以更加直觀地展示數據的分佈(頻數分析)和關係(關係分析)。柱狀圖和餅形圖是對定性數據進行頻數分析的常用工具,使用前需將每一類的頻數計算出來。直方圖和累積曲線是對定量數據進行頻數分析的常用工具,直方圖對應密度函數而累積曲線對應分佈函數。散點圖可用來對兩組數據的關係進行描述。在沒有分析目標時,需要對數據進行探索性的分析,箱形圖將幫助我們完成這一任務。
在此,我們使用一組容量為10000的男學生身高,體重,成績數據來講解如何使用Matplotlib繪製以上圖形,創建數據的代碼如下:
1 from numpy import array 2 from numpy.random import normal 3 4 def genData(): 5 heights = [] 6 weights = [] 7 grades = [] 8 N = 10000 9 10 for i in range(N): 11 while True: 12 #身高服從均值172,標準差為6的正態分佈 13 height = normal(172, 6) 14 if 0 < height: break 15 while True: 16 #體重由身高作為自變數的線性回歸模型產生,誤差服從標準正態分佈 17 weight = (height - 80) * 0.7 + normal(0, 1) 18 if 0 < weight: break 19 while True: 20 #分數服從均值為70,標準差為15的正態分佈 21 score = normal(70, 15) 22 if 0 <= score and score <= 100: 23 grade = 'E' if score < 60 else ('D' if score < 70 else ('C' if score < 80 else ('B' if score < 90 else 'A'))) 24 break 25 heights.append(height) 26 weights.append(weight) 27 grades.append(grade) 28 return array(heights), array(weights), array(grades) 29 30 heights, weights, grades = genData()View Code
3.2 頻數分析
3.2.1 定性分析(柱狀圖、餅形圖)
柱狀圖是以柱的高度來指代某種類型的頻數,使用Matplotlib對成績這一定性變數繪製柱狀圖的代碼如下:
1 from matplotlib import pyplot 2 3 #繪製柱狀圖 4 def drawBar(grades): 5 xticks = ['A', 'B', 'C', 'D', 'E'] 6 gradeGroup = {} 7 #對每一類成績進行頻數統計 8 for grade in grades: 9 gradeGroup[grade] = gradeGroup.get(grade, 0) + 1 10 #創建柱狀圖 11 #第一個參數為柱的橫坐標 12 #第二個參數為柱的高度 13 #參數align為柱的對齊方式,以第一個參數為參考標準 14 pyplot.bar(range(5), [gradeGroup.get(xtick, 0) for xtick in xticks], align='center') 15 16 #設置柱的文字說明 17 #第一個參數為文字說明的橫坐標 18 #第二個參數為文字說明的內容 19 pyplot.xticks(range(5), xticks) 20 21 #設置橫坐標的文字說明 22 pyplot.xlabel('Grade') 23 #設置縱坐標的文字說明 24 pyplot.ylabel('Frequency') 25 #設置標題 26 pyplot.title('Grades Of Male Students') 27 #繪圖 28 pyplot.show() 29 30 drawBar(grades)
繪製出來的柱狀圖的效果如下:
而餅形圖是以扇形的面積來指代某種類型的頻率,使用Matplotlib對成績這一定性變數繪製餅形圖的代碼如下:
1 from matplotlib import pyplot 2 3 #繪製餅形圖 4 def drawPie(grades): 5 labels = ['A', 'B', 'C', 'D', 'E'] 6 gradeGroup = {} 7 for grade in grades: 8 gradeGroup[grade] = gradeGroup.get(grade, 0) + 1 9 #創建餅形圖 10 #第一個參數為扇形的面積 11 #labels參數為扇形的說明文字 12 #autopct參數為扇形占比的顯示格式 13 pyplot.pie([gradeGroup.get(label, 0) for label in labels], labels=labels, autopct='%1.1f%%') 14 pyplot.title('Grades Of Male Students') 15 pyplot.show() 16 17 drawPie(grades)
繪製出來的餅形圖效果如下:
3.2.2 定量分析(直方圖、累積曲線)
直方圖類似於柱狀圖,是用柱的高度來指代頻數,不同的是其將定量數據劃分為若幹連續的區間,在這些連續的區間上繪製柱。使用Matplotlib對身高這一定量變數繪製直方圖的代碼如下:
1 from matplotlib import pyplot 2 3 #繪製直方圖 4 def drawHist(heights): 5 #創建直方圖 6 #第一個參數為待繪製的定量數據,不同於定性數據,這裡並沒有事先進行頻數統計 7 #第二個參數為劃分的區間個數 8 pyplot.hist(heights, 100) 9 pyplot.xlabel('Heights') 10 pyplot.ylabel('Frequency') 11 pyplot.title('Heights Of Male Students') 12 pyplot.show() 13 14 drawHist(heights)
直方圖對應數據的密度函數,由於身高變數是屬於服從正態分佈的,從繪製出來的直方圖上也可以直觀地看出來:
使用Matplotlib對身高這一定量變數繪製累積曲線的代碼如下:
1 from matplotlib import pyplot 2 3 #繪製累積曲線 4 def drawCumulativeHist(heights): 5 #創建累積曲線 6 #第一個參數為待繪製的定量數據 7 #第二個參數為劃分的區間個數 8 #normed參數為是否無量綱化 9 #histtype參數為'step',繪製階梯狀的曲線 10 #cumulative參數為是否累積 11 pyplot.hist(heights, 20, normed=True, histtype='step', cumulative=True) 12 pyplot.xlabel('Heights') 13 pyplot.ylabel('Frequency') 14 pyplot.title('Heights Of Male Students') 15 pyplot.show() 16 17 drawCumulativeHist(heights)
累積曲線對應數據的分佈函數,由於身高變數是屬於服從正態分佈的,從繪製出來的累積曲線圖上也可以直觀地看出來:
3.3 關係分析(散點圖)
在散點圖中,分別以自變數和因變數作為橫縱坐標。當自變數與因變數線性相關時,在散點圖中,點近似分佈在一條直線上。我們以身高作為自變數,體重作為因變數,討論身高對體重的影響。使用Matplotlib繪製散點圖的代碼如下:
from matplotlib import pyplot #繪製散點圖 def drawScatter(heights, weights): #創建散點圖 #第一個參數為點的橫坐標 #第二個參數為點的縱坐標 pyplot.scatter(heights, weights) pyplot.xlabel('Heights') pyplot.ylabel('Weights') pyplot.title('Heights & Weights Of Male Students') pyplot.show() drawScatter(heights, weights)
我們在創建數據時,體重這一變數的確是由身高變數通過線性回歸產生,繪製出來的散點圖如下:
3.4 探索分析(箱形圖)
在不明確數據分析的目標時,我們對數據進行一些探索性的分析,通過我們可以知道數據的中心位置,發散程度以及偏差程度。使用Matplotlib繪製關於身高的箱形圖的代碼如下:
1 from matplotlib import pyplot 2 3 #繪製箱形圖 4 def drawBox(heights): 5 #創建箱形圖 6 #第一個參數為待繪製的定量數據 7 #第二個參數為數據的文字說明 8 pyplot.boxplot([heights], labels=['Heights']) 9 pyplot.title('Heights Of Male Students') 10 pyplot.show() 11 12 drawBox(heights)
繪製出來的箱形圖中,包含3種信息:
- Q2所指的紅線為中位數
- Q1所指的藍框下側為下四分位數,Q3所指的藍框上側為上四分位數,Q3-Q1為四分為差。四分位差也是衡量數據的發散程度的指標之一。
- 上界線和下界線是距離中位數1.5倍四分位差的線,高於上界線或者低於下界線的數據為異常值。
3.5 回顧
方法 | 說明 |
bar | 柱狀圖 |
pie | 餅形圖 |
hist | 直方圖&累積曲線 |
scatter | 散點圖 |
boxplot | 箱形圖 |
xticks | 設置柱的文字說明 |
xlabel | 橫坐標的文字說明 |
ylabel | 縱坐標的文字說明 |
title | 標題 |
show | 繪圖 |
4 總結
描述性統計是容易操作,直觀簡潔的數據分析手段。但是由於簡單,對多元變數的關係難以描述。現實生活中,自變數通常是多元的:決定體重不僅有身高,還有飲食習慣,肥胖基因等等因素。通過一些高級的數據處理手段,我們可以對多元變數進行處理,例如特征工程中,可以使用互信息方法來選擇多個對因變數有較強相關性的自變數作為特征,還可以使用主成分分析法來消除一些冗餘的自變數來降低運算複雜度。
5 參考資料