zoukankan      html  css  js  c++  java
  • R实战 第十篇:列联表和频数表

    列联表是观测数据按两个或更多属性(定性变量)分类时所列出的频数分布表,它是由两个以上的变量进行交叉分类的频数分布表。交互分类的目的是将两变量分组,然后比较各组的分布状况,以寻找变量间的关系。

    按两个变量交叉分类的,该列联表称为两维列联表;若按3个变量交叉分类,所得的列联表称为3维列联表,依次类推。一维列联表就是频数分布表。频数就是各个分组中属性出现的次数。

    频数也称“次数”,对样本数据按某些属性进行分组,统计出各个组内含个体的个数,就是频数。

    本文使用vcd包中的Arthritis数据集来演示如何创建列联表。

    一,创建频数表

    频数表用于探索类别型变量,常用table()和 xtabs()来创建频数表:

    table(var1, var2, ...,varN)
    xtabs(formula, data)

    参数注释:

    • table()函数:使用N个类别变量(因子)创建一个N维列联表,
    • xtabs()函数:根据一个公式(~var1+var2+...+varN)创建一个N维列联表。

    总体来说,要进行交叉分类的变量应出现在公式的右侧,即 ~ 符号的右方,以+  作为分割符。本文重点介绍一维列联表和二维列联表,对于高维列联表,不做介绍。

    函数prop.table()以列联表作为参数,以margins定义的边际把列联表中的频数表示为比例关系。

    prop.table(table,margins)

    参数注释:table是列联表,margins是边际列表,1是第一个分类变量,2是第二个分类变量

    函数margin.table()以列联表作为参数,以margins定义的边际列表来计算频数的和。

    margin.table(table,margins)

    参数注释:table是列联表,margins是边际列表,1是第一个分类变量,2是第二个分类变量

    1,创建一维列联表

    一维列联表是根据一个分类变量列出变量各个值得频数:

    with(Arthritis,table(Improved))
    xtabs(~Improved,data=Arthritis)

    Improved是分类得变量名,None、Some和Marked是变量的值,数值是各个变量值出现的次数(频数)。

    Improved
      None   Some Marked 
        42     14     28 

    2,创建二维列联表

    二维列联表是指按照两个分类变量列出的频数表:

    with(Arthritis,table(Improved,Sex))
    xtabs(~Improved+Sex,data=Arthritis)

    Sex和Improved是分类的变量名,两个分类交叉分类,查看两个分类之间的关系:

            Sex
    Improved Female Male
      None       25   17
      Some       12    2
      Marked     22    6

    3,把列联表的频数转换为比例值

    使用prop.table(),把列联表的频数转换为比例值

    mytable <- xtabs(~Improved+Sex,data=Arthritis)
    prop.table(mytable)
    
            Sex
    Improved     Female       Male
      None   0.29761905 0.20238095
      Some   0.14285714 0.02380952
      Marked 0.26190476 0.07142857

    4,计算列联表的边际列表的和

    使用margin.table(),按照边际列表计算列联表的频数之和

    mytable <- xtabs(~Improved+Sex,data=Arthritis)
    margin.table(mytable,1)
    
    Improved
      None   Some Marked 
        42     14     28 

    二,自定义区间

    按照分类变量来计算频数,有时不能满足需要,例如,按照年龄段来计算频数,每10年为一个年纪段,统计各个年龄段的人数。由于Arthritis数据集中并没有该分类变量,这就需要自定义区间,按照分组的间隔来制作频数分布表。

    我从网上找到一个制作频率分布表的步骤,总共4步。

    制作频率分布表的步骤如下:
    1.求全距(全距亦称极差):从数据中找出最大值Max和最小值Min,并求出它们的差,本例中最大值Max=100,最小值Min=42,故全距为Max-Min=100-42=58,从全距可以初步了解数据的差异幅度,同时亦为决定组距与组数提供了依据。
    2.决定组距与组数:组数D和组距K之间有关系式D>=(Max- Min)/K,本例中取K=5,则D= (Max-Min)/K=58/5,向上取整为12,故分为12组。
    3.决定组限:组限就是表明每组两端的数值,其中每组的起点数值称为下限RL,终点数值称为上限RU,上限和下限也是数据的分点,通常区间是左闭右开型的:[RL ,  RU)
    4.制作频率分布表:其中落在各个小组内的数据个数即为频数(或称次数),常用f表示,每一小组的频数与样本容量的比值即为频率。
    step1,求极差
    最大值是74,最小值是23,极差是51
    age_range <- max(Arthritis$Age)-min(Arthritis$Age)

    step2,决定组距和组数

    把组距定为10,那么组数是6(不小于 51/10 的最小整数)

    step3,决定分点

    使用cut()函数来分割Age数据,设置断点向量breaks,以及每个区间的名称lables:

    labels <- c("< 30", "30 - 40", "40 - 50", "50 - 60", "60 - 70", ">= 70")
    breaks <- c(1,30,40,50,60,70,100)

    step4,制作频数分布表

    使用cut()函数按照指定的断点来分割数据,得到各个分组,使用table()函数得到频数表:

    mytable <- cut(Arthritis$Age, breaks = breaks, labels = labels, right = TRUE )
    df <- as.data.frame(table(Age=mytable))
    #names(df)[1] <- c('Age')

    cut()函数返回的是mytable的类型是因子,也就是说,cut()函数返回的结果是因子向量:

    class(mytable)
    [1] "factor"

    查看频数分布表,按照Age(把mytable重命名为Age)因子进行分组,统计各个因子属性值的频数:

    > table(Age=mytable)
    Age
       < 30 30 - 40 40 - 50 50 - 60 60 - 70   >= 70 
          7       8      12      29      27       1 

    把频数分布表转换为数据框,得到二维表如下图所示:

    > df
          Age Freq
    1    < 30       7
    2 30 - 40       8
    3 40 - 50      12
    4 50 - 60      29
    5 60 - 70      27
    6   >= 70       1

    step5,列出频率分布表

    列出频率分布表,包括累积频数和累计频率

    df <- transform(df, cumFreq = cumsum(Freq), FreqRate = prop.table(Freq))
    df <- transform(df, cumFreqRate= cumsum(FreqRate))
    df <- transform(df,FreqRate=round(FreqRate * 100,2), cumFreqRate= round(cumFreqRate*100,2))

    查看频率分布表:

          Age Freq cumFreq FreqRate cumFreqRate
    1    < 30    7       7     8.33        8.33
    2 30 - 40    8      15     9.52       17.86
    3 40 - 50   12      27    14.29       32.14
    4 50 - 60   29      56    34.52       66.67
    5 60 - 70   27      83    32.14       98.81
    6   >= 70    1      84     1.19      100.00

    参考文档:

    SPSS——描述性统计分析——列联表

    频数分布表

  • 相关阅读:
    [Tyvj模拟赛]运
    [NOIP 2011]聪明的质监员
    暑假集训D10总结
    暑假集训D9总结
    [POI2008]枪战Maf
    [Usaco2007 Open]Fliptile 翻格子游戏
    [bzoj1592] Making the Grade
    学生信息管理系统(增删改查)【代码不完整】
    《程序员修炼之道》第五次读后感
    《程序员修炼之道》第四次读后感
  • 原文地址:https://www.cnblogs.com/ljhdo/p/4484246.html
Copyright © 2011-2022 走看看