异步社区

异步社区是国内领先的IT专业图书社区,由人民邮电出版社主办,致力于优质学习内容的出版和分享。

34篇博客

使用正确的图表理解数据(六):使用散点图和直方图上篇

异步社区2018-12-28 13:46
7.7使用散点图和直方图

我们经常会遇到散点图,因为它们是呈现两个变量之间关系时最常用的图表。如果想快速地查看两个变量的数据,并看看它们之间是否有关系(也就是相关性),我们可以快速地绘制一个散点图。对于一个散点图,必须有一个变量可以被改变,比如说,实验者系统地改变这个变量,这样就可以观察到它对另一个变量可能产生的影响。通过本节的学习,你将学会如何理解散点图。


7.7.1 准备工作
举个例子,比如我们想看两个事件是怎么相互影响的,或者它们是否真的相互影响。这种可视化在大数据集合上尤其有用,因为当只有数据时,我们没有办法通过查看原生格式的数据得到任何结论。如果数值之间存在相关性,这种相关性可以是正相关也可以是负相关。正相关指在增大X的值时,Y的值也会增加。负相关是增加X的值,Y的值会减小。在理想情况下,正相关是一条从坐标轴的左下角到右上角的线段。理想的负相关是一条从坐标轴的左上角到右下角的线段。


两个数据点之间理想的正相关是值为1,理想的负相关是值为-1。所有在此区间内的值表示两个值之间存在较弱的相关性。通常,从两个变量的真正关联的角度看,-0.5与0.5之间的值被认为是没有价值的。


一个正相关的例子是,放到慈善罐中的钱的总数与看到罐子的人数呈正相关性。一个负相关的例子是,从地点B到地点A所需要的时间,取决于地点A与地点B之间的距离。距离越大,完成这段旅行所花费的时间也越长。


我们这里展示的正相关的例子并不完美,因为每次访问时,不同的人放的钱的数量可能不同。但是一般来讲,我们可以假定看到罐子的人数量越多,罐子里的钱就越多。但是要记住,即使散点图显示了两个变量间存在相关性,但是它可能不是一个直接相关。可能有第三个变量影响所绘制的两个变量,因此相关性就仅仅是绘制的变量与第三个变量相关。最后,也许仅是看上去存在明显的相关性,但是在其背后并不存在真正的关系。


