溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python統(tǒng)計(jì)分析的方法

發(fā)布時(shí)間:2020-08-06 13:46:48 來源:億速云 閱讀:342 作者:小新 欄目:編程語言

這篇文章主要介紹了python統(tǒng)計(jì)分析的方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

1. 常用函數(shù)庫

scipy包中的stats模塊和statsmodels包是python常用的數(shù)據(jù)分析工具,scipy.stats以前有一個(gè)models子模塊,后來被移除了。這個(gè)模塊被重寫并成為了現(xiàn)在獨(dú)立的statsmodels包。

scipy的stats包含一些比較基本的工具,比如:t檢驗(yàn),正態(tài)性檢驗(yàn),卡方檢驗(yàn)之類,statsmodels提供了更為系統(tǒng)的統(tǒng)計(jì)模型,包括線性模型,時(shí)序分析,還包含數(shù)據(jù)集,做圖工具等等。

2. 小樣本數(shù)據(jù)的正態(tài)性檢驗(yàn)

(1) 用途

夏皮羅維爾克檢驗(yàn)法 (Shapiro-Wilk) 用于檢驗(yàn)參數(shù)提供的一組小樣本數(shù)據(jù)線是否符合正態(tài)分布,統(tǒng)計(jì)量越大則表示數(shù)據(jù)越符合正態(tài)分布,但是在非正態(tài)分布的小樣本數(shù)據(jù)中也經(jīng)常會(huì)出現(xiàn)較大的W值。需要查表來估計(jì)其概率。由于原假設(shè)是其符合正態(tài)分布,所以當(dāng)P值小于指定顯著水平時(shí)表示其不符合正態(tài)分布。

正態(tài)性檢驗(yàn)是數(shù)據(jù)分析的第一步,數(shù)據(jù)是否符合正態(tài)性決定了后續(xù)使用不同的分析和預(yù)測(cè)方法,當(dāng)數(shù)據(jù)不符合正態(tài)性分布時(shí),我們可以通過不同的轉(zhuǎn)換方法把非正太態(tài)數(shù)據(jù)轉(zhuǎn)換成正態(tài)分布后再使用相應(yīng)的統(tǒng)計(jì)方法進(jìn)行下一步操作。

(2) 示例

from scipy import stats
import numpy as np
np.random.seed(12345678)
x = stats.norm.rvs(loc=5, scale=10, size=80) # loc為均值,scale為方差
print(stats.shapiro(x))
運(yùn)行結(jié)果:
(0.9654011726379395, 0.029035290703177452)

(3) 結(jié)果分析

返回結(jié)果 p-value=0.029035290703177452,比指定的顯著水平(一般為5%)小,則拒絕假設(shè):x不服從正態(tài)分布。

3. 檢驗(yàn)樣本是否服務(wù)某一分布

(1) 用途

科爾莫戈羅夫檢驗(yàn)(Kolmogorov-Smirnov test),檢驗(yàn)樣本數(shù)據(jù)是否服從某一分布,僅適用于連續(xù)分布的檢驗(yàn)。下例中用它檢驗(yàn)正態(tài)分布。

(2) 示例

from scipy import stats
import numpy as np
np.random.seed(12345678)
x = stats.norm.rvs(loc=0, scale=1, size=300)
print(stats.kstest(x,'norm'))
運(yùn)行結(jié)果:
KstestResult(statistic=0.0315638260778347, pvalue=0.9260909172362317)

(3) 結(jié)果分析

生成300個(gè)服從N(0,1)標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)數(shù),在使用k-s檢驗(yàn)該數(shù)據(jù)是否服從正態(tài)分布,提出假設(shè):x從正態(tài)分布。最終返回的結(jié)果,p-value=0.9260909172362317,比指定的顯著水平(一般為5%)大,則我們不能拒絕假設(shè):x服從正態(tài)分布。這并不是說x服從正態(tài)分布一定是正確的,而是說沒有充分的證據(jù)證明x不服從正態(tài)分布。因此我們的假設(shè)被接受,認(rèn)為x服從正態(tài)分布。如果p-value小于我們指定的顯著性水平,則我們可以肯定的拒絕提出的假設(shè),認(rèn)為x肯定不服從正態(tài)分布,這個(gè)拒絕是絕對(duì)正確的。

4.方差齊性檢驗(yàn)

(1) 用途

方差反映了一組數(shù)據(jù)與其平均值的偏離程度,方差齊性檢驗(yàn)用以檢驗(yàn)兩組或多組數(shù)據(jù)與其均值偏離程度是否存在差異,也是很多檢驗(yàn)和算法的先決條件。

