其中,??為第?R行第?C列的期望頻數(shù),??為第?R行的總數(shù),??為第?C列的總數(shù),??E為總樣本量
計(jì)算卡方統(tǒng)計(jì)量
卡方統(tǒng)計(jì)量計(jì)算公式:
其中,??O為第??i行第??j列的觀測(cè)頻數(shù),??E為第?i行第?i列的期望頻數(shù)
確定自由度
自由度計(jì)算公式:
其中,??為行數(shù),??為列數(shù)
確定?K值
根據(jù)卡方統(tǒng)計(jì)量和自由度,查卡方分布表或使用統(tǒng)計(jì)軟件計(jì)算 值
結(jié)論
如果 值小于顯著性水平(例如 ),拒絕原假設(shè),認(rèn)為兩個(gè)分類變量之間存在顯著關(guān)聯(lián)
使用場(chǎng)景
用于檢驗(yàn)兩個(gè)分類變量是否獨(dú)立(案例:性別-男性和女性,是否影響一個(gè)人是否吸煙-吸煙或不吸煙,驗(yàn)證性別和吸煙習(xí)慣之間是否存在關(guān)聯(lián))
注意事項(xiàng)
代碼實(shí)現(xiàn)
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import chi2_contingency
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 生成數(shù)據(jù)
np.random.seed(0)
products = np.random.choice(['Electronics', 'Clothing', 'Home Decor'], size=100)
regions = np.random.choice(['North', 'South', 'East', 'West'], size=100)
# 創(chuàng)建一個(gè)新的數(shù)據(jù)集
data = {'Product_Category': products, 'Sales_Region': regions}
df = pd.DataFrame(data)
# 創(chuàng)建交叉表
contingency_table = pd.crosstab(df['Product_Category'], df['Sales_Region'])
# 進(jìn)行卡方獨(dú)立性檢驗(yàn)
chi2, p, dof, expected = chi2_contingency(contingency_table)
print("Chi2 Statistic:", chi2)
print("p-value:", p)
print("Degrees of Freedom:", dof)
# 可視化實(shí)際頻數(shù)的交叉表
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
sns.heatmap(contingency_table, annot=True, fmt='d', cmap='YlGnBu')
plt.title('實(shí)際頻數(shù)的交叉表')
# 可視化期望頻數(shù)的交叉表
plt.subplot(1, 2, 2)
sns.heatmap(expected, annot=True, fmt='.2f', cmap='YlGnBu')
plt.title('期望頻數(shù)的交叉表')
plt.tight_layout()
plt.show()
在這里我們生成數(shù)據(jù)來(lái)分析不同產(chǎn)品類別在不同銷售區(qū)域的分布情況,并通過(guò)卡方檢驗(yàn)來(lái)判斷產(chǎn)品類別和銷售區(qū)域之間是否存在顯著關(guān)聯(lián),這里??在顯著性水平0.05下,我們無(wú)法拒絕原假設(shè),說(shuō)明根據(jù)現(xiàn)有數(shù)據(jù),沒(méi)有足夠的證據(jù)表明產(chǎn)品類別和銷售區(qū)域之間存在顯著的關(guān)聯(lián)性
實(shí)現(xiàn)步驟
提出假設(shè)原假設(shè)??:觀測(cè)數(shù)據(jù)與理論分布一致
備擇假設(shè) :觀察數(shù)據(jù)與理論分布不一致
收集數(shù)據(jù)
收集觀測(cè)數(shù)據(jù)和相應(yīng)的理論頻數(shù)
計(jì)算期望頻數(shù)
根據(jù)理論分布計(jì)算期望頻數(shù)
計(jì)算卡方統(tǒng)計(jì)量
其中, 為第 類觀測(cè)頻數(shù), 為第 類的期望頻數(shù)
確定自由度
其中,??k為分類數(shù)
確定p?值
根據(jù)卡方統(tǒng)計(jì)量和自由度,查卡方分布表或使用統(tǒng)計(jì)軟件計(jì)算 值
結(jié)論
如果?p值小于顯著性水平(例如a=0.05??),拒絕原假設(shè),認(rèn)為觀測(cè)數(shù)據(jù)與理論分布不一致
代碼實(shí)現(xiàn)
from scipy.stats import chisquare
# 觀察到的頻數(shù)
observed = np.array([16, 18, 16, 14, 12, 14])
# 期望頻數(shù)(假設(shè)是公平的骰子)
expected = np.array([15, 15, 15, 15, 15, 15])
# 卡方適合度檢驗(yàn)
chi2, p = chisquare(observed, f_exp=expected)
# 輸出結(jié)果
print(f"Chi2 Statistic: {chi2}")
print(f"P-value: {p}")
# 創(chuàng)建DataFrame用于可視化
df = pd.DataFrame({
'Side': ['1', '2', '3', '4', '5', '6'],
'Observed': observed,
'Expected': expected
})
# 可視化實(shí)際頻數(shù)和期望頻數(shù)
fig, ax = plt.subplots(figsize=(10, 6))
# 觀察到的頻數(shù)柱狀圖
sns.barplot(x='Side', y='Observed', data=df, color='blue', label='觀察到的', ax=ax)
# 期望頻數(shù)柱狀圖
sns.barplot(x='Side', y='Expected', data=df, color='orange', label='期望的', ax=ax, alpha=0.5)
ax.set_title('觀察到的 vs 期望的頻數(shù)')
ax.legend()
plt.show()
假設(shè)我們?cè)谝粋€(gè)實(shí)驗(yàn)中投擲了一個(gè)六面骰子100次,然后統(tǒng)計(jì)了每個(gè)面出現(xiàn)的次數(shù),在理想情況下,如果骰子是公平的,每個(gè)面應(yīng)該均勻地出現(xiàn)約15次,這里的代碼模擬了這樣的情景,并進(jìn)行了卡方適合度檢驗(yàn),來(lái)驗(yàn)證觀察到的頻數(shù)是否與期望的頻數(shù)(即公平骰子的預(yù)期結(jié)果)相符,根據(jù)這個(gè)卡方適合度檢驗(yàn)的結(jié)果P=0.916884在顯著性水平0.05下,可以得出結(jié)論:在這個(gè)實(shí)驗(yàn)中,投擲的六面骰子的觀察結(jié)果與預(yù)期的公平骰子模型一致,沒(méi)有足夠的證據(jù)表明骰子不是公平的
文章轉(zhuǎn)自微信公眾號(hào)@Python機(jī)器學(xué)習(xí)AI
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)