[整理]统计数据的可视化——数据的频数分布

类别数据

用sample函数随机生成调查表

> opinion<-sample(c("赞成","反对"),20,replace = TRUE)
> home<-sample(c("社区A","社区B","社区C"),10,replace = TRUE)
> sex<-sample(c("男","女"),20,replace = TRUE)
> myinfo<-data.frame("社区"=home,"性别"=sex,"态度"=opinion)
> myinfo
    社区 性别 态度
1  社区B   女 赞成
2  社区B   男 赞成
3  社区C   女 赞成
4  社区B   女 反对
5  社区B   女 反对
6  社区B   男 反对
7  社区B   男 赞成
8  社区C   女 反对
9  社区C   男 反对
10 社区A   女 赞成
11 社区B   男 赞成
12 社区B   女 反对
13 社区C   女 赞成
14 社区B   男 赞成
15 社区B   男 赞成
16 社区B   女 反对
17 社区B   女 赞成
18 社区C   女 反对
19 社区C   女 赞成
20 社区A   男 反对

这里涉及三个类别变量:社区、性别和态度

简单频数表:也称为一维列联表

summary函数:生成频数分布表

> summary(myinfo)
    社区    性别      态度   
 社区A: 2   男: 8   反对: 9  
 社区B:12   女:12   赞成:11  
 社区C: 6                    

table函数:生成频数分布表

prop.table:转为百分比表

> table(myinfo$态度)

反对 赞成 
   9   11 
> prop.table(table(myinfo$态度))*100

反对 赞成 
  45   55 

二维列联表:两个类别变量交叉分类形成的频数分布表

addmargins函数:为表格加上边际和

> table(myinfo$性别,myinfo$态度)
     反对 赞成
  男    3    5
  女    6    6
> addmargins(table(myinfo$性别,myinfo$态度))   
      反对 赞成 Sum
  男     3    5   8
  女     6    6  12
  Sum    9   11  20

CrossTable函数:生成二维列联表并进行百分比分析

多维列联表:涉及两个以上类别变量

ftable函数:col.var的默认值为最后一个类别

> ftable(myinfo,row.vars = c("性别","态度"),col.var = "社区")
          社区 社区A 社区B 社区C
性别 态度                       
男   反对          1     1     1
     赞成          0     5     0
女   反对          0     4     2
     赞成          1     2     3

数值数据

生成数值数据频数分布表时要先将其转换为类别数据

随机产生一组数值数据:

> myvector<-sample(160:280,120)
  [1] 201 182 188 177 186 260 190 250 233 228 182 168 275 257
 [15] 230 202 183 254 237 243 215 173 205 236 245 211 230 253
 [29] 259 165 198 242 271 179 173 227 226 171 239 266 263 201
 [43] 175 257 179 261 270 220 237 186 249 225 188 241 272 226
 [57] 223 189 240 247 216 180 255 257 204 273 274 235 269 166
 [71] 167 218 194 249 219 247 169 213 181 214 196 173 241 253
 [85] 224 167 195 258 216 249 275 251 262 219 243 219 251 266
 [99] 196 232 225 275 232 188 200 265 200 227 241 227 203 191
[113] 212 246 206 219 253 240 241 175

数据分组:本例中分为 12组,组距为10

round_any函数:这个没有查到太多,本例中为计算不同组别的频数

as.numeric函数:将对象转化为数值向量

cumsum函数:累计数

paste函数:用于字符串连接,写了一篇专门的博客讲paste函数的基础用法,感觉和python的join用法相似

round函数:指定小数精度

> count<-table(round_any(myvector,10,floor))    #计算不同组别的数值总数
> count
160 170 180 190 200 210 220 230 240 250 260 270 
  6   9  11   7   9  12  11  10  16  13   8   8 
> count<-as.numeric(count)    #得到频数的类别变量
> count
 [1]  6  9 11  7  9 12 11 10 16 13  8  8
> pcount<-prop.table(count)*100    #得到百分比的类别变量
> cumsump<-cumsum(pcount)    #得到累计百分比的类别变量
> cumsump
 [1]   5.00000  12.50000  21.66667  27.50000  35.00000  45.00000  54.16667  62.50000  75.83333
[10]  86.66667  93.33333 100.00000
> name<-paste(seq(160,270,by=10),"-",seq(170,280,by=10),sep="")    #字符串连接,获取行名
> name
 [1] "160-170" "170-180" "180-190" "190-200" "200-210"
 [6] "210-220" "220-230" "230-240" "240-250" "250-260"
[11] "260-270" "270-280"
> gt<-data.frame("频数"=count,"百分比"=pcount,"累计百分比"=cumsump,row.names=name)
> round(gt,4)
        频数  百分比 累计百分比
160-170    6  5.0000     5.0000
170-180    9  7.5000    12.5000
180-190   11  9.1667    21.6667
190-200    7  5.8333    27.5000
200-210    9  7.5000    35.0000
210-220   12 10.0000    45.0000
220-230   11  9.1667    54.1667
230-240   10  8.3333    62.5000
240-250   16 13.3333    75.8333
250-260   13 10.8333    86.6667
260-270    8  6.6667    93.3333
270-280    8  6.6667   100.0000

cut函数:对数据进行分组

cut(x,beraks,right=TRUE,dig.lab=3,...)

breaks=k*(x1:x2)    k为组的间隔,k*x1为下限,k*x2为上限,right为是否封闭上限。

> d<-table(cut(myvector,breaks=10*(16:28),right = FALSE))
> d
[160,170) [170,180) [180,190) [190,200) [200,210) [210,220) 
        6         9        11         7         9        12 
[220,230) [230,240) [240,250) [250,260) [260,270) [270,280) 
       11        10        16        13         8         8 
> df<-data.frame(d)
> df
        Var1 Freq
1  [160,170)    6
2  [170,180)    9
3  [180,190)   11
4  [190,200)    7
5  [200,210)    9
6  [210,220)   12
7  [220,230)   11
8  [230,240)   10
9  [240,250)   16
10 [250,260)   13
11 [260,270)    8
12 [270,280)    8
> percent<-df$Freq/sum(df$Freq)*100
> cumsump<-cumsum(percent)
> mytable<-data.frame(d,percent,cumsump)
> mytable
        Var1 Freq   percent   cumsump
1  [160,170)    6  5.000000   5.00000
2  [170,180)    9  7.500000  12.50000
3  [180,190)   11  9.166667  21.66667
4  [190,200)    7  5.833333  27.50000
5  [200,210)    9  7.500000  35.00000
6  [210,220)   12 10.000000  45.00000
7  [220,230)   11  9.166667  54.16667
8  [230,240)   10  8.333333  62.50000
9  [240,250)   16 13.333333  75.83333
10 [250,260)   13 10.833333  86.66667
11 [260,270)    8  6.666667  93.33333
12 [270,280)    8  6.666667 100.00000

猜你喜欢

转载自blog.csdn.net/cccrush/article/details/80147964
今日推荐