一、無序分類變數的基本概念
無序分類變數是指變數分組之後,組與組之間沒有順序關係的分類變數。它們通常採用啞變數來表示,其中1表示某類,0表示不是這類。
在統計學分析中,無序分類變數是一種常用的數據類型,廣泛應用於社會科學、醫學、生物學等領域。因此,理解無序分類變數及其分析方法顯得尤為重要。
二、無序分類變數的種類
無序分類變數的種類較多,常見的包括:
1、性別(男、女)
2、教育程度(小學、初中、高中、本科、研究生、博士)
3、宗教信仰(基督教、伊斯蘭教、佛教、無神論等)
4、婚姻狀態(已婚、未婚、離異)
5、民族(漢族、少數民族)
三、無序分類變數的資料形式
無序分類變數的資料形式通常採用啞變數表示。例如,對於一個涉及性別的問題,1表示男,0表示女。對於一個涉及宗教信仰的問題,1表示基督教,0表示其他信仰或無信仰。
import pandas as pd sex = pd.get_dummies(data['性別']) print(sex)
四、無序分類變數的統計學檢驗方法
常用的無序分類變數的統計學檢驗方法包括:
1、卡方檢驗
卡方檢驗是用來檢驗兩個或多個分類變數之間是否獨立的方法,它基於對實際值和期望值之間的差別進行計算。
from scipy.stats import chi2_contingency #sex和education都是啞變數 chi2_contingency(pd.crosstab(data['性別'],data['教育程度']))
2、Fisher精確檢驗
當樣本量較小時,卡方檢驗的精度可能會受到影響。此時,可以使用Fisher精確檢驗。
from scipy.stats import fisher_exact #sex和education都是啞變數 fisher_exact(pd.crosstab(data['性別'],data['教育程度']))
3、啟發式的檢驗方法
啟發式的無序分類變數檢驗方法主要包括:
1)檢查各組別的頻率,若某組別的頻率小於5,則對數據進行合併;
2)計算每個組別的樣本比例,若比例差異較大,則對數據進行合併。
# sex和alcoholism都是啞變數 contingency_table = pd.crosstab(data['性別'],data['酗酒'],margins = False) cont_table = contingency_table.iloc[:,[0,1]] # sex = 1表示男性,sex = 0表示女性 # alcoholism = 1表示有酗酒史,alcoholism = 0 表示無酗酒史 p0 = (cont_table.iloc[0,0] + cont_table.iloc[1,0])/cont_table.values.sum() p1 = (cont_table.iloc[0,1] + cont_table.iloc[1,1])/cont_table.values.sum() if np.abs(p1 - p0) > 0.2: contingency_table.iloc[:,1] = (contingency_table.iloc[:,1] + 1) % 2
五、舉例說明無序分類變數分析方法
以肝癌患病與吸煙、飲酒行為的關係為例,分析吸煙和飲酒是否與肝癌患病有關聯。
import pandas as pd import numpy as np from scipy.stats import chi2_contingency from scipy.stats import fisher_exact from matplotlib import pyplot as plt #構造數據 data = pd.DataFrame({ "sex": [1,0,0,1,0,1,0,1,1,0], "alcoholism": [1,1,0,1,0,0,0,1,1,0], "smoker": [1,1,0,1,0,1,0,0,0,0], "liver_cancer": [0,0,1,1,1,0,1,1,1,1], }) #使用卡方檢驗 print(chi2_contingency(pd.crosstab(data['alcoholism'],data['liver_cancer']))) print(chi2_contingency(pd.crosstab(data['smoker'],data['liver_cancer']))) #使用Fisher精確檢驗 print(fisher_exact(pd.crosstab(data['alcoholism'],data['liver_cancer']))) print(fisher_exact(pd.crosstab(data['smoker'],data['liver_cancer']))) #使用啟發式的檢驗方法 contingency_table = pd.crosstab(data['alcoholism'],data['liver_cancer'],margins = False) cont_table = contingency_table.iloc[:,[0,1]] p0 = (cont_table.iloc[0,0] + cont_table.iloc[1,0])/cont_table.values.sum() p1 = (cont_table.iloc[0,1] + cont_table.iloc[1,1])/cont_table.values.sum() if np.abs(p1 - p0) > 0.2: contingency_table.iloc[:,1] = (contingency_table.iloc[:,1] + 1) % 2 contingency_table = pd.crosstab(data['smoker'],data['liver_cancer'],margins = False) cont_table = contingency_table.iloc[:,[0,1]] p0 = (cont_table.iloc[0,0] + cont_table.iloc[1,0])/cont_table.values.sum() p1 = (cont_table.iloc[0,1] + cont_table.iloc[1,1])/cont_table.values.sum() if np.abs(p1 - p0) > 0.2: contingency_table.iloc[:,1] = (contingency_table.iloc[:,1] + 1) % 2 #繪製條形圖 fig,ax = plt.subplots(1,2,figsize = (10,5)) ax[0].bar(contingency_table.index, contingency_table[0], label = "No liver cancer") ax[0].bar(contingency_table.index, contingency_table[1], label = "Liver cancer", bottom = contingency_table[0]) contingency_table = pd.crosstab(data['smoker'],data['liver_cancer'],margins = False) ax[1].bar(contingency_table.index, contingency_table[0], label = "No liver cancer") ax[1].bar(contingency_table.index, contingency_table[1], label = "Liver cancer", bottom = contingency_table[0]) plt.legend() plt.show()
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/251963.html