(2) 示例

from scipy import stats
import numpy as np
np.random.seed(12345678)
rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)  
rvs2 = stats.norm.rvs(loc=25,scale=9,size=500)
print(stats.levene(rvs1, rvs2))
運(yùn)行結(jié)果:
LeveneResult(statistic=1.6939963163060798, pvalue=0.19337536323599344)

(3) 結(jié)果分析

返回結(jié)果 p-value=0.19337536323599344, 比指定的顯著水平(假設(shè)為5%)大,認(rèn)為兩組數(shù)據(jù)具有方差齊性。

5. 圖形描述相關(guān)性

(1) 用途

最常用的兩變量相關(guān)性分析,是用作圖描述相關(guān)性,圖的橫軸是一個(gè)變量,縱軸是另一變量,畫散點(diǎn)圖,從圖中可以直觀地看到相關(guān)性的方向和強(qiáng)弱,線性正相關(guān)一般形成由左下到右上的圖形;負(fù)相關(guān)則是從左上到右下的圖形,還有一些非線性相關(guān)也能從圖中觀察到。

(2) 示例

import statsmodels.api as sm
import matplotlib.pyplot as plt
data = sm.datasets.ccard.load_pandas().data
plt.scatter(data['INCOMESQ'], data['INCOME'])

(3) 結(jié)果分析

從圖中可以看到明顯的正相關(guān)趨勢(shì)。

6. 正態(tài)資料的相關(guān)分析

(1) 用途

皮爾森相關(guān)系數(shù)(Pearson correlation coefficient)是反應(yīng)倆變量之間線性相關(guān)程度的統(tǒng)計(jì)量,用它來分析正態(tài)分布的兩個(gè)連續(xù)型變量之間的相關(guān)性。常用于分析自變量之間,以及自變量和因變量之間的相關(guān)性。

(2) 示例

from scipy import stats
import numpy as np
np.random.seed(12345678)
a = np.random.normal(0,1,100)
b = np.random.normal(2,2,100)
print(stats.pearsonr(a, b))
運(yùn)行結(jié)果:
(-0.034173596625908326, 0.73571128614545933)

(3) 結(jié)果分析

返回結(jié)果的第一個(gè)值為相關(guān)系數(shù)表示線性相關(guān)程度,其取值范圍在[-1,1],絕對(duì)值越接近1,說明兩個(gè)變量的相關(guān)性越強(qiáng),絕對(duì)值越接近0說明兩個(gè)變量的相關(guān)性越差。當(dāng)兩個(gè)變量完全不相關(guān)時(shí)相關(guān)系數(shù)為0。第二個(gè)值為p-value,統(tǒng)計(jì)學(xué)上,一般當(dāng)p-value<0.05時(shí),可以認(rèn)為兩變量存在相關(guān)性。

7. 非正態(tài)資料的相關(guān)分析

(1) 用途

斯皮爾曼等級(jí)相關(guān)系數(shù)(Spearman’s correlation coefficient for ranked data ),它主要用于評(píng)價(jià)順序變量間的線性相關(guān)關(guān)系,在計(jì)算過程中,只考慮變量值的順序(rank, 秩或稱等級(jí)),而不考慮變量值的大小。常用于計(jì)算類型變量的相關(guān)性。

(2) 示例

from scipy import stats
import numpy as np
print(stats.spearmanr([1,2,3,4,5], [5,6,7,8,7]))
運(yùn)行結(jié)果:
SpearmanrResult(correlation=0.82078268166812329,pvalue=0.088587005313543812)

(3) 結(jié)果分析

返回結(jié)果的第一個(gè)值為相關(guān)系數(shù)表示線性相關(guān)程度,本例中correlation趨近于1表示正相關(guān)。第二個(gè)值為p-value,p-value越小,表示相關(guān)程度越顯著。

8. 單樣本T檢驗(yàn)

(1) 用途

單樣本T檢驗(yàn),用于檢驗(yàn)數(shù)據(jù)是否來自一致均值的總體,T檢驗(yàn)主要是以均值為核心的檢驗(yàn)。注意以下幾種T檢驗(yàn)都是雙側(cè)T檢驗(yàn)。

(2) 示例

from scipy import stats
import numpy as np
np.random.seed(12345678)
rvs = stats.norm.rvs(loc=5, scale=10, size=(100,2))
print(stats.ttest_1samp(rvs, [1, 5]))
運(yùn)行結(jié)果:
Ttest_1sampResult(statistic=array([ 5.12435977,  1.07927393]), pvalue=array([1.47820719e-06,2.83088106e-01]))

