首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >观察计数与预期计数差异表

观察计数与预期计数差异表
EN

Stack Overflow用户
提问于 2019-10-12 01:52:55
回答 1查看 319关注 0票数 2

我有一个数据,我正在为一个二进制因变量建模。还有另外5个分类预测变量,我对每个变量的独立性进行了卡方检验,对因变量进行了卡方检验。所有这些都得到了非常低的p值。

现在,我想创建一个图表,显示观察到的计数和预期计数之间的所有差异。这看起来应该是scipy chi2_contingency函数的一部分,但我搞不清楚。

我唯一能想到的就是chi2_contingency函数将输出一个预期计数数组,所以我想我需要弄清楚如何将我的观察计数交叉表转换成一个数组,然后减去这两个数组。

代码语言:javascript
复制
  ## Gender & Income:  cross-tabulation table and chi-square

  ct_sex_income=pd.crosstab(adult_df.sex, adult_df.income, margins=True)
  ct_sex_income

  ## Run Chi-Square test

  scipy.stats.chi2_contingency(ct_sex_income)

  ## try to subtract them

  ct_sex_income.observed - chi2_contingency(ct_sex_income)[4]

我得到的错误是“观察到:'DataFrame‘对象没有’AttributeError‘属性”

我只想要一个显示差异的数组。

TIA寻求任何帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-12 04:16:12

我不知道你的数据,也不知道你观察到的函数是如何定义的。我不太明白你的意图,可能是根据人们的婚姻状况预测他们的收入。

我在这里发布了你的问题的一个可能的解决方案。

代码语言:javascript
复制
        import pandas as pd
        import numpy as np
        import scipy.stats as stats
        from scipy.stats import chi2_contingency

        # some bogus data
        data = [['single','30k-35k'],['divorced','40k-45k'],['married','25k-30k'],
                ['single','25k-30k'],['married','40k-45k'],['divorced','40k-35k'],
                ['single','30k-35k'],['married','30k-35k'],['divorced','30k-35k'],
                ['single','30k-35k'],['married','40k-45k'],['divorced','25k-30k'],
                ['single','40k-45k'],['married','30k-35k'],['divorced','30k-35k'],
                ]

        adult_df = pd.DataFrame(data,columns=['marital','income'])

        X = adult_df['marital'] #variable
        Y = adult_df['income']  #prediction

        dfObserved = pd.crosstab(Y,X) 

        results = []

        #Chi-Statistic, P-Value, Degrees of Freedom and the expected frequencies
        results =  stats.chi2_contingency(dfObserved.values)
        chi2  = results[0] 
        pv    = results[1]
        free  = results[2]
        efreq = results[3]

        dfExpected = pd.DataFrame(efreq, columns=dfObserved.columns, index = dfObserved.index)

        print(dfExpected)
        """
        marital  divorced   married    single
        income                               
        25k-30k  1.000000  1.000000  1.000000
        30k-35k  2.333333  2.333333  2.333333
        40k-35k  0.333333  0.333333  0.333333
        40k-45k  1.333333  1.333333  1.333333
        """

        print(dfObserved)
        """ 
        marital  divorced  married  single
        income                            
        25k-30k         1        1       1
        30k-35k         2        2       3
        40k-35k         1        0       0
        40k-45k         1        2       1
        """

        difference = dfObserved - dfExpected
        print(difference)
        """"
        marital  divorced   married    single
        income                               
        25k-30k  0.000000  0.000000  0.000000
        30k-35k -0.333333 -0.333333  0.666667
        40k-35k  0.666667 -0.333333 -0.333333
        40k-45k -0.333333  0.666667 -0.333333
        """

我希望它能帮上忙

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58346290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档