25.关于Exploratory Data Analysis之六

2021-08-09  本文已影响0人  心惊梦醒

【上一篇:24.关于Exploratory Data Analysis之五】
【下一篇:26.关于模式和模型】

    本篇介绍共变的第三部分:两个连续变量的共变。


    两个连续变量
    两个连续变量的可视化最经典的函数是geom_point(),你可以看到这些点的共变模式。例如,您可以看到钻石的克拉大小和价格之间的指数关系。

ggplot(data = diamonds) +
  geom_point(mapping = aes(x = carat, y = price))
重量和价格的关系

    随着数据集大小的增长,散点图变得不那么有用了,因为点开始重叠,并堆积成统一的黑色区域(如上所示)。你已经看到了解决这个问题的一种方法:使用alpha来增加透明度。

ggplot(data = diamonds) + 
  geom_point(mapping = aes(x = carat, y = price), alpha = 1 / 100)

    但是对于非常大的数据集来说,使用透明度是一个挑战。另一个解决方案是使用bin。之前您使用了geom_histogram()和geom_freqpoly()在一维中进行bin。现在,您将学习如何使用geom_bin2d()和geom_hex()在二维bin。
    geom_bin2d()和geom_hex()将坐标平面划分为2d bin,然后使用填充颜色显示每个bin中有多少点。geom_bin2d()创建矩形bin,geom_hex()创建六边形bin。你需要安装hexbin包来使用geom_hex()。

smaller <- diamonds %>% filter(carat < 3)
p1<-ggplot(data = smaller) +
geom_bin2d(mapping = aes(x = carat, y = price))
p2<-ggplot(data = smaller) +
geom_hex(mapping = aes(x = carat, y = price))
ggarrange(p1,p2)
2d bin

    另一种选择是把一个连续变量放在bin里,这样它就像一个分类变量。然后你可以用一种技巧来把你学过的分类变量和连续变量的组合形象化。例如,您可以将carat 分bin,然后为每个组显示一个箱线图:

ggplot(data = smaller, mapping = aes(x = carat, y = price)) + 
  geom_boxplot(mapping = aes(group = cut_width(carat, 0.1)))
对其中一个连续变量分bin

    cut_width (x, width),将x分成宽度为width的bins。默认情况下,不管有多少观测值,箱线图看起来都大致相同(除了离群值的数量),所以很难说每个箱线图汇总了不同数量的点。一种方法是设置varwidth = TRUE使箱图的宽度与点的数量成比例。另一种方法是在每个bin中显示大约相同数量的点。这就是cut_number()的工作:

p3<- ggplot(data = smaller, mapping = aes(x = carat, y = price)) +
geom_boxplot(mapping = aes(group = cut_width(carat, 0.1)),varwidth = T)
p4<- ggplot(data = smaller, mapping = aes(x = carat, y = price)) +
geom_boxplot(mapping = aes(group = cut_number(carat, 20)))
ggarrange(p3,p4)
将数值数据离散为分类数据的函数
    正如上文所述,cut_width()和cut_number()再加上cut_interval()是三个将数值数据离散为离散数据的函数(Discretise numeric data into categorical)。三个函数的帮助文档如下:
# 将x分为n个范围相同的组,这时,每个组的范围=max(x)-min(x)/n
cut_interval(x, n = NULL, length = NULL, ...)

# 将x分为n个组,每个组中近似包含相同数量的observations
# 每个组中observations的数量是length(x)/n
# 应该是先对值进行排序,才能画出来
cut_number(x, n = NULL, ...)

# 设置每个bin的宽度为width,所以最后会分成(max(x)-min(x))/wigth个组
cut_width(
  x,
  width,
  center = NULL,
  boundary = NULL,
  closed = c("right", "left"),
  ...
)

    练习题
    1. 您可以使用频率多边形,而不是用箱线图汇总条件分布。当使用cut_width() 和cut_number()时,你需要考虑什么?这将如何影响克拉和价格的二维分布的可视化?
    用geom_freqpoly()代替geom_boxplot()难道是这样?

p5<- ggplot(data = smaller, mapping = aes(x = carat, y = price)) +
geom_freqpoly(mapping = aes(group = cut_width(carat, 0.1)),stat="identity")
p6<-ggplot(data = smaller, mapping = aes(x = carat, y = price)) +
geom_freqpoly(mapping = aes(group = cut_number(carat, 20)),stat="identity")
ggarrange(p5,p6)
这是什么鬼?

    个人理解:划分bin的时候需要注意bin的数量吧。
    2. 可视化按price划分的carat的分布。

# maybe like this below:
ggplot(diamonds,mapping = aes(x=price,y=carat)) +geom_boxplot(aes(group=cut_number(price,10)))

    3. 与小钻石相比,大钻石的价格分布如何?是如你所料,还是出乎你的意料?
    大钻石价格更贵,与预期相符。
    4. 将你所学到的两种技术结合起来,就可以直观地看到cut、carat和price的组合分布。
    我学了啥?两种技术指的是什么?
    5. 二维图形显示了在一维图形中不可见的异常值。例如,下图中的一些点具有不寻常的x和y值组合,这使得这些点成为异常值,即使它们的x和y值在单独检查时看起来正常。在这种情况下,为什么散点图比binned plot显示得更好?

ggplot(data = diamonds) +
  geom_point(mapping = aes(x = x, y = y)) +
  coord_cartesian(xlim = c(4, 11), ylim = c(4, 11))
坐标调整后的散点图

    答案是:I don't know!

    关于共变的三篇已经结束,下面是关于模式和模型(patterns and models)

【上一篇:24.关于Exploratory Data Analysis之五】
【下一篇:26.关于模式和模型】

上一篇下一篇

猜你喜欢

热点阅读