(3) 結(jié)果分析

本例中生成了2列100行的數(shù)組,ttest_1samp的第二個(gè)參數(shù)是分別對(duì)兩列估計(jì)的均值,p-value返回結(jié)果,第一列1.47820719e-06比指定的顯著水平(一般為5%)小,認(rèn)為差異顯著,拒絕假設(shè);第二列2.83088106e-01大于指定顯著水平,不能拒絕假設(shè):服從正態(tài)分布。

9. 兩獨(dú)立樣本T檢驗(yàn)

(1) 用途

有于比較兩組數(shù)據(jù)是否來自于同一正態(tài)分布的總體。注意:如果要比較的兩組數(shù)據(jù)不滿足方差齊性, 需要在ttest_ind()函數(shù)中添加參數(shù)equal_var = False。

(2) 示例

from scipy import stats
import numpy as np
np.random.seed(12345678)
rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)  
rvs2 = stats.norm.rvs(loc=6,scale=10,size=500)
print(stats.ttest_ind(rvs1,rvs2))
運(yùn)行結(jié)果:
Ttest_indResult(statistic=-1.3022440006355476, pvalue=0.19313343989106416)

(3) 結(jié)果分析

返回結(jié)果的第一個(gè)值為統(tǒng)計(jì)量,第二個(gè)值為p-value,pvalue=0.19313343989106416,比指定的顯著水平(一般為5%)大,不能拒絕假設(shè),兩組數(shù)據(jù)來自于同一總結(jié),兩組數(shù)據(jù)之間無差異。

10. 配對(duì)樣本T檢驗(yàn)

(1) 用途

配對(duì)樣本T檢驗(yàn)可視為單樣本T檢驗(yàn)的擴(kuò)展,檢驗(yàn)的對(duì)象由一群來自正態(tài)分布獨(dú)立樣本更改為二群配對(duì)樣本觀測(cè)值之差。它常用于比較同一受試對(duì)象處理的前后差異,或者按照某一條件進(jìn)行兩兩配對(duì)分別給與不同處理的受試對(duì)象之間是否存在差異。

(2) 示例

from scipy import stats
import numpy as np
np.random.seed(12345678)
rvs1 = stats.norm.rvs(loc=5,scale=10,size=500) 
rvs2 = (stats.norm.rvs(loc=5,scale=10,size=500) + stats.norm.rvs(scale=0.2,size=500)) 
print(stats.ttest_rel(rvs1,rvs2))
運(yùn)行結(jié)果:
Ttest_relResult(statistic=0.24101764965300979, pvalue=0.80964043445811551)

(3) 結(jié)果分析

返回結(jié)果的第一個(gè)值為統(tǒng)計(jì)量,第二個(gè)值為p-value,pvalue=0.80964043445811551,比指定的顯著水平(一般為5%)大,不能拒絕假設(shè)。

11. 單因素方差分析

(1) 用途

方差分析(Analysis of Variance,簡(jiǎn)稱ANOVA),又稱F檢驗(yàn),用于兩個(gè)及兩個(gè)以上樣本均數(shù)差別的顯著性檢驗(yàn)。方差分析主要是考慮各組之間的均數(shù)差別。

單因素方差分析(One-wayAnova),是檢驗(yàn)由單一因素影響的多組樣本某因變量的均值是否有顯著差異。

當(dāng)因變量Y是數(shù)值型,自變量X是分類值,通常的做法是按X的類別把實(shí)例成分幾組,分析Y值在X的不同分組中是否存在差異。

(2) 示例

from scipy import stats
a = [47,56,46,56,48,48,57,56,45,57]  # 分組1
b = [87,85,99,85,79,81,82,78,85,91]  # 分組2
c = [29,31,36,27,29,30,29,36,36,33]  # 分組3
print(stats.f_oneway(a,b,c))
# 運(yùn)行結(jié)果:F_onewayResult(statistic=287.74898314933193, pvalue=6.2231520821576832e-19)

(3) 結(jié)果分析

返回結(jié)果的第一個(gè)值為統(tǒng)計(jì)量,由組間差異除以組間差異得到,上例中組間差異很大,第二個(gè)返回值p-value=6.2231520821576832e-19小于邊界值(一般為0.05),拒絕原假設(shè), 即認(rèn)為以上三組數(shù)據(jù)存在統(tǒng)計(jì)學(xué)差異,并不能判斷是哪兩組之間存在差異 。只有兩組數(shù)據(jù)時(shí),效果同 stats.levene 一樣。

