99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

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

使用Python進行描述性統(tǒng)計

1 描述性統(tǒng)計是什么?

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

2 使用NumPy和SciPy進行數(shù)值分析

2.1 基本概念

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

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

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

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

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

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

對于定性數(shù)據(jù)來說,眾數(shù)是出現(xiàn)次數(shù)最多的值,使用SciPy計算眾數(shù):

[python] view plain copy

    from scipy.stats import mode  
      
    #計算眾數(shù)  
    mode(data)

2.3 發(fā)散程度(極差、方差、標(biāo)準(zhǔn)差、變異系數(shù))

對數(shù)據(jù)的中心位置有所了解以后,一般我們會想要知道數(shù)據(jù)以中心位置為標(biāo)準(zhǔn)有多發(fā)散。如果以中心位置來預(yù)測新數(shù)據(jù),那么發(fā)散程度決定了預(yù)測的準(zhǔn)確性。數(shù)據(jù)的發(fā)散程度可用極差(PTP)、方差(Variance)、標(biāo)準(zhǔn)差(STD)、變異系數(shù)(CV)來衡量,它們的計算方法如下:

極差是只考慮了最大值和最小值的發(fā)散程度指標(biāo),相對來說,方差包含了更多的信息,標(biāo)準(zhǔn)差基于方差但是與原始數(shù)據(jù)同量級,變異系數(shù)基于標(biāo)準(zhǔn)差但是進行了無量綱處理。使用NumPy計算極差、方差、標(biāo)準(zhǔn)差和變異系數(shù):

  1. from numpy import mean, ptp, var, std  
  2.   
  3. #極差  
  4. ptp(data)  
  5. #方差  
  6. var(data)  
  7. #標(biāo)準(zhǔn)差  
  8. std(data)  
  9. #變異系數(shù)  
  10. mean(data) / std(data)  

2.4 偏差程度(z-分數(shù))

之前提到均值容易受異常值影響,那么如何衡量偏差,偏差到多少算異常是兩個必須要解決的問題。定義z-分數(shù)(Z-Score)為測量值距均值相差的標(biāo)準(zhǔn)差數(shù)目:

當(dāng)標(biāo)準(zhǔn)差不為0且不為較接近于0的數(shù)時,z-分數(shù)是有意義的,使用NumPy計算z-分數(shù):

  1. from numpy import mean, std  
  2.   
  3. #計算第一個值的z-分數(shù)  
  4. (data[0]-mean(data)) / std(data) 

通常來說,z-分數(shù)的絕對值大于3將視為異常

2.5 相關(guān)程度

有兩組數(shù)據(jù)時,我們關(guān)心這兩組數(shù)據(jù)是否相關(guān),相關(guān)程度有多少。用協(xié)方差(COV)和相關(guān)系數(shù)(CORRCOEF)來衡量相關(guān)程度:

協(xié)方差的絕對值越大表示相關(guān)程度越大,協(xié)方差為正值表示正相關(guān),負值為負相關(guān),0為不相關(guān)。相關(guān)系數(shù)是基于協(xié)方差但進行了無量綱處理。使用NumPy計算協(xié)方差和相關(guān)系數(shù):

  1. from numpy import array, cov, corrcoef  
  2.   
  3. data = array([data1, data2])  
  4.   
  5. #計算兩組數(shù)的協(xié)方差  
  6. #參數(shù)bias=1表示結(jié)果需要除以N,否則只計算了分子部分  
  7. #返回結(jié)果為矩陣,第i行第j列的數(shù)據(jù)表示第i組數(shù)與第j組數(shù)的協(xié)方差。對角線為方差  
  8. cov(data, bias=1)  
  9.   
  10. #計算兩組數(shù)的相關(guān)系數(shù)  
  11. #返回結(jié)果為矩陣,第i行第j列的數(shù)據(jù)表示第i組數(shù)與第j組數(shù)的相關(guān)系數(shù)。對角線為1  
  12. corrcoef(data) 

2.6 回顧

3 使用Matplotlib進行圖分析

3.1 基本概念

