假设检验在数据分析中的应用
前言
Z檢驗(yàn)
T檢驗(yàn)
獨(dú)立樣本t檢驗(yàn)
配對樣本t檢驗(yàn)
單樣本t檢驗(yàn)
前言
在這篇文章中,我不會具體去推導(dǎo)檢驗(yàn)統(tǒng)計(jì)量和相應(yīng)拒絕域的得出,這對于大部分非統(tǒng)計(jì)學(xué)專業(yè)的人士來說是晦澀的,我只想通過一個(gè)案例告訴大部分初學(xué)者假設(shè)檢驗(yàn)怎么在數(shù)據(jù)挖掘中使用。
%matplotlib?inline import?matplotlib.pyplot?as?plt import?pandas?as?pd import?numpy?as?np import?seaborn?as?sns from?scipy?import?stats from?statsmodels.stats?import?weightstats?as?mstatsdf_exams?=?pd.read_csv('./StudentsPerformance.csv') df_exams.head() df_exams.rename(columns={'race/ethnicity':'ethnicity'},inplace=True) df_exams.rename(columns={'parental?level?of?education':'parents_education'},inplace=True) df_exams.rename(columns={'test?preparation?course':'test_prep_course'},inplace=True) df_exams.rename(columns={'math?score':'math_score'},inplace=True) df_exams.rename(columns={'reading?score':'reading_score'},inplace=True) df_exams.rename(columns={'writing?score':'writing_score'},inplace=True)查看前5行的信息
df_exams.head()接下來查看類別型數(shù)據(jù)是否均勻,數(shù)值型數(shù)據(jù)是否服從正態(tài)分布。
df_exams['ethnicity'].value_counts() group C 319 group D 262 group B 190 group E 140 group A 89 Name: ethnicity, dtype: int64以宗族信息這一列為例,可以看出C的占比較重,group A 只有89例。這也就說明當(dāng)選擇從每個(gè)group抽取80個(gè)樣本是不合適的,因?yàn)檫@對A來說每次抽取,樣本信息幾乎沒有發(fā)生什么變化。
exams?=?['math_score','reading_score','writing_score'] for?exam?in?exams:y?=?df_exams[exam]plt.figure(1);?plt.title('Normal')sns.distplot(y,?kde=False,?fit=stats.norm)plt.figure(2);?plt.title('Johnson?SU')sns.distplot(y,?kde=False,?fit=stats.johnsonsu)fig?=?plt.figure()res?=?stats.probplot(df_exams[exam],?plot=plt)plt.show()這些圖片說明數(shù)據(jù)并不是完全服從正態(tài)分布,密度函數(shù)的尾部與正態(tài)分布有些偏離,但大體還是可以認(rèn)為近似服從正態(tài)分布的,如果數(shù)據(jù)不服從正態(tài)分布,Z檢驗(yàn)和T檢驗(yàn)將是無法使用的。到目前為止請注意,我們用的都是全部的數(shù)據(jù)喲,而假設(shè)檢驗(yàn)的思想是用樣本的信息來推斷總體的信息,所以接下來我們要從總體中取出樣本。
#?從總體中隨機(jī)抽取一定比例的樣本 df_exams?=?df_exams.sample(frac=1)假設(shè)檢驗(yàn)被用來以科學(xué)嚴(yán)謹(jǐn)?shù)姆绞綑z驗(yàn)一個(gè)關(guān)于數(shù)據(jù)的理論,這樣我們就不會僅僅依賴于偶然性或主觀假設(shè)。接下來我們要進(jìn)行的是兩個(gè)正態(tài)總體均值的檢驗(yàn),以學(xué)生分?jǐn)?shù)為例,就是去檢驗(yàn)兩個(gè)不同的group的分?jǐn)?shù)是否有明顯的不同 。當(dāng)建立一個(gè)假設(shè)檢驗(yàn)時(shí),有一個(gè)原假設(shè)和一個(gè)備擇假設(shè)。還必須設(shè)置顯著性水平,通常為5%(Scipy,statsmodel)。假設(shè)檢驗(yàn)可以分為單尾或雙尾。單尾的情況,例如,“A組得分>B組”。雙尾的情況例如“A組的得分與B組不同”。簡單介紹了這些 接下來,我們從a組和B組各抽取50名學(xué)生作為樣本,然后計(jì)算該數(shù)據(jù)樣本的Z分?jǐn)?shù)。
?z分?jǐn)?shù)可以回答這樣一個(gè)問題:“一個(gè)給定數(shù)距離平均數(shù)多少個(gè)標(biāo)準(zhǔn)差?”,在平均數(shù)之上的分?jǐn)?shù)會得到一個(gè)正的標(biāo)準(zhǔn)分?jǐn)?shù),在平均數(shù)之下的分?jǐn)?shù)會得到一個(gè)負(fù)的標(biāo)準(zhǔn)分?jǐn)?shù)。z分?jǐn)?shù)是一種可以看出某分?jǐn)?shù)在分布中相對位置的方法。
?group_a_sample?=?df_exams[df_exams['ethnicity']?==?'group?A'] group_a_sample?=?group_a_sample[:50]#?繪制QQ圖,檢驗(yàn)正態(tài)性 fig?=?plt.figure() res?=?stats.probplot(group_a_sample['math_score'],?plot=plt) plt.show()group_b_sample?=?df_exams[df_exams['ethnicity']?==?'group?B'] group_b_sample?=?group_b_sample[:50]fig?=?plt.figure() res?=?stats.probplot(group_b_sample['math_score'],?plot=plt) plt.show()print(stats.zscore(group_a_sample['math_score'])) print(stats.zscore(group_b_sample['math_score'])) [ 0.47126865 0.05544337 2.06526555 0.26335601 0.33266022 -0.013860840.26335601 -0.77620719 0.05544337 0.54057286 -1.67716196 -0.01386084-0.91481561 2.68900347 -1.19203247 1.37222342 -0.70690297 -0.568294550.7484855 -0.56829455 -0.70690297 -0.49899034 0.26335601 1.095006570.67918129 -1.60785775 0.33266022 0.47126865 -0.2910777 -0.360381910.67918129 -0.8455114 -1.8850746 -0.42968612 0.7484855 -1.46924932-0.98411983 1.09500657 -0.98411983 0.47126865 -0.15246927 1.7880487-0.2910777 0.1940518 -0.15246927 -0.56829455 0.12474758 2.48109083-0.22177348 -1.39994511] [-0.68278212 -2.57240054 -0.05290932 -1.69057861 0.26202709 -0.17888388-0.24187116 0.57696349 -0.7457694 -0.17888388 0.70293805 0.828912610.45098893 -0.36784572 0.82891261 0.07306525 -0.93473124 -0.4308330.26202709 -0.99771852 1.33281086 -0.87174396 1.5217727 1.899696381.08086173 -0.80875668 0.57696349 0.13605253 -0.99771852 0.639950770.51397621 -1.43862949 2.08865822 -0.36784572 1.64774726 -2.50941326-0.55680756 -0.36784572 -0.05290932 1.14384902 -1.50161677 0.325014370.07306525 0.13605253 0.13605253 0.95488717 1.08086173 -0.619794840.19903981 -0.30485844]Z檢驗(yàn)
下面的代碼是z測試的一個(gè)示例。測試是看A組樣本的“數(shù)學(xué)平均得分”是否小于總體平均值。
A組學(xué)生的平均“數(shù)學(xué)成績”與總體平均值相同。
A組學(xué)生的平均“數(shù)學(xué)成績”小于總體平均值。
首先介紹一下statsmodels 包中的 ztest 函數(shù)的一般用法如下:
#?計(jì)算總體均值和樣本均值 population_mean?=?df_exams['math_score'].mean() sample_group_a_mean?=?group_a_sample['math_score'].mean() print(population_mean,sample_group_a_mean)#?這是單樣本檢驗(yàn) zstats,?pvalue?=?mstats.ztest(group_a_sample['math_score'],x2=None,value=population_mean,alternative='smaller') print(pvalue) 66.089 61.2 0.008850880637695917可以看出P值非常的小,小于5%,則在顯著性水平為5%的條件下,我們要拒絕原假設(shè)
T檢驗(yàn)
在T檢驗(yàn)中,假設(shè)樣本為正態(tài)分布,且總體參數(shù)未知。有3種情況:
獨(dú)立樣本t檢驗(yàn),比較兩個(gè)樣本所代表的兩個(gè)總體均值是否存在顯著差異。除了要求樣本來自正態(tài)分布,還要求兩個(gè)樣本的總體方差相等(ttest_ind)
配對樣本t檢驗(yàn),配對樣本主要是同一實(shí)驗(yàn)前后效果的比較,或者同一樣品用兩種方法檢驗(yàn)結(jié)果的比較。可以把配對樣本的差作為變量(ttest_rel)
單樣本t檢驗(yàn),單樣本t檢驗(yàn)是樣本均值與總體均值的比較問題。其中總體服從正態(tài)分布,總體的方差未知,從正態(tài)總體中抽樣得到n個(gè)個(gè)體組成抽樣樣本,計(jì)算抽樣樣本均值和標(biāo)準(zhǔn)差,判斷總體均值與抽樣樣本均值是否相同。(ttest_1samp)
下面是這3個(gè)假設(shè)檢驗(yàn)的例子。注意:樣本的隨機(jī)性導(dǎo)致他們可能通過也可能不通過假設(shè),所以可能你得到的結(jié)論和我不同。
獨(dú)立樣本t檢驗(yàn)
讓我們來看看A組和B組在“數(shù)學(xué)成績”功能上的得分是否不同。
=樣本組A的平均“數(shù)學(xué)成績”與樣本組B相同。
=樣本組A的平均“數(shù)學(xué)成績”與樣本組B不同。
在5%顯著性水平下測試。這是一個(gè)雙尾檢驗(yàn)。
#?當(dāng)不確定兩總體方差是否相等時(shí),應(yīng)先利用levene檢驗(yàn),檢驗(yàn)兩總體是否具有方差齊性。 print(stats.levene(group_a_sample['math_score'],group_b_sample['math_score'])) print(group_a_sample['math_score'].var(),group_b_sample['math_score'].var())tscore,pvalue?=?stats.ttest_ind(group_a_sample['math_score'],group_b_sample['math_score'],equal_var=False) print(pvalue)print(group_a_sample['math_score'].mean(),group_b_sample['math_score'].mean()) LeveneResult(statistic=0.3789408560110682, pvalue=0.5395976230546553) 212.44897959183675 257.1983673469388 0.39114162148079246 61.2 63.84P值小于5%,則在顯著性水平為5%的條件下,我們應(yīng)拒絕原假設(shè),認(rèn)為兩組成績不相同。
配對樣本t檢驗(yàn)
接下來看看A組在“數(shù)學(xué)成績”和“閱讀成績”上的得分是否不同。
=樣本組A的平均“數(shù)學(xué)成績”與“閱讀成績”相同。
=樣本組A的平均“數(shù)學(xué)成績”與“閱讀成績”不同。
在5%顯著性水平下測試。使用ttest_rel,這是一個(gè)雙尾檢驗(yàn)。
tscore,pvalue?=?stats.ttest_rel(group_a_sample['math_score'],group_a_sample['reading_score']) print(pvalue)print(group_a_sample['math_score'].mean(),group_a_sample['reading_score'].mean()) 0.025329567098176128 61.2 64.26P值小于5%,則在顯著性水平為5%的條件下,我們應(yīng)拒絕原假設(shè),認(rèn)為兩個(gè)科目的成績不相同。
單樣本t檢驗(yàn)
讓我們看看A組樣本的平均“數(shù)學(xué)分?jǐn)?shù)”是否與總體平均值相同。
=樣本組A的平均“數(shù)學(xué)成績”與總體“數(shù)學(xué)成績”平均值相同。
=樣本組A的平均“數(shù)學(xué)成績”與總體“數(shù)學(xué)成績”平均數(shù)不同。
在5%顯著性水平下測試。這是一個(gè)雙尾測試。
tscore,pvalue?=?stats.ttest_1samp(group_a_sample['math_score'],df_exams['math_score'].mean()) print(pvalue)print(group_a_sample['math_score'].mean(),df_exams['math_score'].mean()) 0.02167469754070706 61.2 66.089P值小于5%,則在顯著性水平為5%的條件下,我們應(yīng)拒絕原假設(shè)。
后期文章將會涉及其他類型的檢驗(yàn),方差分析,一元回歸分析等,我將盡量減少不必要的數(shù)學(xué)推導(dǎo)公式,把最通俗易懂的內(nèi)容呈現(xiàn)給大家。
由于微信平臺算法改版,公號內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:(1)點(diǎn)擊頁面最上方“小詹學(xué)Python”,進(jìn)入公眾號主頁。 (2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。 感謝支持,比心。總結(jié)
以上是生活随笔為你收集整理的假设检验在数据分析中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神了!用命令行管理你的 GitHub 项
- 下一篇: 火了!16岁高中生做的 Python 3