12. 多因素方差分析

(1) 用途

當(dāng)有兩個(gè)或者兩個(gè)以上自變量對(duì)因變量產(chǎn)生影響時(shí),可以用多因素方差分析的方法來進(jìn)行分析。它不僅要考慮每個(gè)因素的主效應(yīng),還要考慮因素之間的交互效應(yīng)。

(2) 示例

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
import pandas as pd
 
X1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 
X2 = [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]
Y = [76,78,76,76,76,74,74,76,76,55,65,90,65,90,65,90,90,79,70,90, 88,76,76,76,56,76,76,98,88,78,65,67,67,87,78,56,
54,56,54,56] 
 
data = {'T':X1, 'G':X2, 'L':Y}
df = pd.DataFrame(data)
formula = 'L~T+G+T:G' # 公式                                        
model = ols(formula,df).fit()
print(anova_lm(model))
'''
運(yùn)行結(jié)果:
       df    sum_sq     mean_sq      F      PR(>F)
T       1.0   265.225   265.225000  2.444407  0.126693
G       1.0   207.025   207.025000  1.908016  0.175698
T:G     1.0    1050.625  1050.625000  9.682932  0.003631
Residual  36.0   3906.100  108.502778   NaN       NaN
'''

(3) 結(jié)果分析

上述程序定義了公式,公式中,"~"用于隔離因變量和自變量,”+“用于分隔各個(gè)自變量, ":"表示兩個(gè)自變量交互影響。從返回結(jié)果的P值可以看出,X1和X2的值組間差異不大,而組合后的T:G的組間有明顯差異。

13. 卡方檢驗(yàn)

(1) 用途

上面介紹的T檢驗(yàn)是參數(shù)檢驗(yàn),卡方檢驗(yàn)是一種非參數(shù)檢驗(yàn)方法。相對(duì)來說,非參數(shù)檢驗(yàn)對(duì)數(shù)據(jù)分布的要求比較寬松,并且也不要求太大數(shù)據(jù)量??ǚ綑z驗(yàn)是一種對(duì)計(jì)數(shù)資料的假設(shè)檢驗(yàn)方法,主要是比較理論頻數(shù)和實(shí)際頻數(shù)的吻合程度。常用于特征選擇,比如,檢驗(yàn)?zāi)腥撕团嗽谑欠窕加懈哐獕荷嫌袩o區(qū)別,如果有區(qū)別,則說明性別與是否患有高血壓有關(guān),在后續(xù)分析時(shí)就需要把性別這個(gè)分類變量放入模型訓(xùn)練。

基本數(shù)據(jù)有R行C列, 故通稱RC列聯(lián)表(contingency table), 簡(jiǎn)稱RC表,它是觀測(cè)數(shù)據(jù)按兩個(gè)或更多屬性(定性變量)分類時(shí)所列出的頻數(shù)表。

(2) 示例

import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency
np.random.seed(12345678)
data = np.random.randint(2, size=(40, 3)) # 2個(gè)分類,50個(gè)實(shí)例,3個(gè)特征
data = pd.DataFrame(data, columns=['A', 'B', 'C'])
contingency = pd.crosstab(data['A'], data['B']) # 建立列聯(lián)表
print(chi2_contingency(contingency)) # 卡方檢驗(yàn)
'''
運(yùn)行結(jié)果:
(0.36556036556036503, 0.54543425102570975, 1, 
array([[ 10.45,   8.55],[ 11.55,   9.45]]))'''

(3) 結(jié)果分析

卡方檢驗(yàn)函數(shù)的參數(shù)是列聯(lián)表中的頻數(shù),返回結(jié)果第一個(gè)值為統(tǒng)計(jì)量值,第二個(gè)結(jié)果為p-value值,p-value=0.54543425102570975,比指定的顯著水平(一般5%)大,不能拒絕原假設(shè),即相關(guān)性不顯著。第三個(gè)結(jié)果是自由度,第四個(gè)結(jié)果的數(shù)組是列聯(lián)表的期望值分布。

14. 單變量統(tǒng)計(jì)分析

(1) 用途

單變量統(tǒng)計(jì)描述是數(shù)據(jù)分析中最簡(jiǎn)單的形式,其中被分析的數(shù)據(jù)只包含一個(gè)變量,不處理原因或關(guān)系。單變量分析的主要目的是通過對(duì)數(shù)據(jù)的統(tǒng)計(jì)描述了解當(dāng)前數(shù)據(jù)的基本情況,并找出數(shù)據(jù)的分布模型。

