为了账号安全,请及时绑定邮箱和手机立即绑定

数据分析 第三篇:数据特征分析(分布分析+帕累托分析)

标签:
大数据

在数据质量得到保证的前提下,通过绘制图表、计算某些统计量等手段对数据的分布特征和贡献度进行分析(帕累托分析),分布分析能够揭示数据的分布特征和分布类型,对于定量数据,可以做出频率分布表、绘制频率分布直方图显示分布特征;对于定性数据,可用饼图和条形图显示分布情况。帕累托分析在频率分布直方图的基础上,绘制累积频率,计算投入的效益。

下面的例子使用vcd包中的Arthritis数据集来做数据的分布分析和帕累托分析。

复制代码

 library(grid)
 library(vcd)
 head(Arthritis)

  ID Treatment  Sex Age Improved1 57   Treated Male  27     Some2 46   Treated Male  29     None3 77   Treated Male  30     None4 17   Treated Male  32   Marked5 36   Treated Male  46   Marked6 23   Treated Male  58   Marked

复制代码

一,定量数据的分布分析

对于定量数据,做频率分布表,绘制频率分布直方图。选择“组数”和“组宽”是做频率分布分析时遇到的最主要问题,一般按照以下5个步骤来实现:

  • 求值域(range):值域 = 最大值 - 最小值

  • 决定组距和组数:组距是每个区间的长度,组数 = 值域 /  组距

  • 决定组限: 组限是指每个区间的端点,这一步是要确定每组的起点和终点

  • 列出频率分布表

  • 绘制频率分布直方图

在进行分组时,应遵循的主要原则有:

  • 各组之间是互斥的

  • 各组的组距相等

(1)制作频率分布表

按照年龄段来计算频数,每10年为一个年龄段,统计各个年龄段的人数。由于Arthritis数据集中并没有该分类变量,这就需要自定义区间,按照分组的间隔来制作频数分布表。频率分布表的制作过程在文章《R实战 第九篇:列联表和频数表》中有详细的描述,不再赘述。

复制代码

library(grid)
library(vcd)

labels <- c("< 30", "30 - 40", "40 - 50", "50 - 60", "60 - 70", ">= 70")
breaks <- c(1,30,40,50,60,70,100)
mytable <- cut(Arthritis$Age, breaks = breaks, labels = labels, right = TRUE )
df <- as.data.frame(table(Age=mytable))

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))

复制代码

(2)绘制频率分布直方图

使用ggplot绘制频率分布直方图:

ggplot(data=df, mapping=aes(x=factor(Age),y=FreqRate,group=factor(Age))) +
  geom_bar(stat="identity")+
  labs(title='Age distribution',x='Age range',y='Freq Rate')+
  theme_classic()

https://img1.sycdn.imooc.com//5b7a99390001d8ce04650239.jpg

二,定性数据的分布分析

对于定性变量,通常根据分类来分组,然后统计分组的频数或频率,可以采用饼图或条形图来描述定性数据的分布:

  • 饼图的每一个扇形部分代表每一类型的百分比或频数,根据定性变量的类型把饼图分成几个部分,每一个部分的大小与每一个类型的频数成正比;

  • 条形图的高度代表每一类型的百分比或频数,条形图的宽度没有意义。

按照Improved变量的频数来绘制饼图和条形图:

mytable <- with(Arthritis, table(Improved))
df <- as.data.frame(mytable)

1,绘制条形图

使用geom_bar绘制条形图:

复制代码

ggplot(data=df,mapping = aes(x=Improved, y=Freq,fill=Improved)) +
  geom_bar(stat="identity")+
  scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))+
  labs(title='Improved Distribution', x='Improved',y='Freq')+
  geom_text(stat="identity",aes(y=Freq, label = Freq), size=4, position=position_stack(vjust = 0.5))+
  theme_classic()

复制代码

https://img1.sycdn.imooc.com//5b7a994600015ea103950240.jpg

2,绘制饼图

使用geom_bar()和 coord_polar() 函数来绘制饼图,通常情况下,饼图显示的是百分比,而直方图显示的某个分类的具体数值:

复制代码

blank_theme <- theme_minimal()+
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    panel.border = element_blank(),
    panel.grid=element_blank(),
    axis.ticks = element_blank(),
    plot.title=element_text(size=14, face="bold")
  )

ggplot(data=df, mapping=aes(x="Improved",y=Freq,fill=Improved))+
  geom_bar(stat="identity",width=0.5,position='stack',size=5)+
  coord_polar("y", start=0)+
  scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))+
  blank_theme +
  geom_text(stat="identity",aes(y=Freq, label = scales::percent(Freq/sum(Freq))), size=4, position=position_stack(vjust = 0.5))

复制代码

https://img1.sycdn.imooc.com//5b7a994d0001a10f02890152.jpg

三,帕累托分析

帕累托分析依据的原理是20/80定律,80%的效益常常来自于20%的投入,而其他80%的投入却只产生了20%的效益,这说明,同样的投入在不同的地方会产生不同的效益。

怕累托图的绘制过程是按照贡献度从高到低依次排列,并绘制累积贡献度曲线。当样本数量足够大时,贡献度通常会呈现20/80分布。

使用ggplot2绘制的帕累托图的脚本和图如下所示:

https://img1.sycdn.imooc.com//5b7a99540001a3ca04520254.jpg

复制代码

library(grid)
library(vcd)
library(ggplot2)
library(scales)

labels <- c("< 30", "30 - 40", "40 - 50", "50 - 60", "60 - 70", ">= 70")
breaks <- c(1,30,40,50,60,70,100)
mytable <- cut(Arthritis$Age, breaks = breaks, labels = labels, right = TRUE )
df <- as.data.frame(table(Age=mytable),stringsAsFactors=FALSE)
df <- transform(df, FreqRate = prop.table(Freq))

df <- df[order(df$Freq,decreasing =TRUE),]
rownames(df) <- seq(nrow(df))
df$Age <- factor(df$Age,levels=df$Age)
df$cumRate <- cumsum(df$FreqRate)
df$cumRateLable <- as.character(percent(df$cumRate))

df$cumRateLable[1] <- ""ggplot(df, aes(x=Age,y=FreqRate,fill=Age)) +
  geom_bar(stat="identity",width = 0.7) +
  geom_text(stat='identity',aes(label=percent(FreqRate)),vjust=-0.5, color="black", size=3)+
  scale_y_continuous(name="cum Freq Rate",limits=c(0, 1.1),labels = function(x) paste0(x*100, "%"))+
  geom_point(aes(y=cumRate),show.legend=FALSE) +
  geom_text(stat="identity",aes(label=cumRateLable,y=cumRate), vjust=-0.5, size=3)+
  geom_path(aes(y=cumRate, group=1))

复制代码

 

 

参考文档:

作者悦光阴

出处http://www.cnblogs.com/ljhdo/

本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消