精华内容
下载资源
问答
  • R语言卡方检验

    千次阅读 2019-11-11 21:25:18
    文章目录@[toc]卡方检验简介样本量要求卡方分析用途R语言示例卡方检验Fisher精确检验Cochran-Mantel-Haenszel检验 卡方检验简介 卡方检验时以χ2χ^2χ2分布为基础的假设检验方法。它的原假设是:观察频数与期望频数...

    卡方检验简介

    卡方检验时以 χ 2 χ^2 χ2分布为基础的假设检验方法。它的原假设是:观察频数与期望频数没有差别。

    χ 2 χ^2 χ2值表示观察值域理论值之间的偏离程度。

    根据 χ 2 χ^2 χ2分布及自由度获得原假设成立情况下当前统计量的概率P。如果p值很小,说明观察值与理论值偏离程度太大,应当拒绝原假设,表示比较资料之间有显著差异。否则将不能拒绝原假设。

    样本量要求

    • 至少卡方检验的每一个单元格,要求其最小期望频数均大于1,且至少有4/5的单元格期望频数大于5,此时使用卡方分布计算出的概率值才是准确的。否则应该用确切概率法。

    四格表资料的卡方检验,样本量与方法选择

    样本量方法
    n>40且T(理论频数)>5皮尔逊卡方
    n大于40且至少一个格子1<T<5校正卡方
    n<40或T<1Fisher确切概率法

    卡方分析用途

    • 最主要用途考察无序变量各水平在两组或多组间的分布是否一致
    • 检验两个分类变量是否相互独立
    • 非参数检验卡方检验下,检验某个分类变量各类的出现概率是否等于指定概率的分布。

    R语言示例

    卡方检验

    chisq.test()函数对二维表的行列变量进行卡方检验

    #使用vcd包中Arthritis数据集
    library(vcd)
    #生成列联表格式
    mytable <- xtabs(~Treatment+Improved,data = Arthritis)
    #卡方检验
    chisq.test(mytable)
    
    	Pearson's Chi-squared test
    
    data:  mytable
    X-squared = 13.055, df = 2, p-value = 0.001463
    #p值小于0.05,说明治疗情况和改善情况不独立。
    

    Fisher精确检验

    fisher.test()函数
    格式fisher.test(mytable),mytable是一个二维列联表

    library(vcd)
    mytable <- xtabs(~Treatment+Improved,data = Arthritis)
    #调用fisher.test()函数
    fisher.test(mytable)
    
    	Fisher's Exact Test for Count
    	Data
    
    data:  mytable
    p-value = 0.001393
    alternative hypothesis: two.sided
    #P小于0.05,两者之间不独立
    

    Cochran-Mantel-Haenszel检验

    为两个二分类变量进行分层卡方检验。
    mantelhaen.test()

    mytable <- xtabs(~Treatment+Improved+Sex,data = Arthritis)
    #调用mantelhaen.test()函数
    mantelhaen.test(mytable)
    
    	Cochran-Mantel-Haenszel test
    
    data:  mytable
    Cochran-Mantel-Haenszel M^2 =
    14.632, df = 2, p-value =
    0.0006647
    #结果表明,患者接受的治疗与得到的改善在性别的每一水平下并不独立
    

    R 语 言 小 白 速 通 R语言小白速通 R
    懂 点 R 语 言 懂点R语言 R
    欢 迎 分 享 收 藏 关 注 欢迎分享收藏关注

    展开全文
  • 用python进行列联表卡方检验

    千次阅读 2018-08-22 14:18:01
    前天在看书的时候第一次看到了列联表卡方检验,觉得这个东西不难又相对容易实现,刚好知乎上有个老哥的文章是用R来实现卡方检验,于是借用他的数据,我在spyder上面实现了。 这是一份手游数据,里面是某手游2013年8...

    转自:https://zhuanlan.zhihu.com/p/42470566

    前天在看书的时候第一次看到了列联表卡方检验,觉得这个东西不难又相对容易实现,刚好知乎上有个老哥的文章是用R来实现卡方检验,于是借用他的数据,我在spyder上面实现了。

    这是一份手游数据,里面是某手游2013年8-9月的用户登录数据以及用户数据库数据。这是为了查看到底是什么因素使得8-9月的登录次数骤减。为了看到底是什么因素会影响,首先会想到方差分析、相关性矩阵,还有卡方检验。

    首先卡方检验是针对自变量和因变量都是分类数据,也就是说带有属性的数据;而单因素方差分析是自变量是分类数据,因变量是连续型的数据还有一点:方差分析是参数检验,而卡方检验是属于非参数检验。

    到底列联表的卡方怎么做呢?

    卡方检验是用途非常广的一种 假设检验方法,它在分类资料统计推断中的应用,包括:两个率或两个构成比比较的卡方检验;多个率或多个构成比比较的卡方检验以及分类资料的 相关分析等。
    卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。注意:卡方检验针对分类变量

    当然是要进行假设检验啦:

    H_0:两个因子之间并不存在关系 \\H_1:两因子存在关系

    更多Python视频、源码、资料加群683380553免费获取

    根据度娘的图:

    1、括号里面是根据观测值的概率来推算出来的理论值,或者叫期望值。

    2、最下面和最右面是分别在不同分类数据下的求和,右边那列的和下边的和怎么都等于200

    3、概率和理论值怎么算呢:

    P(化妆) = \frac{110}{200} \space P(不化妆)=\frac{90}{200}\\ P(男) = \frac{100}{200} \space P(女) = \frac{100}{200}\\ 男化妆 = \frac{100}{200}*\frac{110}{200}*200 = 55\\ 女化妆 = \frac{100}{200}*\frac{110}{200}*200 = 55\\ 男不化妆 = \frac{100}{200}*\frac{90}{200}*200 = 45\\ 女不化妆 = \frac{100}{200}*\frac{90}{200}*200 = 45\\

     

    4、我们把理论值都直接放进去表格里面,卡方的公式: \chi^2 = \sum(\frac{(A-T)^2}{T}) 其中A是实际值,T是理论值。

    5、最后根据得出的卡方值查表便可求得结果。

    回归本题:

    在spyder里面实现

    import os 
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from scipy import stats
    plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
    plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
    os.chdir('./新建文件夹')
    user_database = pd.read_csv('./user_database.csv',encoding='utf-8',sep=',')
    user_login = pd.read_csv('./user_login.csv',encoding='utf-8',sep=',')
    #是否有空值
    udba_na = np.sum(user_database.isnull().sum())
    ulg_na = np.sum(user_login.isnull().sum())
    print(udba_na,'-----\n-----',ulg_na)
    if udba_na == 0 and ulg_na == 0:
        print('进行下一步')
    else:
        print('再检查')
    

    以上是 常规操作

    #merge    
    new_df = pd.merge(user_login,user_database,how='left',on='user_id')
    new_df.drop(['app_name_x','app_name_y'],axis=1,inplace=True)
    new_df.log_date = pd.to_datetime(new_df.log_date)
    #merge成功之后,进行探索性分析
    #8-9月之间登陆次数是否有异常
    logdf = new_df.groupby(['log_date']).count()['user_id']
    logdf.plot(figsize=(20,10),legend=True,fontsize=20,
               label = '用户数',linewidth =2,colormap = 'BrBG_r',marker='o',
               alpha=0.6,linestyle='--',grid=True)
    plt.legend(fontsize=20)
    plt.title('8-9月登陆用户数趋势图',fontsize=20)
    plt.grid(which='y',linestyle='--',color='grey',alpha=0.8)
    #明显整体趋势走弱,最大断崖式下跌9月10-11-12日
    

    这里首先进行merge,因为是两个文件,采用的是left join的形式,和SQL一样。然后根据图像进行分析。

    整体趋势向下走,在9月初一下子降得有点严重。

    进一步分析为什么会这样

    #8-9月月活跃玩家整体下降
    new_df.index = new_df.log_date
    new_df['log_month'] = new_df.index.month
    

    这里先把月份提取出来,因为做卡方检验需要分类数据

    这里我写了3个自定义函数,是为了输出报告

    #看哪几个因素有影响
    #主因素 月份 其他因素:年龄段,性别,设备
    #自定义函数,做卡方检验
    def colu(df,col):
        uni = df[col].unique().tolist()
        return uni
    def observe(df,subcol,maincol):
        d = []
        lst1 = colu(df,subcol)
        lst2 = colu(df,maincol)
        for l in lst1:
            for ls in lst2:
                b = len(df[(df[subcol] == l)&(df[maincol]==ls)])
                d.append(b)
        return d
    def split_array(df,subcol,maincol):
        result_lst = []
        lst = observe(df,subcol,maincol)
        for j in range(0,len(lst),len(colu(df,maincol))):
            result = lst[j:j+len(colu(df,maincol))]
            result_lst.append(result)
        result_lst = np.array(result_lst)
        return result_lst.T
    def chi(array):
        #计算理论值
        #main = np.sum(array,axis=1)
        #sub = np.sum(array,axis=0)
        sum_ = np.sum(np.sum(gender_month))
        #理论值:
        #expectation_value = sum_*(main/np.sum(main))*(sub/np.sum(sub))
        #expectation_value1 = sum_*(1-main/np.sum(main))*(sub/np.sum(sub))
        if sum_ > 40:
            print('样本量大于40')
            chi,p,v,exp = stats.chi2_contingency(array,correction=False)
        else:
            print('样本量小于40')
            chi,p,v,exp = stats.chi2_contingency(array,correction=True)
        print ('''
    ====================================================
    报告
    χ2值:{}
    p值:{}
    自由度:{}
    理论值:
    {}
    ====================================================
          '''.format(chi,p,v,exp))
        if p > 0.05:
            print('不拒绝原假设,无充分证据表明两个因素之间存在关系,即可认为该因素不影响登陆次数')
        else:
            if p < 0.05:
                print('显著性水平α=0.05下,拒绝原假设,充分相关,建议作图分析做进一步判断到底是因子里面哪个因素起作用')
            elif p < 0.01:
                print('显著性水平α=0.01下,拒绝原假设,显著相关,建议作图详细分析')
        return (chi,p,v,exp)
    

    总的思路就是,先把属性提取出来,然后循环遍历把对应的数据总量算出来,最后转换为numpy.array格式,根据scipy的stats里面的chi2_contingency方法做相关性检验,里面有个参数叫correction,是连续性修正,默认True,这是因为理论值全部小于5,且样本量小于40或者样本量大于40有一格或几格的理论值小于5的时候就要用这个修正。

    #性别和月份检测:
    #返回的是转置后的二维数组,index分别是月份,columns名是M,F
    gender_month  = split_array(new_df,'gender','log_month')
    print('--------------------性别和月份------------------------\n')
    chi(gender_month)
    print('------------------------------------------------------\n')
    #年龄段和月份检测:
    generation_month = split_array(new_df,'generation','log_month')
    print('--------------------年龄和月份------------------------\n')
    chi(generation_month)
    print('------------------------------------------------------\n')
    #设备和月份检测:
    device_month = split_array(new_df,'device_type','log_month')
    print('--------------------设备和月份------------------------\n')
    chi(device_month)
    print('------------------------------------------------------\n')
    

    返回的结果

    --------------------性别和月份------------------------
    
    样本量大于40
    
    ====================================================
    报告
    χ2值:2.009573852892115
    p值:0.1563092191352709
    自由度:1
    理论值:
    [[46987.45685607 47197.54314393]
     [38002.54314393 38172.45685607]]
    ====================================================
          
    不拒绝原假设,无充分证据表明两个因素之间存在关系,即可认为该因素不影响登陆次数
    ------------------------------------------------------
    
    --------------------年龄和月份------------------------
    
    样本量大于40
    
    ====================================================
    报告
    χ2值:17.246958670810887
    p值:0.0017306236244977753
    自由度:4
    理论值:
    [[33669.09192299  4789.96736323 27807.68449166  9023.75892228
      18894.49729984]
     [27230.90807701  3874.03263677 22490.31550834  7298.24107772
      15281.50270016]]
    ====================================================
          
    显著性水平α=0.05下,拒绝原假设,充分相关,建议作图分析做进一步判断到底是因子里面哪个因素起作用
    ------------------------------------------------------
    
    --------------------设备和月份------------------------
    
    样本量大于40
    
    ====================================================
    报告
    χ2值:2042.142383870325
    p值:0.0
    自由度:1
    理论值:
    [[51824.41720474 42360.58279526]
     [41914.58279526 34260.41720474]]
    ====================================================
          
    显著性水平α=0.05下,拒绝原假设,充分相关,建议作图分析做进一步判断到底是因子里面哪个因素起作用
    ------------------------------------------------------
    

    这里两组因子都返回了p值在显著性水平0.05下小于0.05

    因此进一步查看相关数据,这里是用到了pandas的交叉表,当然用pivottable也就是透视表也可以。

    #研究年龄段是否真的影响
    #Python学习交流群:548377875
    age_df=pd.crosstab(index=new_df.log_month,
                       columns=new_df.generation,
                       values=new_df.user_id,aggfunc='count')
    print(age_df)
    

    返回

    generation     10     20     30    40    50
    log_month                                  
    8           18785  33671  28072  8828  4829
    9           15391  27229  22226  7494  3835
    

    初步看20代、30代的玩家是该手游的主力玩家,这时候要比较8月和9月各个年龄段之间的差值以及每个月内的占比,也就是比较组间差距和组内 差距

    #8-9月年龄段同比
    Aug_age_df = age_df.loc[8]
    Sep_age_df = age_df.loc[9]
    diff_age_df = (Sep_age_df - Aug_age_df)/Aug_age_df
    print(diff_age_df,'\n40-49年龄段同比下降幅度15%,其他年龄段同比下降20%左右')
    print(Aug_age_df/Aug_age_df.sum(),'\n',Sep_age_df/Sep_age_df.sum())
    #看整体
    age_df.plot(figsize=(20,10),kind='bar',rot=0,fontsize=25,stacked=True) 
    plt.legend(fontsize=20)
    print('20、30代下降得比较严重')
    

    返回

    generation
    10   -0.180676
    20   -0.191322
    30   -0.208250
    40   -0.151110
    50   -0.205840
    dtype: float64 
    40-49年龄段同比下降幅度15%,其他年龄段同比下降20%左右
    generation
    10    0.199448
    20    0.357499
    30    0.298052
    40    0.093730
    50    0.051271
    Name: 8, dtype: float64 
     generation
    10    0.202048
    20    0.357453
    30    0.291776
    40    0.098379
    50    0.050345
    Name: 9, dtype: float64
    20、30代下降得比较严重
    

    单单这样比较起来,每个年龄段在每个月内的占比情况其实大同小异,再看组间差距,可以发现除了40代以外,其他都是维持在20%左右的降幅,作为一个异常值,可以去尝试把40代的数据挑出来再做检验

    #把40代剔除
    newdf = new_df[new_df.generation != 40]
    generation_month2 = split_array(newdf,'generation','log_month')
    print('--------------------年龄和月份(剔除40代后)------------------------\n')
    chi(generation_month2)
    

    返回报告

    --------------------年龄和月份(剔除40代后)------------------------
    
    样本量大于40
    
    ====================================================
    报告
    χ2值:6.74676953726528
    p值:0.08042237855065465
    自由度:3
    理论值:
    [[33746.48658123  4800.97799244 27871.6056168  18937.92980953]
     [27153.51341877  3863.02200756 22426.3943832  15238.07019047]]
    ====================================================
          
    不拒绝原假设,无充分证据表明两个因素之间存在关系,即可认为该因素不影响登陆次数
    

    p值 大于0.05,个人认为虽然是大于0.05,但是多少还是会存在年龄段的因素,相对于下面这个因素来说影响太弱。

    #可以认为年龄段对于登陆次数是有影响,40代剔除后本对整体不影响,但卡方检验p值提升,因此年龄段也需要关注
    device_type_df =pd.crosstab(index=new_df.log_month,
                       columns=new_df.device_type,
                       values=new_df.user_id,aggfunc='count')
    print(device_type_df)
    

    返回

    device_type  Android    iOS
    log_month                  
    8              46974  47211
    9              29647  46528
    

    可以看到安卓突然崩塌式下坠,而IOS基本保持应有的水平,似乎答案已经出来了。

    #很直观,明显9月安卓突然下降,设备上面很可能有问题。
    logdf1 = new_df[new_df['device_type']=='iOS'].groupby(['log_date']).count()['user_id']
    logdf2 = new_df[new_df['device_type']=='Android'].groupby(['log_date']).count()['user_id']
    f,axes = plt.subplots(1,1)
    logdf1.plot(figsize=(20,10),legend=True,fontsize=20,
               label = 'IOS用户数',linewidth =2,colormap = 'BrBG_r',marker='o',
               alpha=0.6,linestyle='--',grid=True)
    logdf2.plot(figsize=(20,10),legend=True,fontsize=20,
               label = '安卓用户数',linewidth =2,colormap = 'jet_r',marker='*',
               alpha=0.6,linestyle='--',grid=True)
    plt.legend(fontsize=20)
    plt.title('8-9月登陆用户数趋势图',fontsize=20)
    plt.grid(which='y',linestyle='--',color='grey',alpha=0.8) 
    plt.show()  
    #根据图像,明显安卓用户断崖崩塌,假设:存在安卓系统优化问题
    

    初步判断,安卓用户存在优化问题。

    以上就是用 python做卡方检验。也可以考虑用相关矩阵

    n = new_df
    n.drop('log_date',axis=1,inplace=True)
    n['device_type'] = n['device_type'].map({'iOS':1,'Android':0})
    n['gender'] = n['gender'].map({'F':0,'M':1})
    corr = n.corr()
    print(corr)
    #相关性矩阵,可以看到设备类型和登陆月份之间的相关性是里面最强的,其余基本都是无相关关系
    
                  user_id    gender  generation  device_type  log_month
    user_id      1.000000 -0.000472    0.012713     0.037740   0.184411
    gender      -0.000472  1.000000   -0.009061     0.014727   0.003435
    generation   0.012713 -0.009061    1.000000    -0.011449  -0.001097
    device_type  0.037740  0.014727   -0.011449     1.000000   0.109486
    log_month    0.184411  0.003435   -0.001097     0.109486   1.000000
    展开全文
  • R语言与大数据编程实战》 学习笔记

    在这里插入图片描述
    R语言与大数据编程实战》 学习笔记

    展开全文
  • 数据来源: 图灵社区 ...1、创建列联表dat ("sample.csv") table(dat) 管道处理,用左边的数据生成表install.packages("dplyr") library(dplyr) dat %>% table //等价于 table(dat)独立性检验dat2 <- da

    数据来源:
    图灵社区
    http://www.ituring.com.cn/book/1809
    1、创建列联表

    dat <- read.csv("sample.csv")
     table(dat)
    

    管道处理,用左边的数据生成表

    install.packages("dplyr")
    library(dplyr)
     dat  %>% table //等价于 table(dat)

    独立性检验

    dat2 <- dat  %>% table
    chisq.test(dat2)
    结果是
    Pearson's Chi-squared test with Yates' continuity correction
    
    data:  dat2
    X-squared = 0.15476, df = 1, p-value = 0.694
    

    皮尔逊卡方检验的结果显示,p大于0.05.故不是小概率事件,不拒绝原假设,从而两因素是相互独立的。

    展开全文
  • R语言详解参数检验和非参数检验二、参数检验R语言实现2.1 单样本t检验...wallis和置换多元方差分析检验3.5 spearman相关性检验四、列联表检验(定性资料)4.1 pearson卡方检验4.2 Fisher精确检验4.3 Cochran-Mantel–H
  • R语言实施皮尔森卡方检验

    千次阅读 2017-05-31 18:30:33
    说明检查两个数据集中的类别分量是否不同,在...卡方检验主要用于两个方面,一是对总体分布进行拟合性检验,检验观查次数是否与某种理论次数相一致。 二是独立性检验,用于检验两组或者多组资料相互关联还是彼此独立。
  • R语言学习:卡方检验

    千次阅读 2020-10-09 17:07:42
    卡方检验用来检验类别变量。 一、频数与频率 性别在不同组中的频数: > gender_f <- table(data_paper$gender, data_paper$group) > print(gender_f) 1 2 3 1 6 16 9 2 7 7 10 #行是性别,是组 ...
  • 使用R语言进行卡方检验

    千次阅读 2020-06-23 09:08:02
    (3)对多选项的处理:对每个子选项都生成列联表,并将每个列联表的选择人数的那一列的数据取出并进行拼接,生成矩阵A (4)求出每一行的总和,并生成单列矩阵B (5)求出每行数据对每行的和的占比,并生成相同维度...
  • R语言卡方分析与结果可视化 1,卡方分析简介 2,R语言chisq.test() 3,基于ggstatsplot包的可视化分析
  • R语言列联表

    2021-01-20 12:07:31
    R语言列联表 主要聚焦于类别变量的频数表和列联表,以下是常用的函数和方法: table():使用 N 个类别型变量(因子)创建一个 N 维列联表 xtab():根据一个公式和一个矩阵或数据框创建一个 N 维列联表 CrossTable()...
  • R 语言或者 Python 运算 卡方检验 ...#生成列联表格式 mytable <- matrix(c(23,45,15,96),2,2,byrow=T) #卡方检验 chisq.test(mytable,correct=F) # Result Pearson's Chi-squared test data: mytable X-sq
  • 在这篇文章中,我将展示如何计算列联表,我将在列联表中引入两个流行的测试:卡方检验和Fisher精确检验。 什么是列联表列联表提供关于两个分类变量的测量的整数计数。最简单的列联表是一个2×22×2频率表,由两...
  • 在这篇文章中,我将展示如何计算列联表,我将在列联表中引入两个流行的测试:卡方检验和Fisher精确检验。 什么是列联表列联表提供关于两个分类变量的测量的整数计数。最简单的列联表是一个2×22×2频率表,由两...
  • R语言列联表的统计分析及假设检验 卡方检验是一种确定两个分类变量之间是否存在显着相关性的统计方法。 这两个变量应该来自相同的人口,他们应该是类似 是/否,男/女,红/绿等。 例如,我们可以建立一个观察人们...
  • 卡方检验R语言实现

    万次阅读 2018-07-18 09:51:31
    R函数: chisq.test() chisq.test : 执行卡方检验 ...x为矩阵时,列联表保存于其中,故忽略Y #与x等长的概率,该值测试比率是否与概率一致,若不设置该参数,则检测概率彼此是否相同。 #p=rep(1/length(x),le...
  • 列联表crosstable 列联表不仅可以用来做简单的描述性统计,还可以在机器学习中用来比较识别正确率,FPR,TPR等等数据,以便我们比较不同的ML模型 or 调参。 2x2列联表一般长下面这样: Total Observations in Table:...
  • 这里的fisher.test()可以在任意行列数大于等于2的二维列联表上使用,但不能用于2*2的列联表。      Cochran-Mantel-Haenszel检验 Mantelhan.test()函数可用来进行Cochran-Mantel-Haenszel卡方检验...
  • 卡方检验(chi-square test) 或称X^2检验,主要作用是判定实际统计数据是否符合期望值,之后便可以演变出各种用法,例如:特征选择,变量各类的出现概率,变量是否相互有关联等。 主要公式: 右侧的X^2代表...
  • 我们将着眼于类别型变量的频数表和列联表,以及相应的独立性检验、相关性的度量、图形化展示结果的方法还将连带使用vcd包和gmodels包中的函数。数据来自vcd包中的Arthritis数据集library(vcd)一维列联表可以使用...
  • 在统计学分析里,最重要的元素是数据,数据的属性和用途决定了用什么样...小编这就为大家准备了SPSS中常用的分析方法之一「卡方检验」,手把手教给大家,宝典在手,统计不愁,我们开始吧。纳尼,你还不知道什么是SPS...
  • 列联表分析基于R语言

    万次阅读 2016-10-09 19:17:31
    列联表,变量组合形式的二维列联表,未出现的变量组合
  • 本节书摘来自华章计算机《R语言数据挖掘:实用项目解析》一书中的...2.7 列联表、二元统计及数据正态性检验 列联表是由两个或多个分类变量及每个分类所占比例构成的频率表。频率表展示的是一个分类变量,而列联表用...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 301
精华内容 120
关键字:

r语言卡方检验列联表