使用圖分析可以更加直觀地展示數(shù)據(jù)的分布(頻數(shù)分析)和關(guān)系(關(guān)系分析)。柱狀圖和餅形圖是對定性數(shù)據(jù)進行頻數(shù)分析的常用工具,使用前需將每一類的頻數(shù)計算出來。直方圖和累積曲線是對定量數(shù)據(jù)進行頻數(shù)分析的常用工具,直方圖對應(yīng)密度函數(shù)而累積曲線對應(yīng)分布函數(shù)。散點圖可用來對兩組數(shù)據(jù)的關(guān)系進行描述。在沒有分析目標(biāo)時,需要對數(shù)據(jù)進行探索性的分析,箱形圖將幫助我們完成這一任務(wù)。

在此,我們使用一組容量為10000的男學(xué)生身高,體重,成績數(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,標(biāo)準(zhǔn)差為6的正態(tài)分布  
  13.             height = normal(1726)  
  14.             if 0 < height: break  
  15.         while True:  
  16.             #體重由身高作為自變量的線性回歸模型產(chǎn)生,誤差服從標(biāo)準(zhǔn)正態(tài)分布  
  17.             weight = (height - 80) * 0.7 + normal(01)  
  18.             if 0 < weight: break  
  19.         while True:  
  20.             #分數(shù)服從均值為70,標(biāo)準(zhǔn)差為15的正態(tài)分布  
  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 頻數(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) + 1  
  10.     #創(chuàng)建柱狀圖  
  11.     #第一個參數(shù)為柱的橫坐標(biāo)  
  12.     #第二個參數(shù)為柱的高度  
  13.     #參數(shù)align為柱的對齊方式,以第一個參數(shù)為參考標(biāo)準(zhǔn)  
  14.     pyplot.bar(range(5), [gradeGroup.get(xtick, 0for xtick in xticks], align='center')  
  15.   
  16.     #設(shè)置柱的文字說明  
  17.     #第一個參數(shù)為文字說明的橫坐標(biāo)  
  18.     #第二個參數(shù)為文字說明的內(nèi)容  
  19.     pyplot.xticks(range(5), xticks)  
  20.   
  21.     #設(shè)置橫坐標(biāo)的文字說明  
  22.     pyplot.xlabel('Grade')  
  23.     #設(shè)置縱坐標(biāo)的文字說明  
  24.     pyplot.ylabel('Frequency')  
  25.     #設(shè)置標(biāo)題  
  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, 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 定量分析(直方圖、累積曲線)

直方圖類似于柱狀圖,是用柱的高度來指代頻數(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)  
直方圖對應(yīng)數(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)  
累積曲線對應(yīng)數(shù)據(jù)的分布函數(shù),由于身高變量是屬于服從正態(tài)分布的,從繪制出來的累積曲線圖上也可以直觀地看出來:


3.3 關(guān)系分析(散點圖

散點圖中,分別以自變量和因變量作為橫縱坐標(biāo)。當(dāng)自變量與因變量線性相關(guān)時,在散點圖中,點近似分布在一條直線上。我們以身高作為自變量,體重作為因變量,討論身高對體重的影響。使用Matplotlib繪制散點圖的代碼如下:


  1. from matplotlib import pyplot  
  2.   
  3. #繪制散點圖  
  4. def drawScatter(heights, weights):  
  5.     #創(chuàng)建散點圖  
  6.     #第一個參數(shù)為點的橫坐標(biāo)  
  7.     #第二個參數(shù)為點的縱坐標(biāo)  
  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)  
我們在創(chuàng)建數(shù)據(jù)時,體重這一變量的確是由身高變量通過線性回歸產(chǎn)生,繪制出來的散點圖如下:


3.4 探索分析(箱形圖)

在不明確數(shù)據(jù)分析的目標(biāo)時,我們對數(shù)據(jù)進行一些探索性的分析,通過我們可以知道數(shù)據(jù)的中心位置,發(fā)散程度以及偏差程度。使用Matplotlib繪制關(guān)于身高的箱形圖的代碼如下:


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


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


3.5 回顧

4 總結(jié)

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


數(shù)據(jù)分析咨詢請掃描二維碼

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

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }