1. 程式人生 > >python描述性統計分析

python描述性統計分析

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)