卡方獨(dú)立性檢驗(yàn)
import numpy as np
from scipy.stats import chi2_contingency # 列聯(lián)表分析
from scipy.stats import chi2 # 卡方分布
(2)參數(shù)說明
【輸入】:
| 參數(shù) | 描述 |
|---|---|
| alpha | 置信度,用來確定臨界值; |
| data | 數(shù)據(jù),請(qǐng)使用numpy.array數(shù)組; |
【輸出】:
| 參數(shù) | 描述 |
|---|---|
| CMIN | 卡方值,也就是統(tǒng)計(jì)量; |
| p | P值(統(tǒng)計(jì)學(xué)名詞),與置信度對(duì)比,也可進(jìn)行假設(shè)檢驗(yàn),P值小于置信度,則拒絕原假設(shè); |
| freedom | 自由度; |
| re | 判斷變量,1表示拒絕原假設(shè),0表示接受原假設(shè); |
| prediction_value | 原數(shù)據(jù)數(shù)組同維度的對(duì)應(yīng)理論預(yù)測(cè)值(預(yù)測(cè)結(jié)果); |
def chi2_independence(alpha, data):
CMIN, p, dof, prediction_value = chi2_contingency(data)
if dof == 0:
print('自由度應(yīng)該大于等于1')
elif dof == 1:
cv = chi2.isf(alpha * 0.5, dof)
else:
cv = chi2.isf(alpha * 0.5, dof-1)
if CMIN > cv:
re = 1 # 表示拒絕原假設(shè)
else:
re = 0 # 表示接受原假設(shè)
return CMIN, p, dof, re, prediction_value
# 測(cè)試
alpha1 = 0.005 # 置信度,常用0.01,0.05,用于確定拒絕域的臨界值
data1 = np.array([[43, 49,22,114], [8, 2,5,15],[47,44,30,121]])
data2 = np.array([[43, 49,22], [8, 2,5],[47,44,30]]) # # 插入數(shù)據(jù)(用于測(cè)試)
CMIN, p, freedom, re, prediction_value = chi2_independence(alpha1, data2)
print("卡方值:\n",CMIN)
print("P值:\n",p)
print("自由度:\n",freedom)
print("判斷變量:\n",re)
print("原數(shù)據(jù)數(shù)組同維度的理論預(yù)測(cè)值(預(yù)測(cè)結(jié)果):\n",prediction_value)

1.png
卡方擬合性檢驗(yàn)?
卡方檢驗(yàn)?zāi)軝z驗(yàn)單個(gè)多項(xiàng)分類名義型變量各分類間的實(shí)際觀測(cè)次數(shù)與理論次數(shù)之間是否一致的問題,這里的觀測(cè)次數(shù)是根據(jù)樣本數(shù)據(jù)得多的實(shí)計(jì)數(shù),理論次數(shù)則是根據(jù)理論或經(jīng)驗(yàn)得到的期望次數(shù)。
這一類檢驗(yàn)稱為擬合性檢驗(yàn)。 其自由度通常為分類數(shù)減去1,理論次數(shù)通常根據(jù)某種經(jīng)驗(yàn)或理論。
總而言之,卡方擬合度檢驗(yàn)用于判斷不同類型結(jié)果的比例分布相對(duì)于一個(gè)期望分布的擬合程度。
卡方擬合性檢驗(yàn)適用于變量為類別型變量的情況。
# 導(dǎo)如相關(guān)庫
import numpy as np
from scipy.stats import chisquare
from scipy.stats import chi2 # 卡方分布
(1)假設(shè)檢驗(yàn)重要知識(shí)
H0: 類別A與B的比例沒有差異;
H1:類別A與B的比例有差異;
若卡方值大于臨界值,拒絕原假設(shè),表示A與B不相互獨(dú)立,A與B相關(guān);
函數(shù)中re返回為1表示拒絕原假設(shè),0表示接受原假設(shè);
(2)參數(shù)說明
【輸入】:
| 參數(shù) | 描述 |
|---|---|
| alpha | 置信度,用來確定臨界值; |
| data | 數(shù)據(jù),使用numpy.array數(shù)組; |
| sp | 表示輸入數(shù)組的形狀參數(shù),默認(rèn)為一維; |
【輸出】:
| 參數(shù) | 描述 |
|---|---|
| chis | 卡方值,也就是統(tǒng)計(jì)量; |
| p_value | P值(統(tǒng)計(jì)學(xué)名詞),與置信度對(duì)比,也可進(jìn)行假設(shè)檢驗(yàn),P值小于置信度,即可拒絕原假設(shè); |
| critical_value | 拒絕域臨界值; |
| freedom | 自由度; |
| result | 判斷變量,1表示拒絕原假設(shè),0表示接受原假設(shè); |
(3)應(yīng)用場(chǎng)景
要求樣本含量應(yīng)大于40,且每個(gè)格子中的理論頻數(shù)最好大于5;
def chi2_fitting(data, alpha, sp=None):
chis,p_value = chisquare(data, axis=sp)
i, freedom = data.shape # freedom為自由度
if freedom == 0:
print('自由度應(yīng)該大于等于1')
elif freedom == 1:
critical_value = chi2.isf(alpha * 0.5, freedom)
else:
critical_value = chi2.isf(alpha * 0.5, freedom - 1)
if chis > critical_value:
result = 1 # 表示拒絕原假設(shè)
else:
result = 0 # 表示接受原假設(shè)
return chis, p_value, critical_value, freedom-1, result
# 擬合測(cè)試
data1 = np.array([[43, 49,22], [8, 2,5],[47,44,30]]) # 插入數(shù)據(jù)
alpha1 = 0.05
chis1, p_value1, critical_value, dof, result1 = chi2_fitting(data1, alpha1)
print("卡方值: ",chis1)
print("P值: ",p_value1)
print("拒絕域臨界值:",critical_value)
print("自由度: ",dof)
print("判斷變量(1表示否定原假設(shè),0表示肯定原假設(shè)): ",result1)

