用python做频数分析_使用Python进行描述性统计
2 使用NumPy和SciPy進(jìn)行數(shù)值分析
2.1 基本概念
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ù)進(jìn)行預(yù)測,那么平均情況是非常直觀地選擇。數(shù)據(jù)的中心位置可分為均值(Mean),中位數(shù)(Median),眾數(shù)(Mode)。其中均值和中位數(shù)用于定量的數(shù)據(jù),眾數(shù)用于定性的數(shù)據(jù)。
對于定量數(shù)據(jù)(Data)來說,均值是總和除以總量(N),中位數(shù)是數(shù)值大小位于中間(奇偶總量處理不同)的值:
均值相對中位數(shù)來說,包含的信息量更大,但是容易受異常的影響。使用NumPy計算均值與中位數(shù):
1 from numpy import mean, median
2
3 #計算均值
4 mean(data)
5 #計算中位數(shù)
6 median(data)
對于定性數(shù)據(jù)來說,眾數(shù)是出現(xiàn)次數(shù)最多的值,使用SciPy計算眾數(shù):
1 from scipy.stats import mode
2
3 #計算眾數(shù)
4 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)差但是進(jì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-分?jǐn)?shù))
之前提到均值容易受異常值影響,那么如何衡量偏差,偏差到多少算異常是兩個必須要解決的問題。定義z-分?jǐn)?shù)(Z-Score)為測量值距均值相差的標(biāo)準(zhǔn)差數(shù)目:
當(dāng)標(biāo)準(zhǔn)差不為0且不為較接近于0的數(shù)時,z-分?jǐn)?shù)是有意義的,使用NumPy計算z-分?jǐn)?shù):
1 from numpy import mean, std
2
3 #計算第一個值的z-分?jǐn)?shù)
4 (data[0]-mean(data)) / std(data)
通常來說,z-分?jǐn)?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),負(fù)值為負(fù)相關(guān),0為不相關(guān)。相關(guān)系數(shù)是基于協(xié)方差但進(jìn)行了無量綱處理。使用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 回顧
包
方法
說明
numpy
array
創(chuàng)造一組數(shù)
numpy.random
normal
創(chuàng)造一組服從正態(tài)分布的定量數(shù)
numpy.random
randint
創(chuàng)造一組服從均勻分布的定性數(shù)
numpy
mean
計算均值
numpy
median
計算中位數(shù)
scipy.stats
mode
計算眾數(shù)
numpy
ptp
計算極差
numpy
var
計算方差
numpy
std
計算標(biāo)準(zhǔn)差
numpy
cov
計算協(xié)方差
numpy
corrcoef
計算相關(guān)系數(shù)
3 使用Matplotlib進(jìn)行圖分析
3.1 基本概念
使用圖分析可以更加直觀地展示數(shù)據(jù)的分布(頻數(shù)分析)和關(guān)系(關(guān)系分析)。柱狀圖和餅形圖是對定性數(shù)據(jù)進(jìn)行頻數(shù)分析的常用工具,使用前需將每一類的頻數(shù)計算出來。直方圖和累積曲線是對定量數(shù)據(jù)進(jìn)行頻數(shù)分析的常用工具,直方圖對應(yīng)密度函數(shù)而累積曲線對應(yīng)分布函數(shù)。散點(diǎn)圖可用來對兩組數(shù)據(jù)的關(guān)系進(jìn)行描述。在沒有分析目標(biāo)時,需要對數(shù)據(jù)進(jìn)行探索性的分析,箱形圖將幫助我們完成這一任務(wù)。
在此,我們使用一組容量為10000的男學(xué)生身高,體重,成績數(shù)據(jù)來講解如何使用Matplotlib繪制以上圖形,創(chuàng)建數(shù)據(jù)的代碼如下:
View Code
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 #對每一類成績進(jìn)行頻數(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, 0) for 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, 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ù),這里并沒有事先進(jìn)行頻數(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)系分析(散點(diǎn)圖)
在散點(diǎn)圖中,分別以自變量和因變量作為橫縱坐標(biāo)。當(dāng)自變量與因變量線性相關(guān)時,在散點(diǎn)圖中,點(diǎn)近似分布在一條直線上。我們以身高作為自變量,體重作為因變量,討論身高對體重的影響。使用Matplotlib繪制散點(diǎn)圖的代碼如下:
from matplotlib import pyplot
#繪制散點(diǎn)圖
def drawScatter(heights, weights):
#創(chuàng)建散點(diǎn)圖
#第一個參數(shù)為點(diǎn)的橫坐標(biāo)
#第二個參數(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)
我們在創(chuàng)建數(shù)據(jù)時,體重這一變量的確是由身高變量通過線性回歸產(chǎn)生,繪制出來的散點(diǎn)圖如下:
3.4 探索分析(箱形圖)
在不明確數(shù)據(jù)分析的目標(biāo)時,我們對數(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 #第一個參數(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種信息:
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 對比分析
3.6 回顧
方法
說明
bar
柱狀圖
pie
餅形圖
hist
直方圖&累積曲線
scatter
散點(diǎn)圖
boxplot
箱形圖
xticks
設(shè)置柱的文字說明
xlabel
橫坐標(biāo)的文字說明
ylabel
縱坐標(biāo)的文字說明
title
標(biāo)題
show
繪圖
4 總結(jié)
描述性統(tǒng)計是容易操作,直觀簡潔的數(shù)據(jù)分析手段。但是由于簡單,對多元變量的關(guān)系難以描述。現(xiàn)實(shí)生活中,自變量通常是多元的:決定體重不僅有身高,還有飲食習(xí)慣,肥胖基因等等因素。通過一些高級的數(shù)據(jù)處理手段,我們可以對多元變量進(jìn)行處理,例如特征工程中,可以使用互信息方法來選擇多個對因變量有較強(qiáng)相關(guān)性的自變量作為特征,還可以使用主成分分析法來消除一些冗余的自變量來降低運(yùn)算復(fù)雜度。
5 參考資料
總結(jié)
以上是生活随笔為你收集整理的用python做频数分析_使用Python进行描述性统计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关联的两个字段度需要建立索引吗_索引那些
- 下一篇: html提交表单使用python计算_教