无序分类变量的统计分析

一、无序分类变量的基本概念

无序分类变量是指变量分组之后,组与组之间没有顺序关系的分类变量。它们通常采用哑变量来表示,其中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/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

发表回复

登录后才能评论