python描述性統計分析
阿新 • • 發佈:2018-12-14
1、 數值分析
from numpy import array from numpy.random import normal, randint list_data = [1, 2, 3] #使用List來創造一組資料 array_data = array([1, 2, 3]) #使用array來創造一組資料 normal_data = normal(0, 10, size=100) #創造一組服從正態分佈的定量資料 randint_data = randint(0, 10, size=100) #創造一組服從均勻分佈的定性資料 #定量:均值、中位數 定性:眾數 藉由資料的中心位置,我們可以知道資料的一個平均情況 from numpy import mean, median from scipy.stats import mode list_data_mean = mean(list_data) list_data_median = median(list_data) list_data_mode = mode(list_data) randint_data_mean = mean(randint_data) #均值相對於中位數來說,包含的資訊量更大,但是更容易受異常影響 randint_data_median = median(randint_data) randint_data_mode = mode(randint_data) #眾數是出現次數最多的值 #對資料的中心位置有所瞭解以後,一般我們會想要知道資料以中心位置為標準有多發散 #如果以中心位置來預測新資料,那麼發散程度決定了預測的準確性,資料的發散成都可用極差、方差、標準差、變異係數來衡量 #極差是隻考慮了最大值和最小值的發散程度指標,相對來說,方差包含了更多的資訊,標準差基於方差但是與原始資料同量級 #變異係數基於標準差但是進行了無量綱處理 from numpy import ptp, var, std list_data_ptp = ptp(list_data) #極差 list_data_var = var(list_data) #方差 list_data_std = std(list_data) #標準差 list_data_mean_std = mean(list_data) / std(list_data) normal_data_ptp = ptp(normal_data) normal_data_var = var(normal_data) normal_data_std = std(normal_data) normal_data_mean_std = mean(normal_data) / std(normal_data) #之前提到均值容易受異常值影響,那麼如何衡量偏差,偏差到多少算異常是兩個必須要解決的問題 #定義z-score為測量值距均值相差的標準差數目,當標準差不為0且不接近於0的數時,z-分數是有意義的 list_data_zscore = [] randint_data_zscore = [] for i in range(0, len(list_data), 1): # 通常來說z分數的絕對值大於3將視為異常 list_data_i_zscore = (list_data[i] - mean(list_data)) / std(list_data) list_data_zscore.append(list_data_i_zscore) for j in range(0, len(randint_data), 1): randint_data_i_zscore = (randint_data[i] - mean(randint_data)) / std(randint_data) randint_data_zscore.append(randint_data_i_zscore) #有兩組資料時,我們關心這兩組資料是否相關,相關程度有多少。用協方差(COV)和相關係數(CORRCOEF)來衡量相關程度 #協方差的絕對值越大表示相關程度越大,協方差為正值表示正相關,負值為負相關,0為不相關 #相關係數是基於協方差但進行了無量綱處理 from numpy import cov, corrcoef data1 = [1, 2, 3, 4, 0 ,4, 5, 7, 9, 1] data2 = [0, 2, 3, 2, 0, 4, 5, 7, 9, 0] data = array([data1, data2]) #計算兩組數的協方差,引數bias=1表示結果需要除以N,否則只計算了分子部分 #返回結果為矩陣,第i行第j列的資料表示第i組數與第j組數的協方差,對角線為方差 data_cov = cov(data, bias=1) #cov=(i到n求和)(data1[i]-mean1)*(data2[i]-mean2)/N #計算兩組數的相關係數,返回結果為矩陣,第i行第j列的資料表示第i組數與第j組數的相關係數,對角線為1 data_corrcoef = corrcoef(data) #corrcoef=cov/std1*std2 print (data) print (data_cov) print (data_corrcoef) 2、 圖形分析
#使用圖分析可以更加直觀地展示資料的分佈(頻數分析)和關係(關係分析) #柱狀圖和餅狀圖是對定性資料進行頻數分析的常用工具,使用前需將每一類的頻數計算出來 #直方圖和累積曲線是對定量資料進行頻數分析的常用工具,直方圖對應密度函式而累積曲線對應分佈函式 #散點圖可用來對兩組資料的關係進行描述 #在沒有分析目標時,需要對資料進行探索性分析,箱形圖可以完成這一任務 from gen_data import Gen_data from matplotlib import pyplot #繪製柱狀圖 def drawBar(grades): xticks = ['A', 'B', 'C', 'D', 'E'] gradeGroup = {} #對每一類成績進行頻數統計 for grade in grades: gradeGroup[grade] = gradeGroup.get(grade, 0) + 1 print (gradeGroup) #建立柱狀圖 #第一個引數為柱的橫座標 #第二個引數為柱的高度 #引數align為柱的對齊方式,以第一個引數為參考標準 pyplot.bar(range(5), [gradeGroup.get(xtick, 0) for xtick in xticks], align='center') #設定柱的文字說明 #第一個引數為文字說明的橫座標 #第二個引數為文字說明的內容 pyplot.xticks(range(5), xticks) #設定橫座標的文字說明 pyplot.xlabel('Grade') #設定縱座標的文字說明 pyplot.ylabel('Frequency') #設定標題 pyplot.title('Grades Of Male Students') #繪圖 pyplot.show() #繪製餅形圖 def drawPie(grades): labels = ['A', 'B', 'C', 'D', 'E'] gradeGroup = {} for grade in grades: gradeGroup[grade] = gradeGroup.get(grade, 0) + 1 print(gradeGroup) #建立餅形圖 #第一個引數為扇形的面積 #labels引數為扇形的說明文字 #autopct引數為扇形佔比的顯示格式 pyplot.pie([gradeGroup.get(label, 0) for label in labels], labels=labels, autopct='%1.1f%%') pyplot.title('Grades Of Male Students') pyplot.show() #繪製直方圖 def drawHist(heights): #建立直方圖 #第一個引數為待繪製的定量資料,不同於定性資料,這裡並沒有事先進行頻數統計 #第二個引數為劃分的區間個數 pyplot.hist(heights, 100) pyplot.xlabel('Heights') pyplot.ylabel('Frequency') pyplot.title('Heights Of Male Students') pyplot.show() #繪製累積曲線 def drawCumulativeHist(heights): #建立累積曲線 #第一個引數為待繪製的定量資料 #第二個引數為劃分的區間個數 #normed引數為是否無量綱化 #histtype引數為'step',繪製階梯狀的曲線 #cumulative引數為是否累積 pyplot.hist(heights, 20, normed=True, histtype='step', cumulative=True) pyplot.xlabel('Heights') pyplot.ylabel('Frequency') pyplot.title('Heights Of Male Students') pyplot.show() #繪製散點圖 def drawScatter(heights, weights): #建立散點圖 #第一個引數為點的橫座標 #第二個引數為點的縱座標 pyplot.scatter(heights, weights) pyplot.xlabel('Heights') pyplot.ylabel('Weights') pyplot.title('Heights & Weights Of Male Students') pyplot.show() #繪製箱形圖 def drawBox(heights): #建立箱形圖 #第一個引數為待繪製的定量資料 #第二個引數為資料的文字說明 pyplot.boxplot([heights], labels=['Heights']) pyplot.title('Heights Of Male Students') pyplot.show() #繪製箱形圖 def drawBox(heights): #建立箱形圖 #第一個引數為待繪製的定量資料 #第二個引數為資料的文字說明 pyplot.boxplot([heights], labels=['Heights']) pyplot.title('Heights Of Male Students') pyplot.show() if __name__ == '__main__': gen_data = Gen_data.genData(Gen_data) #頻數分析——性分析——柱狀圖 #drawBar(gen_data.grades) #頻數分析——定性分析——餅狀圖 #drawPie(gen_data.grades) #頻數分析——定量分析——直方圖 #drawHist(gen_data.heights) #頻數分析——定量分析——累積曲線 #drawCumulativeHist(gen_data.heights) #關係分析——散點圖 #drawScatter(gen_data.heights, gen_data.weights) #探索分析——箱形圖 drawBox(gen_data.heights)