單變量數(shù)據(jù)統(tǒng)計(jì)描述從集中趨勢(shì)上看,指標(biāo)有:均值,中位數(shù),分位數(shù),眾數(shù);從離散程度上看,指標(biāo)有:極差、四分位數(shù)、方差、標(biāo)準(zhǔn)差、協(xié)方差、變異系數(shù),從分布上看,有偏度,峰度等。需要考慮的還有極大值,極小值(數(shù)值型變量)和頻數(shù),構(gòu)成比(分類或等級(jí)變量)。

此外,還可以用統(tǒng)計(jì)圖直觀展示數(shù)據(jù)分布特征,如:柱狀圖、正方圖、箱式圖、頻率多邊形和餅狀圖。

15. 多元線性回歸

(1) 用途

多元線性回歸模型(multivariable linear regression model ),因變量Y(計(jì)量資料)往往受到多個(gè)變量X的影響,多元線性回歸模型用于計(jì)算各個(gè)自變量對(duì)因變量的影響程度,可以認(rèn)為是對(duì)多維空間中的點(diǎn)做線性擬合。

(2) 示例

import statsmodels.api as sm 
data = sm.datasets.ccard.load_pandas().data
model = sm.OLS(endog = data['AVGEXP'], exog = data[['AGE','INCOME','INCOMESQ','OWNRENT']]).fit()
print(model.summary())
'''
運(yùn)行結(jié)果:
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                 AVGEXP   R-squared:                       0.543
Model:                            OLS   Adj. R-squared:                  0.516
Method:                 Least Squares   F-statistic:                     20.22
Date:                Thu, 31 Jan 2019   Prob (F-statistic):           5.24e-11
Time:                        15:11:29   Log-Likelihood:                -507.24
No. Observations:                  72   AIC:                             1022.
Df Residuals:                      68   BIC:                             1032.
Df Model:                           4                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
AGE           -6.8112      4.551     -1.497      0.139     -15.892       2.270
INCOME       175.8245     63.743      2.758      0.007      48.628     303.021
INCOMESQ      -9.7235      6.030     -1.613      0.111     -21.756       2.309
OWNRENT       54.7496     80.044      0.684      0.496    -104.977     214.476
==============================================================================
Omnibus:                       76.325   Durbin-Watson:                   1.692
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              649.447
Skew:                           3.194   Prob(JB):                    9.42e-142
Kurtosis:                      16.255   Cond. No.                         87.5
==============================================================================
'''

(3) 結(jié)果分析

直接通過返回結(jié)果中各變量的P值與0.05比較,來判定對(duì)應(yīng)的解釋變量的顯著性,P<0.05則認(rèn)為自變量具有統(tǒng)計(jì)學(xué)意義,從上例中可以看到收入INCOME最有顯著性。

16. 邏輯回歸

(1) 用途

當(dāng)因變量Y為2分類變量(或多分類變量時(shí))可以用相應(yīng)的logistic回歸分析各個(gè)自變量對(duì)因變量的影響程度。

(2) 示例

import statsmodels.api as sm
data = sm.datasets.ccard.load_pandas().data
data['OWNRENT'] = data['OWNRENT'].astype(int)
model = sm.Logit(endog = data['OWNRENT'], exog = data[['AVGEXP','AGE','INCOME','INCOMESQ']]).fit()
print(model.summary())
'''
運(yùn)行結(jié)果:
Optimization terminated successfully.
         Current function value: 0.504920
         Iterations 8
                           Logit Regression Results                           
==============================================================================
Dep. Variable:                OWNRENT   No. Observations:                   72
Model:                          Logit   Df Residuals:                       68
Method:                           MLE   Df Model:                            3
Date:                Fri, 01 Feb 2019   Pseudo R-squ.:                  0.2368
Time:                        17:05:47   Log-Likelihood:                -36.354
converged:                       True   LL-Null:                       -47.633
                                        LLR p-value:                 4.995e-05
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
AVGEXP         0.0002      0.001      0.228      0.820      -0.002       0.002
AGE            0.0853      0.042      2.021      0.043       0.003       0.168
INCOME        -2.5798      0.822     -3.137      0.002      -4.191      -0.968
INCOMESQ       0.4243      0.126      3.381      0.001       0.178       0.670
==============================================================================
'''

(3) 結(jié)果分析

直接通過返回結(jié)果中各變量的P值與0.05比較,來判定對(duì)應(yīng)的解釋變量的顯著性,P<0.05則認(rèn)為自變量具有統(tǒng)計(jì)學(xué)意義。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享python統(tǒng)計(jì)分析的方法內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI