使用Python進行描述性統計

目錄

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 參考資料dom


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)。其中均值和中位數用於定量的數據,衆數用於定性的數據。spa

  對於定量數據(Data)來講,均值是總和除以總量(N),中位數是數值大小位於中間(奇偶總量處理不一樣)的值:.net

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

複製代碼
1 from numpy import mean, median 2 3 #計算均值 4 mean(data) 5 #計算中位數 6 median(data)
複製代碼

  對於定性數據來講,衆數是出現次數最多的值,使用SciPy計算衆數:code

1 from scipy.stats import mode 2 3 #計算衆數 4 mode(data)

2.3 發散程度(極差、方差、標準差、變異係數)

  對數據的中心位置有所瞭解之後,通常咱們會想要知道數據以中心位置爲標準有多發散。若是以中心位置來預測新數據,那麼發散程度決定了預測的準確 性。數據的發散程度可用極差(PTP)、方差(Variance)、標準差(STD)、變異係數(CV)來衡量,它們的計算方法以下:orm

  極差是隻考慮了最大值和最小值的發散程度指標,相對來講,方差包含了更多的信息,標準差基於方差可是與原始數據同量級,變異係數基於標準差可是進行了無量綱處理。使用NumPy計算極差、方差、標準差和變異係數:blog

複製代碼
 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)爲測量值距均值相差的標準差數目:ip

  當標準差不爲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繪製以上圖形,建立數據的代碼以下:

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種信息:

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

3.5 回顧

方法 說明
bar 柱狀圖
pie 餅形圖
hist 直方圖&累積曲線
scatter 散點圖
boxplot 箱形圖
xticks 設置柱的文字說明
xlabel 橫座標的文字說明
ylabel 縱座標的文字說明
title 標題
show 繪圖

4 總結

  描述性統計是容易操做,直觀簡潔的數據分析手段。可是因爲簡單,對多元變量的關係難以描述。現實生活中,自變量一般是多元的:決定體重不只有身 高,還有飲食習慣,肥胖基因等等因素。經過一些高級的數據處理手段,咱們能夠對多元變量進行處理,例如特徵工程中,可使用互信息方法來選擇多個對因變量 有較強相關性的自變量做爲特徵,還可使用主成分分析法來消除一些冗餘的自變量來下降運算複雜度。


5 參考資料

  1. 描述性統計
  2. 使用NumPy進行科學計算
相關文章
相關標籤/搜索