├── .gitignore
├── 1.md
├── 10.md
├── 11.md
├── 12.md
├── 13.md
├── 14.md
├── 15.md
├── 16.md
├── 17.md
├── 2.md
├── 3.md
├── 4.md
├── 5.md
├── 6.md
├── 7.md
├── 8.md
├── 9.md
├── README.md
├── SUMMARY.md
├── img
├── 1-1.png
├── 1-2.png
├── 1-3.png
├── 10-1.png
├── 10-10.png
├── 10-11.png
├── 10-12.png
├── 10-13.png
├── 10-14.png
├── 10-15.png
├── 10-2.png
├── 10-3.png
├── 10-4.png
├── 10-5.png
├── 10-6.png
├── 10-7.png
├── 10-8.png
├── 10-9.png
├── 11-1.png
├── 11-10.png
├── 11-11.png
├── 11-12.png
├── 11-13.png
├── 11-14.png
├── 11-15.png
├── 11-16.png
├── 11-17.png
├── 11-18.png
├── 11-2.png
├── 11-3.png
├── 11-4.png
├── 11-5.png
├── 11-6.png
├── 11-7.png
├── 11-8.png
├── 11-9.png
├── 12-1.png
├── 12-10.png
├── 12-11.png
├── 12-12.png
├── 12-13.png
├── 12-14.png
├── 12-15.png
├── 12-16.png
├── 12-17.png
├── 12-18.png
├── 12-19.png
├── 12-2.png
├── 12-20.png
├── 12-21.png
├── 12-22.png
├── 12-23.png
├── 12-24.png
├── 12-25.png
├── 12-26.png
├── 12-27.png
├── 12-3.png
├── 12-4.png
├── 12-5.png
├── 12-6.png
├── 12-7.png
├── 12-8.png
├── 12-9.png
├── 13-1.png
├── 13-10.png
├── 13-11.png
├── 13-12.png
├── 13-13.png
├── 13-14.png
├── 13-15.png
├── 13-16.png
├── 13-17.png
├── 13-18.png
├── 13-19.png
├── 13-2.png
├── 13-20.png
├── 13-21.png
├── 13-22.png
├── 13-23.png
├── 13-24.png
├── 13-25.png
├── 13-26.png
├── 13-27.png
├── 13-28.png
├── 13-29.png
├── 13-3.png
├── 13-30.png
├── 13-31.png
├── 13-32.png
├── 13-33.png
├── 13-34.png
├── 13-35.png
├── 13-36.png
├── 13-37.png
├── 13-38.png
├── 13-39.png
├── 13-4.png
├── 13-40.png
├── 13-41.png
├── 13-42.png
├── 13-43.png
├── 13-44.png
├── 13-45.png
├── 13-46.png
├── 13-47.png
├── 13-48.jpg
├── 13-49.png
├── 13-5.png
├── 13-50.png
├── 13-51.png
├── 13-52.png
├── 13-53.png
├── 13-6.png
├── 13-7.png
├── 13-8.png
├── 13-9.png
├── 14-1.png
├── 14-10.png
├── 14-11.png
├── 14-12.png
├── 14-13.png
├── 14-14.png
├── 14-15.png
├── 14-2.png
├── 14-3.png
├── 14-4.png
├── 14-5.png
├── 14-6.png
├── 14-7.png
├── 14-8.png
├── 14-9.png
├── 15-1.png
├── 15-10.png
├── 15-11.png
├── 15-12.png
├── 15-13.png
├── 15-14.png
├── 15-15.png
├── 15-16.png
├── 15-17.png
├── 15-18.png
├── 15-19.png
├── 15-2.png
├── 15-20.png
├── 15-21.png
├── 15-22.png
├── 15-23.png
├── 15-24.png
├── 15-25.png
├── 15-3.png
├── 15-4.png
├── 15-5.png
├── 15-6.png
├── 15-7.png
├── 15-8.png
├── 15-9.png
├── 16-1.png
├── 16-10.png
├── 16-11.png
├── 16-12.png
├── 16-13.png
├── 16-14.png
├── 16-15.png
├── 16-2.png
├── 16-3.png
├── 16-4.png
├── 16-5.png
├── 16-6.png
├── 16-7.png
├── 16-8.png
├── 16-9.png
├── 17-1.png
├── 17-2.png
├── 17-3.png
├── 2-1.jpg
├── 2-2.jpg
├── 3-1.png
├── 3-2.png
├── 3-3.png
├── 3-4.png
├── 4-1.png
├── 4-2.png
├── 4-3.png
├── 5-1.png
├── 6-1.png
├── 6-10.png
├── 6-11.png
├── 6-12.png
├── 6-13.png
├── 6-14.png
├── 6-15.png
├── 6-16.png
├── 6-17.png
├── 6-18.png
├── 6-19.png
├── 6-2.png
├── 6-20.png
├── 6-21.png
├── 6-22.png
├── 6-23.png
├── 6-24.png
├── 6-25.png
├── 6-26.png
├── 6-27.png
├── 6-28.png
├── 6-3.png
├── 6-4.png
├── 6-5.png
├── 6-6.png
├── 6-7.png
├── 6-8.png
├── 6-9.png
├── 7-1.jpg
├── 7-2.jpg
├── 7-3.png
├── 7-4.png
├── 7-5.png
├── 7-6.png
├── 7-7.png
├── 7-8.png
├── 8-1.png
├── 8-2.png
├── 8-3.png
├── 8-4.png
├── 9-1.png
├── 9-10.png
├── 9-11.png
├── 9-12.png
├── 9-13.png
├── 9-14.png
├── 9-15.png
├── 9-16.png
├── 9-17.png
├── 9-18.png
├── 9-2.png
├── 9-3.png
├── 9-4.png
├── 9-5.png
├── 9-6.png
├── 9-7.png
├── 9-8.png
├── 9-9.png
├── qr_alipay.png
├── tex-10-1.gif
├── tex-10-2.gif
├── tex-10-3.gif
├── tex-10-4.gif
├── tex-11-1.gif
├── tex-12-1.gif
├── tex-12-2.gif
├── tex-12-3.gif
├── tex-12-4.gif
├── tex-12-5.gif
├── tex-12-6.gif
├── tex-12-7.gif
├── tex-12-8.gif
├── tex-13-1.gif
├── tex-13-10.gif
├── tex-13-11.gif
├── tex-13-12.gif
├── tex-13-13.gif
├── tex-13-14.gif
├── tex-13-15.gif
├── tex-13-16.gif
├── tex-13-17.gif
├── tex-13-18.gif
├── tex-13-19.gif
├── tex-13-2.gif
├── tex-13-3.gif
├── tex-13-4.gif
├── tex-13-5.gif
├── tex-13-6.gif
├── tex-13-7.gif
├── tex-13-8.gif
├── tex-13-9.gif
├── tex-15-1.gif
├── tex-15-2.gif
├── tex-15-3.gif
├── tex-17-1.gif
├── tex-17-2.gif
├── tex-17-3.gif
├── tex-17-4.gif
├── tex-4-1.gif
├── tex-4-2.gif
├── tex-6-1.gif
├── tex-6-2.gif
├── tex-8-1.gif
├── tex-8-10.gif
├── tex-8-11.gif
├── tex-8-12.gif
├── tex-8-13.gif
├── tex-8-14.gif
├── tex-8-15.gif
├── tex-8-16.gif
├── tex-8-2.gif
├── tex-8-3.gif
├── tex-8-4.gif
├── tex-8-5.gif
├── tex-8-6.gif
├── tex-8-7.gif
├── tex-8-8.gif
├── tex-8-9.gif
└── tex-9-1.gif
├── src
├── 7-1.html
├── 7-2.html
├── 7-3.html
└── 7-4.html
└── styles
└── ebook.css
/.gitignore:
--------------------------------------------------------------------------------
1 | _book
2 | Thumbs.db
3 |
--------------------------------------------------------------------------------
/1.md:
--------------------------------------------------------------------------------
1 | # 一、数据科学
2 |
3 | > 原文:[Data Science](https://github.com/data-8/textbook/tree/gh-pages/chapters/01)
4 |
5 | > 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
8 |
9 | > 自豪地采用[谷歌翻译](https://translate.google.cn/)
10 |
11 | ## 什么是数据科学
12 |
13 | 数据科学是通过探索,预测和推断,从大量不同的数据集中得出有用的结论。探索涉及识别信息中的规律。预测涉及使用我们所知道的信息,对我们希望知道的值作出知情的猜测。推断涉及量化我们的确定程度:我们发现的这些规律是否也出现在新的观察中?我们的预测有多准确?我们用于探索的主要工具是可视化和描述性统计,用于预测的是机器学习和优化,用于推理的是统计测试和模型。
14 |
15 | 统计学是数据科学的核心部分,因为统计学研究,如何用不完整的信息做出有力的结论。计算是一个重要组成部分,因为编程允许我们将分析技巧应用于大量不同的数据集,它们在真实应用中出现:不仅包括数字,还包括文本,图像,视频和传感器读数。数据科学就是所有这些东西,但是由于应用的原因,它不仅仅是其部分的总和。通过理解一个特定的领域,数据科学家学习提出有关他们的数据的适当的问题,并正确地解释我们的推理和计算工具提供的答案。
16 |
17 | ## 简介
18 |
19 | 数据是对我们周围世界的描述,通过观察来收集并存储在计算机上。计算机使我们能够从这些描述中推断出世界的特性。数据科学是使用计算从数据中得出结论的学科。有效的数据分析有三个核心方面:探索,预测和推理。本文对三者进行了一致的研究,同时介绍了统计思想和计算机科学的基本思想。我们专注于一套最小的核心技巧,应用于广泛的实际应用。数据科学的基础不仅需要理解统计和计算技巧,还需要认识到它们如何应用于真实场景。
20 |
21 | 对于我们希望研究的世界的任何方面,无论是地球气象,世界市场,政治民意调查还是人类思想,我们收集的数据通常都提供了这个主题的不完整描述。数据科学的核心挑战是使用这部分信息作出可靠的结论。
22 |
23 | 在这个努力中,我们将结合两个基本工具:计算和随机化。例如,我们可能想使用温度观测来了解气候变化的趋势。计算机允许我们使用所有可用的信息得出结论。我们不仅仅关注一个地区的平均气温,而是将整个温度的范围一起考虑,来构建更加细致的分析。随机性允许我们考虑许多不同方式,来完善不完整的信息。我们不会假设温度会以某种特定的方式变化,而是学习使用随机性来设想许多可能的情景,这些情景都与我们观察到的数据一致。
24 |
25 | 应用这种方法需要学习,如何为一台计算机编程,所以这个文本穿插了编程的完整介绍,并假设没有任何先验知识。 具有编程经验的读者会发现,我们涵盖了计算中的几个主题,这些主题并没有出现在典型的计算机科学课程中。 数据科学也需要对数量进行仔细的推理,但是本书并不假设超出基本代数的数学或统计背景。 在本文中你会发现很少的方程。 相反,技巧使用一种编程语言描述,对于读者和执行它们的计算机来说,是相同的。
26 |
27 | ### 计算工具
28 |
29 | 本文使用 Python 3 编程语言,以及数值和数据可视化的标准工具集,它们在商业应用,科学实验和开源项目中广泛使用。 Python 已经招募了许多专业人士,它们使用数据得出结论。通过学习 Python 语言,你将加入一个拥有百万人口的,软件开发人员和数据科学家社区。
30 |
31 | 入门。开始用 Python 编写程序的最简单和推荐的方法是,登录到本文的配套网站 。如果你拥有`@ berkeley.edu`电子邮件地址,则你已经可以完全访问该网站上托管的编程环境。如果没有,请填写[此表格](https://goo.gl/forms/saQpxdqzS2rKxjTc2)来申请访问。
32 |
33 | 你不能完全仅仅使用这个基于 Web 的编程环境。 Python 程序可以由任何计算机执行,无论其制造商或操作系统如何,只要安装了该语言的支持。如果你希望安装符合本文的 Python 版本及其附带库,我们推荐将 Anaconda 发行版与 Python 3 语言解释器,IPython 库和 Jupyter 笔记本环境打包在一起。
34 |
35 | 本文包括所有这些计算工具的完整介绍。你将学习编写程序,从数据生成图像,并使用在线发布的真实世界的数据集。
36 |
37 | ### 统计技巧
38 |
39 | 统计学科长期以来一直面临与数据科学相同的根本挑战:如何使用不完整的信息得出有关世界的有力结论。统计学最重要的贡献之一是,用于描述观察与结论之间关系的,一致而准确的词汇。本文继续保持同样的传统,重点是统计学中的一组核心推断问题:假设检验,置信度估计和未知量预测。
40 |
41 | 数据科学通过充分利用计算,数据可视化,机器学习,优化和信息访问来扩展统计领域。快速计算机和互联网的结合使得任何人都能够访问和分析大量的数据集:数百万篇新闻文章,完整的百科全书,任何领域的数据库以及大量的音乐,照片和视频库。
42 |
43 | 真实数据集的应用激发了我们在整个文本中描述的统计技巧。真实数据通常没有规律或匹配标准方程。如果把过多的注意力集中在简单的总结上,比如平均值,那么真实数据中有趣的变化就会丢失。计算机使一系列基于重采样的方法成为可能,它们适用于各种不同的推理问题,考虑了所有可用的信息,并且需要很少的假设或条件。虽然这些技巧经常留作统计学的研究生课程,但它们的灵活性和简单性非常适合数据科学应用。
44 |
45 | ## 为什么是数据科学
46 |
47 | 最重要的决策仅仅使用部分信息和不确定的结果做出。然而,许多决策的不确定性,可以通过获取大量公开的数据集和有效分析所需的计算工具,而大幅度降低。以数据为导向的决策已经改变了一大批行业,包括金融,广告,制造业和房地产。同时,大量的学科正在迅速发展,将大规模的数据分析纳入其理论和实践。
48 |
49 | 学习数据科学使个人能够将这些技巧用于工作,科学研究和个人决策。批判性思维一直是严格教育的标志,但在数据支持下,批判往往是最有效的。对世界任何方面的批判性分析,可能是商业或社会科学,涉及归纳推理;结论很少直接证明,仅仅由现有的证据支持。数据科学提供了手段,对任何一组观测结果进行精确,可靠和定量的论证。有了信息和计算机的前所未有的访问,如果没有有效的推理技巧,对世界上任何可以衡量的方面的批判性思考都是不完整的。
50 |
51 | 世界上有太多没有答案的问题和困难的挑战,所以不能把这个批判性的推理留给少数专家。所有受过教育的社会成员都可以建立推断数据的能力。这些工具,技巧和数据集都是随手可用的;本文的目的是使所有人都能访问它们。
52 |
53 | ## 绘制经典作品
54 |
55 | 在这个例子中,我们将探讨两个经典小说的统计:马克吐温(Mark Twain)的《哈克贝利·芬历险记》(The Adventures of Huckleberry Finn)和路易莎·梅·奥尔科特(Louisa May Alcott)的《小女人》(Little Women)。任何一本书的文本都可以通过电脑以极快的速度读取。 1923 年以前出版的书籍目前处于公有领域,这意味着每个人都有权以任何方式复制或使用文本。 [古登堡计划](http://www.gutenberg.org/)是一个在线出版公共领域书籍的网站。使用 Python,我们可以直接从网络上加载这些书籍的文本。
56 |
57 | 这个例子是为了说明本书的一些广泛的主题。如果还不理解程序的细节,别担心。相反,重点关注下面生成的图像。后面的部分将介绍下面使用的 Python 编程语言的大部分功能。
58 |
59 | 首先,我们将这两本书的内容读入章节列表中,称为`huck_finn_chapters`和`little_women_chapters`。在 Python 中,名称不能包含任何空格,所以我们经常使用下划线`_`来代表空格。在下面的行中,左侧提供了一个名称,右侧描述了一些计算的结果。统一资源定位符或 URL 是互联网上某些内容的地址;这里是一本书的文字。`#`符号是注释的起始,计算机会忽略它,但有助于人们阅读代码。
60 |
61 | ```py
62 | # Read two books, fast!
63 |
64 | huck_finn_url = 'https://www.inferentialthinking.com/chapters/01/3/huck_finn.txt'
65 | huck_finn_text = read_url(huck_finn_url)
66 | huck_finn_chapters = huck_finn_text.split('CHAPTER ')[44:]
67 |
68 | little_women_url = 'https://www.inferentialthinking.com/chapters/01/3/little_women.txt'
69 | little_women_text = read_url(little_women_url)
70 | little_women_chapters = little_women_text.split('CHAPTER ')[1:]
71 | ```
72 |
73 | 虽然计算机不能理解书的文本,它可以向我们提供文本结构的一些视角。名称`huck_finn_chapters`现在已经绑定到书中章节的列表。我们可以将其放到一个表中,来观察每一章的开头。
74 |
75 | ```py
76 | # Display the chapters of Huckleberry Finn in a table.
77 |
78 | Table().with_column('Chapters', huck_finn_chapters)
79 | ```
80 |
81 | | Chapters |
82 | | --- |
83 | | I. YOU don't know about me without you have read a book ... |
84 | | II. WE went tiptoeing along a path amongst the trees bac ... |
85 | | III. WELL, I got a good going-over in the morning from o ... |
86 | | IV. WELL, three or four months run along, and it was wel ... |
87 | | V. I had shut the door to. Then I turned around and ther ... |
88 | | VI. WELL, pretty soon the old man was up and around agai ... |
89 | | VII. "GIT up! What you 'bout?" I opened my eyes and look ... |
90 | | VIII. THE sun was up so high when I waked that I judged ... |
91 | | IX. I wanted to go and look at a place right about the m ... |
92 | | X. AFTER breakfast I wanted to talk about the dead man a ... |
93 |
94 | (已省略 33 行)
95 |
96 | 每一章都以章节号开头,以罗马数字的形式,后面是本章的第一个句子。古登堡计划将每章的第一个单词变为大写。
97 |
98 | ### 文本特征
99 |
100 | 《哈克贝利·芬历险记》描述了哈克和吉姆沿着密西西比河的旅程。汤姆·索亚(Tom Sawyer)在行动进行的时候加入了他们的行列。在加载文本后,我们可以快速地看到这些字符在本书的任何一处被提及的次数。
101 |
102 | ```py
103 | # Count how many times the names Jim, Tom, and Huck appear in each chapter.
104 |
105 | counts = Table().with_columns([
106 | 'Jim', np.char.count(huck_finn_chapters, 'Jim'),
107 | 'Tom', np.char.count(huck_finn_chapters, 'Tom'),
108 | 'Huck', np.char.count(huck_finn_chapters, 'Huck')
109 | ])
110 |
111 | # Plot the cumulative counts:
112 | # how many times in Chapter 1, how many times in Chapters 1 and 2, and so on.
113 |
114 | cum_counts = counts.cumsum().with_column('Chapter', np.arange(1, 44, 1))
115 | cum_counts.plot(column_for_xticks=3)
116 | plots.title('Cumulative Number of Times Each Name Appears', y=1.08);
117 | ```
118 |
119 | 
120 |
121 | 在上图中,横轴显示章节号,纵轴显示每个字符在该章节被提及到的次数。
122 |
123 | 吉姆是核心人物,它的名字出现了很多次。请注意,第 30 章中汤姆出现并加入了哈克和吉姆,在此之前,汤姆在本书中几乎没有提及。他和吉姆的曲线在这个位置上迅速上升,因为涉及两者的行动都在变多。至于哈克,他的名字几乎没有出现,因为他是叙述者。
124 |
125 | 《小女人》是南北战争期间四个姐妹一起长大的故事。 在这本书中,章节号码拼写了出来,章节标题用大写字母表示。
126 |
127 | ```py
128 | # The chapters of Little Women, in a table
129 |
130 | Table().with_column('Chapters', little_women_chapters)
131 | ```
132 |
133 | | Chapters |
134 | | --- |
135 | | ONE PLAYING PILGRIMS "Christmas won't be Christmas witho ... |
136 | | TWO A MERRY CHRISTMAS Jo was the first to wake in the gr ... |
137 | | THREE THE LAURENCE BOY "Jo! Jo! Where are you?" cried Me ... |
138 | | FOUR BURDENS "Oh, dear, how hard it does seem to take up ... |
139 | | FIVE BEING NEIGHBORLY "What in the world are you going t ... |
140 | | SIX BETH FINDS THE PALACE BEAUTIFUL The big house did pr ... |
141 | | SEVEN AMY'S VALLEY OF HUMILIATION "That boy is a perfect ... |
142 | | EIGHT JO MEETS APOLLYON "Girls, where are you going?" as ... |
143 | | NINE MEG GOES TO VANITY FAIR "I do think it was the most ... |
144 | | TEN THE P.C. AND P.O. As spring came on, a new set of am ... |
145 |
146 | (已省略 37 行)
147 |
148 | 我们可以跟踪主要人物的提及,来了解本书的情节。 主角乔(Jo)和她的姐妹梅格(Meg),贝丝(Beth)和艾米(Amy)经常互动,直到第 27 章中她独自搬到纽约。
149 |
150 | ```py
151 | # Counts of names in the chapters of Little Women
152 |
153 | counts = Table().with_columns([
154 | 'Amy', np.char.count(little_women_chapters, 'Amy'),
155 | 'Beth', np.char.count(little_women_chapters, 'Beth'),
156 | 'Jo', np.char.count(little_women_chapters, 'Jo'),
157 | 'Meg', np.char.count(little_women_chapters, 'Meg'),
158 | 'Laurie', np.char.count(little_women_chapters, 'Laurie'),
159 |
160 | ])
161 |
162 | # Plot the cumulative counts.
163 |
164 | cum_counts = counts.cumsum().with_column('Chapter', np.arange(1, 48, 1))
165 | cum_counts.plot(column_for_xticks=5)
166 | plots.title('Cumulative Number of Times Each Name Appears', y=1.08);
167 | ```
168 |
169 | 
170 |
171 | 劳里(Laurie)是个年轻人,最后和其中一个女孩结婚。 看看你是否可以使用这个图来猜测是哪一个。
172 |
173 | ### 另一种文本特征
174 |
175 | 在某些情况下,数量之间的关系能让我们做出预测。 本文将探讨如何基于不完整的信息做出准确的预测,并研究结合多种不确定信息来源进行决策的方法。
176 |
177 | 作为从多个来源获取信息的可视化的例子,让我们首先使用计算机来获取一些信息,它们通常手工难以获取。在小说的语境中,“特征”(Character)这个词有第二个含义:一个印刷符号,如字母,数字或标点符号。 在这里,我们要求计算机来计算《哈克贝利·芬》和《小女人》的每章中的字符和句号数量。
178 |
179 | ```py
180 | # In each chapter, count the number of all characters;
181 | # call this the "length" of the chapter.
182 | # Also count the number of periods.
183 |
184 | chars_periods_huck_finn = Table().with_columns([
185 | 'Huck Finn Chapter Length', [len(s) for s in huck_finn_chapters],
186 | 'Number of Periods', np.char.count(huck_finn_chapters, '.')
187 | ])
188 | chars_periods_little_women = Table().with_columns([
189 | 'Little Women Chapter Length', [len(s) for s in little_women_chapters],
190 | 'Number of Periods', np.char.count(little_women_chapters, '.')
191 | ])
192 | ```
193 |
194 |
195 | 这里是《哈克贝利·芬》的数据。 表格的每一行对应小说的一个章节,并显示章节中的字符和句号数量。 毫不奇怪,字符少的章节往往句号也少,一般来说 - 章节越短,句子越少,反之亦然。 然而,这种关系并不是完全可以预测的,因为句子的长度各不相同,还可能涉及其他标点符号,例如问号。
196 |
197 | `chars_periods_huck_finn`
198 |
199 |
200 | | 《哈克贝利·芬》章节长度 | 句号数量 |
201 | | --- | --- |
202 | | 7026 | 66 |
203 | | 11982 | 117 |
204 | | 8529 | 72 |
205 | | 6799 | 84 |
206 | | 8166 | 91 |
207 | | 14550 | 125 |
208 | | 13218 | 127 |
209 | | 22208 | 249 |
210 | | 8081 | 71 |
211 | | 7036 | 70 |
212 |
213 | (已省略 33 行)
214 |
215 | 这里是《小女人》的对应数据:
216 |
217 | `chars_periods_little_women`
218 |
219 | | 《小女人》章节长度 | 句号数量 |
220 | | --- | --- |
221 | | 21759 | 189 |
222 | | 22148 | 188 |
223 | | 20558 | 231 |
224 | | 25526 | 195 |
225 | | 23395 | 255 |
226 | | 14622 | 140 |
227 | | 14431 | 131 |
228 | | 22476 | 214 |
229 | | 33767 | 337 |
230 | | 18508 | 185 |
231 |
232 | (已省略 37 行)
233 |
234 |
235 | 你可以看到,《小女人》的章节总的来说比《哈克贝利·芬》的章节要长。让我们来看看这两个简单的变量 - 每一章的长度和句子数量 - 能否告诉我们这两本书的更多内容。 我们实现它的一个方法是在同一个图上绘制两组数据。
236 |
237 | 在下面的图中,每本书的每一章都有一个点。 蓝色圆点对应于《哈克贝利·芬》,金色圆点对应于《小女人》。横轴表示句号数量,纵轴表示字符数。
238 |
239 | ```py
240 | plots.figure(figsize=(6, 6))
241 | plots.scatter(chars_periods_huck_finn.column(1),
242 | chars_periods_huck_finn.column(0),
243 | color='darkblue')
244 | plots.scatter(chars_periods_little_women.column(1),
245 | chars_periods_little_women.column(0),
246 | color='gold')
247 | plots.xlabel('Number of periods in chapter')
248 | plots.ylabel('Number of characters in chapter');
249 | ```
250 |
251 | 
252 |
253 | 这个绘图向我们展示,《小女人》的许多章节,而不是所有章节都比《哈克贝利·芬》的章节长,正如我们通过查看数字所看到的那样。 但它也向我们展示了更多东西。 请注意,蓝点粗略聚集在一条直线上,黄点也是如此。 此外看起来,两种颜色的点可能聚集在同一条直线上。
254 |
255 | 现在查看包含大约 100 个句号的所有章节。 绘图显示,这些章节大致包含约 10,000 个字符到约 15,000 个字符。每个句子大约有 100 到 150 个字符。
256 |
257 | 事实上,从这个绘图看来,这两本书的两个句号之间平均有 100 到 150 个字符,这是一个非常粗略的估计。 也许这两个伟大的 19 世纪小说正在表明我们现在非常熟悉的东西:Twitter 的 140 个字符的限制。
258 |
--------------------------------------------------------------------------------
/14.md:
--------------------------------------------------------------------------------
1 | # 十四、回归的推断
2 |
3 | > 原文:[Inference for Regression](https://github.com/data-8/textbook/tree/gh-pages/chapters/14)
4 |
5 | > 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
8 |
9 | > 自豪地采用[谷歌翻译](https://translate.google.cn/)
10 |
11 | 到目前为止,我们对变量之间关系的分析纯粹是描述性的。我们知道如何找到穿过散点图的最佳直线来绘制。在所有直线中它的估计的均方误差最小,从这个角度来看,这条线是最好的。
12 |
13 | 但是,如果我们的数据是更大总体的样本呢?如果我们在样本中发现了两个变量之间的线性关系,那么对于总体也是如此嘛?它会是完全一样的线性关系吗?我们可以预测一个不在我们样本中的新的个体的响应变量吗?
14 |
15 | 如果我们认为,散点图反映了被绘制的两个变量之间的基本关系,但是并没有完全规定这种关系,那么就会出现这样的推理和预测问题。例如,出生体重与孕期的散点图,显示了我们样本中两个变量之间的精确关系;但是我们可能想知道,对于抽样总体中的所有新生儿或实际中的一般新生儿,这样的关系是否是真实的,或者说几乎是正确的。
16 |
17 | 一如既往,推断思维起始于仔细检查数据的假设。一组假设被称为模型。大致线性的散点图中的一组随机性的假设称为回归模型。
18 |
19 | ## 回归模型
20 |
21 | 简而言之,这样的模型认为,两个变量之间的底层关系是完全线性的;这条直线是我们想要识别的信号。但是,我们无法清楚地看到这条线。我们看到的是分散在这条线上的点。在每一点上,信号都被随机噪声污染。因此,我们的推断目标是将信号从噪声中分离出来。
22 |
23 | 更详细地说,回归模型规定了,散点图中的点是随机生成的,如下所示。
24 |
25 | + `x`和`y`之间的关系是完全线性的。我们看不到这个“真实直线”,但它是存在的。
26 | + 散点图通过将线上的点垂直移动,或上或下来创建,如下所示:
27 | + 对于每个`x`,找到真实直线上的相应点(即信号),然后生成噪声或误差。
28 | + 误差从误差总体中带放回随机抽取,总体是均值为 0 的正态分布。
29 | + 创建一个点,横坐标为`x`,纵坐标为“`x`处的真实高度加上误差”。
30 | + 最后,从散点图中删除真正的线,只显示创建的点。
31 |
32 | 基于这个散点图,我们应该如何估计真实直线? 我们可以使其穿过散点图的最佳直线是回归线。 所以回归线是真实直线的自然估计。
33 |
34 | 下面的模拟显示了回归直线与真实直线的距离。 第一个面板显示如何从真实直线生成散点图。 第二个显示我们看到的散点图。 第三个显示穿过散点图的回归线。 第四个显示回归线和真实直线。
35 |
36 | 为了运行模拟,请使用三个参数调用`draw_and_compare`函数:真实直线的斜率,真实直线的截距以及样本量。
37 |
38 | 运行模拟几次,用不同的斜率和截距,以及不同的样本量。 因为所有的点都是根据模型生成的,所以如果样本量适中,你会看到回归线是真实直线的一个良好估计。
39 |
40 | ```py
41 | # The true line,
42 | # the points created,
43 | # and our estimate of the true line.
44 | # Arguments: true slope, true intercept, number of points
45 |
46 | draw_and_compare(4, -5, 10)
47 | ```
48 |
49 | 
50 |
51 | 实际上,我们当然不会看到真实直线。 模拟结果表明,如果回归模型看起来合理,并且如果我们拥有大型样本,那么回归线就是真实直线的一个良好近似。
52 |
53 | ## 真实斜率的推断
54 |
55 | 我们的模拟表明,如果回归模型成立,并且样本量很大,则回归线很可能接近真实直线。 这使我们能够估计真实直线的斜率。
56 |
57 | 我们将使用我们熟悉的母亲和她们的新生儿的样本,来开发估计真实直线的斜率的方法。 首先,我们来看看我们是否相信,回归模型是一系列适当假设,用于描述出生体重和孕期之间的关系。
58 |
59 | ```py
60 | correlation(baby, 'Gestational Days', 'Birth Weight')
61 | 0.40754279338885108
62 | ```
63 |
64 | 总的来说,散点图看起来相当均匀地分布在这条线上,尽管一些点分布在主云形的周围。 相关系数为 0.4,回归线斜率为正。
65 |
66 | 这是否反映真实直线斜率为正的事实? 为了回答这个问题,让我们看看我们能否估计真实斜率。 我们当然有了一个估计:我们的回归线斜率。 这大约是 0.47 盎司每天。
67 |
68 | ```py
69 | slope(baby, 'Gestational Days', 'Birth Weight')
70 | 0.46655687694921522
71 | ```
72 |
73 | 但是如果散点图出现的方式不同,回归线会有所不同,可能会有不同的斜率。 我们如何计算,斜率可能有多么不同?
74 |
75 | 我们需要点的另一个样本,以便我们可以绘制回归线穿过新的散点图,并找出其斜率。 但另一个样本从哪里得到呢?
76 |
77 | 你猜对了 - 我们将自举我们的原始样本。 这会给我们自举的散点图,通过它我们可以绘制回归线。
78 |
79 | ### 自举散点图
80 |
81 | 我们可以通过对原始样本带放回地随机抽样,来模拟新样本,它的次数与原始样本量相同。 这些新样本中的每一个都会给我们一个散点图。 我们将这个称为自举散点图,简而言之,我们将调用整个过程来自举散点图。
82 |
83 | 这里是来自样本的原始散点图,以及自举重采样过程的四个复制品。 请注意,重采样散点图通常比原始图稀疏一点。 这是因为一些原始的点没有在样本中被选中。
84 |
85 | 
86 |
87 | ### 估计真实斜率
88 |
89 | 我们可以多次自举散点图,并绘制穿过每个自举图的回归线。 每条线都有一个斜率。 我们可以简单收集所有的斜率并绘制经验直方图。 回想一下,在默认情况下,`sample`方法带放回地随机抽取,次数与表中的行数相同。 也就是说,`sample`默认生成一个自举样本。
90 |
91 | ```py
92 | slopes = make_array()
93 | for i in np.arange(5000):
94 | bootstrap_sample = baby.sample()
95 | bootstrap_slope = slope(bootstrap_sample, 'Gestational Days', 'Birth Weight')
96 | slopes = np.append(slopes, bootstrap_slope)
97 | Table().with_column('Bootstrap Slopes', slopes).hist(bins=20)
98 | ```
99 |
100 | 
101 |
102 | 然后,我们可以使用`percentile `方法,为真实直线的斜率构建约 95% 置信区间。 置信区间从 5000 个自举斜率的第 2.5 百分位数,延伸到第 97.5 百分位数。
103 |
104 | ```py
105 | left = percentile(2.5, slopes)
106 | right = percentile(97.5, slopes)
107 | left, right
108 | (0.38209399211893086, 0.56014757838023777)
109 | ```
110 |
111 | ### 用于自举斜率的函数
112 |
113 | 让我们收集我们估计斜率的方法的所有步骤,并定义函数`bootstrap_slope`来执行它们。 它的参数是表的名称,预测变量和响应变量的标签,以及自举复制品的所需数量。 在每个复制品中,该函数自举原始散点图并计算所得回归线的斜率。 然后绘制所有生成的斜率的直方图,并打印由斜率的“中间 95%”组成的区间。
114 |
115 | ```py
116 | def bootstrap_slope(table, x, y, repetitions):
117 |
118 | # For each repetition:
119 | # Bootstrap the scatter, get the slope of the regression line,
120 | # augment the list of generated slopes
121 | slopes = make_array()
122 | for i in np.arange(repetitions):
123 | bootstrap_sample = table.sample()
124 | bootstrap_slope = slope(bootstrap_sample, x, y)
125 | slopes = np.append(slopes, bootstrap_slope)
126 |
127 | # Find the endpoints of the 95% confidence interval for the true slope
128 | left = percentile(2.5, slopes)
129 | right = percentile(97.5, slopes)
130 |
131 | # Slope of the regression line from the original sample
132 | observed_slope = slope(table, x, y)
133 |
134 | # Display results
135 | Table().with_column('Bootstrap Slopes', slopes).hist(bins=20)
136 | plots.plot(make_array(left, right), make_array(0, 0), color='yellow', lw=8);
137 | print('Slope of regression line:', observed_slope)
138 | print('Approximate 95%-confidence interval for the true slope:')
139 | print(left, right)
140 | ```
141 |
142 | 当响应变量为出生体重,预测变量为孕期时,我们调用`bootstrap_slope`来找到真实斜率的置信区间,我们得到了一个区间,非常接近我们之前获得的东西:大约 0.38 到 0.56 盎司每天。
143 |
144 | ```py
145 | bootstrap_slope(baby, 'Gestational Days', 'Birth Weight', 5000)
146 | Slope of regression line: 0.466556876949
147 | Approximate 95%-confidence interval for the true slope:
148 | 0.378663152966 0.555005146304
149 | ```
150 |
151 | 
152 |
153 | 现在我们有一个函数,可以自动完成估计在回归模型中展示斜率的过程,我们也可以在其他变量上使用它。
154 |
155 | 例如,我们来看看出生体重与母亲身高的关系。 更高的女性往往有更重的婴儿吗?
156 |
157 | 回归模型似乎是合理的,基于散点图,但相关性不高。 这只有大约 0.2。
158 |
159 | ```py
160 | scatter_fit(baby, 'Maternal Height', 'Birth Weight')
161 | ```
162 |
163 | 
164 |
165 | ```py
166 | correlation(baby, 'Maternal Height', 'Birth Weight')
167 | 0.20370417718968034
168 | ```
169 |
170 | 像之前一样,我们使用`bootstrap_slope `来估计回归模型中真实直线的斜率。
171 |
172 | ```py
173 | bootstrap_slope(baby, 'Maternal Height', 'Birth Weight', 5000)
174 | Slope of regression line: 1.47801935193
175 | Approximate 95%-confidence interval for the true slope:
176 | 1.0403083964 1.91576886223
177 | ```
178 |
179 | 
180 |
181 | 真实斜率的 95% 置信区间,从约 1 延伸到约 1.9 盎司每英寸。
182 |
183 | ### 真实斜率可能为 0 嘛?
184 |
185 | 假设我们相信我们的数据遵循回归模型,并且我们拟合回归线来估计真实直线。 如果回归线不完全是平的,几乎总是如此,我们将观察到散点图中的一些线性关联。
186 |
187 | 但是,如果这种观察是假的呢? 换句话说,如果真实直线是平的 - 也就是说,这两个变量之间没有线性关系 - 我们观察到的联系,只是由于从样本中产生点的随机性。
188 |
189 | 这是一个模拟,说明了为什么会出现这个问题。 我们将再次调用`draw_and_compare`函数,这次要求真实斜率为 0。我们的目标是,观察我们的回归线是否显示不为 0 的斜率。
190 |
191 | 请记住函数`draw_and_compare`的参数是真实直线的斜率和截距,以及要生成的点的数量。
192 |
193 | ```py
194 | draw_and_compare(0, 10, 25)
195 | ```
196 |
197 | 
198 |
199 | 运行模拟几次,每次保持真实直线的斜率为 0 。你会注意到,虽然真实直线的斜率为 0,但回归线的斜率通常不为 0。回归线有时会向上倾斜,有时会向下倾斜,每次都给我们错误的印象,即这两个变量是相关的。
200 |
201 | 为了确定我们所看到的斜率是否真实,我们想测试以下假设:
202 |
203 | 原假设。真实直线的斜率是 0。
204 |
205 | 备选假设。真实直线的斜率不是 0。
206 |
207 | 我们很有条件来实现它。由于我们可以为真实斜率构建一个 95% 的置信区间,我们所要做的就是看区间是否包含 0。
208 |
209 | 如果没有,那么我们可以拒绝原假设(P 值为 5% 的截断值)。
210 |
211 | 如果真实斜率的置信区间确实包含 0,那么我们没有足够的证据来拒绝原假设。也许我们看到的斜率是假的。
212 |
213 | 我们在一个例子中使用这个方法。假设我们试图根据母亲的年龄来估计新生儿的出生体重。根据样本,根据母亲年龄估计出生体重的回归线的斜率为正,约为 0.08 盎司每年。
214 |
215 | ```py
216 | slope(baby, 'Maternal Age', 'Birth Weight')
217 | 0.085007669415825132
218 | ```
219 |
220 | 虽然斜率为正,但是很小。 回归线非常接近平的,这就产生了一个问题,真实直线是否是平的。
221 |
222 | ```py
223 | scatter_fit(baby, 'Maternal Age', 'Birth Weight')
224 | ```
225 |
226 | 
227 |
228 | 我们可以使用`bootstrap_slope`来估计真实直线的斜率。 计算表明,真实斜率的约 95% 的自举置信区间左端为负,右端为正 - 换句话说,区间包含 0。
229 |
230 | ```py
231 | bootstrap_slope(baby, 'Maternal Age', 'Birth Weight', 5000)
232 | Slope of regression line: 0.0850076694158
233 | Approximate 95%-confidence interval for the true slope:
234 | -0.104335243815 0.272791852339
235 | ```
236 |
237 | 
238 |
239 | 因为区间包含 0,所以我们不能拒绝原假设,母亲年龄与新生儿出生体重之间的真实线性关系的斜率为 0。基于此分析,使用母亲年龄作为预测变量,基于回归模型预测出生体重是不明智的。
240 |
241 | ## 预测区间
242 |
243 | 回归的主要用途之一是对新个体进行预测,这个个体不是我们原始样本的一部分,但是与样本个体相似。在模型的语言中,我们想要估计新值`x`的`y`。
244 |
245 | 我们的估计是真实直线在`x`处的高度。当然,我们不知道真实直线。我们使用我们的样本点的回归线来代替。
246 |
247 | 给定值`x`的拟合值,是基于`x`值的`y`的回归估计。换句话说,给定值`x`的拟合值就是回归线在`x`处的高度。
248 |
249 | 假设我们试图根据孕期天数来预测新生儿的出生体重。我们在前面的章节中看到,这些数据非常适合回归模型,真实直线的斜率的 95% 置信区间不包含 0。因此,我们的预测似乎是合理的。
250 |
251 | 下图显示了预测位于回归线上的位置。红线是`x = 300`。
252 |
253 | 
254 |
255 | 红线与回归线的相交点的高度是孕期天数 300 的拟合值。
256 |
257 | 函数`fitted_value`计算这个高度。像函数的相关性,斜率和截距一样,它的参数是表的名称和`x`和`y`的列标签。但是它也需要第四个参数,即`x`的值,在这个值上进行估算。
258 |
259 | ```py
260 | def fitted_value(table, x, y, given_x):
261 | a = slope(table, x, y)
262 | b = intercept(table, x, y)
263 | return a * given_x + b
264 | ```
265 |
266 | 孕期天数 300 的拟合值约为 129.2 盎司。 换句话说,对于孕期为 300 天的孕妇,我们估计的新生儿体重约为 129.2 盎司。
267 |
268 | ```py
269 | fit_300 = fitted_value(baby, 'Gestational Days', 'Birth Weight', 300)
270 | fit_300
271 | 129.2129241703143
272 | ```
273 |
274 | ### 预测的可变性
275 |
276 | 我们已经开发了一种方法,使用我们样本中的数据,根据孕期天数预测新生儿的体重。 但作为数据科学家,我们知道样本可能有所不同。 如果样本不同,回归线也会不一样,我们的预测也是。 为了看看我们的预测有多好,我们必须了解预测的可变性。
277 |
278 | 为此,我们必须生成新的样本。 我们可以像上一节那样,通过自举散点图来实现。 然后,我们为每个散点图的复制品拟合回归线,并根据每一行进行预测。 下图显示了 10 条这样的线,以及孕期天数 300 对应的出生体重预测。
279 |
280 | 
281 |
282 | ```py
283 | lines
284 | ```
285 |
286 | | slope | intercept | prediction at x=300 |
287 | | --- | --- | --- |
288 | | 0.503931 | -21.6998 | 129.479 |
289 | | 0.53227 | -29.5647 | 130.116 |
290 | | 0.518771 | -25.363 | 130.268 |
291 | | 0.430556 | -1.06812 | 128.099 |
292 | | 0.470229 | -11.7611 | 129.308 |
293 | | 0.48713 | -16.5314 | 129.608 |
294 | | 0.51241 | -23.2954 | 130.428 |
295 | | 0.52473 | -27.2053 | 130.214 |
296 | | 0.409943 | 5.22652 | 128.21 |
297 | | 0.468065 | -11.6967 | 128.723 |
298 |
299 |
300 | 每一行的预测都不相同。 下表显示了 10 条线的斜率、截距以及预测。
301 |
302 | ### 自举预测区间
303 |
304 | 如果我们增加重采样过程的重复次数,我们可以生成预测的经验直方图。这将允许我们创建预测区间,使用为斜率创建自举置信区间时的相同的百分比方法。
305 |
306 | 让我们定义一个名为`bootstrap_prediction`的函数来实现。该函数有五个参数:
307 |
308 | + 表的名称
309 | + 预测变量和响应变量的列标签
310 | + 用于预测的`x`的值
311 | + 所需的自举重复次数
312 |
313 | 在每次重复中,函数将自举原始散点图,并基于`x`的指定值查找`y`的预测值。具体来说,它调用我们在本节前面定义的函数`fitted_value`,来寻找指定`x`处的拟合值。
314 |
315 | 最后,绘制所有预测值的经验直方图,并打印由预测值的“中间 95%”组成的区间。它还打印基于穿过原始散点图的回归线的预测值。
316 |
317 | ```py
318 | # Bootstrap prediction of variable y at new_x
319 | # Data contained in table; prediction by regression of y based on x
320 | # repetitions = number of bootstrap replications of the original scatter plot
321 |
322 | def bootstrap_prediction(table, x, y, new_x, repetitions):
323 |
324 | # For each repetition:
325 | # Bootstrap the scatter;
326 | # get the regression prediction at new_x;
327 | # augment the predictions list
328 | predictions = make_array()
329 | for i in np.arange(repetitions):
330 | bootstrap_sample = table.sample()
331 | bootstrap_prediction = fitted_value(bootstrap_sample, x, y, new_x)
332 | predictions = np.append(predictions, bootstrap_prediction)
333 |
334 | # Find the ends of the approximate 95% prediction interval
335 | left = percentile(2.5, predictions)
336 | right = percentile(97.5, predictions)
337 |
338 | # Prediction based on original sample
339 | original = fitted_value(table, x, y, new_x)
340 |
341 | # Display results
342 | Table().with_column('Prediction', predictions).hist(bins=20)
343 | plots.xlabel('predictions at x='+str(new_x))
344 | plots.plot(make_array(left, right), make_array(0, 0), color='yellow', lw=8);
345 | print('Height of regression line at x='+str(new_x)+':', original)
346 | print('Approximate 95%-confidence interval:')
347 | print(left, right)
348 | bootstrap_prediction(baby, 'Gestational Days', 'Birth Weight', 300, 5000)
349 | Height of regression line at x=300: 129.21292417
350 | Approximate 95%-confidence interval:
351 | 127.300774171 131.361729528
352 | ```
353 |
354 | 
355 |
356 | 上图显示了基于 5000 次重复的自举过程,孕期天数 300 的预测出生体重的自举经验直方图。经验分布大致是正泰的。
357 |
358 | 我们已经通过预测的“中间 95%”,即预测的第 2.5 百分位数到第 97.5 百分位数的区间,构建了分数的约 95% 的预测区间。 区间范围从大约 127 到大约 131。基于原始样本的预测是大约 129,接近区间的中心。
359 |
360 | ### 改变预测变量的值的效果
361 |
362 | 下图显示了孕期天数 285 的 5,000 次自举预测的直方图。 基于原始样本的预测是约 122 盎司,区间范围从约 121 盎司到约 123 盎司。
363 |
364 | ```py
365 | bootstrap_prediction(baby, 'Gestational Days', 'Birth Weight', 285, 5000)
366 | Height of regression line at x=285: 122.214571016
367 | Approximate 95%-confidence interval:
368 | 121.177089926 123.291373304
369 | ```
370 |
371 | 
372 |
373 | 请注意,这个区间比孕妇天数 300 的预测区间更窄。 让我们来调查其原因。
374 |
375 | 孕妇天数均值约为 279 天:
376 |
377 | ```py
378 | np.mean(baby.column('Gestational Days'))
379 | 279.10136286201021
380 | ```
381 |
382 | 所以 285 比 300 更接近分布的中心。 通常,基于自举样本的回归线,在预测变量的分布中心附近彼此更接近。 因此,所有的预测值也更接近。 这解释了预测区间的宽度更窄。
383 |
384 | 你可以在下面的图中看到这一点,它显示了 10 个自举复制品中每一个的`x = 285`和`x = 300`的预测值。 通常情况下,直线在`x = 300`处比`x = 285`处相距更远,因此`x = 300`的预测更加可变。
385 |
386 | 
387 |
388 | ### 注意事项
389 |
390 | 我们在本章中进行的所有预测和测试,都假设回归模型是成立的。 具体来说,这些方法假设,散点图中的点由直线上的点产生,然后通过添加随机正态噪声将它们推离直线。
391 |
392 | 如果散点图看起来不像那样,那么模型可能不适用于数据。 如果模型不成立,那么假设模型为真的计算是无效的。
393 |
394 | 因此,在开始基于模型进行预测,或者对模型参数进行假设检验之前,我们首先要确定回归模型是否适用于我们的数据。 一个简单的方法就是,按照我们在本节所做的操作,即绘制两个变量的散点图,看看它看起来是否大致线性,并均匀分布在一条线上。 我们还应该使用残差图,执行我们在前一节中开发的诊断。
395 |
--------------------------------------------------------------------------------
/17.md:
--------------------------------------------------------------------------------
1 | # 十七、更新预测
2 |
3 | > 原文:[Updating Predictions](https://github.com/data-8/textbook/tree/gh-pages/chapters/17)
4 |
5 | > 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
8 |
9 | > 自豪地采用[谷歌翻译](https://translate.google.cn/)
10 |
11 | 我们知道如何使用训练数据将一个点划分为两类之一。 我们的分类只是对类别的预测,基于最接近我们的新点的,训练点中最常见的类别。
12 |
13 | 假设我们最终发现了我们的新点的真实类别。 然后我们会知道我们的分类是否正确。 另外,我们将会有一个新点,可以加入到我们的训练集中,因为我们知道它的类别。 这就更新了我们的训练集。 所以,我们自然希望,根据新的训练集更新我们的分类器。
14 |
15 | 本章将介绍一些简单的情况,其中新的数据会使我们更新我们的预测。 虽然本章中的例子在计算方面较简单,但是更新方法可以推广到复杂的设定,是机器学习最强大的工具之一。
16 |
17 | ## “更可能”的二分类器
18 |
19 | 让我们尝试使用数据,将一个点划分为两个类别之一,选择我们认为更可能的类别。 为此,我们不仅需要数据,而且还要清楚地描述几率是什么样。
20 |
21 | 我们将从一个简单的人造情况开始,开发主要的技术,然后跳到更有趣的例子。
22 |
23 | 假设有个大学班级,其组成如下:
24 |
25 | + 60% 的学生为二年级,其余的 40% 是三年级
26 | + 50% 二年级学生已经声明了他们的专业
27 | + 80% 三年级学生已经声明了他们的专业
28 |
29 | 现在假设我从班上随机挑选一个学生。 你能否用“更可能”的标准,将学生划分为二年级或三年级?
30 |
31 | 你可以,因为这个学生是随机挑选的,所以你知道这个学生是二年级的几率是 60%。 这比三年级的 40% 的可能性更大,所以你会把学生划分为二年级。
32 |
33 | 专业的信息是无关紧要的,因为我们已经知道班上二,三年的比例。
34 |
35 | 我们有了非常简单的分类器! 但是现在假设我给了你一些被挑选的学生的更多信息:
36 |
37 | 这个学生已经声明了专业。
38 |
39 | 这个知识会改变你的分类吗?
40 |
41 | ## 基于新信息更新预测
42 |
43 | 现在我们知道学生已经宣布了专业,重要的是要看看年级和专业声明的关系。 二年级的学生比三年级多,这仍然正确。 但是,三年级的学生,比二年级的学生,声明专业的比例更高,这也是事实。 我们的分类器必须考虑到这两个观察。
44 |
45 | 为了使这个可视化,我们将使用`students`表,它包含 100 个学生,每个学生一行,学生的年级和专业比例和数据中相同。
46 |
47 | ```py
48 | students.show(3)
49 | ```
50 |
51 |
52 | | Year | Major |
53 | | --- | --- |
54 | | Second | Undeclared |
55 | | Second | Undeclared |
56 | | Second | Undeclared |
57 |
58 | (省略了 97 行)
59 |
60 | 为了检查比例是否正确,我们使用`pivot`,按照这两个变量对每个学生进行交叉分类。
61 |
62 | ```py
63 | students.pivot('Major', 'Year')
64 | ```
65 |
66 | | Year | Declared | Undeclared |
67 | | --- | --- | --- |
68 | | Second | 30 | 30 |
69 | | Third | 32 | 8 |
70 |
71 | 
72 |
73 | 总人数为 100 人,其中二年级 60 人,三年级 40 人。 二年级中,每个专业类别有 50%。 三年级的 40 人中,20% 是未声明的,80% 已声明。 因此,这 100 人的比例和我们问题中的班级相同,我们可以假定,我们的学生是从 100 名学生中随机抽取的。
74 |
75 | 我们必须选择学生最可能进入的那一行。当我们对这个学生一无所知时,他或她可能在四个单元格中的任何一个,因此更可能在第一行(二年级),因为那里包含更多的学生。
76 |
77 | 但是现在我们知道这个学生已经声明了专业,所以可能结果的空间已经减少了:现在学生只能在两个已声明的单元格中的一个。
78 |
79 | 这些单元格共有 62 名学生,其中 32 名是三年级。 这是一半以上,即使不是太多。
80 |
81 | 所以,考虑到学生专业的新信息,我们必须更新我们的预测,现在将学生划分为三年级。
82 |
83 | 我们的分类的正确几率是多少? 对于所有声明了专业的 32 个三年级,我们是正确的,对于那 30 个二年级,我们是错误的。 因此,我们的正确几率大约是 0.516。
84 |
85 | 换句话说,我们正确几率是声明专业的学生中三年级的比例。
86 |
87 | ```py
88 | 32/(30+32)
89 | 0.5161290322580645
90 | ```
91 |
92 | ## 树形图
93 |
94 | 我们刚刚计算的比例基于 100 名学生。 但是班级没有理由没有 200 名学生,只要单元格中的所有比例都是正确的。 那么我们的计算就变成了`64 /(60 + 64)`,就是 0.516。
95 |
96 | 所以计算只取决于不同类别的比例,而不是计数。 为了便于比较,比例可以用树形图可视化,直接显示在数据透视表下方。
97 |
98 | ```py
99 | students.pivot('Major', 'Year')
100 | ```
101 |
102 | | Year | Declared | Undeclared |
103 | | --- | --- | --- |
104 | | Second | 30 | 30 |
105 | | Third | 32 | 8 |
106 |
107 | 像数据透视表一样,该图将学生分成四个不同的组,称为“分支”。请注意,“三年级已声明”分支中的学生比例为`0.4 x 0.8 = 0.32`,对应于数据透视表中“三年级已声明”单元格中的 32 名学生。 “二年级已声明”分支中包含学生的`0.6 x 0.5 = 0.3`,对应于数据透视表中“二年级已声明”单元格中的 30 个。
108 |
109 | 我们知道,被挑选的学生属于“已声明”分支。也就是说,学生在两个顶层分支之一。这两个分支现在形成了我们的简化概率空间,所有几率的计算必须相对于这个简化空间的总概率。
110 |
111 | 所以,考虑到学生已声明专业,他们是三年级的几率可以直接从树中计算出来。答案是相对于两个“已声明”分类的总比例,“三年级已声明”分类的比例。
112 |
113 | 也就是说,答案是和以前一样,已声明的学生中三年级的比例。
114 |
115 | ```py
116 | (0.4 * 0.8)/(0.6 * 0.5 + 0.4 * 0.8)
117 | 0.5161290322580645
118 | ```
119 |
120 | ### 贝叶斯法则
121 |
122 | 我们刚刚使用的方法来源于托马斯·贝叶斯牧师(1701-1761)。他的方法解决了所谓的“逆向概率”问题:假设有了新的数据,如何更新之前发现的几率?虽然贝叶斯生活在三个世纪之前,但他的方法现在在机器学习中广泛使用。
123 |
124 | 我们将在学生总体的背景下讲述这个规则。首先,一些术语:
125 |
126 | 先验概率。在我们知道所选学生的专业声明状态之前,学生是二年级的几率是 60%,学生是三年级的几率是 40%。这是两个类别的先验概率。
127 |
128 | 可能性。这是专业状态在给出学生类别情况下的几率;因此可以从树形图中读出。例如,假设学生是二年级,已声明的可能性是 0.5。
129 |
130 | 后验概率。这些是考虑专业声明状态的信息后,二年级的概率。我们计算了其中的一个:
131 |
132 | 假设学生已经声明,学生是三年级的后验概率表示为 ,计算如下。
133 |
134 | 
135 |
136 | 另一个后验概率是:
137 |
138 | 
139 |
140 | ```py
141 | (0.6 * 0.5)/(0.6 * 0.5 + 0.4 * 0.8)
142 | 0.4838709677419354
143 | ```
144 |
145 | 这大概是 0.484,还不到一半,与我们三年的分类一致。
146 |
147 | 请注意,两个后验概率的分母相同:新信息,也就是学生已声明的几率。
148 |
149 | 正因为如此,贝叶斯方法有时被归纳为比例陈述:
150 |
151 | 
152 |
153 | 公式非常便于高效地描述计算。 但是在我们的学生示例这样的情况中,不用公式来思考更简单。 我们仅仅使用树形图。
154 |
155 | ## 做出决策
156 |
157 | 贝叶斯规则的一个主要用途,是基于不完整的信息做出决策,并在新的信息到来时纳入它们。本节指出了在决策时保持你的假设的重要性。
158 |
159 | 许多疾病的医学检测都会返回阳性或阴性结果。阳性结果意味着,根据检测患者有疾病。阴性结果意味着,检测的结论是患者没有这种疾病。
160 |
161 | 医学检测经过精心设计,非常准确。但是很少有检测是 100% 准确的。几乎所有检测都有两种错误:
162 |
163 | 假阳性是,检测结果为阳性,但患者没有该疾病的错误。
164 |
165 | 假阴性是,检测结果为阴性,但患者确实有这种疾病的错误。
166 |
167 | 这些错误可能会影响人们的决策。假阳性可能引起焦虑和不必要的治疗(在某些情况下,这是昂贵的或危险的)。如果由于其阴性检测结果,患者未接受治疗,则假阴性可能具有更严重的后果。
168 |
169 | ### 罕见疾病的检测
170 |
171 | 假设总体很大,疾病只占总体的一小部分。 下面的属性图总结了这种疾病的信息,以及它的医学检测。
172 |
173 | 
174 |
175 | 总的来说,只有千分之四的总体有这种疾病。 检测相当准确:假阳性几率非常小,为 5/1000,但是假阴性更大(尽管还是很小),为 1/100。
176 |
177 | 个体可能知道也可能不知道他们是否患有这种疾病;通常情况下,人们会进行检测来确认他们是否拥有。
178 |
179 | 所以假设随机从总体中挑选一个人并进行检测。 如果检测结果是阳性的,你会如何分类:患病还是没有患病?
180 |
181 | 我们可以通过应用贝叶斯规则,和使用我们的“更可能”的分类器来回答这个问题。 鉴于该人已经检测出阳性,他或她患病的几率是相对于`Test Positive`分支中的总比例,顶层分支的比例。
182 |
183 | ```py
184 | (0.004 * 0.99)/(0.004 * 0.99 + 0.996*0.005 )
185 | 0.44295302013422816
186 | ```
187 |
188 | 鉴于这个人已经检测出阳性,他或她有这种疾病的几率是大约 44%。 所以我们将它们分类为:没有疾病。
189 |
190 | 这是一个奇怪的结论。 我们有一个相当准确的检测,一个人检测出阳性,我们的分类是...他们没有这种疾病? 这似乎没有任何意义。
191 |
192 | 面对一个令人不安的答案,首先要做的是检查计算。 上面的算法是正确的。 我们来看看是否可以用不同的方式得到相同的答案。
193 |
194 | 函数`population`群体返回 100,000 名患者的结果表格,它的列展示了实际情况和检测结果。 检测与树中描述的相同。 但是有这种疾病的比例是这个函数的参数。
195 |
196 | 我们将 0.004 用作参数来调用`population`,然后调用`pivot `,对这十万人中的每一个人进行交叉分类。
197 |
198 | ```py
199 | population(0.004).pivot('Test Result', 'True Condition')
200 | ```
201 |
202 |
203 | | True Condition | Negative | Positive |
204 | | --- | --- | --- |
205 | | Disease | 4 | 396 |
206 | | No Disease | 99102 | 498 |
207 |
208 | 表的单元格计数正确。 例如,根据总体的描述,一千人中有四人患有这种疾病。 表格中有十万人,所以 400 人应该有这种病。 这就是表格所显示的:`4 + 396 = 400`。在这 400 认中,99% 获得了阳性检测结果:`0.99 x 400 = 396`。
209 |
210 | ```py
211 | 396/(396 + 498)
212 | 0.4429530201342282
213 | ```
214 |
215 | 这就是我们通过使用贝叶斯规则得到的答案。`Positives`列中的计数显示为什么它小于 1/2。 在阳性的人中,更多的人没有疾病而不是有疾病。
216 |
217 | 原因是,很大一部分人没有这种疾病。检测出假阳性的一小部分人比真阳性要多。 这在树形图中更容易可视化:
218 |
219 | 
220 |
221 | 真阳性的比例是总体一小部分(0.004)的很大一部分(0.99)。
222 | 假阳性的比例是总体很大一部分(0.996)的一小部分(0.005)。
223 | 这两个比例是可比的;第二个大一点。
224 |
225 | 所以,鉴于随机选择的人检测为阳性,我们将他们划分为,更有可能没有疾病,是正确的。
226 |
227 | ### 主观先验
228 |
229 | 正确并不总令人满意。将阳性患者划分为不患有该疾病似乎仍然有些错误,对于这样的精确检测来说。由于计算是正确的,我们来看看我们的概率计算的基础:随机性假设。
230 |
231 | 我们的假设是,一个随机选择的人进行了检测,并得到了阳性结果。但是这在现实中并没有发生。因为他们认为他们可能有疾病,或者因为他们的医生认为他们可能有疾病,人们去接受检测。被检测的人不是随机选择的总体的成员。
232 |
233 | 这就是为什么,我们对被检测者的直觉与我们得到的答案不太相符。我们正在想象一个病人接受检测的现实情况,因为有一些理由让他们这样做,而计算基于随机选择的人进行检测。
234 |
235 | 所以让我们在更现实的假设下重做我们的计算,即病人正在接受检测,因为医生认为病人有发病的机会。
236 |
237 | 这里需要注意的是,“医生认为有机会”是指医生的意见,而不是总体中的比例。这被称为主观概率。在病人是否患有这种疾病的情况下,这也是主观的先验概率。
238 |
239 | 一些研究人员坚持认为,所有的概率必须是相对的频率,但主观概率导出都是。候选人赢得下一次选举的几率,大地震在下一个十年将会袭击湾区的几率,某个国家赢得下一届足球世界杯的几率:这些都不是基于相对频率或长期的频率。每个都包含主观因素。涉及它们的所有计算也都有主观因素。
240 |
241 | 假设医生的主观意见是,患者有 5% 的几率患病。那么树形图中的先验概率将会改变:
242 |
243 | 
244 |
245 | 鉴于病人检测为阳性,他或她有这种疾病的几率是由贝叶斯规则给出。
246 |
247 | ```py
248 | (0.05 * 0.99)/(0.05 * 0.99 + 0.95 * 0.005)
249 | 0.9124423963133641
250 | ```
251 |
252 | 改变先验的效果是惊人的。 即使病人患病的医生的先验概率(5%)很低,一旦患者检测出阳性,患病的后验概率高达 91% 以上。
253 |
254 | 如果患者检测出阳性,医生认为患者患病是合理的。
255 |
256 | ### 确认结果
257 |
258 | 虽然医生的意见是主观的,但我们可以产生一个人造总体,5% 的人患有这种疾病,并且使用相同的检测来进行检测。 然后,我们可以计算不同类别的人数,看看这些计数是否与我们使用贝叶斯规则得到的答案一致。
259 |
260 |
261 | 我们可以使用`population(0.05)`和`pivot`构建相应的总体,并看看四个单元格中的计数。
262 |
263 | ```py
264 | population(0.05).pivot('Test Result', 'True Condition')
265 | ```
266 |
267 |
268 | | True Condition | Negative | Positive |
269 | | --- | --- | --- |
270 | | Disease | 50 | 4950 |
271 | | No Disease | 94525 | 475 |
272 |
273 |
274 | 在这个人工创建的 10 万人的总体中,有 5000 人(5%)患有这种疾病,其中 99% 的人检测为阳性,导致 4950 人为真阳性。 将其与 475 个假阳性相比:在阳性中,拥有疾病的比例与我们通过贝叶斯规则得到的结果相同。
275 |
276 | ```py
277 | 4950/(4950 + 475)
278 | 0.9124423963133641
279 | ```
280 |
281 | 因为我们可以一个具有合适比例的总体,我们也可以使用模拟来确认我们的答案是否合理。 `pop_05`表包含 10 万人的总体,使用医生的先验患病概率 5%,以及检测的错误率来生成。 我们从总体中抽取一个规模为 10,000 的简单随机样本,并提取`positive`表,仅包含样本中阳性检测结果的个体。
282 |
283 | ```py
284 | pop_05 = population(0.05)
285 |
286 | sample = pop_05.sample(10000, with_replacement=False)
287 |
288 | positive = sample.where('Test Result', are.equal_to('Positive'))
289 | ```
290 |
291 | 在这些阳性结果中,真实比例是多少? 那是拥有这种疾病的阳性的比例:
292 |
293 | ```py
294 | positive.where('True Condition', are.equal_to('Disease')).num_rows/positive.num_rows
295 | 0.9131205673758865
296 | ```
297 |
298 | 运行这两个单元格几次,你会发现,阳性中真阳性的比例位于我们通过贝叶斯规则计算的值 0.912 周围。
299 |
300 | 你也可以以不同参数调用`population`函数,来改变先验患病概率,并查看后验概率如何受到影响。
301 |
--------------------------------------------------------------------------------
/2.md:
--------------------------------------------------------------------------------
1 | # 二、因果和实验
2 |
3 | > 原文:[Causality and Experiments](https://github.com/data-8/textbook/tree/gh-pages/chapters/02)
4 |
5 | > 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
8 |
9 | > 自豪地采用[谷歌翻译](https://translate.google.cn/)
10 |
11 | “这些问题已经,而且可能永远留在自然界难以捉摸的秘密之中,它们属于人类智力根本难以接近的一类问题。 - 1849 年 9 月,伦敦时报,霍乱如何传染和传播
12 |
13 | 死刑有威慑作用吗?巧克力对你有好处吗?什么导致乳腺癌?
14 |
15 | 所有这些问题试图为结果找到一个原因。仔细检查数据可以帮助揭示这些问题。在本节中,你将学习建立因果关系所涉及的一些基本概念。
16 |
17 | 观察是良好科学的关键。观察研究是一项研究,科学家根据他们所观察到的,但却无法产生的数据作出结论。在数据科学中,许多这样的研究涉及对一组个体的观察,称为实验的利害关系(factor of interest),以及对每个个体的测量结果。
18 |
19 | 将个体视为人是最容易的。在研究巧克力是否对健康有好处时,个体确实是人,实验是吃巧克力,结果可能是血压的测量。但观察研究中的个体不一定是人。在研究死刑是否具有威慑作用时,个体可以为联盟的 50 个州。允许死刑的州的法律是实验,结果可能是州的谋杀率。
20 |
21 | 根本问题是实验是否对结果有影响。实验和结果之间的任何关系被称为关联。如果实验导致结果发生,那么这个关联是因果关系。因果关系是本节开头提出的所有三个问题的核心。例如,问题之一是巧克力是否直接导致健康状况的改善,而不是巧克力与健康之间是否存在关联。
22 |
23 | 因果关系的建立往往分两个阶段进行。首先,观察一个关联。接下来,更仔细的分析决定了因果关系。
24 |
25 | ## John Snow 和 Broad 街水泵
26 |
27 | ### 观察和可视化:John Snow 和 Broad 街水泵
28 |
29 | 精确观察导致建立因果关系的例子之一,最早可以追溯到 150 多年前。为了将你的思维带回正确的时间,试着想象一下 19 世纪 50 年代的伦敦。这是世界上最富裕的城市,但其中许多人却极度贫困。那时,查尔斯·狄更斯(Charles Dickens)在名气鼎盛时,正在写作关于他们的困境的文章。这个城市的贫困地区疾病盛行,霍乱是最可怕的。那个时候还不知道细菌会导致疾病,主流理论是“瘴气”是主要的罪魁祸首。 瘴气表现为恶臭,被认为是由腐烂物质引起的无形的有毒颗粒。伦敦的部分地区气味非常糟糕,特别是在炎热的天气里。为了保护自己免受感染,那些有能力的人把甜的东西放在鼻子上。
30 |
31 | 几年来,一个名叫约翰·斯诺(John Snow)的医生一直在跟踪着时不时袭击英国的巨大霍乱。疾病突然到来,几乎立即致命:人们在一两天内死亡,数百人在一个星期内死亡,单批总死亡人数可能达到数万人。斯诺对瘴气理论持怀疑态度。他注意到,当整个家庭被霍乱摧毁时,邻居有时完全没有受到影响。当他们呼吸和邻居一样的空气和瘴气时,不好的气味和霍乱的发生之间没有什么紧密的联系。
32 |
33 | 斯诺还注意到,这种疾病的发作几乎总是牵涉呕吐和腹泻。因此,他认为这种感染是由人们吃或喝的东西来进行的,而不是他们所呼吸的空气。他主要怀疑被污染的水。
34 |
35 | 1854 年 8 月底,霍乱在过度拥挤的伦敦苏豪区爆发。随着死亡人数的增加,斯诺用一种在疾病传播研究中成为标准的方法,勤奋地将它们记录下来:他画了一张地图。在该地区的街道地图上,他记录了每次死亡的地点。
36 |
37 | 这是斯诺的原始地图。每个黑色条形代表一次死亡。黑色圆圈标记了水泵的位置。地图上显示了一个惊人的启示 - 死亡大致集中在 Broad 街水泵周围。
38 |
39 | 
40 |
41 | 斯诺仔细研究了他的地图,并调查了明显的异常。他们都设计 Broad 街水泵。例如:
42 |
43 | + 死亡发生在离 Rupert 街水泵更近的房子,而不是 Broad 街。尽管 Rupert 街水泵直线上更近,但由于街道布局不方便,是死路一条。那些房子里的居民使用了 Broad 街水泵。
44 | + 泵东边的两个街区没有死亡。那是 Lion Brewery 的位置,那里的工人喝了他们酿造的东西。如果他们想喝水,啤酒厂有自己的井。
45 | + Broad 街水泵几个街区之外的房子里,发生了少量死亡。那些孩子在上学路上从 Broad 街水泵饮水。泵的水清凉爽口。
46 |
47 | 最后一个支持斯诺的理论的证据是,在距离 Soho 区很远的 Hampstead 地区的两个孤立的死亡事件。斯诺对这些人感到困惑,直到他得知死者是住在 Broad 街的 Susannah Eley 夫人和她的侄女。Eley 夫人每天都将 Broad 街水泵的水带到 Hampstead 给她。她喜欢水的味道。
48 |
49 | 后来发现了一个粪坑,距离 Broad 街水泵几英尺远,渗入了井里面。因此,来自霍乱受害者房子的污水污染了水泵的水。
50 |
51 | 斯诺用他的地图来说服当地政府,拆除 Broad 街水泵的手柄。虽然霍乱疫情已经在减少,但是停止使用这种水泵有可能阻止了许多人死于未来的疾病。
52 |
53 | Broad 街水泵的手柄的拆除已成为一个传奇。在亚特兰大的疾病控制中心(CDC),当科学家寻找流行病问题的简单答案时,他们有时会互相问:“这个水泵的手柄在哪里?”
54 |
55 | 斯诺的地图是数据可视化的最早和最强大的用法之一。现在各种疾病地图是跟踪流行病的标准工具。
56 |
57 | ### 因果关系
58 |
59 | 虽然地图给了斯诺强有力的证据,说明了供水的清洁是控制霍乱的关键,但是,为了使“污染的水导致疾病的传播”这个科学论证有说服力,还有很长一段路要走。为了使案例更有说服力,他必须使用比较法。
60 |
61 | 科学家使用比较来确定实验与结果之间的关联。他们比较了一组接受实验的个体(实验组)的结果,和一组没有接受实验的个体的结果(对照组)。例如,现在的研究人员可能会比较死刑国家和没有死刑的国家的平均谋杀率。
62 |
63 | 如果结果不同,那就是表明关联的证据。但是为了确定因果关系,需要更加小心。
64 |
65 | ## 斯诺的“大实验”
66 |
67 | 斯诺为自己在 Soho 中学到的东西感到鼓舞,他对霍乱的死亡情况做了更彻底的分析。一段时间中,他一直在收集伦敦一个地区的数据,这里由两家水厂服务。Lambeth 水厂从污水排入泰晤士河的地方的上游抽水。它的水比较干净。但 Southwark and Vauxhall (S&V) 公司在污水排放的下游抽水,因此其供水受到污染。
68 |
69 | 下图显示了两家公司所服务的地区。斯诺专注于两个服务地区重叠的地方。
70 |
71 | 
72 |
73 | 斯诺注意到,S&V 供应的人和 Lambeth 供应的人之间没有系统的差别。 “每家公司都供应富人和穷人,大房子和小房子,接受不同公司的供水的人的状况或职业并没有差别......接受两家公司供水的人或者房子都没什么区别,它们周围的物理状况也没什么区别...”
74 |
75 | 唯一的区别是供水方面,“一组供水含有伦敦的污水,其中有一些可能来自霍乱病人,另一组则不含。”
76 |
77 | 斯诺相信他能够得出一个清楚的结论,斯诺在下表中总结了他的数据。
78 |
79 |
80 | | Supply Area | Number of houses | cholera deaths | deaths per 10,000 houses |
81 | | --- | --- | --- | --- |
82 | | S&V | 40,046 | 1,263 | 315 |
83 | | Lambeth | 26,107 | 98 | 37 |
84 | | Rest of London | 256,423 | 1,422 | 59 |
85 |
86 | 数字在指责 S&V。 S&V 供应的房屋的霍乱死亡率几乎是 Lambeth 供应的房屋的十倍。
87 |
88 | ## 建立因果
89 |
90 | 用本节前面提出的语言,可以将 S&V 房屋中的人作为实验组,Lambeth 房屋中的人作为对照组。斯诺的分析中的一个关键因素是,除了实验组以外,两组相互比较。
91 |
92 | 为了确定供水是否引起霍乱,斯诺必须比较两个彼此相似的群体,它们只有一方面不同:供水。只有这样,他才能够将其结果的差异归因于供水。如果这两个群体在其他方面有所不同,那么就很难把供水视为疾病的来源。例如,如果实验组由工厂工人组成,而对照组不是,那么两组之间的结果之间的差异可能是由于供水,工厂工作或两者兼有,或使两组彼此不同的其它因素。最后的图景会更加模糊。
93 |
94 | 斯诺的才智在于,确定可以使他的比较清晰的两组。他开始着手建立水污染和霍乱感染之间的因果关系,并且在很大程度上他成功了,尽管瘴气学说忽视甚至嘲笑他。当然,斯诺并不了解人类感染霍乱的详细机制。这个发现是在 1883 年,当时德国科学家罗伯特·科赫(Robert Koch)分离出霍乱弧菌,这种霍乱弧菌是进入人体小肠并引起霍乱的细菌。
95 |
96 | 事实上,霍乱弧菌在 1854 年由意大利的菲利波·帕齐尼(Filippo Pacini)发现,就在斯诺在伦敦分析他的数据的时候。由于意大利瘴气学说的统治,帕齐尼的发现并不为人所知。但到了十九世纪末,瘴气学说正在消失。随后的历史证明了帕齐尼和约翰·斯诺。斯诺的方法导致了流行病学领域的发展,它是疾病传播的研究。
97 |
98 | ### 混淆
99 |
100 | 现在让我们回到更现代化的时代,带着我们一路上学到的重要经验:
101 |
102 | 在一项观察研究中,如果实验组和对照组在实验以外的方面有所不同,则很难对因果关系作出结论。
103 |
104 | 两组之间的根本区别(除了实验)被称为混淆因素,因为当你试图得出结论时,它可能会混淆你(也就是搞砸你)。
105 |
106 | 示例:咖啡和肺癌。二十世纪六十年代的研究表明,喝咖啡的人患肺癌的比率高于不喝咖啡的人。因此,有些人认为咖啡是肺癌的一个原因。但咖啡不会导致肺癌。分析包含一个混淆因素 - 吸烟。在那些日子里,喝咖啡的人也可能是吸烟者,吸烟确实会导致肺癌。喝咖啡与肺癌有关,但不会导致疾病。
107 |
108 | 混淆因素在观察研究中很常见。良好的研究需要非常小心,以减少混淆。
109 |
110 | ## 随机化
111 |
112 | 避免混淆的一个很好的方法是,将个体随机分配到实验和对照组,然后将实验给予分配到实验组的人。随机化使两组除了实验之外都相似。
113 |
114 | 如果你能够将个体随机分为实验组和对照组,你正在进行一项随机对照试验(RCT)。有时候,人们在实验中的反应会受到他们知道他们在哪个群体的影响。所以你可能希望进行盲法实验,其中个体不知道他们是在实验组还是对照组。为了使它有效,你必须把安慰剂给控制组,这是一种和实验看起来完全一样的东西,但实际上没有效果。
115 |
116 | 随机对照实验早已成为医学领域的黄金标准,例如确定新药是否有效。在经济学等其他领域也越来越普遍。
117 |
118 | 示例:墨西哥的福利补贴。在 20 世纪 90 年代的墨西哥村庄,贫困家庭的孩子往往没有入学。其中一个原因是年龄较大的孩子可以上班,从而帮助家庭。墨西哥财政部长 Santiago Levy 着手调查福利项目是否可以用来提升入学率和改善健康状况。他在一组村庄进行了一项随机对照试验,随机选择其中的一些来接受一个名为 PROGRESA 的新福利项目。如果他们的孩子定期上学,并且家庭使用了预防性医疗保险,那么这个项目会把钱捐给贫困家庭。如果孩子上中学而不是小学,会给他们更多钱,来补偿孩子的工资损失,女孩上学比男孩给的更多。其余的村庄没有得到这个实验,并形成了对照组。由于随机化,没有销魂因素,可以确定 PROGRESA 增加了入学率。对于男孩,入学率从对照组的 73% 上升到 PROGRESA 组的 77%。对于女孩来说,增长幅度更大,从对照组的 67% 增加到 PROGRESA 组的近75%。由于这个实验的成功,墨西哥政府以 OPORTUNIDADES 这个新名称支持这个项目,作为对一个健康和受过良好教育的人口的投资。
119 |
120 | 在某些情况下,即使目标是调查因果关系,也不可能进行随机对照实验。例如,假设你想研究怀孕期间饮酒的影响,你随机将一些孕妇分配到你的“酒精”组。如果你给他们喝一杯,你不应该期待她们会合作。在这种情况下,你几乎总是在进行观察研究,而不是实验。要警惕混淆因素。
121 |
122 | ## 尾注
123 |
124 | 根据我们开发的术语,约翰·斯诺进行了一项观察研究,而不是一个随机的实验。但是他把自己的研究称为“大实验”,因为他写道:“至少三十万人......被分成两组,他们无法选择,在大多数情况下,他们并不知情......”
125 |
126 | 斯诺的这种研究有时被称为“自然实验”。然而,真正的随机化并不仅仅意味着,实验和对照组“在他们无法选择的情况下”进行选择。
127 |
128 | 随机化的方法可以像掷硬币一样简单。它也可能更复杂一点。但是随机化的每一种方法都是由一系列精心定义的步骤组成的,这些步骤允许几率以数学方式指定。这有两个重要的结果。
129 |
130 | + 它使我们能够以数学方式,计算随机化产生实验和对照组的可能性。
131 |
132 | + 它使我们能够对实验组和对照组之间的差异作出精确的数学表述。这反过来帮助我们对实验是否有效作出正确的结论。
133 |
134 | 在本课程中,你将学习如何进行和分析你自己的随机实验。这将涉及比本节更多的细节。目前,只需关注主要思想:尝试建立因果关系,如果可能,进行随机对照实验。如果你正在进行一项观察研究,你可能能够建立联系而不是因果关系。在根据观察研究得出因果关系的结论之前,要非常小心混淆因素。
135 |
136 | ### 术语
137 |
138 | + observational study:观察研究
139 | + treatment:实验
140 | + outcome:结果
141 | + association:关联/联系
142 | + causal association:因果联系
143 | + causality:因果(关系)
144 | + comparison:比较
145 | + treatment group:实验组
146 | + control group:对照组
147 | + epidemiology:流行病学/传染病学
148 | + confounding:混淆
149 | + randomization:随机化
150 | + randomized controlled experiment:随机对照实验
151 | + randomized controlled trial (RCT):随机对照实验
152 | + blind:盲法
153 | + placebo:安慰剂
154 |
155 | ### 有趣的事实
156 |
157 | + 约翰·斯诺有时被称为流行病学之父,但他是专业的麻醉师。 他的病人之一是维多利亚女王,她是分娩时麻醉剂的早期接受者。
158 |
159 | + 弗洛伦斯·南丁格尔,现代护理实践的创始人,因其在克里米亚战争中的工作而闻名,是一位顽固瘴气主义者。 她没有时间研究传染病和细菌的理论,也没有时间讲述她的话。 她说:“与这个学说相关的荒谬是无穷无尽的。一言以蔽之,从一般意义上说,没有任何科学研究可以接受的证据表明,存在传染病这样的事情。”
160 |
161 | + 后来的随机对照试验表明,PROGRESA 坚持的条件 - 孩子上学,预防性医疗保险 - 对于提升入学率没有必要。 只是提高福利金就足够了。
162 |
163 | ### 扩展阅读
164 |
165 | + [The Strange Case of the Broad Street Pump: John Snow and the Mystery of Cholera](http://www.ucpress.edu/book.php?isbn=9780520250499) 由 Sandra Hempel 所著,加利福尼亚大学出版社出版,读起来像是侦探小说。 这是本节中约翰·斯诺和他的工作的主要来源之一。 一些警告:这本书的一些内容令人反胃。
166 |
167 | + [Poor Economics](http://www.pooreconomics.com/) 由 MIT 的 Abhijit V. Banerjee 和 Esther Duflo 所著的畅销书,是对抗全球贫困的方式的易理解的真实记录。 它包含了很多 RCT 的例子,包括本节中的 PROGRESA 示例。
168 |
--------------------------------------------------------------------------------
/3.md:
--------------------------------------------------------------------------------
1 | # 三、Python 编程
2 |
3 | > 原文:[Programming in Python](https://github.com/data-8/textbook/tree/gh-pages/chapters/03)
4 |
5 | > 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
8 |
9 | > 自豪地采用[谷歌翻译](https://translate.google.cn/)
10 |
11 | 编程可以极大地提高我们收集和分析世界信息的能力,而这些信息又可以通过上一节所述的谨慎推理来发现。 在数据科学中,编写程序的目的是,指示计算机执行分析步骤。 电脑无法自行研究世界。 人们必须准确描述计算机应该执行什么步骤来收集和分析数据,这些步骤是通过程序来表达的。
12 |
13 | ## 表达式
14 |
15 | 编程语言比人类语言简单得多。 尽管如此,在任何语言中,还是有一些语法规则需要学习,这里就是我们开始的地方。 在本文中,我们将使用 Python 编程语言。 学习语法规则是必不可少的,最基本的程序中使用的规则也是更复杂程序的核心。
16 |
17 | 程序由表达式组成,向计算机描述了如何组合数据片段。 例如,乘法表达式由两个数字表达式之间的`*`符号组成。表达式,例如`3*4`,由计算机求值。在这种情况下,(IPython 中的)每个单元格中的最后一个表达式的值(求值结果)将显示在单元格下方,这里是 12。
18 |
19 | ```py
20 | 3 * 4
21 | 12
22 | ```
23 |
24 | 编程语言的语法规则是僵化的。 在 Python 中,`*`符号不能连续出现两次。 计算机不会试图解释一个与规定的表达式结构不同的表达式。 相反,它会显示`SyntaxError`错误。 语言的语法是其语法规则的集合,`SyntaxError`表示表达式结构不匹配任何语法规则。
25 |
26 | ```py
27 | 3 * * 4
28 | File "", line 1
29 | 3 * * 4
30 | ^
31 | SyntaxError: invalid syntax
32 | ```
33 |
34 | 表达式的小改动可以完全改变它的含义。 下面,`*`之间的空格已被删除。 因为`**`出现在两个数字表达式之间,所以表达式是一个格式良好的指数表达式(第一个数字的第二个数字次方,`3*3*3*3`)。 符号`*`和`**`称为运算符,它们组合的值称为操作数。
35 |
36 | ```py
37 | 3 ** 4
38 | 81
39 | ```
40 |
41 | 常用操作符。 数据科学通常涉及数值的组合,而编程语言中的一组操作符,是为了使得表达式可以用于表示任何类型的算术。 在Python中,以下操作符是必不可少的。
42 |
43 |
44 |
45 | | 表达式类型 | 运算符 | 示例 | 值 |
46 | | --- | --- | --- | --- |
47 | | 加法 | `+` | `2 + 3` | 5 |
48 | | 减法 | `-` | `2 - 3` | -1 |
49 | | 乘法 | `*` | `2 * 3` | 6 |
50 | | 除法 | `/` | `7 / 3` | 2.66667 |
51 | | 取余 | `%` | `7 % 3` | 1 |
52 | | 指数 | `**` | `2 ** 0.5` | 1.41421 |
53 |
54 | Python 表达式遵循熟悉的优先级规则,与代数中相同:乘法和除法在加法和减法之前计算。 圆括号可以用来在较大的表达式中,将较小的表达式组合在一起。
55 |
56 | ```py
57 | 1 + 2 * 3 * 4 * 5 / 6 ** 3 + 7 + 8 - 9 + 10
58 | 17.555555555555557
59 | 1 + 2 * (3 * 4 * 5 / 6) ** 3 + 7 + 8 - 9 + 10
60 | 2017.0
61 | ```
62 |
63 | ### 示例
64 |
65 |
66 | 这里是一个图表,来自 20 世纪 80 年代初期的“华盛顿邮报”(The Washington Post),试图比较几十年来医生的收入与其他专业人员的收入。 我们是否真的需要在每个条形上看到两个头(一个带有听诊器)? 耶鲁大学教授爱德华·图夫特(Edward Tufte)是世界上量化信息可视化的专家之一,他为这种不必要的修饰创造了“垃圾图表”(chartjunk)一词。 这张图也是 Tufte 痛恨的“数据与油墨比例过低”的一个例子。
67 |
68 | 
69 |
70 | 华盛顿邮报图片
71 |
72 | 最重要的是,图的横轴不是按比例绘制的。 这对条形图的形状有显着的影响。 当按规模绘制并把装饰修剪掉时,图表显示的趋势非常不同于原来明显的线性增长。 下面的优雅图表由统计系统 R 的创始人之一 Ross Ihaka 提供。
73 |
74 | 
75 |
76 | Ross Ihaka 的图片版本
77 |
78 | 在 1939 年到 1963 年间,医生的收入从 3,262 美元增加到 25,050 美元。 所以在这个时期,每年的平均收入增加了大约 900 美元。
79 |
80 | ```py
81 | (25050 - 3262)/(1963 - 1939)
82 | 907.8333333333334
83 | ```
84 |
85 | 在 Ross Ihaka 的图表中可以看到,在这个时期,医生的收入大致呈线性上升,并且保持在一个相对稳定的水平。 正如我们刚刚计算的那样,这个比率大约是 900 美元。
86 |
87 | 但是从 1963 年到 1976 年,这个比例是三倍多:
88 |
89 | ```py
90 | (62799 - 25050)/(1976 - 1963)
91 | 2903.769230769231
92 | ```
93 |
94 | 这就是 1963 年之后,这个图形急剧上升的原因。
95 |
96 | 本章介绍了许多类型的表达式。 学习编程需要结合学到所有的东西,调查计算机的行为。 如果你连续除两次会发生什么? 你并不需要总是问专家(或互联网);许多这些细节可以通过自己尝试发现。
97 |
98 | ## 数值
99 |
100 | ### 整数值
101 |
102 | 计算机为执行数值计算而设计,但是关于处理数字有一些重要的细节,每个处理定量数据的程序员都应该知道它。 Python(和大多数其他编程语言)区分两种不同类型的数字:
103 |
104 | + 整数在 Python 语言中称为`int`值。 它们只能表示没有小数部分的整数(负数,零或正数)
105 | + 实数在 Python 语言中被称为`float `值(或浮点值)。 他们可以表示全部或部分数字,但有一些限制。
106 |
107 | 数值的类型在展示方式上是明显的:`int`值没有小数点,`float`值总是有一个小数点。
108 |
109 | ```py
110 | # Some int values
111 | 2
112 | 2
113 | 1 + 3
114 | 4
115 | -1234567890000000000
116 | -1234567890000000000
117 | # Some float values
118 | 1.2
119 | 1.2
120 | 1.5 + 2
121 | 3.5
122 | 3 / 1
123 | 3.0
124 | -12345678900000000000.0
125 | -1.23456789e+19
126 | ```
127 |
128 | 当一个`float `值和一个`int`值,通过算术运算符组合在一起时,结果总是一个`float`值。 在大多数情况下,两个整数的组合形成另一个整数,但任何数字(`int`或`float`)除以另一个将是一个`float`值。 非常大或非常小的`float`值可以使用科学记数法表示。
129 |
130 | ### 浮点值
131 |
132 | 浮点值非常灵活,但他们有限制。
133 |
134 | `float`可以表示非常大和非常小的数字。存在限制,但你很少遇到他们。
135 | 浮点数只能表示任何数字的 15 或 16 位有效数字;剩下的精度就会丢失。 这个有限的精度对于绝大多数应用来说已经足够了。
136 | 将浮点值与算术运算结合后,最后的几位数字可能不正确。 第一次遇到时,微小的舍入错误往往令人困惑。
137 |
138 | 第一个限制可以通过两种方式来观察。 如果一个计算的结果是一个非常大的数字,那么它被表示为无限大。 如果结果是非常小的数字,则表示为零。
139 |
140 | ```py
141 | 2e306 * 10
142 | 2e+307
143 | 2e306 * 100
144 | inf
145 | 2e-322 / 10
146 | 2e-323
147 | 2e-322 / 100
148 | 0.0
149 | ```
150 |
151 | 第二个限制可以通过涉及超过 15 位有效数字的表达式来观察。 在进行任何算术运算之前,这些额外的数字被丢弃。
152 |
153 | ```py
154 | 0.6666666666666666 - 0.6666666666666666123456789
155 | 0.0
156 | ```
157 |
158 | 当两个表达式应该相等时,可以观察到第三个限制。 例如,表达式`2 ** 0.5`计算 2 的平方根,但是该值的平方不会完全恢复成 2。
159 |
160 | ```py
161 | 2 ** 0.5
162 | 1.4142135623730951
163 | (2 ** 0.5) * (2 ** 0.5)
164 | 2.0000000000000004
165 | (2 ** 0.5) * (2 ** 0.5) - 2
166 | 4.440892098500626e-16
167 | ```
168 |
169 | 上面的最终结果是`0.0000000000000004440892098500626`,这个数字非常接近零。 这个算术表达式的正确答案是 0,但是最后的有效数字中的一个小错误,在科学记数法中显得非常不同。 这种行为几乎出现在所有的编程语言中,因为它是在计算机上进行算术运算的标准方式的结果。
170 |
171 | 尽管`float `并不总是精确的,但它们当然是可靠的,并且在所有不同种类的计算机和编程语言中,以相同的方式工作。
172 |
173 | ## 名称
174 |
175 | 名称通过赋值语句在 Python 中得到一个值。 在赋值中,名称后面是`=`,再后面是任何表达式。 `=`右边的表达式的值被赋给名称。 一旦名称有了赋给它的值,在将来的表达式中,值会替换为这个名称。
176 |
177 | ```py
178 | a = 10
179 | b = 20
180 | a + b
181 | 30
182 | ```
183 |
184 | 之前赋值的名称可以在`=`右边的表达式中使用。
185 |
186 | ```py
187 | quarter = 1/4
188 | half = 2 * quarter
189 | half
190 | 0.5
191 | ```
192 |
193 | 但是,仅仅是表达式的当前值赋给了名称。 如果该值稍后改变,则由该值定义的名称将不会自动更改。
194 |
195 | ```py
196 | quarter = 4
197 | half
198 | 0.5
199 | ```
200 |
201 | 名称必须以字母开头,但可以包含字母和数字。 名称不能包含空格;相反,通常使用下划线字符`_`来替换每个空格。名称只在你编写的时候是有用的;程序员可以选择易于理解的名称。 通常,比起`a`和`b`,你可以创造更有意义的名字。 例如,为了描述加利福尼亚州伯克利 5 美元商品的销售税,以下名称阐明了各种相关数量的含义。
202 |
203 | ```py
204 | purchase_price = 5
205 | state_tax_rate = 0.075
206 | county_tax_rate = 0.02
207 | city_tax_rate = 0
208 | sales_tax_rate = state_tax_rate + county_tax_rate + city_tax_rate
209 | sales_tax = purchase_price * sales_tax_rate
210 | sales_tax
211 | 0.475
212 | ```
213 |
214 | ## 示例:增长率
215 |
216 | 相同数量在不同时间取得的两次测量值之间的关系通常表示为增长率。 例如,美国联邦政府在 2002 年[雇用](http://www.bls.gov/opub/mlr/2013/article/industry-employment-and-output-projections-to-2022-1.htm)了 276.6 万人,在 2012 年雇用了 281.4 万人。为了计算增长率,我们必须首先决定将哪个值作为初始值。 对于随着时间变化的数值,较早的值是一个自然的选择。 然后,我们将变动值和初始值之间的差除以初始值。
217 |
218 | ```py
219 | initial = 2766000
220 | changed = 2814000
221 | (changed - initial) / initial
222 | 0.01735357917570499
223 | ```
224 |
225 | 通常从两个测量值的比例中减去 1,这产生相同的值。
226 |
227 | ```py
228 | (changed/initial) - 1
229 | 0.017353579175704903
230 | ```
231 |
232 | 这个值是 10 年间的增长率。 增长率的一个实用属性是,即使值以不同的单位表示,它们也不会改变。 所以,例如,我们可以以千人为单位,在 2002 年和 2012 年之间表达同样的关系。
233 |
234 | ```py
235 | initial = 2766
236 | changed = 2814
237 | (changed/initial) - 1
238 | 0.017353579175704903
239 | ```
240 |
241 | 10 年以来,美国联邦政府的雇员人数仅增长了 1.74%。 那个时候,美国联邦政府的总支出从 2.37 万亿美元增加到 2012 年的 3.38 万亿美元。
242 |
243 | ```py
244 | initial = 2.37
245 | changed = 3.38
246 | (changed/initial) - 1
247 | 0.4261603375527425
248 | ```
249 |
250 | 联邦预算增长 42.6% 远高于联邦雇员增长 1.74%。 实际上,联邦雇员的数量增长速度远远低于美国人口。美国人口同期增长 9.21%,从 2002 年的 2.8760 亿人增加到 2012 年的 3.41 亿。
251 |
252 | ```py
253 | initial = 287.6
254 | changed = 314.1
255 | (changed/initial) - 1
256 | 0.09214186369958277
257 | ```
258 |
259 | 增长率可能是负值,表示某种值的下降。 例如,美国的制造业就业岗位从 2002 年 的 1530 万减少到 2012 年的 1190 万,增长率为 -22.2%。
260 |
261 | ```py
262 | initial = 15.3
263 | changed = 11.9
264 | (changed/initial) - 1
265 | -0.2222222222222222
266 | ```
267 |
268 | 年增长率是一年之内的某个数量的增长率。 年增长率为 0.035,累计十年,十年增长率为 0.41(即 41%)。
269 |
270 | ```py
271 | 1.035 * 1.035 * 1.035 * 1.035 * 1.035 * 1.035 * 1.035 * 1.035 * 1.035 * 1.035 - 1
272 | 0.410598760621121
273 | ```
274 |
275 | 相同的计算可以使用名称和指数表达。
276 |
277 | ```py
278 | annual_growth_rate = 0.035
279 | ten_year_growth_rate = (1 + annual_growth_rate) ** 10 - 1
280 | ten_year_growth_rate
281 | 0.410598760621121
282 | ```
283 |
284 | 同样,十年的增长率可以用来计算等价的年增长率。 下面,`t`是两次测量值之间经过的年数。 下面计算过去 10 年联邦支出的年增长率。
285 |
286 | ```py
287 | initial = 2.37
288 | changed = 3.38
289 | t = 10
290 | (changed/initial) ** (1/t) - 1
291 | 0.03613617208346853
292 | ```
293 |
294 | 十年来的总增长率相当于每年增长 3.6%。
295 |
296 | 总之,增长率`g`用来描述`initial `(初始值)和经过一段时间`t`之后的`changed`(变化值)的相对大小。 为了计算`changed`,使用指数来重复应用增长率`g` `t`次。
297 |
298 | ```py
299 | initial * (1 + g) ** t
300 | ```
301 |
302 | 为了计算`g`,计算总增长率的`1/t`次方并减一。
303 |
304 | ```py
305 | (changed/initial) ** (1/t) - 1
306 | ```
307 |
308 | ## 调用表达式
309 |
310 | 调用表达式调用函数,这些函数是具名操作。 函数名称首先出现,然后是括号中的表达式。
311 |
312 | ```py
313 | abs(-12)
314 | 12
315 | round(5 - 1.3)
316 | 4
317 | max(2, 2 + 3, 4)
318 | 5
319 | ```
320 |
321 | 在这最后一个例子中,`max`函数在三个参数:`2`, `5`和`4`上调用。圆括号内每个表达式的值被传递给函数,函数返回整个调用表达式的最终值。 `max`函数可以接受任意数量的参数并返回最大值。
322 |
323 | 一些函数默认是可用的,比如`abs`和`round`,但是大部分内置于 Python 语言的函数都存储在一个称为模块的函数集合中。 导入语句用于访问模块,如`math `或`operator`。
324 |
325 | ```py
326 | import math
327 | import operator
328 | math.sqrt(operator.add(4, 5))
329 | 3.0
330 | ```
331 |
332 | 可以使用`+`和`**`运算符来表达等价的表达式。
333 |
334 | ```py
335 | (4 + 5) ** 0.5
336 | 3.0
337 | ```
338 |
339 | 运算符和调用表达式可以在表达式中一起使用。 两个值之间的百分比差异用于比较一些值,它们明显既不是`initial `也不是`changed`。 例如,2014 年,佛罗里达农场生产了 27.2 亿个蛋,而爱荷华州农场生产了 162.5 亿个鸡蛋 [1]。 百分比差值是数值之差的绝对值的 100 倍,再除以它们的平均值。 在这种情况下,差值大于平均值,所以百分比差异大于 100。
340 |
341 | > [1]
342 |
343 | ```py
344 | florida = 2.72
345 | iowa = 16.25
346 | 100*abs(florida-iowa)/((florida+iowa)/2)
347 | 142.6462836056932
348 | ```
349 |
350 | 学习不同函数的行为,是学习编程语言的重要组成部分。 Jupyter 笔记本可以帮助你记住不同函数的名称和效果。 编辑代码单元格时,在输入名称的开头之后按 Tab 键,来显示补全该名称的方式列表。 例如,在`math`后按 Tab 键,来查看`math`模块中所有可用函数。 打字将缩小选项列表的范围。 为了了解函数的更多信息,请在它的名称之后放置一个`?`。 例如,输入`math.log`将显示`math`模块中`log`函数的描述。
351 |
352 | ```py
353 | math.log?
354 | log(x[, base])
355 |
356 | Return the logarithm of x to the given base.
357 | If the base not specified, returns the natural logarithm (base e) of x.
358 | ```
359 |
360 | 示例调用中的方括号表示参数是可选的。 也就是说,可以用一个或两个参数来调用`log`。
361 |
362 | ```py
363 | math.log(16, 2)
364 | 4.0
365 | math.log(16)/math.log(2)
366 | 4.0
367 | ```
368 |
369 | [Python 的内建函数](https://docs.python.org/3/library/functions.html)列表非常长,包含了许多在数据科学应用中不需要的函数。 [`math`模块中的数学函数](https://docs.python.org/3/library/math.html)列表同样很长。 本文将在上下文中介绍最重要的函数,而不是期望读者记住或理解这些列表。
370 |
371 | ### 示例
372 |
373 | 1869 年,一位名叫查尔斯·约瑟夫·米纳德(Charles Joseph Minard)的法国土木工程师,创造了一个图表,仍被认为是有史以来最伟大的图表之一。 它显示了拿破仑军队从莫斯科撤退期间的损失。 1812 年,拿破仑开始征服俄罗斯,他的军队中有超过 35 万人。 他们确实到达了莫斯科,但是沿路一直受到损失的困扰。 俄国军队不断撤退到俄罗斯深处,故意焚烧田野,并在撤退时摧毁村庄。 这使法国军队在俄罗斯冬季来临之时,没有食物或避难所。法国军队在莫斯科没有取得决定性的胜利就撤退了。 之后天气变冷,死了更多的人。 回来的人还不到一万。
374 |
375 | 
376 |
377 | Minard 的地图
378 |
379 | 这个图表绘制在东欧地图上。 它始于左端的波兰-俄罗斯边界。 浅棕色的条形表示拿破仑的军队正在向莫斯科进军,黑色的条形代表军队的撤退。 在图表的每个点上,军队的宽度与军队中士兵的数量成正比。在图表的底部,Minard 包括了回程的温度。
380 |
381 | 注意当军队撤退时,黑色条形变窄。 渡过贝尔齐纳河是个特别的灾难,你能在图表上看到吗?
382 |
383 | 由于其简单和有力,这个图标是出色的。 Minard 展示了六个变量:
384 |
385 | + 士兵的数量
386 | + 行军的方向
387 | + 位置的经纬度
388 | + 回程的温度
389 | + 十一月和十二月的具体日期的位置
390 |
391 | Tufte 说 Minard 的图是“可能是有史以来最好的统计图表”。
392 |
393 | 这里是 Minard 数据的一个子集,取自 Leland Wilkinson 的 The Grammar of Graphics。
394 |
395 | 
396 |
397 | Minard 的子集
398 |
399 | 每一行表示特定位置的军队状态。 列以度为单位展示经度和纬度,位置的名称,军队是前进还是撤退,以及估计的人数。
400 |
401 | 在这个表格中,连续两个地点之间的人数的最大变化是在莫斯科撤退的时候,也是最大的百分比变化。
402 |
403 | ```py
404 | moscou = 100000
405 | wixma = 55000
406 | wixma - moscou
407 | -45000
408 | (wixma - moscou)/moscou
409 | -0.45
410 | ```
411 |
412 | 在莫斯科的战斗中,人数下降了 45%。 换句话说,进入莫斯科的拿破仑的军队中,有几乎一半的人没有继续前进。
413 |
414 | 正如你在图表中看到的,Moiodexno 非常接近军队出发位置 Kowno。 在前进期间进入 Smolensk 的人中,只有不到 10% 的人在返回的途中到达了 Moiodexno。
415 |
416 | ```py
417 | smolensk_A = 145000
418 | moiodexno = 12000
419 | (moiodexno - smolensk_A)/smolensk_A
420 | -0.9172413793103448
421 | ```
422 |
423 | 是的,只要使用没有名称的数字就可以做这些计算。 但是这些名称使得阅读代码和解释结果变得更容易。
424 |
425 | 值得注意的是,更大的绝对变化并不总是对应更大的百分比变化。
426 |
427 | 在前进期间,从 Smolensk 到 Dorogobouge 的绝对损失是 5000 人,而撤退期间,从 Smolensk 到 Orscha 的相应损失是 4000 人。
428 |
429 | 然而,Smolensk 和 Orscha 之间的百分比变化要大得多,因为,在撤退期间,Smolensk 的人员总数要小得多。
430 |
431 | ```py
432 | dorogobouge = 140000
433 | smolensk_R = 24000
434 | orscha = 20000
435 | abs(dorogobouge - smolensk_A)
436 | 5000
437 | abs(dorogobouge - smolensk_A)/smolensk_A
438 | 0.034482758620689655
439 | abs(orscha - smolensk_R)
440 | 4000
441 | abs(orscha - smolensk_R)/smolensk_R
442 | 0.16666666666666666
443 | ```
444 |
--------------------------------------------------------------------------------
/4.md:
--------------------------------------------------------------------------------
1 | # 四、数据类型
2 |
3 | > 原文:[Data Types](https://github.com/data-8/textbook/tree/gh-pages/chapters/04)
4 |
5 | > 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
8 |
9 | > 自豪地采用[谷歌翻译](https://translate.google.cn/)
10 |
11 | 每个值都有一个类型,内建的`type`函数返回任何表达式的结果的类型:
12 |
13 | ```py
14 | type(3)
15 | int
16 | type(3/1)
17 | float
18 | ```
19 |
20 | 表达式的`type`是其最终值的类型。 所以,`type`函数永远不会表明,表达式的类型是一个名称,因为名称总是求值为它们被赋予的值。
21 |
22 | ```py
23 | x = 3
24 | type(x) # The type of x is an int, not a name
25 | int
26 | ```
27 |
28 | 我们已经遇到的另一种类型是内置函数。 Python 表明这个类型是一个`builtin_function_or_method`;函数和方法之间的区别在这个阶段并不重要。
29 |
30 | ```py
31 | type(abs)
32 | builtin_function_or_method
33 | ```
34 |
35 | 这一章会探索其他实用的数据类型。
36 |
37 | ## 字符串
38 |
39 | 世界上大部分的数据都是文本,计算机中表示的文本被称为字符串。 字符串可以代表一个单词,一个句子,甚至是图书馆中每本书的内容。 由于文本可以包含数字(如`5`)或布尔值(`True`),字符串也可以描述这些东西。
40 |
41 | 表达式的含义取决于其结构和正在组合的值的类型。 因此,例如,将两个字符串加在一起会产生另一个字符串。 这个表达式仍然是一个加法表达式,但是它组合了一个不同类型的值。
42 |
43 | ```py
44 | "data" + "science"
45 | 'datascience'
46 | ```
47 |
48 |
49 | 加法完全是字面的;它将这两个字符串组合在一起而不考虑其内容。 它不增加空间,因为这些是不同的词;它取决于程序员(你)来指定。
50 |
51 | ```py
52 | "data" + " " + "science"
53 | 'data science'
54 | ```
55 |
56 | 单引号和双引号都可以用来创建字符串:`'hi'`和`"hi"`是相同的表达式。 双引号通常是首选,因为它们允许在字符串中包含单引号。
57 |
58 | ```py
59 | "This won't work with a single-quoted string!"
60 | "This won't work with a single-quoted string!"
61 | ```
62 |
63 | 为什么不能? 试试看。
64 |
65 | `str`函数返回任何值的字符串表示形式。 使用此函数,可以构建具有嵌入值的字符串。
66 |
67 | ```py
68 | "That's " + str(1 + 1) + ' ' + str(True)
69 | "That's 2 True"
70 | ```
71 |
72 | ## 字符串方法
73 |
74 | 可以使用字符串方法,从现有的字符串中构造相关的字符串,这些方法是操作字符串的函数。 这些方法通过在字符串后面放置一个点,然后调用该函数来调用。
75 |
76 | 例如,以下方法生成一个字符串的大写版本。
77 |
78 | ```py
79 | "loud".upper()
80 | 'LOUD'
81 | ```
82 |
83 | 也许最重要的方法是`replace`,它替换字符串中的所有子字符串的实例。 `replace`方法有两个参数,即被替换的文本和替代值。
84 |
85 | ```py
86 | 'hitchhiker'.replace('hi', 'ma')
87 | 'matchmaker'
88 | ```
89 |
90 | 字符串方法也可以使用变量名称进行调用,只要这些名称绑定到字符串。 因此,例如,通过首先创建`"ingrain" `然后进行第二次替换,以下两个步骤的过程从`"train"`生成`"degrade"`一词。
91 |
92 | ```py
93 | s = "train"
94 | t = s.replace('t', 'ing')
95 | u = t.replace('in', 'de')
96 | u
97 | 'degrade'
98 | ```
99 |
100 |
101 | 注意`t = s.replace('t', 'ing')`的一行,不改变字符串`s`,它仍然是`"train"`。 方法调用`s.replace('t', 'ing')`只有一个值,即字符串`"ingrain"`。
102 |
103 | ```py
104 | s
105 | 'train'
106 | ```
107 |
108 |
109 | 这是我们第一次看到方法,但是方法并不是字符串仅有的。 我们将很快看到,其他类型的对象可以拥有它们。
110 |
111 | ## 比较
112 |
113 | 布尔值通常来自比较运算符。 Python 包含了各种比较值的运算符。 例如,`3 > 1 + 1`。
114 |
115 | ```py
116 | 3 > 1 + 1
117 | True
118 | ```
119 |
120 | 值`True`表明这个比较是有效的;Python 已经证实了`3`和`1 + 1`之间关系的这个简单的事实。下面列出了一整套通用的比较运算符。
121 |
122 |
123 | | 比较 | 运算符 | True 示例 | False 示例 |
124 | | --- | --- | --- | --- |
125 | | 小于 | `<` | `2 < 3` | `2 < 2` |
126 | | 大于 | `>` | `3 > 2` | `3 > 3` |
127 | | 小于等于 | `<=` | `2 <= 2` | `3 <= 2` |
128 | | 大于等于 | `>=` | `3 >= 3` | `2 >= 3` |
129 | | 等于 | `==` | `3 == 3` | `3 == 2` |
130 | | 不等于 | `!=` | `3 != 2` | `2 != 2` |
131 |
132 | 一个表达式可以包含多个比较,并且为了使整个表达式为真,它们都必须有效。 例如,我们可以用下面的表达式表示`1 + 1`在`1`和`3`之间。
133 |
134 | ```py
135 | 1 < 1 + 1 < 3
136 | True
137 | ```
138 |
139 | 两个数字的平均值总是在较小的数字和较大的数字之间。 我们用下面的数字`x`和`y`来表示这种关系。 你可以尝试不同的`x`和`y`值来确认这种关系。
140 |
141 | ```py
142 | x = 12
143 | y = 5
144 | min(x, y) <= (x+y)/2 <= max(x, y)
145 | True
146 | ```
147 |
148 | 字符串也可以比较,他们的顺序是字典序。 较短的字符串小于以较短的字符串开头的较长的字符串。
149 |
150 | ```py
151 | "Dog" > "Catastrophe" > "Cat"
152 | True
153 | ```
154 |
155 | ## 序列
156 |
157 | 值可以分组到集合中,这允许程序员组织这些值,并使用单个名称引用它们中的所有值。 通过将值分组在一起,我们可以编写代码,一次执行许多数据计算。
158 |
159 |
160 | 在几个值上调用`make_array`函数,将它们放到一个数组中,这是一种顺序集合。 下面,我们将四个不同的温度收集到一个名为`temps`的数组中。 这些分别是 1850 年,1900 年,1950 年和 2000 年的几十年间,地球上所有陆地的估计日平均绝对高温(摄氏度),表示为 1951 年至 1980 年间平均绝对高温的偏差,为 14.48 度。
161 |
162 | 集合允许我们使用单个名称,将多个值传递给一个函数。 例如,`sum`函数计算集合中所有值的和,`len`函数计算其长度。 (这是我们放入的值的数量。)一起使用它们,我们可以计算一个集合的平均值。
163 |
164 | ```py
165 | sum(highs)/len(highs)
166 | 14.434000000000001
167 | ```
168 |
169 | 日高温和低温的完整图表在下面。
170 |
171 | ### 日高温均值
172 |
173 | 
174 |
175 | ### 日低温均值
176 |
177 | 
178 |
179 | ## 数组
180 |
181 |
182 | Python 中有很多种类的集合,我们在这门课中主要使用数组。 我们已经看到,`make_array`函数可以用来创建数值的数组。
183 |
184 | 数组也可以包含字符串或其他类型的值,但是单个数组只能包含单一类型的数据。 (无论如何,把不相似的数据组合在一起,通常都没有意义)。例如:
185 |
186 | ```py
187 | english_parts_of_speech = make_array("noun", "pronoun", "verb", "adverb", "adjective", "conjunction", "preposition", "interjection")
188 | english_parts_of_speech
189 | array(['noun', 'pronoun', 'verb', 'adverb', 'adjective', 'conjunction',
190 | 'preposition', 'interjection'],
191 | dtype=' 译者注:
195 |
196 | > ```py
197 | > import numpy as np
198 | > make_array = lambda *args: np.asarray(args)
199 | > ```
200 |
201 | 返回到温度数据,我们创建 1850 年,1900 年,1950 年和 2000 年的几十年间,[日平均高温](http://berkeleyearth.lbl.gov/auto/Regional/TMAX/Text/global-land-TMAX-Trend.txt)的数组。
202 |
203 | ```py
204 | baseline_high = 14.48
205 | highs = make_array(baseline_high - 0.880,
206 | baseline_high - 0.093,
207 | baseline_high + 0.105,
208 | baseline_high + 0.684)
209 | highs
210 | array([ 13.6 , 14.387, 14.585, 15.164])
211 | ```
212 |
213 | 数组可以用在算术表达式中来计算其内容。 当数组与单个数组合时,该数与数组的每个元素组合。 因此,我们可以通过编写熟悉的转换公式,将所有这些温度转换成华氏温度。
214 |
215 | ```py
216 | (9/5) * highs + 32
217 | array([ 56.48 , 57.8966, 58.253 , 59.2952])
218 | ```
219 |
220 | 
221 |
222 | 数组也有方法,这些方法是操作数组值的函数。 数值集合的均值是其总和除以长度。 以下示例中的每对括号都是调用表达式的一部分;它调用一个无参函数来对数组`highs`进行计算。
223 |
224 | ```py
225 | highs.size
226 | 4
227 | highs.sum()
228 | 57.736000000000004
229 | highs.mean()
230 | 14.434000000000001
231 | ```
232 |
233 | ### 数组上的函数
234 |
235 | `numpy`包,在程序中缩写为`np`,为 Python 程序员提供了创建和操作数组的,方便而强大的函数。
236 |
237 | ```py
238 | import numpy as np
239 | ```
240 |
241 | 例如,`diff`函数计算数组中每两个相邻元素之间的差。 差数组的第一个元素是原数组的第二个元素减去第一个元素。
242 |
243 | ```py
244 | np.diff(highs)
245 | array([ 0.787, 0.198, 0.579])
246 | ```
247 |
248 | [完整的 Numpy 参考](http://docs.scipy.org/doc/numpy/reference/)详细列出了这些功能,但一个小的子集通常用于数据处理应用。 它们分组到了`np`中不同的包中。 学习这些词汇是学习 Python 语言的重要组成部分,因此在你处理示例和问题时,请经常回顾这个列表。
249 |
250 | 但是,你不需要记住这些,只需要将它用作参考。
251 |
252 | 每个这些函数接受数组作为参数,并返回单个值。
253 |
254 |
255 | | 函数 | 描述 |
256 | | --- | --- |
257 | | `np.prod` | 将所有元素相乘 |
258 | | `np.sum` | 将所有元素相加 |
259 | | `np.all` | 测试是否所有元素是真值 (非零数值是真值) |
260 | | `np.any` | 测试是否任意元素是真值(非零数值是真值) |
261 | | `np.count_nonzero` | 计算非零元素的数量 |
262 |
263 | 每个这些函数接受字符串数组作为参数,并返回数组。
264 |
265 |
266 | | 函数 | 描述 |
267 | | --- | --- |
268 | | `np.char.lower` | 将每个元素变成小写 |
269 | | `np.char.upper` | 将每个元素变成大写 |
270 | | `np.char.strip` | 移除每个元素开头或末尾的空格 |
271 | | `np.char.isalpha` | 每个元素是否只含有字母(没有数字或者符号) |
272 | | `np.char.isnumeric` | 每个元素是否只含有数字(没有字母) |
273 |
274 | 每个这些函数接受字符串数组和一个搜索字符串。
275 |
276 |
277 | | 函数 | 描述 |
278 | | --- | --- |
279 | | np.char.count | 在数组的元素中,计算搜索字符串的出现次数 |
280 | | np.char.find | 在每个元素中,搜索字符串的首次出现位置 |
281 | | np.char.rfind | 在每个元素中,搜索字符串的最后一次出现位置 |
282 | | np.char.startswith | 每个字符串是否以搜索字符串起始 |
283 |
284 | ## 范围
285 |
286 | 范围是一个数组,按照递增或递减的顺序排列,每个元素按照一定的间隔分开。 范围在很多情况下非常有用,所以值得了解它们。
287 |
288 | 范围使用`np.arange`函数来定义,该函数接受一个,两个或三个参数:起始值,终止值和“步长”。
289 |
290 | 如果将一个参数传递给`np.arange`,那么它将成为终止值,其中`start = 0`,`step = 1`。 两个参数提供了起始值和终止值,`step = 1`。 三个参数明确地提供了起始值,终止值和步长。
291 |
292 | 范围始终包含其`start`值,但不包括其`end`值。 它按照`step`计数,并在到达`end`之前停止。
293 |
294 | ```py
295 | np.arange(end): An array starting with 0 of increasing consecutive integers, stopping before end.
296 | np.arange(5)
297 | array([0, 1, 2, 3, 4])
298 | ```
299 |
300 | 要注意,数值从`0`起始,并仅仅增加到`4`,并不是`5`。
301 |
302 | ```py
303 | np.arange(start, end): An array of consecutive increasing integers from start, stopping before end.
304 | np.arange(3, 9)
305 | array([3, 4, 5, 6, 7, 8])
306 | np.arange(start, end, step): A range with a difference of step between each pair of consecutive values, starting from start and stopping before end.
307 | np.arange(3, 30, 5)
308 | array([ 3, 8, 13, 18, 23, 28])
309 | ```
310 |
311 | 这个数组从`3`起始,增加了步长`5`变成`8`,然后增加步长`5`变成`13`,以此类推。
312 |
313 | 当你指定步长时,起始值、终止值和步长可正可负,可以是整数也可以是分数。
314 |
315 | ```py
316 | np.arange(1.5, -2, -0.5)
317 | array([ 1.5, 1. , 0.5, 0. , -0.5, -1. , -1.5])
318 | ```
319 |
320 | ### 示例:莱布尼茨的 π 公式
321 |
322 | 伟大的德国数学家和哲学家戈特弗里德·威廉·莱布尼茨(Gottfried Wilhelm Leibniz,1646 ~ 1716年)发现了一个简单分数的无穷和。 公式是:
323 |
324 | 
325 |
326 | 虽然需要一些数学来确定它,但我们可以用数组来说服我们自己,公式是有效的。 让我们计算莱布尼茨的无穷和的前 5000 个项,看它是否接近 π。
327 |
328 | 我们将计算这个有限的总和,首先加上所有的正项,然后减去所有负项的和 [1]:
329 |
330 | 
331 |
332 | > [1] 令人惊讶的是,当我们将无限多个分数相加时,顺序可能很重要。但是我们对 π 的近似只使用了大量的数量有限的分数,所以可以按照任何方便的顺序,将这些项相加。
333 |
334 | 和中的正项的分母是`1, 5, 9`,以此类推。数组`by_four_to_20`包含`17`之前的这些数。
335 |
336 | ```py
337 | by_four_to_20 = np.arange(1, 20, 4)
338 | by_four_to_20
339 | array([ 1, 5, 9, 13, 17])
340 | ```
341 |
342 | 为了获得 π 的准确近似,我们使用更长的数组`positive_term_denominators`。
343 |
344 | ```py
345 | positive_term_denominators = np.arange(1, 10000, 4)
346 | positive_term_denominators
347 | array([ 1, 5, 9, ..., 9989, 9993, 9997])
348 | ```
349 |
350 | 我们实际打算加起来的正项,就是一除以这些分母。
351 |
352 | ```py
353 | positive_terms = 1 / positive_term_denominators
354 | ```
355 |
356 | 负向的分母是`3, 7, 11`,以此类推。这个数组就是`positive_term_denominators`加二。
357 |
358 | ```py
359 | negative_terms = 1 / (positive_term_denominators + 2)
360 | ```
361 |
362 | 整体的和是:
363 |
364 | ```py
365 | 4 * ( sum(positive_terms) - sum(negative_terms) )
366 | 3.1413926535917955
367 | ```
368 |
369 | 这非常接近于`π = 3.14159...`。莱布尼茨公式看起来不错。
370 |
--------------------------------------------------------------------------------
/6.md:
--------------------------------------------------------------------------------
1 | # 六、可视化
2 |
3 | > 原文:[Visualization](https://github.com/data-8/textbook/tree/gh-pages/chapters/06)
4 |
5 | > 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
8 |
9 | > 自豪地采用[谷歌翻译](https://translate.google.cn/)
10 |
11 | 表格是一种组织和可视化数据的强大方式。然而,无论数据如何组织,数字的大型表格可能难以解释。 有时解释图片比数字容易得多。
12 |
13 | 在本章中,我们将开发一些数据分析的基本图形方法。 我们的数据源是[互联网电影数据库](http://www.imdb.com/)(IMDB),这是一个在线数据库,包含电影,电视节目,和视频游戏等信息。[Box Office Mojo](http://www.boxofficemojo.com/) 网站提供了许多 IMDB 数据摘要,我们已经采用了其中一些。 我们也使用了 [The Numbers](http://www.the-numbers.com/) 的数据摘要,这个网站的口号是“数据和电影业务的相遇之处”。
14 |
15 | ## 散点图和线形图
16 |
17 |
18 | `actors`表包含好莱坞的男性和女性演员的数据。 其中的列是:
19 |
20 | | 列 | 内容 |
21 | | --- | --- |
22 | | Actor | 演员名称 |
23 | | Total Gross | 演员所有电影的国内票房总收入(百万美元) |
24 | | Number of Movies | 演员所演的电影数量 |
25 | | Average per Movie | 总收入除以电影数量 |
26 | | #1 Movie | 演员所演的票房最高的电影 |
27 | | Gross | 演员的 #1 电影的国内票房总收入(百万美元) |
28 |
29 | 在总票房的计算中,数据的制表人没有包括一些电影,其中演员是客串角色或陈述角色,没有太多的登场时间。
30 |
31 | 这个表格有 50 行,对应着 50 个最顶级的演员。 这个表已经按照`Total Gross`排序了,所以很容易看出,`Harrison Ford`是最棒的演员。 总的来说,他的电影的国内票房收入比其他演员的电影多。
32 |
33 | ```py
34 | actors = Table.read_table('actors.csv')
35 | actors
36 | ```
37 |
38 | | Actor | Total Gross | Number of Movies | Average per Movie | #1 Movie | Gross |
39 | | --- | --- | --- | --- | --- | --- |
40 | | Harrison Ford | 4871.7 | 41 | 118.8 | Star Wars: The Force Awakens | 936.7 |
41 | | Samuel L. Jackson | 4772.8 | 69 | 69.2 | The Avengers | 623.4 |
42 | | Morgan Freeman | 4468.3 | 61 | 73.3 | The Dark Knight | 534.9 |
43 | | Tom Hanks | 4340.8 | 44 | 98.7 | Toy Story 3 | 415 |
44 | | Robert Downey, Jr. | 3947.3 | 53 | 74.5 | The Avengers | 623.4 |
45 | | Eddie Murphy | 3810.4 | 38 | 100.3 | Shrek 2 | 441.2 |
46 | | Tom Cruise | 3587.2 | 36 | 99.6 | War of the Worlds | 234.3 |
47 | | Johnny Depp | 3368.6 | 45 | 74.9 | Dead Man's Chest | 423.3 |
48 | | Michael Caine | 3351.5 | 58 | 57.8 | The Dark Knight | 534.9 |
49 | | Scarlett Johansson | 3341.2 | 37 | 90.3 | The Avengers | 623.4 |
50 |
51 | (已省略 40 行)
52 |
53 | 术语。变量是我们称之为“特征”的东西的正式名称,比如`'number of movies'`。 术语“变量”强调了,对于不同的个体,这个特征可以有不同的值 - 演员所演电影的数量因人而异。
54 |
55 | 拥有数值的变量(如`'number of movies'`或`'average gross receipts per movie'`)的变量称为定量或数值变量。
56 |
57 | ### 散点图
58 |
59 | 散点图展示两个数值变量之间的关系。 在前面的章节中,我们看到了一个散点图的例子,我们看了两个经典小说的时间段和角色数量。
60 |
61 | `Table`的`scatter`方法绘制一个散点图,由表格的每一行组成。它的第一个参数是要在横轴上绘制的列标签,第二个参数是纵轴上的列标签。
62 |
63 | ```py
64 | actors.scatter('Number of Movies', 'Total Gross')
65 | ```
66 |
67 | 
68 |
69 | 散点图包含 50 个点,表中的每个演员为一个。 一般来说,你可以看到它向上倾斜。 一个演员的电影越多,所有这些电影的总收入就越多。
70 |
71 | 在形式上,我们说图表显示了变量之间的关联,并且关联是正的:一个变量的高值往往与另一个变量的高值相关联,而低值也是一样,通常情况下。
72 |
73 | 当然有一些变化。 一些演员有很多电影,但总收入中等。 其他人电影数量中等,但收入很高。正相关只是一个大体趋势的叙述。
74 |
75 | 在课程后面,我们将学习如何量化关联。目前,我们只是定性地思考。
76 |
77 | 现在我们已经探索了电影的数量与总收入的关系,让我们把注意力转向它与每部电影的平均收入的关系。
78 |
79 | ```py
80 | actors.scatter('Number of Movies', 'Average per Movie')
81 | ```
82 |
83 | 
84 |
85 | 这是一个截然不同的情况,并表现出负相关。 一般来说,演员的电影数量越多,每部电影的平均收入就越少。
86 |
87 | 另外,有一个点是非常高的,在绘图的左边。 它对应于一个电影数量很少,每部电影平均值很高的演员。 这个点是异常的。 它位于数据的一般范围之外。 事实上,这与绘图中的其他所有点相差甚远。
88 |
89 | 我们将通过查看绘图的左右两端的点,来进一步检查负相关。
90 |
91 | 对于右端,我们通过查看没有异常值的部分来放大图的主体。
92 |
93 | ```py
94 | no_outlier = actors.where('Number of Movies', are.above(10))
95 | no_outlier.scatter('Number of Movies', 'Average per Movie')
96 | ```
97 |
98 | 
99 |
100 | 负相关仍然清晰可见。 让我们找出一些演员,对应位于绘图右侧的点,这里电影数量较多:
101 |
102 | ```py
103 | actors.where('Number of Movies', are.above(60))
104 | ```
105 |
106 | | Actor | Total Gross | Number of Movies | Average per Movie | #1 Movie | Gross |
107 | | --- | --- | --- | --- | --- | --- |
108 | | Samuel L. Jackson | 4772.8 | 69 | 69.2 | The Avengers | 623.4 |
109 | | Morgan Freeman | 4468.3 | 61 | 73.3 | The Dark Knight | 534.9 |
110 | | Robert DeNiro | 3081.3 | 79 | 39 | Meet the Fockers | 279.3 |
111 | | Liam Neeson | 2942.7 | 63 | 46.7 | The Phantom Menace | 474.5 |
112 |
113 | 伟大的演员罗伯特·德尼罗(Robert DeNiro)拥有最高的电影数量和最低的每部电影的平均收入。 其他优秀的演员在不远处的点,但德尼罗在极远处。
114 |
115 | 为了理解负相关,请注意,演员所演的电影越多,在风格,流派和票房方片,这些电影变化就越大。 例如,一个演员可能会出现在一些高收入的动作电影或喜剧中(如 Meet Fockers),也可能是优秀但不会吸引大量人群的小众电影。 因此,演员的每部电影的平均收入值可能相对较低。
116 |
117 | 为了从不同的角度来看待这个观点,现在让我们来看看这个异常点。
118 |
119 | ```py
120 | actors.where('Number of Movies', are.below(10))
121 | ```
122 |
123 | | Actor | Total Gross | Number of Movies | Average per Movie | #1 Movie | Gross |
124 | | --- | --- | --- | --- | --- | --- |
125 | | Anthony Daniels | 3162.9 | 7 | 451.8 | Star Wars: The Force Awakens | 936.7 |
126 |
127 | 作为一名演员,安东尼·丹尼尔斯(Anthony Daniels)可能没有罗伯特·德尼罗(Robert DeNiro)的身材。 但是他的 7 部电影的平均收入却高达每部电影近 4.52 亿美元。
128 |
129 | 这些电影是什么? 你可能知道《星球大战:C-3PO》中的 Droid C-3PO,那是金属机甲里面的安东尼·丹尼尔斯。 他扮演 C-3PO。
130 |
131 | 
132 |
133 | 丹尼尔斯先生的全部电影(除了客串)都是由高收入的“星球大战”系列电影组成的。 这就解释了他的高平均收入和低电影数量。
134 |
135 | 类型和制作预算等变量,会影响电影数量与每部电影的平均收入之间的关联。 这个例子提醒人们,研究两个变量之间的关联,往往也涉及到了解其他相关的变量。
136 |
137 | ## 线形图
138 |
139 |
140 | 线形图是最常见的可视化图形之一,通常用于研究时序型的趋势和模式。
141 |
142 |
143 | `movies_by_year`表包含了 1980 年到 2015 年间,美国电影公司制作的电影的数据。这些列是:
144 |
145 | | 列 | 内容 |
146 | | --- | --- |
147 | | Year | 年份 |
148 | | Total Gross | 所有发行电影的国内总票房收入(以百万美元为单位) |
149 | | Number of Movies | 发行的电影数量 |
150 | | #1 Movie | 收入最高的电影 |
151 |
152 | ```py
153 | movies_by_year = Table.read_table('movies_by_year.csv')
154 | movies_by_year
155 | ```
156 |
157 |
158 | | Year | Total Gross | Number of Movies | #1 Movie |
159 | | --- | --- | --- | --- |
160 | | 2015 | 11128.5 | 702 | Star Wars: The Force Awakens |
161 | | 2014 | 10360.8 | 702 | American Sniper |
162 | | 2013 | 10923.6 | 688 | Catching Fire |
163 | | 2012 | 10837.4 | 667 | The Avengers |
164 | | 2011 | 10174.3 | 602 | Harry Potter / Deathly Hallows (P2) |
165 | | 2010 | 10565.6 | 536 | Toy Story 3 |
166 | | 2009 | 10595.5 | 521 | Avatar |
167 | | 2008 | 9630.7 | 608 | The Dark Knight |
168 | | 2007 | 9663.8 | 631 | Spider-Man 3 |
169 | | 2006 | 9209.5 | 608 | Dead Man's Chest |
170 |
171 | (省略了 26 行)
172 |
173 | `Table`的`plot`方法产生线形图。 它的两个参数与散点图相同:首先是横轴上的列,然后是纵轴上的列。 这是 1980 年到 2015 年间每年发行的电影数量的线形图。
174 |
175 | ```py
176 | movies_by_year.plot('Year', 'Number of Movies')
177 | ```
178 |
179 | 
180 |
181 | 虽然每年的数字都有明显的变化,但图形急剧上升,然后呈现平缓的上升趋势。 20 世纪 80 年代早期的剧增,部分是由于在上世纪 70 年代,电影制作人推动电影业的几年后,电影制片厂重新回到电影制作的前沿。
182 |
183 | 我们的重点将放在最近几年。 根据电影的主题,对应 2000 年到 2015 年的行,分配给名称`century_21`。
184 |
185 | ```py
186 | century_21 = movies_by_year.where('Year', are.above(1999))
187 | century_21.plot('Year', 'Number of Movies')
188 | ```
189 |
190 | 
191 |
192 | 2008 年的全球金融危机有明显的效果 - 2009 年发行的电影数量急剧下降。
193 |
194 | 但是,美元数量并没有太大的变化。
195 |
196 | ```py
197 | century_21.plot('Year', 'Total Gross')
198 | ```
199 |
200 | 
201 |
202 | 尽管发生了金融危机,电影发行的数量也少得多,但 2009 年的国内总收入仍高于 2008 年。
203 |
204 | 造成这种矛盾的一个原因是,人们在经济衰退时往往会去看电影。 “经济低迷时期,美国人涌向电影”,“纽约时报”于 2009 年 2 月说。文章引用南加州大学的马丁·卡普兰(Martin Kaplan)的话说:“人们想要忘记自己的烦恼,想和别人在一起。” 当节假日和昂贵的款待难以负担,电影提供了受欢迎的娱乐和宽慰。
205 |
206 | 2009 年的高票房收入的另一个原因是,电影《阿凡达》及其 3D 版本。 阿凡达不仅是 2009 年的第一部电影,它也是有史以来第二高的总票房电影,我们将在后面看到。
207 |
208 | ```py
209 | century_21.where('Year', are.equal_to(2009))
210 | ```
211 |
212 | | Year | Total Gross | Number of Movies | #1 Movie |
213 | | --- | --- | --- | --- |
214 | | 2009 | 10595.5 | 521 | Avatar |
215 |
216 | ## 类别分许
217 |
218 | ### 可视化类别分布
219 |
220 | 许多数据不以数字的形式出现。 数据可以是音乐片段,或地图上的地方。 他们也可以是类别,你可以在里面放置个体。 以下是一些类别变量的例子。
221 |
222 | + 个体是冰淇淋纸盒,变量就是纸盒里的味道。
223 | + 个体是职业篮球运动员,变量是球员的队伍。
224 | + 个体是年,而变量是今年最高票房电影的流派。
225 | + 个体是调查对象,变量是他们从“完全不满意”,“有点满意”和“非常满意”中选择的回答。
226 |
227 | `icecream `表包含 30 盒冰激凌的数据。
228 |
229 | ```py
230 | icecream = Table().with_columns(
231 | 'Flavor', make_array('Chocolate', 'Strawberry', 'Vanilla'),
232 | 'Number of Cartons', make_array(16, 5, 9)
233 | )
234 | icecream
235 | ```
236 |
237 |
238 | | Flavor | Number of Cartons |
239 | | --- | --- |
240 | | Chocolate | 16 |
241 | | Strawberry | 5 |
242 | | Vanilla | 9 |
243 |
244 | 分类变量“口味”的值是巧克力,草莓和香草。 表格显示了每种口味的纸盒数量。 我们称之为分布表。 分布显示了所有变量的值,以及每个变量的频率。
245 |
246 | ### 条形图
247 |
248 | 条形图是可视化类别分布的熟悉方式。 它为每个类别显示一个条形。 条形的间隔相等,宽度相同。 每个条形的长度与相应类别的频率成正比。
249 |
250 | 我们使用横条绘制条形图,因为这样更容易标注条形图。 所以`Table`的方法称为`barh`。 它有两个参数:第一个是类别的列标签,第二个是频率的列标签。
251 |
252 | ```py
253 | icecream.barh('Flavor', 'Number of Cartons')
254 | ```
255 |
256 | 
257 |
258 | 如果表格只包含一列类别和一列频率(如冰淇淋),则方法调用甚至更简单。 你可以指定包含类别的列,`barh`将使用另一列中的值作为频率。
259 |
260 | ```py
261 | icecream.barh('Flavor')
262 | ```
263 |
264 | 
265 |
266 | ### 类别分布的特征
267 |
268 | 除了纯粹的视觉差异之外,条形图和我们在前面章节中看到的两个图表之间还有一个重要的区别。 它们是散点图和线图,两者都显示两个数值变量 - 两个轴上的变量都是数值型的。 相比之下,条形图的一个轴上是类别,在另一个轴上具有数值型频率。
269 |
270 | 这对图表有影响。首先,每个条形的宽度和相邻条形之间的间隔完全取决于生成图的人,或者用于生成该图的程序。 Python 为我们做了这些选择。 如果你要手动绘制条形图,则可以做出完全不同的选择,并且仍然会是完全正确的条形图,前提是你使用相同宽度绘制了所有条形,并使所有间隔保持相同。
271 |
272 | 最重要的是,条形可以以任何顺序绘制。 “巧克力”,“香草”和“草莓”这些类别没有普遍的等级顺序,不像数字`5, 7`和`10`。
273 |
274 | 这意味着我们可以绘制一个易于解释的条形图,方法是按降序重新排列条形图。 为了实现它,我们首先按照`Number of Cartons`的降序,重新排列`icecream `的行,然后绘制条形图。
275 |
276 | ```py
277 | icecream.sort('Number of Cartons', descending=True).barh('Flavor')
278 | ```
279 |
280 | 
281 |
282 | 这个条形图包含的信息和以前的完全一样,但是它更容易阅读。 虽然在只读三个条形的情况下,这并不是一个巨大的收益,但是当分类数量很大时,这可能是相当重要的。
283 |
284 | ## 组合分类数据
285 |
286 | 为了构造`icecream`表,有人不得不查看 30 个冰淇淋盒子,并计算每种口味的数量。 但是,如果我们的数据还没有包含频率,我们必须在绘制条形图之前计算频率。 这是一个例子,其中它是必要的。
287 |
288 | `top`表由美国历史上最畅销的电影组成。 第一列包含电影的标题;《星球大战:原力觉醒》(Star Wars: The Force Awakens)排名第一,美国票房总额超过 9 亿美元。 第二列包含制作电影的工作室的名称。 第三列包含国内票房收入(美元),第四列包含按 2016 年价格计算的,票面总收入。 第五列包含电影的发行年份。
289 |
290 | 列表中有 200 部电影。 根据未调整的总收入,这是前十名。
291 |
292 | ```py
293 | top = Table.read_table('top_movies.csv')
294 | top
295 | ```
296 |
297 | | Title | Studio | Gross | Gross (Adjusted) | Year |
298 | | --- | --- | --- | --- | --- |
299 | | Star Wars: The Force Awakens | Buena Vista (Disney) | 906723418 | 906723400 | 2015 |
300 | | Avatar | Fox | 760507625 | 846120800 | 2009 |
301 | | Titanic | Paramount | 658672302 | 1178627900 | 1997 |
302 | | Jurassic World | Universal | 652270625 | 687728000 | 2015 |
303 | | Marvel's The Avengers | Buena Vista (Disney) | 623357910 | 668866600 | 2012 |
304 | | The Dark Knight | Warner Bros. | 534858444 | 647761600 | 2008 |
305 | | Star Wars: Episode I - The Phantom Menace | Fox | 474544677 | 785715000 | 1999 |
306 | | Star Wars | Fox | 460998007 | 1549640500 | 1977 |
307 | | Avengers: Age of Ultron | Buena Vista (Disney) | 459005868 | 465684200 | 2015 |
308 | | The Dark Knight Rises | Warner Bros. | 448139099 | 500961700 | 2012 |
309 |
310 | (省略了 190 行)
311 |
312 | 迪斯尼的子公司布埃纳维斯塔(Buena Vista)就像福克斯(Fox)和华纳兄弟(Warner Brothers)一样,经常出现在前十名中 如果我们从 200 行中看,哪个工作室最常出现?
313 |
314 | 为了解决这个问题,首先要注意的是,我们需要的只是一个拥有电影和工作室的表格;其他信息是不必要的。
315 |
316 | ```py
317 | movies_and_studios = top.select('Title', 'Studio')
318 | ```
319 |
320 | `Table`的`group`方法组允许我们,通过将每个工作室当做一个类别,并将每一行分配给一个类别,来计算每个工作室出现在表中的频率。 `group`方法将包含类别的列标签作为其参数,并返回每个类别中行数量的表格。 数量列始终称为`count`,但如果你希望的话,则可以使用`relabeled`更改该列。
321 |
322 | ```py
323 | movies_and_studios.group('Studio')
324 | ```
325 |
326 | | Studio | count |
327 | | --- | --- |
328 | | AVCO | 1 |
329 | | Buena Vista (Disney) | 29 |
330 | | Columbia | 10 |
331 | | Disney | 11 |
332 | | Dreamworks | 3 |
333 | | Fox | 26 |
334 | | IFC | 1 |
335 | | Lionsgate | 3 |
336 | | MGM | 7 |
337 | | MPC | 1 |
338 |
339 |
340 | (省略了 14 行)
341 |
342 | 因此,`group`创建一个分布表,显示电影在类别(工作室)之间如何分布。
343 |
344 | 现在我们可以使用这个表格,以及我们上面获得的图形技能来绘制条形图,显示前 200 个最高收入的电影中,哪个工作室是最常见的。
345 |
346 | ```py
347 | studio_distribution = movies_and_studios.group('Studio')
348 | studio_distribution.sort('count', descending=True).barh('Studio')
349 | ```
350 |
351 | 
352 |
353 | 华纳兄弟(Warner Brothers)和布埃纳维斯塔(Buena Vista)是前 200 电影中最常见的工作室。 华纳兄弟制作了哈利波特电影,布埃纳维斯塔制作了星球大战。
354 |
355 | 由于总收入以未经调整的美元来衡量,所以最近几年的顶级电影比过去几十年更频繁,这并不令人惊讶。 以绝对数量来看,现在的电影票价比以前更高,因此总收入也更高。 这是通过条形图证明的,这些条形图显示了 200 部电影的发行年份。
356 |
357 | ```py
358 | movies_and_years = top.select('Title', 'Year')
359 | movies_and_years.group('Year').sort('count', descending=True).barh('Year')
360 | ```
361 |
362 | 
363 |
364 | 所有最长的条形都对应 2000 年以后的年份。这与我们的观察一致,即最近几年应该是最频繁的。
365 |
366 | ### 面向数值变量
367 |
368 | 这张图有一些未解决的地方。 虽然它确实回答了这个问题,200 部最受欢迎的电影中,最常见的发行年份,但并没有按时间顺序列出所有年份。 它将年作为一个分类变量。
369 |
370 | 但是,年份是固定的时序单位,确实拥有顺序。 他们也有相对于彼此的固定的数值距离。 让我们看看当我们试图考虑它的时候会发生什么。
371 |
372 | 默认情况下,`barh`将类别(年)从最低到最高排序。 所以我们将运行这个代码,但不按`count`进行排序。
373 |
374 | ```py
375 | movies_and_years.group('Year').barh('Year')
376 | ```
377 |
378 | 
379 |
380 | 现在年份是升序了。 但是这个条形图还是有点问题。 1921 年和 1937 年的条形与 1937 年和 1939 年的条形相距甚远。条形图并没有显示出,200 部电影中没有一部是在 1922 年到 1936 年间发布的。基于这种可视化,这种不一致和遗漏,使早期年份的分布难以理解。
381 |
382 | 条形图用做类别变量的可视化。 当变量是数值,并且我们创建可视化时,必须考虑其值之间的数值关系。 这是下一节的主题。
383 |
384 | ## 数值分布
385 |
386 | ### 可视化数值分布
387 |
388 | 数据科学家研究的许多变量是定量的或数值的。它们的值是你可以做算术的数字。我们所看到的例子包括一本书的章节数量,电影的收入以及美国人的年龄。
389 |
390 | 类别变量的值可以按照数字编码,但是这不会使变量成为定量的。在我们研究的,按年龄组分类的人口普查数据的例子中,分类变量`SEX`中,`'Male'`的数字代码为`1`,`'Female'`的数字代码为`2`,以及分组`1`和`2`的合计为`0`。 `1`和`2`是数字,在这种情况下,从`2`中减`1`或取`0,1`和`2`的平均值,或对这三个值执行其他算术是没有意义的。 `SEX`是一个类别变量,即使这些值已经赋予一个数字代码。
391 |
392 | 对于我们的主要示例,我们将返回到我们在可视化分类数据时,所研究的数据集。这是一个表格,它由美国历史上最畅销的电影中的数据组成。为了方便起见,这里再次描述表格。
393 |
394 | 第一列包含电影的标题。第二列包含制作电影的工作室的名称。第三个包含国内票房总值(美元),第四个包含按 2016 年价格计算的票面收入总额。第五个包含电影的发行年份。
395 |
396 | 列表中有 200 部电影。根据`Gross`列中未调整的总收入,这是前十名。
397 |
398 | ```py
399 | top = Table.read_table('top_movies.csv')
400 | # Make the numbers in the Gross and Gross (Adjusted) columns look nicer:
401 | top.set_format([2, 3], NumberFormatter)
402 | ```
403 |
404 | | Title | Studio | Gross | Gross (Adjusted) | Year |
405 | | --- | --- | --- | --- | --- |
406 | | Star Wars: The Force Awakens | Buena Vista (Disney) | 906,723,418 | 906,723,400 | 2015 |
407 | | Avatar | Fox | 760,507,625 | 846,120,800 | 2009 |
408 | | Titanic | Paramount | 658,672,302 | 1,178,627,900 | 1997 |
409 | | Jurassic World | Universal | 652,270,625 | 687,728,000 | 2015 |
410 | | Marvel's The Avengers | Buena Vista (Disney) | 623,357,910 | 668,866,600 | 2012 |
411 | | The Dark Knight | Warner Bros. | 534,858,444 | 647,761,600 | 2008 |
412 | | Star Wars: Episode I - The Phantom Menace | Fox | 474,544,677 | 785,715,000 | 1999 |
413 | | Star Wars | Fox | 460,998,007 | 1,549,640,500 | 1977 |
414 | | Avengers: Age of Ultron | Buena Vista (Disney) | 459,005,868 | 465,684,200 | 2015 |
415 | | The Dark Knight Rises | Warner Bros. | 448,139,099 | 500,961,700 | 2012 |
416 |
417 | (省略了 190 行)
418 |
419 | ### 可视化调整后收入的分布
420 |
421 | 在本节中,我们将绘制`Gross (Adjusted)`列中数值变量的分布图。 为了简单起见,我们创建一个包含我们所需信息的小表。 而且由于三位数字比九位数字更容易处理,我们以百万美元衡量调整后的总收入。 注意如何使用舍入仅保留两位小数。
422 |
423 | ```py
424 | millions = top.select(0).with_column('Adjusted Gross',
425 | np.round(top.column(3)/1e6, 2))
426 | millions
427 | ```
428 |
429 | | Title | Adjusted Gross |
430 | | --- | --- |
431 | | Star Wars: The Force Awakens | 906.72 |
432 | | Avatar | 846.12 |
433 | | Titanic | 1178.63 |
434 | | Jurassic World | 687.73 |
435 | | Marvel's The Avengers | 668.87 |
436 | | The Dark Knight | 647.76 |
437 | | Star Wars: Episode I - The Phantom Menace | 785.72 |
438 | | Star Wars | 1549.64 |
439 | | Avengers: Age of Ultron | 465.68 |
440 | | The Dark Knight Rises | 500.96 |
441 |
442 | ### 直方图
443 |
444 | 数值数据集的直方图看起来非常像条形图,虽然它有一些重要的差异,我们将在本节中讨论。 首先,我们只画出调整后收入的直方图。
445 |
446 | hist方法生成列中值的直方图。 可选的单位参数用于两个轴上的标签。 直方图显示调整后的总额分布,以百万美元为单位。
447 |
448 | ```py
449 | millions.hist('Adjusted Gross', unit="Million Dollars")
450 | ```
451 |
452 | 
453 |
454 | ### 横轴
455 |
456 | 这些金额已被分组为连续的间隔,称为桶。尽管在这个数据集中,没有电影正好在两个桶之间的边缘上,但是`hist`必须考虑数值可能在边缘的情况。所以`hist`有一个端点约定:`bin`包含左端点的数据,但不包含右端点的数据。
457 |
458 | 我们使用符号`[a, b)`表示从`a`开始并在`b`结束但不包括`b`的桶。
459 |
460 | 有时,必须在第一个或最后一个箱中进行调整,以确保包含变量的最小值和最大值。在前面研究的人口普查数据中,你看到了一个这样的调整的例子,其中“100”岁的年龄实际上意味着“100 岁以上”。
461 |
462 | 我们可以看到,有 10 个桶(有些桶很低,难以看到),而且它们的宽度都是一样的。我们也可以看到,没有一部电影的收入不到三亿美元,那是因为我们只考虑有史以来最畅销的电影。
463 |
464 | 准确看到桶的末端在哪里,有点困难。例如,精确地确定值 500 位于横轴上的位置并不容易。所以很难判断一个条形的结束位置和下一个条形的开始位置。
465 |
466 | 可选参数`bins`可以与`hist`一起使用来指定桶的端点。它必须由一系列数字组成,这些数字以第一个桶的左端开始,以最后一个桶的右端结束。我们首先将桶中的数字设置为`300,400,500`等等,以`2000`结尾。
467 |
468 | ```py
469 | millions.hist('Adjusted Gross', bins=np.arange(300,2001,100), unit="Million Dollars")
470 | ```
471 |
472 | 
473 |
474 | 这个图的横轴比较容易阅读。 标签`200,400,600`等以对应的值为中心。 最高的条形是对应三亿到四亿美元之间的电影。
475 |
476 | 少数电影投入了 8 亿美元甚至更多。 这导致这个数字“向右倾斜”,或者更不正式地说,“右侧长尾”。 大量人口的收入或租金等变量的分布也经常具有这种形式。
477 |
478 | ### 桶的数量
479 |
480 | 可以使用`bin`方法从一个表格中计算出桶中的值的数量,该方法接受列标签或索引,以及可选的序列或桶的数量。 结果是直方图的表格形式。 第一列列出了桶的左端点(但请参阅下面关于最终值的注释)。 第二列包含`Adjusted Gross`列中所有值在相应桶中的数量。 也就是说,它计数所有`Adjusted Gross`的所有值,它们大于或等于`bin`中的值,但小于下一个`bin`中的值。
481 |
482 | ```py
483 | bin_counts = millions.bin('Adjusted Gross', bins=np.arange(300,2001,100))
484 | bin_counts.show()
485 | ```
486 |
487 | | bin | Adjusted Gross count |
488 | | --- | --- |
489 | | 300 | 81 |
490 | | 400 | 52 |
491 | | 500 | 28 |
492 | | 600 | 16 |
493 | | 700 | 7 |
494 | | 800 | 5 |
495 | | 900 | 3 |
496 | | 1000 | 1 |
497 | | 1100 | 3 |
498 | | 1200 | 2 |
499 | | 1300 | 0 |
500 | | 1400 | 0 |
501 | | 1500 | 1 |
502 | | 1600 | 0 |
503 | | 1700 | 1 |
504 | | 1800 | 0 |
505 | | 1900 | 0 |
506 | | 2000 | 0 |
507 |
508 | 注意最后一行的`bin`值 2000。 这不是任何条形的左端点 - 这是最后一个条形的右端点。 按照端点约定,那里的数据不包括在内。 因此,相应的计数记录为 0,并且即使已经有超过二十亿美元的电影也被记录为 0。 当`bin`或`hist`使用`bin`参数调用时,图只考虑在指定`bin`中的值。
509 |
510 | 一旦数值已经分入桶中,所得数量可以用来使用`bin_column`命名参数来生成直方图,以指定哪个列包含桶的下界。
511 |
512 | ```py
513 | bin_counts.hist('Adjusted Gross count', bin_column='bin', unit='Million Dollars')
514 | ```
515 |
516 | 
517 |
518 | ### 纵轴:密度刻度
519 |
520 | 一旦我们已经照顾到细节,如桶的末端,直方图的横轴易于阅读。 纵轴的特征需要更多关注。 我们会一一讲解。
521 |
522 | 我们先来看看如何计算垂直轴上的数字。 如果计算看起来有些奇怪,请耐心等待 - 本节的其余部分将解释原因。
523 |
524 | 计算。每个条形的高度是桶中的元素的百分比,除以桶的宽度。
525 |
526 | > 译者注:存在很多种直方图,比如频数直方图、频率质量直方图和频率密度直方图。它们的纵轴数值不相同,但是图形形状是一样的。这里是最后一种,频率密度直方图。
527 |
528 | ```py
529 | counts = bin_counts.relabeled('Adjusted Gross count', 'Count')
530 | percents = counts.with_column(
531 | 'Percent', (counts.column('Count')/200)*100
532 | )
533 | heights = percents.with_column(
534 | 'Height', percents.column('Percent')/100
535 | )
536 | heights
537 | ```
538 |
539 | | bin | Count | Percent | Height |
540 | | --- | --- | --- | --- |
541 | | 300 | 81 | 40.5 | 0.405 |
542 | | 400 | 52 | 26 | 0.26 |
543 | | 500 | 28 | 14 | 0.14 |
544 | | 600 | 16 | 8 | 0.08 |
545 | | 700 | 7 | 3.5 | 0.035 |
546 | | 800 | 5 | 2.5 | 0.025 |
547 | | 900 | 3 | 1.5 | 0.015 |
548 | | 1000 | 1 | 0.5 | 0.005 |
549 | | 1100 | 3 | 1.5 | 0.015 |
550 | | 1200 | 2 | 1 | 0.01 |
551 |
552 | (省略了 8 行)
553 |
554 | 在上面直方图的纵轴上查看数字,检查列高度是否正确。
555 |
556 | 如果我们只查看表格的第一行,计算就会变得清晰。
557 |
558 | 请记住,数据集中有 200 部电影。这个`[300,400)`的桶包含 81 部电影。这是所有电影的 40.5%:。
559 |
560 | `[300, 400)`桶的宽度是`400-300 = 100`。所以 。
561 |
562 | 用于计算高度的代码使用了总共有 200 个电影,以及每个箱的宽度是 100 的事实。
563 |
564 | 单位。条形的高度是 40.5% 除以 1 亿美元,因此高度是 0.405% 每百万美元。
565 |
566 | 这种绘制直方图的方法创建了一个垂直轴,它是在密度刻度上的。条形的高度不是桶中条目的百分比;它是桶中的条目除以桶的宽度。这就是为什么高度衡量拥挤度或密度。
567 |
568 | 让我们看看为什么这很重要。
569 |
570 | ### 不等的桶
571 |
572 | 直方图相比条形图的一个优点是,直方图可以包含不等宽度的桶。 以下将`Millions `中的值分为三个不均匀的类别。
573 |
574 | ```py
575 | uneven = make_array(300, 400, 600, 1500)
576 | millions.hist('Adjusted Gross', bins=uneven, unit="Million Dollars")
577 | ```
578 |
579 | 
580 |
581 | 这里是三个桶中的数量。
582 |
583 | ```py
584 | millions.bin('Adjusted Gross', bins=uneven)
585 | ```
586 |
587 |
588 | | bin | Adjusted Gross count |
589 | | --- | --- |
590 | | 300 | 81 |
591 | | 400 | 80 |
592 | | 600 | 37 |
593 | | 1500 | 0 |
594 |
595 | 虽然范围`[300,400)`和`[400,600)`具有几乎相同的计数,但前者的高度是后者的两倍,因为它只有一半的宽度。 `[300,400)`中的值的密度是`[400,600)`中的密度的两倍。
596 |
597 | 直方图帮助我们可视化数轴上数据最集中的地方,特别是当桶不均匀的时候。
598 |
599 | ### 仅仅绘制数量的问题
600 |
601 |
602 | 可以使用`hist`方法的`normed=False`选项直接在图表中显示数量。 生成的图表与直方图具有相同的形状,但这些桶的宽度均相等,尽管纵轴上的数字不同。
603 |
604 | ```py
605 | millions.hist('Adjusted Gross', bins=np.arange(300,2001,100), normed=False)
606 | ```
607 |
608 | 
609 |
610 | 虽然数量刻度可能比密度刻度更自然,但当桶宽度不同时,图表高度的有误导性。 下面看起来(由于计数)高收入电影相当普遍,事实上我们已经看到它们相对较少。
611 |
612 | ```py
613 | millions.hist('Adjusted Gross', bins=uneven, normed=False)
614 | ```
615 |
616 | 
617 |
618 | 即使使用的方法被称为`hist`,上面的图不是一个直方图。 误导性地夸大了至少 6 亿美元的电影比例。 每个桶的高度只是按照桶中的电影数量绘制,而不考虑桶宽度的差异。
619 |
620 | 如果最后两个桶组合起来,情况就变得更加荒谬了。
621 |
622 | ```py
623 | very_uneven = make_array(300, 400, 1500)
624 | millions.hist('Adjusted Gross', bins=very_uneven, normed=False)
625 | ```
626 |
627 | 
628 |
629 | 在这个基于数量的图像中,电影分布完全失去了形状。
630 |
631 | ### 直方图:通用原则和计算
632 |
633 | 上图显示,眼睛将面积视为“较大”的东西,而不是高度。当桶的宽度不同时,这种观察变得尤为重要。
634 |
635 | 这就是直方图具有两个定义属性的原因:
636 |
637 | + 桶按比例绘制并且是连续的(尽管有些可能是空的),因为横轴上的值是数值型的。
638 | + 每个条形的面积与桶中的条目数成比例。
639 |
640 | 属性(2)是绘制直方图的关键,通常实现如下:
641 |
642 | ```
643 | 条形的面积 = 桶中条目的百分比
644 | ```
645 |
646 | 高度的计算仅仅使用了一个事实,条形是长方形的。
647 |
648 | ```
649 | 条形的面积 = 条形的高度 * 桶的宽度
650 | ```
651 |
652 | 因此,
653 |
654 | ```
655 | 条形的高度 = 条形的面积 / 桶的宽度
656 | = 桶中条目的百分比 / 桶的宽度
657 | ```
658 |
659 | 高度的单位是“百分比每横轴单位”。
660 |
661 | 当使用这种方法绘制时,直方图被称为在密度刻度上绘制。 在这个刻度上:
662 |
663 | + 每个条形的面积等于相应桶中的数据值的百分比。
664 | + 直方图中所有条形的总面积为 100%。 从比例的角度来讲,我们说直方图中所有条形的面积“总计为 1”。
665 |
666 | ### 平顶和细节水平
667 |
668 | 即使密度刻度使用面积正确表示了百分比,但是通过将值分组到桶中,丢失了一些细节。
669 |
670 | 再看一下下图中的`[300,400)`的桶。 值为“0.405% 每百万美元”的桶的平顶,隐藏了电影在这个桶分布有些不均匀的事实。
671 |
672 | ```py
673 | millions.hist('Adjusted Gross', bins=uneven, unit="Million Dollars")
674 | ```
675 |
676 | 
677 |
678 | 为了看到它,让我们将`[300, 400)`划分为更窄的 10 个桶。每个桶的宽度都是一千万美元。
679 |
680 | ```py
681 | some_tiny_bins = make_array(300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 600, 1500)
682 | millions.hist('Adjusted Gross', bins=some_tiny_bins, unit='Million Dollars')
683 | ```
684 |
685 | 
686 |
687 | ### 直方图 Q&A
688 |
689 | 让我们再画一遍直方图,这次只有四个桶,检查我们对概念的理解。
690 |
691 | ```py
692 | uneven_again = make_array(300, 350, 400, 450, 1500)
693 | millions.hist('Adjusted Gross', bins=uneven_again, unit='Million Dollars')
694 |
695 | millions.bin('Adjusted Gross', bins=uneven_again)
696 | ```
697 |
698 | 
699 |
700 | | bin | Adjusted Gross count |
701 | | --- | --- |
702 | | 300 | 32 |
703 | | 350 | 49 |
704 | | 400 | 25 |
705 | | 450 | 92 |
706 | | 1500 | 0 |
707 |
708 | 再次查看直方图,并将`[400,450)`的桶与`[450,1500)`桶进行比较。
709 |
710 | 问:哪个桶里面有更多的电影?
711 |
712 | 答:`[450,1500)`的桶。它有 92 部电影,而`[400,450)`桶中有 25 部电影。
713 |
714 | 问:那么为什么`[450,1500)`的桶比`[400,450)`桶短得多呢?
715 |
716 | 答:因为高度代表桶里每单位空间的密度,而不是桶里的电影数量。 `[450,1500)`的桶中的电影确实比`[400,450)`的桶多,但它也是一个大桶。 所以它不那么拥挤。 其中的电影密度要低得多。
717 |
718 | ### 条形图和直方图的区别
719 |
720 | + 条形图为每个类别展示一个数量。 它们通常用于显示类别变量的分布。 直方图显示定量变量的分布。
721 | + 条形图中的所有条形都具有相同的宽度,相邻的条形之间有相等的间距。 直方图的条形可以具有不同的宽度,并且是连续的。
722 | + 条形图中条形的长度(或高度,如果垂直绘制)与每个类别的值成正比。 直方图中条形的高度是密度的度量;直方图中的条形的面积与桶中的条目数量成正比。
723 |
724 | ## 重叠的图表
725 |
726 | 在这一章中,我们学习了如何通过绘制图表来显示数据。 这种可视化的常见用法是比较两个数据集。 在本节中,我们将看到如何叠加绘图,即将它们绘制在单个图形中,拥有同一对坐标轴
727 |
728 | 为了使重叠有意义,重叠的图必须表示相同的变量并以相同的单位进行测量。
729 |
730 | 为了绘制重叠图,可以用相同的方法调用`scatter`,`plot`和`barh`方法。 对于`scatter`和`plot`,一列必须作为所有叠加图的公共横轴。 对于`barh`,一列必须作为一组类别的公共轴。 一般的调用看起来像这样:
731 |
732 | ```py
733 | name_of_table.method(column_label_of_common_axis, array_of_labels_of_variables_to_plot)
734 | ```
735 |
736 | 更常见的是,我们首先仅仅选取图表所需的列。之后通过指定共同轴上的变量来调用方法。
737 |
738 | ```py
739 | name_of_table.method(column_label_of_common_axis)
740 | ```
741 |
742 | ### 散点图
743 |
744 | 高尔顿(Franics Galton,1822 ~ 1911 年)是一位英国博学家,他是分析数值变量之间关系的先驱。 他对有争议的优生学领域特别感兴趣,实际上,他创造了这个术语 - 这涉及到如何将物理特征从一代传到下一代。
745 |
746 | 高尔顿精心收集了大量的数据,其中一些我们将在本课程中分析。 这是高尔顿的,有关父母及其子女身高的数据的子集。 具体来说,数据由 179 名男性组成,他们在家庭中第一个出生。数据是他们自己的高度和父母的高度。所有的高度都是以英寸来测量的。
747 |
748 | ```py
749 | heights = Table.read_table('galton_subset.csv')
750 | heights
751 | ```
752 |
753 | | father | mother | son |
754 | | --- | --- | --- |
755 | | 78.5 | 67 | 73.2 |
756 | | 75.5 | 66.5 | 73.5 |
757 | | 75 | 64 | 71 |
758 | | 75 | 64 | 70.5 |
759 | | 75 | 58.5 | 72 |
760 | | 74 | 68 | 76.5 |
761 | | 74 | 62 | 74 |
762 | | 73 | 67 | 71 |
763 | | 73 | 67 | 68 |
764 | | 73 | 66.5 | 71 |
765 |
766 | (省略了 169 行)
767 |
768 | `scatter`方法使我们能够可视化,儿子的身高如何与父母的身高有关。 在图中,儿子的身高将形成公共的横轴。
769 |
770 | ```py
771 | heights.scatter('son')
772 | ```
773 |
774 | 
775 |
776 | 注意我们仅仅指定了公共的横轴上的变量(儿子的身高)。 Python 绘制了两个散点图:这个变量和另外两个之间的关系,每个关系一个。
777 |
778 | 金色和蓝色的散点图向上倾斜,并显示出儿子的高度和父母的高度之间的正相关。 蓝色(父亲)的绘图一般比金色高,因为父亲一般比母亲高。
779 |
780 | ### 线形图
781 |
782 | 我们的下一个例子涉及更近的儿童数据。 我们将返回到人口普查数据表`us_pop`,再次在下面创建用于参考。 由此,我们将提取 0 至 18 岁年龄段的所有儿童的数量。
783 |
784 | ```py
785 | # Read the full Census table
786 | census_url = 'http://www2.census.gov/programs-surveys/popest/datasets/2010-2015/national/asrh/nc-est2015-agesex-res.csv'
787 | full_census_table = Table.read_table(census_url)
788 |
789 | # Select columns from the full table and relabel some of them
790 | partial_census_table = full_census_table.select(['SEX', 'AGE', 'POPESTIMATE2010', 'POPESTIMATE2014'])
791 | us_pop = partial_census_table.relabeled('POPESTIMATE2010', '2010').relabeled('POPESTIMATE2014', '2014')
792 |
793 | # Access the rows corresponding to all children, ages 0-18
794 | children = us_pop.where('SEX', are.equal_to(0)).where('AGE', are.below(19)).drop('SEX')
795 | children.show()
796 | ```
797 |
798 | | AGE | 2010 | 2014 |
799 | | --- | --- | --- |
800 | | 0 | 3951330 | 3949775 |
801 | | 1 | 3957888 | 3949776 |
802 | | 2 | 4090862 | 3959664 |
803 | | 3 | 4111920 | 4007079 |
804 | | 4 | 4077551 | 4005716 |
805 | | 5 | 4064653 | 4006900 |
806 | | 6 | 4073013 | 4135930 |
807 | | 7 | 4043046 | 4155326 |
808 | | 8 | 4025604 | 4120903 |
809 | | 9 | 4125415 | 4108349 |
810 | | 10 | 4187062 | 4116942 |
811 | | 11 | 4115511 | 4087402 |
812 | | 12 | 4113279 | 4070682 |
813 | | 13 | 4119666 | 4171030 |
814 | | 14 | 4145614 | 4233839 |
815 | | 15 | 4231002 | 4164796 |
816 | | 16 | 4313252 | 4168559 |
817 | | 17 | 4376367 | 4186513 |
818 | | 18 | 4491005 | 4227920 |
819 |
820 | 现在我们可以绘制两个叠加的线形图,显示 2010 年和 2014 年的不同年龄的儿童人数。方法调用类似于前面例子中的`scatter`调用。
821 |
822 | ```py
823 | children.plot('AGE')
824 | ```
825 |
826 | 
827 |
828 | 在这个刻度上,重要的是要记住我们只有`0,1,2`岁等等的数据。 两个图形的点相互“交织”。
829 |
830 | 这些图表在一些地方相互交叉:例如,2010 年的 4 岁人数比 2014 年多,2014 年的 14 岁人数比 2010 年多。
831 |
832 | 当然,2014 年的 14 岁儿童大部分都是 2010 年的 10 岁儿童。为了看到这一点,请查看 14 岁的金色图表和 10 岁的蓝色图表。事实上,你会注意到,整个金色图表(2014 年)看起来像蓝色图表(2010 年)向右滑了 4 年。 由于 2010 年至 2014 年间进入该国的儿童的净效应,这个下滑幅度还是有所上升, 幸运的是,在这些年代,没有太多的生命损失。
833 |
834 | ### 条形图
835 |
836 | 对于本节的最后一个例子,我们看看加利福尼亚州以及整个美国的成人和儿童的种族分布情况。
837 |
838 | 凯撒家庭基金会根据人口普查数据,编制了美国人口种族分布情况。基金会的网站提供了 2014 年整个美国人口以及当年 18 岁以下的美国儿童的数据汇总。
839 |
840 | 这里是一个表格,采用了美国和加利福尼亚州的数据。 这些列代表美国和加利福尼亚州的每个人,美国和加州的儿童。 表格的主体包含不同类别的比例。 每一列显示了,该列对应的人群的种族分布。 所以在每一列中,条目总计为 1。
841 |
842 | ```py
843 | usa_ca = Table.read_table('usa_ca_2014.csv')
844 | usa_ca
845 | ```
846 |
847 |
848 | | Ethnicity | USA All | CA All | USA Children | CA Children |
849 | | --- | --- | --- | --- | --- |
850 | | Black | 0.12 | 0.05 | 0.14 | 0.05 |
851 | | Hispanic | 0.18 | 0.38 | 0.24 | 0.5 |
852 | | White | 0.62 | 0.39 | 0.52 | 0.29 |
853 | | Other | 0.08 | 0.18 | 0.1 | 0.16 |
854 |
855 | 我们自然想要比较这些分布。 直接比较列是有意义的,因为所有条目都是比例,因此在相同刻度上。
856 |
857 | `barh`方法允许我们通过在相同轴域上绘制多个条形图,将比较可视化。这个调用类似于`scatter`和`plot`:我们必须指定类别的公共轴。
858 |
859 | > 译者注:轴域(Axes)是横轴和纵轴围城的区域。
860 |
861 | ```py
862 | usa_ca.barh('Ethnicity')
863 | ```
864 |
865 | 
866 |
867 | 虽然绘制叠加的条形图非常简单,但是我们可以在这个图表上找到太多的信息,以便能够理清种群之间的相似性和差异性。 似乎很清楚的是,美国所有人和美国儿童的种族分布比任何其他列都更相似,但是一次比较一对要容易得多。
868 |
869 | 首先比较美国和加利福尼亚的整个人口。
870 |
871 | ```py
872 | usa_ca.select('Ethnicity', 'USA All', 'CA All').barh('Ethnicity')
873 | ```
874 |
875 | 
876 |
877 | 这两个分布是完全不同的。 加利福尼亚州的拉美裔和其他类别比例较高,黑人和白人比例相应较低。 这种差异主要是由于,加利福尼亚州的地理位置和移民模式,无论是历史上还是近几十年来。 例如,加利福尼亚的“其他”类别包括相当一部分亚洲人和太平洋岛民。
878 |
879 | 从图中可以看出,2014 年加州近 40% 的人口是拉美裔。 与该州儿童人口的比较表明,未来几年拉美裔人口的比例可能会更高。 在加州儿童中,50% 属于拉美裔。
880 |
881 | ```py
882 | usa_ca.select('Ethnicity', 'CA All', 'CA Children').barh('Ethnicity')
883 | ```
884 |
885 | 
886 |
887 | 更复杂的数据集自然会产生各种有趣的可视化效果,包括不同种类的重叠图形。 为了分析这些数据,获得更多的数据操作技能的有帮助的,这样我们就可以将数据转化为一种形式,使我们能够使用本节中的方法。 在下一章中,我们将介绍其中的一些技巧。
888 |
--------------------------------------------------------------------------------
/9.md:
--------------------------------------------------------------------------------
1 | # 九、经验分布
2 |
3 | > 原文:[Empirical Distributions](https://github.com/data-8/textbook/tree/gh-pages/chapters/09)
4 |
5 | > 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
8 |
9 | > 自豪地采用[谷歌翻译](https://translate.google.cn/)
10 |
11 | 大部分数据科学都涉及来自大型随机样本的数据。 在本节中,我们将研究这些样本的一些属性。
12 |
13 | 我们将从一个简单的实验开始:多次掷骰子并跟踪出现的点数。 `die `表包含骰子面上的点数。 所有的数字只出现一次,因为我们假设骰子是平等的。
14 |
15 | ```py
16 | die = Table().with_column('Face', np.arange(1, 7, 1))
17 | die
18 | ```
19 |
20 |
21 | | Face |
22 | | --- |
23 | | 1 |
24 | | 2 |
25 | | 3 |
26 | | 4 |
27 | | 5 |
28 | | 6 |
29 |
30 | ### 概率分布
31 |
32 | 下面的直方图帮助我们可视化,每个面出现概率为 1/6 事实。 我们说直方图显示了所有可能的面的概率分布。 由于所有的条形表示相同的百分比几率,所以这个分布成为整数 1 到 6 上的均匀分布。
33 |
34 | ```py
35 | die_bins = np.arange(0.5, 6.6, 1)
36 | die.hist(bins = die_bins)
37 | ```
38 |
39 | 
40 |
41 | 递增值由相同的固定量分隔,例如骰子面上的值(递增值由 1 分隔),这样的变量被称为离散值。上面的直方图被称为离散直方图。它的桶由数组`die_bins`指定,并确保每个条形的中心是对应的整数值。
42 |
43 | 重要的是要记住,骰子不能显示 1.3 个点或 5.2 个点 - 总是显示整数个点。但是我们的可视化将每个值的概率扩展到条形区域。虽然在本课程的这个阶段这看起来有些随意,但是稍后当我们在离散直方图上叠加平滑曲线时,这将变得很重要。
44 |
45 | 在继续之前,让我们确保轴域上的数字是有意义的。每个面的概率是 1/6,四舍五入到小数点后两位的概率是 16.67%。每个桶的宽度是 1 个单位。所以每个条形的高度是每单位 16.67%。这与图形的水平和垂直比例一致。
46 |
47 | ### 经验分布
48 |
49 | 上面的分布由每个面的理论概率组成。 这不基于数据。 不投掷任何骰子,它就可以被研究和理解。
50 |
51 | 另一方面,经验分布是观测数据的分布。 他们可以通过经验直方图可视化。
52 |
53 | 让我们通过模拟一个骰子的投掷来获得一些数据。 这可以通过 1 到 6 的整数的带放回随机抽样来完成。为了使用 Python 来实现,我们将使用`Table`的`sample`方法,它带放回地随机抽取表中的行。它的参数是样本量,它返回一个由选定的行组成的表。 `with_replacement=False`的可选参数指定了应该抽取样本而不放回,但不适用于投掷骰子。
54 |
55 | 这是一个十次骰子投掷的结果。
56 |
57 | ```py
58 | die.sample(10)
59 | ```
60 |
61 |
62 | | Face |
63 | | --- |
64 | | 5 |
65 | | 3 |
66 | | 3 |
67 | | 4 |
68 | | 2 |
69 | | 2 |
70 | | 4 |
71 | | 1 |
72 | | 6 |
73 | | 6 |
74 |
75 | 我们可以使用相同的方法来模拟尽可能多的投掷,然后绘制结果的经验直方图。 因为我们要反复这样做,所以我们定义了一个函数`empirical_hist_die`,它以样本量为参数;该函数根据其参数多次投掷骰子,然后绘制直方图。
76 |
77 | ```py
78 | def empirical_hist_die(n):
79 | die.sample(n).hist(bins = die_bins)
80 | ```
81 |
82 | ### 经验直方图
83 |
84 |
85 | 这是十次投掷的经验直方图。 它看起来不像上面的概率直方图。 运行该单元格几次,看看它如何变化。
86 |
87 | ```py
88 | empirical_hist_die(10)
89 | ```
90 |
91 | 
92 |
93 | 当样本量增加时,经验直方图开始看起来更像是理论概率的直方图。
94 |
95 | ```py
96 | empirical_hist_die(100)
97 | ```
98 |
99 | 
100 |
101 | ```py
102 | empirical_hist_die(1000)
103 | ```
104 |
105 | 
106 |
107 | 当我们增加模拟中的投掷次数时,每个条形的面积接近 16.67%,这是概率直方图中每个条形的面积。
108 |
109 | 我们在实例中观察到了一般规则:
110 |
111 | ### 平均定律
112 |
113 | 如果偶然的实验在相同的条件下独立重复,那么从长远来看,事件发生的频率越来越接近事件的理论概率。
114 |
115 | 例如,从长远来看,四点的比例越来越接近 1/6。
116 |
117 | 这里“独立地且在相同的条件下”意味着,无论所有其他重复的结果如何,每个重复都以相同的方式执行。
118 |
119 | ## 从总体中取样
120 |
121 | 当随机样本来自较大总体时,平均定律也成立。
122 |
123 | 作为一个例子,我们将研究航班延误时间的总体。 `united `表包含 2015 年夏天从旧金山出发的美联航国内航班的数据。数据由[美国运输部运输统计局](http://www.transtats.bts.gov/Fields.asp?Table_ID=293)公布。
124 |
125 | 这里有 13,825 行,每行对应一个航班。 列是航班日期,航班号,目的地机场代码和以分钟为单位的出发延误时间。有些延误时间是负的;那些航班提前离开。
126 |
127 | ```py
128 | united = Table.read_table('united_summer2015.csv')
129 | united
130 | ```
131 |
132 |
133 | | Date | Flight Number | Destination | Delay |
134 | | --- | --- | --- | --- |
135 | | 6/1/15 | 73 | HNL | 257 |
136 | | 6/1/15 | 217 | EWR | 28 |
137 | | 6/1/15 | 237 | STL | -3 |
138 | | 6/1/15 | 250 | SAN | 0 |
139 | | 6/1/15 | 267 | PHL | 64 |
140 | | 6/1/15 | 273 | SEA | -6 |
141 | | 6/1/15 | 278 | SEA | -8 |
142 | | 6/1/15 | 292 | EWR | 12 |
143 | | 6/1/15 | 300 | HNL | 20 |
144 | | 6/1/15 | 317 | IND | -10 |
145 |
146 | (省略了 13815 行)
147 |
148 | 一个航班提前 16 分钟起飞,另一个航班延误 580 分钟。 其他延迟时间几乎都在 -10 分钟到 200 分钟之间,如下面的直方图所示。
149 |
150 | ```py
151 | united.column('Delay').min()
152 | -16
153 |
154 | united.column('Delay').max()
155 | 580
156 |
157 | delay_bins = np.append(np.arange(-20, 301, 10), 600)
158 | united.select('Delay').hist(bins = delay_bins, unit = 'minute')
159 | ```
160 |
161 | 
162 |
163 | 就本节而言,仅仅关注部分数据就足够了,我们忽略延迟超过 200 分钟的 0.8% 的航班。 这个限制只是为了视觉便利。 该表仍然保留所有的数据。
164 |
165 | ```py
166 | united.where('Delay', are.above(200)).num_rows/united.num_rows
167 | 0.008390596745027125
168 |
169 | delay_bins = np.arange(-20, 201, 10)
170 | united.select('Delay').hist(bins = delay_bins, unit = 'minute')
171 | ```
172 |
173 | 
174 |
175 | `[0,10)`的条形高度不到每分钟 3%,这意味着只有不到 30% 的航班延误了 0 到 10 分钟。 这是通过行的计数来确认的:
176 |
177 | ```py
178 | united.where('Delay', are.between(0, 10)).num_rows/united.num_rows
179 | 0.2935985533453888
180 | ```
181 |
182 | ### 样本的经验分布
183 |
184 | 现在让我们将这 13,825 个航班看做一个总体,并从中带放回地抽取随机样本。 将我们的分析代码打包成一个函数是有帮助的。 函数`empirical_hist_delay`以样本量为参数,绘制结果的经验直方图。
185 |
186 | ```py
187 | def empirical_hist_delay(n):
188 | united.sample(n).select('Delay').hist(bins = delay_bins, unit = 'minute')
189 | ```
190 |
191 | 正如我们用骰子所看到的,随着样本量的增加,样本的经验直方图更接近于总体的直方图。 将这些直方图与上面的总体直方图进行比较。
192 |
193 | ```py
194 | empirical_hist_delay(10)
195 | ```
196 |
197 | 
198 |
199 | ```py
200 | empirical_hist_delay(100)
201 | ```
202 |
203 | 
204 |
205 | 最一致的可见差异在总体中罕见的值之中。 在我们的示例中,这些值位于分布的最右边。 但随着样本量的增加,这些值以大致正确的比例,开始出现在样本中。
206 |
207 | ```py
208 | empirical_hist_delay(1000)
209 | ```
210 |
211 | 
212 |
213 | ### 样本的经验直方图的总结
214 |
215 | 我们在本节中观察到的东西,可以总结如下:
216 |
217 | 对于大型随机样本,样本的经验直方图类似于总体的直方图,概率很高。
218 |
219 | 这证明了,在统计推断中使用大型随机样本是合理的。 这个想法是,由于大型随机样本可能类似于从中抽取的总体,从样本中计算出的数量可能接近于总体中相应的数量。
220 |
221 | ## 轮盘赌
222 |
223 | 上面的分布让我们对整个随机样本有了印象。但有时候我们只是对基于样本计算的一个或两个量感兴趣。
224 |
225 | 例如,假设样本包含一系列投注的输赢。那么我们可能只是对赢得的总金额感兴趣,而不是输赢的整个序列。
226 |
227 | 使用我们的几率长期行为的新知识,让我们探索赌博游戏。我们将模拟轮盘赌,它在拉斯维加斯和蒙特卡洛等赌场中受欢迎。
228 |
229 | 在内华达,轮盘赌的主要随机器是一个带有 38 个口袋的轮子。其中两个口袋是绿色的,十八个黑色,十八个红色。轮子在主轴上,轮子上有一个小球。当轮子旋转时,球体跳起来,最后落在其中一个口袋里。这就是获胜的口袋。
230 |
231 | `wheel`表代表内华达轮盘赌的口袋。
232 |
233 | ```py
234 | wheel
235 | ```
236 |
237 | | Pocket | Color |
238 | | --- | --- |
239 | | 0 | green |
240 | | 00 | green |
241 | | 1 | red |
242 | | 2 | black |
243 | | 3 | red |
244 | | 4 | black |
245 | | 5 | red |
246 | | 6 | black |
247 | | 7 | red |
248 | | 8 | black |
249 |
250 | (省略了 28 行)
251 |
252 | 你可以对轮盘赌桌上展示的几个预先指定的口袋下注。 如果你对“红色”下注,如果球落在红色的口袋里,你就赢了。
253 |
254 | 红色的下注返回相等的钱。 也就是说,它支付一比一。为了理解这是什么意思,假设你在“红色”下注一美元。 第一件事情发生之前,即使在车轮旋转之前,你必须交出你的一美元。 如果球落在绿色或黑色的口袋里,你就失去它了。 如果球落在红色的口袋里,你会把你的钱拿回来(让你不输不赢),再加上另外一美元的奖金。
255 |
256 | 函数`red_winnings`以一个颜色作为参数,如果颜色是红色,则返回`1`。 对于所有其他颜色,它返回`-1`。 我们将`red_winnings`应用于`wheel`的`Color`列,来获得新的表`bets`,如果你对红色下注一美元,它显示每个口袋的净收益。
257 |
258 | ```py
259 | def red_winnings(color):
260 | if color == 'red':
261 | return 1
262 | else:
263 | return -1
264 | bets = wheel.with_column(
265 | 'Winnings: Red', wheel.apply(red_winnings, 'Color')
266 | )
267 | bets
268 | ```
269 |
270 |
271 | | Pocket | Color | Winnings: Red |
272 | | --- | --- | --- |
273 | | 0 | green | -1 |
274 | | 00 | green | -1 |
275 | | 1 | red | 1 |
276 | | 2 | black | -1 |
277 | | 3 | red | 1 |
278 | | 4 | black | -1 |
279 | | 5 | red | 1 |
280 | | 6 | black | -1 |
281 | | 7 | red | 1 |
282 | | 8 | black | -1 |
283 |
284 | (省略了 28 行)
285 |
286 | 假设我们决定对红色下注一美元,会发生什么呢?
287 |
288 | 这里是一轮的模拟。
289 |
290 | ```py
291 | one_spin = bets.sample(1)
292 | one_spin
293 | ```
294 |
295 |
296 | | Pocket | Color | Winnings: Red |
297 | | --- | --- | --- |
298 | | 14 | red | 1 |
299 |
300 | 这轮的颜色是`Color`列中的值。 无论你的赌注如何,结果可能是红色,绿色或黑色。 要看看这些事件发生的频率,我们可以模拟许多这样的单独轮次,并绘制出我们所看到的颜色的条形图。 (我们可以称之为经验条形图。)
301 |
302 | 为了实现它,我们可以使用`for`循环。 我们在这里选择了重复 5000 次,但是当你运行这个单元格时,你可以改变它。
303 |
304 | ```py
305 | num_simulations = 5000
306 |
307 | colors = make_array()
308 | winnings_on_red = make_array()
309 |
310 | for i in np.arange(num_simulations):
311 | spin = bets.sample(1)
312 | new_color = spin.column("Color").item(0)
313 | colors = np.append(colors, new_color)
314 | new_winnings = spin.column('Winnings: Red')
315 | winnings_on_red = np.append(winnings_on_red, new_winnings)
316 |
317 | Table().with_column('Color', colors)\
318 | .group('Color')\
319 | .barh('Color')
320 | ```
321 |
322 | 
323 |
324 | 38 个口袋里有 18 个是红色的,每个口袋都是等可能的。 因此,在 5000 次模拟中,我们预计大致(但可能不是完全)看到`18/38*5000`或者 2,368 次红色。模拟证明了这一点。
325 |
326 | 在模拟中,我们也记录了你的奖金。 这些经验直方图显示了,你对红色下注的不同结果的(近似)几率。
327 |
328 | ```py
329 | Table().with_column('Winnings: Red', winnings_on_red)\
330 | .hist(bins = np.arange(-1.55, 1.65, .1))
331 | ```
332 |
333 | 
334 |
335 | 每个模拟的唯一可能的结果是,你赢了一美元或输了一美元,这反映在直方图中。 我们也可以看到,你赢的次数要比输的次数少一点。 你喜欢这个赌博策略吗?
336 |
337 | ### 多次游戏
338 |
339 | 大多数轮盘赌玩家玩好几轮。 假设你在 200 次独立轮次反复下注一美元。 你总共会赚多少钱?
340 |
341 | 这里是一套 200 轮的模拟。 `spins`表包括所有 200 个赌注的结果。 你的净收益是`Winnings: Red`列中所有 +1 和 -1 的和。
342 |
343 | ```py
344 | spins = bets.sample(200)
345 | spins.column('Winnings: Red').sum()
346 | -26
347 | ```
348 |
349 | 运行几次单元格。 有时你的净收益是正的,但更多的时候它似乎是负的。
350 |
351 | 为了更清楚地看到发生了什么,让我们多次模拟 200 轮,就像我们模拟一轮那样。 对于每次模拟,我们将记录来自 200 轮的总奖金。 然后我们将制作 5000 个不同的模拟总奖金的直方图。
352 |
353 | ```py
354 | num_spins = 200
355 |
356 | net_gain = make_array()
357 |
358 | for i in np.arange(num_simulations):
359 | spins = bets.sample(num_spins)
360 | new_net_gain = spins.column('Winnings: Red').sum()
361 | net_gain = np.append(net_gain, new_net_gain)
362 |
363 | Table().with_column('Net Gain on Red', net_gain).hist()
364 | ```
365 |
366 | 
367 |
368 | 注意横轴上 0 的位置。 这就是你不赚不赔的地方。 通过使用这个赌博策略,你喜欢这个赚钱几率吗?
369 |
370 | 如果对红色下注不吸引人,也许值得尝试不同的赌注。 “分割”(Split)是轮盘赌桌上两个相邻号码的下注,例如 0 和 00。分割的回报是 17 比 1。
371 |
372 | `split_winnings`函数将口袋作为参数,如果口袋是 0 或 00,则返回 17。对于所有其他口袋,返回 -1。
373 |
374 | 表格`more_bets`是投注表格的一个版本,扩展的一列是对 0/00 分割下注的情况下,每个口袋的奖金。
375 |
376 | ```py
377 | def split_winnings(pocket):
378 | if pocket == '0':
379 | return 17
380 | elif pocket == '00':
381 | return 17
382 | else:
383 | return -1
384 | more_bets = wheel.with_columns(
385 | 'Winnings: Red', wheel.apply(red_winnings, 'Color'),
386 | 'Winnings: Split', wheel.apply(split_winnings, 'Pocket')
387 | )
388 | more_bets
389 | ```
390 |
391 | | Pocket | Color | Winnings: Red | Winnings: Split |
392 | | --- | --- | --- | --- |
393 | | 0 | green | -1 | 17 |
394 | | 00 | green | -1 | 17 |
395 | | 1 | red | 1 | -1 |
396 | | 2 | black | -1 | -1 |
397 | | 3 | red | 1 | -1 |
398 | | 4 | black | -1 | -1 |
399 | | 5 | red | 1 | -1 |
400 | | 6 | black | -1 | -1 |
401 | | 7 | red | 1 | -1 |
402 | | 8 | black | -1 | -1 |
403 |
404 | (省略了 28 行)
405 |
406 | 下面的代码模拟了两个投注的结果 - 红色和 0/00 分割 - 在 200 轮中。 代码与以前的模拟相同,除了添加了 Split。 (注意:`num_simulations`和`num_spins`之前分别定义为 5,000 和 200,所以我们不需要再次定义它们。)
407 |
408 | ```py
409 | net_gain_red = make_array()
410 | net_gain_split = make_array()
411 |
412 | for i in np.arange(num_simulations):
413 | spins = more_bets.sample(num_spins)
414 | new_net_gain_red = spins.column('Winnings: Red').sum()
415 | net_gain_red = np.append(net_gain_red, new_net_gain_red)
416 | new_net_gain_split = spins.column('Winnings: Split').sum()
417 | net_gain_split = np.append(net_gain_split, new_net_gain_split)
418 |
419 | Table().with_columns(
420 | 'Net Gain on Red', net_gain_red,
421 | 'Net Gain on Split', net_gain_split
422 | ).hist(bins=np.arange(-200, 200, 20))
423 | ```
424 |
425 | 
426 |
427 | 横轴上 0 的位置表明,无论你选择哪种赌注,你都更有可能赔钱而不是赚钱。在两个直方图中,不到 50% 的区域在 0 的右侧。
428 |
429 | 然而,分割的赌注赚钱几率更大,赚取超过 50 美元的机会也是如此。 金色直方图有很多区域在五十美元的右侧,而蓝色直方图几乎没有。 那么你应该对分割下注吗?
430 |
431 | 这取决于你愿意承担多少风险,因为直方图还表明,如果你对分割下注,你比对红色下注更容易损失超过 50 美元。
432 |
433 | 轮盘赌桌上,所有赌注的单位美元的预期净损失相同(除了线注,这是更糟的)。 但一些赌注的回报比其他赌注更为可变。 你可以选择这些赌注,只要你准备好可能会大输一场。
434 |
435 | ## 统计量的经验分布
436 |
437 | 平均定律意味着,大型随机样本的经验分布类似于总体的分布,概率相当高。
438 |
439 | 在两个直方图中可以看到相似之处:大型随机样本的经验直方图很可能类似于总体的直方图。
440 |
441 | 提醒一下,这里是所有美联航航班延误的直方图,以及这些航班的大小为 1000 的随机样本的经验直方图。
442 |
443 | ```py
444 | united = Table.read_table('united_summer2015.csv')
445 | delay_bins = np.arange(-20, 201, 10)
446 | united.select('Delay').hist(bins = delay_bins, unit = 'minute')
447 | plots.title('Population');
448 | ```
449 |
450 | 
451 |
452 | ```py
453 | sample_1000 = united.sample(1000)
454 | sample_1000.select('Delay').hist(bins = delay_bins, unit = 'minute')
455 | plots.title('Sample of Size 1000');
456 | ```
457 |
458 | 
459 |
460 | 两个直方图明显相似,虽然他们并不等价。
461 |
462 | ### 参数
463 |
464 | 我们经常对总体相关的数量感兴趣。
465 |
466 | 在选民的总体中,有多少人会投票给候选人 A 呢?
467 | 在 Facebook 用户的总体中,用户最多拥有的 Facebook 好友数是多少?
468 | 在美联航航班的总体中,起飞延误时间的中位数是多少?
469 |
470 | 与总体相关的数量被称为参数。 对于美联航航班的总体,我们知道参数“延误时间的中位数”的值:
471 |
472 | ```py
473 | np.median(united.column('Delay'))
474 | 2.0
475 | ```
476 |
477 | NumPy 函数`median`返回数组的中值(中位数)。 在所有的航班中,延误时间的中位数为 2 分钟。 也就是说,总体中约有 50% 的航班延误了 2 分钟以内:
478 |
479 | ```py
480 | united.where('Delay', are.below_or_equal_to(2)).num_rows/united.num_rows
481 | 0.5018444846292948
482 | ```
483 |
484 | 一半的航班在预定起飞时间的 2 分钟之内起飞。 这是非常短暂的延误!
485 |
486 | 注意。 由于“重复”,百分比并不完全是 50,也就是说,延误了 2 分钟的航班有 480 个。数据集中的重复很常见,我们不会在这个课程中担心它。
487 |
488 | ```py
489 | united.where('Delay', are.equal_to(2)).num_rows
490 | 480
491 | ```
492 |
493 | ### 统计
494 |
495 | 在很多情况下,我们会感兴趣的是找出未知参数的值。 为此,我们将依赖来自总体的大型随机样本的数据。
496 |
497 | 统计量(注意是单数!)是使用样本中数据计算的任何数字。 因此,样本中位数是一个统计量。
498 |
499 | 请记住,`sample_1000`包含来自`united`的 1000 个航班的随机样本。 样本中位数的观测值是:
500 |
501 | ```py
502 | np.median(sample_1000.column('Delay'))
503 | 2.0
504 | ```
505 |
506 | 我们的样本 - 一千个航班 - 给了我们统计量的观测值。 这提出了一个重要的推论问题:
507 |
508 | 统计量的数值可能会有所不同。 使用基于随机样本的任何统计量时,首先考虑的事情是,样本可能不同,因此统计量也可能不同。
509 |
510 | ```py
511 | np.median(united.sample(1000).column('Delay'))
512 | 3.0
513 | ```
514 |
515 | 运行单元格几次来查看答案的变化。 通常它等于 2,与总体参数值相同。 但有时候不一样。
516 |
517 | 统计量有多么不同? 回答这个问题的一种方法是多次运行单元格,并记下这些值。 这些值的直方图将告诉我们统计量的分布。
518 |
519 | 我们将使用`for`循环来“多次运行单元格”。 在此之前,让我们注意模拟中的主要步骤。
520 |
521 | ### 模拟统计量
522 |
523 | 我们将使用以下步骤来模拟样本中位数。 你可以用任何其他样本量来替换 1000 的样本量,并将样本中位数替换为其他统计量。
524 |
525 | 第一步:生成一个统计量。 抽取大小为 1000 的随机样本,并计算样本的中位数。 注意中位数的值。
526 |
527 | 第二步:生成更多的统计值。 重复步骤 1 多次,每次重新抽样。
528 |
529 | 第三步:结果可视化。 在第二步结束时,你将会记录许多样本中位数,每个中位数来自不同的样本。 你可以在表格中显示所有的中位数。 你也可以使用直方图来显示它们 - 这是统计量的经验直方图。
530 |
531 | 我们现在执行这个计划。 正如在所有的模拟中,我们首先创建一个空数组,我们在其中收集我们的结果。
532 |
533 | + 上面的第一步是`for`循环的主体。
534 | + 第二步,重复第一步“无数次”,由循环完成。 我们“无数次”是5000次,但是你可以改变这个。
535 | + 第三步是显示表格,并在后面的单元格中调用`hist`。
536 |
537 | 该单元格需要大量的时间来运行。 那是因为它正在执行抽取大小为 1000 的样本,并计算其中位数的过程,重复 5000 次。 这是很多抽样和重复!
538 |
539 | ```py
540 | medians = make_array()
541 |
542 | for i in np.arange(5000):
543 | new_median = np.median(united.sample(1000).column('Delay'))
544 | medians = np.append(medians, new_median)
545 |
546 | Table().with_column('Sample Median', medians)
547 | ```
548 |
549 |
550 | | Sample Median |
551 | | --- |
552 | | 3 |
553 | | 2 |
554 | | 2 |
555 | | 3 |
556 | | 2 |
557 | | 2 |
558 | | 2 |
559 | | 3 |
560 | | 1 |
561 | | 3 |
562 |
563 | (省略了 4990 行)
564 |
565 | ```py
566 | Table().with_column('Sample Median', medians).hist(bins=np.arange(0.5, 5, 1))
567 | ```
568 |
569 | 
570 |
571 | 你可以看到样本中位数很可能接近 2,这是总体中位数的值。 由于 1000 次航班延误的样本可能与延误总体相似,因此这些样本的延误中位数应接近总体的延误中位数,也就不足为奇了。
572 |
573 | 这是一个例子,统计量如何较好估计参数。
574 |
575 | ### 模拟的威力
576 |
577 | 如果我们能够生成所有可能的大小为 1000 的随机样本,我们就可以知道所有可能的统计量(样本中位数),以及所有这些值的概率。我们可以在统计量的概率直方图中可视化所有值和概率。
578 |
579 | 但在许多情况下(包括这个),所有可能的样本数量足以超过计算机的容量,概率的纯粹数学计算可能有些困难。
580 |
581 | 这是经验直方图的作用。
582 |
583 | 我们知道,如果样本量很大,并且如果重复抽样过程无数次,那么根据平均定律,统计量的经验直方图可能类似于统计量的概率直方图。
584 |
585 | 这意味着反复模拟随机过程是一种近似概率分布的方法,不需要在数学上计算概率,或者生成所有可能的随机样本。因此,计算机模拟成为数据科学中的一个强大工具。他们可以帮助数据科学家理解随机数量的特性,这些数据会以其他方式进行分析。
586 |
587 | 这就是这种的模拟的经典例子。
588 |
589 | ### 估计敌军飞机的数量
590 |
591 | 在第二次世界大战中,为盟军工作的数据分析师负责估算德国战机的数量。 这些数据包括盟军观察到的德国飞机的序列号。 这些序列号为数据分析师提供了答案。
592 |
593 | 为了估算战机总数,数据分析人员必须对序列号做出一些假设。 这里有两个这样的假设,大大简化,使我们的计算更容易。
594 |
595 | + 战机有`N`架,编号为 `1,2, ..., N`。
596 |
597 | + 观察到的飞机从`N`架飞机中均匀、随机带放回地抽取。
598 |
599 | 目标是估计数字`N`。 这是未知的参数。
600 |
601 | 假设你观察一些飞机并记下他们的序列号。 你如何使用这些数据来猜测`N`的值? 用于估计的自然和简单的统计量,就是观察到的最大的序列号。
602 |
603 | 让我们看看这个统计量如何用于估计。 但首先是另一个简化:现在一些历史学家估计,德国的飞机制造业生产了近 10 万架不同类型的战机,但在这里我们只能想象一种。 这使得假设 1 更易于证明。
604 |
605 | 假设实际上有`N = 300 `个这样的飞机,而且你观察到其中的 30 架。 我们可以构造一个名为`serialno`的表,其中包含序列号`1`到`N`。 然后,我们可以带放回取样 30 次(见假设 2),来获得我们的序列号样本。 我们的统计量是这 30 个数字中的最大值。 这就是我们用来估计参数`N`的东西。
606 |
607 | ```py
608 | N = 300
609 | serialno = Table().with_column('serial Number', np.arange(1, N+1))
610 | serialno
611 | ```
612 |
613 |
614 | | serial number |
615 | | --- |
616 | | 1 |
617 | | 2 |
618 | | 3 |
619 | | 4 |
620 | | 5 |
621 | | 6 |
622 | | 7 |
623 | | 8 |
624 | | 9 |
625 | | 10 |
626 |
627 | (省略了 290 行)
628 |
629 | ```py
630 | serialno.sample(30).column(0).max()
631 | 291
632 | ```
633 |
634 | 与所有涉及随机抽样的代码一样,运行该单元几次;来查看变化。你会发现,即使只有 300 个观测值,最大的序列号通常在 250-300 范围内。
635 |
636 | 原则上,最大的序列号可以像 1 那样小,如果你不幸看到了 30 次 1 号机。如果你至少观察到一次 300 号机,它可能会增大到 300。但通常情况下,它似乎处于非常高的 200 以上。看起来,如果你使用最大的观测序列号作为你对总数的估计,你不会有太大的错误。
637 |
638 | ### 模拟统计
639 |
640 | 让我们模拟统计,看看我们能否证实它。模拟的步骤是:
641 |
642 | 第一步。从 1 到 300 带放回地随机抽样 30 次,并注意观察到的最大数量。这是统计量。
643 |
644 | 第二步。重复步骤一 750 次,每次重新取样。你可以用任何其他的大数值代替 750。
645 |
646 | 第三步。创建一个表格来显示统计量的 750 个观察值,并使用这些值绘制统计量的经验直方图。
647 |
648 | ```py
649 | sample_size = 30
650 | repetitions = 750
651 | maxes = make_array()
652 |
653 | for i in np.arange(repetitions):
654 | sampled_numbers = serialno.sample(sample_size)
655 | maxes = np.append(maxes, sampled_numbers.column(0).max())
656 |
657 | Table().with_column('Max Serial Number', maxes)
658 | ```
659 |
660 |
661 | | Max Serial Number |
662 | | --- |
663 | | 280 |
664 | | 253 |
665 | | 294 |
666 | | 299 |
667 | | 298 |
668 | | 237 |
669 | | 296 |
670 | | 297 |
671 | | 293 |
672 | | 295 |
673 |
674 | (省略了 740 行)
675 |
676 | ```py
677 | every_ten = np.arange(1, N+100, 10)
678 | Table().with_column('Max Serial Number', maxes).hist(bins = every_ten)
679 | ```
680 |
681 | 
682 |
683 | 这是 750 个估计值的直方图,每个估计值是统计量“观察到的最大序列号”的观测值。
684 |
685 | 正如你所看到的,尽管在理论上它们可能会小得多,但估计都在 300 附近。直方图表明,作为飞机总数的估计,最大的序列号可能低了大约 10 到 25 个。但是,飞机的真实数量低了 50 个是不太可能的。
686 |
687 | ### 良好的近似
688 |
689 | 我们前面提到过,如果生成所有可能的样本,并计算每个样本的统计量,那么你将准确了解统计量可能有多么不同。事实上,你将会完整地列举统计量的所有可能值及其所有概率。
690 |
691 | 换句话说,你将得到统计量的概率分布和概率直方图。
692 |
693 | 统计量的概率分布也称为统计量的抽样分布,因为它基于所有可能的样本。
694 |
695 | 但是,我们上面已经提到,可能的样本总数往往非常大。例如,如果有 300 架飞机,你可以看到的,30 个序列号的可能序列总数为:
696 |
697 | ```py
698 | 300**30
699 | 205891132094649000000000000000000000000000000000000000000000000000000000000
700 | ```
701 |
702 | 这是很多样本。 幸运的是,我们不必生成所有这些。 我们知道统计量的经验直方图,基于许多但不是全部可能的样本,是概率直方图的很好的近似。 因此统计量的经验分布让我们很好地了解到,统计量可能有多么不同。
703 |
704 | 确实,统计量的概率分布包含比经验分布更准确的统计量信息。 但是,正如在这个例子中一样,通常经验分布所提供的近似值,足以让数据科学家了解统计量可以变化多少。 如果你有一台计算机,经验分布更容易计算。 因此,当数据科学家试图理解统计的性质时,通常使用经验分布而不是精确的概率分布。
705 |
706 | ### 参数的不同估计
707 |
708 | 这里举一个例子来说明这一点。 到目前为止,我们已经使用了最大的观测序号作为飞机总数的估计。 但还有其他可能的估计,我们现在将考虑其中之一。
709 |
710 | 这个估计的基本思想是观察到的序列号的平均值可能在1到`N`之间。 因此,如果`A`是平均值,那么:
711 |
712 | 
713 |
714 | 因此,可以使用一个新的统计量化来估计飞机总数:取观测到的平均序列号并加倍。
715 |
716 | 与使用最大的观测数据相比,这种估计方法如何? 计算新统计量的概率分布并不容易。 但是和以前一样,我们可以模拟它来近似得到概率。 我们来看看基于重复抽样的统计量的经验分布。 为了便于比较,重复次数选择为 750,与之前的模拟相同。
717 |
718 | ```py
719 | maxes = make_array()
720 | twice_ave = make_array()
721 |
722 | for i in np.arange(repetitions):
723 | sampled_numbers = serialno.sample(sample_size)
724 |
725 | new_max = sampled_numbers.column(0).max()
726 | maxes = np.append(maxes, new_max)
727 |
728 | new_twice_ave = 2*np.mean(sampled_numbers.column(0))
729 | twice_ave = np.append(twice_ave, new_twice_ave)
730 |
731 |
732 | results = Table().with_columns(
733 | 'Repetition', np.arange(1, repetitions+1),
734 | 'Max', maxes,
735 | '2*Average', twice_ave
736 | )
737 |
738 | results
739 | ```
740 |
741 |
742 | | Repetition | Max | 2*Average |
743 | | --- | --- | --- |
744 | | 1 | 296 | 312.067 |
745 | | 2 | 283 | 290.133 |
746 | | 3 | 290 | 250.667 |
747 | | 4 | 296 | 306.8 |
748 | | 5 | 298 | 335.533 |
749 | | 6 | 281 | 240 |
750 | | 7 | 300 | 317.267 |
751 | | 8 | 295 | 322.067 |
752 | | 9 | 296 | 317.6 |
753 | | 10 | 299 | 308.733 |
754 |
755 | (省略了 740 行)
756 |
757 | 请注意,与所观察到的最大数字不同,新的估计值(“平均值的两倍”)可能会高估飞机的数量。 当观察到的序列号的平均值接近于`N`而不是`1`时,就会发生这种情况。
758 |
759 | 下面的直方图显示了两个估计的经验分布。
760 |
761 | ```py
762 | results.drop(0).hist(bins = every_ten)
763 | ```
764 |
765 | 
766 |
767 | 你可以看到,原有方法几乎总是低估; 形式上,我们说它是有偏差的。 但它的变异性很小,很可能接近真正的飞机总数。
768 |
769 | 新方法高估了它,和低估的频率一样,因此从长远来看,平均而言大致没有偏差。 然而,它比旧的估计更可变,因此容易出现较大的绝对误差。
770 |
771 | 这是一个偏差 - 变异性权衡的例子,在竞争性估计中并不罕见。 你决定使用哪种估计取决于对你最重要的误差种类。 就敌机而言,低估总数可能会造成严重的后果,在这种情况下,你可能会选择使用更加可变的方法,它一半几率都是高估的。 另一方面,如果高估导致了防范不存在的飞机的不必要的高成本,那么你可能会对低估的方法感到满意。
772 |
773 | ### 技术注解
774 |
775 | 事实上,“两倍均值”不是无偏的。平均而言,它正好高估了 1。例如,如果`N`等于 3,来自`1,2,3`的抽取结果的均值是`2`,`2 x 2 = 4`,它比`N`多了 1。“两倍均值”减 1 是`N`的无偏估计量。
776 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 计算与推断思维 中文版
2 |
3 | 原书:[data-8/textbook](https://github.com/data-8/textbook/)
4 |
5 | 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | + [在线阅读](https://www.gitbook.com/book/wizardforcel/data8-textbook/details)
8 | + [PDF格式](https://www.gitbook.com/download/pdf/book/wizardforcel/data8-textbook)
9 | + [EPUB格式](https://www.gitbook.com/download/epub/book/wizardforcel/data8-textbook)
10 | + [MOBI格式](https://www.gitbook.com/download/mobi/book/wizardforcel/data8-textbook)
11 | + [代码仓库](https://github.com/wizardforcel/data8-textbook-zh)
12 |
13 |
14 | ## 赞助我
15 |
16 | 
17 |
18 | ## 协议
19 |
20 | [CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
21 |
22 | ## KivyCN 学习资源
23 |
24 | + [Think Python 中文第二版](https://github.com/Kivy-CN/ThinkPython-CN)
25 | + [UCB CS61a 教材:SICP Python](https://github.com/Kivy-CN/sicp-py-zh)
26 | + [Tutorialspoint NumPy 教程](https://github.com/Kivy-CN/ts-numpy-tut-zh)
27 | + [Matplotlib 用户指南](https://github.com/Kivy-CN/matplotlib-user-guide-zh)
28 | + [斯坦福 CS229 机器学习中文讲义](https://github.com/Kivy-CN/Stanford-CS-229-CN)
29 | + [Duke STA663 计算统计学中文讲义](https://github.com/Kivy-CN/Duke-STA-663-CN)
30 | + [笨办法学 Python · 续](https://github.com/Kivy-CN/lmpythw-zh)
31 | + [笨办法学 Linux](https://github.com/Kivy-CN/llthw-zh)
32 | + [数据结构思维](https://github.com/Kivy-CN/think-dast-zh)
33 | + [写给人类的机器学习](https://github.com/Kivy-CN/ml-for-humans-zh)
34 |
--------------------------------------------------------------------------------
/SUMMARY.md:
--------------------------------------------------------------------------------
1 | + [计算与推断思维](README.md)
2 | + [一、数据科学](1.md)
3 | + [二、因果和实验](2.md)
4 | + [三、Python 编程](3.md)
5 | + [四、数据类型](4.md)
6 | + [五、表格](5.md)
7 | + [六、可视化](6.md)
8 | + [七、函数和表格](7.md)
9 | + [八、随机性](8.md)
10 | + [九、经验分布](9.md)
11 | + [十、假设检验](10.md)
12 | + [十一、估计](11.md)
13 | + [十二、为什么均值重要](12.md)
14 | + [十三、预测](13.md)
15 | + [十四、回归的推断](14.md)
16 | + [十五、分类](15.md)
17 | + [十六、比较两个样本](16.md)
18 | + [十七、更新预测](17.md)
--------------------------------------------------------------------------------
/img/1-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/1-1.png
--------------------------------------------------------------------------------
/img/1-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/1-2.png
--------------------------------------------------------------------------------
/img/1-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/1-3.png
--------------------------------------------------------------------------------
/img/10-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-1.png
--------------------------------------------------------------------------------
/img/10-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-10.png
--------------------------------------------------------------------------------
/img/10-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-11.png
--------------------------------------------------------------------------------
/img/10-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-12.png
--------------------------------------------------------------------------------
/img/10-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-13.png
--------------------------------------------------------------------------------
/img/10-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-14.png
--------------------------------------------------------------------------------
/img/10-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-15.png
--------------------------------------------------------------------------------
/img/10-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-2.png
--------------------------------------------------------------------------------
/img/10-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-3.png
--------------------------------------------------------------------------------
/img/10-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-4.png
--------------------------------------------------------------------------------
/img/10-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-5.png
--------------------------------------------------------------------------------
/img/10-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-6.png
--------------------------------------------------------------------------------
/img/10-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-7.png
--------------------------------------------------------------------------------
/img/10-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-8.png
--------------------------------------------------------------------------------
/img/10-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/10-9.png
--------------------------------------------------------------------------------
/img/11-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-1.png
--------------------------------------------------------------------------------
/img/11-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-10.png
--------------------------------------------------------------------------------
/img/11-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-11.png
--------------------------------------------------------------------------------
/img/11-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-12.png
--------------------------------------------------------------------------------
/img/11-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-13.png
--------------------------------------------------------------------------------
/img/11-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-14.png
--------------------------------------------------------------------------------
/img/11-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-15.png
--------------------------------------------------------------------------------
/img/11-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-16.png
--------------------------------------------------------------------------------
/img/11-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-17.png
--------------------------------------------------------------------------------
/img/11-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-18.png
--------------------------------------------------------------------------------
/img/11-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-2.png
--------------------------------------------------------------------------------
/img/11-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-3.png
--------------------------------------------------------------------------------
/img/11-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-4.png
--------------------------------------------------------------------------------
/img/11-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-5.png
--------------------------------------------------------------------------------
/img/11-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-6.png
--------------------------------------------------------------------------------
/img/11-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-7.png
--------------------------------------------------------------------------------
/img/11-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-8.png
--------------------------------------------------------------------------------
/img/11-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/11-9.png
--------------------------------------------------------------------------------
/img/12-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-1.png
--------------------------------------------------------------------------------
/img/12-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-10.png
--------------------------------------------------------------------------------
/img/12-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-11.png
--------------------------------------------------------------------------------
/img/12-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-12.png
--------------------------------------------------------------------------------
/img/12-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-13.png
--------------------------------------------------------------------------------
/img/12-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-14.png
--------------------------------------------------------------------------------
/img/12-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-15.png
--------------------------------------------------------------------------------
/img/12-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-16.png
--------------------------------------------------------------------------------
/img/12-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-17.png
--------------------------------------------------------------------------------
/img/12-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-18.png
--------------------------------------------------------------------------------
/img/12-19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-19.png
--------------------------------------------------------------------------------
/img/12-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-2.png
--------------------------------------------------------------------------------
/img/12-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-20.png
--------------------------------------------------------------------------------
/img/12-21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-21.png
--------------------------------------------------------------------------------
/img/12-22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-22.png
--------------------------------------------------------------------------------
/img/12-23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-23.png
--------------------------------------------------------------------------------
/img/12-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-24.png
--------------------------------------------------------------------------------
/img/12-25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-25.png
--------------------------------------------------------------------------------
/img/12-26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-26.png
--------------------------------------------------------------------------------
/img/12-27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-27.png
--------------------------------------------------------------------------------
/img/12-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-3.png
--------------------------------------------------------------------------------
/img/12-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-4.png
--------------------------------------------------------------------------------
/img/12-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-5.png
--------------------------------------------------------------------------------
/img/12-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-6.png
--------------------------------------------------------------------------------
/img/12-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-7.png
--------------------------------------------------------------------------------
/img/12-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-8.png
--------------------------------------------------------------------------------
/img/12-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/12-9.png
--------------------------------------------------------------------------------
/img/13-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-1.png
--------------------------------------------------------------------------------
/img/13-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-10.png
--------------------------------------------------------------------------------
/img/13-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-11.png
--------------------------------------------------------------------------------
/img/13-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-12.png
--------------------------------------------------------------------------------
/img/13-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-13.png
--------------------------------------------------------------------------------
/img/13-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-14.png
--------------------------------------------------------------------------------
/img/13-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-15.png
--------------------------------------------------------------------------------
/img/13-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-16.png
--------------------------------------------------------------------------------
/img/13-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-17.png
--------------------------------------------------------------------------------
/img/13-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-18.png
--------------------------------------------------------------------------------
/img/13-19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-19.png
--------------------------------------------------------------------------------
/img/13-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-2.png
--------------------------------------------------------------------------------
/img/13-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-20.png
--------------------------------------------------------------------------------
/img/13-21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-21.png
--------------------------------------------------------------------------------
/img/13-22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-22.png
--------------------------------------------------------------------------------
/img/13-23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-23.png
--------------------------------------------------------------------------------
/img/13-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-24.png
--------------------------------------------------------------------------------
/img/13-25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-25.png
--------------------------------------------------------------------------------
/img/13-26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-26.png
--------------------------------------------------------------------------------
/img/13-27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-27.png
--------------------------------------------------------------------------------
/img/13-28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-28.png
--------------------------------------------------------------------------------
/img/13-29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-29.png
--------------------------------------------------------------------------------
/img/13-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-3.png
--------------------------------------------------------------------------------
/img/13-30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-30.png
--------------------------------------------------------------------------------
/img/13-31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-31.png
--------------------------------------------------------------------------------
/img/13-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-32.png
--------------------------------------------------------------------------------
/img/13-33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-33.png
--------------------------------------------------------------------------------
/img/13-34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-34.png
--------------------------------------------------------------------------------
/img/13-35.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-35.png
--------------------------------------------------------------------------------
/img/13-36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-36.png
--------------------------------------------------------------------------------
/img/13-37.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-37.png
--------------------------------------------------------------------------------
/img/13-38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-38.png
--------------------------------------------------------------------------------
/img/13-39.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-39.png
--------------------------------------------------------------------------------
/img/13-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-4.png
--------------------------------------------------------------------------------
/img/13-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-40.png
--------------------------------------------------------------------------------
/img/13-41.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-41.png
--------------------------------------------------------------------------------
/img/13-42.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-42.png
--------------------------------------------------------------------------------
/img/13-43.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-43.png
--------------------------------------------------------------------------------
/img/13-44.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-44.png
--------------------------------------------------------------------------------
/img/13-45.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-45.png
--------------------------------------------------------------------------------
/img/13-46.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-46.png
--------------------------------------------------------------------------------
/img/13-47.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-47.png
--------------------------------------------------------------------------------
/img/13-48.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-48.jpg
--------------------------------------------------------------------------------
/img/13-49.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-49.png
--------------------------------------------------------------------------------
/img/13-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-5.png
--------------------------------------------------------------------------------
/img/13-50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-50.png
--------------------------------------------------------------------------------
/img/13-51.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-51.png
--------------------------------------------------------------------------------
/img/13-52.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-52.png
--------------------------------------------------------------------------------
/img/13-53.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-53.png
--------------------------------------------------------------------------------
/img/13-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-6.png
--------------------------------------------------------------------------------
/img/13-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-7.png
--------------------------------------------------------------------------------
/img/13-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-8.png
--------------------------------------------------------------------------------
/img/13-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/13-9.png
--------------------------------------------------------------------------------
/img/14-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-1.png
--------------------------------------------------------------------------------
/img/14-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-10.png
--------------------------------------------------------------------------------
/img/14-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-11.png
--------------------------------------------------------------------------------
/img/14-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-12.png
--------------------------------------------------------------------------------
/img/14-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-13.png
--------------------------------------------------------------------------------
/img/14-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-14.png
--------------------------------------------------------------------------------
/img/14-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-15.png
--------------------------------------------------------------------------------
/img/14-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-2.png
--------------------------------------------------------------------------------
/img/14-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-3.png
--------------------------------------------------------------------------------
/img/14-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-4.png
--------------------------------------------------------------------------------
/img/14-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-5.png
--------------------------------------------------------------------------------
/img/14-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-6.png
--------------------------------------------------------------------------------
/img/14-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-7.png
--------------------------------------------------------------------------------
/img/14-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-8.png
--------------------------------------------------------------------------------
/img/14-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/14-9.png
--------------------------------------------------------------------------------
/img/15-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-1.png
--------------------------------------------------------------------------------
/img/15-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-10.png
--------------------------------------------------------------------------------
/img/15-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-11.png
--------------------------------------------------------------------------------
/img/15-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-12.png
--------------------------------------------------------------------------------
/img/15-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-13.png
--------------------------------------------------------------------------------
/img/15-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-14.png
--------------------------------------------------------------------------------
/img/15-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-15.png
--------------------------------------------------------------------------------
/img/15-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-16.png
--------------------------------------------------------------------------------
/img/15-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-17.png
--------------------------------------------------------------------------------
/img/15-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-18.png
--------------------------------------------------------------------------------
/img/15-19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-19.png
--------------------------------------------------------------------------------
/img/15-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-2.png
--------------------------------------------------------------------------------
/img/15-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-20.png
--------------------------------------------------------------------------------
/img/15-21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-21.png
--------------------------------------------------------------------------------
/img/15-22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-22.png
--------------------------------------------------------------------------------
/img/15-23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-23.png
--------------------------------------------------------------------------------
/img/15-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-24.png
--------------------------------------------------------------------------------
/img/15-25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-25.png
--------------------------------------------------------------------------------
/img/15-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-3.png
--------------------------------------------------------------------------------
/img/15-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-4.png
--------------------------------------------------------------------------------
/img/15-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-5.png
--------------------------------------------------------------------------------
/img/15-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-6.png
--------------------------------------------------------------------------------
/img/15-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-7.png
--------------------------------------------------------------------------------
/img/15-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-8.png
--------------------------------------------------------------------------------
/img/15-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/15-9.png
--------------------------------------------------------------------------------
/img/16-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-1.png
--------------------------------------------------------------------------------
/img/16-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-10.png
--------------------------------------------------------------------------------
/img/16-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-11.png
--------------------------------------------------------------------------------
/img/16-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-12.png
--------------------------------------------------------------------------------
/img/16-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-13.png
--------------------------------------------------------------------------------
/img/16-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-14.png
--------------------------------------------------------------------------------
/img/16-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-15.png
--------------------------------------------------------------------------------
/img/16-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-2.png
--------------------------------------------------------------------------------
/img/16-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-3.png
--------------------------------------------------------------------------------
/img/16-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-4.png
--------------------------------------------------------------------------------
/img/16-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-5.png
--------------------------------------------------------------------------------
/img/16-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-6.png
--------------------------------------------------------------------------------
/img/16-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-7.png
--------------------------------------------------------------------------------
/img/16-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-8.png
--------------------------------------------------------------------------------
/img/16-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/16-9.png
--------------------------------------------------------------------------------
/img/17-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/17-1.png
--------------------------------------------------------------------------------
/img/17-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/17-2.png
--------------------------------------------------------------------------------
/img/17-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/17-3.png
--------------------------------------------------------------------------------
/img/2-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/2-1.jpg
--------------------------------------------------------------------------------
/img/2-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/2-2.jpg
--------------------------------------------------------------------------------
/img/3-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/3-1.png
--------------------------------------------------------------------------------
/img/3-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/3-2.png
--------------------------------------------------------------------------------
/img/3-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/3-3.png
--------------------------------------------------------------------------------
/img/3-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/3-4.png
--------------------------------------------------------------------------------
/img/4-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/4-1.png
--------------------------------------------------------------------------------
/img/4-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/4-2.png
--------------------------------------------------------------------------------
/img/4-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/4-3.png
--------------------------------------------------------------------------------
/img/5-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/5-1.png
--------------------------------------------------------------------------------
/img/6-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-1.png
--------------------------------------------------------------------------------
/img/6-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-10.png
--------------------------------------------------------------------------------
/img/6-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-11.png
--------------------------------------------------------------------------------
/img/6-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-12.png
--------------------------------------------------------------------------------
/img/6-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-13.png
--------------------------------------------------------------------------------
/img/6-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-14.png
--------------------------------------------------------------------------------
/img/6-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-15.png
--------------------------------------------------------------------------------
/img/6-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-16.png
--------------------------------------------------------------------------------
/img/6-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-17.png
--------------------------------------------------------------------------------
/img/6-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-18.png
--------------------------------------------------------------------------------
/img/6-19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-19.png
--------------------------------------------------------------------------------
/img/6-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-2.png
--------------------------------------------------------------------------------
/img/6-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-20.png
--------------------------------------------------------------------------------
/img/6-21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-21.png
--------------------------------------------------------------------------------
/img/6-22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-22.png
--------------------------------------------------------------------------------
/img/6-23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-23.png
--------------------------------------------------------------------------------
/img/6-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-24.png
--------------------------------------------------------------------------------
/img/6-25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-25.png
--------------------------------------------------------------------------------
/img/6-26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-26.png
--------------------------------------------------------------------------------
/img/6-27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-27.png
--------------------------------------------------------------------------------
/img/6-28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-28.png
--------------------------------------------------------------------------------
/img/6-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-3.png
--------------------------------------------------------------------------------
/img/6-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-4.png
--------------------------------------------------------------------------------
/img/6-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-5.png
--------------------------------------------------------------------------------
/img/6-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-6.png
--------------------------------------------------------------------------------
/img/6-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-7.png
--------------------------------------------------------------------------------
/img/6-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-8.png
--------------------------------------------------------------------------------
/img/6-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/6-9.png
--------------------------------------------------------------------------------
/img/7-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/7-1.jpg
--------------------------------------------------------------------------------
/img/7-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/7-2.jpg
--------------------------------------------------------------------------------
/img/7-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/7-3.png
--------------------------------------------------------------------------------
/img/7-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/7-4.png
--------------------------------------------------------------------------------
/img/7-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/7-5.png
--------------------------------------------------------------------------------
/img/7-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/7-6.png
--------------------------------------------------------------------------------
/img/7-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/7-7.png
--------------------------------------------------------------------------------
/img/7-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/7-8.png
--------------------------------------------------------------------------------
/img/8-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/8-1.png
--------------------------------------------------------------------------------
/img/8-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/8-2.png
--------------------------------------------------------------------------------
/img/8-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/8-3.png
--------------------------------------------------------------------------------
/img/8-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/8-4.png
--------------------------------------------------------------------------------
/img/9-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-1.png
--------------------------------------------------------------------------------
/img/9-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-10.png
--------------------------------------------------------------------------------
/img/9-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-11.png
--------------------------------------------------------------------------------
/img/9-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-12.png
--------------------------------------------------------------------------------
/img/9-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-13.png
--------------------------------------------------------------------------------
/img/9-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-14.png
--------------------------------------------------------------------------------
/img/9-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-15.png
--------------------------------------------------------------------------------
/img/9-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-16.png
--------------------------------------------------------------------------------
/img/9-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-17.png
--------------------------------------------------------------------------------
/img/9-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-18.png
--------------------------------------------------------------------------------
/img/9-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-2.png
--------------------------------------------------------------------------------
/img/9-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-3.png
--------------------------------------------------------------------------------
/img/9-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-4.png
--------------------------------------------------------------------------------
/img/9-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-5.png
--------------------------------------------------------------------------------
/img/9-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-6.png
--------------------------------------------------------------------------------
/img/9-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-7.png
--------------------------------------------------------------------------------
/img/9-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-8.png
--------------------------------------------------------------------------------
/img/9-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/9-9.png
--------------------------------------------------------------------------------
/img/qr_alipay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/qr_alipay.png
--------------------------------------------------------------------------------
/img/tex-10-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-10-1.gif
--------------------------------------------------------------------------------
/img/tex-10-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-10-2.gif
--------------------------------------------------------------------------------
/img/tex-10-3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-10-3.gif
--------------------------------------------------------------------------------
/img/tex-10-4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-10-4.gif
--------------------------------------------------------------------------------
/img/tex-11-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-11-1.gif
--------------------------------------------------------------------------------
/img/tex-12-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-12-1.gif
--------------------------------------------------------------------------------
/img/tex-12-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-12-2.gif
--------------------------------------------------------------------------------
/img/tex-12-3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-12-3.gif
--------------------------------------------------------------------------------
/img/tex-12-4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-12-4.gif
--------------------------------------------------------------------------------
/img/tex-12-5.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-12-5.gif
--------------------------------------------------------------------------------
/img/tex-12-6.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-12-6.gif
--------------------------------------------------------------------------------
/img/tex-12-7.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-12-7.gif
--------------------------------------------------------------------------------
/img/tex-12-8.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-12-8.gif
--------------------------------------------------------------------------------
/img/tex-13-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-1.gif
--------------------------------------------------------------------------------
/img/tex-13-10.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-10.gif
--------------------------------------------------------------------------------
/img/tex-13-11.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-11.gif
--------------------------------------------------------------------------------
/img/tex-13-12.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-12.gif
--------------------------------------------------------------------------------
/img/tex-13-13.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-13.gif
--------------------------------------------------------------------------------
/img/tex-13-14.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-14.gif
--------------------------------------------------------------------------------
/img/tex-13-15.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-15.gif
--------------------------------------------------------------------------------
/img/tex-13-16.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-16.gif
--------------------------------------------------------------------------------
/img/tex-13-17.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-17.gif
--------------------------------------------------------------------------------
/img/tex-13-18.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-18.gif
--------------------------------------------------------------------------------
/img/tex-13-19.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-19.gif
--------------------------------------------------------------------------------
/img/tex-13-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-2.gif
--------------------------------------------------------------------------------
/img/tex-13-3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-3.gif
--------------------------------------------------------------------------------
/img/tex-13-4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-4.gif
--------------------------------------------------------------------------------
/img/tex-13-5.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-5.gif
--------------------------------------------------------------------------------
/img/tex-13-6.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-6.gif
--------------------------------------------------------------------------------
/img/tex-13-7.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-7.gif
--------------------------------------------------------------------------------
/img/tex-13-8.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-8.gif
--------------------------------------------------------------------------------
/img/tex-13-9.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-13-9.gif
--------------------------------------------------------------------------------
/img/tex-15-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-15-1.gif
--------------------------------------------------------------------------------
/img/tex-15-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-15-2.gif
--------------------------------------------------------------------------------
/img/tex-15-3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-15-3.gif
--------------------------------------------------------------------------------
/img/tex-17-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-17-1.gif
--------------------------------------------------------------------------------
/img/tex-17-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-17-2.gif
--------------------------------------------------------------------------------
/img/tex-17-3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-17-3.gif
--------------------------------------------------------------------------------
/img/tex-17-4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-17-4.gif
--------------------------------------------------------------------------------
/img/tex-4-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-4-1.gif
--------------------------------------------------------------------------------
/img/tex-4-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-4-2.gif
--------------------------------------------------------------------------------
/img/tex-6-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-6-1.gif
--------------------------------------------------------------------------------
/img/tex-6-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-6-2.gif
--------------------------------------------------------------------------------
/img/tex-8-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-1.gif
--------------------------------------------------------------------------------
/img/tex-8-10.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-10.gif
--------------------------------------------------------------------------------
/img/tex-8-11.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-11.gif
--------------------------------------------------------------------------------
/img/tex-8-12.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-12.gif
--------------------------------------------------------------------------------
/img/tex-8-13.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-13.gif
--------------------------------------------------------------------------------
/img/tex-8-14.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-14.gif
--------------------------------------------------------------------------------
/img/tex-8-15.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-15.gif
--------------------------------------------------------------------------------
/img/tex-8-16.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-16.gif
--------------------------------------------------------------------------------
/img/tex-8-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-2.gif
--------------------------------------------------------------------------------
/img/tex-8-3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-3.gif
--------------------------------------------------------------------------------
/img/tex-8-4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-4.gif
--------------------------------------------------------------------------------
/img/tex-8-5.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-5.gif
--------------------------------------------------------------------------------
/img/tex-8-6.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-6.gif
--------------------------------------------------------------------------------
/img/tex-8-7.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-7.gif
--------------------------------------------------------------------------------
/img/tex-8-8.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-8.gif
--------------------------------------------------------------------------------
/img/tex-8-9.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-8-9.gif
--------------------------------------------------------------------------------
/img/tex-9-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kivy-CN/data8-textbook-zh/e18278a1dd4381ce35e5d7e11c2ca00d55f4f055/img/tex-9-1.gif
--------------------------------------------------------------------------------
/src/7-2.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/styles/ebook.css:
--------------------------------------------------------------------------------
1 | /* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
2 | /* Author: Nicolas Hery - http://nicolashery.com */
3 | /* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */
4 | /* Source: https://github.com/nicolahery/markdownpad-github */
5 |
6 | /* RESET
7 | =============================================================================*/
8 |
9 | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
10 | margin: 0;
11 | padding: 0;
12 | border: 0;
13 | }
14 |
15 | /* BODY
16 | =============================================================================*/
17 |
18 | body {
19 | font-family: Helvetica, arial, freesans, clean, sans-serif;
20 | font-size: 14px;
21 | line-height: 1.6;
22 | color: #333;
23 | background-color: #fff;
24 | padding: 20px;
25 | max-width: 960px;
26 | margin: 0 auto;
27 | }
28 |
29 | body>*:first-child {
30 | margin-top: 0 !important;
31 | }
32 |
33 | body>*:last-child {
34 | margin-bottom: 0 !important;
35 | }
36 |
37 | /* BLOCKS
38 | =============================================================================*/
39 |
40 | p, blockquote, ul, ol, dl, table, pre {
41 | margin: 15px 0;
42 | }
43 |
44 | /* HEADERS
45 | =============================================================================*/
46 |
47 | h1, h2, h3, h4, h5, h6 {
48 | margin: 20px 0 10px;
49 | padding: 0;
50 | font-weight: bold;
51 | -webkit-font-smoothing: antialiased;
52 | }
53 |
54 | h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
55 | font-size: inherit;
56 | }
57 |
58 | h1 {
59 | font-size: 24px;
60 | border-bottom: 1px solid #ccc;
61 | color: #000;
62 | }
63 |
64 | h2 {
65 | font-size: 18px;
66 | color: #000;
67 | }
68 |
69 | h3 {
70 | font-size: 14px;
71 | }
72 |
73 | h4 {
74 | font-size: 14px;
75 | }
76 |
77 | h5 {
78 | font-size: 14px;
79 | }
80 |
81 | h6 {
82 | color: #777;
83 | font-size: 14px;
84 | }
85 |
86 | body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
87 | margin-top: 0;
88 | padding-top: 0;
89 | }
90 |
91 | a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
92 | margin-top: 0;
93 | padding-top: 0;
94 | }
95 |
96 | h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
97 | margin-top: 10px;
98 | }
99 |
100 | /* LINKS
101 | =============================================================================*/
102 |
103 | a {
104 | color: #4183C4;
105 | text-decoration: none;
106 | }
107 |
108 | a:hover {
109 | text-decoration: underline;
110 | }
111 |
112 | /* LISTS
113 | =============================================================================*/
114 |
115 | ul, ol {
116 | padding-left: 30px;
117 | }
118 |
119 | ul li > :first-child,
120 | ol li > :first-child,
121 | ul li ul:first-of-type,
122 | ol li ol:first-of-type,
123 | ul li ol:first-of-type,
124 | ol li ul:first-of-type {
125 | margin-top: 0px;
126 | }
127 |
128 | ul ul, ul ol, ol ol, ol ul {
129 | margin-bottom: 0;
130 | }
131 |
132 | dl {
133 | padding: 0;
134 | }
135 |
136 | dl dt {
137 | font-size: 14px;
138 | font-weight: bold;
139 | font-style: italic;
140 | padding: 0;
141 | margin: 15px 0 5px;
142 | }
143 |
144 | dl dt:first-child {
145 | padding: 0;
146 | }
147 |
148 | dl dt>:first-child {
149 | margin-top: 0px;
150 | }
151 |
152 | dl dt>:last-child {
153 | margin-bottom: 0px;
154 | }
155 |
156 | dl dd {
157 | margin: 0 0 15px;
158 | padding: 0 15px;
159 | }
160 |
161 | dl dd>:first-child {
162 | margin-top: 0px;
163 | }
164 |
165 | dl dd>:last-child {
166 | margin-bottom: 0px;
167 | }
168 |
169 | /* CODE
170 | =============================================================================*/
171 |
172 | pre, code, tt {
173 | font-size: 12px;
174 | font-family: Consolas, "Liberation Mono", Courier, monospace;
175 | }
176 |
177 | code, tt {
178 | margin: 0 0px;
179 | padding: 0px 0px;
180 | white-space: nowrap;
181 | border: 1px solid #eaeaea;
182 | background-color: #f8f8f8;
183 | border-radius: 3px;
184 | }
185 |
186 | pre>code {
187 | margin: 0;
188 | padding: 0;
189 | white-space: pre;
190 | border: none;
191 | background: transparent;
192 | }
193 |
194 | pre {
195 | background-color: #f8f8f8;
196 | border: 1px solid #ccc;
197 | font-size: 13px;
198 | line-height: 19px;
199 | overflow: auto;
200 | padding: 6px 10px;
201 | border-radius: 3px;
202 | }
203 |
204 | pre code, pre tt {
205 | background-color: transparent;
206 | border: none;
207 | }
208 |
209 | kbd {
210 | -moz-border-bottom-colors: none;
211 | -moz-border-left-colors: none;
212 | -moz-border-right-colors: none;
213 | -moz-border-top-colors: none;
214 | background-color: #DDDDDD;
215 | background-image: linear-gradient(#F1F1F1, #DDDDDD);
216 | background-repeat: repeat-x;
217 | border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
218 | border-image: none;
219 | border-radius: 2px 2px 2px 2px;
220 | border-style: solid;
221 | border-width: 1px;
222 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
223 | line-height: 10px;
224 | padding: 1px 4px;
225 | }
226 |
227 | /* QUOTES
228 | =============================================================================*/
229 |
230 | blockquote {
231 | border-left: 4px solid #DDD;
232 | padding: 0 15px;
233 | color: #777;
234 | }
235 |
236 | blockquote>:first-child {
237 | margin-top: 0px;
238 | }
239 |
240 | blockquote>:last-child {
241 | margin-bottom: 0px;
242 | }
243 |
244 | /* HORIZONTAL RULES
245 | =============================================================================*/
246 |
247 | hr {
248 | clear: both;
249 | margin: 15px 0;
250 | height: 0px;
251 | overflow: hidden;
252 | border: none;
253 | background: transparent;
254 | border-bottom: 4px solid #ddd;
255 | padding: 0;
256 | }
257 |
258 | /* TABLES
259 | =============================================================================*/
260 |
261 | table th {
262 | font-weight: bold;
263 | }
264 |
265 | table th, table td {
266 | border: 1px solid #ccc;
267 | padding: 6px 13px;
268 | }
269 |
270 | table tr {
271 | border-top: 1px solid #ccc;
272 | background-color: #fff;
273 | }
274 |
275 | table tr:nth-child(2n) {
276 | background-color: #f8f8f8;
277 | }
278 |
279 | /* IMAGES
280 | =============================================================================*/
281 |
282 | img {
283 | max-width: 100%
284 | }
--------------------------------------------------------------------------------