無序分類變數的統計分析

一、無序分類變數的基本概念

無序分類變數是指變數分組之後,組與組之間沒有順序關係的分類變數。它們通常採用啞變數來表示,其中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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-13 17:33
下一篇 2024-12-13 17:33

相關推薦

  • int類型變數的細節與注意事項

    本文將從 int 類型變數的定義、聲明、初始化、範圍、運算和類型轉換等方面,對 int 類型變數進行詳細闡述和講解,幫助讀者更好地掌握和應用 int 變數。 一、定義與聲明 int…

    編程 2025-04-29
  • Python input參數變數用法介紹

    本文將從多個方面對Python input括弧里參數變數進行闡述與詳解,並提供相應的代碼示例。 一、基本介紹 Python input()函數用於獲取用戶輸入。當程序運行到inpu…

    編程 2025-04-29
  • Python匿名變數的使用方法

    Python中的匿名變數是指使用「_」來代替變數名的特殊變數。這篇文章將從多個方面介紹匿名變數的使用方法。 一、作為佔位符 匿名變數通常用作佔位符,用於代替一個不需要使用的變數。例…

    編程 2025-04-29
  • Python變數在內存中的存儲

    該文章將從多個方面對Python變數在內存中的存儲進行詳細闡述,包括變數的聲明和賦值、變數的引用和指向、內存地址的變化、內存管理機制等。 一、聲明和賦值 在Python中,變數聲明…

    編程 2025-04-29
  • Python變數類型用法介紹

    Python是一種解釋型編程語言,它提供了豐富的數據類型,包括數字、字元串、列表、元組、集合、字典等。Python變數類型的定義是Python程序開發的基礎,本文將從以下幾個方面對…

    編程 2025-04-28
  • Python print輸出變數

    Python是一種腳本語言,語法簡單易懂,目前被廣泛應用於數據處理、人工智慧、web開發、遊戲開發等領域。其中print函數是Python中最常用的函數之一,用於將變數輸出到控制台…

    編程 2025-04-28
  • Python定義變數

    Python是一門高級編程語言,變數是Python編程中非常重要的一個概念。Python的變數定義方式非常簡單,可以在程序中隨時定義一個變數來存儲數據,這方便了整個程序的邏輯編寫,…

    編程 2025-04-28
  • Python中如何定義一個變數

    Python是一種高級編程語言,使用它您可以輕鬆地定義和操作變數。Python中的變數屬於動態類型變數,因此不需要在定義變數時指定其類型,而是在變數分配之前自動確定變數的數據類型。…

    編程 2025-04-28
  • Python每次運行變數加一:實現計數器功能

    Python編程語言中,每次執行程序都需要定義變數,而在實際開發中常常需要對變數進行計數或者累加操作,這時就需要了解如何在Python中實現計數器功能。本文將從以下幾個方面詳細講解…

    編程 2025-04-28
  • Python中局部變數通常出現在函數中

    在Python編程中,局部變數是在函數中定義的變數,只能在函數內部訪問。相比於全局變數,局部變數的作用域更加有限,但是它們可以提高代碼的模塊化,並減少變數名的混淆。 一、局部變數的…

    編程 2025-04-28

發表回復

登錄後才能評論