用python做频数分析_使用Python进行描述性统计
2 使用NumPy和SciPy進(jìn)行數(shù)值分析
2.1 基本概念
1 from numpy import array
2 from numpy.random import normal, randint
3 #使用List來(lái)創(chuàng)造一組數(shù)據(jù)
4 data = [1, 2, 3]
5 #使用ndarray來(lái)創(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ù)的一個(gè)平均情況,如果要對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè),那么平均情況是非常直觀地選擇。數(shù)據(jù)的中心位置可分為均值(Mean),中位數(shù)(Median),眾數(shù)(Mode)。其中均值和中位數(shù)用于定量的數(shù)據(jù),眾數(shù)用于定性的數(shù)據(jù)。
對(duì)于定量數(shù)據(jù)(Data)來(lái)說(shuō),均值是總和除以總量(N),中位數(shù)是數(shù)值大小位于中間(奇偶總量處理不同)的值:
均值相對(duì)中位數(shù)來(lái)說(shuō),包含的信息量更大,但是容易受異常的影響。使用NumPy計(jì)算均值與中位數(shù):
1 from numpy import mean, median
2
3 #計(jì)算均值
4 mean(data)
5 #計(jì)算中位數(shù)
6 median(data)
對(duì)于定性數(shù)據(jù)來(lái)說(shuō),眾數(shù)是出現(xiàn)次數(shù)最多的值,使用SciPy計(jì)算眾數(shù):
1 from scipy.stats import mode
2
3 #計(jì)算眾數(shù)
4 mode(data)
2.3 發(fā)散程度(極差、方差、標(biāo)準(zhǔn)差、變異系數(shù))
對(duì)數(shù)據(jù)的中心位置有所了解以后,一般我們會(huì)想要知道數(shù)據(jù)以中心位置為標(biāo)準(zhǔn)有多發(fā)散。如果以中心位置來(lái)預(yù)測(cè)新數(shù)據(jù),那么發(fā)散程度決定了預(yù)測(cè)的準(zhǔn)確性。數(shù)據(jù)的發(fā)散程度可用極差(PTP)、方差(Variance)、標(biāo)準(zhǔn)差(STD)、變異系數(shù)(CV)來(lái)衡量,它們的計(jì)算方法如下:
極差是只考慮了最大值和最小值的發(fā)散程度指標(biāo),相對(duì)來(lái)說(shuō),方差包含了更多的信息,標(biāo)準(zhǔn)差基于方差但是與原始數(shù)據(jù)同量級(jí),變異系數(shù)基于標(biāo)準(zhǔn)差但是進(jìn)行了無(wú)量綱處理。使用NumPy計(jì)算極差、方差、標(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-分?jǐn)?shù))
之前提到均值容易受異常值影響,那么如何衡量偏差,偏差到多少算異常是兩個(gè)必須要解決的問題。定義z-分?jǐn)?shù)(Z-Score)為測(cè)量值距均值相差的標(biāo)準(zhǔn)差數(shù)目:
當(dāng)標(biāo)準(zhǔn)差不為0且不為較接近于0的數(shù)時(shí),z-分?jǐn)?shù)是有意義的,使用NumPy計(jì)算z-分?jǐn)?shù):
1 from numpy import mean, std
2
3 #計(jì)算第一個(gè)值的z-分?jǐn)?shù)
4 (data[0]-mean(data)) / std(data)
通常來(lái)說(shuō),z-分?jǐn)?shù)的絕對(duì)值大于3將視為異常。
2.5 相關(guān)程度
有兩組數(shù)據(jù)時(shí),我們關(guān)心這兩組數(shù)據(jù)是否相關(guān),相關(guān)程度有多少。用協(xié)方差(COV)和相關(guān)系數(shù)(CORRCOEF)來(lái)衡量相關(guān)程度:
協(xié)方差的絕對(duì)值越大表示相關(guān)程度越大,協(xié)方差為正值表示正相關(guān),負(fù)值為負(fù)相關(guān),0為不相關(guān)。相關(guān)系數(shù)是基于協(xié)方差但進(jìn)行了無(wú)量綱處理。使用NumPy計(jì)算協(xié)方差和相關(guān)系數(shù):
1 from numpy import array, cov, corrcoef
2
3 data = array([data1, data2])
4
5 #計(jì)算兩組數(shù)的協(xié)方差
6 #參數(shù)bias=1表示結(jié)果需要除以N,否則只計(jì)算了分子部分
7 #返回結(jié)果為矩陣,第i行第j列的數(shù)據(jù)表示第i組數(shù)與第j組數(shù)的協(xié)方差。對(duì)角線為方差
8 cov(data, bias=1)
9
10 #計(jì)算兩組數(shù)的相關(guān)系數(shù)
11 #返回結(jié)果為矩陣,第i行第j列的數(shù)據(jù)表示第i組數(shù)與第j組數(shù)的相關(guān)系數(shù)。對(duì)角線為1
12 corrcoef(data)
2.6 回顧
包
方法
說(shuō)明
numpy
array
創(chuàng)造一組數(shù)
numpy.random
normal
創(chuàng)造一組服從正態(tài)分布的定量數(shù)
numpy.random
randint
創(chuàng)造一組服從均勻分布的定性數(shù)
numpy
mean
計(jì)算均值
numpy
median
計(jì)算中位數(shù)
scipy.stats
mode
計(jì)算眾數(shù)
numpy
ptp
計(jì)算極差
numpy
var
計(jì)算方差
numpy
std
計(jì)算標(biāo)準(zhǔn)差
numpy
cov
計(jì)算協(xié)方差
numpy
corrcoef
計(jì)算相關(guān)系數(shù)
3 使用Matplotlib進(jìn)行圖分析
3.1 基本概念
使用圖分析可以更加直觀地展示數(shù)據(jù)的分布(頻數(shù)分析)和關(guān)系(關(guān)系分析)。柱狀圖和餅形圖是對(duì)定性數(shù)據(jù)進(jìn)行頻數(shù)分析的常用工具,使用前需將每一類的頻數(shù)計(jì)算出來(lái)。直方圖和累積曲線是對(duì)定量數(shù)據(jù)進(jìn)行頻數(shù)分析的常用工具,直方圖對(duì)應(yīng)密度函數(shù)而累積曲線對(duì)應(yīng)分布函數(shù)。散點(diǎn)圖可用來(lái)對(duì)兩組數(shù)據(jù)的關(guān)系進(jìn)行描述。在沒有分析目標(biāo)時(shí),需要對(duì)數(shù)據(jù)進(jìn)行探索性的分析,箱形圖將幫助我們完成這一任務(wù)。
在此,我們使用一組容量為10000的男學(xué)生身高,體重,成績(jī)數(shù)據(jù)來(lái)講解如何使用Matplotlib繪制以上圖形,創(chuàng)建數(shù)據(jù)的代碼如下:
View Code
3.2 頻數(shù)分析
3.2.1 定性分析(柱狀圖、餅形圖)
柱狀圖是以柱的高度來(lái)指代某種類型的頻數(shù),使用Matplotlib對(duì)成績(jī)這一定性變量繪制柱狀圖的代碼如下:
1 from matplotlib import pyplot
2
3 #繪制柱狀圖
4 def drawBar(grades):
5 xticks = ['A', 'B', 'C', 'D', 'E']
6 gradeGroup = {}
7 #對(duì)每一類成績(jī)進(jìn)行頻數(shù)統(tǒng)計(jì)
8 for grade in grades:
9 gradeGroup[grade] = gradeGroup.get(grade, 0) + 1
10 #創(chuàng)建柱狀圖
11 #第一個(gè)參數(shù)為柱的橫坐標(biāo)
12 #第二個(gè)參數(shù)為柱的高度
13 #參數(shù)align為柱的對(duì)齊方式,以第一個(gè)參數(shù)為參考標(biāo)準(zhǔn)
14 pyplot.bar(range(5), [gradeGroup.get(xtick, 0) for xtick in xticks], align='center')
15
16 #設(shè)置柱的文字說(shuō)明
17 #第一個(gè)參數(shù)為文字說(shuō)明的橫坐標(biāo)
18 #第二個(gè)參數(shù)為文字說(shuō)明的內(nèi)容
19 pyplot.xticks(range(5), xticks)
20
21 #設(shè)置橫坐標(biāo)的文字說(shuō)明
22 pyplot.xlabel('Grade')
23 #設(shè)置縱坐標(biāo)的文字說(shuō)明
24 pyplot.ylabel('Frequency')
25 #設(shè)置標(biāo)題
26 pyplot.title('Grades Of Male Students')
27 #繪圖
28 pyplot.show()
29
30 drawBar(grades)
繪制出來(lái)的柱狀圖的效果如下:
而餅形圖是以扇形的面積來(lái)指代某種類型的頻率,使用Matplotlib對(duì)成績(jī)這一定性變量繪制餅形圖的代碼如下:
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 #第一個(gè)參數(shù)為扇形的面積
11 #labels參數(shù)為扇形的說(shuō)明文字
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)
繪制出來(lái)的餅形圖效果如下:
3.2.2 定量分析(直方圖、累積曲線)
直方圖類似于柱狀圖,是用柱的高度來(lái)指代頻數(shù),不同的是其將定量數(shù)據(jù)劃分為若干連續(xù)的區(qū)間,在這些連續(xù)的區(qū)間上繪制柱。使用Matplotlib對(duì)身高這一定量變量繪制直方圖的代碼如下:
1 from matplotlib import pyplot
2
3 #繪制直方圖
4 def drawHist(heights):
5 #創(chuàng)建直方圖
6 #第一個(gè)參數(shù)為待繪制的定量數(shù)據(jù),不同于定性數(shù)據(jù),這里并沒有事先進(jìn)行頻數(shù)統(tǒng)計(jì)
7 #第二個(gè)參數(shù)為劃分的區(qū)間個(gè)數(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)
直方圖對(duì)應(yīng)數(shù)據(jù)的密度函數(shù),由于身高變量是屬于服從正態(tài)分布的,從繪制出來(lái)的直方圖上也可以直觀地看出來(lái):
使用Matplotlib對(duì)身高這一定量變量繪制累積曲線的代碼如下:
1 from matplotlib import pyplot
2
3 #繪制累積曲線
4 def drawCumulativeHist(heights):
5 #創(chuàng)建累積曲線
6 #第一個(gè)參數(shù)為待繪制的定量數(shù)據(jù)
7 #第二個(gè)參數(shù)為劃分的區(qū)間個(gè)數(shù)
8 #normed參數(shù)為是否無(wú)量綱化
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)
累積曲線對(duì)應(yīng)數(shù)據(jù)的分布函數(shù),由于身高變量是屬于服從正態(tài)分布的,從繪制出來(lái)的累積曲線圖上也可以直觀地看出來(lái):
3.3 關(guān)系分析(散點(diǎn)圖)
在散點(diǎn)圖中,分別以自變量和因變量作為橫縱坐標(biāo)。當(dāng)自變量與因變量線性相關(guān)時(shí),在散點(diǎn)圖中,點(diǎn)近似分布在一條直線上。我們以身高作為自變量,體重作為因變量,討論身高對(duì)體重的影響。使用Matplotlib繪制散點(diǎn)圖的代碼如下:
from matplotlib import pyplot
#繪制散點(diǎn)圖
def drawScatter(heights, weights):
#創(chuàng)建散點(diǎn)圖
#第一個(gè)參數(shù)為點(diǎn)的橫坐標(biāo)
#第二個(gè)參數(shù)為點(diǎn)的縱坐標(biāo)
pyplot.scatter(heights, weights)
pyplot.xlabel('Heights')
pyplot.ylabel('Weights')
pyplot.title('Heights & Weights Of Male Students')
pyplot.show()
drawScatter(heights, weights)
我們?cè)趧?chuàng)建數(shù)據(jù)時(shí),體重這一變量的確是由身高變量通過線性回歸產(chǎn)生,繪制出來(lái)的散點(diǎn)圖如下:
3.4 探索分析(箱形圖)
在不明確數(shù)據(jù)分析的目標(biāo)時(shí),我們對(duì)數(shù)據(jù)進(jìn)行一些探索性的分析,通過我們可以知道數(shù)據(jù)的中心位置,發(fā)散程度以及偏差程度。使用Matplotlib繪制關(guān)于身高的箱形圖的代碼如下:
1 from matplotlib import pyplot
2
3 #繪制箱形圖
4 def drawBox(heights):
5 #創(chuàng)建箱形圖
6 #第一個(gè)參數(shù)為待繪制的定量數(shù)據(jù)
7 #第二個(gè)參數(shù)為數(shù)據(jù)的文字說(shuō)明
8 pyplot.boxplot([heights], labels=['Heights'])
9 pyplot.title('Heights Of Male Students')
10 pyplot.show()
11
12 drawBox(heights)
繪制出來(lái)的箱形圖中,包含3種信息:
Q2所指的紅線為中位數(shù)
Q1所指的藍(lán)框下側(cè)為下四分位數(shù),Q3所指的藍(lán)框上側(cè)為上四分位數(shù),Q3-Q1為四分為差。四分位差也是衡量數(shù)據(jù)的發(fā)散程度的指標(biāo)之一。
上界線和下界線是距離中位數(shù)1.5倍四分位差的線,高于上界線或者低于下界線的數(shù)據(jù)為異常值。
3.5 對(duì)比分析
3.6 回顧
方法
說(shuō)明
bar
柱狀圖
pie
餅形圖
hist
直方圖&累積曲線
scatter
散點(diǎn)圖
boxplot
箱形圖
xticks
設(shè)置柱的文字說(shuō)明
xlabel
橫坐標(biāo)的文字說(shuō)明
ylabel
縱坐標(biāo)的文字說(shuō)明
title
標(biāo)題
show
繪圖
4 總結(jié)
描述性統(tǒng)計(jì)是容易操作,直觀簡(jiǎn)潔的數(shù)據(jù)分析手段。但是由于簡(jiǎn)單,對(duì)多元變量的關(guān)系難以描述。現(xiàn)實(shí)生活中,自變量通常是多元的:決定體重不僅有身高,還有飲食習(xí)慣,肥胖基因等等因素。通過一些高級(jí)的數(shù)據(jù)處理手段,我們可以對(duì)多元變量進(jìn)行處理,例如特征工程中,可以使用互信息方法來(lái)選擇多個(gè)對(duì)因變量有較強(qiáng)相關(guān)性的自變量作為特征,還可以使用主成分分析法來(lái)消除一些冗余的自變量來(lái)降低運(yùn)算復(fù)雜度。
5 參考資料
總結(jié)
以上是生活随笔為你收集整理的用python做频数分析_使用Python进行描述性统计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关联的两个字段度需要建立索引吗_索引那些
- 下一篇: 自带容器_什么是衬胶容器罐以及质量标准?