6.md 13.0 KB
Newer Older
W
ch6.  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
# 六、可视化


表格是一种组织和可视化数据的强大方式。然而,无论数据如何组织,数字的大型表格可能难以解释。 有时解释图片比数字容易得多。

在本章中,我们将开发一些数据分析的基本图形方法。 我们的数据源是[互联网电影数据库](http://www.imdb.com/)(IMDB),这是一个在线数据库,包含电影,电视节目,和视频游戏等信息。[Box Office Mojo](http://www.boxofficemojo.com/) 网站提供了许多 IMDB 数据摘要,我们已经采用了其中一些。 我们也使用了 [The Numbers](http://www.the-numbers.com/) 的数据摘要,这个网站的口号是“数据和电影业务的相遇之处”。

## 散点图和线形图


`actors`表包含好莱坞的男性和女性演员的数据。 其中的列是:

| 列 | 内容 |
| --- | --- |
| Actor | 演员名称 |
| Total Gross | 演员所有电影的国内票房总收入(百万美元) |
| Number of Movies | 演员所演的电影数量 |
| Average per Movie | 总收入除以电影数量 |
| #1 Movie | 演员所演的票房最高的电影 |
| Gross | 演员的 #1 电影的国内票房总收入(百万美元) |

在总票房的计算中,数据的制表人没有包括一些电影,其中演员是客串角色或陈述角色,没有太多的登场时间。

这个表格有 50 行,对应着 50 个最顶级的演员。 这个表已经按照`Total Gross`排序了,所以很容易看出,`Harrison Ford`是最棒的演员。 总的来说,他的电影的国内票房收入比其他演员的电影多。

```py
actors = Table.read_table('actors.csv')
actors
```

| Actor | Total Gross | Number of Movies | Average per Movie | #1 Movie | Gross |
| --- | --- | --- | --- | --- | --- |
| Harrison Ford | 4871.7 | 41 | 118.8 | Star Wars: The Force Awakens | 936.7 |
| Samuel L. Jackson | 4772.8 | 69 | 69.2 | The Avengers | 623.4 |
| Morgan Freeman | 4468.3 | 61 | 73.3 | The Dark Knight | 534.9 |
| Tom Hanks | 4340.8 | 44 | 98.7 | Toy Story 3 | 415 |
| Robert Downey, Jr. | 3947.3 | 53 | 74.5 | The Avengers | 623.4 |
| Eddie Murphy | 3810.4 | 38 | 100.3 | Shrek 2 | 441.2 |
| Tom Cruise | 3587.2 | 36 | 99.6 | War of the Worlds | 234.3 |
| Johnny Depp | 3368.6 | 45 | 74.9 | Dead Man's Chest | 423.3 |
| Michael Caine | 3351.5 | 58 | 57.8 | The Dark Knight | 534.9 |
| Scarlett Johansson | 3341.2 | 37 | 90.3 | The Avengers | 623.4 |

(已省略 40 行)

术语。变量是我们称之为“特征”的东西的正式名称,比如`'number of movies'`。 术语“变量”强调了,对于不同的个体,这个特征可以有不同的值 - 演员所演电影的数量因人而异。

拥有数值的变量(如`'number of movies'``'average gross receipts per movie'`)的变量称为定量或数值变量。

### 散点图

散点图展示两个数值变量之间的关系。 在前面的章节中,我们看到了一个散点图的例子,我们看了两个经典小说的时间段和角色数量。

`Table``scatter`方法绘制一个散点图,由表格的每一行组成。它的第一个参数是要在横轴上绘制的列标签,第二个参数是纵轴上的列标签。

```py
actors.scatter('Number of Movies', 'Total Gross')
```

散点图包含 50 个点,表中的每个演员为一个。 一般来说,你可以看到它向上倾斜。 一个演员的电影越多,所有这些电影的总收入就越多。

在形式上,我们说图表显示了变量之间的关联,并且关联是正的:一个变量的高值往往与另一个变量的高值相关联,而低值也是一样,通常情况下。

当然有一些变化。 一些演员有很多电影,但总收入中等。 其他人电影数量中等,但收入很高。正相关只是一个大体趋势的叙述。

在课程后面,我们将学习如何量化关联。目前,我们只是定性地思考。

现在我们已经探索了电影的数量与总收入的关系,让我们把注意力转向它与每部电影的平均收入的关系。

```py
actors.scatter('Number of Movies', 'Average per Movie')
```

这是一个截然不同的情况,并表现出负相关。 一般来说,演员的电影数量越多,每部电影的平均收入就越少。

另外,有一个点是非常高的,在绘图的左边。 它对应于一个电影数量很少,每部电影平均值很高的演员。 这个点是异常的。 它位于数据的一般范围之外。 事实上,这与绘图中的其他所有点相差甚远。

我们将通过查看绘图的左右两端的点,来进一步检查负相关。

对于右端,我们通过查看没有异常值的部分来放大图的主体。

```py
no_outlier = actors.where('Number of Movies', are.above(10))
no_outlier.scatter('Number of Movies', 'Average per Movie')
```

负相关仍然清晰可见。 让我们找出一些演员,对应位于绘图右侧的点,这里电影数量较多:

```py
actors.where('Number of Movies', are.above(60))
```

| Actor | Total Gross | Number of Movies | Average per Movie | #1 Movie | Gross |
| --- | --- | --- | --- | --- | --- |
| Samuel L. Jackson | 4772.8 | 69 | 69.2 | The Avengers | 623.4 |
| Morgan Freeman | 4468.3 | 61 | 73.3 | The Dark Knight | 534.9 |
| Robert DeNiro | 3081.3 | 79 | 39 | Meet the Fockers | 279.3 |
| Liam Neeson | 2942.7 | 63 | 46.7 | The Phantom Menace | 474.5 |

伟大的演员罗伯特·德尼罗(Robert DeNiro)拥有最高的电影数量和最低的每部电影的平均收入。 其他优秀的演员在不远处的点,但德尼罗在极远处。

为了理解负相关,请注意,演员所演的电影越多,在风格,流派和票房方片,这些电影变化就越大。 例如,一个演员可能会出现在一些高收入的动作电影或喜剧中(如 Meet Fockers),也可能是优秀但不会吸引大量人群的小众电影。 因此,演员的每部电影的平均收入值可能相对较低。

为了从不同的角度来看待这个观点,现在让我们来看看这个异常点。

```py
actors.where('Number of Movies', are.below(10))
```

| Actor | Total Gross | Number of Movies | Average per Movie | #1 Movie | Gross |
| --- | --- | --- | --- | --- | --- |
| Anthony Daniels | 3162.9 | 7 | 451.8 | Star Wars: The Force Awakens | 936.7 |

作为一名演员,安东尼·丹尼尔斯(Anthony Daniels)可能没有罗伯特·德尼罗(Robert DeNiro)的身材。 但是他的 7 部电影的平均收入却高达每部电影近 4.52 亿美元。

这些电影是什么? 你可能知道《星球大战:C-3PO》中的 Droid C-3PO,那是金属机甲里面的安东尼·丹尼尔斯。 他扮演 C-3PO。

丹尼尔斯先生的全部电影(除了客串)都是由高收入的“星球大战”系列电影组成的。 这就解释了他的高平均收入和低电影数量。

类型和制作预算等变量,会影响电影数量与每部电影的平均收入之间的关联。 这个例子提醒人们,研究两个变量之间的关联,往往也涉及到了解其他相关的变量。

## 线形图


线形图是最常见的可视化图形之一,通常用于研究时序型的趋势和模式。


`movies_by_year`表包含了 1980 年到 2015 年间,美国电影公司制作的电影的数据。这些列是:

| 列 | 内容 |
| --- | --- |
| Year | 年份 |
| Total Gross | 所有发行电影的国内总票房收入(以百万美元为单位) |
| Number of Movies | 发行的电影数量 |
| #1 Movie | 收入最高的电影 |

```py
movies_by_year = Table.read_table('movies_by_year.csv')
movies_by_year
```


| Year | Total Gross | Number of Movies | #1 Movie |
| --- | --- | --- | --- |
| 2015 | 11128.5 | 702 | Star Wars: The Force Awakens |
| 2014 | 10360.8 | 702 | American Sniper |
| 2013 | 10923.6 | 688 | Catching Fire |
| 2012 | 10837.4 | 667 | The Avengers |
| 2011 | 10174.3 | 602 | Harry Potter / Deathly Hallows (P2) |
| 2010 | 10565.6 | 536 | Toy Story 3 |
| 2009 | 10595.5 | 521 | Avatar |
| 2008 | 9630.7 | 608 | The Dark Knight |
| 2007 | 9663.8 | 631 | Spider-Man 3 |
| 2006 | 9209.5 | 608 | Dead Man's Chest |

(省略了 26 行)

`Table``plot`方法产生线形图。 它的两个参数与散点图相同:首先是横轴上的列,然后是纵轴上的列。 这是 1980 年到 2015 年间每年发行的电影数量的线形图。

```py
movies_by_year.plot('Year', 'Number of Movies')
```

虽然每年的数字都有明显的变化,但图形急剧上升,然后呈现平缓的上升趋势。 20 世纪 80 年代早期的剧增,部分是由于在上世纪 70 年代,电影制作人推动电影业的几年后,电影制片厂重新回到电影制作的前沿。

我们的重点将放在最近几年。 根据电影的主题,对应 2000 年到 2015 年的行,分配给名称`century_21`

```py
century_21 = movies_by_year.where('Year', are.above(1999))
century_21.plot('Year', 'Number of Movies')
```

2008 年的全球金融危机有明显的效果 - 2009 年发行的电影数量急剧下降。

但是,美元数量并没有太大的变化。

```py
century_21.plot('Year', 'Total Gross')
```

尽管发生了金融危机,电影发行的数量也少得多,但 2009 年的国内总收入仍高于 2008 年。

造成这种矛盾的一个原因是,人们在经济衰退时往往会去看电影。 “经济低迷时期,美国人涌向电影”,“纽约时报”于 2009 年 2 月说。文章引用南加州大学的马丁·卡普兰(Martin Kaplan)的话说:“人们想要忘记自己的烦恼,想和别人在一起。” 当节假日和昂贵的款待难以负担,电影提供了受欢迎的娱乐和宽慰。

2009 年的高票房收入的另一个原因是,电影《阿凡达》及其 3D 版本。 阿凡达不仅是 2009 年的第一部电影,它也是有史以来第二高的总票房电影,我们将在后面看到。

```py
century_21.where('Year', are.equal_to(2009))
```

| Year | Total Gross | Number of Movies | #1 Movie |
| --- | --- | --- | --- |
| 2009 | 10595.5 | 521 | Avatar |

W
ch6.  
wizardforcel 已提交
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
## 类别分许

### 可视化类别分布

许多数据不以数字的形式出现。 数据可以是音乐片段,或地图上的地方。 他们也可以是类别,你可以在里面放置个体。 以下是一些类别变量的例子。

+   个体是冰淇淋纸盒,变量就是纸盒里的味道。
+   个体是职业篮球运动员,变量是球员的队伍。
+   个体是年,而变量是今年最高票房电影的流派。
+   个体是调查对象,变量是他们从“完全不满意”,“有点满意”和“非常满意”中选择的回答。

`icecream `表包含 30 盒冰激凌的数据。

```py
icecream = Table().with_columns(
    'Flavor', make_array('Chocolate', 'Strawberry', 'Vanilla'),
    'Number of Cartons', make_array(16, 5, 9)
)
icecream
```


| Flavor | Number of Cartons |
| --- | --- |
| Chocolate | 16 |
| Strawberry | 5 |
| Vanilla | 9 |

分类变量“口味”的值是巧克力,草莓和香草。 表格显示了每种口味的纸盒数量。 我们称之为分布表。 分布显示了所有变量的值,以及每个变量的频率。

### 条形图

条形图是可视化类别分布的熟悉方式。 它为每个类别显示一个条形。 条形的间隔相等,宽度相同。 每个条形的长度与相应类别的频率成正比。

我们使用横条绘制条形图,因为这样更容易标注条形图。 所以`Table`的方法称为`barh`。 它有两个参数:第一个是类别的列标签,第二个是频率的列标签。

```py
icecream.barh('Flavor', 'Number of Cartons')
```

如果表格只包含一列类别和一列频率(如冰淇淋),则方法调用甚至更简单。 您可以指定包含类别的列,`barh`将使用另一列中的值作为频率。

```py
icecream.barh('Flavor')
```

### 类别分布的特征

除了纯粹的视觉差异之外,条形图和我们在前面章节中看到的两个图表之间还有一个重要的区别。 它们是散点图和线图,两者都显示两个数值变量 - 两个轴上的变量都是数值型的。 相比之下,条形图的一个轴上是类别,在另一个轴上具有数值型频率。

这对图表有影响。首先,每个条形的宽度和相邻条形之间的间隔完全取决于生成图的人,或者用于生成该图的程序。 Python 为我们做了这些选择。 如果您要手动绘制条形图,则可以做出完全不同的选择,并且仍然会是完全正确的条形图,前提是您使用相同宽度绘制了所有条形,并使所有间隔保持相同。

最重要的是,条形可以以任何顺序绘制。 “巧克力”,“香草”和“草莓”这些类别没有普遍的等级顺序,不像数字`5, 7``10`

这意味着我们可以绘制一个易于解释的条形图,方法是按降序重新排列条形图。 为了实现它,我们首先按照`Number of Cartons`的降序,重新排列`icecream `的行,然后绘制条形图。

```py
icecream.sort('Number of Cartons', descending=True).barh('Flavor')
```

这个条形图包含的信息和以前的完全一样,但是它更容易阅读。 虽然在只读三个条形的情况下,这并不是一个巨大的收益,但是当分类数量很大时,这可能是相当重要的。

## 组合分类数据