7.7.2 操作步骤
通过下面的示例代码,我们将展示散点图如何解释变量间的关联。我们使用的数据是从Google Trends门户网站获得的,在那里可以下载到包含给定参数的相关搜索量的归一化值的CSV文件。将数据存储在ch07_search_data.py Python模块中,这样就可以在接下来的代码中导入它。内容如下。
# ch07_search_data
# daily search trend for keyword 'flowers' for a year
DATA = [
1.04, 1.04, 1.16, 1.22, 1.46, 2.34, 1.16, 1.12, 1.24, 1.30, 1.44,
1.22, 1.26,
1.34, 1.26, 1.40, 1.52, 2.56, 1.36, 1.30, 1.20, 1.12, 1.12, 1.12,
1.06, 1.06,
1.00, 1.02, 1.04, 1.02, 1.06, 1.02, 1.04, 0.98, 0.98, 0.98, 1.00,
1.02, 1.02,
1.00, 1.02, 0.96, 0.94, 0.94, 0.94, 0.96, 0.86, 0.92, 0.98, 1.08,
1.04, 0.74,
0.98, 1.02, 1.02, 1.12, 1.34, 2.02, 1.68, 1.12, 1.38, 1.14, 1.16,
1.22, 1.10,
1.14, 1.16, 1.28, 1.44, 2.58, 1.30, 1.20, 1.16, 1.06, 1.06, 1.08,
1.00, 1.00,
0.92, 1.00, 1.02, 1.00, 1.06, 1.10, 1.14, 1.08, 1.00, 1.04, 1.10,
1.06, 1.06,
1.06, 1.02, 1.04, 0.96, 0.96, 0.96, 0.92, 0.84, 0.88, 0.90, 1.00,
1.08, 0.80,
0.90, 0.98, 1.00, 1.10, 1.24, 1.66, 1.94, 1.02, 1.06, 1.08, 1.10,
1.30, 1.10,
1.12, 1.20, 1.16, 1.26, 1.42, 2.18, 1.26, 1.06, 1.00, 1.04, 1.00,
0.98, 0.94,
0.88, 0.98, 0.96, 0.92, 0.94, 0.96, 0.96, 0.94, 0.90, 0.92, 0.96,
0.96, 0.96,
0.98, 0.90, 0.90, 0.88, 0.88, 0.88, 0.90, 0.78, 0.84, 0.86, 0.92,
1.00, 0.68,
0.82, 0.90, 0.88, 0.98, 1.08, 1.36, 2.04, 0.98, 0.96, 1.02, 1.20,
0.98, 1.00,
1.08, 0.98, 1.02, 1.14, 1.28, 2.04, 1.16, 1.04, 0.96, 0.98, 0.92,
0.86, 0.88,
0.82, 0.92, 0.90, 0.86, 0.84, 0.86, 0.90, 0.84, 0.82, 0.82, 0.86,
0.86, 0.84,
0.84, 0.82, 0.80, 0.78, 0.78, 0.76, 0.74, 0.68, 0.74, 0.80, 0.80,
0.90, 0.60,
0.72, 0.80, 0.82, 0.86, 0.94, 1.24, 1.92, 0.92, 1.12, 0.90, 0.90,
0.94, 0.90,
0.90, 0.94, 0.98, 1.08, 1.24, 2.04, 1.04, 0.94, 0.86, 0.86, 0.86,
0.82, 0.84,
0.76, 0.80, 0.80, 0.80, 0.78, 0.80, 0.82, 0.76, 0.76, 0.76, 0.76,
0.78, 0.78,
0.76, 0.76, 0.72, 0.74, 0.70, 0.68, 0.72, 0.70, 0.64, 0.70, 0.72,
0.74, 0.64,
0.62, 0.74, 0.80, 0.82, 0.88, 1.02, 1.66, 0.94, 0.94, 0.96, 1.00,
1.16, 1.02,
1.04, 1.06, 1.02, 1.10, 1.22, 1.94, 1.18, 1.12, 1.06, 1.06, 1.04,
1.02, 0.94,
0.94, 0.98, 0.96, 0.96, 0.98, 1.00, 0.96, 0.92, 0.90, 0.86, 0.82,
0.90, 0.84,
0.84, 0.82, 0.80, 0.80, 0.76, 0.80, 0.82, 0.80, 0.72, 0.72, 0.76,
0.80, 0.76,
0.70, 0.74, 0.82, 0.84, 0.88, 0.98, 1.44, 0.96, 0.88, 0.92, 1.08,
0.90, 0.92,
0.96, 0.94, 1.04, 1.08, 1.14, 1.66, 1.08, 0.96, 0.90, 0.86, 0.84,
0.86, 0.82,
0.84, 0.82, 0.84, 0.84, 0.84, 0.84, 0.82, 0.86, 0.82, 0.82, 0.86,
0.90, 0.84,
0.82, 0.78, 0.80, 0.78, 0.74, 0.78, 0.76, 0.76, 0.70, 0.72, 0.76,
0.72, 0.70,
0.64]


我们需要执行下面的步骤。
(1)使用一个干净的数据集合,该集合是在Google Trend上flowers关键字一年的搜索量,把该数据集合导入到变量d中。
(2)使用一个相同长度(365个数据点)的随机正态分布作为Google Trend数据集合,这个集合为d1。
(3)创建包含4个子区的图表。
(4)在第一个子区中,绘制d和d1的散点图。
(5)在第二个子区中,绘制d1和d1的散点图。
(6)在第三个子区中,绘制d1和反序d1的散点图。
(7)在第四个子区中,绘制d1和由d1与d组成的数据集合的散点图。
下面的代码演示了本节之前解释的关系:
import matplotlib.pyplot as plt
import numpy as np
# import the data
from ch07_search_data import DATA
d = DATA
# Now let's generate random data for the same period
d1 = np.random.random(365)
assert len(d) == len(d1)
fig = plt.figure()
ax1 = fig.add_subplot(221)
ax1.scatter(d, d1, alpha=0.5)
ax1.set_title('No correlation')
ax1.grid(True)
ax2 = fig.add_subplot(222)
ax2.scatter(d1, d1, alpha=0.5)
ax2.set_title('Ideal positive correlation')
ax2.grid(True)
ax3 = fig.add_subplot(223)
ax3.scatter(d1, d1*-1, alpha=0.5)
ax3.set_title('Ideal negative correlation')
ax3.grid(True)
ax4 = fig.add_subplot(224)
ax4.scatter(d1, d1+d, alpha=0.5)
ax4.set_title('Non ideal positive correlation')
ax4.grid(True)
plt.tight_layout()
plt.show()


当执行上面代码时,得到图7-9所示的输出。



原文网址:        https://www.epubit.com/book/detail/21642
内容来源:异步社区;版权属【人民邮电出版社 异步社区】所有,转载已获得授权;未经授权,不得以任何方式复制和传播本书内容,如需转载请联系异步社区。