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
描述性統計是藉助圖表或者總結性的數值來描述數據的統計手段。數據挖掘工做的數據分析階段,咱們可藉助描述性統計來描繪或總結數據的基本狀況,一來能夠梳理本身的思惟,二來能夠更好地向他人展現數據分析結果。數值分析的過程當中,咱們每每要計算出數據的統計特徵,用來作科學計算的NumPy和SciPy工具能夠知足咱們的需求。Matpotlob工具可用來繪製圖,知足圖分析的需求。函數
與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)
數據的中心位置是咱們最容易想到的數據特徵。藉由中心位置,咱們能夠知道數據的一個平均狀況,若是要對新數據進行預測,那麼平均狀況是很是直觀 地選擇。數據的中心位置可分爲均值(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)
對數據的中心位置有所瞭解之後,通常咱們會想要知道數據以中心位置爲標準有多發散。若是以中心位置來預測新數據,那麼發散程度決定了預測的準確 性。數據的發散程度可用極差(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)
以前提到均值容易受異常值影響,那麼如何衡量誤差,誤差到多少算異常是兩個必需要解決的問題。定義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將視爲異常。
有兩組數據時,咱們關心這兩組數據是否相關,相關程度有多少。用協方差(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)
包 | 方法 | 說明 |
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 | 計算相關係數 |
使用圖分析能夠更加直觀地展現數據的分佈(頻數分析)和關係(關係分析)。柱狀圖和餅形圖是對定性數據進行頻數分析的經常使用工具,使用前需將每一 類的頻數計算出來。直方圖和累積曲線是對定量數據進行頻數分析的經常使用工具,直方圖對應密度函數而累積曲線對應分佈函數。散點圖可用來對兩組數據的關係進行 描述。在沒有分析目標時,須要對數據進行探索性的分析,箱形圖將幫助咱們完成這一任務。
在此,咱們使用一組容量爲10000的男學生身高,體重,成績數據來說解如何使用Matplotlib繪製以上圖形,建立數據的代碼以下:
柱狀圖是以柱的高度來指代某種類型的頻數,使用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)
繪製出來的餅形圖效果以下:
直方圖相似於柱狀圖,是用柱的高度來指代頻數,不一樣的是其將定量數據劃分爲若干連續的區間,在這些連續的區間上繪製柱。使用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)
累積曲線對應數據的分佈函數,因爲身高變量是屬於服從正態分佈的,從繪製出來的累積曲線圖上也能夠直觀地看出來:
在散點圖中,分別以自變量和因變量做爲橫縱座標。當自變量與因變量線性相關時,在散點圖中,點近似分佈在一條直線上。咱們以身高做爲自變量,體重做爲因變量,討論身高對體重的影響。使用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)
咱們在建立數據時,體重這一變量的確是由身高變量經過線性迴歸產生,繪製出來的散點圖以下:
在不明確數據分析的目標時,咱們對數據進行一些探索性的分析,經過咱們能夠知道數據的中心位置,發散程度以及誤差程度。使用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種信息:
方法 | 說明 |
bar | 柱狀圖 |
pie | 餅形圖 |
hist | 直方圖&累積曲線 |
scatter | 散點圖 |
boxplot | 箱形圖 |
xticks | 設置柱的文字說明 |
xlabel | 橫座標的文字說明 |
ylabel | 縱座標的文字說明 |
title | 標題 |
show | 繪圖 |
描述性統計是容易操做,直觀簡潔的數據分析手段。可是因爲簡單,對多元變量的關係難以描述。現實生活中,自變量一般是多元的:決定體重不只有身 高,還有飲食習慣,肥胖基因等等因素。經過一些高級的數據處理手段,咱們能夠對多元變量進行處理,例如特徵工程中,可使用互信息方法來選擇多個對因變量 有較強相關性的自變量做爲特徵,還可使用主成分分析法來消除一些冗餘的自變量來下降運算複雜度。