卡方優(yōu)度檢測(cè) (Python 實(shí)現(xiàn)) --基于jupyter

卡方獨(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容