2.png
導(dǎo)入房?jī)r(jià)數(shù)據(jù)集
使用卡方獨(dú)立性檢驗(yàn)和卡方擬合性檢驗(yàn)進(jìn)行相關(guān)預(yù)測(cè)。
### 導(dǎo)入數(shù)據(jù)集
# 讀取房?jī)r(jià)數(shù)據(jù)
import pandas as pd
def load_housing_data():
return pd.read_csv('./housing.csv',encoding='gbk')
housing = load_housing_data()
# # 查看前五行數(shù)據(jù)
housing.head()
housing.describe() ## 數(shù)據(jù)集描述;
## 居民收入: income
income = housing['median_income']
income
## 房屋價(jià)值:house_value
## 房屋年齡:housing_median_age
## 房屋面積 :total_rooms
house_value = housing['median_house_value']
house_value
housing_median_age = housing['housing_median_age']
housing_median_age
total_rooms = housing['total_rooms']
total_rooms
(1) 探究收入與房?jī)r(jià)的關(guān)系
# 數(shù)據(jù): 探究收入與房?jī)r(jià)的關(guān)系
data2 = np.array([income,house_value]) # 數(shù)據(jù): 探究收入與房?jī)r(jià)的關(guān)系
CMIN, p, freedom, re, prediction_value = chi2_independence(alpha1, data2)
print("卡方值: ",CMIN)
print("P 值: ",p)
print("自由度: ",freedom) #
print("判斷變量(1表示否定原假設(shè),0表示肯定原假設(shè)): \n",re)
print("原數(shù)據(jù)數(shù)組同維度的理論預(yù)測(cè)值(預(yù)測(cè)結(jié)果):\n",prediction_value)
print("------------分隔線----------------")
print("【卡方擬合性檢驗(yàn)】:")
alpha1 = 0.05
chis1, p_value1, critical_value, dof, result1 = chi2_fitting(data2, alpha1)
print("卡方值: ",chis1)
print("P值: ",p_value1)
print("拒絕域臨界值:",critical_value)
print("自由度: ",dof)
print("判斷變量(1表示否定原假設(shè),0表示肯定原假設(shè)): ",result1)

3.png
探究房齡與房?jī)r(jià)的關(guān)系
# 數(shù)據(jù): 探究房齡與房?jī)r(jià)的關(guān)系
data2 = np.array([housing_median_age,house_value]) # 數(shù)據(jù): 探究收入與房?jī)r(jià)的關(guān)系
CMIN, p, freedom, re, prediction_value = chi2_independence(alpha1, data2)
print("卡方值: ",CMIN)
print("P 值: ",p)
print("自由度: ",freedom) #
print("判斷變量(1表示否定原假設(shè),0表示肯定原假設(shè)): \n",re)
print("原數(shù)據(jù)數(shù)組同維度的理論預(yù)測(cè)值(預(yù)測(cè)結(jié)果):\n",prediction_value)
print("------------分隔線----------------")
print("【卡方擬合性檢驗(yàn)】:")
alpha1 = 0.05
chis1, p_value1, critical_value, dof, result1 = chi2_fitting(data2, alpha1)
print("卡方值: ",chis1)
print("P值: ",p_value1)
print("拒絕域臨界值:",critical_value)
print("自由度: ",dof)
print("判斷變量(1表示否定原假設(shè),0表示肯定原假設(shè)): ",result1)

4.png
探究房屋面積與房?jī)r(jià)的關(guān)系
# 數(shù)據(jù): 探究房屋面積與房?jī)r(jià)的關(guān)系
data2 = np.array([total_rooms,house_value]) # 數(shù)據(jù): 探究收入與房?jī)r(jià)的關(guān)系
CMIN, p, freedom, re, prediction_value = chi2_independence(alpha1, data2)
print("卡方值: ",CMIN)
print("P 值: ",p)
print("自由度: ",freedom) #
print("判斷變量(1表示否定原假設(shè),0表示肯定原假設(shè)): \n",re)
print("原數(shù)據(jù)數(shù)組同維度的理論預(yù)測(cè)值(預(yù)測(cè)結(jié)果):\n",prediction_value)
print("------------分隔線----------------")
print("【卡方擬合性檢驗(yàn)】:")
alpha1 = 0.05
chis1, p_value1, critical_value, dof, result1 = chi2_fitting(data2, alpha1)
print("卡方值: ",chis1)
print("P值: ",p_value1)
print("拒絕域臨界值:",critical_value)
print("自由度: ",dof)
print("判斷變量(1表示否定原假設(shè),0表示肯定原假設(shè)): ",result1)

5.png
【拓展】

擬合優(yōu)度檢驗(yàn)

獨(dú)立性檢驗(yàn)