提交 9e60c95e 编写于 作者: W wizardforcel

ch6

上级 553e26c5
# 六、可视化
> 原文:[Visualization](https://github.com/data-8/textbook/tree/gh-pages/chapters/06)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
表格是一种组织和可视化数据的强大方式。然而,无论数据如何组织,数字的大型表格可能难以解释。 有时解释图片比数字容易得多。
......@@ -57,6 +64,8 @@ actors
actors.scatter('Number of Movies', 'Total Gross')
```
![](img/6-1.png)
散点图包含 50 个点,表中的每个演员为一个。 一般来说,你可以看到它向上倾斜。 一个演员的电影越多,所有这些电影的总收入就越多。
在形式上,我们说图表显示了变量之间的关联,并且关联是正的:一个变量的高值往往与另一个变量的高值相关联,而低值也是一样,通常情况下。
......@@ -71,6 +80,8 @@ actors.scatter('Number of Movies', 'Total Gross')
actors.scatter('Number of Movies', 'Average per Movie')
```
![](img/6-2.png)
这是一个截然不同的情况,并表现出负相关。 一般来说,演员的电影数量越多,每部电影的平均收入就越少。
另外,有一个点是非常高的,在绘图的左边。 它对应于一个电影数量很少,每部电影平均值很高的演员。 这个点是异常的。 它位于数据的一般范围之外。 事实上,这与绘图中的其他所有点相差甚远。
......@@ -84,6 +95,8 @@ no_outlier = actors.where('Number of Movies', are.above(10))
no_outlier.scatter('Number of Movies', 'Average per Movie')
```
![](img/6-3.png)
负相关仍然清晰可见。 让我们找出一些演员,对应位于绘图右侧的点,这里电影数量较多:
```py
......@@ -115,6 +128,8 @@ actors.where('Number of Movies', are.below(10))
这些电影是什么? 你可能知道《星球大战:C-3PO》中的 Droid C-3PO,那是金属机甲里面的安东尼·丹尼尔斯。 他扮演 C-3PO。
![](img/6-4.png)
丹尼尔斯先生的全部电影(除了客串)都是由高收入的“星球大战”系列电影组成的。 这就解释了他的高平均收入和低电影数量。
类型和制作预算等变量,会影响电影数量与每部电影的平均收入之间的关联。 这个例子提醒人们,研究两个变量之间的关联,往往也涉及到了解其他相关的变量。
......@@ -161,6 +176,8 @@ movies_by_year
movies_by_year.plot('Year', 'Number of Movies')
```
![](img/6-5.png)
虽然每年的数字都有明显的变化,但图形急剧上升,然后呈现平缓的上升趋势。 20 世纪 80 年代早期的剧增,部分是由于在上世纪 70 年代,电影制作人推动电影业的几年后,电影制片厂重新回到电影制作的前沿。
我们的重点将放在最近几年。 根据电影的主题,对应 2000 年到 2015 年的行,分配给名称`century_21`
......@@ -170,6 +187,8 @@ century_21 = movies_by_year.where('Year', are.above(1999))
century_21.plot('Year', 'Number of Movies')
```
![](img/6-6.png)
2008 年的全球金融危机有明显的效果 - 2009 年发行的电影数量急剧下降。
但是,美元数量并没有太大的变化。
......@@ -178,6 +197,8 @@ century_21.plot('Year', 'Number of Movies')
century_21.plot('Year', 'Total Gross')
```
![](img/6-7.png)
尽管发生了金融危机,电影发行的数量也少得多,但 2009 年的国内总收入仍高于 2008 年。
造成这种矛盾的一个原因是,人们在经济衰退时往往会去看电影。 “经济低迷时期,美国人涌向电影”,“纽约时报”于 2009 年 2 月说。文章引用南加州大学的马丁·卡普兰(Martin Kaplan)的话说:“人们想要忘记自己的烦恼,想和别人在一起。” 当节假日和昂贵的款待难以负担,电影提供了受欢迎的娱乐和宽慰。
......@@ -232,17 +253,21 @@ icecream
icecream.barh('Flavor', 'Number of Cartons')
```
如果表格只包含一列类别和一列频率(如冰淇淋),则方法调用甚至更简单。 您可以指定包含类别的列,`barh`将使用另一列中的值作为频率。
![](img/6-8.png)
如果表格只包含一列类别和一列频率(如冰淇淋),则方法调用甚至更简单。 你可以指定包含类别的列,`barh`将使用另一列中的值作为频率。
```py
icecream.barh('Flavor')
```
![](img/6-9.png)
### 类别分布的特征
除了纯粹的视觉差异之外,条形图和我们在前面章节中看到的两个图表之间还有一个重要的区别。 它们是散点图和线图,两者都显示两个数值变量 - 两个轴上的变量都是数值型的。 相比之下,条形图的一个轴上是类别,在另一个轴上具有数值型频率。
这对图表有影响。首先,每个条形的宽度和相邻条形之间的间隔完全取决于生成图的人,或者用于生成该图的程序。 Python 为我们做了这些选择。 如果您要手动绘制条形图,则可以做出完全不同的选择,并且仍然会是完全正确的条形图,前提是您使用相同宽度绘制了所有条形,并使所有间隔保持相同。
这对图表有影响。首先,每个条形的宽度和相邻条形之间的间隔完全取决于生成图的人,或者用于生成该图的程序。 Python 为我们做了这些选择。 如果你要手动绘制条形图,则可以做出完全不同的选择,并且仍然会是完全正确的条形图,前提是你使用相同宽度绘制了所有条形,并使所有间隔保持相同。
最重要的是,条形可以以任何顺序绘制。 “巧克力”,“香草”和“草莓”这些类别没有普遍的等级顺序,不像数字`5, 7``10`
......@@ -252,6 +277,8 @@ icecream.barh('Flavor')
icecream.sort('Number of Cartons', descending=True).barh('Flavor')
```
![](img/6-10.png)
这个条形图包含的信息和以前的完全一样,但是它更容易阅读。 虽然在只读三个条形的情况下,这并不是一个巨大的收益,但是当分类数量很大时,这可能是相当重要的。
## 组合分类数据
......@@ -290,7 +317,7 @@ top
movies_and_studios = top.select('Title', 'Studio')
```
`Table``group`方法组允许我们,通过将每个工作室当做一个类别,并将每一行分配给一个类别,来计算每个工作室出现在表中的频率。 `group`方法将包含类别的列标签作为其参数,并返回每个类别中行数量的表格。 数量列始终称为`count`,但如果希望的话,则可以使用`relabeled`更改该列。
`Table``group`方法组允许我们,通过将每个工作室当做一个类别,并将每一行分配给一个类别,来计算每个工作室出现在表中的频率。 `group`方法将包含类别的列标签作为其参数,并返回每个类别中行数量的表格。 数量列始终称为`count`,但如果希望的话,则可以使用`relabeled`更改该列。
```py
movies_and_studios.group('Studio')
......@@ -321,6 +348,8 @@ studio_distribution = movies_and_studios.group('Studio')
studio_distribution.sort('count', descending=True).barh('Studio')
```
![](img/6-11.png)
华纳兄弟(Warner Brothers)和布埃纳维斯塔(Buena Vista)是前 200 电影中最常见的工作室。 华纳兄弟制作了哈利波特电影,布埃纳维斯塔制作了星球大战。
由于总收入以未经调整的美元来衡量,所以最近几年的顶级电影比过去几十年更频繁,这并不令人惊讶。 以绝对数量来看,现在的电影票价比以前更高,因此总收入也更高。 这是通过条形图证明的,这些条形图显示了 200 部电影的发行年份。
......@@ -330,6 +359,8 @@ movies_and_years = top.select('Title', 'Year')
movies_and_years.group('Year').sort('count', descending=True).barh('Year')
```
![](img/6-12.png)
所有最长的条形都对应 2000 年以后的年份。这与我们的观察一致,即最近几年应该是最频繁的。
### 面向数值变量
......@@ -344,6 +375,8 @@ movies_and_years.group('Year').sort('count', descending=True).barh('Year')
movies_and_years.group('Year').barh('Year')
```
![](img/6-13.png)
现在年份是升序了。 但是这个条形图还是有点问题。 1921 年和 1937 年的条形与 1937 年和 1939 年的条形相距甚远。条形图并没有显示出,200 部电影中没有一部是在 1922 年到 1936 年间发布的。基于这种可视化,这种不一致和遗漏,使早期年份的分布难以理解。
条形图用做类别变量的可视化。 当变量是数值,并且我们创建可视化时,必须考虑其值之间的数值关系。 这是下一节的主题。
......@@ -352,7 +385,7 @@ movies_and_years.group('Year').barh('Year')
### 可视化数值分布
数据科学家研究的许多变量是定量的或数值的。它们的值是可以做算术的数字。我们所看到的例子包括一本书的章节数量,电影的收入以及美国人的年龄。
数据科学家研究的许多变量是定量的或数值的。它们的值是可以做算术的数字。我们所看到的例子包括一本书的章节数量,电影的收入以及美国人的年龄。
类别变量的值可以按照数字编码,但是这不会使变量成为定量的。在我们研究的,按年龄组分类的人口普查数据的例子中,分类变量`SEX`中,`'Male'`的数字代码为`1``'Female'`的数字代码为`2`,以及分组`1``2`的合计为`0``1``2`是数字,在这种情况下,从`2`中减`1`或取`0,1``2`的平均值,或对这三个值执行其他算术是没有意义的。 `SEX`是一个类别变量,即使这些值已经赋予一个数字代码。
......@@ -416,6 +449,8 @@ hist方法生成列中值的直方图。 可选的单位参数用于两个轴上
millions.hist('Adjusted Gross', unit="Million Dollars")
```
![](img/6-14.png)
### 横轴
这些金额已被分组为连续的间隔,称为桶。尽管在这个数据集中,没有电影正好在两个桶之间的边缘上,但是`hist`必须考虑数值可能在边缘的情况。所以`hist`有一个端点约定:`bin`包含左端点的数据,但不包含右端点的数据。
......@@ -434,6 +469,8 @@ millions.hist('Adjusted Gross', unit="Million Dollars")
millions.hist('Adjusted Gross', bins=np.arange(300,2001,100), unit="Million Dollars")
```
![](img/6-15.png)
这个图的横轴比较容易阅读。 标签`200,400,600`等以对应的值为中心。 最高的条形是对应三亿到四亿美元之间的电影。
少数电影投入了 8 亿美元甚至更多。 这导致这个数字“向右倾斜”,或者更不正式地说,“右侧长尾”。 大量人口的收入或租金等变量的分布也经常具有这种形式。
......@@ -476,6 +513,8 @@ bin_counts.show()
bin_counts.hist('Adjusted Gross count', bin_column='bin', unit='Million Dollars')
```
![](img/6-16.png)
### 纵轴:密度刻度
一旦我们已经照顾到细节,如桶的末端,直方图的横轴易于阅读。 纵轴的特征需要更多关注。 我们会一一讲解。
......@@ -537,6 +576,8 @@ uneven = make_array(300, 400, 600, 1500)
millions.hist('Adjusted Gross', bins=uneven, unit="Million Dollars")
```
![](img/6-17.png)
这里是三个桶中的数量。
```py
......@@ -564,6 +605,7 @@ millions.bin('Adjusted Gross', bins=uneven)
millions.hist('Adjusted Gross', bins=np.arange(300,2001,100), normed=False)
```
![](img/6-18.png)
虽然数量刻度可能比密度刻度更自然,但当桶宽度不同时,图表高度的有误导性。 下面看起来(由于计数)高收入电影相当普遍,事实上我们已经看到它们相对较少。
......@@ -571,6 +613,8 @@ millions.hist('Adjusted Gross', bins=np.arange(300,2001,100), normed=False)
millions.hist('Adjusted Gross', bins=uneven, normed=False)
```
![](img/6-19.png)
即使使用的方法被称为`hist`,上面的图不是一个直方图。 误导性地夸大了至少 6 亿美元的电影比例。 每个桶的高度只是按照桶中的电影数量绘制,而不考虑桶宽度的差异。
如果最后两个桶组合起来,情况就变得更加荒谬了。
......@@ -580,6 +624,8 @@ very_uneven = make_array(300, 400, 1500)
millions.hist('Adjusted Gross', bins=very_uneven, normed=False)
```
![](img/6-20.png)
在这个基于数量的图像中,电影分布完全失去了形状。
### 直方图:通用原则和计算
......@@ -627,6 +673,8 @@ millions.hist('Adjusted Gross', bins=very_uneven, normed=False)
millions.hist('Adjusted Gross', bins=uneven, unit="Million Dollars")
```
![](img/6-21.png)
为了看到它,让我们将`[300, 400)`划分为更窄的 10 个桶。每个桶的宽度都是一千万美元。
```py
......@@ -634,6 +682,8 @@ some_tiny_bins = make_array(300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 40
millions.hist('Adjusted Gross', bins=some_tiny_bins, unit='Million Dollars')
```
![](img/6-22.png)
### 直方图 Q&A
让我们再画一遍直方图,这次只有四个桶,检查我们对概念的理解。
......@@ -645,6 +695,7 @@ millions.hist('Adjusted Gross', bins=uneven_again, unit='Million Dollars')
millions.bin('Adjusted Gross', bins=uneven_again)
```
![](img/6-23.png)
| bin | Adjusted Gross count |
| --- | --- |
......@@ -720,6 +771,8 @@ heights
heights.scatter('son')
```
![](img/6-24.png)
注意我们仅仅指定了公共的横轴上的变量(儿子的身高)。 Python 绘制了两个散点图:这个变量和另外两个之间的关系,每个关系一个。
金色和蓝色的散点图向上倾斜,并显示出儿子的高度和父母的高度之间的正相关。 蓝色(父亲)的绘图一般比金色高,因为父亲一般比母亲高。
......@@ -770,11 +823,13 @@ children.show()
children.plot('AGE')
```
![](img/6-25.png)
在这个刻度上,重要的是要记住我们只有`0,1,2`岁等等的数据。 两个图形的点相互“交织”。
这些图表在一些地方相互交叉:例如,2010 年的 4 岁人数比 2014 年多,2014 年的 14 岁人数比 2010 年多。
当然,2014 年的 14 岁儿童大部分都是 2010 年的 10 岁儿童。为了看到这一点,请查看 14 岁的金色图表和 10 岁的蓝色图表。事实上,会注意到,整个金色图表(2014 年)看起来像蓝色图表(2010 年)向右滑了 4 年。 由于 2010 年至 2014 年间进入该国的儿童的净效应,这个下滑幅度还是有所上升, 幸运的是,在这些年代,没有太多的生命损失。
当然,2014 年的 14 岁儿童大部分都是 2010 年的 10 岁儿童。为了看到这一点,请查看 14 岁的金色图表和 10 岁的蓝色图表。事实上,会注意到,整个金色图表(2014 年)看起来像蓝色图表(2010 年)向右滑了 4 年。 由于 2010 年至 2014 年间进入该国的儿童的净效应,这个下滑幅度还是有所上升, 幸运的是,在这些年代,没有太多的生命损失。
### 条形图
......@@ -807,6 +862,8 @@ usa_ca
usa_ca.barh('Ethnicity')
```
![](img/6-26.png)
虽然绘制叠加的条形图非常简单,但是我们可以在这个图表上找到太多的信息,以便能够理清种群之间的相似性和差异性。 似乎很清楚的是,美国所有人和美国儿童的种族分布比任何其他列都更相似,但是一次比较一对要容易得多。
首先比较美国和加利福尼亚的整个人口。
......@@ -815,6 +872,8 @@ usa_ca.barh('Ethnicity')
usa_ca.select('Ethnicity', 'USA All', 'CA All').barh('Ethnicity')
```
![](img/6-27.png)
这两个分布是完全不同的。 加利福尼亚州的拉美裔和其他类别比例较高,黑人和白人比例相应较低。 这种差异主要是由于,加利福尼亚州的地理位置和移民模式,无论是历史上还是近几十年来。 例如,加利福尼亚的“其他”类别包括相当一部分亚洲人和太平洋岛民。
从图中可以看出,2014 年加州近 40% 的人口是拉美裔。 与该州儿童人口的比较表明,未来几年拉美裔人口的比例可能会更高。 在加州儿童中,50% 属于拉美裔。
......@@ -823,4 +882,6 @@ usa_ca.select('Ethnicity', 'USA All', 'CA All').barh('Ethnicity')
usa_ca.select('Ethnicity', 'CA All', 'CA Children').barh('Ethnicity')
```
![](img/6-28.png)
更复杂的数据集自然会产生各种有趣的可视化效果,包括不同种类的重叠图形。 为了分析这些数据,获得更多的数据操作技能的有帮助的,这样我们就可以将数据转化为一种形式,使我们能够使用本节中的方法。 在下一章中,我们将介绍其中的一些技巧。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册