熱線電話:13121318867

登錄
首頁精彩閱讀使用Python進行描述性統計
使用Python進行描述性統計
2018-02-26
收藏

使用Python進行描述性統計

1 描述性統計是什么?

描述性統計是借助圖表或者總結性的數值來描述數據的統計手段。數據挖掘工作的數據分析階段,我們可借助描述性統計來描繪或總結數據的基本情況,一來可以梳理自己的思維,二來可以更好地向他人展示數據分析結果。數值分析的過程中,我們往往要計算出數據的統計特征,用來做科學計算的NumPy和SciPy工具可以滿足我們的需求。Matpotlob工具可用來繪制圖,滿足圖分析的需求。

2 使用NumPy和SciPy進行數值分析

2.1 基本概念

與Python中原生的List類型不同,Numpy中用ndarray類型來描述一組數據:

from numpy import array  
    from numpy.random import normal, randint  
    #使用List來創造一組數據  
    data = [1, 2, 3]  
    #使用ndarray來創造一組數據  
    data = array([1, 2, 3])  
    #創造一組服從正態分布的定量數據  
    data = normal(0, 10, size=10)  
    #創造一組服從均勻分布的定性數據  
    data = randint(0, 10, size=10) 
2.2 中心位置(均值、中位數、眾數)

數據的中心位置是我們最容易想到的數據特征。借由中心位置,我們可以知道數據的一個平均情況,如果要對新數據進行預測,那么平均情況是非常直觀地選擇。數據的中心位置可分為均值(Mean),中位數(Median),眾數(Mode)。其中均值和中位數用于定量的數據,眾數用于定性的數據。

對于定量數據(Data)來說,均值是總和除以總量(N),中位數是數值大小位于中間(奇偶總量處理不同)的值:

均值相對中位數來說,包含的信息量更大,但是容易受異常的影響。使用NumPy計算均值與中位數:

from numpy import mean, median  
      
    #計算均值  
    mean(data)  
    #計算中位數  
    median(data)  

對于定性數據來說,眾數是出現次數最多的值,使用SciPy計算眾數:

[python] view plain copy

    from scipy.stats import mode  
      
    #計算眾數  
    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 回顧

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(1726)  
  14.             if 0 < height: break  
  15.         while True:  
  16.             #體重由身高作為自變量的線性回歸模型產生,誤差服從標準正態分布  
  17.             weight = (height - 80) * 0.7 + normal(01)  
  18.             if 0 < weight: break  
  19.         while True:  
  20.             #分數服從均值為70,標準差為15的正態分布  
  21.             score = normal(7015)  
  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()  
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, 0for 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, 0for 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繪制散點圖的代碼如下:


  1. from matplotlib import pyplot  
  2.   
  3. #繪制散點圖  
  4. def drawScatter(heights, weights):  
  5.     #創建散點圖  
  6.     #第一個參數為點的橫坐標  
  7.     #第二個參數為點的縱坐標  
  8.     pyplot.scatter(heights, weights)  
  9.     pyplot.xlabel('Heights')  
  10.     pyplot.ylabel('Weights')  
  11.     pyplot.title('Heights & Weights Of Male Students')  
  12.     pyplot.show()  
  13.   
  14. 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種信息:


  1. Q2所指的紅線為中位數
  2. Q1所指的藍框下側為下四分位數,Q3所指的藍框上側為上四分位數,Q3-Q1為四分為差。四分位差也是衡量數據的發散程度的指標之一。
  3. 上界線和下界線是距離中位數1.5倍四分位差的線,高于上界線或者低于下界線的數據為異常值。


3.5 回顧

4 總結

描述性統計是容易操作,直觀簡潔的數據分析手段。但是由于簡單,對多元變量的關系難以描述?,F實生活中,自變量通常是多元的:決定體重不僅有身高,還有飲食習慣,肥胖基因等等因素。通過一些高級的數據處理手段,我們可以對多元變量進行處理,例如特征工程中,可以使用互信息方法來選擇多個對因變量有較強相關性的自變量作為特征,還可以使用主成分分析法來消除一些冗余的自變量來降低運算復雜度。


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