點擊下方公眾號,回復資料,收穫驚喜
今天來說說連續變量與分類變量(二分)之間的檢驗。
通俗的來講,就是去發現變量間的關係。
連續變量數量為一個,分類變量數量為兩個。
總體:包含所有研究個體的集合。
樣本:經過抽樣總體中的部分個體。
均值:變量的數值之和除以變量的個數。
極差:變量的最大值與最小值之差。
方差,標準差反映數據的離散程度,其值越大,數據波動越大。
/ 01 / 正態分布
在實際情況裡,總體的信息往往難以獲取,所以需要抽樣,通過樣本來估計總體。
點估計和區間估計是通過樣本來估計總體的兩種方法。
那麼樣本是否能夠代表總體就是關鍵點,樣本需要具有代表性。
點估計:用樣本統計量去估計總體參數。
區間估計:不同於點估計,能夠提供待估計參數的置信區間和置信度。
區間估計用到了中心極限定理,表現為如果抽樣多次,每次抽樣都有一個均值,產生的多個均值服從正態分布。
就可以利用正態分布的性質,推斷出樣本均值出現在某區間範圍的概率。
正態分布:關於均值左右對稱的,呈鐘形。且均值和標準差具有代表性。均值=中位數=眾數。
在現實生活中,男女身高(性別有影響需區分開)、體重、考試成績都是屬於正態分布。
影響它們的變量都是獨立互不影響的。
接下來對豆瓣電影TOP250裡的電影評分進行分析。
首先讀取數據。
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
import pandas as pd
# 讀取文件
df = pd.read_csv('douban.csv', header=0, names=["quote", "score", "info", "title", "people"])
dom1 = []
# 清洗數據,獲取國家列,1為中國,2為外國
for i in df['info']:
country = i.split('/')[1].split(' ')[0].strip()
if country in ['中國大陸', '臺灣', '香港']:
dom1.append(1)
else:
dom1.append(0)
df['country'] = dom1
生成電影評分直方圖,觀察其是否符合正態分布。
# distplot:集合功能,kde:顯示核密度估計圖,fit:控制擬合的參數分布圖形,本次為擬合正態分布
sns.distplot(df.score, kde=True, fit=stats.norm)
plt.show()
運行代碼後得到下圖,發現電影評分分布近似正態分布。
生成電影評分QQ圖,觀察電影評分與正態分布的接近程度。
# qqplot檢驗數據是否服從正態分布
sm.qqplot(df.score, fit=True, line='45')
plt.show()
運行代碼後得到下圖,其中樣本點越靠近紅色線說明變量越趨近正態分布,結論顯而易見。
區間估計,計算95%保證程度下的區間估計範圍。
# 標準差
se = df.score.std() / len(df) ** 0.5
# 均值下限
LB = df.score.mean() - 1.98 * se
# 均值上限
UB = df.score.mean() + 1.98 * se
print(LB, UB)
# 得到的結果
8.782710866637895 8.849289133362106
即在95%的置信度下,電影評分的總體均值位於區間「8.7827-8.8492」內。
定義函數,計算不同置信度下的置信區間。
def confint(x, alpha=0.05):
"""計算不同置信度下的置信區間"""
n = len(x)
xb = x.mean()
df = n - 1
tmp = (x.std() / n ** 0.5) * stats.t.ppf(1-alpha/2, df)
return {'Mean': xb, 'Degree of Freedom': df, 'LB': xb-tmp, 'UB': xb+tmp}
result = confint(df.score, 0.05)
print(result)
# 得到的結果
{'LB': 8.782886780076549, 'UB': 8.849113219923453, 'Degree of Freedom': 249, 'Mean': 8.816}
即在99%的置信度下,電影評分的總體均值位於區間「8.7828-8.8491」內。
/ 02 / t檢驗
01 假設檢驗
在研究變量時,對分布的性質進行一定的假設,然後通過抽樣來檢驗假設是否成立。
這似乎與我們中學時代的反證法有點類似,假設需要證明的東西成立,然後去反推。
其中實際抽樣結果與假設的差異程度可以用概率值表示,為「p-value」。
概率值越大意味著越無差異,越接近。
人為設定一個「p-value」的閾值將差異程度判斷為「有差異」或「無差異」,這個閾值就是「顯著性水平」。
目前接觸的原假設都是設置為等值假設,本次假設電影評分均值為8.8。
顯著性水平的設置根據樣本容量,本次取顯著性水平為0.05。
最後的結論就是「p-value」值小於顯著性水平時,差異明顯,有理由拒絕原假設。
「p-value」值大於顯著性水平時,差異較小,那麼就不能拒絕原假設。
這裡書本沒有對「p-value」如何查表取值詳細解說,需要百度查詢。
02 單樣本t檢驗
單樣本t檢驗是最基礎的假設檢驗,其利用來自總體的樣本數據,推斷總體均值是否與假設的檢驗值之間存在顯著差異。
P值大於顯著性水平,則無法拒絕原假設。
P值小於顯著性水平,則拒絕原假設。
下面在Python中進行單樣本t檢驗,使用電影評分數據,假設均值為8.8分。
# stas:列聯表
d1 = sm.stats.DescrStatsW(df.score)
print('t-statistic=%6.4f, p-value=%6.4f, df=%s' %d1.ttest_mean(8.8))
# 得到的結果
t-statistic=-2.0223, p-value=0.3422, df=249.0
P值為0.3422,如果規定顯著性水平為0.05,那麼就無法拒絕原假設。
即電影評分均值為8.8分的原假設成立。
03 雙樣本t檢驗
雙樣本t檢驗是檢驗兩個樣本均值的差異是否顯著。
常用於檢驗某二分類變量區分下的某連續變量是否有顯著差異。
本次使用豆瓣電影TOP250中中外國家電影評分數據。
研究電影評分受國家的影響是否顯著(之前分析的結論是沒什麼影響)。
# 對數據分組匯總
print(df['score'].groupby(df['country']).describe())
得到結果如下,發現均值還是有一點點差異的。
接下來用雙樣本t檢驗來看這種差異是否顯著。
在進行雙樣本t檢驗前,有三個基本條件需要考慮。
①觀測之間獨立(本次滿足)
②兩組均服從正態分布(本次滿足)
①兩組樣本的方差是否相同(需檢驗)
上面的結果已經包含了樣本評分均值的方差了,可是書裡卻說還需要進行方差齊性分析。
這一點不是很理解,就當多學點東西吧。
方差齊性檢驗的原假設為兩組數據方差相同。
# levene:方差齊性檢驗
country0 = df[df['country'] == 0]['score']
country1 = df[df['country'] == 1]['score']
leveneTestRes = stats.levene(country0, country1, center='median')
print('w-value=%6.4f, p-value=%6.4f' %leveneTestRes)
# 得到的結果
w-value=0.5855, p-value=0.4449
P值為0.4449,若以0.05為顯著性水平,則無法拒絕原假設。
即中國電影評分和外國電影評分的方差是相同的。
因此進行方差齊性的雙樣本t檢驗。
# equal_var=True:兩組數據方差齊性
print(stats.stats.ttest_ind(country0, country1, equal_var=True))
# 得到的結果
Ttest_indResult(statistic=0.9331710237657628, pvalue=0.3516393015610625)
P值為0.35,若以0.05為顯著性水平,則無法拒絕原假設。
說明中國電影評分和外國電影評分無顯著差異。
/ 03 / 總結
學習這一部分內容,最大的困惑就是「p-value」的取值。
書上沒講明白如何用公式確定其值,只是通過Pyhton直接結算得出結果。
網上查取的資料也是零零散散,解釋的不夠全面。
文末點個讚,比心!!!
數據處理·機器學習·可視化
行業資訊·學習資料