2 使用NumPy和SciPy進行數(shù)值分析2.1 基本概念與Python中原生的List類型不同,,Numpy中用ndarray類型來描述一組數(shù)據(jù): 1 from numpy import array 2 from numpy.random import normal, randint 3 #使用List來創(chuàng)造一組數(shù)據(jù) 4 data = [1, 2, 3] 5 #使用ndarray來創(chuàng)造一組數(shù)據(jù) 6 data = array([1, 2, 3]) 7 #創(chuàng)造一組服從正態(tài)分布的定量數(shù)據(jù) 8 data = normal(0, 10, size=10) 9 #創(chuàng)造一組服從均勻分布的定性數(shù)據(jù)10 data = randint(0, 10, size=10) 2.2 中心位置(均值、中位數(shù),、眾數(shù))數(shù)據(jù)的中心位置是我們最容易想到的數(shù)據(jù)特征,。借由中心位置,我們可以知道數(shù)據(jù)的一個平均情況,,如果要對新數(shù)據(jù)進行預測,,那么平均情況是非常直觀地選擇。數(shù)據(jù)的中心位置可分為均值(Mean),,中位數(shù)(Median),,眾數(shù)(Mode)。其中均值和中位數(shù)用于定量的數(shù)據(jù),,眾數(shù)用于定性的數(shù)據(jù),。 對于定量數(shù)據(jù)(Data)來說,均值是總和除以總量(N),,中位數(shù)是數(shù)值大小位于中間(奇偶總量處理不同)的值: 均值相對中位數(shù)來說,,包含的信息量更大,,但是容易受異常的影響。使用NumPy計算均值與中位數(shù): 對于定性數(shù)據(jù)來說,,眾數(shù)是出現(xiàn)次數(shù)最多的值,,使用SciPy計算眾數(shù): 2.3 發(fā)散程度(極差、方差,、標準差,、變異系數(shù))對數(shù)據(jù)的中心位置有所了解以后,一般我們會想要知道數(shù)據(jù)以中心位置為標準有多發(fā)散,。如果以中心位置來預測新數(shù)據(jù),,那么發(fā)散程度決定了預測的準確性。數(shù)據(jù)的發(fā)散程度可用極差(PTP),、方差(Variance),、標準差(STD)、變異系數(shù)(CV)來衡量,,它們的計算方法如下: 極差是只考慮了最大值和最小值的發(fā)散程度指標,,相對來說,方差包含了更多的信息,,標準差基于方差但是與原始數(shù)據(jù)同量級,,變異系數(shù)基于標準差但是進行了無量綱處理。使用NumPy計算極差,、方差,、標準差和變異系數(shù): 1 from numpy import mean, ptp, var, std 2 3 #極差 4 ptp(data) 5 #方差 6 var(data) 7 #標準差 8 std(data) 9 #變異系數(shù)10 mean(data) / std(data) 2.4 偏差程度(z-分數(shù))之前提到均值容易受異常值影響,那么如何衡量偏差,,偏差到多少算異常是兩個必須要解決的問題,。定義z-分數(shù)(Z-Score)為測量值距均值相差的標準差數(shù)目: 當標準差不為0且不為較接近于0的數(shù)時,z-分數(shù)是有意義的,,使用NumPy計算z-分數(shù): 通常來說,,z-分數(shù)的絕對值大于3將視為異常。 2.5 相關程度有兩組數(shù)據(jù)時,,我們關心這兩組數(shù)據(jù)是否相關,,相關程度有多少。用協(xié)方差(COV)和相關系數(shù)(CORRCOEF)來衡量相關程度: 協(xié)方差的絕對值越大表示相關程度越大,,協(xié)方差為正值表示正相關,,負值為負相關,0為不相關,。相關系數(shù)是基于協(xié)方差但進行了無量綱處理,。使用NumPy計算協(xié)方差和相關系數(shù): 1 from numpy import array, cov, corrcoef 2 3 data = array([data1, data2]) 4 5 #計算兩組數(shù)的協(xié)方差 6 #參數(shù)bias=1表示結果需要除以N,否則只計算了分子部分 7 #返回結果為矩陣,第i行第j列的數(shù)據(jù)表示第i組數(shù)與第j組數(shù)的協(xié)方差,。對角線為方差 8 cov(data, bias=1) 9 10 #計算兩組數(shù)的相關系數(shù)11 #返回結果為矩陣,,第i行第j列的數(shù)據(jù)表示第i組數(shù)與第j組數(shù)的相關系數(shù)。對角線為112 corrcoef(data) 2.6 回顧
3 使用Matplotlib進行圖分析3.1 基本概念使用圖分析可以更加直觀地展示數(shù)據(jù)的分布(頻數(shù)分析)和關系(關系分析),。柱狀圖和餅形圖是對定性數(shù)據(jù)進行頻數(shù)分析的常用工具,,使用前需將每一類的頻數(shù)計算出來。直方圖和累積曲線是對定量數(shù)據(jù)進行頻數(shù)分析的常用工具,,直方圖對應密度函數(shù)而累積曲線對應分布函數(shù),。散點圖可用來對兩組數(shù)據(jù)的關系進行描述。在沒有分析目標時,,需要對數(shù)據(jù)進行探索性的分析,,箱形圖將幫助我們完成這一任務。 在此,,我們使用一組容量為10000的男學生身高,,體重,成績數(shù)據(jù)來講解如何使用Matplotlib繪制以上圖形,,創(chuàng)建數(shù)據(jù)的代碼如下: 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的正態(tài)分布13 height = normal(172, 6)14 if 0 < height: break15 while True:16 #體重由身高作為自變量的線性回歸模型產(chǎn)生,誤差服從標準正態(tài)分布17 weight = (height - 80) * 0.7 + normal(0, 1)18 if 0 < weight: break19 while True:20 #分數(shù)服從均值為70,,標準差為15的正態(tài)分布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 break25 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 頻數(shù)分析3.2.1 定性分析(柱狀圖、餅形圖)柱狀圖是以柱的高度來指代某種類型的頻數(shù),,使用Matplotlib對成績這一定性變量繪制柱狀圖的代碼如下: 1 from matplotlib import pyplot 2 3 #繪制柱狀圖 4 def drawBar(grades): 5 xticks = ['A', 'B', 'C', 'D', 'E'] 6 gradeGroup = {} 7 #對每一類成績進行頻數(shù)統(tǒng)計 8 for grade in grades: 9 gradeGroup[grade] = gradeGroup.get(grade, 0) + 110 #創(chuàng)建柱狀圖11 #第一個參數(shù)為柱的橫坐標12 #第二個參數(shù)為柱的高度13 #參數(shù)align為柱的對齊方式,,以第一個參數(shù)為參考標準14 pyplot.bar(range(5), [gradeGroup.get(xtick, 0) for xtick in xticks], align='center')15 16 #設置柱的文字說明17 #第一個參數(shù)為文字說明的橫坐標18 #第二個參數(shù)為文字說明的內容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 #創(chuàng)建餅形圖10 #第一個參數(shù)為扇形的面積11 #labels參數(shù)為扇形的說明文字12 #autopct參數(shù)為扇形占比的顯示格式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 定量分析(直方圖,、累積曲線)直方圖類似于柱狀圖,,是用柱的高度來指代頻數(shù),不同的是其將定量數(shù)據(jù)劃分為若干連續(xù)的區(qū)間,,在這些連續(xù)的區(qū)間上繪制柱,。使用Matplotlib對身高這一定量變量繪制直方圖的代碼如下: 1 from matplotlib import pyplot 2 3 #繪制直方圖 4 def drawHist(heights): 5 #創(chuàng)建直方圖 6 #第一個參數(shù)為待繪制的定量數(shù)據(jù),不同于定性數(shù)據(jù),,這里并沒有事先進行頻數(shù)統(tǒng)計 7 #第二個參數(shù)為劃分的區(qū)間個數(shù) 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) 直方圖對應數(shù)據(jù)的密度函數(shù),,由于身高變量是屬于服從正態(tài)分布的,從繪制出來的直方圖上也可以直觀地看出來: 使用Matplotlib對身高這一定量變量繪制累積曲線的代碼如下: 1 from matplotlib import pyplot 2 3 #繪制累積曲線 4 def drawCumulativeHist(heights): 5 #創(chuàng)建累積曲線 6 #第一個參數(shù)為待繪制的定量數(shù)據(jù) 7 #第二個參數(shù)為劃分的區(qū)間個數(shù) 8 #normed參數(shù)為是否無量綱化 9 #histtype參數(shù)為'step',,繪制階梯狀的曲線10 #cumulative參數(shù)為是否累積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) 累積曲線對應數(shù)據(jù)的分布函數(shù),,由于身高變量是屬于服從正態(tài)分布的,從繪制出來的累積曲線圖上也可以直觀地看出來: 3.3 關系分析(散點圖)在散點圖中,,分別以自變量和因變量作為橫縱坐標,。當自變量與因變量線性相關時,在散點圖中,,點近似分布在一條直線上,。我們以身高作為自變量,,體重作為因變量,討論身高對體重的影響,。使用Matplotlib繪制散點圖的代碼如下: from matplotlib import pyplot#繪制散點圖def drawScatter(heights, weights): #創(chuàng)建散點圖 #第一個參數(shù)為點的橫坐標 #第二個參數(shù)為點的縱坐標 pyplot.scatter(heights, weights) pyplot.xlabel('Heights') pyplot.ylabel('Weights') pyplot.title('Heights & Weights Of Male Students') pyplot.show()drawScatter(heights, weights) 我們在創(chuàng)建數(shù)據(jù)時,,體重這一變量的確是由身高變量通過線性回歸產(chǎn)生,繪制出來的散點圖如下: 3.4 探索分析(箱形圖)在不明確數(shù)據(jù)分析的目標時,,我們對數(shù)據(jù)進行一些探索性的分析,,通過我們可以知道數(shù)據(jù)的中心位置,發(fā)散程度以及偏差程度,。使用Matplotlib繪制關于身高的箱形圖的代碼如下: 1 from matplotlib import pyplot 2 3 #繪制箱形圖 4 def drawBox(heights): 5 #創(chuàng)建箱形圖 6 #第一個參數(shù)為待繪制的定量數(shù)據(jù) 7 #第二個參數(shù)為數(shù)據(jù)的文字說明 8 pyplot.boxplot([heights], labels=['Heights']) 9 pyplot.title('Heights Of Male Students')10 pyplot.show()11 12 drawBox(heights) 繪制出來的箱形圖中,,包含3種信息:
3.5 回顧
4 總結描述性統(tǒng)計是容易操作,直觀簡潔的數(shù)據(jù)分析手段,。但是由于簡單,,對多元變量的關系難以描述。現(xiàn)實生活中,,自變量通常是多元的:決定體重不僅有身高,,還有飲食習慣,肥胖基因等等因素,。通過一些高級的數(shù)據(jù)處理手段,,我們可以對多元變量進行處理,例如特征工程中,,可以使用互信息方法來選擇多個對因變量有較強相關性的自變量作為特征,,還可以使用主成分分析法來消除一些冗余的自變量來降低運算復雜度。 5 參考資料 |
|
來自: 長幸福lZg > 《數(shù)椐分析》