chore(i18n): sync translations with latest source changes (chunk 3/3, 76 changes)

update-translations
localizeflow[bot] 6 days ago
parent 4133cf4a2f
commit 87153f144f

File diff suppressed because one or more lines are too long

@ -0,0 +1,280 @@
# 使用数据Python和Pandas库
| ![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/07-WorkWithPython.png) |
| :-------------------------------------------------------------------------------------------------------: |
| 使用Python - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
[![介绍视频](../../../../translated_images/zh-CN/video-ds-python.245247dc811db8e4d5ac420246de8a118c63fd28f6a56578d08b630ae549f260.png)](https://youtu.be/dZjWOGbsN4Y)
虽然数据库提供了非常高效的方式来存储数据并通过查询语言进行查询但最灵活的数据处理方式是编写自己的程序来操作数据。在许多情况下使用数据库查询可能更有效。然而当需要更复杂的数据处理时SQL可能无法轻松完成。
数据处理可以用任何编程语言编写,但有些语言在处理数据方面更高级。数据科学家通常偏好以下语言之一:
* **[Python](https://www.python.org/)** 是一种通用编程语言由于其简单性通常被认为是初学者的最佳选择之一。Python有许多额外的库可以帮助解决许多实际问题例如从ZIP压缩文件中提取数据或将图片转换为灰度图像。除了数据科学Python还常用于Web开发。
* **[R](https://www.r-project.org/)** 是一个传统工具箱专为统计数据处理而开发。它包含大量的库资源CRAN使其成为数据处理的良好选择。然而R不是通用编程语言很少在数据科学领域之外使用。
* **[Julia](https://julialang.org/)** 是另一种专为数据科学开发的语言。它旨在提供比Python更好的性能是科学实验的绝佳工具。
在本课程中我们将重点使用Python进行简单的数据处理。我们假设您对该语言有基本的了解。如果您想深入学习Python可以参考以下资源
* [通过Turtle Graphics和分形趣味学习Python](https://github.com/shwars/pycourse) - 基于GitHub的Python编程快速入门课程
* [迈出Python的第一步](https://docs.microsoft.com/en-us/learn/paths/python-first-steps/?WT.mc_id=academic-77958-bethanycheum) [Microsoft Learn](http://learn.microsoft.com/?WT.mc_id=academic-77958-bethanycheum)上的学习路径
数据可以有多种形式。在本课程中,我们将讨论三种数据形式——**表格数据**、**文本**和**图像**。
我们将专注于一些数据处理的示例,而不是全面介绍所有相关库。这将帮助您了解主要的可能性,并让您知道在需要时可以在哪里找到解决问题的方法。
> **最有用的建议**:当您需要对数据执行某些操作但不知道如何操作时,请尝试在互联网上搜索。[Stackoverflow](https://stackoverflow.com/) 通常包含许多关于Python的典型任务的有用代码示例。
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/12)
## 表格数据和数据框
在我们讨论关系型数据库时您已经接触过表格数据。当您拥有大量数据并且数据存储在许多不同的关联表中时使用SQL来处理它是非常合理的。然而在许多情况下我们有一个数据表并需要对这些数据进行一些**理解**或**洞察**例如分布、值之间的相关性等。在数据科学中我们经常需要对原始数据进行一些转换然后进行可视化。这两个步骤都可以轻松使用Python完成。
Python中有两个最有用的库可以帮助您处理表格数据
* **[Pandas](https://pandas.pydata.org/)** 允许您操作所谓的**数据框Dataframes**,它类似于关系表。您可以拥有命名的列,并对行、列以及整个数据框执行不同的操作。
* **[Numpy](https://numpy.org/)** 是一个用于处理**张量Tensors**的库,即多维**数组Arrays**。数组的值具有相同的底层类型,它比数据框更简单,但提供了更多的数学操作,并减少了开销。
此外,还有几个您应该了解的库:
* **[Matplotlib](https://matplotlib.org/)** 是一个用于数据可视化和绘制图表的库
* **[SciPy](https://www.scipy.org/)** 是一个包含一些额外科学函数的库。我们在讨论概率和统计时已经接触过这个库
以下是您通常在Python程序开头导入这些库的代码
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import ... # you need to specify exact sub-packages that you need
```
Pandas围绕几个基本概念构建。
### Series序列
**Series** 是一组值类似于列表或numpy数组。主要区别在于Series还有一个**索引**当我们对Series进行操作例如相加会考虑索引。索引可以简单到整数行号从列表或数组创建Series时默认使用的索引也可以具有复杂结构例如日期区间。
> **注意**:在配套的笔记本文件 [`notebook.ipynb`](notebook.ipynb) 中有一些Pandas的入门代码。我们在这里仅概述一些示例您可以查看完整的笔记本文件。
举个例子:我们想分析冰淇淋店的销售情况。让我们生成一段时间内的销售数据(每天售出的商品数量):
```python
start_date = "Jan 1, 2020"
end_date = "Mar 31, 2020"
idx = pd.date_range(start_date,end_date)
print(f"Length of index is {len(idx)}")
items_sold = pd.Series(np.random.randint(25,50,size=len(idx)),index=idx)
items_sold.plot()
```
![时间序列图](../../../../translated_images/zh-CN/timeseries-1.80de678ab1cf727e50e00bcf24009fa2b0a8b90ebc43e34b99a345227d28e467.png)
假设每周我们都会举办一个朋友聚会并额外拿出10盒冰淇淋用于聚会。我们可以创建另一个以周为索引的Series来展示这一点
```python
additional_items = pd.Series(10,index=pd.date_range(start_date,end_date,freq="W"))
```
当我们将两个Series相加时就得到了总数
```python
total_items = items_sold.add(additional_items,fill_value=0)
total_items.plot()
```
![时间序列图](../../../../translated_images/zh-CN/timeseries-2.aae51d575c55181ceda81ade8c546a2fc2024f9136934386d57b8a189d7570ff.png)
> **注意** 我们没有使用简单的语法 `total_items+additional_items`。如果使用这种方法我们会在结果Series中得到许多`NaN`*Not a Number*)值。这是因为在`additional_items`的某些索引点上缺少值,而将`NaN`与任何值相加都会得到`NaN`。因此,我们需要在相加时指定`fill_value`参数。
对于时间序列,我们还可以使用不同的时间间隔对序列进行**重采样**。例如,假设我们想计算每月的平均销售量,可以使用以下代码:
```python
monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')
```
![每月时间序列平均值](../../../../translated_images/zh-CN/timeseries-3.f3147cbc8c624881008564bc0b5d9fcc15e7374d339da91766bd0e1c6bd9e3af.png)
### DataFrame数据框
数据框本质上是具有相同索引的多个Series的集合。我们可以将几个Series组合成一个数据框
```python
a = pd.Series(range(1,10))
b = pd.Series(["I","like","to","play","games","and","will","not","change"],index=range(0,9))
df = pd.DataFrame([a,b])
```
这将创建如下的水平表格:
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| --- | --- | ---- | --- | --- | ------ | --- | ------ | ---- | ---- |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 1 | I | like | to | use | Python | and | Pandas | very | much |
我们还可以将Series作为列并使用字典指定列名
```python
df = pd.DataFrame({ 'A' : a, 'B' : b })
```
这将生成如下表格:
| | A | B |
| --- | --- | ------ |
| 0 | 1 | I |
| 1 | 2 | like |
| 2 | 3 | to |
| 3 | 4 | use |
| 4 | 5 | Python |
| 5 | 6 | and |
| 6 | 7 | Pandas |
| 7 | 8 | very |
| 8 | 9 | much |
**注意** 我们还可以通过转置前一个表格来获得这种表格布局,例如:
```python
df = pd.DataFrame([a,b]).T..rename(columns={ 0 : 'A', 1 : 'B' })
```
这里`.T`表示转置数据框的操作,即交换行和列,而`rename`操作允许我们重命名列以匹配前面的示例。
以下是我们可以对数据框执行的一些最重要操作:
**列选择**。我们可以通过写`df['A']`选择单个列——此操作返回一个Series。我们还可以通过写`df[['B','A']]`选择列的子集到另一个数据框——此操作返回另一个数据框。
**按条件过滤**某些行。例如,要仅保留列`A`大于5的行可以写`df[df['A']>5]`。
> **注意**:过滤的工作原理如下。表达式`df['A']<5`返回一个布尔Series,指示原始Series`df['A']`中每个元素的表达式是否为`True`或`False`。当布尔Series用作索引时,它返回数据框中的行子集。因此,不能使用任意的Python布尔表达式,例如写`df[df['A']>5 and df['A']<7]`是错误的。相反,您应该使用布尔Series上的特殊`&`操作,写`df[(df['A']>5) & (df['A']<7)]`*括号在这里很重要*)。
**创建新的可计算列**。我们可以通过使用直观的表达式轻松为数据框创建新的可计算列:
```python
df['DivA'] = df['A']-df['A'].mean()
```
此示例计算列A与其平均值的偏差。这里实际发生的是我们计算了一个Series然后将其分配给左侧创建了另一个列。因此我们不能使用与Series不兼容的任何操作例如以下代码是错误的
```python
# Wrong code -> df['ADescr'] = "Low" if df['A'] < 5 else "Hi"
df['LenB'] = len(df['B']) # <- Wrong result
```
后一个示例虽然语法正确但会给出错误结果因为它将Series`B`的长度分配给列中的所有值,而不是分配给每个元素的长度。
如果我们需要计算类似这样的复杂表达式,可以使用`apply`函数。最后一个示例可以写成如下:
```python
df['LenB'] = df['B'].apply(lambda x : len(x))
# or
df['LenB'] = df['B'].apply(len)
```
经过上述操作后,我们将得到以下数据框:
| | A | B | DivA | LenB |
| --- | --- | ------ | ---- | ---- |
| 0 | 1 | I | -4.0 | 1 |
| 1 | 2 | like | -3.0 | 4 |
| 2 | 3 | to | -2.0 | 2 |
| 3 | 4 | use | -1.0 | 3 |
| 4 | 5 | Python | 0.0 | 6 |
| 5 | 6 | and | 1.0 | 3 |
| 6 | 7 | Pandas | 2.0 | 6 |
| 7 | 8 | very | 3.0 | 4 |
| 8 | 9 | much | 4.0 | 4 |
**基于数字选择行**可以使用`iloc`构造。例如要选择数据框的前5行
```python
df.iloc[:5]
```
**分组**通常用于获得类似Excel中*数据透视表*的结果。假设我们想计算列`A`的平均值,按`LenB`的不同值分组。我们可以按`LenB`分组数据框,然后调用`mean`
```python
df.groupby(by='LenB')[['A','DivA']].mean()
```
如果我们需要计算平均值和组中的元素数量,可以使用更复杂的`aggregate`函数:
```python
df.groupby(by='LenB') \
.aggregate({ 'DivA' : len, 'A' : lambda x: x.mean() }) \
.rename(columns={ 'DivA' : 'Count', 'A' : 'Mean'})
```
这将生成以下表格:
| LenB | Count | Mean |
| ---- | ----- | -------- |
| 1 | 1 | 1.000000 |
| 2 | 1 | 3.000000 |
| 3 | 2 | 5.000000 |
| 4 | 3 | 6.333333 |
| 6 | 2 | 6.000000 |
### 获取数据
我们已经看到,从 Python 对象构建 Series 和 DataFrame 是多么简单。然而,数据通常以文本文件或 Excel 表格的形式出现。幸运的是Pandas 为我们提供了一种简单的方法来从磁盘加载数据。例如,读取 CSV 文件就像这样简单:
```python
df = pd.read_csv('file.csv')
```
我们将在“挑战”部分中看到更多加载数据的示例,包括从外部网站获取数据。
### 打印和绘图
数据科学家经常需要探索数据,因此能够可视化数据非常重要。当 DataFrame 很大时,我们通常只需要打印出前几行以确保操作正确。这可以通过调用 `df.head()` 来完成。如果你在 Jupyter Notebook 中运行,它会以漂亮的表格形式打印出 DataFrame。
我们还见过使用 `plot` 函数来可视化某些列的用法。虽然 `plot` 对许多任务非常有用,并通过 `kind=` 参数支持多种不同的图表类型,但你也可以使用原始的 `matplotlib` 库来绘制更复杂的内容。我们将在单独的课程中详细讲解数据可视化。
这个概述涵盖了 Pandas 的重要概念,但这个库非常丰富,你可以用它做无限多的事情!现在让我们应用这些知识来解决具体问题。
## 🚀 挑战 1分析 COVID 传播
我们将关注的第一个问题是 COVID-19 的流行病传播建模。为此,我们将使用由 [约翰霍普金斯大学](https://jhu.edu/) [系统科学与工程中心](https://systems.jhu.edu/) (CSSE) 提供的不同国家感染人数数据。数据集可以在 [这个 GitHub 仓库](https://github.com/CSSEGISandData/COVID-19) 中找到。
由于我们想演示如何处理数据,我们邀请你打开 [`notebook-covidspread.ipynb`](notebook-covidspread.ipynb) 并从头到尾阅读。你也可以执行单元格,并完成我们在最后留下的一些挑战。
![COVID 传播](../../../../translated_images/zh-CN/covidspread.f3d131c4f1d260ab0344d79bac0abe7924598dd754859b165955772e1bd5e8a2.png)
> 如果你不知道如何在 Jupyter Notebook 中运行代码,可以查看 [这篇文章](https://soshnikov.com/education/how-to-execute-notebooks-from-github/)。
## 处理非结构化数据
虽然数据通常以表格形式出现,但在某些情况下我们需要处理较少结构化的数据,例如文本或图像。在这种情况下,为了应用我们上面看到的数据处理技术,我们需要以某种方式**提取**结构化数据。以下是一些示例:
* 从文本中提取关键词,并查看这些关键词出现的频率
* 使用神经网络从图片中提取有关对象的信息
* 获取视频摄像头画面中人物的情绪信息
## 🚀 挑战 2分析 COVID 论文
在这个挑战中,我们将继续讨论 COVID 疫情的主题,重点处理关于该主题的科学论文。有一个 [CORD-19 数据集](https://www.kaggle.com/allen-institute-for-ai/CORD-19-research-challenge),其中包含超过 7000 篇(撰写时)关于 COVID 的论文,提供了元数据和摘要(其中约一半还提供了全文)。
使用 [Text Analytics for Health](https://docs.microsoft.com/azure/cognitive-services/text-analytics/how-tos/text-analytics-for-health/?WT.mc_id=academic-77958-bethanycheum) 认知服务分析此数据集的完整示例已在 [这篇博客文章](https://soshnikov.com/science/analyzing-medical-papers-with-azure-and-text-analytics-for-health/) 中描述。我们将讨论此分析的简化版本。
> **NOTE**: 我们没有在此仓库中提供数据集副本。你可能需要先从 [Kaggle 上的这个数据集](https://www.kaggle.com/allen-institute-for-ai/CORD-19-research-challenge?select=metadata.csv) 下载 [`metadata.csv`](https://www.kaggle.com/allen-institute-for-ai/CORD-19-research-challenge?select=metadata.csv) 文件。可能需要注册 Kaggle。你也可以从 [这里](https://ai2-semanticscholar-cord-19.s3-us-west-2.amazonaws.com/historical_releases.html) 下载数据集,无需注册,但它将包括所有全文以及元数据文件。
打开 [`notebook-papers.ipynb`](notebook-papers.ipynb) 并从头到尾阅读。你也可以执行单元格,并完成我们在最后留下的一些挑战。
![COVID 医疗处理](../../../../translated_images/zh-CN/covidtreat.b2ba59f57ca45fbcda36e0ddca3f8cfdddeeed6ca879ea7f866d93fa6ec65791.png)
## 处理图像数据
最近,开发了非常强大的 AI 模型,可以帮助我们理解图像。通过预训练的神经网络或云服务,可以解决许多任务。一些示例包括:
* **图像分类**,可以帮助你将图像分类到预定义的类别中。你可以使用诸如 [Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77958-bethanycheum) 的服务轻松训练自己的图像分类器。
* **对象检测**,用于检测图像中的不同对象。诸如 [计算机视觉](https://azure.microsoft.com/services/cognitive-services/computer-vision/?WT.mc_id=academic-77958-bethanycheum) 的服务可以检测许多常见对象,你也可以训练 [Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77958-bethanycheum) 模型来检测一些特定的兴趣对象。
* **人脸检测**,包括年龄、性别和情绪检测。这可以通过 [Face API](https://azure.microsoft.com/services/cognitive-services/face/?WT.mc_id=academic-77958-bethanycheum) 完成。
所有这些云服务都可以通过 [Python SDKs](https://docs.microsoft.com/samples/azure-samples/cognitive-services-python-sdk-samples/cognitive-services-python-sdk-samples/?WT.mc_id=academic-77958-bethanycheum) 调用,因此可以轻松地集成到你的数据探索工作流中。
以下是一些从图像数据源探索数据的示例:
* 在博客文章 [如何在没有编码的情况下学习数据科学](https://soshnikov.com/azure/how-to-learn-data-science-without-coding/) 中,我们探索 Instagram 照片,试图了解是什么让人们对照片点赞更多。我们首先使用 [计算机视觉](https://azure.microsoft.com/services/cognitive-services/computer-vision/?WT.mc_id=academic-77958-bethanycheum) 从图片中提取尽可能多的信息,然后使用 [Azure Machine Learning AutoML](https://docs.microsoft.com/azure/machine-learning/concept-automated-ml/?WT.mc_id=academic-77958-bethanycheum) 构建可解释的模型。
* 在 [面部研究工作坊](https://github.com/CloudAdvocacy/FaceStudies) 中,我们使用 [Face API](https://azure.microsoft.com/services/cognitive-services/face/?WT.mc_id=academic-77958-bethanycheum) 提取活动照片中人物的情绪,以试图了解是什么让人们感到快乐。
## 结论
无论你已经拥有结构化数据还是非结构化数据,使用 Python 都可以完成与数据处理和理解相关的所有步骤。这可能是数据处理最灵活的方式,这也是为什么大多数数据科学家将 Python 作为主要工具的原因。如果你对数据科学之旅很认真,深入学习 Python 可能是一个好主意!
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/13)
## 复习与自学
**书籍**
* [Wes McKinney. Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython](https://www.amazon.com/gp/product/1491957662)
**在线资源**
* 官方 [10 分钟 Pandas](https://pandas.pydata.org/pandas-docs/stable/user_guide/10min.html) 教程
* [Pandas 可视化文档](https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html)
**学习 Python**
* [通过 Turtle Graphics 和分形以有趣的方式学习 Python](https://github.com/shwars/pycourse)
* [迈出 Python 的第一步](https://docs.microsoft.com/learn/paths/python-first-steps/?WT.mc_id=academic-77958-bethanycheum) 在 [Microsoft Learn](http://learn.microsoft.com/?WT.mc_id=academic-77958-bethanycheum) 上的学习路径
## 作业
[对上述挑战进行更详细的数据研究](assignment.md)
## 致谢
本课程由 [Dmitry Soshnikov](http://soshnikov.com) 倾情创作。
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,26 @@
# Python数据处理作业
在本次作业中,我们将要求你详细阐述我们在挑战中开始开发的代码。作业分为两个部分:
## COVID-19传播建模
- [ ] 在一个图中绘制5-6个不同国家的 *R* 图进行比较,或者使用多个图并排展示。
- [ ] 查看死亡人数和康复人数与感染病例数量之间的相关性。
- [ ] 通过视觉上关联感染率和死亡率并寻找一些异常情况,找出一种典型疾病的持续时间。你可能需要查看不同国家的数据来得出结论。
- [ ] 计算病死率及其随时间的变化。*你可能需要考虑疾病持续的天数,将一个时间序列进行偏移后再进行计算。*
## COVID-19论文分析
- [ ] 构建不同药物的共现矩阵,查看哪些药物经常一起出现(即在一个摘要中被提到)。你可以修改用于构建药物和诊断共现矩阵的代码。
- [ ] 使用热图可视化该矩阵。
- [ ] 作为一个扩展目标,使用[弦图](https://en.wikipedia.org/wiki/Chord_diagram)可视化药物的共现情况。[这个库](https://pypi.org/project/chord/)可能会帮助你绘制弦图。
- [ ] 作为另一个扩展目标,使用正则表达式提取不同药物的剂量(例如 *每天服用400mg氯喹中的**400mg***),并构建一个数据框,显示不同药物的不同剂量。**注意**:考虑药物名称附近的数值。
## 评分标准
优秀 | 合格 | 需改进
--- | --- | -- |
所有任务完成,图形化展示并解释清楚,包括至少一个扩展目标 | 完成超过5个任务但未尝试扩展目标或结果不够清晰 | 完成少于5个但超过3个任务图形化展示未能有效说明问题
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,336 @@
# 数据处理:数据准备
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/08-DataPreparation.png)|
|:---:|
|数据准备 - _由 [@nitya](https://twitter.com/nitya) 绘制的速记图_ |
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/14)
根据数据来源,原始数据可能存在一些不一致性,这会在分析和建模时带来挑战。换句话说,这些数据可以被归类为“脏数据”,需要进行清理。本课程重点介绍清理和转换数据的技术,以解决数据缺失、不准确或不完整的问题。本课程中涉及的主题将使用 Python 和 Pandas 库,并在本目录中的[笔记本](../../../../2-Working-With-Data/08-data-preparation/notebook.ipynb)中进行演示。
## 清理数据的重要性
- **易于使用和复用**:当数据被正确组织和规范化时,更容易搜索、使用和与他人共享。
- **一致性**:数据科学通常需要处理多个数据集,不同来源的数据集需要合并在一起。确保每个单独的数据集具有统一的标准化,可以保证在合并为一个数据集时数据仍然有用。
- **模型准确性**:清理过的数据可以提高依赖于这些数据的模型的准确性。
## 常见的清理目标和策略
- **探索数据集**:数据探索(将在[后续课程](https://github.com/microsoft/Data-Science-For-Beginners/tree/main/4-Data-Science-Lifecycle/15-analyzing)中介绍)可以帮助发现需要清理的数据。通过可视化观察数据集中的值,可以设定对其余数据的期望,或者提供解决问题的思路。探索可以包括基本查询、可视化和采样。
- **格式化**:根据数据来源,数据在呈现方式上可能存在不一致性。这会导致在搜索和表示值时出现问题,数据虽然在数据集中存在,但在可视化或查询结果中未正确表示。常见的格式化问题包括解决空白、日期和数据类型问题。解决格式化问题通常由使用数据的人来决定。例如,不同国家对日期和数字的表示标准可能不同。
- **重复数据**:重复数据可能会产生不准确的结果,通常需要删除。这在合并两个或多个数据集时很常见。然而,有些情况下,合并数据集中的重复数据可能包含额外信息,需要保留。
- **缺失数据**:缺失数据可能导致结果不准确或偏差。有时可以通过重新加载数据、使用 Python 等代码填充缺失值,或者简单地删除缺失值及其相关数据来解决。数据缺失的原因有很多,解决缺失值的方式可能取决于数据缺失的原因和方式。
## 探索 DataFrame 信息
> **学习目标**:在本小节结束时,您应该能够熟练地查找存储在 pandas DataFrame 中的数据的一般信息。
将数据加载到 pandas 后,通常会以 DataFrame 的形式存在(详细概述请参考之前的[课程](https://github.com/microsoft/Data-Science-For-Beginners/tree/main/2-Working-With-Data/07-python#dataframe))。然而,如果您的 DataFrame 数据集有 60,000 行和 400 列,如何开始了解您正在处理的数据?幸运的是,[pandas](https://pandas.pydata.org/) 提供了一些方便的工具,可以快速查看 DataFrame 的整体信息以及前几行和后几行。
为了探索这些功能,我们将导入 Python 的 scikit-learn 库,并使用一个经典数据集:**Iris 数据集**。
```python
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
iris_df = pd.DataFrame(data=iris['data'], columns=iris['feature_names'])
```
| |sepal length (cm)|sepal width (cm)|petal length (cm)|petal width (cm)|
|----------------------------------------|-----------------|----------------|-----------------|----------------|
|0 |5.1 |3.5 |1.4 |0.2 |
|1 |4.9 |3.0 |1.4 |0.2 |
|2 |4.7 |3.2 |1.3 |0.2 |
|3 |4.6 |3.1 |1.5 |0.2 |
|4 |5.0 |3.6 |1.4 |0.2 |
- **DataFrame.info**:首先,`info()` 方法用于打印 `DataFrame` 中内容的摘要。让我们看看这个数据集包含哪些内容:
```python
iris_df.info()
```
```
RangeIndex: 150 entries, 0 to 149
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepal length (cm) 150 non-null float64
1 sepal width (cm) 150 non-null float64
2 petal length (cm) 150 non-null float64
3 petal width (cm) 150 non-null float64
dtypes: float64(4)
memory usage: 4.8 KB
```
从中我们可以知道,*Iris* 数据集有 150 条记录,分布在四列中,没有空值。所有数据都存储为 64 位浮点数。
- **DataFrame.head()**:接下来,为了检查 `DataFrame` 的实际内容,我们使用 `head()` 方法。让我们看看 `iris_df` 的前几行:
```python
iris_df.head()
```
```
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
```
- **DataFrame.tail()**:相反,为了检查 `DataFrame` 的最后几行,我们使用 `tail()` 方法:
```python
iris_df.tail()
```
```
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8
```
> **总结**:仅通过查看 DataFrame 的元数据或前几行和后几行的值,您就可以立即了解您正在处理的数据的大小、形状和内容。
## 处理缺失数据
> **学习目标**:在本小节结束时,您应该知道如何替换或删除 DataFrame 中的空值。
大多数时候,您想使用(或必须使用)的数据集中会有缺失值。处理缺失数据时需要权衡,这可能会影响最终分析和实际结果。
Pandas 处理缺失值有两种方式。第一种您在之前的章节中已经见过:`NaN`,即非数字。这实际上是 IEEE 浮点规范的一部分,用于表示缺失的浮点值。
对于浮点值以外的缺失值pandas 使用 Python 的 `None` 对象。虽然同时遇到两种表示缺失值的方式可能会让人困惑,但这种设计选择有其合理的编程原因,实际上,这种方式为绝大多数情况提供了良好的折中方案。尽管如此,`None` 和 `NaN` 都有一些限制,您需要注意它们的使用方式。
在[笔记本](https://github.com/microsoft/Data-Science-For-Beginners/blob/main/4-Data-Science-Lifecycle/15-analyzing/notebook.ipynb)中了解更多关于 `NaN``None` 的信息!
- **检测空值**:在 `pandas` 中,`isnull()` 和 `notnull()` 方法是检测空数据的主要方法。两者都会返回数据的布尔掩码。我们将使用 `numpy` 来处理 `NaN` 值:
```python
import numpy as np
example1 = pd.Series([0, np.nan, '', None])
example1.isnull()
```
```
0 False
1 True
2 False
3 True
dtype: bool
```
仔细观察输出。是否有任何结果让您感到惊讶?虽然 `0` 是一个算术上的空值但它仍然是一个有效的整数pandas 将其视为有效值。`''` 则稍微复杂一些。虽然我们在第 1 节中用它表示空字符串值,但它仍然是一个字符串对象,而不是 pandas 所认为的空值。
现在,让我们反过来以更实际的方式使用这些方法。您可以直接将布尔掩码用作 `Series``DataFrame` 的索引,这在处理孤立的缺失值(或存在值)时非常有用。
> **总结**:在 `DataFrame` 中使用 `isnull()``notnull()` 方法时,它们会显示结果及其索引,这在处理数据时非常有帮助。
- **删除空值**除了识别缺失值pandas 还提供了一种方便的方法来从 `Series``DataFrame` 中删除空值。(特别是在处理大型数据集时,通常建议直接删除缺失值,而不是以其他方式处理它们。)让我们回到 `example1` 来看看实际效果:
```python
example1 = example1.dropna()
example1
```
```
0 0
2
dtype: object
```
注意,这应该与您的 `example3[example3.notnull()]` 输出类似。不同之处在于,`dropna` 删除了 `Series` `example1` 中的缺失值,而不是仅仅索引掩码值。
由于 `DataFrame` 是二维的,它提供了更多删除数据的选项。
```python
example2 = pd.DataFrame([[1, np.nan, 7],
[2, 5, 8],
[np.nan, 6, 9]])
example2
```
| | 0 | 1 | 2 |
|------|---|---|---|
|0 |1.0|NaN|7 |
|1 |2.0|5.0|8 |
|2 |NaN|6.0|9 |
(您是否注意到 pandas 将两列数据提升为浮点类型以容纳 `NaN`
您无法从 `DataFrame` 中删除单个值因此必须删除整行或整列。根据您的需求您可能需要删除其中之一pandas 提供了两者的选项。由于在数据科学中,列通常表示变量,行表示观察值,您更可能删除数据行;`dropna()` 的默认设置是删除所有包含任何空值的行:
```python
example2.dropna()
```
```
0 1 2
1 2.0 5.0 8
```
如果需要,您可以从列中删除 NA 值。使用 `axis=1` 来实现:
```python
example2.dropna(axis='columns')
```
```
2
0 7
1 8
2 9
```
注意,这可能会删除您可能想保留的大量数据,特别是在较小的数据集中。如果您只想删除包含多个或所有空值的行或列,可以在 `dropna` 中使用 `how``thresh` 参数指定这些设置。
默认情况下,`how='any'`(如果您想自己检查或查看方法的其他参数,请在代码单元中运行 `example4.dropna?`)。您也可以指定 `how='all'`,以便仅删除包含所有空值的行或列。让我们扩展示例 `DataFrame` 来看看实际效果。
```python
example2[3] = np.nan
example2
```
| |0 |1 |2 |3 |
|------|---|---|---|---|
|0 |1.0|NaN|7 |NaN|
|1 |2.0|5.0|8 |NaN|
|2 |NaN|6.0|9 |NaN|
`thresh` 参数提供了更细粒度的控制:您可以设置行或列需要具有的*非空值*数量,以便保留:
```python
example2.dropna(axis='rows', thresh=3)
```
```
0 1 2 3
1 2.0 5.0 8 NaN
```
这里,第一行和最后一行被删除,因为它们只有两个非空值。
- **填充空值**:根据您的数据集,有时填充空值比删除它们更合理。您可以使用 `isnull` 来就地填充但这可能很费力特别是当您有很多值需要填充时。由于这是数据科学中的常见任务pandas 提供了 `fillna` 方法,它返回一个 `Series``DataFrame` 的副本,其中的缺失值被替换为您选择的值。让我们创建另一个示例 `Series` 来看看实际效果。
```python
example3 = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
example3
```
```
a 1.0
b NaN
c 2.0
d NaN
e 3.0
dtype: float64
```
您可以用单个值(例如 `0`)填充所有空条目:
```python
example3.fillna(0)
```
```
a 1.0
b 0.0
c 2.0
d 0.0
e 3.0
dtype: float64
```
您可以**向前填充**空值,即使用最后一个有效值填充空值:
```python
example3.fillna(method='ffill')
```
```
a 1.0
b 1.0
c 2.0
d 2.0
e 3.0
dtype: float64
```
您也可以**向后填充**,即将下一个有效值向后传播以填充空值:
```python
example3.fillna(method='bfill')
```
```
a 1.0
b 2.0
c 2.0
d 3.0
e 3.0
dtype: float64
```
正如您可能猜到的,这对 `DataFrame` 同样适用,但您还可以指定填充空值的 `axis`。再次使用之前的 `example2`
```python
example2.fillna(method='ffill', axis=1)
```
```
0 1 2 3
0 1.0 1.0 7.0 7.0
1 2.0 5.0 8.0 8.0
2 NaN 6.0 9.0 9.0
```
注意,当没有可用的前一个值进行向前填充时,空值仍然保留。
> **要点:** 处理数据集中缺失值的方法有很多种。具体采用哪种策略(删除、替换,甚至是如何替换)应根据数据的具体情况来决定。随着你处理和分析数据集的经验不断增加,你会逐渐形成更好的应对缺失值的直觉和方法。
## 删除重复数据
> **学习目标:** 在本小节结束时,您应该能够熟练识别并删除 DataFrame 中的重复值。
除了缺失数据之外,您在实际数据集中还会经常遇到重复数据。幸运的是,`pandas` 提供了一种简单的方法来检测和删除重复条目。
- **识别重复项:`duplicated`**:您可以使用 pandas 中的 `duplicated` 方法轻松找到重复值,该方法返回一个布尔掩码,指示 `DataFrame` 中某个条目是否与之前的条目重复。让我们创建另一个示例 `DataFrame` 来实际操作一下。
```python
example4 = pd.DataFrame({'letters': ['A','B'] * 2 + ['B'],
'numbers': [1, 2, 1, 3, 3]})
example4
```
| |letters|numbers|
|------|-------|-------|
|0 |A |1 |
|1 |B |2 |
|2 |A |1 |
|3 |B |3 |
|4 |B |3 |
```python
example4.duplicated()
```
```
0 False
1 False
2 True
3 False
4 True
dtype: bool
```
- **删除重复项:`drop_duplicates`**:简单地返回一个数据副本,其中所有 `duplicated` 值均为 `False`
```python
example4.drop_duplicates()
```
```
letters numbers
0 A 1
1 B 2
3 B 3
```
`duplicated``drop_duplicates` 默认会考虑所有列,但您可以指定它们仅检查 `DataFrame` 中的某些列:
```python
example4.drop_duplicates(['letters'])
```
```
letters numbers
0 A 1
1 B 2
```
> **要点:** 删除重复数据是几乎每个数据科学项目中的重要步骤。重复数据可能会改变您的分析结果并导致不准确的结论!
## 🚀 挑战
所有讨论的材料都提供为 [Jupyter Notebook](https://github.com/microsoft/Data-Science-For-Beginners/blob/main/2-Working-With-Data/08-data-preparation/notebook.ipynb)。此外,每个部分后面都有练习,试着完成它们吧!
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/15)
## 复习与自学
有很多方法可以发现和处理数据准备工作,用于分析和建模,而清理数据是一个需要“动手实践”的重要步骤。试试 Kaggle 上的这些挑战,探索本课未涉及的技术。
- [数据清理挑战:解析日期](https://www.kaggle.com/rtatman/data-cleaning-challenge-parsing-dates/)
- [数据清理挑战:数据缩放与归一化](https://www.kaggle.com/rtatman/data-cleaning-challenge-scale-and-normalize-data)
## 作业
[评估表单数据](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们概不负责。

File diff suppressed because one or more lines are too long

@ -0,0 +1,17 @@
# 评估表单数据
一位客户正在测试一个[小型表单](../../../../2-Working-With-Data/08-data-preparation/index.html),以收集有关其客户群的一些基本数据。他们将测试结果带给你,希望你验证他们收集的数据。你可以在浏览器中打开 `index.html` 页面查看表单。
你已获得一个[包含表单记录的 CSV 数据集](../../../../data/form.csv),其中包括表单的条目以及一些基本的可视化图表。客户指出其中一些可视化图表看起来不正确,但他们不确定如何解决这些问题。你可以在[任务笔记本](../../../../2-Working-With-Data/08-data-preparation/assignment.ipynb)中进行探索。
## 指导
使用本课程中的技术提出建议,以确保表单能够收集准确且一致的信息。
## 评分标准
优秀 | 合格 | 需要改进
--- | --- | --- |
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。虽然我们尽力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,20 @@
# 数据处理
![data love](../../../translated_images/zh-CN/data-love.a22ef29e6742c852505ada062920956d3d7604870b281a8ca7c7ac6f37381d5a.jpg)
> 图片由 <a href="https://unsplash.com/@swimstaralex?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Alexander Sinn</a> 提供,来自 <a href="https://unsplash.com/s/photos/data?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
在这些课程中,您将学习一些管理、操作和在应用程序中使用数据的方法。您将了解关系型和非关系型数据库,以及数据如何存储在其中。您将学习使用 Python 管理数据的基础知识,并探索多种使用 Python 管理和挖掘数据的方法。
### 主题
1. [关系型数据库](05-relational-databases/README.md)
2. [非关系型数据库](06-non-relational/README.md)
3. [使用 Python](07-python/README.md)
4. [准备数据](08-data-preparation/README.md)
### 致谢
这些课程由 [Christopher Harrison](https://twitter.com/geektrainer)、[Dmitry Soshnikov](https://twitter.com/shwars) 和 [Jasmine Greenaway](https://twitter.com/paladique) ❤️ 精心编写。
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,213 @@
# 可视化数量
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/09-Visualizing-Quantities.png)|
|:---:|
| 可视化数量 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
在本课中,您将学习如何使用众多可用的 Python 库之一,围绕数量的概念创建有趣的可视化。通过一个关于明尼苏达州鸟类的清理数据集,您可以了解许多关于当地野生动物的有趣事实。
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/16)
## 使用 Matplotlib 观察翼展
一个非常优秀的库可以用来创建各种简单和复杂的图表和图形,它就是 [Matplotlib](https://matplotlib.org/stable/index.html)。一般来说,使用这些库绘制数据的过程包括:确定数据框中您想要处理的部分,对数据进行必要的转换,分配 x 和 y 轴的值决定显示哪种图表然后显示图表。Matplotlib 提供了多种可视化方式,但在本课中,我们将重点关注最适合可视化数量的图表类型:折线图、散点图和柱状图。
> ✅ 根据数据结构和您想讲述的故事选择最佳图表:
> - 分析时间趋势:折线图
> - 比较数值:柱状图、条形图、饼图、散点图
> - 展示部分与整体的关系:饼图
> - 展示数据分布:散点图、柱状图
> - 展示趋势:折线图、条形图
> - 展示数值之间的关系:折线图、散点图、气泡图
如果您有一个数据集并需要了解某个项目的数量,第一步通常是检查其数值。
✅ Matplotlib 有非常好的“速查表”,可以在 [这里](https://matplotlib.org/cheatsheets/cheatsheets.pdf) 找到。
## 绘制鸟类翼展值的折线图
打开本课文件夹根目录中的 `notebook.ipynb` 文件并添加一个单元格。
> 注意:数据存储在本仓库的 `/data` 文件夹中。
```python
import pandas as pd
import matplotlib.pyplot as plt
birds = pd.read_csv('../../data/birds.csv')
birds.head()
```
这些数据是文本和数字的混合:
| | 名称 | 学名 | 类别 | 目 | 科 | 属 | 保护状态 | 最小长度 | 最大长度 | 最小体重 | 最大体重 | 最小翼展 | 最大翼展 |
| ---: | :--------------------------- | :--------------------- | :-------------------- | :----------- | :------- | :---------- | :----------------- | --------: | --------: | ----------: | ----------: | ----------: | ----------: |
| 0 | 黑腹哨鸭 | Dendrocygna autumnalis | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 哨鸭属 | LC | 47 | 56 | 652 | 1020 | 76 | 94 |
| 1 | 棕哨鸭 | Dendrocygna bicolor | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 哨鸭属 | LC | 45 | 53 | 712 | 1050 | 85 | 93 |
| 2 | 雪鹅 | Anser caerulescens | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 雁属 | LC | 64 | 79 | 2050 | 4050 | 135 | 165 |
| 3 | 罗斯鹅 | Anser rossii | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 雁属 | LC | 57.3 | 64 | 1066 | 1567 | 113 | 116 |
| 4 | 大白额鹅 | Anser albifrons | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 雁属 | LC | 64 | 81 | 1930 | 3310 | 130 | 165 |
让我们从使用基本折线图绘制一些数值数据开始。假设您想查看这些有趣鸟类的最大翼展。
```python
wingspan = birds['MaxWingspan']
wingspan.plot()
```
![最大翼展](../../../../3-Data-Visualization/09-visualization-quantities/images/max-wingspan-02.png)
您立刻注意到了什么似乎至少有一个异常值——这翼展也太大了吧2300 厘米的翼展相当于 23 米——明尼苏达州有翼龙在飞吗?让我们调查一下。
虽然您可以在 Excel 中快速排序找到这些异常值(可能是输入错误),但继续从图表中进行可视化处理。
为 x 轴添加标签以显示涉及的鸟类类型:
```
plt.title('Max Wingspan in Centimeters')
plt.ylabel('Wingspan (CM)')
plt.xlabel('Birds')
plt.xticks(rotation=45)
x = birds['Name']
y = birds['MaxWingspan']
plt.plot(x, y)
plt.show()
```
![带标签的翼展](../../../../3-Data-Visualization/09-visualization-quantities/images/max-wingspan-labels-02.png)
即使标签旋转了 45 度,仍然太多了,无法阅读。让我们尝试另一种策略:仅标记异常值,并在图表内设置标签。您可以使用散点图为标签腾出更多空间:
```python
plt.title('Max Wingspan in Centimeters')
plt.ylabel('Wingspan (CM)')
plt.tick_params(axis='both',which='both',labelbottom=False,bottom=False)
for i in range(len(birds)):
x = birds['Name'][i]
y = birds['MaxWingspan'][i]
plt.plot(x, y, 'bo')
if birds['MaxWingspan'][i] > 500:
plt.text(x, y * (1 - 0.05), birds['Name'][i], fontsize=12)
plt.show()
```
这里发生了什么?您使用 `tick_params` 隐藏了底部标签,然后对鸟类数据集进行了循环。通过使用 `bo` 绘制带有小圆蓝点的图表,您检查了任何最大翼展超过 500 的鸟类,并在点旁边显示其标签。您在 y 轴上稍微偏移了标签 (`y * (1 - 0.05)`) 并使用鸟类名称作为标签。
您发现了什么?
![异常值](../../../../3-Data-Visualization/09-visualization-quantities/images/labeled-wingspan-02.png)
## 筛选数据
秃鹰和草原隼虽然可能是非常大的鸟类,但它们的最大翼展似乎被错误标记了,多加了一个 `0`。遇到翼展 25 米的秃鹰的可能性不大,但如果真的遇到了,请告诉我们!让我们创建一个新的数据框,去掉这两个异常值:
```python
plt.title('Max Wingspan in Centimeters')
plt.ylabel('Wingspan (CM)')
plt.xlabel('Birds')
plt.tick_params(axis='both',which='both',labelbottom=False,bottom=False)
for i in range(len(birds)):
x = birds['Name'][i]
y = birds['MaxWingspan'][i]
if birds['Name'][i] not in ['Bald eagle', 'Prairie falcon']:
plt.plot(x, y, 'bo')
plt.show()
```
通过筛选异常值,您的数据现在更加连贯和易于理解。
![翼展散点图](../../../../3-Data-Visualization/09-visualization-quantities/images/scatterplot-wingspan-02.png)
现在我们至少在翼展方面有了一个更干净的数据集,让我们进一步了解这些鸟类。
虽然折线图和散点图可以显示数据值及其分布的信息,但我们想要思考这个数据集中固有的数值。您可以创建可视化来回答以下关于数量的问题:
> 有多少种鸟类类别?它们的数量是多少?
> 有多少鸟类是灭绝的、濒危的、稀有的或常见的?
> 在林奈分类法中,各种属和目有多少?
## 探索柱状图
当您需要展示数据分组时,柱状图非常实用。让我们探索这个数据集中存在的鸟类类别,看看哪种类别的数量最多。
在 notebook 文件中创建一个基本柱状图。
✅ 注意,您可以筛选掉我们在上一节中识别的两个异常鸟类,编辑它们翼展中的错误,或者将它们保留在这些不依赖翼展值的练习中。
如果您想创建柱状图,可以选择您想要关注的数据。柱状图可以从原始数据创建:
```python
birds.plot(x='Category',
kind='bar',
stacked=True,
title='Birds of Minnesota')
```
![完整数据柱状图](../../../../3-Data-Visualization/09-visualization-quantities/images/full-data-bar-02.png)
然而,这个柱状图难以阅读,因为数据没有分组。您需要选择您想要绘制的数据,因此让我们根据鸟类类别查看鸟类的长度。
筛选数据以仅包含鸟类类别。
✅ 注意,您使用 Pandas 管理数据,然后让 Matplotlib 进行图表绘制。
由于类别较多,您可以垂直显示此图表并调整其高度以适应所有数据:
```python
category_count = birds.value_counts(birds['Category'].values, sort=True)
plt.rcParams['figure.figsize'] = [6, 12]
category_count.plot.barh()
```
![类别和长度](../../../../3-Data-Visualization/09-visualization-quantities/images/category-counts-02.png)
这个柱状图很好地展示了每个类别中鸟类的数量。一眼就能看出,这个地区数量最多的鸟类是鸭/鹅/水禽类别。明尼苏达州是“万湖之地”,这并不令人惊讶!
✅ 尝试对这个数据集进行其他计数。有任何让您感到惊讶的发现吗?
## 数据比较
您可以通过创建新轴尝试不同的分组数据比较。尝试比较鸟类的最大长度,基于其类别:
```python
maxlength = birds['MaxLength']
plt.barh(y=birds['Category'], width=maxlength)
plt.rcParams['figure.figsize'] = [6, 12]
plt.show()
```
![数据比较](../../../../3-Data-Visualization/09-visualization-quantities/images/category-length-02.png)
这里没有什么令人惊讶的:与鹈鹕或鹅相比,蜂鸟的最大长度最小。当数据符合逻辑时,这是件好事!
您可以通过叠加数据创建更有趣的柱状图。让我们叠加最小长度和最大长度在给定鸟类类别上的数据:
```python
minLength = birds['MinLength']
maxLength = birds['MaxLength']
category = birds['Category']
plt.barh(category, maxLength)
plt.barh(category, minLength)
plt.show()
```
在这个图表中,您可以看到每个鸟类类别的最小长度和最大长度范围。可以肯定地说,根据这些数据,鸟越大,其长度范围越大。真是令人着迷!
![叠加值](../../../../3-Data-Visualization/09-visualization-quantities/images/superimposed-02.png)
## 🚀 挑战
这个鸟类数据集提供了关于特定生态系统中不同类型鸟类的大量信息。在网上搜索,看看是否能找到其他与鸟类相关的数据集。练习围绕这些鸟类构建图表和图形,发现您之前未曾意识到的事实。
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/17)
## 复习与自学
本课的第一部分为您提供了一些关于如何使用 Matplotlib 可视化数量的信息。研究其他可视化数据集的方法。[Plotly](https://github.com/plotly/plotly.py) 是我们不会在这些课程中涵盖的一个库,可以看看它能提供什么。
## 作业
[折线图、散点图和柱状图](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,14 @@
# 折线图、散点图和柱状图
## 说明
在本课中,你学习了如何使用折线图、散点图和柱状图来展示数据集中的有趣事实。在本次作业中,请深入挖掘数据集,发现关于某种鸟类的一个事实。例如,可以创建一个笔记本,展示你能找到的关于雪雁的所有有趣数据。使用上述三种图表,在你的笔记本中讲述一个故事。
## 评分标准
优秀 | 合格 | 需改进
--- | --- | --- |
笔记本包含良好的注释、清晰的故事叙述以及吸引人的图表 | 笔记本缺少其中一个要素 | 笔记本缺少两个要素
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的原始语言版本为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而引起的任何误解或误读不承担责任。

@ -0,0 +1,96 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# 一起来了解鸟类吧\n",
"\n",
"鸟类是地球上最迷人的生物之一。它们的多样性、适应性以及与环境的互动方式让人惊叹不已。\n",
"\n",
"## 鸟类的基本特征\n",
"\n",
"鸟类有一些独特的特征,使它们与其他动物区别开来:\n",
"\n",
"- **羽毛**:羽毛是鸟类的标志性特征,它们不仅提供保温,还能帮助飞行。\n",
"- **喙**:鸟类没有牙齿,它们用喙来进食、筑巢和防御。\n",
"- **轻骨骼**:鸟类的骨骼轻便但坚固,这使得它们能够飞行。\n",
"- **产卵**:所有鸟类都通过产卵繁殖后代。\n",
"\n",
"## 鸟类的多样性\n",
"\n",
"世界上有超过10,000种鸟类它们分布在各种栖息地中从热带雨林到极地冰原。以下是一些主要的鸟类分类\n",
"\n",
"- **猛禽**:如鹰、隼和猫头鹰,它们以锐利的视力和强大的捕猎能力著称。\n",
"- **水鸟**:如鸭子、鹈鹕和企鹅,它们适应了水生环境。\n",
"- **鸣禽**:如麻雀、画眉和知更鸟,它们以美妙的歌声闻名。\n",
"\n",
"## 鸟类的行为\n",
"\n",
"鸟类的行为多种多样,以下是一些有趣的例子:\n",
"\n",
"- **迁徙**:许多鸟类会在季节变化时迁徙,飞行数千公里寻找适宜的栖息地。\n",
"- **求偶展示**:雄性鸟类通常会通过色彩鲜艳的羽毛或复杂的舞蹈来吸引配偶。\n",
"- **筑巢**:鸟类会用树枝、草叶甚至人类的废弃物来建造巢穴,为后代提供安全的环境。\n",
"\n",
"## 如何观察鸟类\n",
"\n",
"观察鸟类是一项有趣且放松的活动。以下是一些小贴士:\n",
"\n",
"1. **选择合适的地点**:公园、湿地和森林是观察鸟类的好地方。\n",
"2. **带上工具**:双筒望远镜和鸟类图鉴会帮助你更好地识别鸟类。\n",
"3. **保持安静**:鸟类对声音很敏感,尽量避免发出噪音。\n",
"4. **耐心等待**:有时需要一些时间才能看到鸟类的活动。\n",
"\n",
"## 保护鸟类\n",
"\n",
"随着栖息地的减少和气候变化的影响,许多鸟类面临生存威胁。我们可以通过以下方式帮助保护它们:\n",
"\n",
"- **种植本地植物**:为鸟类提供食物和栖息地。\n",
"- **减少使用化学品**:避免杀虫剂和除草剂对鸟类造成伤害。\n",
"- **支持保护组织**:参与或捐助致力于鸟类保护的机构。\n",
"\n",
"## 结语\n",
"\n",
"鸟类是自然界的奇迹,它们的存在让我们的世界更加丰富多彩。无论是通过观察它们的行为,还是参与保护它们的行动,我们都能从中获得乐趣并为生态环境做出贡献。\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。\n"
]
}
],
"metadata": {
"orig_nbformat": 4,
"language_info": {
"name": "python",
"version": "3.7.0",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "33e5c5d3f0630388e20f2e161bd4cdf3",
"translation_date": "2025-09-02T08:47:49+00:00",
"source_file": "3-Data-Visualization/09-visualization-quantities/notebook.ipynb",
"language_code": "zh"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,208 @@
# 可视化分布
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 绘制的速记图](../../sketchnotes/10-Visualizing-Distributions.png)|
|:---:|
| 可视化分布 - _速记图由 [@nitya](https://twitter.com/nitya) 绘制_ |
在上一节课中,你学习了关于明尼苏达州鸟类数据集的一些有趣事实。通过可视化异常值,你发现了一些错误数据,并观察了不同鸟类类别的最大长度差异。
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/18)
## 探索鸟类数据集
另一种深入了解数据的方法是查看其分布,即数据沿轴的组织方式。例如,你可能想了解明尼苏达州鸟类数据集中最大翼展或最大体重的一般分布情况。
让我们来发现一些关于这个数据集分布的事实。在本课程文件夹根目录的 _notebook.ipynb_ 文件中,导入 Pandas、Matplotlib 和你的数据:
```python
import pandas as pd
import matplotlib.pyplot as plt
birds = pd.read_csv('../../data/birds.csv')
birds.head()
```
| | 名称 | 学名 | 类别 | 目 | 科 | 属 | 保护状态 | 最小长度 | 最大长度 | 最小体重 | 最大体重 | 最小翼展 | 最大翼展 |
| ---: | :--------------------------- | :--------------------- | :-------------------- | :----------- | :------- | :---------- | :----------------- | --------: | --------: | ----------: | ----------: | ----------: | ----------: |
| 0 | 黑腹树鸭 | Dendrocygna autumnalis | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 树鸭属 | LC | 47 | 56 | 652 | 1020 | 76 | 94 |
| 1 | 棕树鸭 | Dendrocygna bicolor | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 树鸭属 | LC | 45 | 53 | 712 | 1050 | 85 | 93 |
| 2 | 雪鹅 | Anser caerulescens | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 雁属 | LC | 64 | 79 | 2050 | 4050 | 135 | 165 |
| 3 | 罗氏鹅 | Anser rossii | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 雁属 | LC | 57.3 | 64 | 1066 | 1567 | 113 | 116 |
| 4 | 大白额雁 | Anser albifrons | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 雁属 | LC | 64 | 81 | 1930 | 3310 | 130 | 165 |
通常,你可以通过使用散点图快速查看数据的分布方式,就像我们在上一节课中所做的那样:
```python
birds.plot(kind='scatter',x='MaxLength',y='Order',figsize=(12,8))
plt.title('Max Length per Order')
plt.ylabel('Order')
plt.xlabel('Max Length')
plt.show()
```
![每个目最大长度](../../../../3-Data-Visualization/10-visualization-distributions/images/scatter-wb.png)
这提供了每个鸟类目身体长度的一般分布概览,但这并不是显示真实分布的最佳方式。通常通过创建直方图来完成这一任务。
## 使用直方图
Matplotlib 提供了非常好的方法来使用直方图可视化数据分布。这种类型的图表类似于柱状图,通过柱子的升降可以看到分布情况。要构建直方图,你需要数值数据。构建直方图时,可以将图表类型定义为 'hist' 来表示直方图。此图表显示了整个数据集范围内最大体重的分布。通过将数据数组分成较小的区间,它可以显示数据值的分布:
```python
birds['MaxBodyMass'].plot(kind = 'hist', bins = 10, figsize = (12,12))
plt.show()
```
![整个数据集的分布](../../../../3-Data-Visualization/10-visualization-distributions/images/dist1-wb.png)
如你所见,这个数据集中的大多数 400 多种鸟类的最大体重都在 2000 以下。通过将 `bins` 参数设置为更高的值,比如 30可以获得更多的洞察
```python
birds['MaxBodyMass'].plot(kind = 'hist', bins = 30, figsize = (12,12))
plt.show()
```
![使用更大区间参数的分布](../../../../3-Data-Visualization/10-visualization-distributions/images/dist2-wb.png)
此图表以更细致的方式显示了分布。通过确保仅选择特定范围内的数据,可以创建一个不那么偏向左侧的图表:
过滤数据以仅获取体重低于 60 的鸟类,并显示 40 个 `bins`
```python
filteredBirds = birds[(birds['MaxBodyMass'] > 1) & (birds['MaxBodyMass'] < 60)]
filteredBirds['MaxBodyMass'].plot(kind = 'hist',bins = 40,figsize = (12,12))
plt.show()
```
![过滤后的直方图](../../../../3-Data-Visualization/10-visualization-distributions/images/dist3-wb.png)
✅ 尝试其他过滤器和数据点。为了查看数据的完整分布,移除 `['MaxBodyMass']` 过滤器以显示带标签的分布。
直方图还提供了一些不错的颜色和标签增强功能可以尝试:
创建一个二维直方图以比较两个分布之间的关系。让我们比较 `MaxBodyMass``MaxLength`。Matplotlib 提供了一种内置方法,通过更亮的颜色显示收敛:
```python
x = filteredBirds['MaxBodyMass']
y = filteredBirds['MaxLength']
fig, ax = plt.subplots(tight_layout=True)
hist = ax.hist2d(x, y)
```
可以看到,这两个元素沿预期轴存在预期的相关性,并且有一个特别强的收敛点:
![二维图](../../../../3-Data-Visualization/10-visualization-distributions/images/2D-wb.png)
直方图默认适用于数值数据。如果需要查看基于文本数据的分布怎么办?
## 使用文本数据探索数据集分布
此数据集还包括关于鸟类类别及其属、种、科以及保护状态的良好信息。让我们深入了解这些保护信息。根据保护状态,鸟类的分布是什么样的?
> ✅ 在数据集中,使用了几个缩写来描述保护状态。这些缩写来自 [IUCN 红色名录分类](https://www.iucnredlist.org/),这是一个记录物种状态的组织。
>
> - CR: 极危
> - EN: 濒危
> - EX: 灭绝
> - LC: 无危
> - NT: 近危
> - VU: 易危
这些是基于文本的值,因此需要进行转换以创建直方图。使用过滤后的鸟类数据框,显示其保护状态及其最小翼展。你看到了什么?
```python
x1 = filteredBirds.loc[filteredBirds.ConservationStatus=='EX', 'MinWingspan']
x2 = filteredBirds.loc[filteredBirds.ConservationStatus=='CR', 'MinWingspan']
x3 = filteredBirds.loc[filteredBirds.ConservationStatus=='EN', 'MinWingspan']
x4 = filteredBirds.loc[filteredBirds.ConservationStatus=='NT', 'MinWingspan']
x5 = filteredBirds.loc[filteredBirds.ConservationStatus=='VU', 'MinWingspan']
x6 = filteredBirds.loc[filteredBirds.ConservationStatus=='LC', 'MinWingspan']
kwargs = dict(alpha=0.5, bins=20)
plt.hist(x1, **kwargs, color='red', label='Extinct')
plt.hist(x2, **kwargs, color='orange', label='Critically Endangered')
plt.hist(x3, **kwargs, color='yellow', label='Endangered')
plt.hist(x4, **kwargs, color='green', label='Near Threatened')
plt.hist(x5, **kwargs, color='blue', label='Vulnerable')
plt.hist(x6, **kwargs, color='gray', label='Least Concern')
plt.gca().set(title='Conservation Status', ylabel='Min Wingspan')
plt.legend();
```
![翼展与保护状态的关联](../../../../3-Data-Visualization/10-visualization-distributions/images/histogram-conservation-wb.png)
似乎最小翼展与保护状态之间没有明显的相关性。使用此方法测试数据集中的其他元素。你可以尝试不同的过滤器。是否发现任何相关性?
## 密度图
你可能注意到我们目前看到的直方图是“阶梯状”的,并没有平滑地呈弧形。为了显示更平滑的密度图,可以尝试使用密度图。
要使用密度图,请熟悉一个新的绘图库 [Seaborn](https://seaborn.pydata.org/generated/seaborn.kdeplot.html)。
加载 Seaborn尝试一个基本的密度图
```python
import seaborn as sns
import matplotlib.pyplot as plt
sns.kdeplot(filteredBirds['MinWingspan'])
plt.show()
```
![密度图](../../../../3-Data-Visualization/10-visualization-distributions/images/density1.png)
你可以看到这个图与之前的最小翼展数据图相呼应,只是稍微平滑了一些。根据 Seaborn 的文档“与直方图相比KDE 可以生成一个更简洁、更易于解释的图,尤其是在绘制多个分布时。但如果底层分布是有界的或不平滑的,它可能会引入失真。与直方图一样,表示的质量也取决于选择良好的平滑参数。” [来源](https://seaborn.pydata.org/generated/seaborn.kdeplot.html)。换句话说,异常值总是会使你的图表表现不佳。
如果你想重新审视第二个图表中那个不平滑的最大体重线,可以通过使用这种方法很好地将其平滑:
```python
sns.kdeplot(filteredBirds['MaxBodyMass'])
plt.show()
```
![平滑的体重线](../../../../3-Data-Visualization/10-visualization-distributions/images/density2.png)
如果你想要一个平滑但不过于平滑的线条,可以编辑 `bw_adjust` 参数:
```python
sns.kdeplot(filteredBirds['MaxBodyMass'], bw_adjust=.2)
plt.show()
```
![较少平滑的体重线](../../../../3-Data-Visualization/10-visualization-distributions/images/density3.png)
✅ 阅读此类型图表可用的参数并进行实验!
这种类型的图表提供了非常直观的可视化。例如,通过几行代码,你可以显示每个鸟类目最大体重的密度:
```python
sns.kdeplot(
data=filteredBirds, x="MaxBodyMass", hue="Order",
fill=True, common_norm=False, palette="crest",
alpha=.5, linewidth=0,
)
```
![每个目体重密度](../../../../3-Data-Visualization/10-visualization-distributions/images/density4.png)
你还可以在一个图表中映射多个变量的密度。测试鸟类的最大长度和最小长度与其保护状态的关系:
```python
sns.kdeplot(data=filteredBirds, x="MinLength", y="MaxLength", hue="ConservationStatus")
```
![多个密度图,叠加](../../../../3-Data-Visualization/10-visualization-distributions/images/multi.png)
也许值得研究一下根据长度分布的“易危”鸟类群是否有意义。
## 🚀 挑战
直方图是一种比基本散点图、柱状图或折线图更复杂的图表类型。上网搜索直方图的优秀使用案例。它们是如何使用的,展示了什么内容,以及它们通常在哪些领域或研究领域中使用?
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/19)
## 复习与自学
在本课中,你使用了 Matplotlib 并开始使用 Seaborn 来展示更复杂的图表。研究 Seaborn 中的 `kdeplot`,一种“一维或多维的连续概率密度曲线”。阅读 [文档](https://seaborn.pydata.org/generated/seaborn.kdeplot.html) 以了解其工作原理。
## 作业
[应用你的技能](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读,我们概不负责。

@ -0,0 +1,14 @@
# 运用你的技能
## 说明
到目前为止,你已经使用了明尼苏达州鸟类数据集来探索鸟类数量和种群密度的信息。尝试使用不同的数据集来练习这些技术,可以从 [Kaggle](https://www.kaggle.com/) 获取数据集。创建一个笔记本来讲述关于这个数据集的故事,并确保在讨论时使用直方图。
## 评分标准
优秀 | 合格 | 需改进
--- | --- | -- |
笔记本包含关于数据集的注释包括其来源并使用至少5个直方图来发现数据的相关信息。 | 笔记本包含不完整的注释或存在错误。 | 笔记本没有注释且存在错误。
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读,我们概不负责。

@ -0,0 +1,32 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"鸟类分布\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读,我们概不负责。\n"
]
}
],
"metadata": {
"orig_nbformat": 4,
"language_info": {
"name": "python"
},
"coopTranslator": {
"original_hash": "e5272cbcbffd1ddcc09e44d3d8e7e8cd",
"translation_date": "2025-09-02T09:06:25+00:00",
"source_file": "3-Data-Visualization/10-visualization-distributions/notebook.ipynb",
"language_code": "zh"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,196 @@
# 可视化比例
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 绘制的草图笔记](../../sketchnotes/11-Visualizing-Proportions.png)|
|:---:|
|可视化比例 - _草图笔记由 [@nitya](https://twitter.com/nitya) 绘制_ |
在本课中,你将使用一个以自然为主题的数据集来可视化比例,例如在一个关于蘑菇的数据集中,不同类型的真菌数量占比。我们将通过一个来自 Audubon 的数据集来探索这些迷人的真菌,该数据集列出了 Agaricus 和 Lepiota 家族中 23 种有鳃蘑菇的详细信息。你将尝试使用以下美味的可视化方法:
- 饼图 🥧
- 环形图 🍩
- 华夫图 🧇
> 💡 一个非常有趣的项目 [Charticulator](https://charticulator.com) 由微软研究院开发,提供了一个免费的拖放式数据可视化界面。在他们的一个教程中也使用了这个蘑菇数据集!因此,你可以一边探索数据一边学习这个工具库:[Charticulator 教程](https://charticulator.com/tutorials/tutorial4.html)。
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/20)
## 了解你的蘑菇 🍄
蘑菇非常有趣。让我们导入一个数据集来研究它们:
```python
import pandas as pd
import matplotlib.pyplot as plt
mushrooms = pd.read_csv('../../data/mushrooms.csv')
mushrooms.head()
```
一个包含丰富分析数据的表格被打印出来:
| 类别 | 菌盖形状 | 菌盖表面 | 菌盖颜色 | 是否有瘀伤 | 气味 | 鳃附着方式 | 鳃间距 | 鳃大小 | 鳃颜色 | 茎形状 | 茎根部 | 茎环上表面 | 茎环下表面 | 茎环上颜色 | 茎环下颜色 | 幔类型 | 幔颜色 | 环数量 | 环类型 | 孢子打印颜色 | 种群 | 栖息地 |
| --------- | --------- | --------- | --------- | --------- | ------- | ------------- | ----------- | --------- | --------- | --------- | --------- | -------------------- | -------------------- | -------------------- | -------------------- | --------- | --------- | --------- | --------- | ----------------- | --------- | ------- |
| 有毒 | 凸形 | 光滑 | 棕色 | 有瘀伤 | 刺鼻 | 游离 | 紧密 | 狭窄 | 黑色 | 膨大 | 等粗 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 垂饰 | 黑色 | 分散 | 城市 |
| 可食用 | 凸形 | 光滑 | 黄色 | 有瘀伤 | 杏仁味 | 游离 | 紧密 | 宽 | 黑色 | 膨大 | 棍棒状 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 垂饰 | 棕色 | 众多 | 草地 |
| 可食用 | 钟形 | 光滑 | 白色 | 有瘀伤 | 茴香味 | 游离 | 紧密 | 宽 | 棕色 | 膨大 | 棍棒状 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 垂饰 | 棕色 | 众多 | 草原 |
| 有毒 | 凸形 | 鳞状 | 白色 | 有瘀伤 | 刺鼻 | 游离 | 紧密 | 狭窄 | 棕色 | 膨大 | 等粗 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 垂饰 | 黑色 | 分散 | 城市 |
你会立刻注意到,所有数据都是文本格式。为了在图表中使用这些数据,你需要将其转换。事实上,大部分数据是以对象形式表示的:
```python
print(mushrooms.select_dtypes(["object"]).columns)
```
输出为:
```output
Index(['class', 'cap-shape', 'cap-surface', 'cap-color', 'bruises', 'odor',
'gill-attachment', 'gill-spacing', 'gill-size', 'gill-color',
'stalk-shape', 'stalk-root', 'stalk-surface-above-ring',
'stalk-surface-below-ring', 'stalk-color-above-ring',
'stalk-color-below-ring', 'veil-type', 'veil-color', 'ring-number',
'ring-type', 'spore-print-color', 'population', 'habitat'],
dtype='object')
```
将这些数据转换,将 'class' 列转换为类别:
```python
cols = mushrooms.select_dtypes(["object"]).columns
mushrooms[cols] = mushrooms[cols].astype('category')
```
```python
edibleclass=mushrooms.groupby(['class']).count()
edibleclass
```
现在,如果打印出蘑菇数据,你会看到它已经根据有毒/可食用类别分组:
| | 菌盖形状 | 菌盖表面 | 菌盖颜色 | 是否有瘀伤 | 气味 | 鳃附着方式 | 鳃间距 | 鳃大小 | 鳃颜色 | 茎形状 | ... | 茎环下表面 | 茎环上颜色 | 茎环下颜色 | 幔类型 | 幔颜色 | 环数量 | 环类型 | 孢子打印颜色 | 种群 | 栖息地 |
| --------- | --------- | --------- | --------- | --------- | ---- | ------------- | ----------- | --------- | --------- | --------- | --- | -------------------- | -------------------- | -------------------- | --------- | --------- | --------- | --------- | ----------------- | --------- | ------- |
| 类别 | | | | | | | | | | | | | | | | | | | | | |
| 可食用 | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 | ... | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 | 4208 |
| 有毒 | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 | ... | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 | 3916 |
如果按照此表中呈现的顺序创建类别标签,你可以绘制一个饼图:
## 饼图!
```python
labels=['Edible','Poisonous']
plt.pie(edibleclass['population'],labels=labels,autopct='%.1f %%')
plt.title('Edible?')
plt.show()
```
瞧,一个饼图展示了蘑菇数据中这两类的比例。这里正确设置标签顺序非常重要,因此务必验证标签数组的顺序!
![饼图](../../../../3-Data-Visualization/11-visualization-proportions/images/pie1-wb.png)
## 环形图!
环形图是饼图的一种变体,中间有一个空洞,看起来更有趣。让我们用这种方法查看数据。
看看蘑菇生长的各种栖息地:
```python
habitat=mushrooms.groupby(['habitat']).count()
habitat
```
这里,你将数据按栖息地分组。共有 7 种栖息地,因此将它们用作环形图的标签:
```python
labels=['Grasses','Leaves','Meadows','Paths','Urban','Waste','Wood']
plt.pie(habitat['class'], labels=labels,
autopct='%1.1f%%', pctdistance=0.85)
center_circle = plt.Circle((0, 0), 0.40, fc='white')
fig = plt.gcf()
fig.gca().add_artist(center_circle)
plt.title('Mushroom Habitats')
plt.show()
```
![环形图](../../../../3-Data-Visualization/11-visualization-proportions/images/donut-wb.png)
这段代码绘制了一个图表和一个中心圆,然后将中心圆添加到图表中。通过更改 `0.40` 的值可以调整中心圆的宽度。
环形图可以通过多种方式调整标签的显示,特别是可以突出显示标签以提高可读性。更多信息请参考[文档](https://matplotlib.org/stable/gallery/pie_and_polar_charts/pie_and_donut_labels.html?highlight=donut)。
现在你已经知道如何分组数据并将其显示为饼图或环形图,可以尝试其他类型的图表。试试华夫图,这是一种不同的数量可视化方式。
## 华夫图!
华夫图是一种二维方块数组的数量可视化方式。试着用这个数据集可视化蘑菇菌盖颜色的不同数量。为此,你需要安装一个名为 [PyWaffle](https://pypi.org/project/pywaffle/) 的辅助库并使用 Matplotlib
```python
pip install pywaffle
```
选择一部分数据进行分组:
```python
capcolor=mushrooms.groupby(['cap-color']).count()
capcolor
```
通过创建标签并分组数据来生成华夫图:
```python
import pandas as pd
import matplotlib.pyplot as plt
from pywaffle import Waffle
data ={'color': ['brown', 'buff', 'cinnamon', 'green', 'pink', 'purple', 'red', 'white', 'yellow'],
'amount': capcolor['class']
}
df = pd.DataFrame(data)
fig = plt.figure(
FigureClass = Waffle,
rows = 100,
values = df.amount,
labels = list(df.color),
figsize = (30,30),
colors=["brown", "tan", "maroon", "green", "pink", "purple", "red", "whitesmoke", "yellow"],
)
```
使用华夫图,你可以清楚地看到这个蘑菇数据集中菌盖颜色的比例。有趣的是,有许多绿色菌盖的蘑菇!
![华夫图](../../../../3-Data-Visualization/11-visualization-proportions/images/waffle.png)
✅ PyWaffle 支持在图表中使用任何 [Font Awesome](https://fontawesome.com/) 提供的图标。尝试用图标代替方块,创建更有趣的华夫图。
在本课中,你学习了三种可视化比例的方法。首先,你需要将数据分组为类别,然后决定哪种方式最适合展示数据——饼图、环形图或华夫图。它们都很有趣,并能快速呈现数据集的概况。
## 🚀 挑战
尝试在 [Charticulator](https://charticulator.com) 中重新创建这些有趣的图表。
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/21)
## 复习与自学
有时很难决定何时使用饼图、环形图或华夫图。以下是一些相关文章:
https://www.beautiful.ai/blog/battle-of-the-charts-pie-chart-vs-donut-chart
https://medium.com/@hypsypops/pie-chart-vs-donut-chart-showdown-in-the-ring-5d24fd86a9ce
https://www.mit.edu/~mbarker/formula1/f1help/11-ch-c6.htm
https://medium.datadriveninvestor.com/data-visualization-done-the-right-way-with-tableau-waffle-chart-fdf2a19be402
做一些研究,了解更多关于这个选择的相关信息。
## 作业
[在 Excel 中尝试](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而导致的任何误解或误读,我们概不负责。

@ -0,0 +1,14 @@
# 在 Excel 中试一试
## 操作指南
你知道吗?你可以在 Excel 中创建甜甜圈图、饼图和华夫图!使用你选择的数据集,在 Excel 表格中创建这三种图表。
## 评分标准
| 优秀 | 合格 | 需要改进 |
| ------------------------------------------------------ | ----------------------------------------------- | ----------------------------------------------------- |
| 提交的 Excel 表格包含所有三种图表 | 提交的 Excel 表格包含两种图表 | 提交的 Excel 表格仅包含一种图表 |
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,30 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们概不负责。\n"
]
}
],
"metadata": {
"orig_nbformat": 4,
"language_info": {
"name": "python"
},
"coopTranslator": {
"original_hash": "397e9bbc0743761dbf72e5f16b7043e6",
"translation_date": "2025-09-02T08:38:10+00:00",
"source_file": "3-Data-Visualization/11-visualization-proportions/notebook.ipynb",
"language_code": "zh"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,179 @@
# 可视化关系:关于蜂蜜的一切 🍯
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/12-Visualizing-Relationships.png)|
|:---:|
|可视化关系 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
延续我们研究的自然主题,让我们探索一些有趣的可视化方法,展示不同类型蜂蜜之间的关系。这些数据集来源于[美国农业部](https://www.nass.usda.gov/About_NASS/index.php)。
这个包含约600项的数据集展示了美国多个州的蜂蜜生产情况。例如你可以查看每个州从1998年至2012年间的蜂群数量、每群产量、总产量、库存、每磅价格以及蜂蜜生产的价值每年每州一行数据。
我们可以通过可视化来研究某个州每年的生产情况与该州蜂蜜价格之间的关系。或者你也可以可视化各州每群蜂蜜产量之间的关系。这段时间涵盖了2006年首次出现的严重“蜂群崩溃失调”CCDColony Collapse Disorderhttp://npic.orst.edu/envir/ccd.html因此这是一个值得研究的深刻数据集。🐝
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/22)
在本课中你可以使用之前用过的Seaborn库这是一个很好的工具用于可视化变量之间的关系。特别有趣的是使用Seaborn的`relplot`函数,它可以快速生成散点图和折线图来可视化“[统计关系](https://seaborn.pydata.org/tutorial/relational.html?highlight=relationships)”,帮助数据科学家更好地理解变量之间的关联。
## 散点图
使用散点图展示蜂蜜价格如何逐年在各州演变。Seaborn的`relplot`可以方便地对州数据进行分组,并显示分类数据和数值数据的点。
首先导入数据和Seaborn
```python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
honey = pd.read_csv('../../data/honey.csv')
honey.head()
```
你会注意到蜂蜜数据中有几个有趣的列,包括年份和每磅价格。让我们按美国州分组来探索这些数据:
| 州 | 蜂群数量 | 每群产量 | 总产量 | 库存 | 每磅价格 | 生产价值 | 年份 |
| ----- | ------ | ----------- | --------- | -------- | ---------- | --------- | ---- |
| AL | 16000 | 71 | 1136000 | 159000 | 0.72 | 818000 | 1998 |
| AZ | 55000 | 60 | 3300000 | 1485000 | 0.64 | 2112000 | 1998 |
| AR | 53000 | 65 | 3445000 | 1688000 | 0.59 | 2033000 | 1998 |
| CA | 450000 | 83 | 37350000 | 12326000 | 0.62 | 23157000 | 1998 |
| CO | 27000 | 72 | 1944000 | 1594000 | 0.7 | 1361000 | 1998 |
创建一个基础散点图,展示每磅蜂蜜价格与其来源州之间的关系。将`y`轴设置得足够高以显示所有州:
```python
sns.relplot(x="priceperlb", y="state", data=honey, height=15, aspect=.5);
```
![scatterplot 1](../../../../translated_images/zh-CN/scatter1.5e1aa5fd6706c5d12b5e503ccb77f8a930f8620f539f524ddf56a16c039a5d2f.png)
现在用蜂蜜色调展示同样的数据显示价格如何逐年变化。你可以通过添加一个“hue”参数来展示逐年的变化
> ✅ 了解更多关于[Seaborn中可用的颜色调色板](https://seaborn.pydata.org/tutorial/color_palettes.html) - 尝试一个美丽的彩虹色调!
```python
sns.relplot(x="priceperlb", y="state", hue="year", palette="YlOrBr", data=honey, height=15, aspect=.5);
```
![scatterplot 2](../../../../translated_images/zh-CN/scatter2.c0041a58621ca702990b001aa0b20cd68c1e1814417139af8a7211a2bed51c5f.png)
通过这个颜色方案的变化,你可以明显看到蜂蜜每磅价格在逐年强劲增长。如果你查看数据中的一个样本集(例如选择亚利桑那州),你会发现价格逐年上涨的模式,虽然有少数例外:
| 州 | 蜂群数量 | 每群产量 | 总产量 | 库存 | 每磅价格 | 生产价值 | 年份 |
| ----- | ------ | ----------- | --------- | ------- | ---------- | --------- | ---- |
| AZ | 55000 | 60 | 3300000 | 1485000 | 0.64 | 2112000 | 1998 |
| AZ | 52000 | 62 | 3224000 | 1548000 | 0.62 | 1999000 | 1999 |
| AZ | 40000 | 59 | 2360000 | 1322000 | 0.73 | 1723000 | 2000 |
| AZ | 43000 | 59 | 2537000 | 1142000 | 0.72 | 1827000 | 2001 |
| AZ | 38000 | 63 | 2394000 | 1197000 | 1.08 | 2586000 | 2002 |
| AZ | 35000 | 72 | 2520000 | 983000 | 1.34 | 3377000 | 2003 |
| AZ | 32000 | 55 | 1760000 | 774000 | 1.11 | 1954000 | 2004 |
| AZ | 36000 | 50 | 1800000 | 720000 | 1.04 | 1872000 | 2005 |
| AZ | 30000 | 65 | 1950000 | 839000 | 0.91 | 1775000 | 2006 |
| AZ | 30000 | 64 | 1920000 | 902000 | 1.26 | 2419000 | 2007 |
| AZ | 25000 | 64 | 1600000 | 336000 | 1.26 | 2016000 | 2008 |
| AZ | 20000 | 52 | 1040000 | 562000 | 1.45 | 1508000 | 2009 |
| AZ | 24000 | 77 | 1848000 | 665000 | 1.52 | 2809000 | 2010 |
| AZ | 23000 | 53 | 1219000 | 427000 | 1.55 | 1889000 | 2011 |
| AZ | 22000 | 46 | 1012000 | 253000 | 1.79 | 1811000 | 2012 |
另一种可视化这种变化的方法是使用大小而不是颜色。对于色盲用户,这可能是一个更好的选择。编辑你的可视化,显示价格的增长通过点的大小来表示:
```python
sns.relplot(x="priceperlb", y="state", size="year", data=honey, height=15, aspect=.5);
```
你可以看到点的大小逐渐增加。
![scatterplot 3](../../../../translated_images/zh-CN/scatter3.3c160a3d1dcb36b37900ebb4cf97f34036f28ae2b7b8e6062766c7c1dfc00853.png)
这是否是一个简单的供需问题?由于气候变化和蜂群崩溃等因素,蜂蜜的供应逐年减少,因此价格上涨?
为了发现数据集中某些变量之间的相关性,让我们探索一些折线图。
## 折线图
问题:蜂蜜每磅价格是否逐年明显上涨?你可以通过创建一个单一折线图来最容易地发现这一点:
```python
sns.relplot(x="year", y="priceperlb", kind="line", data=honey);
```
答案是的除了2003年左右的一些例外
![line chart 1](../../../../translated_images/zh-CN/line1.f36eb465229a3b1fe385cdc93861aab3939de987d504b05de0b6cd567ef79f43.png)
✅ 由于Seaborn对数据进行聚合它通过绘制均值和均值周围的95%置信区间来显示“每个x值的多个测量值”。[来源](https://seaborn.pydata.org/tutorial/relational.html)。这种耗时的行为可以通过添加`ci=None`来禁用。
问题那么在2003年我们是否也能看到蜂蜜供应的激增如果你查看逐年的总产量呢
```python
sns.relplot(x="year", y="totalprod", kind="line", data=honey);
```
![line chart 2](../../../../translated_images/zh-CN/line2.a5b3493dc01058af6402e657aaa9ae1125fafb5e7d6630c777aa60f900a544e4.png)
答案:并不完全。如果你查看总产量,实际上在那一年似乎有所增加,尽管总体而言蜂蜜的产量在这些年间呈下降趋势。
问题在这种情况下是什么导致了2003年蜂蜜价格的激增
为了发现这一点你可以探索一个Facet Grid。
## Facet Grids
Facet Grids可以选择数据集中的一个方面在我们的例子中你可以选择“年份”以避免生成过多的Facet。然后Seaborn可以为你选择的x和y坐标生成每个Facet的图表以便更容易进行视觉比较。2003年在这种比较中是否显得特别突出
通过继续使用`relplot`创建一个Facet Grid正如[Seaborn文档](https://seaborn.pydata.org/generated/seaborn.FacetGrid.html?highlight=facetgrid#seaborn.FacetGrid)所推荐的那样。
```python
sns.relplot(
data=honey,
x="yieldpercol", y="numcol",
col="year",
col_wrap=3,
kind="line"
)
```
在这个可视化中你可以比较逐年的每群产量和蜂群数量并将列的wrap设置为3
![facet grid](../../../../translated_images/zh-CN/facet.6a34851dcd540050dcc0ead741be35075d776741668dd0e42f482c89b114c217.png)
对于这个数据集,逐年和各州之间的蜂群数量及其产量并没有特别显著的变化。是否有其他方法可以找到这两个变量之间的相关性?
## 双折线图
尝试通过将两个折线图叠加在一起来创建一个多折线图使用Seaborn的'despine'移除顶部和右侧的轴线,并使用`ax.twinx` [源自Matplotlib](https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.twinx.html)。Twins允许图表共享x轴并显示两个y轴。因此叠加显示每群产量和蜂群数量
```python
fig, ax = plt.subplots(figsize=(12,6))
lineplot = sns.lineplot(x=honey['year'], y=honey['numcol'], data=honey,
label = 'Number of bee colonies', legend=False)
sns.despine()
plt.ylabel('# colonies')
plt.title('Honey Production Year over Year');
ax2 = ax.twinx()
lineplot2 = sns.lineplot(x=honey['year'], y=honey['yieldpercol'], ax=ax2, color="r",
label ='Yield per colony', legend=False)
sns.despine(right=False)
plt.ylabel('colony yield')
ax.figure.legend();
```
![superimposed plots](../../../../translated_images/zh-CN/dual-line.a4c28ce659603fab2c003f4df816733df2bf41d1facb7de27989ec9afbf01b33.png)
虽然2003年没有明显的异常但这确实让我们以一个稍微乐观的结论结束这节课尽管蜂群数量总体上在下降但蜂群数量正在趋于稳定尽管每群产量在减少。
加油,蜜蜂们,加油!
🐝❤️
## 🚀 挑战
在本课中你学习了更多关于散点图和折线图网格的其他用途包括Facet Grids。挑战自己使用不同的数据集创建一个Facet Grid也许是你之前使用过的数据集。注意它们的创建时间以及如何谨慎选择需要绘制的网格数量。
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/23)
## 复习与自学
折线图可以很简单也可以很复杂。阅读[Seaborn文档](https://seaborn.pydata.org/generated/seaborn.lineplot.html)中关于构建折线图的各种方法。尝试使用文档中列出的其他方法来增强你在本课中构建的折线图。
## 作业
[深入蜂巢](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,14 @@
# 探索蜂巢
## 指导
在本课中,你开始研究一个关于蜜蜂及其蜂蜜产量的数据集,这段时间内蜜蜂群体数量整体上有所减少。深入挖掘这个数据集,构建一个笔记本,讲述蜜蜂群体健康状况的故事,按州和年份进行分析。你是否在这个数据集中发现了什么有趣的内容?
## 评分标准
| 卓越表现 | 合格表现 | 需要改进 |
| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | ---------------------------------------- |
| 提供了一个笔记本,包含一个故事,并配有至少三个不同的图表,展示数据集的各个方面,按州和年份进行分析 | 笔记本缺少其中一个要素 | 笔记本缺少其中两个要素 |
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,32 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"可视化蜂蜜生产 🍯 🐝\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而导致的任何误解或误读,我们概不负责。\n"
]
}
],
"metadata": {
"orig_nbformat": 4,
"language_info": {
"name": "python"
},
"coopTranslator": {
"original_hash": "0f988634b7192626d91cc33b4b6388c5",
"translation_date": "2025-09-02T08:58:00+00:00",
"source_file": "3-Data-Visualization/12-visualization-relationships/notebook.ipynb",
"language_code": "zh"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,173 @@
# 制作有意义的数据可视化
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/13-MeaningfulViz.png)|
|:---:|
| 有意义的数据可视化 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
> “如果你对数据施加足够的压力,它会承认任何事情” -- [Ronald Coase](https://en.wikiquote.org/wiki/Ronald_Coase)
数据科学家的基本技能之一是能够创建有意义的数据可视化,以帮助回答你可能提出的问题。在可视化数据之前,你需要确保数据已经像之前课程中那样被清理和准备好。之后,你可以开始决定如何最好地呈现数据。
在本课中,你将学习:
1. 如何选择正确的图表类型
2. 如何避免误导性图表
3. 如何使用颜色
4. 如何为图表设计样式以提高可读性
5. 如何构建动画或3D图表解决方案
6. 如何构建创意可视化
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/24)
## 选择正确的图表类型
在之前的课程中,你已经尝试使用 Matplotlib 和 Seaborn 构建各种有趣的数据可视化。通常,你可以使用以下表格选择适合问题的[正确图表类型](https://chartio.com/learn/charts/how-to-select-a-data-vizualization/)
| 你的需求是: | 你应该使用: |
| ----------------------- | --------------------------- |
| 展示随时间变化的数据趋势 | 折线图 |
| 比较类别 | 柱状图、饼图 |
| 比较总量 | 饼图、堆叠柱状图 |
| 展示关系 | 散点图、折线图、分面图、双折线图 |
| 展示分布 | 散点图、直方图、箱线图 |
| 展示比例 | 饼图、环形图、华夫图 |
> ✅ 根据数据的组成,你可能需要将其从文本转换为数值,以支持某些图表类型。
## 避免误导
即使数据科学家谨慎选择了适合数据的正确图表类型,数据仍然可能以某种方式被展示以证明某种观点,通常会以牺牲数据本身为代价。有许多误导性图表和信息图的例子!
[![Alberto Cairo 的《How Charts Lie》](../../../../3-Data-Visualization/13-meaningful-visualizations/images/tornado.png)](https://www.youtube.com/watch?v=oX74Nge8Wkw "How charts lie")
> 🎥 点击上方图片观看关于误导性图表的会议演讲
这个图表颠倒了 X 轴,以日期为基础展示了与事实相反的内容:
![bad chart 1](../../../../3-Data-Visualization/13-meaningful-visualizations/images/bad-chart-1.png)
[这个图表](https://media.firstcoastnews.com/assets/WTLV/images/170ae16f-4643-438f-b689-50d66ca6a8d8/170ae16f-4643-438f-b689-50d66ca6a8d8_1140x641.jpg)更加误导,因为视觉上吸引人们得出结论认为随着时间推移,各县的 COVID 病例数量有所下降。实际上,如果仔细查看日期,你会发现日期被重新排列以制造这种误导性的下降趋势。
![bad chart 2](../../../../3-Data-Visualization/13-meaningful-visualizations/images/bad-chart-2.jpg)
这个臭名昭著的例子使用颜色和颠倒的 Y 轴来误导:本应得出枪支死亡人数在通过支持枪支的立法后激增的结论,实际上视觉上却让人误以为情况正好相反:
![bad chart 3](../../../../3-Data-Visualization/13-meaningful-visualizations/images/bad-chart-3.jpg)
这个奇怪的图表展示了比例如何被操纵,效果令人捧腹:
![bad chart 4](../../../../3-Data-Visualization/13-meaningful-visualizations/images/bad-chart-4.jpg)
比较不可比的事物是另一种不正当的手段。有一个[精彩的网站](https://tylervigen.com/spurious-correlations)专门展示“虚假的相关性”例如缅因州的离婚率与人造黄油的消费量之间的“事实”相关性。Reddit 上也有一个小组收集了[数据的丑陋用法](https://www.reddit.com/r/dataisugly/top/?t=all)。
理解眼睛如何容易被误导性图表欺骗是很重要的。即使数据科学家的意图是好的,选择错误的图表类型(例如显示过多类别的饼图)也可能具有误导性。
## 颜色
你在上面“佛罗里达枪支暴力”图表中看到,颜色可以为图表提供额外的意义层次,尤其是那些没有使用 Matplotlib 和 Seaborn 等库设计的图表,这些库自带各种经过验证的颜色库和调色板。如果你手动制作图表,可以稍微研究一下[颜色理论](https://colormatters.com/color-and-design/basic-color-theory)。
> ✅ 在设计图表时,请注意可访问性是可视化的重要方面。你的部分用户可能是色盲——你的图表是否对视觉障碍用户友好?
选择图表颜色时要小心,因为颜色可能传递你未曾预料的含义。上面“身高”图表中的“粉色女士”传递了一种明显的“女性化”意义,这增加了图表本身的怪异感。
虽然[颜色含义](https://colormatters.com/color-symbolism/the-meanings-of-colors)可能因地区而异,并且根据其色调会有所变化,但一般来说,颜色含义包括:
| 颜色 | 含义 |
| ------ | ------------------- |
| 红色 | 力量 |
| 蓝色 | 信任、忠诚 |
| 黄色 | 快乐、警告 |
| 绿色 | 生态、幸运、嫉妒 |
| 紫色 | 快乐 |
| 橙色 | 活力 |
如果你需要使用自定义颜色构建图表,请确保你的图表既可访问,又与试图传递的含义一致。
## 为图表设计样式以提高可读性
如果图表不可读它就没有意义花点时间考虑调整图表的宽度和高度以便与数据良好匹配。如果需要显示一个变量例如所有50个州尽量将它们垂直显示在 Y 轴上,以避免水平滚动的图表。
标注你的轴线,必要时提供图例,并提供工具提示以更好地理解数据。
如果你的数据在 X 轴上是文本且较长,可以将文本倾斜以提高可读性。[Matplotlib](https://matplotlib.org/stable/tutorials/toolkits/mplot3d.html) 提供了 3D 绘图功能,如果你的数据支持它。可以使用 `mpl_toolkits.mplot3d` 生成复杂的数据可视化。
![3d plots](../../../../3-Data-Visualization/13-meaningful-visualizations/images/3d.png)
## 动画和3D图表展示
如今一些最佳的数据可视化是动画化的。Shirley Wu 使用 D3 制作了令人惊叹的作品,例如“[电影之花](http://bl.ocks.org/sxywu/raw/d612c6c653fb8b4d7ff3d422be164a5d/)”其中每朵花都是一部电影的可视化。另一个为《卫报》制作的例子是“Bussed Out”一个结合 Greensock 和 D3 的交互式体验,外加滚动叙事文章格式,展示纽约市如何通过将人们送出城市来处理无家可归问题。
![busing](../../../../3-Data-Visualization/13-meaningful-visualizations/images/busing.png)
> “Bussed Out: How America Moves its Homeless” 来自 [卫报](https://www.theguardian.com/us-news/ng-interactive/2017/dec/20/bussed-out-america-moves-homeless-people-country-study)。可视化由 Nadieh Bremer 和 Shirley Wu 制作
虽然本课不足以深入教授这些强大的可视化库,但你可以尝试在 Vue.js 应用中使用 D3利用一个库来展示《危险关系》这本书的动画社交网络可视化。
> 《危险关系》是一部书信体小说,即以一系列信件形式呈现的小说。由 Choderlos de Laclos 于1782年创作讲述了18世纪末法国贵族中两位主角——瓦尔蒙子爵和梅尔特伊侯爵——之间恶毒、道德败坏的社交操纵故事。两人最终都遭遇了悲剧但在此之前造成了巨大的社会破坏。小说通过他们圈子中写给各种人的信件展开策划复仇或单纯制造麻烦。创建这些信件的可视化发现叙事中的主要关键人物。
你将完成一个网络应用程序,展示这个社交网络的动画视图。它使用一个库来创建[网络可视化](https://github.com/emiliorizzo/vue-d3-network),基于 Vue.js 和 D3。当应用程序运行时你可以在屏幕上拖动节点以重新排列数据。
![liaisons](../../../../3-Data-Visualization/13-meaningful-visualizations/images/liaisons.png)
## 项目:使用 D3.js 构建一个网络图表
> 本课文件夹包含一个 `solution` 文件夹,你可以在其中找到完整的项目供参考。
1. 按照起始文件夹根目录中的 README.md 文件中的说明操作。在安装项目依赖项之前,请确保你的机器上运行了 NPM 和 Node.js。
2. 打开 `starter/src` 文件夹。你会发现一个 `assets` 文件夹,其中包含一个 .json 文件记录了小说中的所有信件编号并带有“to”和“from”注释。
3. 完成 `components/Nodes.vue` 中的代码以启用可视化。找到名为 `createLinks()` 的方法,并添加以下嵌套循环。
循环遍历 .json 对象以捕获信件的“to”和“from”数据并构建 `links` 对象,以便可视化库可以使用它:
```javascript
//loop through letters
let f = 0;
let t = 0;
for (var i = 0; i < letters.length; i++) {
for (var j = 0; j < characters.length; j++) {
if (characters[j] == letters[i].from) {
f = j;
}
if (characters[j] == letters[i].to) {
t = j;
}
}
this.links.push({ sid: f, tid: t });
}
```
从终端运行你的应用程序npm run serve享受可视化效果
## 🚀 挑战
浏览互联网,发现误导性可视化。作者是如何误导用户的,这是否是故意的?尝试纠正这些可视化,展示它们应该如何呈现。
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/25)
## 复习与自学
以下是一些关于误导性数据可视化的文章:
https://gizmodo.com/how-to-lie-with-data-visualization-1563576606
http://ixd.prattsi.org/2017/12/visual-lies-usability-in-deceptive-data-visualizations/
看看这些关于历史资产和文物的有趣可视化:
https://handbook.pubpub.org/
阅读这篇关于动画如何增强可视化的文章:
https://medium.com/@EvanSinar/use-animation-to-supercharge-data-visualization-cd905a882ad4
## 作业
[创建你自己的自定义可视化](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,14 @@
# 构建你自己的自定义可视化
## 指南
使用本项目中的代码示例创建一个社交网络,模拟你自己的社交互动数据。你可以绘制你的社交媒体使用情况,或者制作一个家庭成员的关系图。创建一个有趣的网页应用,展示一个独特的社交网络可视化。
## 评分标准
优秀 | 合格 | 需要改进
--- | --- | --- |
提供一个包含正常运行代码的 GitHub 仓库(尝试将其部署为静态网页应用),并附有注释清晰的 README 文件,解释项目内容 | 仓库无法正常运行或文档不够完善 | 仓库无法正常运行且文档不够完善
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而导致的任何误解或误读,我们概不负责。

@ -0,0 +1,29 @@
# 危险关系数据可视化项目
在开始之前,请确保您的计算机上已安装并运行了 NPM 和 Node。安装依赖项npm install然后在本地运行项目npm run serve
## 项目设置
```
npm install
```
### 编译并热加载用于开发
```
npm run serve
```
### 编译并压缩用于生产
```
npm run build
```
### 检查并修复文件
```
npm run lint
```
### 自定义配置
请参阅[配置参考](https://cli.vuejs.org/config/)。
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,29 @@
# 危险关系数据可视化项目
开始之前,请确保您的电脑上已安装 NPM 和 Node。安装依赖项npm install然后在本地运行项目npm run serve
## 项目设置
```
npm install
```
### 编译并热加载开发环境
```
npm run serve
```
### 编译并压缩生产环境
```
npm run build
```
### 检查并修复文件
```
npm run lint
```
### 自定义配置
请参阅 [配置参考](https://cli.vuejs.org/config/)。
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,222 @@
# 可视化数量
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 绘制的草图笔记](https://github.com/microsoft/Data-Science-For-Beginners/blob/main/sketchnotes/09-Visualizing-Quantities.png)|
|:---:|
| 可视化数量 - _草图笔记由 [@nitya](https://twitter.com/nitya) 绘制_ |
在本课中,你将学习如何使用一些 R 中可用的包库,围绕数量这一概念创建有趣的可视化。通过一个关于明尼苏达州鸟类的清理数据集,你可以了解许多关于当地野生动物的有趣事实。
## [课前测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/16)
## 使用 ggplot2 观察翼展
[ggplot2](https://cran.r-project.org/web/packages/ggplot2/index.html) 是一个非常优秀的库,可以用来创建各种简单或复杂的图表。一般来说,使用这些库绘制数据图的过程包括:确定数据框中要处理的部分,对数据进行必要的转换,指定 x 和 y 轴的值,选择图表类型,然后展示图表。
`ggplot2` 是一个基于《图形语法》The Grammar of Graphics声明式创建图形的系统。《图形语法》是一种数据可视化的通用方案将图形分解为语义组件如比例和层次。换句话说`ggplot2` 通过少量代码即可轻松创建单变量或多变量数据的图表,这使其成为 R 中最受欢迎的可视化包。用户只需告诉 `ggplot2` 如何将变量映射到美学属性、使用哪些图形元素,剩下的由 `ggplot2` 处理。
> ✅ 图表 = 数据 + 美学 + 几何
> - 数据:指数据集
> - 美学表示要研究的变量x 和 y 变量)
> - 几何:指图表类型(折线图、柱状图等)
根据你的数据和想通过图表讲述的故事,选择最合适的几何类型(图表类型)。
> - 分析趋势:折线图、柱状图
> - 比较数值:条形图、柱状图、饼图、散点图
> - 展示部分与整体的关系:饼图
> - 展示数据分布:散点图、条形图
> - 展示数值之间的关系:折线图、散点图、气泡图
✅ 你还可以查看这个描述性的 [ggplot2 速查表](https://nyu-cdsc.github.io/learningr/assets/data-visualization-2.1.pdf)。
## 绘制鸟类翼展值的折线图
打开 R 控制台并导入数据集。
> 注意:数据集存储在本仓库的 `/data` 文件夹中。
让我们导入数据集并观察数据的头部(前 5 行)。
```r
birds <- read.csv("../../data/birds.csv",fileEncoding="UTF-8-BOM")
head(birds)
```
数据头部包含文本和数字的混合:
| | 名称 | 学名 | 类别 | 目 | 科 | 属 | 保护状态 | 最小长度 | 最大长度 | 最小体重 | 最大体重 | 最小翼展 | 最大翼展 |
| ---: | :--------------------------- | :--------------------- | :-------------------- | :----------- | :------- | :---------- | :---------------- | --------: | --------: | ----------: | ----------: | ----------: | ----------: |
| 0 | 黑腹树鸭 | Dendrocygna autumnalis | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 树鸭属 | LC | 47 | 56 | 652 | 1020 | 76 | 94 |
| 1 | 棕树鸭 | Dendrocygna bicolor | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 树鸭属 | LC | 45 | 53 | 712 | 1050 | 85 | 93 |
| 2 | 雪鹅 | Anser caerulescens | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 鹅属 | LC | 64 | 79 | 2050 | 4050 | 135 | 165 |
| 3 | 罗斯氏鹅 | Anser rossii | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 鹅属 | LC | 57.3 | 64 | 1066 | 1567 | 113 | 116 |
| 4 | 大白额雁 | Anser albifrons | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 鹅属 | LC | 64 | 81 | 1930 | 3310 | 130 | 165 |
让我们从绘制一些数值数据的基本折线图开始。假设你想查看这些有趣鸟类的最大翼展。
```r
install.packages("ggplot2")
library("ggplot2")
ggplot(data=birds, aes(x=Name, y=MaxWingspan,group=1)) +
geom_line()
```
在这里,你安装了 `ggplot2` 包并通过 `library("ggplot2")` 命令将其导入工作区。要在 ggplot 中绘制任何图表,使用 `ggplot()` 函数并将数据集、x 和 y 变量作为属性指定。在这种情况下,我们使用 `geom_line()` 函数,因为我们要绘制折线图。
![最大翼展折线图](../../../../../translated_images/zh-CN/MaxWingspan-lineplot.b12169f99d26fdd263f291008dfd73c18a4ba8f3d32b1fda3d74af51a0a28616.png)
你立即注意到了什么似乎至少有一个异常值——那是一个相当惊人的翼展2000+ 厘米的翼展超过了 20 米——难道明尼苏达州有翼龙在飞翔?让我们调查一下。
虽然你可以在 Excel 中快速排序找到这些可能是输入错误的异常值,但我们继续通过图表进行可视化分析。
为 x 轴添加标签以显示涉及哪些鸟类:
```r
ggplot(data=birds, aes(x=Name, y=MaxWingspan,group=1)) +
geom_line() +
theme(axis.text.x = element_text(angle = 45, hjust=1))+
xlab("Birds") +
ylab("Wingspan (CM)") +
ggtitle("Max Wingspan in Centimeters")
```
我们在 `theme` 中指定了角度,并在 `xlab()``ylab()` 中分别指定了 x 和 y 轴的标签。`ggtitle()` 为图表命名。
![改进后的最大翼展折线图](../../../../../translated_images/zh-CN/MaxWingspan-lineplot-improved.04b73b4d5a59552a6bc7590678899718e1f065abe9eada9ebb4148939b622fd4.png)
即使将标签旋转到 45 度,仍然太多了,难以阅读。让我们尝试另一种策略:仅标记那些异常值,并在图表内设置标签。你可以使用散点图来腾出更多空间进行标记:
```r
ggplot(data=birds, aes(x=Name, y=MaxWingspan,group=1)) +
geom_point() +
geom_text(aes(label=ifelse(MaxWingspan>500,as.character(Name),'')),hjust=0,vjust=0) +
theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank())
ylab("Wingspan (CM)") +
ggtitle("Max Wingspan in Centimeters") +
```
这里发生了什么?你使用了 `geom_point()` 函数绘制散点图。通过这种方式,你为 `MaxWingspan > 500` 的鸟类添加了标签,同时隐藏了 x 轴上的标签以减少图表的杂乱。
你发现了什么?
![最大翼展散点图](../../../../../translated_images/zh-CN/MaxWingspan-scatterplot.60dc9e0e19d32700283558f253841fdab5104abb62bc96f7d97f9c0ee857fa8b.png)
## 筛选数据
无论是秃鹰还是草原隼,虽然可能是非常大的鸟类,但它们的最大翼展似乎被错误标记,多加了一个 0。遇到翼展 25 米的秃鹰的可能性不大,但如果真的遇到,请告诉我们!让我们创建一个新的数据框,去掉这两个异常值:
```r
birds_filtered <- subset(birds, MaxWingspan < 500)
ggplot(data=birds_filtered, aes(x=Name, y=MaxWingspan,group=1)) +
geom_point() +
ylab("Wingspan (CM)") +
xlab("Birds") +
ggtitle("Max Wingspan in Centimeters") +
geom_text(aes(label=ifelse(MaxWingspan>500,as.character(Name),'')),hjust=0,vjust=0) +
theme(axis.text.x=element_blank(), axis.ticks.x=element_blank())
```
我们创建了一个新的数据框 `birds_filtered`,然后绘制了一个散点图。通过筛选掉异常值,你的数据现在更加连贯且易于理解。
![改进后的最大翼展散点图](../../../../../translated_images/zh-CN/MaxWingspan-scatterplot-improved.7d0af81658c65f3e75b8fedeb2335399e31108257e48db15d875ece608272051.png)
现在我们至少在翼展方面有了一个更干净的数据集,让我们进一步探索这些鸟类。
虽然折线图和散点图可以显示数据值及其分布的信息,但我们还想思考数据集中固有的值。你可以创建可视化来回答以下关于数量的问题:
> 有多少种鸟类类别?它们的数量是多少?
> 有多少鸟类是灭绝的、濒危的、稀有的或常见的?
> 根据林奈分类法,有多少种不同的属和目?
## 探索条形图
当你需要展示数据分组时,条形图非常实用。让我们探索数据集中存在的鸟类类别,看看哪种类别最常见。
让我们在筛选后的数据上创建一个条形图。
```r
install.packages("dplyr")
install.packages("tidyverse")
library(lubridate)
library(scales)
library(dplyr)
library(ggplot2)
library(tidyverse)
birds_filtered %>% group_by(Category) %>%
summarise(n=n(),
MinLength = mean(MinLength),
MaxLength = mean(MaxLength),
MinBodyMass = mean(MinBodyMass),
MaxBodyMass = mean(MaxBodyMass),
MinWingspan=mean(MinWingspan),
MaxWingspan=mean(MaxWingspan)) %>%
gather("key", "value", - c(Category, n)) %>%
ggplot(aes(x = Category, y = value, group = key, fill = key)) +
geom_bar(stat = "identity") +
scale_fill_manual(values = c("#D62728", "#FF7F0E", "#8C564B","#2CA02C", "#1F77B4", "#9467BD")) +
xlab("Category")+ggtitle("Birds of Minnesota")
```
在以下代码片段中,我们安装了 [dplyr](https://www.rdocumentation.org/packages/dplyr/versions/0.7.8) 和 [lubridate](https://www.rdocumentation.org/packages/lubridate/versions/1.8.0) 包,以帮助操作和分组数据,从而绘制堆叠条形图。首先,你按鸟类的 `Category` 分组数据,然后汇总 `MinLength`、`MaxLength`、`MinBodyMass`、`MaxBodyMass`、`MinWingspan`、`MaxWingspan` 列。接着,使用 `ggplot2` 包绘制条形图,并为不同类别指定颜色和标签。
![堆叠条形图](../../../../../translated_images/zh-CN/stacked-bar-chart.0c92264e89da7b391a7490224d1e7059a020e8b74dcd354414aeac78871c02f1.png)
然而,这个条形图由于数据未分组过多而难以阅读。你需要选择要绘制的数据,因此让我们根据鸟类类别查看其长度。
筛选数据以仅包含鸟类的类别。
由于类别较多,你可以垂直显示此图表并调整其高度以适应所有数据:
```r
birds_count<-dplyr::count(birds_filtered, Category, sort = TRUE)
birds_count$Category <- factor(birds_count$Category, levels = birds_count$Category)
ggplot(birds_count,aes(Category,n))+geom_bar(stat="identity")+coord_flip()
```
你首先统计 `Category` 列中的唯一值,然后将它们排序到一个新的数据框 `birds_count` 中。接着,将这些排序后的数据按相同顺序分级,以便按排序方式绘制。使用 `ggplot2` 绘制条形图。`coord_flip()` 将条形图水平显示。
![类别长度](../../../../../translated_images/zh-CN/category-length.7e34c296690e85d64f7e4d25a56077442683eca96c4f5b4eae120a64c0755636.png)
这个条形图很好地展示了每个类别中鸟类的数量。一眼就能看出,这个地区数量最多的鸟类是鸭/鹅/水禽类别。明尼苏达州是“万湖之地”,这并不令人意外!
✅ 尝试对该数据集进行其他计数。有什么让你感到惊讶的吗?
## 比较数据
你可以通过创建新的轴来尝试不同的分组数据比较。尝试比较基于类别的鸟类最大长度:
```r
birds_grouped <- birds_filtered %>%
group_by(Category) %>%
summarise(
MaxLength = max(MaxLength, na.rm = T),
MinLength = max(MinLength, na.rm = T)
) %>%
arrange(Category)
ggplot(birds_grouped,aes(Category,MaxLength))+geom_bar(stat="identity")+coord_flip()
```
我们按 `Category``birds_filtered` 数据进行分组,然后绘制条形图。
![比较数据](../../../../../translated_images/zh-CN/comparingdata.f486a450d61c7ca5416f27f3f55a6a4465d00df3be5e6d33936e9b07b95e2fdd.png)
这里没有什么令人意外的:蜂鸟的最大长度最小,而鹈鹕或鹅的最大长度较大。当数据符合逻辑时,这是好事!
你可以通过叠加数据创建更有趣的条形图可视化。让我们在给定的鸟类类别上叠加最小和最大长度:
```r
ggplot(data=birds_grouped, aes(x=Category)) +
geom_bar(aes(y=MaxLength), stat="identity", position ="identity", fill='blue') +
geom_bar(aes(y=MinLength), stat="identity", position="identity", fill='orange')+
coord_flip()
```
![叠加值](../../../../../translated_images/zh-CN/superimposed-values.5363f0705a1da4167625a373a1064331ea3cb7a06a297297d0734fcc9b3819a0.png)
## 🚀 挑战
这个鸟类数据集提供了关于特定生态系统中不同类型鸟类的大量信息。在互联网上搜索,看看是否能找到其他与鸟类相关的数据集。练习围绕这些鸟类构建图表和图形,发现你之前未曾意识到的事实。
## [课后测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/17)
## 复习与自学
本课为你提供了一些关于如何使用 `ggplot2` 可视化数量的信息。研究其他可视化数据集的方法。查找并研究可以使用其他包(如 [Lattice](https://stat.ethz.ch/R-manual/R-devel/library/lattice/html/Lattice.html) 和 [Plotly](https://github.com/plotly/plotly.R#readme))进行可视化的数据集。
## 作业
[折线图、散点图和条形图](assignment.md)
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,14 @@
# 折线图、散点图和柱状图
## 说明
在本课中,你学习了如何使用折线图、散点图和柱状图来展示数据集中的有趣事实。在本次作业中,请深入挖掘数据集,发现关于某种鸟类的一个事实。例如,创建一个脚本,展示你能找到的关于雪雁的所有有趣数据。使用上述三种图表,在你的笔记本中讲述一个故事。
## 评分标准
优秀 | 合格 | 需改进
--- | --- | --- |
脚本包含良好的注释、清晰的故事叙述以及吸引人的图表 | 脚本缺少其中一个要素 | 脚本缺少其中两个要素
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,174 @@
# 可视化分布
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 绘制的速记图](https://github.com/microsoft/Data-Science-For-Beginners/blob/main/sketchnotes/10-Visualizing-Distributions.png)|
|:---:|
| 可视化分布 - _速记图作者 [@nitya](https://twitter.com/nitya)_ |
在上一节课中,你学习了关于明尼苏达州鸟类数据集的一些有趣事实。通过可视化异常值,你发现了一些错误数据,并通过最大长度观察了鸟类类别之间的差异。
## [课前测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/18)
## 探索鸟类数据集
另一种深入了解数据的方法是查看其分布,即数据如何沿轴排列。例如,你可能想了解这个数据集中鸟类的最大翼展或最大体重的一般分布情况。
让我们来发现一些关于这个数据集分布的事实。在你的 R 控制台中,导入 `ggplot2` 和数据库。像上一节一样,从数据库中移除异常值。
```r
library(ggplot2)
birds <- read.csv("../../data/birds.csv",fileEncoding="UTF-8-BOM")
birds_filtered <- subset(birds, MaxWingspan < 500)
head(birds_filtered)
```
| | 名称 | 学名 | 类别 | 目 | 科 | 属 | 保护状态 | 最小长度 | 最大长度 | 最小体重 | 最大体重 | 最小翼展 | 最大翼展 |
| ---: | :--------------------------- | :--------------------- | :-------------------- | :----------- | :------- | :---------- | :----------------- | --------: | --------: | ----------: | ----------: | ----------: | ----------: |
| 0 | 黑腹叫鸭 | Dendrocygna autumnalis | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 栖鸭属 | LC | 47 | 56 | 652 | 1020 | 76 | 94 |
| 1 | 棕腹叫鸭 | Dendrocygna bicolor | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 栖鸭属 | LC | 45 | 53 | 712 | 1050 | 85 | 93 |
| 2 | 雪鹅 | Anser caerulescens | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 雁属 | LC | 64 | 79 | 2050 | 4050 | 135 | 165 |
| 3 | 罗氏鹅 | Anser rossii | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 雁属 | LC | 57.3 | 64 | 1066 | 1567 | 113 | 116 |
| 4 | 大白额雁 | Anser albifrons | 鸭/鹅/水禽 | 雁形目 | 鸭科 | 雁属 | LC | 64 | 81 | 1930 | 3310 | 130 | 165 |
通常,你可以通过使用散点图快速查看数据的分布方式,就像我们在上一节课中所做的那样:
```r
ggplot(data=birds_filtered, aes(x=Order, y=MaxLength,group=1)) +
geom_point() +
ggtitle("Max Length per order") + coord_flip()
```
![每目最大长度](../../../../../translated_images/zh-CN/max-length-per-order.e5b283d952c78c12b091307c5d3cf67132dad6fefe80a073353b9dc5c2bd3eb8.png)
这提供了每个鸟类目身体长度的一般分布概览,但这并不是显示真实分布的最佳方式。通常通过创建直方图来完成这一任务。
## 使用直方图
`ggplot2` 提供了非常好的方法来使用直方图可视化数据分布。这种图表类似于柱状图通过柱子的升降可以看到分布情况。要构建直方图你需要数值数据。构建直方图时可以将图表类型定义为“hist”以表示直方图。此图表显示整个数据集范围内最大体重的分布。通过将数据数组划分为较小的区间它可以显示数据值的分布
```r
ggplot(data = birds_filtered, aes(x = MaxBodyMass)) +
geom_histogram(bins=10)+ylab('Frequency')
```
![整个数据集的分布](../../../../../translated_images/zh-CN/distribution-over-the-entire-dataset.d22afd3fa96be854e4c82213fedec9e3703cba753d07fad4606aadf58cf7e78e.png)
如你所见,这个数据集中的 400 多种鸟类大多数最大体重都在 2000 以下。通过将 `bins` 参数更改为更高的数字,例如 30可以获得更多数据洞察
```r
ggplot(data = birds_filtered, aes(x = MaxBodyMass)) + geom_histogram(bins=30)+ylab('Frequency')
```
![30个区间的分布](../../../../../translated_images/zh-CN/distribution-30bins.6a3921ea7a421bf71f06bf5231009e43d1146f1b8da8dc254e99b5779a4983e5.png)
此图表以更细致的方式显示分布。通过确保仅选择特定范围内的数据,可以创建一个偏向左侧较少的图表:
过滤数据,仅获取体重低于 60 的鸟类,并显示 30 个 `bins`
```r
birds_filtered_1 <- subset(birds_filtered, MaxBodyMass > 1 & MaxBodyMass < 60)
ggplot(data = birds_filtered_1, aes(x = MaxBodyMass)) +
geom_histogram(bins=30)+ylab('Frequency')
```
![过滤后的直方图](../../../../../translated_images/zh-CN/filtered-histogram.6bf5d2bfd82533220e1bd4bc4f7d14308f43746ed66721d9ec8f460732be6674.png)
✅ 尝试其他过滤器和数据点。要查看数据的完整分布,请移除 `['MaxBodyMass']` 过滤器以显示带标签的分布。
直方图还提供了一些不错的颜色和标签增强功能可以尝试:
创建一个二维直方图来比较两个分布之间的关系。让我们比较 `MaxBodyMass``MaxLength`。`ggplot2` 提供了一种内置方法,通过更亮的颜色显示收敛:
```r
ggplot(data=birds_filtered_1, aes(x=MaxBodyMass, y=MaxLength) ) +
geom_bin2d() +scale_fill_continuous(type = "viridis")
```
可以看到这两个元素沿预期轴存在预期的相关性,其中一个点的收敛特别强:
![二维图](../../../../../translated_images/zh-CN/2d-plot.c504786f439bd7ebceebf2465c70ca3b124103e06c7ff7214bf24e26f7aec21e.png)
直方图默认适用于数值数据。如果需要根据文本数据查看分布该怎么办?
## 使用文本数据探索数据集分布
此数据集还包括关于鸟类类别及其属、种、科以及保护状态的良好信息。让我们深入了解这些保护信息。根据保护状态,鸟类的分布情况如何?
> ✅ 在数据集中,使用了一些缩写来描述保护状态。这些缩写来自 [IUCN 红色名录类别](https://www.iucnredlist.org/),这是一个记录物种状态的组织。
>
> - CR: 极危
> - EN: 濒危
> - EX: 灭绝
> - LC: 无危
> - NT: 近危
> - VU: 易危
这些是基于文本的值,因此需要进行转换以创建直方图。使用过滤后的鸟类数据框,显示其保护状态及其最小翼展。你看到了什么?
```r
birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'EX'] <- 'x1'
birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'CR'] <- 'x2'
birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'EN'] <- 'x3'
birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'NT'] <- 'x4'
birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'VU'] <- 'x5'
birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'LC'] <- 'x6'
ggplot(data=birds_filtered_1, aes(x = MinWingspan, fill = ConservationStatus)) +
geom_histogram(position = "identity", alpha = 0.4, bins = 20) +
scale_fill_manual(name="Conservation Status",values=c("red","green","blue","pink"),labels=c("Endangered","Near Threathened","Vulnerable","Least Concern"))
```
![翼展与保护状态的关联](../../../../../translated_images/zh-CN/wingspan-conservation-collation.4024e9aa6910866aa82f0c6cb6a6b4b925bd10079e6b0ef8f92eefa5a6792f76.png)
最小翼展与保护状态之间似乎没有明显的相关性。使用此方法测试数据集中的其他元素。你可以尝试不同的过滤器。是否发现任何相关性?
## 密度图
你可能注意到我们迄今为止看到的直方图是“阶梯状”的,并没有平滑地呈弧形。要显示更平滑的密度图,可以尝试密度图。
现在让我们来使用密度图!
```r
ggplot(data = birds_filtered_1, aes(x = MinWingspan)) +
geom_density()
```
![密度图](../../../../../translated_images/zh-CN/density-plot.675ccf865b76c690487fb7f69420a8444a3515f03bad5482886232d4330f5c85.png)
你可以看到此图与之前的最小翼展数据图相呼应;它只是稍微平滑了一些。如果你想重新创建第二个图表中那个不平滑的最大体重线,可以通过这种方法很好地将其平滑化:
```r
ggplot(data = birds_filtered_1, aes(x = MaxBodyMass)) +
geom_density()
```
![体重密度](../../../../../translated_images/zh-CN/bodymass-smooth.d31ce526d82b0a1f19a073815dea28ecfbe58145ec5337e4ef7e8cdac81120b3.png)
如果你想要一个平滑但不过于平滑的线条,可以编辑 `adjust` 参数:
```r
ggplot(data = birds_filtered_1, aes(x = MaxBodyMass)) +
geom_density(adjust = 1/5)
```
![较少平滑的体重](../../../../../translated_images/zh-CN/less-smooth-bodymass.10f4db8b683cc17d17b2d33f22405413142004467a1493d416608dafecfdee23.png)
✅ 阅读有关此类图表可用参数的内容并进行实验!
这种图表提供了非常直观的可视化。例如,通过几行代码,你可以显示每个鸟类目最大体重的密度:
```r
ggplot(data=birds_filtered_1,aes(x = MaxBodyMass, fill = Order)) +
geom_density(alpha=0.5)
```
![每目体重](../../../../../translated_images/zh-CN/bodymass-per-order.9d2b065dd931b928c839d8cdbee63067ab1ae52218a1b90717f4bc744354f485.png)
## 🚀 挑战
直方图是一种比基本散点图、柱状图或折线图更复杂的图表类型。上网搜索直方图的优秀使用案例。它们是如何使用的,展示了什么内容,以及它们通常在哪些领域或研究领域中使用?
## [课后测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/19)
## 复习与自学
在本课中,你使用了 `ggplot2` 并开始展示更复杂的图表。研究一下 `geom_density_2d()`,它是一种“一维或多维的连续概率密度曲线”。阅读 [文档](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) 以了解其工作原理。
## 作业
[应用你的技能](assignment.md)
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,14 @@
# 应用你的技能
## 说明
到目前为止,你已经使用了明尼苏达州鸟类数据集,探索了有关鸟类数量和种群密度的信息。现在,尝试使用一个不同的数据集来练习这些技术,可以从 [Kaggle](https://www.kaggle.com/) 获取数据集。编写一个 R 脚本,讲述关于这个数据集的故事,并确保在分析中使用直方图。
## 评分标准
优秀 | 合格 | 需要改进
--- | --- | -- |
脚本包含关于数据集及其来源的注释,并使用至少 5 个直方图来探索数据中的信息。 | 脚本包含不完整的注释或存在错误。 | 脚本没有注释且包含错误。
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,189 @@
# 可视化比例
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 绘制的速记图](../../../sketchnotes/11-Visualizing-Proportions.png)|
|:---:|
|可视化比例 - _速记图由 [@nitya](https://twitter.com/nitya) 绘制_ |
在本课中,你将使用一个以自然为主题的数据集来可视化比例,例如在关于蘑菇的数据集中有多少种不同类型的真菌。让我们通过一个来自 Audubon 的数据集来探索这些迷人的真菌,该数据集列出了 Agaricus 和 Lepiota 家族中 23 种有鳃蘑菇的详细信息。你将尝试一些有趣的可视化方法,例如:
- 饼图 🥧
- 环形图 🍩
- 华夫图 🧇
> 💡 一个非常有趣的项目 [Charticulator](https://charticulator.com) 由微软研究院开发,提供了一个免费的拖放界面用于数据可视化。在他们的一个教程中也使用了这个蘑菇数据集!因此,你可以同时探索数据并学习这个库:[Charticulator 教程](https://charticulator.com/tutorials/tutorial4.html)。
## [课前测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/20)
## 了解你的蘑菇 🍄
蘑菇非常有趣。让我们导入一个数据集来研究它们:
```r
mushrooms = read.csv('../../data/mushrooms.csv')
head(mushrooms)
```
打印出一个表格,其中包含一些适合分析的优秀数据:
| 类别 | 帽型 | 帽表面 | 帽颜色 | 是否有瘀伤 | 气味 | 鳃附着方式 | 鳃间距 | 鳃大小 | 鳃颜色 | 茎形状 | 茎根部 | 环上方茎表面 | 环下方茎表面 | 环上方茎颜色 | 环下方茎颜色 | 面纱类型 | 面纱颜色 | 环数量 | 环类型 | 孢子印颜色 | 种群数量 | 栖息地 |
| --------- | --------- | ----------- | --------- | ------- | ------- | --------------- | ------------ | --------- | ---------- | ----------- | ---------- | ------------------------ | ------------------------ | ---------------------- | ---------------------- | --------- | ---------- | ----------- | --------- | ----------------- | ---------- | ------- |
| 有毒 | 凸形 | 光滑 | 棕色 | 有瘀伤 | 刺鼻 | 自由 | 紧密 | 狭窄 | 黑色 | 扩大 | 等长 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 垂饰 | 黑色 | 分散 | 城市 |
| 可食用 | 凸形 | 光滑 | 黄色 | 有瘀伤 | 杏仁 | 自由 | 紧密 | 宽广 | 黑色 | 扩大 | 棍状 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 垂饰 | 棕色 | 众多 | 草地 |
| 可食用 | 钟形 | 光滑 | 白色 | 有瘀伤 | 茴香 | 自由 | 紧密 | 宽广 | 棕色 | 扩大 | 棍状 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 垂饰 | 棕色 | 众多 | 草地 |
| 有毒 | 凸形 | 鳞状 | 白色 | 有瘀伤 | 刺鼻 | 自由 | 紧密 | 狭窄 | 棕色 | 扩大 | 等长 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 垂饰 | 黑色 | 分散 | 城市 |
| 可食用 | 凸形 | 光滑 | 绿色 | 无瘀伤 | 无气味 | 自由 | 拥挤 | 宽广 | 黑色 | 锥形 | 等长 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 消失 | 棕色 | 丰富 | 草地 |
| 可食用 | 凸形 | 鳞状 | 黄色 | 有瘀伤 | 杏仁 | 自由 | 紧密 | 宽广 | 棕色 | 扩大 | 棍状 | 光滑 | 光滑 | 白色 | 白色 | 部分 | 白色 | 一个 | 垂饰 | 黑色 | 众多 | 草地 |
你会立即注意到所有数据都是文本格式。为了在图表中使用这些数据,你需要将其转换。事实上,大部分数据是以对象形式表示的:
```r
names(mushrooms)
```
输出为:
```output
[1] "class" "cap.shape"
[3] "cap.surface" "cap.color"
[5] "bruises" "odor"
[7] "gill.attachment" "gill.spacing"
[9] "gill.size" "gill.color"
[11] "stalk.shape" "stalk.root"
[13] "stalk.surface.above.ring" "stalk.surface.below.ring"
[15] "stalk.color.above.ring" "stalk.color.below.ring"
[17] "veil.type" "veil.color"
[19] "ring.number" "ring.type"
[21] "spore.print.color" "population"
[23] "habitat"
```
将数据中的“类别”列转换为分类:
```r
library(dplyr)
grouped=mushrooms %>%
group_by(class) %>%
summarise(count=n())
```
现在,如果打印出蘑菇数据,你会看到它已经根据有毒/可食用类别分组:
```r
View(grouped)
```
| 类别 | 数量 |
| --------- | --------- |
| 可食用 | 4208 |
| 有毒 | 3916 |
如果按照此表中呈现的顺序创建类别标签,你可以绘制一个饼图。
## 饼图!
```r
pie(grouped$count,grouped$class, main="Edible?")
```
瞧,一个饼图展示了根据蘑菇的两种类别的数据比例。在这里,确保标签数组的顺序正确非常重要,因此务必验证标签的构建顺序!
![饼图](../../../../../translated_images/zh-CN/pie1-wb.685df063673751f4b0b82127f7a52c7f9a920192f22ae61ad28412ba9ace97bf.png)
## 环形图!
环形图是一种更具视觉吸引力的饼图,它在中间有一个空洞。让我们用这种方法查看数据。
看看蘑菇生长的各种栖息地:
```r
library(dplyr)
habitat=mushrooms %>%
group_by(habitat) %>%
summarise(count=n())
View(habitat)
```
输出为:
| 栖息地 | 数量 |
| --------- | --------- |
| 草地 | 2148 |
| 树叶 | 832 |
| 草坪 | 292 |
| 小径 | 1144 |
| 城市 | 368 |
| 废地 | 192 |
| 木材 | 3148 |
这里,你将数据按栖息地分组。共有 7 个栖息地,因此使用这些作为环形图的标签:
```r
library(ggplot2)
library(webr)
PieDonut(habitat, aes(habitat, count=count))
```
![环形图](../../../../../translated_images/zh-CN/donut-wb.34e6fb275da9d834c2205145e39a3de9b6878191dcdba6f7a9e85f4b520449bc.png)
此代码使用了两个库——ggplot2 和 webr。通过 webr 库的 PieDonut 函数,我们可以轻松创建环形图!
在 R 中,仅使用 ggplot2 库也可以制作环形图。你可以在 [这里](https://www.r-graph-gallery.com/128-ring-or-donut-plot.html) 学习更多并尝试自己制作。
现在你已经知道如何分组数据并将其显示为饼图或环形图,你可以探索其他类型的图表。试试华夫图,这是一种不同的方式来探索数量。
## 华夫图!
“华夫”类型图表是一种以二维方块阵列可视化数量的方式。尝试可视化此数据集中蘑菇帽颜色的不同数量。为此,你需要安装一个辅助库 [waffle](https://cran.r-project.org/web/packages/waffle/waffle.pdf) 并使用它生成可视化:
```r
install.packages("waffle", repos = "https://cinc.rud.is")
```
选择数据的一部分进行分组:
```r
library(dplyr)
cap_color=mushrooms %>%
group_by(cap.color) %>%
summarise(count=n())
View(cap_color)
```
通过创建标签并分组数据来创建华夫图:
```r
library(waffle)
names(cap_color$count) = paste0(cap_color$cap.color)
waffle((cap_color$count/10), rows = 7, title = "Waffle Chart")+scale_fill_manual(values=c("brown", "#F0DC82", "#D2691E", "green",
"pink", "purple", "red", "grey",
"yellow","white"))
```
使用华夫图,你可以清楚地看到蘑菇数据集中帽颜色的比例。有趣的是,有许多绿色帽子的蘑菇!
![华夫图](../../../../../translated_images/zh-CN/waffle.aaa75c5337735a6ef32ace0ffb6506ef49e5aefe870ffd72b1bb080f4843c217.png)
在本课中,你学习了三种可视化比例的方法。首先,你需要将数据分组为类别,然后决定哪种方式最适合显示数据——饼图、环形图或华夫图。所有这些都很有趣,并能让用户快速了解数据集。
## 🚀 挑战
尝试在 [Charticulator](https://charticulator.com) 中重新创建这些有趣的图表。
## [课后测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/21)
## 复习与自学
有时不容易判断何时使用饼图、环形图或华夫图。以下是一些相关文章:
https://www.beautiful.ai/blog/battle-of-the-charts-pie-chart-vs-donut-chart
https://medium.com/@hypsypops/pie-chart-vs-donut-chart-showdown-in-the-ring-5d24fd86a9ce
https://www.mit.edu/~mbarker/formula1/f1help/11-ch-c6.htm
https://medium.datadriveninvestor.com/data-visualization-done-the-right-way-with-tableau-waffle-chart-fdf2a19be402
进行一些研究以获取更多关于这个选择的信息。
## 作业
[在 Excel 中尝试](assignment.md)
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,168 @@
# 可视化关系:关于蜂蜜的一切 🍯
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../../sketchnotes/12-Visualizing-Relationships.png)|
|:---:|
|可视化关系 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
延续我们研究的自然主题,让我们探索一些有趣的可视化方法,展示不同类型蜂蜜之间的关系。这些数据来源于[美国农业部](https://www.nass.usda.gov/About_NASS/index.php)。
这个包含约600项的数据集展示了美国多个州的蜂蜜生产情况。例如你可以查看每个州从1998到2012年的蜂群数量、每群产量、总产量、库存、每磅价格以及蜂蜜生产的价值每个州每年一行数据。
我们可以通过可视化来研究某个州每年的生产情况与该州蜂蜜价格之间的关系。或者你也可以可视化各州每群蜂蜜产量之间的关系。这段时间涵盖了2006年首次出现的毁灭性“蜂群崩溃综合症CCDhttp://npic.orst.edu/envir/ccd.html因此这是一个值得研究的引人深思的数据集。🐝
## [课前测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/22)
在本课中你可以使用之前用过的ggplot2库这是一个很好的工具用于可视化变量之间的关系。特别有趣的是ggplot2的`geom_point`和`qplot`函数,它们可以快速生成散点图和折线图,用于可视化“[统计关系](https://ggplot2.tidyverse.org/)”,帮助数据科学家更好地理解变量之间的关联。
## 散点图
使用散点图展示蜂蜜价格在每个州逐年变化的情况。ggplot2通过`ggplot`和`geom_point`可以方便地对州数据进行分组,并显示分类和数值数据的点。
让我们从导入数据和Seaborn开始
```r
honey=read.csv('../../data/honey.csv')
head(honey)
```
你会注意到蜂蜜数据中有几个有趣的列,包括年份和每磅价格。让我们按美国州分组来探索这些数据:
| 州 | 蜂群数量 | 每群产量 | 总产量 | 库存 | 每磅价格 | 生产价值 | 年份 |
| ----- | ------ | ----------- | --------- | -------- | ---------- | --------- | ---- |
| AL | 16000 | 71 | 1136000 | 159000 | 0.72 | 818000 | 1998 |
| AZ | 55000 | 60 | 3300000 | 1485000 | 0.64 | 2112000 | 1998 |
| AR | 53000 | 65 | 3445000 | 1688000 | 0.59 | 2033000 | 1998 |
| CA | 450000 | 83 | 37350000 | 12326000 | 0.62 | 23157000 | 1998 |
| CO | 27000 | 72 | 1944000 | 1594000 | 0.7 | 1361000 | 1998 |
| FL | 230000 | 98 |22540000 | 4508000 | 0.64 | 14426000 | 1998 |
创建一个基础散点图,展示蜂蜜每磅价格与其来源州之间的关系。让`y`轴足够高以显示所有州:
```r
library(ggplot2)
ggplot(honey, aes(x = priceperlb, y = state)) +
geom_point(colour = "blue")
```
![scatterplot 1](../../../../../translated_images/zh-CN/scatter1.86b8900674d88b26dd3353a83fe604e9ab3722c4680cc40ee9beb452ff02cdea.png)
现在,用蜂蜜色调展示同样的数据,显示价格随年份的变化。你可以通过添加`scale_color_gradientn`参数来实现逐年变化的可视化:
> ✅ 了解更多关于[scale_color_gradientn](https://www.rdocumentation.org/packages/ggplot2/versions/0.9.1/topics/scale_colour_gradientn)的信息 - 尝试一个美丽的彩虹色方案!
```r
ggplot(honey, aes(x = priceperlb, y = state, color=year)) +
geom_point()+scale_color_gradientn(colours = colorspace::heat_hcl(7))
```
![scatterplot 2](../../../../../translated_images/zh-CN/scatter2.4d1cbc693bad20e2b563888747eb6bdf65b73ce449d903f7cd4068a78502dcff.png)
通过这个颜色方案的变化,你可以明显看到蜂蜜每磅价格在这些年间逐年上涨。如果你查看数据中的一个样本集(例如亚利桑那州),你会发现价格逐年上涨的模式,虽然有少数例外:
| 州 | 蜂群数量 | 每群产量 | 总产量 | 库存 | 每磅价格 | 生产价值 | 年份 |
| ----- | ------ | ----------- | --------- | ------- | ---------- | --------- | ---- |
| AZ | 55000 | 60 | 3300000 | 1485000 | 0.64 | 2112000 | 1998 |
| AZ | 52000 | 62 | 3224000 | 1548000 | 0.62 | 1999000 | 1999 |
| AZ | 40000 | 59 | 2360000 | 1322000 | 0.73 | 1723000 | 2000 |
| AZ | 43000 | 59 | 2537000 | 1142000 | 0.72 | 1827000 | 2001 |
| AZ | 38000 | 63 | 2394000 | 1197000 | 1.08 | 2586000 | 2002 |
| AZ | 35000 | 72 | 2520000 | 983000 | 1.34 | 3377000 | 2003 |
| AZ | 32000 | 55 | 1760000 | 774000 | 1.11 | 1954000 | 2004 |
| AZ | 36000 | 50 | 1800000 | 720000 | 1.04 | 1872000 | 2005 |
| AZ | 30000 | 65 | 1950000 | 839000 | 0.91 | 1775000 | 2006 |
| AZ | 30000 | 64 | 1920000 | 902000 | 1.26 | 2419000 | 2007 |
| AZ | 25000 | 64 | 1600000 | 336000 | 1.26 | 2016000 | 2008 |
| AZ | 20000 | 52 | 1040000 | 562000 | 1.45 | 1508000 | 2009 |
| AZ | 24000 | 77 | 1848000 | 665000 | 1.52 | 2809000 | 2010 |
| AZ | 23000 | 53 | 1219000 | 427000 | 1.55 | 1889000 | 2011 |
| AZ | 22000 | 46 | 1012000 | 253000 | 1.79 | 1811000 | 2012 |
另一种可视化这种变化的方法是使用大小而不是颜色。对于色盲用户,这可能是一个更好的选择。编辑你的可视化,用点的大小来展示价格的增长:
```r
ggplot(honey, aes(x = priceperlb, y = state)) +
geom_point(aes(size = year),colour = "blue") +
scale_size_continuous(range = c(0.25, 3))
```
你可以看到点的大小逐渐增大。
![scatterplot 3](../../../../../translated_images/zh-CN/scatter3.722d21e6f20b3ea2e18339bb9b10d75906126715eb7d5fdc88fe74dcb6d7066a.png)
这是否是一个简单的供需关系?由于气候变化和蜂群崩溃等因素,是否导致蜂蜜的供应逐年减少,从而价格上涨?
为了发现数据集中一些变量之间的相关性,让我们探索一些折线图。
## 折线图
问题:蜂蜜每磅价格是否逐年明显上涨?你可以通过创建一个单一折线图来最容易地发现这一点:
```r
qplot(honey$year,honey$priceperlb, geom='smooth', span =0.5, xlab = "year",ylab = "priceperlb")
```
答案是的除了2003年左右的一些例外
![line chart 1](../../../../../translated_images/zh-CN/line1.299b576fbb2a59e60a59e7130030f59836891f90302be084e4e8d14da0562e2a.png)
问题那么在2003年我们是否也能看到蜂蜜供应的激增如果你查看逐年的总产量呢
```python
qplot(honey$year,honey$totalprod, geom='smooth', span =0.5, xlab = "year",ylab = "totalprod")
```
![line chart 2](../../../../../translated_images/zh-CN/line2.3b18fcda7176ceba5b6689eaaabb817d49c965e986f11cac1ae3f424030c34d8.png)
答案:并不明显。如果你查看总产量,实际上在那一年似乎有所增加,尽管总体而言蜂蜜的产量在这些年间是下降的。
问题在这种情况下是什么导致了2003年蜂蜜价格的激增
为了发现这一点,你可以探索一个分面网格。
## 分面网格
分面网格可以选择数据集的一个维度在我们的例子中你可以选择“年份”以避免生成过多的分面。Seaborn可以为你选择的x和y坐标生成每个分面的图表以便更容易进行视觉比较。2003年在这种比较中是否显得特别突出
使用`facet_wrap`创建一个分面网格,推荐参考[ggplot2的文档](https://ggplot2.tidyverse.org/reference/facet_wrap.html)。
```r
ggplot(honey, aes(x=yieldpercol, y = numcol,group = 1)) +
geom_line() + facet_wrap(vars(year))
```
在这个可视化中你可以比较逐年蜂群产量和蜂群数量并将列数设置为3
![facet grid](../../../../../translated_images/zh-CN/facet.491ad90d61c2a7cc69b50c929f80786c749e38217ccedbf1e22ed8909b65987c.png)
对于这个数据集,逐年和各州之间,蜂群数量和产量并没有特别突出的变化。是否有其他方法可以发现这两个变量之间的相关性?
## 双折线图
尝试使用R的`par`和`plot`函数通过叠加两个折线图来创建多线图。我们将在x轴上绘制年份并显示两个y轴。展示每群产量和蜂群数量的叠加
```r
par(mar = c(5, 4, 4, 4) + 0.3)
plot(honey$year, honey$numcol, pch = 16, col = 2,type="l")
par(new = TRUE)
plot(honey$year, honey$yieldpercol, pch = 17, col = 3,
axes = FALSE, xlab = "", ylab = "",type="l")
axis(side = 4, at = pretty(range(y2)))
mtext("colony yield", side = 4, line = 3)
```
![superimposed plots](../../../../../translated_images/zh-CN/dual-line.fc4665f360a54018d7df9bc6abcc26460112e17dcbda18d3b9ae6109b32b36c3.png)
虽然2003年没有明显的异常但这让我们可以以一个稍微乐观的结论结束这节课尽管蜂群数量总体上在下降但蜂群数量正在趋于稳定尽管每群产量在减少。
加油,蜜蜂们!
🐝❤️
## 🚀 挑战
在本课中,你学习了更多关于散点图和线网格的其他用途,包括分面网格。挑战自己使用不同的数据集创建一个分面网格,也许是你之前课程中使用过的数据集。注意创建这些网格所需的时间,以及如何谨慎选择需要绘制的网格数量。
## [课后测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/23)
## 复习与自学
折线图可以简单也可以非常复杂。阅读[ggplot2文档](https://ggplot2.tidyverse.org/reference/geom_path.html#:~:text=geom_line()%20connects%20them%20in,which%20cases%20are%20connected%20together),了解构建折线图的各种方法。尝试使用文档中列出的其他方法来增强你在本课中构建的折线图。
## 作业
[深入蜂巢](assignment.md)
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们概不负责。

@ -0,0 +1,171 @@
# 制作有意义的数据可视化
|![ 由 [(@sketchthedocs)](https://sketchthedocs.dev) 绘制的速写笔记 ](../../../sketchnotes/13-MeaningfulViz.png)|
|:---:|
| 有意义的数据可视化 - _速写笔记由 [@nitya](https://twitter.com/nitya) 提供_ |
> “如果你对数据施加足够的压力,它会承认任何事情。” -- [罗纳德·科斯](https://en.wikiquote.org/wiki/Ronald_Coase)
数据科学家的基本技能之一是能够创建有意义的数据可视化,以帮助回答你可能提出的问题。在可视化数据之前,你需要确保数据已经像之前课程中那样被清理和准备好。之后,你就可以开始决定如何最好地呈现数据。
在本课中,你将学习:
1. 如何选择合适的图表类型
2. 如何避免误导性图表
3. 如何使用颜色
4. 如何为图表设计提高可读性
5. 如何构建动画或3D图表解决方案
6. 如何构建创意可视化
## [课前测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/24)
## 选择合适的图表类型
在之前的课程中,你已经尝试使用 Matplotlib 和 Seaborn 构建各种有趣的数据可视化。通常,你可以使用以下表格选择适合你问题的[正确图表类型](https://chartio.com/learn/charts/how-to-select-a-data-vizualization/)
| 你的需求: | 你应该使用: |
| -------------------------- | ------------------------------- |
| 展示随时间变化的数据趋势 | 折线图 |
| 比较类别 | 条形图、饼图 |
| 比较总量 | 饼图、堆叠条形图 |
| 展示关系 | 散点图、折线图、分面图、双折线图 |
| 展示分布 | 散点图、直方图、箱线图 |
| 展示比例 | 饼图、圆环图、华夫图 |
> ✅ 根据数据的组成,你可能需要将其从文本转换为数值,以支持某些图表类型。
## 避免误导性图表
即使数据科学家小心选择了适合数据的正确图表,也有很多方法可以通过展示数据来证明某种观点,往往以牺牲数据本身为代价。有许多误导性图表和信息图的例子!
[![Alberto Cairo 的《图表如何撒谎》](../../../../../translated_images/zh-CN/tornado.2880ffc7f135f82b5e5328624799010abefd1080ae4b7ecacbdc7d792f1d8849.png)](https://www.youtube.com/watch?v=oX74Nge8Wkw "图表如何撒谎")
> 🎥 点击上方图片观看关于误导性图表的会议演讲
这个图表颠倒了 X 轴的顺序,根据日期显示了与事实相反的内容:
![错误图表 1](../../../../../translated_images/zh-CN/bad-chart-1.596bc93425a8ac301a28b8361f59a970276e7b961658ce849886aa1fed427341.png)
[这个图表](https://media.firstcoastnews.com/assets/WTLV/images/170ae16f-4643-438f-b689-50d66ca6a8d8/170ae16f-4643-438f-b689-50d66ca6a8d8_1140x641.jpg) 更具误导性,因为视觉上会让人得出结论,随着时间推移,各县的 COVID 病例数在下降。实际上,如果仔细查看日期,你会发现它们被重新排列以制造这种误导性的下降趋势。
![错误图表 2](../../../../../translated_images/zh-CN/bad-chart-2.62edf4d2f30f4e519f5ef50c07ce686e27b0196a364febf9a4d98eecd21f9f60.jpg)
这个臭名昭著的例子同时使用了颜色和颠倒的 Y 轴来误导:本应得出枪支死亡人数在通过支持枪支的立法后激增的结论,但实际上视觉上被误导认为相反的情况是真实的:
![错误图表 3](../../../../../translated_images/zh-CN/bad-chart-3.e201e2e915a230bc2cde289110604ec9abeb89be510bd82665bebc1228258972.jpg)
这个奇怪的图表展示了比例如何被操纵,效果令人啼笑皆非:
![错误图表 4](../../../../../translated_images/zh-CN/bad-chart-4.8872b2b881ffa96c3e0db10eb6aed7793efae2cac382c53932794260f7bfff07.jpg)
比较不可比的事物是另一种阴险的技巧。有一个[精彩的网站](https://tylervigen.com/spurious-correlations) 专门展示“虚假的相关性”比如缅因州的离婚率与人造黄油消费之间的“事实”相关性。Reddit 上还有一个小组收集了[数据的丑陋用法](https://www.reddit.com/r/dataisugly/top/?t=all)。
理解眼睛如何容易被误导性图表欺骗是很重要的。即使数据科学家的意图是好的,选择错误的图表类型(例如显示过多类别的饼图)也可能具有误导性。
## 颜色
你在上面“佛罗里达枪支暴力”图表中看到,颜色可以为图表提供额外的意义层次,尤其是那些没有使用如 ggplot2 和 RColorBrewer 等库设计的图表,这些库自带各种经过验证的颜色库和调色板。如果你是手动制作图表,可以稍微研究一下[颜色理论](https://colormatters.com/color-and-design/basic-color-theory)。
> ✅ 在设计图表时,请注意可访问性是可视化的重要方面。一些用户可能是色盲——你的图表是否对视觉障碍用户友好?
选择图表颜色时要小心,因为颜色可能传递你未曾预料的含义。上面“身高”图表中的“粉红女士”传递了一种明显的“女性化”含义,这增加了图表本身的怪异感。
虽然[颜色的含义](https://colormatters.com/color-symbolism/the-meanings-of-colors)可能因地区而异,并且根据其色调的不同而变化,但一般来说,颜色的含义包括:
| 颜色 | 含义 |
| ------ | ------------------- |
| 红色 | 力量 |
| 蓝色 | 信任、忠诚 |
| 黄色 | 快乐、警告 |
| 绿色 | 生态、幸运、嫉妒 |
| 紫色 | 快乐 |
| 橙色 | 活力 |
如果你需要为图表选择自定义颜色,请确保你的图表既具有可访问性,又能与试图传递的含义相符。
## 为图表设计提高可读性
如果图表不可读,它们就没有意义!花点时间考虑调整图表的宽度和高度,使其与数据比例协调。如果需要显示一个变量(例如所有 50 个州),尽量将它们垂直显示在 Y 轴上,以避免水平滚动的图表。
为你的轴添加标签,必要时提供图例,并提供工具提示以便更好地理解数据。
如果你的数据在 X 轴上是文本且较长,可以将文本倾斜以提高可读性。[plot3D](https://cran.r-project.org/web/packages/plot3D/index.html) 提供了 3D 绘图功能,如果你的数据支持的话,可以用它制作复杂的数据可视化。
![3D 图表](../../../../../translated_images/zh-CN/3d.db1734c151eee87d924989306a00e23f8cddac6a0aab122852ece220e9448def.png)
## 动画和 3D 图表展示
如今一些最佳的数据可视化是动画的。Shirley Wu 使用 D3 制作了许多惊艳的作品,例如“[电影之花](http://bl.ocks.org/sxywu/raw/d612c6c653fb8b4d7ff3d422be164a5d/)”每朵花都是一部电影的可视化。另一个为《卫报》制作的例子是“Bussed Out”一个结合了 Greensock 和 D3 的交互式体验,通过滚动叙事文章格式展示纽约市如何通过将无家可归者送出城市来处理其无家可归问题。
![Bussed Out](../../../../../translated_images/zh-CN/busing.8157cf1bc89a3f65052d362a78c72f964982ceb9dcacbe44480e35909c3dce62.png)
> “Bussed Out: 美国如何转移无家可归者” 来自 [卫报](https://www.theguardian.com/us-news/ng-interactive/2017/dec/20/bussed-out-america-moves-homeless-people-country-study)。可视化由 Nadieh Bremer 和 Shirley Wu 制作
虽然本课不足以深入教授这些强大的可视化库,但你可以尝试在 Vue.js 应用中使用 D3利用一个库展示《危险关系》这本书的动画社交网络可视化。
> 《危险关系》是一部书信体小说,或以一系列信件形式呈现的小说。由 Choderlos de Laclos 于 1782 年创作,讲述了 18 世纪末法国贵族中两位主角——瓦尔蒙子爵和梅尔特伊侯爵夫人——之间恶毒且道德败坏的社交操纵。两人最终都走向毁灭,但在此之前造成了巨大的社会破坏。小说以他们写给圈内各种人的信件展开,策划复仇或单纯制造麻烦。创建一个这些信件的可视化,发现叙事中的主要关键人物。
你将完成一个网络应用,展示这个社交网络的动画视图。它使用了一个库来创建[网络可视化](https://github.com/emiliorizzo/vue-d3-network),基于 Vue.js 和 D3。当应用运行时你可以在屏幕上拖动节点以重新排列数据。
![危险关系](../../../../../translated_images/zh-CN/liaisons.90ce7360bcf8476558f700bbbaf198ad697d5b5cb2829ba141a89c0add7c6ecd.png)
## 项目:使用 D3.js 构建一个展示网络的图表
> 本课文件夹中包含一个 `solution` 文件夹,你可以在其中找到完整的项目供参考。
1. 按照起始文件夹根目录中 README.md 文件的说明操作。在安装项目依赖项之前,确保你的机器上已运行 NPM 和 Node.js。
2. 打开 `starter/src` 文件夹。你会发现一个 `assets` 文件夹,其中包含一个 .json 文件,记录了所有信件的编号,以及“发件人”和“收件人”信息。
3. 完成 `components/Nodes.vue` 中的代码以启用可视化。找到名为 `createLinks()` 的方法,并添加以下嵌套循环。
循环遍历 .json 对象,捕获信件的“发件人”和“收件人”数据,并构建 `links` 对象,以便可视化库可以使用它:
```javascript
//loop through letters
let f = 0;
let t = 0;
for (var i = 0; i < letters.length; i++) {
for (var j = 0; j < characters.length; j++) {
if (characters[j] == letters[i].from) {
f = j;
}
if (characters[j] == letters[i].to) {
t = j;
}
}
this.links.push({ sid: f, tid: t });
}
```
从终端运行你的应用npm run serve享受可视化的乐趣
## 🚀 挑战
浏览互联网,发现误导性可视化。作者是如何误导用户的?这是有意为之吗?尝试修正这些可视化,展示它们应该如何呈现。
## [课后测验](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/25)
## 复习与自学
以下是一些关于误导性数据可视化的文章:
https://gizmodo.com/how-to-lie-with-data-visualization-1563576606
http://ixd.prattsi.org/2017/12/visual-lies-usability-in-deceptive-data-visualizations/
看看这些关于历史资产和文物的有趣可视化:
https://handbook.pubpub.org/
阅读这篇关于动画如何增强可视化的文章:
https://medium.com/@EvanSinar/use-animation-to-supercharge-data-visualization-cd905a882ad4
## 作业
[创建你自己的自定义可视化](assignment.md)
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的原始语言版本为权威来源。对于关键信息,建议使用专业人工翻译。我们对于因使用本翻译而引起的任何误解或误读不承担责任。

@ -0,0 +1,31 @@
# 可视化
![一只蜜蜂停在薰衣草花上](../../../translated_images/zh-CN/bee.0aa1d91132b12e3a8994b9ca12816d05ce1642010d9b8be37f8d37365ba845cf.jpg)
> 图片由 <a href="https://unsplash.com/@jenna2980?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Jenna Lee</a> 提供,来自 <a href="https://unsplash.com/s/photos/bees-in-a-meadow?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
数据可视化是数据科学家最重要的任务之一。图片胜过千言万语,可视化可以帮助你识别数据中的各种有趣部分,例如峰值、异常值、分组、趋势等,从而帮助你理解数据背后的故事。
在这五节课中,你将探索来自自然的数据,并使用各种技术创建有趣且美观的可视化。
| 主题编号 | 主题 | 相关课程 | 作者 |
| :-----------: | :--: | :-----------: | :----: |
| 1. | 可视化数量 | <ul> <li> [Python](09-visualization-quantities/README.md)</li> <li>[R](../../../3-Data-Visualization/R/09-visualization-quantities) </li> </ul>|<ul> <li> [Jen Looper](https://twitter.com/jenlooper)</li><li> [Vidushi Gupta](https://github.com/Vidushi-Gupta)</li> <li>[Jasleen Sondhi](https://github.com/jasleen101010)</li></ul> |
| 2. | 可视化分布 | <ul> <li> [Python](10-visualization-distributions/README.md)</li> <li>[R](../../../3-Data-Visualization/R/10-visualization-distributions) </li> </ul>|<ul> <li> [Jen Looper](https://twitter.com/jenlooper)</li><li> [Vidushi Gupta](https://github.com/Vidushi-Gupta)</li> <li>[Jasleen Sondhi](https://github.com/jasleen101010)</li></ul> |
| 3. | 可视化比例 | <ul> <li> [Python](11-visualization-proportions/README.md)</li> <li>[R](../../../3-Data-Visualization) </li> </ul>|<ul> <li> [Jen Looper](https://twitter.com/jenlooper)</li><li> [Vidushi Gupta](https://github.com/Vidushi-Gupta)</li> <li>[Jasleen Sondhi](https://github.com/jasleen101010)</li></ul> |
| 4. | 可视化关系 | <ul> <li> [Python](12-visualization-relationships/README.md)</li> <li>[R](../../../3-Data-Visualization) </li> </ul>|<ul> <li> [Jen Looper](https://twitter.com/jenlooper)</li><li> [Vidushi Gupta](https://github.com/Vidushi-Gupta)</li> <li>[Jasleen Sondhi](https://github.com/jasleen101010)</li></ul> |
| 5. | 创建有意义的可视化 | <ul> <li> [Python](13-meaningful-visualizations/README.md)</li> <li>[R](../../../3-Data-Visualization) </li> </ul>|<ul> <li> [Jen Looper](https://twitter.com/jenlooper)</li><li> [Vidushi Gupta](https://github.com/Vidushi-Gupta)</li> <li>[Jasleen Sondhi](https://github.com/jasleen101010)</li></ul> |
### 致谢
这些可视化课程由 [Jen Looper](https://twitter.com/jenlooper)、[Jasleen Sondhi](https://github.com/jasleen101010) 和 [Vidushi Gupta](https://github.com/Vidushi-Gupta) 🌸 编写。
🍯 美国蜂蜜生产数据来源于 Jessica Li 在 [Kaggle](https://www.kaggle.com/jessicali9530/honey-production) 上的项目。该 [数据](https://usda.library.cornell.edu/concern/publications/rn301137d) 来自 [美国农业部](https://www.nass.usda.gov/About_NASS/index.php)。
🍄 蘑菇数据同样来源于 [Kaggle](https://www.kaggle.com/hatterasdunton/mushroom-classification-updated-dataset),由 Hatteras Dunton 修订。该数据集包括对应于伞菌科和鳞伞科中23种有鳃蘑菇的假设样本描述。蘑菇信息摘自《奥杜邦协会北美蘑菇野外指南》1981年。该数据集于1987年捐赠给 UCI ML 27。
🦆 明尼苏达州鸟类数据来自 [Kaggle](https://www.kaggle.com/hannahcollins/minnesota-birds),由 Hannah Collins 从 [维基百科](https://en.wikipedia.org/wiki/List_of_birds_of_Minnesota) 抓取。
所有这些数据集均以 [CC0: Creative Commons](https://creativecommons.org/publicdomain/zero/1.0/) 授权。
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,111 @@
# 数据科学生命周期简介
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/14-DataScience-Lifecycle.png)|
|:---:|
| 数据科学生命周期简介 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/26)
到目前为止,你可能已经意识到数据科学是一个过程。这个过程可以分为五个阶段:
- 数据捕获
- 数据处理
- 数据分析
- 数据沟通
- 数据维护
本课程重点讲解生命周期中的三个部分:数据捕获、数据处理和数据维护。
![数据科学生命周期图示](../../../../translated_images/zh-CN/data-science-lifecycle.a1e362637503c4fb0cd5e859d7552edcdb4aa629a279727008baa121f2d33f32.jpg)
> 图片来源:[伯克利信息学院](https://ischoolonline.berkeley.edu/data-science/what-is-data-science/)
## 数据捕获
生命周期的第一阶段非常重要,因为后续阶段都依赖于它。实际上,这个阶段可以看作是两个阶段的结合:获取数据以及定义需要解决的目标和问题。
定义项目目标需要深入了解问题或问题背景。首先,我们需要识别并获取那些需要解决问题的人。这些可能是企业的利益相关者或项目的赞助者,他们可以帮助确定谁或什么会从项目中受益,以及他们需要什么和为什么需要它。一个明确的目标应该是可衡量和量化的,以定义可接受的结果。
数据科学家可能会问的问题:
- 这个问题以前是否被研究过?发现了什么?
- 所有相关人员是否都理解目标和目的?
- 是否存在模糊性?如何减少模糊性?
- 有哪些约束条件?
- 最终结果可能是什么样子?
- 有多少资源(时间、人力、计算能力)可用?
接下来是识别、收集并最终探索实现这些目标所需的数据。在数据获取的这一步,数据科学家还需要评估数据的数量和质量。这需要一些数据探索,以确认所获取的数据是否能够支持实现预期结果。
数据科学家可能会问关于数据的问题:
- 我已经拥有了哪些数据?
- 谁拥有这些数据?
- 有哪些隐私问题?
- 我是否有足够的数据来解决这个问题?
- 数据的质量是否适合解决这个问题?
- 如果通过这些数据发现了额外的信息,我们是否应该考虑改变或重新定义目标?
## 数据处理
生命周期的处理阶段专注于发现数据中的模式以及建模。一些处理阶段使用的技术需要统计方法来揭示模式。通常,对于一个大型数据集来说,这将是一个繁琐的任务,因此需要依赖计算机来加速处理过程。在这个阶段,数据科学和机器学习会交叉。正如你在第一课中学到的,机器学习是构建模型以理解数据的过程。模型是数据中变量之间关系的表示,帮助预测结果。
此阶段常用的技术在《机器学习初学者》课程中有详细介绍。点击以下链接了解更多:
- [分类](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification):将数据组织到类别中以提高使用效率。
- [聚类](https://github.com/microsoft/ML-For-Beginners/tree/main/5-Clustering):将数据分组到相似的群组中。
- [回归](https://github.com/microsoft/ML-For-Beginners/tree/main/2-Regression):确定变量之间的关系以预测或预估值。
## 数据维护
在生命周期图示中,你可能注意到维护位于数据捕获和数据处理之间。维护是一个持续的过程,贯穿项目的整个过程,涉及数据的管理、存储和安全性。
### 数据存储
数据存储的方式和位置会影响存储成本以及数据访问的性能。这些决策通常不会由数据科学家单独做出,但他们可能需要根据数据存储方式选择如何处理数据。
以下是现代数据存储系统的一些方面,这些方面可能会影响决策:
**本地存储 vs 外部存储 vs 公有云或私有云**
本地存储指的是使用自己的设备管理数据,例如拥有一个存储数据的服务器,而外部存储依赖于你不拥有的设备,例如数据中心。公有云是存储数据的流行选择,它不需要了解数据具体存储的位置或方式,公有指的是所有使用云服务的人共享统一的基础设施。一些组织有严格的安全政策,要求完全访问存储数据的设备,因此会选择提供自身云服务的私有云。在[后续课程](https://github.com/microsoft/Data-Science-For-Beginners/tree/main/5-Data-Science-In-Cloud)中,你将学习更多关于云中的数据。
**冷数据 vs 热数据**
在训练模型时,你可能需要更多的训练数据。如果你对模型满意,更多的数据会到来以支持模型的用途。无论如何,随着数据的积累,存储和访问数据的成本都会增加。将很少使用的冷数据与频繁访问的热数据分离,可以通过硬件或软件服务实现更便宜的数据存储选项。如果需要访问冷数据,可能会比热数据的检索时间稍长。
### 数据管理
在处理数据时,你可能会发现一些数据需要使用[数据准备](https://github.com/microsoft/Data-Science-For-Beginners/tree/main/2-Working-With-Data/08-data-preparation)课程中介绍的技术进行清理以构建准确的模型。当新数据到来时也需要应用相同的技术以保持质量的一致性。一些项目会使用自动化工具进行清理、聚合和压缩然后将数据移动到最终位置。Azure Data Factory 就是这些工具的一个例子。
### 数据安全
数据安全的主要目标之一是确保数据的收集和使用在控制范围内。保持数据安全包括限制只有需要的人才能访问数据,遵守当地法律法规,以及维护伦理标准,这些内容在[伦理课程](https://github.com/microsoft/Data-Science-For-Beginners/tree/main/1-Introduction/02-ethics)中有介绍。
团队可能会采取以下措施以确保数据安全:
- 确保所有数据都已加密
- 向客户提供关于数据使用方式的信息
- 移除已离开项目人员的数据访问权限
- 仅允许特定项目成员修改数据
## 🚀 挑战
数据科学生命周期有许多版本,每个版本的步骤可能有不同的名称和阶段数量,但包含的过程与本课程中提到的相同。
探索[团队数据科学过程生命周期](https://docs.microsoft.com/en-us/azure/architecture/data-science-process/lifecycle)和[跨行业数据挖掘标准过程](https://www.datascience-pm.com/crisp-dm-2/)。列举两者的三个相似点和不同点。
|团队数据科学过程 (TDSP)|跨行业数据挖掘标准过程 (CRISP-DM)|
|--|--|
|![团队数据科学生命周期](../../../../translated_images/zh-CN/tdsp-lifecycle2.e19029d598e2e73d5ef8a4b98837d688ec6044fe332c905d4dbb69eb6d5c1d96.png) | ![数据科学过程联盟图片](../../../../translated_images/zh-CN/CRISP-DM.8bad2b4c66e62aa75278009e38e3e99902c73b0a6f63fd605a67c687a536698c.png) |
| 图片来源:[Microsoft](https://docs.microsoft.comazure/architecture/data-science-process/lifecycle) | 图片来源:[数据科学过程联盟](https://www.datascience-pm.com/crisp-dm-2/) |
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/27)
## 复习与自学
应用数据科学生命周期涉及多个角色和任务,其中一些可能专注于每个阶段的特定部分。团队数据科学过程提供了一些资源,解释了项目中可能涉及的角色和任务类型。
* [团队数据科学过程中的角色和任务](https://docs.microsoft.com/en-us/azure/architecture/data-science-process/roles-tasks)
* [执行数据科学任务:探索、建模和部署](https://docs.microsoft.com/en-us/azure/architecture/data-science-process/execute-data-science-tasks)
## 作业
[评估数据集](assignment.md)
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,26 @@
# 评估数据集
一位客户向您的团队寻求帮助,调查纽约市出租车乘客的季节性消费习惯。
他们想知道:**纽约市的黄色出租车乘客在冬季还是夏季给司机的小费更多?**
您的团队正处于数据科学生命周期的[捕获](Readme.md#Capturing)阶段,而您负责处理数据集。您已获得一个笔记本和[数据](../../../../data/taxi.csv)供探索。
在此目录中有一个[笔记本](../../../../4-Data-Science-Lifecycle/14-Introduction/notebook.ipynb),使用 Python 从[纽约市出租车与豪华车委员会](https://docs.microsoft.com/en-us/azure/open-datasets/dataset-taxi-yellow?tabs=azureml-opendatasets)加载黄色出租车行程数据。
您也可以在文本编辑器或电子表格软件(如 Excel中打开出租车数据文件。
## 指导
- 评估此数据集中的数据是否能够帮助回答问题。
- 探索[纽约市开放数据目录](https://data.cityofnewyork.us/browse?sortBy=most_accessed&utf8=%E2%9C%93)。确定一个可能有助于回答客户问题的额外数据集。
- 提出三个问题,以便向客户寻求更多澄清并更好地理解问题。
参考[数据集字典](https://www1.nyc.gov/assets/tlc/downloads/pdf/data_dictionary_trip_records_yellow.pdf)和[用户指南](https://www1.nyc.gov/assets/tlc/downloads/pdf/trip_record_user_guide.pdf),以获取有关数据的更多信息。
## 评分标准
优秀 | 合格 | 需要改进
--- | --- | ---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,140 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# 冬季和夏季的纽约出租车数据\n",
"\n",
"请参考[数据字典](https://www1.nyc.gov/assets/tlc/downloads/pdf/data_dictionary_trip_records_yellow.pdf)了解提供的列的详细信息。\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"#Install the pandas library\r\n",
"!pip install pandas"
],
"outputs": [],
"metadata": {
"scrolled": true
}
},
{
"cell_type": "code",
"execution_count": 7,
"source": [
"import pandas as pd\r\n",
"\r\n",
"path = '../../data/taxi.csv'\r\n",
"\r\n",
"#Load the csv file into a dataframe\r\n",
"df = pd.read_csv(path)\r\n",
"\r\n",
"#Print the dataframe\r\n",
"print(df)\r\n"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count \\\n",
"0 2.0 2019-07-15 16:27:53 2019-07-15 16:44:21 3.0 \n",
"1 2.0 2019-07-17 20:26:35 2019-07-17 20:40:09 6.0 \n",
"2 2.0 2019-07-06 16:01:08 2019-07-06 16:10:25 1.0 \n",
"3 1.0 2019-07-18 22:32:23 2019-07-18 22:35:08 1.0 \n",
"4 2.0 2019-07-19 14:54:29 2019-07-19 15:19:08 1.0 \n",
".. ... ... ... ... \n",
"195 2.0 2019-01-18 08:42:15 2019-01-18 08:56:57 1.0 \n",
"196 1.0 2019-01-19 04:34:45 2019-01-19 04:43:44 1.0 \n",
"197 2.0 2019-01-05 10:37:39 2019-01-05 10:42:03 1.0 \n",
"198 2.0 2019-01-23 10:36:29 2019-01-23 10:44:34 2.0 \n",
"199 2.0 2019-01-30 06:55:58 2019-01-30 07:07:02 5.0 \n",
"\n",
" trip_distance RatecodeID store_and_fwd_flag PULocationID DOLocationID \\\n",
"0 2.02 1.0 N 186 233 \n",
"1 1.59 1.0 N 141 161 \n",
"2 1.69 1.0 N 246 249 \n",
"3 0.90 1.0 N 229 141 \n",
"4 4.79 1.0 N 237 107 \n",
".. ... ... ... ... ... \n",
"195 1.18 1.0 N 43 237 \n",
"196 2.30 1.0 N 148 234 \n",
"197 0.83 1.0 N 237 263 \n",
"198 1.12 1.0 N 144 113 \n",
"199 2.41 1.0 N 209 107 \n",
"\n",
" payment_type fare_amount extra mta_tax tip_amount tolls_amount \\\n",
"0 1.0 12.0 1.0 0.5 4.08 0.0 \n",
"1 2.0 10.0 0.5 0.5 0.00 0.0 \n",
"2 2.0 8.5 0.0 0.5 0.00 0.0 \n",
"3 1.0 4.5 3.0 0.5 1.65 0.0 \n",
"4 1.0 19.5 0.0 0.5 5.70 0.0 \n",
".. ... ... ... ... ... ... \n",
"195 1.0 10.0 0.0 0.5 2.16 0.0 \n",
"196 1.0 9.5 0.5 0.5 2.15 0.0 \n",
"197 1.0 5.0 0.0 0.5 1.16 0.0 \n",
"198 2.0 7.0 0.0 0.5 0.00 0.0 \n",
"199 1.0 10.5 0.0 0.5 1.00 0.0 \n",
"\n",
" improvement_surcharge total_amount congestion_surcharge \n",
"0 0.3 20.38 2.5 \n",
"1 0.3 13.80 2.5 \n",
"2 0.3 11.80 2.5 \n",
"3 0.3 9.95 2.5 \n",
"4 0.3 28.50 2.5 \n",
".. ... ... ... \n",
"195 0.3 12.96 0.0 \n",
"196 0.3 12.95 0.0 \n",
"197 0.3 6.96 0.0 \n",
"198 0.3 7.80 0.0 \n",
"199 0.3 12.30 0.0 \n",
"\n",
"[200 rows x 18 columns]\n"
]
}
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读,我们概不负责。\n"
]
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3.9.7 64-bit ('venv': venv)"
},
"language_info": {
"mimetype": "text/x-python",
"name": "python",
"pygments_lexer": "ipython3",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"version": "3.9.7",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"name": "04-nyc-taxi-join-weather-in-pandas",
"notebookId": 1709144033725344,
"interpreter": {
"hash": "6b9b57232c4b57163d057191678da2030059e733b8becc68f245de5a75abe84e"
},
"coopTranslator": {
"original_hash": "3bd4c20c4e8f3158f483f0f1cc543bb1",
"translation_date": "2025-09-02T08:36:28+00:00",
"source_file": "4-Data-Science-Lifecycle/14-Introduction/notebook.ipynb",
"language_code": "zh"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,55 @@
# 数据科学生命周期:分析
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/15-Analyzing.png)|
|:---:|
| 数据科学生命周期:分析 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/28)
数据生命周期中的分析阶段旨在确认数据是否能够回答提出的问题或解决特定问题。这一步还可以用于验证模型是否正确地解决了这些问题。本课程重点介绍探索性数据分析EDA这是一种定义数据特征和关系的技术并可用于为建模准备数据。
我们将使用 [Kaggle](https://www.kaggle.com/balaka18/email-spam-classification-dataset-csv/version/1) 提供的示例数据集,展示如何通过 Python 和 Pandas 库应用这些技术。该数据集包含一些常见单词在电子邮件中的出现次数,这些电子邮件的来源是匿名的。请使用本目录中的 [notebook](notebook.ipynb) 跟随学习。
## 探索性数据分析
生命周期的捕获阶段是获取数据以及明确问题和问题所在,但我们如何知道数据能够支持最终结果呢?
回想一下,数据科学家在获取数据时可能会问以下问题:
- 我是否有足够的数据来解决这个问题?
- 数据的质量是否适合解决这个问题?
- 如果通过数据发现了额外的信息,我们是否应该考虑改变或重新定义目标?
探索性数据分析是了解数据的过程,可以用来回答这些问题,同时识别处理数据集时可能面临的挑战。让我们来看看实现这些目标的一些技术。
## 数据分析、描述性统计和 Pandas
我们如何评估是否有足够的数据来解决问题?数据分析可以通过描述性统计技术总结并收集数据集的一些总体信息。数据分析帮助我们了解可用的数据,而描述性统计帮助我们了解数据的数量。
在之前的一些课程中,我们使用 Pandas 的 [`describe()` 函数](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html) 提供了一些描述性统计信息。它可以对数值数据提供计数、最大值和最小值、平均值、标准差以及分位数等信息。使用像 `describe()` 这样的描述性统计方法可以帮助你评估数据量是否足够,是否需要更多数据。
## 抽样和查询
在大型数据集中探索所有内容可能非常耗时,通常由计算机完成。然而,抽样是一种理解数据的有用工具,可以帮助我们更好地了解数据集的内容及其代表的意义。通过抽样,你可以应用概率和统计方法对数据得出一些总体结论。虽然没有明确规定应该抽取多少数据,但需要注意的是,抽取的数据越多,对数据的总体概括就越精确。
Pandas 提供了 [`sample()` 函数](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sample.html),你可以传递参数来指定需要的随机样本数量。
对数据进行一般查询可以帮助你回答一些普遍的问题和假设。与抽样不同,查询允许你控制并专注于数据中你感兴趣的特定部分。
Pandas 库中的 [`query()` 函数](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html) 允许你选择列并通过检索的行获得关于数据的简单答案。
## 使用可视化进行探索
你不必等到数据完全清理和分析后再开始创建可视化。事实上,在探索阶段创建可视化可以帮助识别数据中的模式、关系和问题。此外,可视化为那些未直接参与数据管理的人提供了一种沟通方式,同时也可以是一个机会,用于分享和澄清捕获阶段未解决的额外问题。参考 [可视化部分](../../../../../../../../../3-Data-Visualization) 了解一些流行的可视化方法。
## 探索以识别不一致性
本课程中的所有主题都可以帮助识别缺失或不一致的值,而 Pandas 提供了一些函数来检查这些问题。[isna() 或 isnull()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.isna.html) 可以检查缺失值。探索这些值为何会出现缺失是一个重要的步骤,这可以帮助你决定采取哪些 [措施来解决这些问题](/2-Working-With-Data/08-data-preparation/notebook.ipynb)。
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/29)
## 作业
[探索答案](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而导致的任何误解或误读,我们概不负责。

@ -0,0 +1,154 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# 冬季和夏季的纽约出租车数据\n",
"\n",
"请参考 [数据字典](https://www1.nyc.gov/assets/tlc/downloads/pdf/data_dictionary_trip_records_yellow.pdf) 了解提供的列的详细信息。\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"#Install the pandas library\r\n",
"!pip install pandas"
],
"outputs": [],
"metadata": {
"scrolled": true
}
},
{
"cell_type": "code",
"execution_count": 7,
"source": [
"import pandas as pd\r\n",
"\r\n",
"path = '../../data/taxi.csv'\r\n",
"\r\n",
"#Load the csv file into a dataframe\r\n",
"df = pd.read_csv(path)\r\n",
"\r\n",
"#Print the dataframe\r\n",
"print(df)\r\n"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count \\\n",
"0 2.0 2019-07-15 16:27:53 2019-07-15 16:44:21 3.0 \n",
"1 2.0 2019-07-17 20:26:35 2019-07-17 20:40:09 6.0 \n",
"2 2.0 2019-07-06 16:01:08 2019-07-06 16:10:25 1.0 \n",
"3 1.0 2019-07-18 22:32:23 2019-07-18 22:35:08 1.0 \n",
"4 2.0 2019-07-19 14:54:29 2019-07-19 15:19:08 1.0 \n",
".. ... ... ... ... \n",
"195 2.0 2019-01-18 08:42:15 2019-01-18 08:56:57 1.0 \n",
"196 1.0 2019-01-19 04:34:45 2019-01-19 04:43:44 1.0 \n",
"197 2.0 2019-01-05 10:37:39 2019-01-05 10:42:03 1.0 \n",
"198 2.0 2019-01-23 10:36:29 2019-01-23 10:44:34 2.0 \n",
"199 2.0 2019-01-30 06:55:58 2019-01-30 07:07:02 5.0 \n",
"\n",
" trip_distance RatecodeID store_and_fwd_flag PULocationID DOLocationID \\\n",
"0 2.02 1.0 N 186 233 \n",
"1 1.59 1.0 N 141 161 \n",
"2 1.69 1.0 N 246 249 \n",
"3 0.90 1.0 N 229 141 \n",
"4 4.79 1.0 N 237 107 \n",
".. ... ... ... ... ... \n",
"195 1.18 1.0 N 43 237 \n",
"196 2.30 1.0 N 148 234 \n",
"197 0.83 1.0 N 237 263 \n",
"198 1.12 1.0 N 144 113 \n",
"199 2.41 1.0 N 209 107 \n",
"\n",
" payment_type fare_amount extra mta_tax tip_amount tolls_amount \\\n",
"0 1.0 12.0 1.0 0.5 4.08 0.0 \n",
"1 2.0 10.0 0.5 0.5 0.00 0.0 \n",
"2 2.0 8.5 0.0 0.5 0.00 0.0 \n",
"3 1.0 4.5 3.0 0.5 1.65 0.0 \n",
"4 1.0 19.5 0.0 0.5 5.70 0.0 \n",
".. ... ... ... ... ... ... \n",
"195 1.0 10.0 0.0 0.5 2.16 0.0 \n",
"196 1.0 9.5 0.5 0.5 2.15 0.0 \n",
"197 1.0 5.0 0.0 0.5 1.16 0.0 \n",
"198 2.0 7.0 0.0 0.5 0.00 0.0 \n",
"199 1.0 10.5 0.0 0.5 1.00 0.0 \n",
"\n",
" improvement_surcharge total_amount congestion_surcharge \n",
"0 0.3 20.38 2.5 \n",
"1 0.3 13.80 2.5 \n",
"2 0.3 11.80 2.5 \n",
"3 0.3 9.95 2.5 \n",
"4 0.3 28.50 2.5 \n",
".. ... ... ... \n",
"195 0.3 12.96 0.0 \n",
"196 0.3 12.95 0.0 \n",
"197 0.3 6.96 0.0 \n",
"198 0.3 7.80 0.0 \n",
"199 0.3 12.30 0.0 \n",
"\n",
"[200 rows x 18 columns]\n"
]
}
],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"# 使用以下单元格进行自己的探索性数据分析\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读,我们概不负责。\n"
]
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3.9.7 64-bit ('venv': venv)"
},
"language_info": {
"mimetype": "text/x-python",
"name": "python",
"pygments_lexer": "ipython3",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"version": "3.9.7",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"name": "04-nyc-taxi-join-weather-in-pandas",
"notebookId": 1709144033725344,
"interpreter": {
"hash": "6b9b57232c4b57163d057191678da2030059e733b8becc68f245de5a75abe84e"
},
"coopTranslator": {
"original_hash": "7bca1c1abc1e55842817b62e44e1a963",
"translation_date": "2025-09-02T08:33:58+00:00",
"source_file": "4-Data-Science-Lifecycle/15-analyzing/assignment.ipynb",
"language_code": "zh"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,25 @@
# 探索答案
这是上一节课[作业](../14-Introduction/assignment.md)的延续,我们之前简单浏览了数据集。现在我们将更深入地研究这些数据。
客户想知道的问题是:**纽约市的黄色出租车乘客在冬季还是夏季给司机的小费更多?**
您的团队目前处于数据科学生命周期的[分析](README.md)阶段负责对数据集进行探索性数据分析。您已获得一个包含2019年1月和7月200笔出租车交易的笔记本和数据集。
## 指导说明
在此目录中,有一个[笔记本](../../../../4-Data-Science-Lifecycle/15-analyzing/assignment.ipynb)和来自[出租车与豪华轿车委员会](https://docs.microsoft.com/en-us/azure/open-datasets/dataset-taxi-yellow?tabs=azureml-opendatasets)的数据。有关数据的更多信息,请参考[数据字典](https://www1.nyc.gov/assets/tlc/downloads/pdf/data_dictionary_trip_records_yellow.pdf)和[用户指南](https://www1.nyc.gov/assets/tlc/downloads/pdf/trip_record_user_guide.pdf)。
使用本课中的一些技术在笔记本中进行自己的EDA可以添加单元格并回答以下问题
- 数据中还有哪些因素可能会影响小费金额?
- 哪些列最有可能不需要用来回答客户的问题?
- 根据目前提供的信息,数据是否显示出任何季节性小费行为的证据?
## 评分标准
优秀 | 合格 | 需要改进
--- | --- | ---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,193 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# 数据分析\n",
"[课程](README.md)中提到的 Pandas 函数示例。\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 1,
"source": [
"import pandas as pd\r\n",
"import glob\r\n",
"\r\n",
"#Loading the dataset\r\n",
"path = '../../data/emails.csv'\r\n",
"email_df = pd.read_csv(path)"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 2,
"source": [
"# Using Describe on the email dataset\r\n",
"print(email_df.describe())"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" the to ect and for of \\\n",
"count 406.000000 406.000000 406.000000 406.000000 406.000000 406.000000 \n",
"mean 7.022167 6.519704 4.948276 3.059113 3.502463 2.662562 \n",
"std 10.945522 9.801907 9.293820 6.267806 4.901372 5.443939 \n",
"min 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 \n",
"25% 1.000000 1.000000 1.000000 0.000000 1.000000 0.000000 \n",
"50% 3.000000 3.000000 2.000000 1.000000 2.000000 1.000000 \n",
"75% 9.000000 7.750000 4.000000 3.000000 4.750000 3.000000 \n",
"max 99.000000 88.000000 79.000000 69.000000 39.000000 57.000000 \n",
"\n",
" a you in on is this \\\n",
"count 406.000000 406.000000 406.000000 406.000000 406.000000 406.000000 \n",
"mean 57.017241 2.394089 10.817734 11.591133 5.901478 1.485222 \n",
"std 78.868243 4.067015 19.050972 16.407175 8.793103 2.912473 \n",
"min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"25% 15.000000 0.000000 1.250000 3.000000 1.000000 0.000000 \n",
"50% 29.000000 1.000000 5.000000 6.000000 3.000000 0.000000 \n",
"75% 61.000000 3.000000 12.000000 13.000000 7.000000 2.000000 \n",
"max 843.000000 31.000000 223.000000 125.000000 61.000000 24.000000 \n",
"\n",
" i be that will \n",
"count 406.000000 406.000000 406.000000 406.000000 \n",
"mean 47.155172 2.950739 1.034483 0.955665 \n",
"std 71.043009 4.297865 1.904846 2.042271 \n",
"min 0.000000 0.000000 0.000000 0.000000 \n",
"25% 11.000000 1.000000 0.000000 0.000000 \n",
"50% 24.000000 1.000000 0.000000 0.000000 \n",
"75% 50.750000 3.000000 1.000000 1.000000 \n",
"max 754.000000 40.000000 14.000000 24.000000 \n"
]
}
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 5,
"source": [
"# Sampling 10 emails\r\n",
"print(email_df.sample(10))"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" Email No. the to ect and for of a you in on is this i \\\n",
"150 Email 151 0 1 2 0 3 0 15 0 0 5 0 0 7 \n",
"380 Email 5147 0 3 2 0 0 0 7 0 1 1 0 0 3 \n",
"19 Email 20 3 4 11 0 4 2 32 1 1 3 9 5 25 \n",
"300 Email 301 2 1 1 0 1 1 15 2 2 3 2 0 8 \n",
"307 Email 308 0 0 1 0 0 0 1 0 1 0 0 0 2 \n",
"167 Email 168 2 2 2 1 5 1 24 2 5 6 4 0 30 \n",
"320 Email 321 10 12 4 6 8 6 187 5 26 28 23 2 171 \n",
"61 Email 62 0 1 1 0 4 1 15 4 4 3 3 0 19 \n",
"26 Email 27 5 4 1 1 4 4 51 0 8 6 6 2 44 \n",
"73 Email 74 0 0 1 0 0 0 7 0 4 3 0 0 6 \n",
"\n",
" be that will \n",
"150 1 0 0 \n",
"380 0 0 0 \n",
"19 3 0 1 \n",
"300 0 0 0 \n",
"307 0 0 0 \n",
"167 2 0 0 \n",
"320 5 1 1 \n",
"61 2 0 0 \n",
"26 6 0 0 \n",
"73 0 0 0 \n"
]
}
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 14,
"source": [
"# Returns rows where there are more occurrences of \"to\" than \"the\"\r\n",
"print(email_df.query('the < to'))"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" Email No. the to ect and for of a you in on is this i \\\n",
"1 Email 2 8 13 24 6 6 2 102 1 18 21 13 0 61 \n",
"3 Email 4 0 5 22 0 5 1 51 2 1 5 9 2 16 \n",
"5 Email 6 4 5 1 4 2 3 45 1 16 12 8 1 52 \n",
"7 Email 8 0 2 2 3 1 2 21 6 2 6 2 0 28 \n",
"13 Email 14 4 5 7 1 5 1 37 1 8 8 6 1 43 \n",
".. ... ... .. ... ... ... .. ... ... .. .. .. ... .. \n",
"390 Email 5157 4 13 1 0 3 1 48 2 8 26 9 1 45 \n",
"393 Email 5160 2 13 1 0 2 1 38 2 7 24 6 1 34 \n",
"396 Email 5163 2 3 1 2 1 2 32 0 7 3 2 0 26 \n",
"404 Email 5171 2 7 1 0 2 1 28 2 8 11 7 1 39 \n",
"405 Email 5172 22 24 5 1 6 5 148 8 23 13 5 4 99 \n",
"\n",
" be that will \n",
"1 4 2 0 \n",
"3 2 0 0 \n",
"5 2 0 0 \n",
"7 1 0 1 \n",
"13 1 0 1 \n",
".. .. ... ... \n",
"390 1 0 0 \n",
"393 1 0 0 \n",
"396 3 0 0 \n",
"404 1 0 0 \n",
"405 6 4 1 \n",
"\n",
"[169 rows x 17 columns]\n"
]
}
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。\n"
]
}
],
"metadata": {
"orig_nbformat": 4,
"language_info": {
"name": "python",
"version": "3.9.7",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.9.7 64-bit ('venv': venv)"
},
"interpreter": {
"hash": "6b9b57232c4b57163d057191678da2030059e733b8becc68f245de5a75abe84e"
},
"coopTranslator": {
"original_hash": "9d102c8c3cdbc8ea4e92fc32593462c6",
"translation_date": "2025-09-02T08:30:51+00:00",
"source_file": "4-Data-Science-Lifecycle/15-analyzing/notebook.ipynb",
"language_code": "zh"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,213 @@
# 数据科学生命周期:沟通
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev)](../../sketchnotes/16-Communicating.png)|
|:---:|
| 数据科学生命周期:沟通 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/30)
通过上方的课前测验测试你对即将学习内容的了解!
# 简介
### 什么是沟通?
让我们从定义沟通开始这节课。**沟通是传递或交换信息的过程。** 信息可以是想法、思考、感受、消息、隐秘信号、数据——任何一个**_发送者_**(发送信息的人)希望**_接收者_**(接收信息的人)理解的内容。在这节课中,我们将把发送者称为沟通者,而接收者称为受众。
### 数据沟通与讲故事
我们知道,沟通的目的是传递或交换信息。但在沟通数据时,你的目标不应该仅仅是向受众传递数字,而是要讲述一个由数据支撑的故事——有效的数据沟通与讲故事是密不可分的。你的受众更可能记住你讲述的故事,而不是你提供的数字。在这节课的后面,我们将讨论一些方法,帮助你通过讲故事更有效地沟通数据。
### 沟通的类型
在这节课中,我们将讨论两种不同类型的沟通:单向沟通和双向沟通。
**单向沟通**是指发送者向接收者传递信息,而没有任何反馈或回应。我们每天都能看到单向沟通的例子——例如群发邮件、新闻报道最新事件,或者电视广告告诉你他们的产品有多好。在这些情况下,发送者并不寻求信息的交换,他们只是想传递或提供信息。
**双向沟通**是指所有参与方既是发送者又是接收者。发送者首先向接收者沟通,接收者则提供反馈或回应。双向沟通是我们通常所认为的沟通方式。我们通常想到的是人与人之间的对话——无论是面对面交流,还是通过电话、社交媒体或短信。
在沟通数据时,有些情况下你会使用单向沟通(比如在会议或大型群体中进行演讲,之后不会直接提问),而有些情况下你会使用双向沟通(比如用数据说服一些利益相关者支持,或者说服团队成员投入时间和精力开发新项目)。
# 有效沟通
### 作为沟通者的责任
在沟通时,你的责任是确保接收者能够获取你希望他们获取的信息。在沟通数据时,你不仅希望接收者记住数字,还希望他们记住一个由数据支撑的故事。一个优秀的数据沟通者也是一个优秀的讲故事者。
如何用数据讲故事方法有无数种——但以下是我们将在这节课中讨论的6种方法
1. 了解你的受众、沟通渠道和沟通方式
2. 从结果出发
3. 像讲传统故事一样构建
4. 使用有意义的词语和短语
5. 运用情感
以下将详细解释每种策略。
### 1. 了解你的受众、沟通渠道和沟通方式
你与家人沟通的方式可能与和朋友沟通的方式不同。你可能会使用不同的词语和短语,以便让对方更容易理解。沟通数据时也应该采取同样的方式。思考你正在与谁沟通,思考他们的目标以及他们对你所解释的情况的背景了解。
你可以将大多数受众归类到某个类别中。在《哈佛商业评论》的一篇文章“[如何用数据讲故事](http://blogs.hbr.org/2013/04/how-to-tell-a-story-with-data/)”中戴尔的战略顾问Jim Stikeleather将受众分为五类
- **初学者**:第一次接触主题,但不希望过于简化
- **普通人**:对主题有所了解,但希望获得概述和主要内容
- **管理者**:深入、可操作的理解,包括复杂性和相互关系,并能访问详细信息
- **专家**:更倾向于探索和发现,而不是讲故事,关注细节
- **高管**:只关注权重概率的意义和结论
这些类别可以帮助你决定如何向受众展示数据。
除了考虑受众的类别,你还应该考虑与受众沟通的渠道。如果你是写备忘录或邮件,与开会或在会议上演讲的方式会有所不同。
在了解受众的基础上,了解你将如何与他们沟通(使用单向沟通还是双向沟通)也至关重要。
如果你的受众主要是初学者,并且你使用单向沟通,你必须首先教育受众并提供适当的背景信息。然后你需要向他们展示你的数据,告诉他们数据的意义以及数据的重要性。在这种情况下,你可能需要专注于传递清晰的信息,因为你的受众无法直接向你提问。
如果你的受众主要是管理者,并且你使用双向沟通,你可能不需要教育受众或提供太多背景信息。你可以直接讨论你收集的数据及其重要性。然而,在这种情况下,你需要关注时间和控制你的演示。当使用双向沟通时(尤其是面对寻求“可操作的复杂性和相互关系理解”的管理者受众),可能会出现问题,将讨论引向与你试图讲述的故事无关的方向。当这种情况发生时,你可以采取行动,将讨论拉回到你的故事上。
### 2. 从结果出发
从结果出发意味着在开始沟通之前,明确你希望受众获得的关键信息。提前思考你希望受众获取的信息,可以帮助你构建一个他们能够跟随的故事。从结果出发适用于单向沟通和双向沟通。
如何从结果出发?在沟通数据之前,写下你的关键信息点。然后,在准备用数据讲述的故事的每一步,都问自己:“这如何融入我正在讲述的故事?”
注意——虽然从结果出发是理想的,但你不应该只沟通支持你预期结果的数据。这种做法被称为“选择性呈现”,即沟通者只传递支持自己观点的数据,而忽略其他数据。
如果你收集的所有数据都清楚地支持你的预期结果,那很好。但如果有数据不支持你的结果,甚至支持与你关键信息相反的观点,你也应该传递这些数据。如果出现这种情况,要坦诚地告诉受众为什么尽管所有数据并不完全支持你的故事,你仍然选择坚持自己的故事。
### 3. 像讲传统故事一样构建
一个传统故事通常分为五个阶段。你可能听过这些阶段被描述为:背景介绍、情节发展、高潮、情节收尾和结局。或者更容易记住的:背景、冲突、高潮、收尾、结论。在沟通你的数据和故事时,你可以采取类似的方式。
你可以从背景开始,设定场景,确保你的受众都在同一页上。然后引入冲突。为什么需要收集这些数据?你试图解决什么问题?接下来是高潮。数据是什么?数据的意义是什么?数据告诉我们需要什么解决方案?然后是收尾,你可以重申问题和提出的解决方案。最后是结论,你可以总结关键信息点以及你建议团队采取的下一步行动。
### 4. 使用有意义的词语和短语
如果我们一起开发一个产品,我对你说“我们的用户在平台上注册的时间很长”,你会估计“很长”是多久?一个小时?一周?很难知道。如果我对整个受众说这句话,每个人可能会对用户注册时间有不同的理解。
但如果我说“我们的用户平均花费3分钟注册并完成平台的使用”那就更清晰了。
在沟通数据时,很容易认为受众的思维方式和你一样。但事实并非总是如此。让数据及其意义清晰是你作为沟通者的责任。如果数据或故事不清晰,受众会难以跟随,也更难理解你的关键信息。
通过使用有意义的词语和短语,而不是模糊的表达,可以更清晰地沟通数据。以下是一些例子:
- 我们今年表现*令人印象深刻*
- 一个人可能认为“令人印象深刻”意味着收入增长2%-3%另一个人可能认为是50%-60%的增长。
- 我们用户的成功率*显著*提高。
- 多大的增长才算显著?
- 这个项目需要*大量*的努力。
- 多少努力才算大量?
使用模糊的词语可能在引入更多数据或总结故事时有用。但请确保你的演示的每一部分对受众来说都是清晰的。
### 5. 运用情感
情感是讲故事的关键。在用数据讲故事时,情感更为重要。当你沟通数据时,一切都围绕你希望受众获取的关键信息展开。唤起受众的情感可以帮助他们产生共鸣,并更有可能采取行动。情感也能增加受众记住你的信息的可能性。
你可能在电视广告中遇到过这种情况。有些广告非常沉重,用悲伤的情感与受众连接,让他们更关注广告中呈现的数据。或者,有些广告非常欢快,让你将数据与快乐的情感联系起来。
如何在沟通数据时运用情感?以下是几种方法:
- 使用推荐和个人故事
- 在收集数据时,尝试收集定量和定性数据,并在沟通时整合这两种数据。如果你的数据主要是定量的,尝试从个人那里收集故事,了解他们对数据所反映情况的体验。
- 使用图像
- 图像可以帮助受众将自己代入某种情境。当你使用图像时,可以引导受众产生你希望他们对数据产生的情感。
- 使用颜色
- 不同的颜色会唤起不同的情感。以下是一些常见颜色及其通常唤起的情感。注意,颜色在不同文化中可能有不同的含义。
- 蓝色通常唤起和平与信任的情感
- 绿色通常与自然和环境相关
- 红色通常代表激情和兴奋
- 黄色通常代表乐观和快乐
# 沟通案例研究
Emerson是一款移动应用的产品经理。他发现客户在周末提交的投诉和问题报告增加了42%。他还发现如果客户提交的投诉在48小时内未得到回复他们给应用评分1或2星的可能性增加了32%。
经过研究Emerson提出了几个解决问题的方案。他安排了一次30分钟的会议与公司三位负责人沟通数据和提出的解决方案。
在这次会议中Emerson的目标是让公司负责人理解以下两个解决方案可以提高应用评分而评分的提高可能会转化为更高的收入。
**解决方案1.** 招聘客服人员在周末工作
**解决方案2.** 购买新的客服工单系统,让客服人员可以轻松识别队列中等待时间最长的投诉——以便优先处理。
在会议中Emerson花了5分钟解释为什么应用评分低是个问题10分钟解释研究过程和如何识别趋势10分钟讨论一些最近的客户投诉最后5分钟简单提及两个潜在解决方案。
埃默森在这次会议中是否有效地传达了信息?
在会议中一位公司负责人专注于埃默森花了10分钟讲述的客户投诉。会议结束后这些投诉成为这位负责人唯一记住的内容。另一位公司负责人主要关注埃默森描述的研究过程。第三位公司负责人记住了埃默森提出的解决方案但不确定这些解决方案如何实施。
在上述情境中,可以看到埃默森希望团队负责人从会议中获取的信息,与他们实际获取的信息之间存在显著差距。以下是埃默森可以考虑的另一种方法。
埃默森如何改进这一方法?
背景、冲突、高潮、收尾、结论
**背景** - 埃默森可以用前5分钟介绍整个情况并确保团队负责人理解这些问题如何影响公司关键指标例如收入。
可以这样展开“目前我们的应用在应用商店的评分是2.5。应用商店的评分对于应用商店优化至关重要,这会影响有多少用户在搜索中看到我们的应用,以及潜在用户如何看待我们的应用。当然,我们的用户数量直接与收入挂钩。”
**冲突** 接下来埃默森可以用大约5分钟时间讨论冲突。
可以这样说“用户在周末提交投诉和错误报告的比例高达42%。提交投诉后48小时内未得到回复的客户其给我们应用评分超过2的可能性降低了32%。将我们应用在应用商店的评分提高到4可以提升20-30%的可见度我预计这将使收入增加10%。”当然,埃默森需要准备好为这些数据提供依据。
**高潮** 在铺垫好基础后埃默森可以用大约5分钟时间进入高潮部分。
埃默森可以介绍提出的解决方案阐述这些解决方案如何解决所列问题如何将这些解决方案整合到现有工作流程中解决方案的成本是多少投资回报率ROI如何甚至可以展示一些截图或线框图说明解决方案实施后的效果。埃默森还可以分享一些用户的反馈例如那些投诉超过48小时才得到处理的用户的评价甚至可以引用公司现有客服代表对当前工单系统的评论。
**收尾** 接下来埃默森可以用5分钟时间重申公司面临的问题回顾提出的解决方案并再次说明为什么这些解决方案是正确的选择。
**结论** 由于这是一次与少数利益相关者的会议且会进行双向沟通埃默森可以计划留出10分钟时间用于提问以确保团队负责人在会议结束前能够澄清任何困惑之处。
如果埃默森采用方法#2团队负责人更有可能从会议中获取埃默森希望他们获取的信息——即投诉和错误处理方式可以改进并且有两个解决方案可以实施以实现这一改进。这种方法将更有效地传达埃默森希望传递的数据和故事。
# 结论
### 主要观点总结
- 沟通是传递或交换信息。
- 在传递数据时,目标不应该只是向观众传递数字,而是要传递一个由数据支持的故事。
- 沟通有两种类型:单向沟通(信息传递无意图获得回应)和双向沟通(信息在双方之间传递)。
- 有许多策略可以用来通过数据讲述故事我们讨论了以下5种策略
- 了解你的观众、媒介和沟通方式
- 从结果出发进行规划
- 像讲述一个真实的故事一样展开
- 使用有意义的词汇和短语
- 运用情感
### 推荐的自学资源
[The Five C's of Storytelling - Articulate Persuasion](http://articulatepersuasion.com/the-five-cs-of-storytelling/)
[1.4 Your Responsibilities as a Communicator Business Communication for Success (umn.edu)](https://open.lib.umn.edu/businesscommunication/chapter/1-4-your-responsibilities-as-a-communicator/)
[How to Tell a Story with Data (hbr.org)](https://hbr.org/2013/04/how-to-tell-a-story-with-data)
[Two-Way Communication: 4 Tips for a More Engaged Workplace (yourthoughtpartner.com)](https://www.yourthoughtpartner.com/blog/bid/59576/4-steps-to-increase-employee-engagement-through-two-way-communication)
[6 succinct steps to great data storytelling - BarnRaisers, LLC (barnraisersllc.com)](https://barnraisersllc.com/2021/05/02/6-succinct-steps-to-great-data-storytelling/)
[How to Tell a Story With Data | Lucidchart Blog](https://www.lucidchart.com/blog/how-to-tell-a-story-with-data)
[6 Cs of Effective Storytelling on Social Media | Cooler Insights](https://coolerinsights.com/2018/06/effective-storytelling-social-media/)
[The Importance of Emotions In Presentations | Ethos3 - A Presentation Training and Design Agency](https://ethos3.com/2015/02/the-importance-of-emotions-in-presentations/)
[Data storytelling: linking emotions and rational decisions (toucantoco.com)](https://www.toucantoco.com/en/blog/data-storytelling-dataviz)
[Emotional Advertising: How Brands Use Feelings to Get People to Buy (hubspot.com)](https://blog.hubspot.com/marketing/emotions-in-advertising-examples)
[Choosing Colors for Your Presentation Slides | Think Outside The Slide](https://www.thinkoutsidetheslide.com/choosing-colors-for-your-presentation-slides/)
[How To Present Data [10 Expert Tips] | ObservePoint](https://resources.observepoint.com/blog/10-tips-for-presenting-data)
[Microsoft Word - Persuasive Instructions.doc (tpsnva.org)](https://www.tpsnva.org/teach/lq/016/persinstr.pdf)
[The Power of Story for Your Data (thinkhdi.com)](https://www.thinkhdi.com/library/supportworld/2019/power-story-your-data.aspx)
[Common Mistakes in Data Presentation (perceptualedge.com)](https://www.perceptualedge.com/articles/ie/data_presentation.pdf)
[Infographic: Here are 15 Common Data Fallacies to Avoid (visualcapitalist.com)](https://www.visualcapitalist.com/here-are-15-common-data-fallacies-to-avoid/)
[Cherry Picking: When People Ignore Evidence that They Dislike Effectiviology](https://effectiviology.com/cherry-picking/#How_to_avoid_cherry_picking)
[Tell Stories with Data: Communication in Data Science | by Sonali Verghese | Towards Data Science](https://towardsdatascience.com/tell-stories-with-data-communication-in-data-science-5266f7671d7)
[1. Communicating Data - Communicating Data with Tableau [Book] (oreilly.com)](https://www.oreilly.com/library/view/communicating-data-with/9781449372019/ch01.html)
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/31)
通过上面的课后测验复习你刚刚学到的内容!
## 作业
[市场研究](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而导致的任何误解或误读,我们概不负责。

@ -0,0 +1,15 @@
# 讲述一个故事
## 指南
数据科学的核心是讲故事。选择任意一个数据集,撰写一篇简短的文章,讲述你可以从中挖掘出的故事。你希望你的数据集能够揭示什么?如果它的揭示结果存在问题,你会怎么做?如果你的数据并不容易揭示其秘密,你又会如何应对?思考你的数据集可能呈现的各种情景,并将它们记录下来。
## 评分标准
优秀 | 合格 | 需要改进
--- | --- | --- |
提供了一篇以 .doc 格式呈现的完整文章,清晰解释、记录并注明数据集来源,同时围绕数据集讲述了一个连贯的故事,并结合数据提供了详细的示例。| 提供了一篇较短的文章,细节较少 | 文章在上述某些方面存在不足。
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,19 @@
# 数据科学生命周期
![communication](../../../translated_images/zh-CN/communication.06d8e2a88d30d168d661ad9f9f0a4f947ebff3719719cfdaf9ed00a406a01ead.jpg)
> 图片由 <a href="https://unsplash.com/@headwayio?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Headway</a> 提供,来自 <a href="https://unsplash.com/s/photos/communication?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
在这些课程中,您将探索数据科学生命周期的一些方面,包括数据的分析和沟通。
### 主题
1. [简介](14-Introduction/README.md)
2. [分析](15-analyzing/README.md)
3. [沟通](16-communication/README.md)
### 致谢
这些课程由 [Jalen McGee](https://twitter.com/JalenMCG) 和 [Jasmine Greenaway](https://twitter.com/paladique) 用 ❤️ 编写
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。虽然我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,107 @@
# 云端数据科学简介
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/17-DataScience-Cloud.png)|
|:---:|
| 云端数据科学:简介 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
在本课程中,您将学习云的基本原理,了解为什么使用云服务来运行数据科学项目可能对您有吸引力,并且我们将查看一些在云端运行的数据科学项目示例。
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/32)
## 什么是云?
云,或云计算,是通过互联网提供的按需付费的各种计算服务,这些服务托管在基础设施上。服务包括存储、数据库、网络、软件、分析和智能服务等解决方案。
我们通常将公共云、私有云和混合云区分如下:
* 公共云:公共云由第三方云服务提供商拥有和运营,通过互联网向公众提供其计算资源。
* 私有云:指专门供单一企业或组织使用的云计算资源,服务和基础设施维护在私有网络上。
* 混合云:混合云是结合公共云和私有云的系统。用户选择本地数据中心,同时允许数据和应用程序在一个或多个公共云上运行。
大多数云计算服务分为三类基础设施即服务IaaS、平台即服务PaaS和软件即服务SaaS
* 基础设施即服务IaaS用户租用IT基础设施例如服务器和虚拟机VM、存储、网络、操作系统。
* 平台即服务PaaS用户租用一个用于开发、测试、交付和管理软件应用程序的环境。用户无需担心设置或管理开发所需的服务器、存储、网络和数据库的底层基础设施。
* 软件即服务SaaS用户通过互联网按需访问软件应用程序通常是基于订阅的。用户无需担心托管和管理软件应用程序、底层基础设施或维护例如软件升级和安全补丁。
一些最大的云服务提供商包括亚马逊AWS、谷歌云平台和微软Azure。
## 为什么选择云进行数据科学?
开发人员和IT专业人员选择使用云的原因有很多包括以下几点
* 创新:您可以通过将云提供商创建的创新服务直接集成到您的应用程序中来增强应用程序功能。
* 灵活性:您只需支付所需的服务费用,并可以从广泛的服务中进行选择。通常按需付费,并根据不断变化的需求调整服务。
* 预算:您无需进行初期投资来购买硬件和软件、设置和运行本地数据中心,只需支付实际使用的费用。
* 可扩展性:您的资源可以根据项目需求进行扩展,这意味着您的应用程序可以根据外部因素随时调整计算能力、存储和带宽。
* 生产力:您可以专注于业务,而不是花时间处理可以由其他人管理的任务,例如管理数据中心。
* 可靠性:云计算提供多种方式来持续备份您的数据,并可以设置灾难恢复计划,即使在危机时期也能保持业务和服务的运行。
* 安全性:您可以受益于增强项目安全性的政策、技术和控制措施。
以上是人们选择使用云服务的一些常见原因。现在我们对云是什么以及其主要优势有了更好的理解,让我们更具体地了解数据科学家和处理数据的开发人员的工作,以及云如何帮助他们解决可能面临的各种挑战:
* 存储大量数据与其购买、管理和保护大型服务器不如直接将数据存储在云中例如使用Azure Cosmos DB、Azure SQL Database和Azure Data Lake Storage。
* 执行数据集成数据集成是数据科学的重要组成部分它使您能够从数据收集过渡到采取行动。通过云提供的数据集成服务您可以从各种来源收集、转换和集成数据到单一数据仓库例如使用Data Factory。
* 处理数据:处理大量数据需要强大的计算能力,并不是每个人都能获得足够强大的机器,这也是许多人选择直接利用云的巨大计算能力来运行和部署解决方案的原因。
* 使用数据分析服务云服务如Azure Synapse Analytics、Azure Stream Analytics和Azure Databricks可以帮助您将数据转化为可操作的洞察。
* 使用机器学习和数据智能服务与其从零开始您可以使用云提供商提供的机器学习算法例如AzureML服务。您还可以使用认知服务例如语音转文字、文字转语音、计算机视觉等。
## 云端数据科学示例
让我们通过几个场景使这一切更加具体。
### 实时社交媒体情感分析
我们从一个常见的机器学习入门场景开始:实时社交媒体情感分析。
假设您运营一个新闻媒体网站希望利用实时数据了解读者可能感兴趣的内容。为此您可以构建一个程序对Twitter上的相关主题进行实时情感分析。
您关注的关键指标是特定主题(标签)的推文数量和情感,这些情感通过分析工具对指定主题进行情感分析来确定。
创建此项目所需的步骤如下:
* 创建一个事件中心以流式输入数据收集来自Twitter的数据
* 配置并启动Twitter客户端应用程序调用Twitter流API
* 创建一个流分析作业
* 指定作业输入和查询
* 创建输出接收器并指定作业输出
* 启动作业
查看完整流程,请参阅[文档](https://docs.microsoft.com/azure/stream-analytics/stream-analytics-twitter-sentiment-analysis-trends?WT.mc_id=academic-77958-bethanycheum&ocid=AID30411099)。
### 科学论文分析
让我们看另一个由本课程作者之一[Dmitry Soshnikov](http://soshnikov.com)创建的项目示例。
Dmitry创建了一个分析COVID论文的工具。通过审查此项目您将了解如何创建一个工具从科学论文中提取知识获得洞察并帮助研究人员高效地浏览大量论文。
以下是使用的不同步骤:
* 使用[Text Analytics for Health](https://docs.microsoft.com/azure/cognitive-services/text-analytics/how-tos/text-analytics-for-health?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109)提取和预处理信息
* 使用[Azure ML](https://azure.microsoft.com/services/machine-learning?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109)并行化处理
* 使用[Cosmos DB](https://azure.microsoft.com/services/cosmos-db?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109)存储和查询信息
* 使用Power BI创建交互式仪表板进行数据探索和可视化
查看完整流程,请访问[Dmitry的博客](https://soshnikov.com/science/analyzing-medical-papers-with-azure-and-text-analytics-for-health/)。
如您所见,我们可以通过多种方式利用云服务进行数据科学。
## 脚注
来源:
* https://azure.microsoft.com/overview/what-is-cloud-computing?ocid=AID3041109
* https://docs.microsoft.com/azure/stream-analytics/stream-analytics-twitter-sentiment-analysis-trends?ocid=AID3041109
* https://soshnikov.com/science/analyzing-medical-papers-with-azure-and-text-analytics-for-health/
## 课后测验
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/33)
## 作业
[市场研究](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而导致的任何误解或误读,我们概不负责。

@ -0,0 +1,14 @@
# 市场调研
## 说明
在本课中,你了解到有几个重要的云服务提供商。进行市场调研,了解每个提供商能为数据科学家提供什么服务。这些服务是否具有可比性?撰写一篇文章,描述三个或更多云服务提供商的服务内容。
## 评分标准
优秀 | 合格 | 需改进
--- | --- | -- |
一篇完整的文章描述了三个云服务提供商的数据科学服务,并区分了它们之间的差异。 | 提交了一篇较短的文章 | 提交了一篇文章,但未完成分析
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,340 @@
# 云端数据科学:低代码/无代码方式
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/18-DataScience-Cloud.png)|
|:---:|
| 云端数据科学:低代码 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
目录:
- [云端数据科学:低代码/无代码方式](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [课前测验](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [1. 简介](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [1.1 什么是 Azure Machine Learning](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [1.2 心力衰竭预测项目:](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [1.3 心力衰竭数据集:](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [2. 在 Azure ML Studio 中进行低代码/无代码模型训练](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [2.1 创建 Azure ML 工作区](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [2.2 计算资源](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [2.2.1 为计算资源选择合适的选项](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [2.2.2 创建计算集群](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [2.3 加载数据集](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [2.4 使用 AutoML 进行低代码/无代码训练](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [3. 低代码/无代码模型部署与端点使用](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [3.1 模型部署](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [3.2 端点使用](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [🚀 挑战](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [课后测验](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [复习与自学](../../../../5-Data-Science-In-Cloud/18-Low-Code)
- [作业](../../../../5-Data-Science-In-Cloud/18-Low-Code)
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/34)
## 1. 简介
### 1.1 什么是 Azure Machine Learning
Azure 云平台包含超过 200 种产品和云服务,旨在帮助您实现创新解决方案。
数据科学家通常需要花费大量时间探索和预处理数据,并尝试各种模型训练算法以生成准确的模型。这些任务耗时且常常无法高效利用昂贵的计算硬件。
[Azure ML](https://docs.microsoft.com/azure/machine-learning/overview-what-is-azure-machine-learning?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109) 是一个基于云的平台,用于在 Azure 中构建和运行机器学习解决方案。它提供了广泛的功能和能力,帮助数据科学家准备数据、训练模型、发布预测服务并监控其使用情况。最重要的是,它通过自动化许多与模型训练相关的耗时任务来提高效率;同时,它支持使用可扩展的云计算资源来处理大量数据,仅在实际使用时产生费用。
Azure ML 提供了开发者和数据科学家所需的所有工具,用于完成机器学习工作流。这些工具包括:
- **Azure Machine Learning Studio**:一个基于 Web 的门户提供低代码和无代码选项用于模型训练、部署、自动化、跟踪和资产管理。Studio 与 Azure Machine Learning SDK 集成,提供无缝体验。
- **Jupyter Notebooks**:快速原型设计和测试机器学习模型。
- **Azure Machine Learning Designer**:允许通过拖放模块来构建实验,并在低代码环境中部署管道。
- **自动化机器学习界面 (AutoML)**:自动化机器学习模型开发的迭代任务,能够以高效和高生产力的方式构建模型,同时保持模型质量。
- **数据标注**:一个辅助机器学习工具,用于自动标注数据。
- **Visual Studio Code 的机器学习扩展**:提供一个完整的开发环境,用于构建和管理机器学习项目。
- **机器学习 CLI**:提供命令行工具,用于管理 Azure ML 资源。
- **与开源框架集成**:支持 PyTorch、TensorFlow、Scikit-learn 等框架,用于训练、部署和管理机器学习的端到端流程。
- **MLflow**:一个开源库,用于管理机器学习实验的生命周期。**MLFlow Tracking** 是 MLflow 的一个组件,用于记录和跟踪训练运行的指标和模型工件,无论实验环境如何。
### 1.2 心力衰竭预测项目:
毫无疑问,制作和构建项目是检验技能和知识的最佳方式。在本课程中,我们将探索两种不同的方式来构建一个数据科学项目,用于预测心力衰竭攻击。这两种方式分别是通过 Azure ML Studio 的低代码/无代码方式,以及通过 Azure ML SDK 的方式,如下图所示:
![project-schema](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/project-schema.PNG)
每种方式都有其优缺点。低代码/无代码方式更容易入门,因为它涉及与图形用户界面 (GUI) 交互,不需要任何代码知识。这种方法可以快速测试项目的可行性并创建概念验证 (POC)。然而,随着项目的扩展并需要进入生产阶段,仅通过 GUI 创建资源变得不可行。此时,程序化地自动化所有内容(从资源创建到模型部署)变得至关重要,这也是学习如何使用 Azure ML SDK 的关键所在。
| | 低代码/无代码 | Azure ML SDK |
|-------------------|------------------|---------------------------|
| 代码知识要求 | 不需要 | 需要 |
| 开发时间 | 快速且简单 | 取决于代码熟练程度 |
| 是否适合生产环境 | 否 | 是 |
### 1.3 心力衰竭数据集:
心血管疾病 (CVDs) 是全球范围内的头号死亡原因,占全球死亡人数的 31%。环境和行为风险因素(如吸烟、不健康饮食和肥胖、缺乏运动以及过量饮酒)可以作为估算模型的特征。能够估算 CVD 的发展概率对于预防高风险人群的心力衰竭发作具有重要意义。
Kaggle 提供了一个公开的 [心力衰竭数据集](https://www.kaggle.com/andrewmvd/heart-failure-clinical-data),我们将在本项目中使用该数据集。您可以现在下载数据集。该数据集是一个表格数据集,包含 13 列12 个特征和 1 个目标变量)和 299 行。
| | 变量名称 | 类型 | 描述 | 示例 |
|----|---------------------------|-----------------|----------------------------------------------------------|-------------------|
| 1 | age | 数值型 | 患者年龄 | 25 |
| 2 | anaemia | 布尔型 | 红细胞或血红蛋白减少 | 0 或 1 |
| 3 | creatinine_phosphokinase | 数值型 | 血液中 CPK 酶的水平 | 542 |
| 4 | diabetes | 布尔型 | 患者是否患有糖尿病 | 0 或 1 |
| 5 | ejection_fraction | 数值型 | 每次心脏收缩时排出的血液百分比 | 45 |
| 6 | high_blood_pressure | 布尔型 | 患者是否患有高血压 | 0 或 1 |
| 7 | platelets | 数值型 | 血液中的血小板数量 | 149000 |
| 8 | serum_creatinine | 数值型 | 血液中的血清肌酐水平 | 0.5 |
| 9 | serum_sodium | 数值型 | 血液中的血清钠水平 | jun |
| 10 | sex | 布尔型 | 女性或男性 | 0 或 1 |
| 11 | smoking | 布尔型 | 患者是否吸烟 | 0 或 1 |
| 12 | time | 数值型 | 随访时间(天) | 4 |
|----|---------------------------|-----------------|----------------------------------------------------------|-------------------|
| 21 | DEATH_EVENT [目标] | 布尔型 | 患者是否在随访期间死亡 | 0 或 1 |
下载数据集后,我们就可以在 Azure 中开始项目了。
## 2. 在 Azure ML Studio 中进行低代码/无代码模型训练
### 2.1 创建 Azure ML 工作区
要在 Azure ML 中训练模型,首先需要创建一个 Azure ML 工作区。工作区是 Azure Machine Learning 的顶级资源,提供一个集中式位置,用于管理您在使用 Azure Machine Learning 时创建的所有工件。工作区会记录所有训练运行的历史,包括日志、指标、输出以及脚本的快照。您可以使用这些信息来确定哪个训练运行生成了最佳模型。[了解更多](https://docs.microsoft.com/azure/machine-learning/concept-workspace?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109)
建议使用与您的操作系统兼容的最新浏览器。以下浏览器受支持:
- Microsoft Edge最新版本的新 Microsoft Edge不是旧版 Microsoft Edge
- Safari最新版本仅限 Mac
- Chrome最新版本
- Firefox最新版本
要使用 Azure Machine Learning请在您的 Azure 订阅中创建一个工作区。然后,您可以使用此工作区来管理与机器学习工作负载相关的数据、计算资源、代码、模型和其他工件。
> **_注意_** 您的 Azure 订阅将在工作区存在期间因数据存储产生少量费用,因此建议在不再使用 Azure Machine Learning 工作区时将其删除。
1. 使用与您的 Azure 订阅关联的 Microsoft 凭据登录 [Azure 门户](https://ms.portal.azure.com/)。
2. 选择 **+创建资源**
![workspace-1](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-1.PNG)
搜索 Machine Learning 并选择 Machine Learning 磁贴
![workspace-2](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-2.PNG)
点击创建按钮
![workspace-3](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-3.PNG)
按以下设置填写:
- 订阅:您的 Azure 订阅
- 资源组:创建或选择一个资源组
- 工作区名称:输入一个唯一的工作区名称
- 区域:选择离您最近的地理区域
- 存储账户:注意将为您的工作区创建的默认新存储账户
- 密钥保管库:注意将为您的工作区创建的默认新密钥保管库
- 应用程序洞察:注意将为您的工作区创建的默认新应用程序洞察资源
- 容器注册表:无(第一次将模型部署到容器时会自动创建一个)
![workspace-4](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-4.PNG)
- 点击创建 + 审核,然后点击创建按钮
3. 等待您的工作区创建完成(可能需要几分钟)。然后在门户中访问它。您可以通过 Machine Learning Azure 服务找到它。
4. 在工作区的概览页面,启动 Azure Machine Learning Studio或打开一个新的浏览器标签并导航到 https://ml.azure.com使用您的 Microsoft 账户登录 Azure Machine Learning Studio。如果提示请选择您的 Azure 目录和订阅,以及您的 Azure Machine Learning 工作区。
![workspace-5](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-5.PNG)
5. 在 Azure Machine Learning Studio 中,切换左上角的 ☰ 图标以查看界面中的各个页面。您可以使用这些页面来管理工作区中的资源。
![workspace-6](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-6.PNG)
您可以使用 Azure 门户管理工作区但对于数据科学家和机器学习运维工程师来说Azure Machine Learning Studio 提供了一个更专注的用户界面,用于管理工作区资源。
### 2.2 计算资源
计算资源是基于云的资源,用于运行模型训练和数据探索过程。您可以创建四种类型的计算资源:
- **计算实例**:数据科学家可以用来处理数据和模型的开发工作站。这涉及创建一个虚拟机 (VM) 并启动一个 notebook 实例。然后,您可以通过 notebook 调用计算集群来训练模型。
- **计算集群**:可扩展的虚拟机集群,用于按需处理实验代码。训练模型时需要使用计算集群。计算集群还可以使用专门的 GPU 或 CPU 资源。
- **推理集群**:用于部署使用您训练模型的预测服务的目标。
- **附加计算**:链接到现有的 Azure 计算资源,例如虚拟机或 Azure Databricks 集群。
#### 2.2.1 为计算资源选择合适的选项
创建计算资源时需要考虑一些关键因素,这些选择可能是至关重要的决策。
**需要 CPU 还是 GPU**
CPU中央处理器是执行计算机程序指令的电子电路。GPU图形处理器是一种专门的电子电路可以以非常高的速度执行与图形相关的代码。
CPU 和 GPU 架构的主要区别在于CPU 设计用于快速处理广泛的任务(以 CPU 时钟速度衡量),但在任务并发性方面有限。而 GPU 设计用于并行计算,因此在深度学习任务中表现更佳。
| CPU | GPU |
|-----------------------------------------|-----------------------------|
| 成本较低 | 成本较高 |
| 并发性较低 | 并发性较高 |
| 深度学习模型训练速度较慢 | 深度学习的最佳选择 |
**集群规模**
较大的集群成本更高,但响应速度更快。因此,如果时间充裕但预算有限,可以选择较小的集群;反之,如果预算充足但时间有限,可以选择较大的集群。
**虚拟机规格**
根据时间和预算限制,可以调整 RAM、磁盘、核心数量和时钟速度的大小。增加这些参数会提高成本但性能也会更好。
**专用实例还是低优先级实例?**
低优先级实例意味着它是可中断的本质上Microsoft Azure 可以将这些资源分配给其他任务,从而中断当前作业。而专用实例(不可中断)意味着作业不会在未经您许可的情况下被终止。这是另一个时间与成本的权衡,因为可中断实例比专用实例便宜。
#### 2.2.2 创建计算集群
在我们之前创建的 [Azure ML 工作区](https://ml.azure.com/) 中,进入计算选项,您将看到我们刚刚讨论的不同计算资源(例如计算实例、计算集群、推理集群和附加计算)。在这个项目中,我们需要一个计算集群来进行模型训练。在 Studio 中,点击“计算”菜单,然后点击“计算集群”标签页,点击“+ 新建”按钮以创建计算集群。
![22](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/cluster-1.PNG)
1. 选择您的选项:专用 vs 低优先级CPU 或 GPU虚拟机规格和核心数量对于本项目可以保留默认设置
2. 点击“下一步”按钮。
![23](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/cluster-2.PNG)
3. 为集群命名。
4. 选择您的选项:节点的最小/最大数量、闲置秒数后缩减规模、SSH 访问。注意,如果节点的最小数量为 0当集群闲置时可以节省成本。注意最大节点数量越高训练时间越短。推荐的最大节点数量为 3。
5. 点击“创建”按钮。这一步可能需要几分钟。
![29](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/cluster-3.PNG)
太棒了!现在我们已经有了一个计算集群,接下来需要将数据加载到 Azure ML Studio。
### 2.3 加载数据集
1. 在我们之前创建的 [Azure ML 工作区](https://ml.azure.com/) 中,点击左侧菜单中的“数据集”,然后点击“+ 创建数据集”按钮以创建数据集。选择“从本地文件”选项并选择我们之前下载的 Kaggle 数据集。
![24](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/dataset-1.PNG)
2. 为您的数据集命名、选择类型并添加描述。点击“下一步”。从文件中上传数据。点击“下一步”。
![25](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/dataset-2.PNG)
3. 在 Schema 中将以下特征的数据类型更改为布尔值贫血、糖尿病、高血压、性别、吸烟和死亡事件DEATH_EVENT。点击“下一步”然后点击“创建”。
![26](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/dataset-3.PNG)
很好!现在数据集已经就位,计算集群也已创建,我们可以开始训练模型了!
### 2.4 使用 AutoML 进行低代码/无代码训练
传统的机器学习模型开发资源密集需要显著的领域知识和时间来生成并比较多个模型。自动化机器学习AutoML是自动化机器学习模型开发中耗时、迭代任务的过程。它允许数据科学家、分析师和开发人员以高效和高生产力的方式构建机器学习模型同时保持模型质量。它显著减少了生产就绪机器学习模型的时间并且操作简单高效。[了解更多](https://docs.microsoft.com/azure/machine-learning/concept-automated-ml?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109)
1. 在我们之前创建的 [Azure ML 工作区](https://ml.azure.com/) 中,点击左侧菜单中的“自动化机器学习”,选择您刚刚上传的数据集。点击“下一步”。
![27](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/aml-1.PNG)
2. 输入一个新的实验名称目标列DEATH_EVENT以及我们创建的计算集群。点击“下一步”。
![28](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/aml-2.PNG)
3. 选择“分类”,然后点击“完成”。这一步可能需要 30 分钟到 1 小时,具体取决于您的计算集群规模。
![30](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/aml-3.PNG)
4. 运行完成后,点击“自动化机器学习”标签页,点击您的运行记录,然后在“最佳模型摘要”卡片中点击算法。
![31](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/aml-4.PNG)
在这里,您可以看到 AutoML 生成的最佳模型的详细描述。您还可以在“模型”标签中探索其他生成的模型。花几分钟时间探索“解释(预览)”按钮中的模型。一旦您选择了要使用的模型(这里我们选择 AutoML 选出的最佳模型),接下来我们将学习如何部署它。
## 3. 低代码/无代码模型部署与端点使用
### 3.1 模型部署
自动化机器学习界面允许您将最佳模型部署为 Web 服务,仅需几个步骤。部署是模型的集成过程,使其能够基于新数据进行预测并识别潜在的机会领域。对于本项目,将模型部署为 Web 服务意味着医疗应用可以使用该模型实时预测患者的心脏病风险。
在最佳模型描述中,点击“部署”按钮。
![deploy-1](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/deploy-1.PNG)
15. 为其命名、添加描述、选择计算类型Azure 容器实例),启用身份验证并点击“部署”。这一步可能需要约 20 分钟完成。部署过程包括注册模型、生成资源并为 Web 服务配置资源。部署状态下会显示状态消息。定期点击“刷新”以检查部署状态。当状态显示为“健康”时,表示已部署并运行。
![deploy-2](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/deploy-2.PNG)
16. 部署完成后,点击“端点”标签页,点击您刚刚部署的端点。在这里,您可以找到有关端点的所有详细信息。
![deploy-3](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/deploy-3.PNG)
太棒了!现在我们已经部署了一个模型,可以开始使用端点了。
### 3.2 端点使用
点击“使用”标签。在这里,您可以找到 REST 端点以及消费选项中的 Python 脚本。花点时间阅读 Python 代码。
该脚本可以直接从您的本地机器运行,并将使用您的端点。
![35](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/consumption-1.PNG)
花点时间查看以下两行代码:
```python
url = 'http://98e3715f-xxxx-xxxx-xxxx-9ec22d57b796.centralus.azurecontainer.io/score'
api_key = '' # Replace this with the API key for the web service
```
`url` 变量是消费标签中找到的 REST 端点,而 `api_key` 变量是消费标签中找到的主密钥(仅在启用身份验证的情况下)。这就是脚本如何使用端点。
18. 运行脚本后,您应该看到以下输出:
```python
b'"{\\"result\\": [true]}"'
```
这意味着对于给定数据,心脏衰竭的预测结果为真。这是合理的,因为如果仔细查看脚本中自动生成的数据,所有值默认都是 0 和 false。您可以使用以下输入样本更改数据
```python
data = {
"data":
[
{
'age': "0",
'anaemia': "false",
'creatinine_phosphokinase': "0",
'diabetes': "false",
'ejection_fraction': "0",
'high_blood_pressure': "false",
'platelets': "0",
'serum_creatinine': "0",
'serum_sodium': "0",
'sex': "false",
'smoking': "false",
'time': "0",
},
{
'age': "60",
'anaemia': "false",
'creatinine_phosphokinase': "500",
'diabetes': "false",
'ejection_fraction': "38",
'high_blood_pressure': "false",
'platelets': "260000",
'serum_creatinine': "1.40",
'serum_sodium': "137",
'sex': "false",
'smoking': "false",
'time': "130",
},
],
}
```
脚本应返回:
```python
b'"{\\"result\\": [true, false]}"'
```
恭喜!您刚刚使用 Azure ML 部署并训练了模型!
> **_注意_** 完成项目后,请记得删除所有资源。
## 🚀 挑战
仔细查看 AutoML 为顶级模型生成的模型解释和详细信息。尝试理解为什么最佳模型优于其他模型。比较了哪些算法?它们之间有什么区别?为什么在这种情况下最佳模型表现更好?
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/35)
## 复习与自学
在本课程中,您学习了如何在云端以低代码/无代码方式训练、部署和使用模型来预测心脏衰竭风险。如果尚未完成,请深入研究 AutoML 为顶级模型生成的模型解释,尝试理解为什么最佳模型优于其他模型。
您可以通过阅读此 [文档](https://docs.microsoft.com/azure/machine-learning/tutorial-first-experiment-automated-ml?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109)进一步了解低代码/无代码 AutoML。
## 作业
[基于 Azure ML 的低代码/无代码数据科学项目](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读,我们概不负责。

@ -0,0 +1,14 @@
# 在 Azure ML 上进行低代码/无代码数据科学项目
## 指南
我们已经学习了如何使用 Azure ML 平台以低代码/无代码的方式训练、部署和使用模型。现在,请寻找一些可以用来训练另一个模型的数据,部署并使用它。你可以在 [Kaggle](https://kaggle.com) 和 [Azure Open Datasets](https://azure.microsoft.com/services/open-datasets/catalog?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109) 上查找数据集。
## 评分标准
| 卓越 | 合格 | 需要改进 |
|------|------|----------|
|上传数据时,如果有必要,你注意更改了特征的类型。同时,你对数据进行了清理(如果需要)。你通过 AutoML 对数据集进行了训练,并检查了模型的解释。你部署了最佳模型,并成功使用了它。|上传数据时,如果有必要,你注意更改了特征的类型。你通过 AutoML 对数据集进行了训练,部署了最佳模型,并成功使用了它。|你部署了 AutoML 训练的最佳模型,并成功使用了它。|
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,316 @@
# 云中的数据科学:使用 "Azure ML SDK"
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 绘制的草图笔记](../../sketchnotes/19-DataScience-Cloud.png)|
|:---:|
| 云中的数据科学Azure ML SDK - _草图笔记由 [@nitya](https://twitter.com/nitya) 绘制_ |
目录:
- [云中的数据科学:使用 "Azure ML SDK"](../../../../5-Data-Science-In-Cloud/19-Azure)
- [课前测验](../../../../5-Data-Science-In-Cloud/19-Azure)
- [1. 介绍](../../../../5-Data-Science-In-Cloud/19-Azure)
- [1.1 什么是 Azure ML SDK](../../../../5-Data-Science-In-Cloud/19-Azure)
- [1.2 心力衰竭预测项目和数据集介绍](../../../../5-Data-Science-In-Cloud/19-Azure)
- [2. 使用 Azure ML SDK 训练模型](../../../../5-Data-Science-In-Cloud/19-Azure)
- [2.1 创建 Azure ML 工作区](../../../../5-Data-Science-In-Cloud/19-Azure)
- [2.2 创建计算实例](../../../../5-Data-Science-In-Cloud/19-Azure)
- [2.3 加载数据集](../../../../5-Data-Science-In-Cloud/19-Azure)
- [2.4 创建笔记本](../../../../5-Data-Science-In-Cloud/19-Azure)
- [2.5 训练模型](../../../../5-Data-Science-In-Cloud/19-Azure)
- [2.5.1 设置工作区、实验、计算集群和数据集](../../../../5-Data-Science-In-Cloud/19-Azure)
- [2.5.2 自动化机器学习配置与训练](../../../../5-Data-Science-In-Cloud/19-Azure)
- [3. 使用 Azure ML SDK 部署模型和消费端点](../../../../5-Data-Science-In-Cloud/19-Azure)
- [3.1 保存最佳模型](../../../../5-Data-Science-In-Cloud/19-Azure)
- [3.2 模型部署](../../../../5-Data-Science-In-Cloud/19-Azure)
- [3.3 消费端点](../../../../5-Data-Science-In-Cloud/19-Azure)
- [🚀 挑战](../../../../5-Data-Science-In-Cloud/19-Azure)
- [课后测验](../../../../5-Data-Science-In-Cloud/19-Azure)
- [复习与自学](../../../../5-Data-Science-In-Cloud/19-Azure)
- [作业](../../../../5-Data-Science-In-Cloud/19-Azure)
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/36)
## 1. 介绍
### 1.1 什么是 Azure ML SDK
数据科学家和 AI 开发者使用 Azure Machine Learning SDK 来构建和运行基于 Azure Machine Learning 服务的机器学习工作流。你可以在任何 Python 环境中与该服务交互,包括 Jupyter Notebooks、Visual Studio Code 或你喜欢的 Python IDE。
SDK 的主要功能包括:
- 探索、准备和管理机器学习实验中使用的数据集的生命周期。
- 管理云资源以监控、记录和组织机器学习实验。
- 在本地或使用云资源(包括 GPU 加速的模型训练)训练模型。
- 使用自动化机器学习AutoML通过配置参数和训练数据自动迭代算法和超参数设置找到最佳模型以进行预测。
- 部署 Web 服务,将训练好的模型转换为可在任何应用程序中消费的 RESTful 服务。
[了解更多关于 Azure Machine Learning SDK 的信息](https://docs.microsoft.com/python/api/overview/azure/ml?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109)
在[上一课](../18-Low-Code/README.md)中,我们学习了如何以低代码/无代码的方式训练、部署和消费模型。我们使用了心力衰竭数据集来生成心力衰竭预测模型。在本课中,我们将使用 Azure Machine Learning SDK 完成相同的任务。
![项目架构](../../../../5-Data-Science-In-Cloud/19-Azure/images/project-schema.PNG)
### 1.2 心力衰竭预测项目和数据集介绍
查看[这里](../18-Low-Code/README.md)了解心力衰竭预测项目和数据集的介绍。
## 2. 使用 Azure ML SDK 训练模型
### 2.1 创建 Azure ML 工作区
为了简化操作,我们将在 Jupyter Notebook 中工作。这意味着你已经有一个工作区和一个计算实例。如果你已经有一个工作区,可以直接跳到 2.3 节的笔记本创建部分。
如果没有,请按照[上一课](../18-Low-Code/README.md)中 **2.1 创建 Azure ML 工作区** 的说明创建一个工作区。
### 2.2 创建计算实例
在我们之前创建的 [Azure ML 工作区](https://ml.azure.com/)中,进入计算菜单,你会看到可用的不同计算资源。
![计算实例](../../../../5-Data-Science-In-Cloud/19-Azure/images/compute-instance-1.PNG)
让我们创建一个计算实例来提供 Jupyter Notebook。
1. 点击 + New 按钮。
2. 给你的计算实例命名。
3. 选择你的选项CPU 或 GPU、虚拟机大小和核心数量。
4. 点击 Create 按钮。
恭喜,你刚刚创建了一个计算实例!我们将在[创建笔记本部分](../../../../5-Data-Science-In-Cloud/19-Azure)中使用这个计算实例。
### 2.3 加载数据集
如果你还没有上传数据集,请参考[上一课](../18-Low-Code/README.md)中的 **2.3 加载数据集** 部分。
### 2.4 创建笔记本
> **_注意_** 接下来的步骤中,你可以从头创建一个新的笔记本,或者上传我们之前创建的 [notebook](../../../../5-Data-Science-In-Cloud/19-Azure/notebook.ipynb) 到你的 Azure ML Studio。要上传只需点击 "Notebook" 菜单并上传笔记本。
笔记本是数据科学过程中非常重要的一部分。它们可以用于进行探索性数据分析EDA、调用计算集群训练模型、调用推理集群部署端点。
要创建一个笔记本,我们需要一个提供 Jupyter Notebook 实例的计算节点。返回 [Azure ML 工作区](https://ml.azure.com/),点击计算实例。在计算实例列表中,你应该能看到[我们之前创建的计算实例](../../../../5-Data-Science-In-Cloud/19-Azure)。
1. 在 Applications 部分,点击 Jupyter 选项。
2. 勾选 "Yes, I understand" 框并点击 Continue 按钮。
![笔记本](../../../../5-Data-Science-In-Cloud/19-Azure/images/notebook-1.PNG)
3. 这将打开一个新的浏览器标签页,显示你的 Jupyter Notebook 实例。点击 "New" 按钮创建一个笔记本。
![笔记本](../../../../5-Data-Science-In-Cloud/19-Azure/images/notebook-2.PNG)
现在我们有了一个笔记本,可以开始使用 Azure ML SDK 训练模型了。
### 2.5 训练模型
首先,如果你有任何疑问,请参考 [Azure ML SDK 文档](https://docs.microsoft.com/python/api/overview/azure/ml?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109)。它包含了理解本课中涉及模块的所有必要信息。
#### 2.5.1 设置工作区、实验、计算集群和数据集
你需要使用以下代码从配置文件加载 `workspace`
```python
from azureml.core import Workspace
ws = Workspace.from_config()
```
这将返回一个表示工作区的 `Workspace` 对象。然后你需要使用以下代码创建一个 `experiment`
```python
from azureml.core import Experiment
experiment_name = 'aml-experiment'
experiment = Experiment(ws, experiment_name)
```
要从工作区获取或创建实验,你需要通过实验名称请求实验。实验名称必须为 3-36 个字符,以字母或数字开头,并且只能包含字母、数字、下划线和短划线。如果在工作区中找不到实验,将创建一个新实验。
现在你需要使用以下代码为训练创建一个计算集群。注意,这一步可能需要几分钟。
```python
from azureml.core.compute import AmlCompute
aml_name = "heart-f-cluster"
try:
aml_compute = AmlCompute(ws, aml_name)
print('Found existing AML compute context.')
except:
print('Creating new AML compute context.')
aml_config = AmlCompute.provisioning_configuration(vm_size = "Standard_D2_v2", min_nodes=1, max_nodes=3)
aml_compute = AmlCompute.create(ws, name = aml_name, provisioning_configuration = aml_config)
aml_compute.wait_for_completion(show_output = True)
cts = ws.compute_targets
compute_target = cts[aml_name]
```
你可以通过以下方式从工作区获取数据集:
```python
dataset = ws.datasets['heart-failure-records']
df = dataset.to_pandas_dataframe()
df.describe()
```
#### 2.5.2 自动化机器学习配置与训练
要设置 AutoML 配置,请使用 [AutoMLConfig 类](https://docs.microsoft.com/python/api/azureml-train-automl-client/azureml.train.automl.automlconfig(class)?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109)。
根据文档,有许多参数可以调整。对于本项目,我们将使用以下参数:
- `experiment_timeout_minutes`:实验允许运行的最大时间(以分钟为单位),超时后实验将自动停止并生成结果。
- `max_concurrent_iterations`:实验允许的最大并发训练迭代次数。
- `primary_metric`:用于确定实验状态的主要指标。
- `compute_target`:运行自动化机器学习实验的 Azure Machine Learning 计算目标。
- `task`:要运行的任务类型。值可以是 'classification'、'regression' 或 'forecasting',具体取决于要解决的自动化机器学习问题类型。
- `training_data`:实验中使用的训练数据。应包含训练特征和标签列(可选的样本权重列)。
- `label_column_name`:标签列的名称。
- `path`Azure Machine Learning 项目文件夹的完整路径。
- `enable_early_stopping`:是否启用早停,如果短期内分数没有改善则终止。
- `featurization`:指示是否自动进行特征化步骤,或使用自定义特征化。
- `debug_log`:写入调试信息的日志文件。
```python
from azureml.train.automl import AutoMLConfig
project_folder = './aml-project'
automl_settings = {
"experiment_timeout_minutes": 20,
"max_concurrent_iterations": 3,
"primary_metric" : 'AUC_weighted'
}
automl_config = AutoMLConfig(compute_target=compute_target,
task = "classification",
training_data=dataset,
label_column_name="DEATH_EVENT",
path = project_folder,
enable_early_stopping= True,
featurization= 'auto',
debug_log = "automl_errors.log",
**automl_settings
)
```
现在你已经设置了配置,可以使用以下代码训练模型。这一步可能需要长达一小时,具体取决于集群大小。
```python
remote_run = experiment.submit(automl_config)
```
你可以运行 RunDetails 小部件来显示不同的实验。
```python
from azureml.widgets import RunDetails
RunDetails(remote_run).show()
```
## 3. 使用 Azure ML SDK 部署模型和消费端点
### 3.1 保存最佳模型
`remote_run` 是一个 [AutoMLRun](https://docs.microsoft.com/python/api/azureml-train-automl-client/azureml.train.automl.run.automlrun?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109) 类型的对象。该对象包含 `get_output()` 方法,可返回最佳运行和相应的拟合模型。
```python
best_run, fitted_model = remote_run.get_output()
```
你可以通过打印 `fitted_model` 查看最佳模型使用的参数,并通过 [get_properties()](https://docs.microsoft.com/python/api/azureml-core/azureml.core.run(class)?view=azure-ml-py#azureml_core_Run_get_properties?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109) 方法查看最佳模型的属性。
```python
best_run.get_properties()
```
现在使用 [register_model](https://docs.microsoft.com/python/api/azureml-train-automl-client/azureml.train.automl.run.automlrun?view=azure-ml-py#register-model-model-name-none--description-none--tags-none--iteration-none--metric-none-?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109) 方法注册模型。
```python
model_name = best_run.properties['model_name']
script_file_name = 'inference/score.py'
best_run.download_file('outputs/scoring_file_v_1_0_0.py', 'inference/score.py')
description = "aml heart failure project sdk"
model = best_run.register_model(model_name = model_name,
model_path = './outputs/',
description = description,
tags = None)
```
### 3.2 模型部署
保存最佳模型后,我们可以使用 [InferenceConfig](https://docs.microsoft.com/python/api/azureml-core/azureml.core.model.inferenceconfig?view=azure-ml-py?ocid=AID3041109) 类部署它。InferenceConfig 表示用于部署的自定义环境的配置设置。[AciWebservice](https://docs.microsoft.com/python/api/azureml-core/azureml.core.webservice.aciwebservice?view=azure-ml-py) 类表示部署为 Azure 容器实例上的 Web 服务端点的机器学习模型。部署的服务由模型、脚本和相关文件创建。生成的 Web 服务是一个负载均衡的 HTTP 端点,带有 REST API。你可以向该 API 发送数据并接收模型返回的预测。
模型通过 [deploy](https://docs.microsoft.com/python/api/azureml-core/azureml.core.model(class)?view=azure-ml-py#deploy-workspace--name--models--inference-config-none--deployment-config-none--deployment-target-none--overwrite-false--show-output-false-?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109) 方法部署。
```python
from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import AciWebservice
inference_config = InferenceConfig(entry_script=script_file_name, environment=best_run.get_environment())
aciconfig = AciWebservice.deploy_configuration(cpu_cores = 1,
memory_gb = 1,
tags = {'type': "automl-heart-failure-prediction"},
description = 'Sample service for AutoML Heart Failure Prediction')
aci_service_name = 'automl-hf-sdk'
aci_service = Model.deploy(ws, aci_service_name, [model], inference_config, aciconfig)
aci_service.wait_for_deployment(True)
print(aci_service.state)
```
这一步可能需要几分钟。
### 3.3 消费端点
你可以通过创建一个示例输入来消费端点:
```python
data = {
"data":
[
{
'age': "60",
'anaemia': "false",
'creatinine_phosphokinase': "500",
'diabetes': "false",
'ejection_fraction': "38",
'high_blood_pressure': "false",
'platelets': "260000",
'serum_creatinine': "1.40",
'serum_sodium': "137",
'sex': "false",
'smoking': "false",
'time': "130",
},
],
}
test_sample = str.encode(json.dumps(data))
```
然后将此输入发送到模型以获取预测:
```python
response = aci_service.run(input_data=test_sample)
response
```
这应该输出 `'{"result": [false]}'`。这意味着我们发送到端点的患者输入生成了预测值 `false`,表示此人不太可能发生心脏病。
恭喜你!你刚刚使用 Azure ML SDK 消耗了在 Azure ML 上部署和训练的模型!
> **_注意:_** 完成项目后,别忘了删除所有资源。
## 🚀 挑战
通过 SDK 你可以做很多其他事情,但遗憾的是我们无法在这节课中全部讲解。不过好消息是,学会快速浏览 SDK 文档可以让你在学习中走得更远。查看 Azure ML SDK 文档,找到允许你创建管道的 `Pipeline` 类。管道是可以作为工作流执行的一系列步骤的集合。
**提示:** 访问 [SDK 文档](https://docs.microsoft.com/python/api/overview/azure/ml/?view=azure-ml-py?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109),在搜索栏中输入关键词,例如 "Pipeline"。你应该能在搜索结果中找到 `azureml.pipeline.core.Pipeline` 类。
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/37)
## 复习与自学
在本课中,你学习了如何使用 Azure ML SDK 在云端训练、部署和消耗一个模型来预测心脏病风险。查看这个 [文档](https://docs.microsoft.com/python/api/overview/azure/ml/?view=azure-ml-py?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109),获取有关 Azure ML SDK 的更多信息。尝试使用 Azure ML SDK 创建你自己的模型。
## 作业
[使用 Azure ML SDK 的数据科学项目](assignment.md)
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,14 @@
# 使用 Azure ML SDK 的数据科学项目
## 说明
我们已经学习了如何使用 Azure ML 平台通过 Azure ML SDK 进行模型的训练、部署和使用。现在,请寻找一些数据,用于训练另一个模型,部署并使用它。你可以在 [Kaggle](https://kaggle.com) 和 [Azure Open Datasets](https://azure.microsoft.com/services/open-datasets/catalog?WT.mc_id=academic-77958-bethanycheum&ocid=AID3041109) 上寻找数据集。
## 评分标准
| 卓越 | 合格 | 需要改进 |
|------|------|----------|
|在进行 AutoML 配置时,你查阅了 SDK 文档,了解可以使用哪些参数。你通过 Azure ML SDK 使用 AutoML 对数据集进行了训练,并检查了模型解释。你部署了最佳模型,并能够通过 Azure ML SDK 使用它。|你通过 Azure ML SDK 使用 AutoML 对数据集进行了训练,并检查了模型解释。你部署了最佳模型,并能够通过 Azure ML SDK 使用它。|你通过 Azure ML SDK 使用 AutoML 对数据集进行了训练。你部署了最佳模型,并能够通过 Azure ML SDK 使用它。|
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,323 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# 云端数据科学:\"Azure ML SDK\" 方法\n",
"\n",
"## 介绍\n",
"\n",
"在本笔记本中,我们将学习如何使用 Azure ML SDK通过 Azure ML 训练、部署和使用一个模型。\n",
"\n",
"前置条件:\n",
"1. 您已创建一个 Azure ML 工作区。\n",
"2. 您已将 [心力衰竭数据集](https://www.kaggle.com/andrewmvd/heart-failure-clinical-data) 加载到 Azure ML 中。\n",
"3. 您已将此笔记本上传到 Azure ML Studio。\n",
"\n",
"接下来的步骤是:\n",
"\n",
"1. 在现有工作区中创建一个实验。\n",
"2. 创建一个计算集群。\n",
"3. 加载数据集。\n",
"4. 使用 AutoMLConfig 配置 AutoML。\n",
"5. 运行 AutoML 实验。\n",
"6. 探索结果并获取最佳模型。\n",
"7. 注册最佳模型。\n",
"8. 部署最佳模型。\n",
"9. 使用端点。\n",
"\n",
"## Azure Machine Learning SDK 的特定导入\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"from azureml.core import Workspace, Experiment\n",
"from azureml.core.compute import AmlCompute\n",
"from azureml.train.automl import AutoMLConfig\n",
"from azureml.widgets import RunDetails\n",
"from azureml.core.model import InferenceConfig, Model\n",
"from azureml.core.webservice import AciWebservice"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## 初始化工作区\n",
"从已保存的配置中初始化一个工作区对象。请确保配置文件存在于 .\\config.json\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"ws = Workspace.from_config()\n",
"print(ws.name, ws.resource_group, ws.location, ws.subscription_id, sep = '\\n')"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## 创建一个 Azure ML 实验\n",
"\n",
"让我们在刚刚初始化的工作区中创建一个名为“aml-experiment”的实验。\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"experiment_name = 'aml-experiment'\n",
"experiment = Experiment(ws, experiment_name)\n",
"experiment"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## 创建计算群集\n",
"您需要为您的 AutoML 运行创建一个[计算目标](https://docs.microsoft.com/azure/machine-learning/concept-azure-machine-learning-architecture#compute-target)。\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"aml_name = \"heart-f-cluster\"\n",
"try:\n",
" aml_compute = AmlCompute(ws, aml_name)\n",
" print('Found existing AML compute context.')\n",
"except:\n",
" print('Creating new AML compute context.')\n",
" aml_config = AmlCompute.provisioning_configuration(vm_size = \"Standard_D2_v2\", min_nodes=1, max_nodes=3)\n",
" aml_compute = AmlCompute.create(ws, name = aml_name, provisioning_configuration = aml_config)\n",
" aml_compute.wait_for_completion(show_output = True)\n",
"\n",
"cts = ws.compute_targets\n",
"compute_target = cts[aml_name]"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## 数据\n",
"请确保您已将数据集上传到 Azure ML并且密钥名称与数据集名称相同。\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"key = 'heart-failure-records'\n",
"dataset = ws.datasets[key]\n",
"df = dataset.to_pandas_dataframe()\n",
"df.describe()"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## 自动化机器学习配置\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"automl_settings = {\n",
" \"experiment_timeout_minutes\": 20,\n",
" \"max_concurrent_iterations\": 3,\n",
" \"primary_metric\" : 'AUC_weighted'\n",
"}\n",
"\n",
"automl_config = AutoMLConfig(compute_target=compute_target,\n",
" task = \"classification\",\n",
" training_data=dataset,\n",
" label_column_name=\"DEATH_EVENT\",\n",
" enable_early_stopping= True,\n",
" featurization= 'auto',\n",
" debug_log = \"automl_errors.log\",\n",
" **automl_settings\n",
" )"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## 自动化机器学习运行\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"remote_run = experiment.submit(automl_config)"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"RunDetails(remote_run).show()"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"best_run, fitted_model = remote_run.get_output()"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"best_run.get_properties()"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"model_name = best_run.properties['model_name']\n",
"script_file_name = 'inference/score.py'\n",
"best_run.download_file('outputs/scoring_file_v_1_0_0.py', 'inference/score.py')\n",
"description = \"aml heart failure project sdk\"\n",
"model = best_run.register_model(model_name = model_name,\n",
" description = description,\n",
" tags = None)"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## 部署最佳模型\n",
"\n",
"运行以下代码以部署最佳模型。您可以在 Azure ML 门户中查看部署状态。此步骤可能需要几分钟时间。\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"inference_config = InferenceConfig(entry_script=script_file_name, environment=best_run.get_environment())\n",
"\n",
"aciconfig = AciWebservice.deploy_configuration(cpu_cores = 1,\n",
" memory_gb = 1,\n",
" tags = {'type': \"automl-heart-failure-prediction\"},\n",
" description = 'Sample service for AutoML Heart Failure Prediction')\n",
"\n",
"aci_service_name = 'automl-hf-sdk'\n",
"aci_service = Model.deploy(ws, aci_service_name, [model], inference_config, aciconfig)\n",
"aci_service.wait_for_deployment(True)\n",
"print(aci_service.state)"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## 使用端点\n",
"您可以向以下输入示例添加输入内容。\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"data = {\n",
" \"data\":\n",
" [\n",
" {\n",
" 'age': \"60\",\n",
" 'anaemia': \"false\",\n",
" 'creatinine_phosphokinase': \"500\",\n",
" 'diabetes': \"false\",\n",
" 'ejection_fraction': \"38\",\n",
" 'high_blood_pressure': \"false\",\n",
" 'platelets': \"260000\",\n",
" 'serum_creatinine': \"1.40\",\n",
" 'serum_sodium': \"137\",\n",
" 'sex': \"false\",\n",
" 'smoking': \"false\",\n",
" 'time': \"130\",\n",
" },\n",
" ],\n",
"}\n",
"\n",
"test_sample = str.encode(json.dumps(data))"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"response = aci_service.run(input_data=test_sample)\n",
"response"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们概不负责。\n"
]
}
],
"metadata": {
"orig_nbformat": 4,
"language_info": {
"name": "python"
},
"coopTranslator": {
"original_hash": "af42669556d5dc19fc4cc3866f7d2597",
"translation_date": "2025-09-02T05:44:34+00:00",
"source_file": "5-Data-Science-In-Cloud/19-Azure/notebook.ipynb",
"language_code": "zh"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,23 @@
# 云中的数据科学
![cloud-picture](../../../translated_images/zh-CN/cloud-picture.f5526de3c6c6387b2d656ba94f019b3352e5e3854a78440e4fb00c93e2dea675.jpg)
> 图片由 [Jelleke Vanooteghem](https://unsplash.com/@ilumire) 提供,来自 [Unsplash](https://unsplash.com/s/photos/cloud?orientation=landscape)
在处理大数据的数据科学时,云计算可以带来革命性的变化。在接下来的三节课中,我们将了解什么是云,以及为什么它非常有用。我们还将探索一个心力衰竭数据集,并构建一个模型来帮助评估某人发生心力衰竭的可能性。我们将利用云的强大功能,通过两种不同的方式来训练、部署和使用模型。一种方式是仅使用用户界面,以低代码/无代码的方式进行;另一种方式是使用 Azure Machine Learning 软件开发工具包 (Azure ML SDK)。
![project-schema](../../../translated_images/zh-CN/project-schema.420e56d495624541eaecf2b737f138c86fb7d8162bb1c0bf8783c350872ffc4d.png)
### 主题
1. [为什么在数据科学中使用云?](17-Introduction/README.md)
2. [云中的数据科学:低代码/无代码方式](18-Low-Code/README.md)
3. [云中的数据科学Azure ML SDK 方式](19-Azure/README.md)
### 致谢
这些课程由 [Maud Levy](https://twitter.com/maudstweets) 和 [Tiffany Souterre](https://twitter.com/TiffanySouterre) 带着 ☁️ 和 💕 编写。
心力衰竭预测项目的数据来源于 [Kaggle](https://www.kaggle.com/andrewmvd/heart-failure-clinical-data) 上的 [Larxel](https://www.kaggle.com/andrewmvd)。数据遵循 [Attribution 4.0 International (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/) 许可协议。
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,147 @@
# 数据科学在现实世界中的应用
| ![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/20-DataScience-RealWorld.png) |
| :--------------------------------------------------------------------------------------------------------------: |
| 数据科学在现实世界中的应用 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
我们即将完成这段学习旅程!
我们从数据科学和伦理的定义开始探索了各种数据分析和可视化工具与技术回顾了数据科学生命周期并研究了如何通过云计算服务扩展和自动化数据科学工作流程。那么你可能会问_"如何将这些学习内容映射到现实世界的场景中?"_
在本课中,我们将探讨数据科学在各行业中的实际应用,并深入研究在科研、数字人文和可持续发展领域的具体案例。我们还将讨论学生项目的机会,并提供一些有用的资源,帮助你继续学习之旅!
## 课前测验
## [课前测验](https://ff-quizzes.netlify.app/en/ds/quiz/38)
## 数据科学 + 行业
随着人工智能的普及,开发者现在可以更轻松地设计和集成基于人工智能的决策和数据驱动的洞察到用户体验和开发工作流程中。以下是数据科学在各行业中“应用”的一些实际案例:
* [Google Flu Trends](https://www.wired.com/2015/10/can-learn-epic-failure-google-flu-trends/) 使用数据科学将搜索词与流感趋势相关联。尽管方法存在缺陷,但它提高了人们对数据驱动的医疗预测可能性(以及挑战)的认识。
* [UPS 路线预测](https://www.technologyreview.com/2018/11/21/139000/how-ups-uses-ai-to-outsmart-bad-weather/) - 解释了 UPS 如何利用数据科学和机器学习预测最佳配送路线,考虑天气状况、交通模式、配送截止时间等因素。
* [纽约出租车路线可视化](http://chriswhong.github.io/nyctaxi/) - 使用[信息自由法](https://chriswhong.com/open-data/foil_nyc_taxi/)收集的数据帮助可视化纽约出租车一天的运行情况帮助我们了解它们如何在繁忙的城市中导航、赚取的收入以及每24小时内的行程时长。
* [Uber 数据科学工作台](https://eng.uber.com/dsw/) - 每天从数百万次 Uber 行程中收集数据(如上下车地点、行程时长、偏好路线等),构建数据分析工具,用于定价、安全、欺诈检测和导航决策。
* [体育分析](https://towardsdatascience.com/scope-of-analytics-in-sports-world-37ed09c39860) - 关注_预测分析_团队和球员分析 - 想想[点球成金](https://datasciencedegree.wisconsin.edu/blog/moneyball-proves-importance-big-data-big-ideas/) - 以及粉丝管理和_数据可视化_团队和粉丝仪表盘、比赛等应用包括人才选拔、体育博彩和库存/场馆管理。
* [银行业中的数据科学](https://data-flair.training/blogs/data-science-in-banking/) - 强调数据科学在金融行业的价值,应用包括风险建模和欺诈检测、客户细分、实时预测和推荐系统。预测分析还推动了关键指标,如[信用评分](https://dzone.com/articles/using-big-data-and-predictive-analytics-for-credit)。
* [医疗领域的数据科学](https://data-flair.training/blogs/data-science-in-healthcare/) - 强调应用包括医学影像(如 MRI、X光、CT扫描、基因组学DNA测序、药物开发风险评估、成功预测、预测分析患者护理和供应物流、疾病追踪与预防等。
![数据科学在现实世界中的应用](../../../../translated_images/zh-CN/data-science-applications.4e5019cd8790ebac2277ff5f08af386f8727cac5d30f77727c7090677e6adb9c.png) 图片来源:[Data Flair: 6 Amazing Data Science Applications ](https://data-flair.training/blogs/data-science-applications/)
图中展示了其他领域和数据科学技术的应用案例。想探索更多应用?查看下面的[复习与自学](../../../../6-Data-Science-In-Wild/20-Real-World-Examples)部分。
## 数据科学 + 科研
| ![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/20-DataScience-Research.png) |
| :---------------------------------------------------------------------------------------------------------------: |
| 数据科学与科研 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
虽然现实世界的应用通常关注行业规模的用例_科研_应用和项目可以从两个角度提供价值
* _创新机会_ - 探索先进概念的快速原型设计以及下一代应用的用户体验测试。
* _部署挑战_ - 调查数据科学技术在现实世界中的潜在危害或意外后果。
对于学生来说,这些科研项目不仅提供学习和协作的机会,还能加深对主题的理解,并拓宽与相关领域的人员或团队的接触和参与。科研项目是什么样的?它们如何产生影响?
让我们看一个例子 - [MIT Gender Shades Study](http://gendershades.org/overview.html),由 Joy BuolamwiniMIT Media Labs发起与 Timnit Gebru当时在微软研究院共同撰写了一篇[标志性研究论文](http://proceedings.mlr.press/v81/buolamwini18a/buolamwini18a.pdf),重点研究:
* **什么:** 研究项目的目标是_评估基于性别和肤色的自动化面部分析算法和数据集中的偏差_。
* **为什么:** 面部分析被用于执法、机场安检、招聘系统等领域——这些场景中由于偏差导致的不准确分类可能对受影响的个人或群体造成经济和社会损害。理解(并消除或减轻)偏差是使用公平的关键。
* **如何:** 研究人员发现现有基准主要使用肤色较浅的主体并策划了一个新的数据集1000+张图片在性别和肤色上更加平衡。该数据集用于评估三个性别分类产品来自微软、IBM和Face++)的准确性。
结果显示,尽管总体分类准确性较高,但不同子群体之间的错误率存在显著差异——**性别错误分类**在女性或肤色较深的人群中更高,表明存在偏差。
**关键成果:** 提高了对数据科学需要更多_代表性数据集_平衡子群体和更多_包容性团队_多样化背景的认识以便在人工智能解决方案中更早地识别并消除或减轻这些偏差。像这样的研究努力对于许多组织定义_负责任的人工智能_原则和实践以提高其人工智能产品和流程的公平性也至关重要。
**想了解微软相关的研究工作?**
* 查看[微软研究项目](https://www.microsoft.com/research/research-area/artificial-intelligence/?facet%5Btax%5D%5Bmsr-research-area%5D%5B%5D=13556&facet%5Btax%5D%5Bmsr-content-type%5D%5B%5D=msr-project)中的人工智能领域。
* 探索[微软研究数据科学暑期学校](https://www.microsoft.com/en-us/research/academic-program/data-science-summer-school/)的学生项目。
* 查看[Fairlearn](https://fairlearn.org/)项目和[负责任的人工智能](https://www.microsoft.com/en-us/ai/responsible-ai?activetab=pivot1%3aprimaryr6)倡议。
## 数据科学 + 人文学科
| ![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/20-DataScience-Humanities.png) |
| :---------------------------------------------------------------------------------------------------------------: |
| 数据科学与数字人文学科 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
数字人文学科[被定义为](https://digitalhumanities.stanford.edu/about-dh-stanford)“结合计算方法与人文研究的一系列实践和方法”。[斯坦福项目](https://digitalhumanities.stanford.edu/projects)如_“重启历史”_和_“诗意思维”_展示了[数字人文学科与数据科学](https://digitalhumanities.stanford.edu/digital-humanities-and-data-science)之间的联系——强调网络分析、信息可视化、空间和文本分析等技术,这些技术可以帮助我们重新审视历史和文学数据集,从而获得新的洞察和视角。
*想探索并扩展这一领域的项目?*
查看["Emily Dickinson and the Meter of Mood"](https://gist.github.com/jlooper/ce4d102efd057137bc000db796bfd671)——这是一个来自[Jen Looper](https://twitter.com/jenlooper)的优秀案例探讨如何利用数据科学重新审视熟悉的诗歌并在新的背景下重新评估其意义及作者的贡献。例如_我们能否通过分析诗歌的语气或情感来预测其创作的季节_——这又能告诉我们作者在相关时期的心境如何
为回答这个问题,我们遵循数据科学生命周期的步骤:
* [`数据获取`](https://gist.github.com/jlooper/ce4d102efd057137bc000db796bfd671#acquiring-the-dataset) - 收集相关数据集进行分析。选项包括使用 API如[Poetry DB API](https://poetrydb.org/index.html))或使用工具(如[Scrapy](https://scrapy.org/))抓取网页(如[Project Gutenberg](https://www.gutenberg.org/files/12242/12242-h/12242-h.htm))。
* [`数据清理`](https://gist.github.com/jlooper/ce4d102efd057137bc000db796bfd671#clean-the-data) - 解释如何使用基本工具(如 Visual Studio Code 和 Microsoft Excel格式化、清理和简化文本。
* [`数据分析`](https://gist.github.com/jlooper/ce4d102efd057137bc000db796bfd671#working-with-the-data-in-a-notebook) - 解释如何将数据集导入“笔记本”进行分析,使用 Python 包(如 pandas、numpy 和 matplotlib组织和可视化数据。
* [`情感分析`](https://gist.github.com/jlooper/ce4d102efd057137bc000db796bfd671#sentiment-analysis-using-cognitive-services) - 解释如何集成云服务(如文本分析),使用低代码工具(如[Power Automate](https://flow.microsoft.com/en-us/))实现自动化数据处理工作流程。
通过这一工作流程,我们可以探索季节对诗歌情感的影响,并帮助我们形成对作者的独特视角。自己试试吧——然后扩展笔记本,提出其他问题或以新的方式可视化数据!
> 你可以使用[数字人文学科工具包](https://github.com/Digital-Humanities-Toolkit)中的一些工具来探索这些研究方向。
## 数据科学 + 可持续发展
| ![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/20-DataScience-Sustainability.png) |
| :---------------------------------------------------------------------------------------------------------------: |
| 数据科学与可持续发展 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
[2030年可持续发展议程](https://sdgs.un.org/2030agenda)——由所有联合国成员国于2015年通过——确定了17个目标其中包括**保护地球**免受退化和气候变化影响。[微软可持续发展](https://www.microsoft.com/en-us/sustainability)倡议支持这些目标,探索技术解决方案如何支持并构建更可持续的未来,重点关注[四个目标](https://dev.to/azure/a-visual-guide-to-sustainable-software-engineering-53hh)——到2030年实现碳负、水正、零废物和生物多样性。
以可扩展和及时的方式解决这些挑战需要云规模的思维——以及大规模数据。[Planetary Computer](https://planetarycomputer.microsoft.com/)倡议为数据科学家和开发者提供了四个组件来支持这一努力:
* [数据目录](https://planetarycomputer.microsoft.com/catalog) - 提供数PB的地球系统数据免费且托管于 Azure
* [Planetary API](https://planetarycomputer.microsoft.com/docs/reference/stac/) - 帮助用户在空间和时间范围内搜索相关数据。
* [Hub](https://planetarycomputer.microsoft.com/docs/overview/environment/) - 为科学家提供处理海量地理空间数据集的托管环境。
* [应用](https://planetarycomputer.microsoft.com/applications) - 展示可持续发展洞察的用例和工具。
**Planetary Computer 项目目前处于预览阶段(截至 2021 年 9 月)** - 以下是如何通过数据科学开始为可持续发展解决方案做出贡献的指南。
* [申请访问权限](https://planetarycomputer.microsoft.com/account/request),开始探索并与同行建立联系。
* [查看文档](https://planetarycomputer.microsoft.com/docs/overview/about),了解支持的数据集和 API。
* 探索像 [生态系统监测](https://analytics-lab.org/ecosystemmonitoring/) 这样的应用,寻找应用创意的灵感。
思考如何利用数据可视化揭示或放大与气候变化和森林砍伐等领域相关的洞察。或者思考如何利用这些洞察来创造新的用户体验,激励行为改变以实现更可持续的生活。
## 数据科学 + 学生
我们已经讨论了行业和研究中的实际应用,并探索了数字人文和可持续发展领域的数据科学应用示例。那么,作为数据科学初学者,你如何提升技能并分享你的专业知识呢?
以下是一些数据科学学生项目的示例,供你参考。
* [MSR 数据科学夏季学校](https://www.microsoft.com/en-us/research/academic-program/data-science-summer-school/#!projects),以及 GitHub 上的 [项目](https://github.com/msr-ds3),探索以下主题:
- [警察使用武力中的种族偏见](https://www.microsoft.com/en-us/research/video/data-science-summer-school-2019-replicating-an-empirical-analysis-of-racial-differences-in-police-use-of-force/) | [Github](https://github.com/msr-ds3/stop-question-frisk)
- [纽约地铁系统的可靠性](https://www.microsoft.com/en-us/research/video/data-science-summer-school-2018-exploring-the-reliability-of-the-nyc-subway-system/) | [Github](https://github.com/msr-ds3/nyctransit)
* [数字化物质文化:探索 Sirkap 的社会经济分布](https://claremont.maps.arcgis.com/apps/Cascade/index.html?appid=bdf2aef0f45a4674ba41cd373fa23afc) - 来自 [Ornella Altunyan](https://twitter.com/ornelladotcom) 和 Claremont 团队,使用 [ArcGIS StoryMaps](https://storymaps.arcgis.com/)。
## 🚀 挑战
寻找推荐适合初学者的数据科学项目的文章,例如 [这 50 个主题领域](https://www.upgrad.com/blog/data-science-project-ideas-topics-beginners/)、[这 21 个项目创意](https://www.intellspot.com/data-science-project-ideas) 或 [这 16 个带源码的项目](https://data-flair.training/blogs/data-science-project-ideas/),你可以拆解并重新组合这些项目。别忘了记录你的学习历程,并与我们分享你的洞察。
## 课后测验
## [课后测验](https://ff-quizzes.netlify.app/en/ds/quiz/39)
## 复习与自学
想要探索更多用例?以下是一些相关的文章:
* [17 个数据科学应用及示例](https://builtin.com/data-science/data-science-applications-examples) - 2021 年 7 月
* [11 个令人惊叹的现实世界数据科学应用](https://myblindbird.com/data-science-applications-real-world/) - 2021 年 5 月
* [现实世界中的数据科学](https://towardsdatascience.com/data-science-in-the-real-world/home) - 文章合集
* [12 个现实世界数据科学应用及示例](https://www.scaler.com/blog/data-science-applications/) - 2024 年 5 月
* 数据科学在以下领域的应用:[教育](https://data-flair.training/blogs/data-science-in-education/)、[农业](https://data-flair.training/blogs/data-science-in-agriculture/)、[金融](https://data-flair.training/blogs/data-science-in-finance/)、[电影](https://data-flair.training/blogs/data-science-at-movies/)、[医疗保健](https://onlinedegrees.sandiego.edu/data-science-health-care/) 等。
## 作业
[探索一个 Planetary Computer 数据集](assignment.md)
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而导致的任何误解或误读,我们概不负责。

@ -0,0 +1,39 @@
# 探索行星计算机数据集
## 说明
在本课中,我们讨论了各种数据科学应用领域,并深入研究了与科研、可持续发展和数字人文相关的示例。在这个任务中,你将更详细地探索其中一个示例,并应用你在数据可视化和分析方面的学习,来从可持续发展数据中获取洞察。
[行星计算机](https://planetarycomputer.microsoft.com/)项目提供了可以通过账户访问的数据集和API——如果你想尝试任务的额外步骤可以申请一个账户以获得访问权限。该网站还提供了一个[Explorer](https://planetarycomputer.microsoft.com/explore)功能,你可以在无需创建账户的情况下使用它。
`步骤:`
Explorer界面如下图所示允许你选择一个数据集从提供的选项中一个预设查询用于过滤数据以及一个渲染选项用于创建相关的可视化。在这个任务中你需要
1. 阅读[Explorer文档](https://planetarycomputer.microsoft.com/docs/overview/explorer/)——了解选项。
2. 探索数据集[目录](https://planetarycomputer.microsoft.com/catalog)——了解每个数据集的用途。
3. 使用Explorer——选择一个感兴趣的数据集选择一个相关的查询和渲染选项。
![行星计算机Explorer](../../../../translated_images/zh-CN/planetary-computer-explorer.c1e95a9b053167d64e2e8e4347cfb689e47e2037c33103fc1bbea1a149d4f85b.png)
`你的任务:`
现在研究浏览器中渲染的可视化,并回答以下问题:
* 数据集有哪些_特征_
* 可视化提供了哪些_洞察_或结果
* 这些洞察对项目的可持续发展目标有什么_意义_
* 可视化的_局限性_是什么你没有获得哪些洞察
* 如果你能获得原始数据你会创建哪些_替代可视化_为什么
`额外加分:`
申请一个账户——并在获得批准后登录。
* 使用 _Launch Hub_ 选项在Notebook中打开原始数据。
* 交互式地探索数据,并实现你想到的替代可视化。
* 现在分析你的自定义可视化——你是否能够获得之前遗漏的洞察?
## 评分标准
优秀 | 合格 | 需要改进
--- | --- | -- |
回答了所有五个核心问题。学生清楚地指出当前和替代可视化如何提供关于可持续发展目标或结果的洞察。| 学生详细回答了至少前三个问题表明他们对Explorer有实际经验。| 学生未能回答多个问题,或提供的细节不足——表明未对项目进行有意义的尝试。 |
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,14 @@
# 数据科学的实际应用
数据科学在各行业中的真实应用。
### 主题
1. [现实世界中的数据科学](20-Real-World-Examples/README.md)
### 致谢
由 [Nitya Narasimhan](https://twitter.com/nitya) ❤️ 撰写
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,366 @@
# AGENTS.md
## 项目概述
《数据科学入门》是由 Microsoft Azure Cloud Advocates 创建的一个全面的10周、20课时的课程。该仓库是一个学习资源通过基于项目的课程教授数据科学的基础概念包括 Jupyter 笔记本、互动测验和实践作业。
**关键技术:**
- **Jupyter 笔记本**:使用 Python 3 的主要学习媒介
- **Python 库**pandas、numpy、matplotlib 用于数据分析和可视化
- **Vue.js 2**测验应用程序quiz-app 文件夹)
- **Docsify**:离线访问的文档站点生成器
- **Node.js/npm**JavaScript 组件的包管理
- **Markdown**:所有课程内容和文档
**架构:**
- 多语言教育仓库,提供广泛的翻译
- 结构化为课程模块从1-Introduction到6-Data-Science-In-Wild
- 每节课包括 README、笔记本、作业和测验
- 独立的 Vue.js 测验应用程序,用于课前/课后评估
- 支持 GitHub Codespaces 和 VS Code 开发容器
## 设置命令
### 仓库设置
```bash
# Clone the repository (if not already cloned)
git clone https://github.com/microsoft/Data-Science-For-Beginners.git
cd Data-Science-For-Beginners
```
### Python 环境设置
```bash
# Create a virtual environment (recommended)
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install common data science libraries (no requirements.txt exists)
pip install jupyter pandas numpy matplotlib seaborn scikit-learn
```
### 测验应用程序设置
```bash
# Navigate to quiz app
cd quiz-app
# Install dependencies
npm install
# Start development server
npm run serve
# Build for production
npm run build
# Lint and fix files
npm run lint
```
### Docsify 文档服务器
```bash
# Install Docsify globally
npm install -g docsify-cli
# Serve documentation locally
docsify serve
# Documentation will be available at localhost:3000
```
### 可视化项目设置
对于像 meaningful-visualizations第13课这样的可视化项目
```bash
# Navigate to starter or solution folder
cd 3-Data-Visualization/13-meaningful-visualizations/starter
# Install dependencies
npm install
# Start development server
npm run serve
# Build for production
npm run build
# Lint files
npm run lint
```
## 开发工作流程
### 使用 Jupyter 笔记本
1. 在仓库根目录启动 Jupyter`jupyter notebook`
2. 导航到所需的课程文件夹
3. 打开 `.ipynb` 文件以完成练习
4. 笔记本是自包含的,包含解释和代码单元
5. 大多数笔记本使用 pandas、numpy 和 matplotlib - 确保这些库已安装
### 课程结构
每节课通常包括:
- `README.md` - 主要课程内容,包含理论和示例
- `notebook.ipynb` - 实践 Jupyter 笔记本练习
- `assignment.ipynb``assignment.md` - 实践作业
- `solution/` 文件夹 - 解决方案笔记本和代码
- `images/` 文件夹 - 支持的视觉材料
### 测验应用程序开发
- 使用 Vue.js 2 的应用程序,开发期间支持热重载
- 测验存储在 `quiz-app/src/assets/translations/`
- 每种语言都有自己的翻译文件夹en, fr, es 等)
- 测验编号从0开始总计40个测验
### 添加翻译
- 翻译存储在仓库根目录的 `translations/` 文件夹中
- 每种语言的课程结构与英文完全镜像
- 通过 GitHub Actions 自动翻译co-op-translator.yml
## 测试说明
### 测验应用程序测试
```bash
cd quiz-app
# Run lint checks
npm run lint
# Test build process
npm run build
# Manual testing: Start dev server and verify quiz functionality
npm run serve
```
### 笔记本测试
- 笔记本没有自动化测试框架
- 手动验证:按顺序运行所有单元,确保没有错误
- 验证数据文件是否可访问,输出是否正确生成
- 检查可视化是否正确渲染
### 文档测试
```bash
# Verify Docsify renders correctly
docsify serve
# Check for broken links manually by navigating through content
# Verify all lesson links work in the rendered documentation
```
### 代码质量检查
```bash
# Vue.js projects (quiz-app and visualization projects)
cd quiz-app # or visualization project folder
npm run lint
# Python notebooks - manual verification recommended
# Ensure imports work and cells execute without errors
```
## 代码风格指南
### PythonJupyter 笔记本)
- 遵循 PEP 8 风格指南编写 Python 代码
- 使用清晰的变量名,解释所分析的数据
- 在代码单元之前包含解释性的 Markdown 单元
- 代码单元专注于单一概念或操作
- 使用 pandas 进行数据操作matplotlib 进行可视化
- 常见导入模式:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
```
### JavaScript/Vue.js
- 遵循 Vue.js 2 风格指南和最佳实践
- ESLint 配置在 `quiz-app/package.json`
- 使用 Vue 单文件组件(.vue 文件)
- 维护基于组件的架构
- 提交更改前运行 `npm run lint`
### Markdown 文档
- 使用清晰的标题层次结构(# ## ### 等)
- 包含带语言说明符的代码块
- 为图片添加替代文本
- 链接相关课程和资源
- 保持合理的行长度以提高可读性
### 文件组织
- 课程内容存储在编号文件夹中01-defining-data-science 等)
- 解决方案存储在专用的 `solution/` 子文件夹中
- 翻译在 `translations/` 文件夹中镜像英文结构
- 数据文件存储在 `data/` 或课程特定文件夹中
## 构建和部署
### 测验应用程序部署
```bash
cd quiz-app
# Build production version
npm run build
# Output is in dist/ folder
# Deploy dist/ folder to static hosting (Azure Static Web Apps, Netlify, etc.)
```
### Azure 静态 Web 应用部署
测验应用程序可以部署到 Azure 静态 Web 应用:
1. 创建 Azure 静态 Web 应用资源
2. 连接到 GitHub 仓库
3. 配置构建设置:
- 应用位置:`quiz-app`
- 输出位置:`dist`
4. GitHub Actions 工作流将在推送时自动部署
### 文档站点
```bash
# Build PDF from Docsify (optional)
npm run convert
# Docsify documentation is served directly from markdown files
# No build step required for deployment
# Deploy repository to static hosting with Docsify
```
### GitHub Codespaces
- 仓库包含开发容器配置
- Codespaces 自动设置 Python 和 Node.js 环境
- 通过 GitHub UI 打开仓库中的 Codespace
- 所有依赖项自动安装
## 拉取请求指南
### 提交前
```bash
# For Vue.js changes in quiz-app
cd quiz-app
npm run lint
npm run build
# Test changes locally
npm run serve
```
### PR 标题格式
- 使用清晰、描述性的标题
- 格式:`[组件] 简短描述`
- 示例:
- `[第7课] 修复 Python 笔记本导入错误`
- `[测验应用] 添加德语翻译`
- `[文档] 更新 README添加新前置条件`
### 必要检查
- 确保所有代码运行无错误
- 验证笔记本完全执行
- 确认 Vue.js 应用程序成功构建
- 检查文档链接是否有效
- 如果修改了测验应用程序,请进行测试
- 验证翻译保持一致的结构
### 贡献指南
- 遵循现有代码风格和模式
- 为复杂逻辑添加解释性注释
- 更新相关文档
- 如果适用,跨不同课程模块测试更改
- 查看 CONTRIBUTING.md 文件
## 附加说明
### 常用库
- **pandas**:数据操作和分析
- **numpy**:数值计算
- **matplotlib**:数据可视化和绘图
- **seaborn**:统计数据可视化(部分课程)
- **scikit-learn**:机器学习(高级课程)
### 使用数据文件
- 数据文件位于 `data/` 文件夹或课程特定目录中
- 大多数笔记本期望数据文件在相对路径中
- CSV 文件是主要的数据格式
- 部分课程使用 JSON 作为非关系数据示例
### 多语言支持
- 通过 GitHub Actions 提供40多种语言翻译
- 翻译工作流在 `.github/workflows/co-op-translator.yml`
- 翻译存储在 `translations/` 文件夹中,使用语言代码命名
- 测验翻译存储在 `quiz-app/src/assets/translations/`
### 开发环境选项
1. **本地开发**:本地安装 Python、Jupyter、Node.js
2. **GitHub Codespaces**:基于云的即时开发环境
3. **VS Code 开发容器**:基于本地容器的开发
4. **Binder**:在云中启动笔记本(如果已配置)
### 课程内容指南
- 每节课是独立的,但建立在之前的概念之上
- 课前测验测试先前知识
- 课后测验巩固学习
- 作业提供实践练习
- Sketchnotes 提供视觉总结
### 常见问题排查
**Jupyter 内核问题:**
```bash
# Ensure correct kernel is installed
python -m ipykernel install --user --name=datascience
```
**npm 安装失败:**
```bash
# Clear npm cache and retry
npm cache clean --force
rm -rf node_modules package-lock.json
npm install
```
**笔记本导入错误:**
- 验证所有必需库是否已安装
- 检查 Python 版本兼容性(推荐 Python 3.7+
- 确保虚拟环境已激活
**Docsify 无法加载:**
- 验证是否从仓库根目录提供服务
- 检查 `index.html` 是否存在
- 确保网络访问正常(端口 3000
### 性能注意事项
- 大型数据集可能需要时间加载到笔记本中
- 复杂图表的可视化渲染可能较慢
- Vue.js 开发服务器支持热重载以快速迭代
- 生产构建经过优化和压缩
### 安全注意事项
- 不应提交敏感数据或凭据
- 在云课程中使用环境变量存储任何 API 密钥
- 与 Azure 相关的课程可能需要 Azure 账户凭据
- 保持依赖项更新以获取安全补丁
## 贡献翻译
- 通过 GitHub Actions 管理自动翻译
- 欢迎手动修正以提高翻译准确性
- 遵循现有翻译文件夹结构
- 更新测验链接以包含语言参数:`?loc=fr`
- 测试翻译课程以确保正确渲染
## 相关资源
- 主课程https://aka.ms/datascience-beginners
- Microsoft Learnhttps://docs.microsoft.com/learn/
- 学生中心https://docs.microsoft.com/learn/student-hub
- 讨论论坛https://github.com/microsoft/Data-Science-For-Beginners/discussions
- 其他 Microsoft 课程ML for Beginners, AI for Beginners, Web Dev for Beginners
## 项目维护
- 定期更新以保持内容最新
- 欢迎社区贡献
- 在 GitHub 上跟踪问题
- 由课程维护者审查 PR
- 每月内容审查和更新
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,12 @@
# Microsoft 开源行为准则
本项目已采用 [Microsoft 开源行为准则](https://opensource.microsoft.com/codeofconduct/)。
资源:
- [Microsoft 开源行为准则](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft 行为准则常见问题](https://opensource.microsoft.com/codeofconduct/faq/)
- 如有疑问或需帮助,请联系 [opencode@microsoft.com](mailto:opencode@microsoft.com)
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,353 @@
# 贡献《数据科学入门》
感谢您对《数据科学入门》课程的贡献兴趣!我们欢迎社区的贡献。
## 目录
- [行为准则](../..)
- [我如何贡献?](../..)
- [入门指南](../..)
- [贡献指南](../..)
- [拉取请求流程](../..)
- [样式指南](../..)
- [贡献者许可协议](../..)
## 行为准则
本项目采用了 [Microsoft 开源行为准则](https://opensource.microsoft.com/codeofconduct/)。
有关更多信息,请参阅 [行为准则常见问题](https://opensource.microsoft.com/codeofconduct/faq/) 或通过 [opencode@microsoft.com](mailto:opencode@microsoft.com) 联系我们提出其他问题或意见。
## 我如何贡献?
### 报告错误
在创建错误报告之前,请检查现有问题以避免重复。当您创建错误报告时,请尽可能提供详细信息:
- **使用清晰且描述性的标题**
- **描述重现问题的具体步骤**
- **提供具体示例**(代码片段、截图)
- **描述您观察到的行为以及您的期望**
- **包括您的环境详细信息**操作系统、Python版本、浏览器
### 提出改进建议
我们欢迎改进建议!提出建议时:
- **使用清晰且描述性的标题**
- **提供建议改进的详细描述**
- **解释为什么此改进会有用**
- **列出其他项目中的类似功能(如果适用)**
### 贡献文档
文档改进总是受到欢迎:
- **修复拼写和语法错误**
- **提高解释的清晰度**
- **补充缺失的文档**
- **更新过时的信息**
- **添加示例或使用案例**
### 贡献代码
我们欢迎以下代码贡献:
- **新的课程或练习**
- **错误修复**
- **改进现有的笔记本**
- **新的数据集或示例**
- **测验应用程序的改进**
## 入门指南
### 前提条件
在贡献之前,请确保您已具备以下条件:
1. 一个 GitHub 账户
2. 您的系统上已安装 Git
3. 安装了 Python 3.7+ 和 Jupyter
4. 安装了 Node.js 和 npm用于测验应用程序贡献
5. 熟悉课程结构
请参阅 [INSTALLATION.md](INSTALLATION.md) 获取详细的设置说明。
### Fork 和克隆
1. **在 GitHub 上 Fork 仓库**
2. **本地克隆您的 Fork**
```bash
git clone https://github.com/YOUR-USERNAME/Data-Science-For-Beginners.git
cd Data-Science-For-Beginners
```
3. **添加上游远程仓库**
```bash
git remote add upstream https://github.com/microsoft/Data-Science-For-Beginners.git
```
### 创建分支
为您的工作创建一个新分支:
```bash
git checkout -b feature/your-feature-name
# or
git checkout -b fix/your-bug-fix
```
分支命名约定:
- `feature/` - 新功能或课程
- `fix/` - 错误修复
- `docs/` - 文档更改
- `refactor/` - 代码重构
## 贡献指南
### 对课程内容的贡献
贡献课程或修改现有课程时:
1. **遵循现有结构**
- README.md 包含课程内容
- Jupyter 笔记本包含练习
- 作业(如果适用)
- 链接到前测和后测
2. **包括以下元素**
- 清晰的学习目标
- 分步解释
- 带注释的代码示例
- 练习以供实践
- 额外资源的链接
3. **确保可访问性**
- 使用清晰、简单的语言
- 为图片提供替代文本
- 包含代码注释
- 考虑不同的学习风格
### 对 Jupyter 笔记本的贡献
1. **在提交之前清除所有输出**
```bash
jupyter nbconvert --clear-output --inplace notebook.ipynb
```
2. **包含带解释的 Markdown 单元格**
3. **使用一致的格式**
```python
# Import libraries at the top
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Use meaningful variable names
# Add comments for complex operations
# Follow PEP 8 style guidelines
```
4. **在提交之前完全测试您的笔记本**
### 对 Python 代码的贡献
遵循 [PEP 8](https://www.python.org/dev/peps/pep-0008/) 样式指南:
```python
# Good practices
import pandas as pd
def calculate_mean(data):
"""Calculate the mean of a dataset.
Args:
data (list): List of numerical values
Returns:
float: Mean of the dataset
"""
return sum(data) / len(data)
```
### 对测验应用程序的贡献
修改测验应用程序时:
1. **本地测试**
```bash
cd quiz-app
npm install
npm run serve
```
2. **运行代码检查工具**
```bash
npm run lint
```
3. **成功构建**
```bash
npm run build
```
4. **遵循 Vue.js 样式指南**和现有模式
### 对翻译的贡献
添加或更新翻译时:
1. 遵循 `translations/` 文件夹中的结构
2. 使用语言代码作为文件夹名称(例如,法语为 `fr`
3. 保持与英文版本相同的文件结构
4. 更新测验链接以包含语言参数:`?loc=fr`
5. 测试所有链接和格式
## 拉取请求流程
### 提交之前
1. **使用最新更改更新您的分支**
```bash
git fetch upstream
git rebase upstream/main
```
2. **测试您的更改**
- 运行所有修改过的笔记本
- 测试测验应用程序(如果已修改)
- 验证所有链接是否有效
- 检查拼写和语法错误
3. **提交您的更改**
```bash
git add .
git commit -m "Brief description of changes"
```
编写清晰的提交消息:
- 使用现在时态(“添加功能”而不是“已添加功能”)
- 使用命令式语气(“移动光标到...”而不是“光标移动到...”)
- 限制第一行为 72 个字符
- 在相关时引用问题和拉取请求
4. **推送到您的 Fork**
```bash
git push origin feature/your-feature-name
```
### 创建拉取请求
1. 转到 [仓库](https://github.com/microsoft/Data-Science-For-Beginners)
2. 点击“Pull requests” → “New pull request”
3. 点击“compare across forks”
4. 选择您的 Fork 和分支
5. 点击“Create pull request”
### PR 标题格式
使用清晰、描述性的标题,遵循以下格式:
```
[Component] Brief description
```
示例:
- `[Lesson 7] 修复 Python 笔记本导入错误`
- `[Quiz App] 添加德语翻译`
- `[Docs] 更新 README添加新前提条件`
- `[Fix] 修正可视化课程中的数据路径`
### PR 描述
在您的 PR 描述中包括:
- **内容**:您做了哪些更改?
- **原因**:为什么需要这些更改?
- **方法**:您如何实现这些更改?
- **测试**:您如何测试这些更改?
- **截图**:对于视觉更改,请包含截图
- **相关问题**链接到相关问题例如“Fixes #123”)
### 审核流程
1. **自动检查**将运行在您的 PR 上
2. **维护者将审核**您的贡献
3. **根据反馈**进行额外提交
4. 一旦获得批准,**维护者将合并**您的 PR
### PR 合并后
1. 删除您的分支:
```bash
git branch -d feature/your-feature-name
git push origin --delete feature/your-feature-name
```
2. 更新您的 Fork
```bash
git checkout main
git pull upstream main
git push origin main
```
## 样式指南
### Markdown
- 使用一致的标题级别
- 在章节之间添加空行
- 使用带语言标识符的代码块:
````markdown
```python
import pandas as pd
```
````
- 为图片添加替代文本:`![Alt text](../../translated_images/zh-CN/image.4ee84a82b5e4c9e6651b13fd27dcf615e427ec584929f2cef7167aa99151a77a.png)`
- 保持合理的行长度(约 80-100 个字符)
### Python
- 遵循 PEP 8 样式指南
- 使用有意义的变量名
- 为函数添加文档字符串
- 在适当的地方添加类型提示:
```python
def process_data(df: pd.DataFrame) -> pd.DataFrame:
"""Process the input dataframe."""
return df
```
### JavaScript/Vue.js
- 遵循 Vue.js 2 样式指南
- 使用提供的 ESLint 配置
- 编写模块化、可重用的组件
- 为复杂逻辑添加注释
### 文件组织
- 将相关文件放在一起
- 使用描述性的文件名
- 遵循现有的目录结构
- 不要提交不必要的文件(如 .DS_Store、.pyc、node_modules 等)
## 贡献者许可协议
本项目欢迎贡献和建议。大多数贡献需要您同意贡献者许可协议 (CLA),声明您有权并实际授予我们使用您的贡献的权利。详情请访问 https://cla.microsoft.com。
当您提交拉取请求时CLA-bot 会自动确定您是否需要提供 CLA并适当装饰 PR例如标签、评论。只需按照机器人提供的说明操作即可。您只需在所有使用我们 CLA 的仓库中执行一次此操作。
## 有问题?
- 查看我们的 [Discord 频道 #data-science-for-beginners](https://aka.ms/ds4beginners/discord)
- 加入我们的 [Discord 社区](https://aka.ms/ds4beginners/discord)
- 查看现有的 [问题](https://github.com/microsoft/Data-Science-For-Beginners/issues) 和 [拉取请求](https://github.com/microsoft/Data-Science-For-Beginners/pulls)
## 感谢!
您的贡献使这门课程对所有人都更好。感谢您抽出时间贡献!
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,252 @@
# 安装指南
本指南将帮助您设置环境,以使用《数据科学入门》课程。
## 目录
- [先决条件](../..)
- [快速开始选项](../..)
- [本地安装](../..)
- [验证安装](../..)
## 先决条件
在开始之前,您需要具备以下条件:
- 基本的命令行/终端操作知识
- 一个 GitHub 账户(免费)
- 稳定的互联网连接以完成初始设置
## 快速开始选项
### 选项 1GitHub Codespaces推荐初学者使用
最简单的开始方式是使用 GitHub Codespaces它提供了一个完整的开发环境直接在浏览器中运行。
1. 访问 [仓库](https://github.com/microsoft/Data-Science-For-Beginners)
2. 点击 **Code** 下拉菜单
3. 选择 **Codespaces** 标签
4. 点击 **Create codespace on main**
5. 等待环境初始化2-3分钟
您的环境现在已经准备好,所有依赖项都已预安装!
### 选项 2本地开发
如果您希望在自己的电脑上工作,请按照以下详细说明操作。
## 本地安装
### 步骤 1安装 Git
Git 是用于克隆仓库和跟踪更改的必要工具。
**Windows:**
- 从 [git-scm.com](https://git-scm.com/download/win) 下载
- 使用默认设置运行安装程序
**macOS:**
- 使用 Homebrew 安装:`brew install git`
- 或从 [git-scm.com](https://git-scm.com/download/mac) 下载
**Linux:**
```bash
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install git
# Fedora
sudo dnf install git
# Arch
sudo pacman -S git
```
### 步骤 2克隆仓库
```bash
# Clone the repository
git clone https://github.com/microsoft/Data-Science-For-Beginners.git
# Navigate to the directory
cd Data-Science-For-Beginners
```
### 步骤 3安装 Python 和 Jupyter
数据科学课程需要 Python 3.7 或更高版本。
**Windows:**
1. 从 [python.org](https://www.python.org/downloads/) 下载 Python
2. 安装时勾选“Add Python to PATH”
3. 验证安装:
```bash
python --version
```
**macOS:**
```bash
# Using Homebrew
brew install python3
# Verify installation
python3 --version
```
**Linux:**
```bash
# Most Linux distributions come with Python pre-installed
python3 --version
# If not installed:
# Debian/Ubuntu
sudo apt-get install python3 python3-pip
# Fedora
sudo dnf install python3 python3-pip
```
### 步骤 4设置 Python 环境
建议使用虚拟环境来隔离依赖项。
```bash
# Create a virtual environment
python -m venv venv
# Activate the virtual environment
# On Windows:
venv\Scripts\activate
# On macOS/Linux:
source venv/bin/activate
```
### 步骤 5安装 Python 包
安装所需的数据科学库:
```bash
pip install jupyter pandas numpy matplotlib seaborn scikit-learn
```
### 步骤 6安装 Node.js 和 npm用于测验应用
测验应用需要 Node.js 和 npm。
**Windows/macOS:**
- 从 [nodejs.org](https://nodejs.org/) 下载(推荐 LTS 版本)
- 运行安装程序
**Linux:**
```bash
# Debian/Ubuntu
# WARNING: Piping scripts from the internet directly into bash can be a security risk.
# It is recommended to review the script before running it:
# curl -fsSL https://deb.nodesource.com/setup_lts.x -o setup_lts.x
# less setup_lts.x
# Then run:
# sudo -E bash setup_lts.x
#
# Alternatively, you can use the one-liner below at your own risk:
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
# Fedora
sudo dnf install nodejs
# Verify installation
node --version
npm --version
```
### 步骤 7安装测验应用依赖项
```bash
# Navigate to quiz app directory
cd quiz-app
# Install dependencies
npm install
# Return to root directory
cd ..
```
### 步骤 8安装 Docsify可选
用于离线访问文档:
```bash
npm install -g docsify-cli
```
## 验证安装
### 测试 Python 和 Jupyter
```bash
# Activate your virtual environment if not already activated
# On Windows:
venv\Scripts\activate
# On macOS/Linux:
source venv/bin/activate
# Start Jupyter Notebook
jupyter notebook
```
您的浏览器应该会打开 Jupyter 界面。您现在可以导航到任何课程的 `.ipynb` 文件。
### 测试测验应用
```bash
# Navigate to quiz app
cd quiz-app
# Start development server
npm run serve
```
测验应用应该可以通过 `http://localhost:8080`(如果 8080 端口被占用,则使用其他端口)访问。
### 测试文档服务器
```bash
# From the root directory of the repository
docsify serve
```
文档应该可以通过 `http://localhost:3000` 访问。
## 使用 VS Code Dev Containers
如果您安装了 Docker可以使用 VS Code Dev Containers
1. 安装 [Docker Desktop](https://www.docker.com/products/docker-desktop)
2. 安装 [Visual Studio Code](https://code.visualstudio.com/)
3. 安装 [Remote - Containers 扩展](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
4. 在 VS Code 中打开仓库
5. 按 `F1` 并选择“Remote-Containers: Reopen in Container”
6. 等待容器构建(仅首次需要)
## 下一步
- 查看 [README.md](README.md) 了解课程概览
- 阅读 [USAGE.md](USAGE.md) 了解常见工作流程和示例
- 如果遇到问题,请查看 [TROUBLESHOOTING.md](TROUBLESHOOTING.md)
- 如果您想贡献,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)
## 获取帮助
如果您遇到问题:
1. 查看 [TROUBLESHOOTING.md](TROUBLESHOOTING.md) 指南
2. 搜索现有的 [GitHub Issues](https://github.com/microsoft/Data-Science-For-Beginners/issues)
3. 加入我们的 [Discord 社区](https://aka.ms/ds4beginners/discord)
4. 创建一个新问题,并详细描述您的问题
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,252 @@
# 初学者数据科学课程
[![在 GitHub Codespaces 中打开](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=344191198)
[![GitHub 许可证](https://img.shields.io/github/license/microsoft/Data-Science-For-Beginners.svg)](https://github.com/microsoft/Data-Science-For-Beginners/blob/master/LICENSE)
[![GitHub 贡献者](https://img.shields.io/github/contributors/microsoft/Data-Science-For-Beginners.svg)](https://GitHub.com/microsoft/Data-Science-For-Beginners/graphs/contributors/)
[![GitHub 问题](https://img.shields.io/github/issues/microsoft/Data-Science-For-Beginners.svg)](https://GitHub.com/microsoft/Data-Science-For-Beginners/issues/)
[![GitHub 拉取请求](https://img.shields.io/github/issues-pr/microsoft/Data-Science-For-Beginners.svg)](https://GitHub.com/microsoft/Data-Science-For-Beginners/pulls/)
[![欢迎 PR](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[![GitHub 关注者](https://img.shields.io/github/watchers/microsoft/Data-Science-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/Data-Science-For-Beginners/watchers/)
[![GitHub 派生](https://img.shields.io/github/forks/microsoft/Data-Science-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/Data-Science-For-Beginners/network/)
[![GitHub 星标](https://img.shields.io/github/stars/microsoft/Data-Science-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/Data-Science-For-Beginners/stargazers/)
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
[![Microsoft Foundry Developer Forum](https://img.shields.io/badge/GitHub-Microsoft_Foundry_Developer_Forum-blue?style=for-the-badge&logo=github&color=000000&logoColor=fff)](https://aka.ms/foundry/forum)
微软 Azure 云倡导者很高兴提供一个为期 10 周、包含 20 课的数据科学课程。每节课包括课前和课后测验、完成课程的书面指导、解决方案和作业。我们基于项目的教学法让你在构建项目的过程中学习,是一种经过验证的新技能“牢固掌握”方式。
**衷心感谢我们的作者:** [Jasmine Greenaway](https://www.twitter.com/paladique), [Dmitry Soshnikov](http://soshnikov.com), [Nitya Narasimhan](https://twitter.com/nitya), [Jalen McGee](https://twitter.com/JalenMcG), [Jen Looper](https://twitter.com/jenlooper), [Maud Levy](https://twitter.com/maudstweets), [Tiffany Souterre](https://twitter.com/TiffanySouterre), [Christopher Harrison](https://www.twitter.com/geektrainer).
**🙏 特别感谢 🙏 我们的 [Microsoft 学生大使](https://studentambassadors.microsoft.com/) 作者、审稿人和内容贡献者,**尤其是 Aaryan Arora、[Aditya Garg](https://github.com/AdityaGarg00)、[Alondra Sanchez](https://www.linkedin.com/in/alondra-sanchez-molina/)、[Ankita Singh](https://www.linkedin.com/in/ankitasingh007)、[Anupam Mishra](https://www.linkedin.com/in/anupam--mishra/)、[Arpita Das](https://www.linkedin.com/in/arpitadas01/)、ChhailBihari Dubey、[Dibri Nsofor](https://www.linkedin.com/in/dibrinsofor)、[Dishita Bhasin](https://www.linkedin.com/in/dishita-bhasin-7065281bb)、[Majd Safi](https://www.linkedin.com/in/majd-s/)、[Max Blum](https://www.linkedin.com/in/max-blum-6036a1186/)、[Miguel Correa](https://www.linkedin.com/in/miguelmque/)、[Mohamma Iftekher (Iftu) Ebne Jalal](https://twitter.com/iftu119)、[Nawrin Tabassum](https://www.linkedin.com/in/nawrin-tabassum)、[Raymond Wangsa Putra](https://www.linkedin.com/in/raymond-wp/)、[Rohit Yadav](https://www.linkedin.com/in/rty2423)、Samridhi Sharma、[Sanya Sinha](https://www.linkedin.com/mwlite/in/sanya-sinha-13aab1200)、[Sheena Narula](https://www.linkedin.com/in/sheena-narua-n/)、[Tauqeer Ahmad](https://www.linkedin.com/in/tauqeerahmad5201/)、Yogendrasingh Pawar、[Vidushi Gupta](https://www.linkedin.com/in/vidushi-gupta07/)、[Jasleen Sondhi](https://www.linkedin.com/in/jasleen-sondhi/)
|![由 @sketchthedocs 制作的草图笔记 https://sketchthedocs.dev](../../translated_images/zh-CN/00-Title.8af36cd35da1ac55.webp)|
|:---:|
| 初学者数据科学 - _草图笔记来自 [@nitya](https://twitter.com/nitya)_ |
### 🌐 多语言支持
#### 通过 GitHub Action 支持(自动且持续更新)
<!-- CO-OP TRANSLATOR LANGUAGES TABLE START -->
[阿拉伯语](../ar/README.md) | [孟加拉语](../bn/README.md) | [保加利亚语](../bg/README.md) | [缅甸语 (Myanmar)](../my/README.md) | [中文 (简体)](./README.md) | [中文 (繁体,香港)](../zh-HK/README.md) | [中文 (繁体,澳门)](../zh-MO/README.md) | [中文 (繁体,台湾)](../zh-TW/README.md) | [克罗地亚语](../hr/README.md) | [捷克语](../cs/README.md) | [丹麦语](../da/README.md) | [荷兰语](../nl/README.md) | [爱沙尼亚语](../et/README.md) | [芬兰语](../fi/README.md) | [法语](../fr/README.md) | [德语](../de/README.md) | [希腊语](../el/README.md) | [希伯来语](../he/README.md) | [印地语](../hi/README.md) | [匈牙利语](../hu/README.md) | [印尼语](../id/README.md) | [意大利语](../it/README.md) | [日语](../ja/README.md) | [卡纳达语](../kn/README.md) | [韩语](../ko/README.md) | [立陶宛语](../lt/README.md) | [马来语](../ms/README.md) | [马拉雅拉姆语](../ml/README.md) | [马拉地语](../mr/README.md) | [尼泊尔语](../ne/README.md) | [尼日利亚皮钦语](../pcm/README.md) | [挪威语](../no/README.md) | [波斯语 (法尔西)](../fa/README.md) | [波兰语](../pl/README.md) | [葡萄牙语 (巴西)](../pt-BR/README.md) | [葡萄牙语 (葡萄牙)](../pt-PT/README.md) | [旁遮普语 (古鲁穆喀希文)](../pa/README.md) | [罗马尼亚语](../ro/README.md) | [俄语](../ru/README.md) | [塞尔维亚语 (西里尔文)](../sr/README.md) | [斯洛伐克语](../sk/README.md) | [斯洛文尼亚语](../sl/README.md) | [西班牙语](../es/README.md) | [斯瓦希里语](../sw/README.md) | [瑞典语](../sv/README.md) | [他加禄语 (菲律宾语)](../tl/README.md) | [泰米尔语](../ta/README.md) | [泰卢固语](../te/README.md) | [泰语](../th/README.md) | [土耳其语](../tr/README.md) | [乌克兰语](../uk/README.md) | [乌尔都语](../ur/README.md) | [越南语](../vi/README.md)
> **更喜欢本地克隆?**
> 此仓库包含 50 多种语言翻译,显著增加了下载大小。若想不含翻译文件克隆,请使用稀疏检出:
> ```bash
> git clone --filter=blob:none --sparse https://github.com/microsoft/Data-Science-For-Beginners.git
> cd Data-Science-For-Beginners
> git sparse-checkout set --no-cone '/*' '!translations' '!translated_images'
> ```
> 这样你将得到完成课程所需的所有内容,下载速度更快。
<!-- CO-OP TRANSLATOR LANGUAGES TABLE END -->
**如果您希望支持其他语言,支持列表见 [此处](https://github.com/Azure/co-op-translator/blob/main/getting_started/supported-languages.md)**
#### 加入我们的社区
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
我们正在进行 Discord AI 学习系列,了解更多并于 2025 年 9 月 18 日至 30 日加入我们,请访问 [Learn with AI Series](https://aka.ms/learnwithai/discord)。您将获得使用 GitHub Copilot 进行数据科学的技巧和窍门。
![Learn with AI series](../../translated_images/zh-CN/1.2b28cdc6205e26fe.webp)
# 你是学生吗?
开始使用以下资源:
- [学生中心页面](https://docs.microsoft.com/en-gb/learn/student-hub?WT.mc_id=academic-77958-bethanycheum) 在此页面,您会找到初学者资源、学生包,甚至获得免费证书优惠券的方法。请收藏并定期查看此页面,因为我们至少每月更新内容。
- [微软学习学生大使](https://studentambassadors.microsoft.com?WT.mc_id=academic-77958-bethanycheum) 加入全球学生大使社区,这可能是你进入微软的机会。
# 入门指南
## 📚 文档
- **[安装指南](INSTALLATION.md)** - 适合初学者的分步安装说明
- **[使用指南](USAGE.md)** - 示例与常见工作流程
- **[故障排除](TROUBLESHOOTING.md)** - 常见问题及解决方案
- **[贡献指南](CONTRIBUTING.md)** - 如何为本项目贡献代码
- **[教师指南](for-teachers.md)** - 教学建议和课堂资源
## 👨‍🎓 学生专区
> **完全初学者**:对数据科学陌生?从我们的[初学者友好示例](examples/README.md)开始!这些简单且注释丰富的示例,将帮助你在深入完整课程前理解基础知识。
> **[学生们](https://aka.ms/student-page)**:想独立使用这套课程,请先 fork 整个仓库,自行完成练习,从课前测验开始。随后阅读课程并完成其余活动。试着通过理解课程内容自己完成项目,而不是直接复制解决方案代码;解决方案代码位于每个面向项目的课程中的 /solutions 文件夹中。另一个主意是组建学习小组,与朋友们一同学习。想深入学习,我们推荐 [微软学习](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/qprpajyoy3x0g7?WT.mc_id=academic-77958-bethanycheum)。
**快速开始:**
1. 查看[安装指南](INSTALLATION.md)设置环境
2. 浏览[使用指南](USAGE.md)学习如何使用课程
3. 从第 1 课开始,按顺序学习
4. 加入我们的 [Discord 社区](https://aka.ms/ds4beginners/discord) 获取支持
## 👩‍🏫 教师专区
> **教师们**:我们已经[提供了一些建议](for-teachers.md)来帮助你使用这套课程。欢迎在我们的[讨论论坛](https://github.com/microsoft/Data-Science-For-Beginners/discussions)中提供反馈!
## 团队介绍
[![宣传视频](../../ds-for-beginners.gif)](https://youtu.be/8mzavjQSMM4 "宣传视频")
**动图作者** [Mohit Jaisal](https://www.linkedin.com/in/mohitjaisal)
> 🎥 点击上方图片观看关于该项目及其创建者的视频!
## 教学法
在构建本课程时,我们选择了两个教学原则:确保它是基于项目的,并包含频繁的小测验。到本系列结束时,学生将掌握数据科学的基本原则,包括伦理概念、数据准备、不同的数据处理方式、数据可视化、数据分析、数据科学的实际应用案例等内容。
此外课前的低风险测验设定了学生学习主题的意图课后的第二次测验则确保了进一步的知识巩固。该课程设计灵活且有趣可以完整学习也可以部分学习。项目从小型开始随着10周周期结束逐渐变得复杂。
> 查看我们的[行为准则](CODE_OF_CONDUCT.md)、[贡献指南](CONTRIBUTING.md)、[翻译指南](TRANSLATIONS.md)。我们欢迎您的建设性反馈!
## 每节课包含:
- 可选的手绘笔记
- 可选的补充视频
- 课前热身测验
- 书面课程内容
- 对于基于项目的课程,逐步指导如何构建项目
- 知识点检测
- 挑战任务
- 补充阅读材料
- 作业
- [课后测验](https://ff-quizzes.netlify.app/en/)
> **关于测验的说明**:所有测验均包含在 Quiz-App 文件夹中共有40次测验每次包含3个问题。测验通过课程中的链接访问测验应用可以本地运行或部署到 Azure请按照 `quiz-app` 文件夹中的说明进行操作。测验正在逐步实现本地化。
## 🎓 适合初学者的示例
**数据科学新手?** 我们创建了一个特别的[示例目录](examples/README.md),内含简单、注释详尽的代码,帮助你快速入门:
- 🌟 **Hello World** - 你的第一个数据科学程序
- 📂 **数据加载** - 学习读取和探索数据集
- 📊 **简单分析** - 计算统计数据,发现模式
- 📈 **基础可视化** - 创建图表和图形
- 🔬 **真实项目** - 完整工作流程,从头到尾
每个示例都包含详细注释,解释每一步骤,非常适合绝对初学者!
👉 **[从示例开始](examples/README.md)** 👈
## 课程列表
|![由 @sketchthedocs 绘制的手绘笔记 https://sketchthedocs.dev](../../translated_images/zh-CN/00-Roadmap.4905d6567dff4753.webp)|
|:---:|
| 初学者数据科学:路线图 - _手绘笔记者 [@nitya](https://twitter.com/nitya)_ |
| 课程号 | 主题 | 课程分组 | 学习目标 | 相关课程 | 作者 |
| :-----------: | :----------------------------------------: | :--------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------: | :----: |
| 01 | 定义数据科学 | [简介](1-Introduction/README.md) | 了解数据科学的基本概念及其与人工智能、机器学习和大数据的关系。 | [课程](1-Introduction/01-defining-data-science/README.md) [视频](https://youtu.be/beZ7Mb_oz9I) | [Dmitry](http://soshnikov.com) |
| 02 | 数据科学伦理 | [简介](1-Introduction/README.md) | 数据伦理的概念、挑战及框架。 | [课程](1-Introduction/02-ethics/README.md) | [Nitya](https://twitter.com/nitya) |
| 03 | 定义数据 | [简介](1-Introduction/README.md) | 数据如何分类及其常见来源。 | [课程](1-Introduction/03-defining-data/README.md) | [Jasmine](https://www.twitter.com/paladique) |
| 04 | 统计学与概率入门 | [简介](1-Introduction/README.md) | 使用概率与统计的数学技术理解数据。 | [课程](1-Introduction/04-stats-and-probability/README.md) [视频](https://youtu.be/Z5Zy85g4Yjw) | [Dmitry](http://soshnikov.com) |
| 05 | 处理关系型数据 | [数据处理](2-Working-With-Data/README.md) | 关系型数据简介及使用结构化查询语言SQL发音“see-quell”进行探索与分析的基础。 | [课程](2-Working-With-Data/05-relational-databases/README.md) | [Christopher](https://www.twitter.com/geektrainer) |
| 06 | 处理NoSQL数据 | [数据处理](2-Working-With-Data/README.md) | 非关系型数据简介、各种类型及文档数据库的基础探索与分析。 | [课程](2-Working-With-Data/06-non-relational/README.md) | [Jasmine](https://twitter.com/paladique)|
| 07 | 使用Python | [数据处理](2-Working-With-Data/README.md) | 使用Python及Pandas等库进行数据探索的基础。建议具备Python编程基础。 | [课程](2-Working-With-Data/07-python/README.md) [视频](https://youtu.be/dZjWOGbsN4Y) | [Dmitry](http://soshnikov.com) |
| 08 | 数据准备 | [数据处理](2-Working-With-Data/README.md) | 数据清洗与转换技术,应对缺失、不准确或不完整数据的挑战。 | [课程](2-Working-With-Data/08-data-preparation/README.md) | [Jasmine](https://www.twitter.com/paladique) |
| 09 | 量的可视化 | [数据可视化](3-Data-Visualization/README.md) | 学习使用Matplotlib可视化鸟类数据🦆 | [课程](3-Data-Visualization/09-visualization-quantities/README.md) | [Jen](https://twitter.com/jenlooper) |
| 10 | 数据分布的可视化 | [数据可视化](3-Data-Visualization/README.md) | 可视化区间内的观测值和趋势。 | [课程](3-Data-Visualization/10-visualization-distributions/README.md) | [Jen](https://twitter.com/jenlooper) |
| 11 | 比例的可视化 | [数据可视化](3-Data-Visualization/README.md) | 可视化离散和分组的百分比。 | [课程](3-Data-Visualization/11-visualization-proportions/README.md) | [Jen](https://twitter.com/jenlooper) |
| 12 | 关系的可视化 | [数据可视化](3-Data-Visualization/README.md) | 可视化数据集与变量之间的关联和相关性。 | [课程](3-Data-Visualization/12-visualization-relationships/README.md) | [Jen](https://twitter.com/jenlooper) |
| 13 | 有意义的可视化 | [数据可视化](3-Data-Visualization/README.md) | 制作有效解决问题和获得见解的有价值可视化的技巧和指导。 | [课程](3-Data-Visualization/13-meaningful-visualizations/README.md) | [Jen](https://twitter.com/jenlooper) |
| 14 | 数据科学生命周期简介 | [生命周期](4-Data-Science-Lifecycle/README.md) | 数据科学生命周期介绍及其第一步骤-获取和提取数据。 | [课程](4-Data-Science-Lifecycle/14-Introduction/README.md) | [Jasmine](https://twitter.com/paladique) |
| 15 | 数据分析 | [生命周期](4-Data-Science-Lifecycle/README.md) | 数据科学生命周期中专注于数据分析的阶段。 | [课程](4-Data-Science-Lifecycle/15-analyzing/README.md) | [Jasmine](https://twitter.com/paladique) |
| 16 | 交流沟通 | [生命周期](4-Data-Science-Lifecycle/README.md) | 数据科学生命周期中专注于以易于决策者理解的方式展示数据洞见的阶段。 | [课程](4-Data-Science-Lifecycle/16-communication/README.md) | [Jalen](https://twitter.com/JalenMcG) |
| 17 | 云端数据科学 | [云数据](5-Data-Science-In-Cloud/README.md) | 本系列课程介绍云端数据科学及其优势。 | [课程](5-Data-Science-In-Cloud/17-Introduction/README.md) | [Tiffany](https://twitter.com/TiffanySouterre) 与 [Maud](https://twitter.com/maudstweets) |
| 18 | 云端数据科学 | [云数据](5-Data-Science-In-Cloud/README.md) | 使用低代码工具进行模型训练。 | [课程](5-Data-Science-In-Cloud/18-Low-Code/README.md) | [Tiffany](https://twitter.com/TiffanySouterre) 与 [Maud](https://twitter.com/maudstweets) |
| 19 | 云端数据科学 | [云数据](5-Data-Science-In-Cloud/README.md) | 使用 Azure Machine Learning Studio 部署模型。 | [课程](5-Data-Science-In-Cloud/19-Azure/README.md) | [Tiffany](https://twitter.com/TiffanySouterre) 与 [Maud](https://twitter.com/maudstweets) |
| 20 | 现实世界中的数据科学 | [现实应用](6-Data-Science-In-Wild/README.md) | 现实世界中的数据科学驱动项目。 | [课程](6-Data-Science-In-Wild/20-Real-World-Examples/README.md) | [Nitya](https://twitter.com/nitya) |
## GitHub Codespaces
按照以下步骤在 Codespace 中打开此示例:
1. 点击“代码”下拉菜单并选择“使用 Codespaces 打开”选项。
2. 在面板底部选择“+ 新建 Codespace”。
更多信息请查阅[GitHub文档](https://docs.github.com/en/codespaces/developing-in-codespaces/creating-a-codespace-for-a-repository#creating-a-codespace)。
## VSCode Remote - Containers
使用本地计算机和 VS Code Remote - Containers 扩展,按照以下步骤在容器中打开该仓库:
1. 如果这是您首次使用开发容器,请确保您的系统满足先决条件(例如安装了 Docker详见[入门文档](https://code.visualstudio.com/docs/devcontainers/containers#_getting-started)。
要使用此仓库,您可以选择在隔离的 Docker 卷中打开仓库:
**注意**:底层将使用 Remote-Containers 的 **Clone Repository in Container Volume...** 命令,将源代码克隆到 Docker 卷中,而不是本地文件系统中。[卷](https://docs.docker.com/storage/volumes/)是持久化容器数据的首选机制。
或者打开本地克隆或下载的仓库版本:
- 将此仓库克隆到本地文件系统。
- 按 F1选择 **Remote-Containers: Open Folder in Container...** 命令。
- 选择克隆的文件夹,等待容器启动,然后开始操作。
## 离线访问
您可以通过使用 [Docsify](https://docsify.js.org/#/) 离线运行本手册。Fork 本仓库, 在本地机器上[安装 Docsify](https://docsify.js.org/#/quickstart),然后在仓库根目录下,输入 `docsify serve`。该网站将在本地主机的3000端口提供服务`localhost:3000`。
> 注意,笔记本不会通过 Docsify 渲染,因此需要运行笔记本时,请在 VS Code 中运行 Python 内核单独执行。
## 其他课程
我们的团队还制作了其他课程!查看:
<!-- CO-OP TRANSLATOR OTHER COURSES START -->
### LangChain
[![LangChain4j for Beginners](https://img.shields.io/badge/LangChain4j%20for%20Beginners-22C55E?style=for-the-badge&&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchain4j-for-beginners)
[![LangChain.js 初学者](https://img.shields.io/badge/LangChain.js%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=0553D6)](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin)
---
### Azure / Edge / MCP / 代理
[![AZD 初学者](https://img.shields.io/badge/AZD%20for%20Beginners-0078D4?style=for-the-badge&labelColor=E5E7EB&color=0078D4)](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst)
[![Edge AI 初学者](https://img.shields.io/badge/Edge%20AI%20for%20Beginners-00B8E4?style=for-the-badge&labelColor=E5E7EB&color=00B8E4)](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![MCP 初学者](https://img.shields.io/badge/MCP%20for%20Beginners-009688?style=for-the-badge&labelColor=E5E7EB&color=009688)](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst)
[![AI 代理初学者](https://img.shields.io/badge/AI%20Agents%20for%20Beginners-00C49A?style=for-the-badge&labelColor=E5E7EB&color=00C49A)](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst)
---
### 生成式 AI 系列
[![生成式 AI 初学者](https://img.shields.io/badge/Generative%20AI%20for%20Beginners-8B5CF6?style=for-the-badge&labelColor=E5E7EB&color=8B5CF6)](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst)
[![生成式 AI (.NET)](https://img.shields.io/badge/Generative%20AI%20(.NET)-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst)
[![生成式 AI (Java)](https://img.shields.io/badge/Generative%20AI%20(Java)-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst)
[![生成式 AI (JavaScript)](https://img.shields.io/badge/Generative%20AI%20(JavaScript)-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst)
---
### 核心学习
[![机器学习 初学者](https://img.shields.io/badge/ML%20for%20Beginners-22C55E?style=for-the-badge&labelColor=E5E7EB&color=22C55E)](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst)
[![数据科学 初学者](https://img.shields.io/badge/Data%20Science%20for%20Beginners-84CC16?style=for-the-badge&labelColor=E5E7EB&color=84CC16)](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst)
[![人工智能 初学者](https://img.shields.io/badge/AI%20for%20Beginners-A3E635?style=for-the-badge&labelColor=E5E7EB&color=A3E635)](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst)
[![网络安全 初学者](https://img.shields.io/badge/Cybersecurity%20for%20Beginners-F97316?style=for-the-badge&labelColor=E5E7EB&color=F97316)](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung)
[![Web 开发 初学者](https://img.shields.io/badge/Web%20Dev%20for%20Beginners-EC4899?style=for-the-badge&labelColor=E5E7EB&color=EC4899)](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst)
[![物联网 初学者](https://img.shields.io/badge/IoT%20for%20Beginners-14B8A6?style=for-the-badge&labelColor=E5E7EB&color=14B8A6)](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst)
[![XR 开发 初学者](https://img.shields.io/badge/XR%20Development%20for%20Beginners-38BDF8?style=for-the-badge&labelColor=E5E7EB&color=38BDF8)](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst)
---
### Copilot 系列
[![Copilot 用于 AI 配对编程](https://img.shields.io/badge/Copilot%20for%20AI%20Paired%20Programming-FACC15?style=for-the-badge&labelColor=E5E7EB&color=FACC15)](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst)
[![Copilot 用于 C#/.NET](https://img.shields.io/badge/Copilot%20for%20C%23/.NET-FBBF24?style=for-the-badge&labelColor=E5E7EB&color=FBBF24)](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst)
[![Copilot 冒险](https://img.shields.io/badge/Copilot%20Adventure-FDE68A?style=for-the-badge&labelColor=E5E7EB&color=FDE68A)](https://github.com/microsoft/CopilotAdventures?WT.mc_id=academic-105485-koreyst)
<!-- CO-OP TRANSLATOR OTHER COURSES END -->
## 获取帮助
**遇到问题?** 查看我们的 [故障排除指南](TROUBLESHOOTING.md) 以获取常见问题的解决方案。
如果你遇到困难或对构建 AI 应用有任何疑问,加入其他学习者和经验丰富的开发者的讨论,共同探讨 MCP。这是一个支持性社区欢迎提问并自由分享知识。
[![Microsoft Foundry Discord](https://dcbadge.limes.pink/api/server/nTYy5BXMWG)](https://discord.gg/nTYy5BXMWG)
如果你在构建过程中有产品反馈或遇到错误,请访问:
[![Microsoft Foundry 开发者论坛](https://img.shields.io/badge/GitHub-Microsoft_Foundry_Developer_Forum-blue?style=for-the-badge&logo=github&color=000000&logoColor=fff)](https://aka.ms/foundry/forum)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免责声明**
本文件采用人工智能翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。虽然我们力求准确,但请注意自动翻译可能存在错误或不准确之处。原始文档的原语言版本应视为权威来源。对于重要信息,建议使用专业人工翻译。因使用本翻译而产生的任何误解或错误解释,我们不承担任何责任。
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,40 @@
## 安全性
Microsoft 非常重视我们软件产品和服务的安全性,这包括通过我们的 GitHub 组织管理的所有源代码库,这些组织包括 [Microsoft](https://github.com/Microsoft)、[Azure](https://github.com/Azure)、[DotNet](https://github.com/dotnet)、[AspNet](https://github.com/aspnet)、[Xamarin](https://github.com/xamarin) 和 [我们的 GitHub 组织](https://opensource.microsoft.com/)。
如果您认为在任何 Microsoft 拥有的代码库中发现了符合 [Microsoft 对安全漏洞的定义](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)) 的安全漏洞,请按照以下描述向我们报告。
## 报告安全问题
**请不要通过公共 GitHub 问题报告安全漏洞。**
相反,请通过 Microsoft 安全响应中心 (MSRC) 报告,网址为 [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report)。
如果您更愿意在不登录的情况下提交,请发送电子邮件至 [secure@microsoft.com](mailto:secure@microsoft.com)。如果可能,请使用我们的 PGP 密钥加密您的消息;您可以从 [Microsoft 安全响应中心 PGP 密钥页面](https://www.microsoft.com/en-us/msrc/pgp-key-msrc) 下载。
您应该会在 24 小时内收到回复。如果由于某种原因未收到,请通过电子邮件跟进以确保我们收到了您的原始消息。更多信息请访问 [microsoft.com/msrc](https://www.microsoft.com/msrc)。
请尽可能提供以下所需信息,以帮助我们更好地理解问题的性质和范围:
* 问题类型例如缓冲区溢出、SQL 注入、跨站脚本攻击等)
* 与问题表现相关的源文件的完整路径
* 受影响源代码的位置(标签/分支/提交或直接 URL
* 复现问题所需的任何特殊配置
* 复现问题的分步说明
* 概念验证或漏洞利用代码(如果可能)
* 问题的影响,包括攻击者可能如何利用该问题
这些信息将帮助我们更快地对您的报告进行分类和处理。
如果您是为漏洞赏金计划报告问题,更完整的报告可能会获得更高的赏金奖励。有关我们当前计划的更多详细信息,请访问 [Microsoft 漏洞赏金计划](https://microsoft.com/msrc/bounty) 页面。
## 首选语言
我们更倾向于使用英语进行所有交流。
## 政策
Microsoft 遵循 [协调漏洞披露](https://www.microsoft.com/en-us/msrc/cvd) 原则。
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读,我们概不负责。

@ -0,0 +1,13 @@
# 支持
## 如何提交问题并获取帮助
此项目使用 GitHub Issues 来跟踪错误和功能请求。在提交新问题之前,请先搜索现有问题以避免重复。对于新问题,请将您的错误或功能请求提交为一个新问题。
如果您在使用此项目时需要帮助或有疑问,请提交一个问题。
## Microsoft 支持政策
对此存储库的支持仅限于上述列出的资源。
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,618 @@
# 故障排查指南
本指南提供了解决使用《数据科学入门》课程时可能遇到的常见问题的方法。
## 目录
- [Python 和 Jupyter 问题](../..)
- [包和依赖问题](../..)
- [Jupyter Notebook 问题](../..)
- [测验应用问题](../..)
- [Git 和 GitHub 问题](../..)
- [Docsify 文档问题](../..)
- [数据和文件问题](../..)
- [性能问题](../..)
- [获取额外帮助](../..)
## Python 和 Jupyter 问题
### 找不到 Python 或版本错误
**问题:** `python: command not found` 或 Python 版本错误
**解决方法:**
```bash
# Check Python version
python --version
python3 --version
# If Python 3 is installed as 'python3', create an alias
# On macOS/Linux, add to ~/.bashrc or ~/.zshrc:
alias python=python3
alias pip=pip3
# Or use python3 explicitly
python3 -m pip install jupyter
```
**Windows 解决方法:**
1. 从 [python.org](https://www.python.org/) 重新安装 Python
2. 安装时勾选“Add Python to PATH”
3. 重启终端/命令提示符
### 虚拟环境激活问题
**问题:** 虚拟环境无法激活
**解决方法:**
**Windows**
```bash
# If you get execution policy error
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Then activate
venv\Scripts\activate
```
**macOS/Linux**
```bash
# Ensure the activate script is executable
chmod +x venv/bin/activate
# Then activate
source venv/bin/activate
```
**验证激活:**
```bash
# Your prompt should show (venv)
# Check Python location
which python # Should point to venv
```
### Jupyter 内核问题
**问题:** “找不到内核”或“内核不断崩溃”
**解决方法:**
```bash
# Reinstall kernel
python -m ipykernel install --user --name=datascience --display-name="Python (Data Science)"
# Or use the default kernel
python -m ipykernel install --user
# Restart Jupyter
jupyter notebook
```
**问题:** Jupyter 中的 Python 版本错误
**解决方法:**
```bash
# Install Jupyter in your virtual environment
source venv/bin/activate # Activate first
pip install jupyter ipykernel
# Register the kernel
python -m ipykernel install --user --name=venv --display-name="Python (venv)"
# In Jupyter, select Kernel -> Change kernel -> Python (venv)
```
## 包和依赖问题
### 导入错误
**问题:** `ModuleNotFoundError: No module named 'pandas'`(或其他包)
**解决方法:**
```bash
# Ensure virtual environment is activated
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # Windows
# Install missing package
pip install pandas
# Install all common packages
pip install jupyter pandas numpy matplotlib seaborn scikit-learn
# Verify installation
python -c "import pandas; print(pandas.__version__)"
```
### Pip 安装失败
**问题:** `pip install` 因权限错误失败
**解决方法:**
```bash
# Use --user flag
pip install --user package-name
# Or use virtual environment (recommended)
python -m venv venv
source venv/bin/activate
pip install package-name
```
**问题:** `pip install` 因 SSL 证书错误失败
**解决方法:**
```bash
# Update pip first
python -m pip install --upgrade pip
# Try installing with trusted host (temporary workaround)
pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org package-name
```
### 包版本冲突
**问题:** 包版本不兼容
**解决方法:**
```bash
# Create fresh virtual environment
python -m venv venv-new
source venv-new/bin/activate # or venv-new\Scripts\activate on Windows
# Install packages with specific versions if needed
pip install pandas==1.3.0
pip install numpy==1.21.0
# Or let pip resolve dependencies
pip install jupyter pandas numpy matplotlib seaborn scikit-learn
```
## Jupyter Notebook 问题
### Jupyter 无法启动
**问题:** `jupyter notebook` 命令未找到
**解决方法:**
```bash
# Install Jupyter
pip install jupyter
# Or use python -m
python -m jupyter notebook
# Add to PATH if needed (macOS/Linux)
export PATH="$HOME/.local/bin:$PATH"
```
### Notebook 无法加载或保存
**问题:** “Notebook 加载失败”或保存错误
**解决方法:**
1. 检查文件权限
```bash
# Make sure you have write permissions
ls -l notebook.ipynb
chmod 644 notebook.ipynb # If needed
```
2. 检查文件是否损坏
```bash
# Try opening in text editor to check JSON structure
# Copy content to new notebook if corrupted
```
3. 清除 Jupyter 缓存
```bash
jupyter notebook --clear-cache
```
### 单元格无法执行
**问题:** 单元格卡在“In [*]”或执行时间过长
**解决方法:**
1. **中断内核:** 点击“Interrupt”按钮或按 `I, I`
2. **重启内核:** 内核菜单 → 重启
3. **检查代码中的无限循环**
4. **清除输出:** 单元格 → 所有输出 → 清除
### 图表不显示
**问题:** `matplotlib` 图表未在 Notebook 中显示
**解决方法:**
```python
# Add magic command at the top of notebook
%matplotlib inline
import matplotlib.pyplot as plt
# Create plot
plt.plot([1, 2, 3, 4])
plt.show() # Make sure to call show()
```
**交互式图表的替代方法:**
```python
%matplotlib notebook
# Or
%matplotlib widget
```
## 测验应用问题
### npm install 失败
**问题:** `npm install` 期间出现错误
**解决方法:**
```bash
# Clear npm cache
npm cache clean --force
# Remove node_modules and package-lock.json
rm -rf node_modules package-lock.json
# Reinstall
npm install
# If still failing, try with legacy peer deps
npm install --legacy-peer-deps
```
### 测验应用无法启动
**问题:** `npm run serve` 失败
**解决方法:**
```bash
# Check Node.js version
node --version # Should be 12.x or higher
# Reinstall dependencies
cd quiz-app
rm -rf node_modules package-lock.json
npm install
# Try different port
npm run serve -- --port 8081
```
### 端口已被占用
**问题:** “端口 8080 已被占用”
**解决方法:**
```bash
# Find and kill process on port 8080
# macOS/Linux:
lsof -ti:8080 | xargs kill -9
# Windows:
netstat -ano | findstr :8080
taskkill /PID <PID> /F
# Or use a different port
npm run serve -- --port 8081
```
### 测验无法加载或显示空白页面
**问题:** 测验应用加载但显示空白页面
**解决方法:**
1. 检查浏览器控制台中的错误(按 F12
2. 清除浏览器缓存和 Cookie
3. 尝试使用其他浏览器
4. 确保启用了 JavaScript
5. 检查是否有广告拦截器干扰
```bash
# Rebuild the app
npm run build
npm run serve
```
## Git 和 GitHub 问题
### Git 未识别
**问题:** `git: command not found`
**解决方法:**
**Windows**
- 从 [git-scm.com](https://git-scm.com/) 安装 Git
- 安装后重启终端
**macOS**
> **注意:** 如果尚未安装 Homebrew请先按照 [https://brew.sh/](https://brew.sh/) 的说明进行安装。
```bash
# Install via Homebrew
brew install git
# Or install Xcode Command Line Tools
xcode-select --install
```
**Linux**
```bash
sudo apt-get install git # Debian/Ubuntu
sudo dnf install git # Fedora
```
### 克隆失败
**问题:** `git clone` 因身份验证错误失败
**解决方法:**
```bash
# Use HTTPS URL
git clone https://github.com/microsoft/Data-Science-For-Beginners.git
# If you have 2FA enabled on GitHub, use Personal Access Token
# Create token at: https://github.com/settings/tokens
# Use token as password when prompted
```
### 权限被拒绝publickey
**问题:** SSH 密钥认证失败
**解决方法:**
```bash
# Generate SSH key
ssh-keygen -t ed25519 -C "your_email@example.com"
# Add key to ssh-agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# Add public key to GitHub
# Copy key: cat ~/.ssh/id_ed25519.pub
# Add at: https://github.com/settings/keys
```
## Docsify 文档问题
### Docsify 命令未找到
**问题:** `docsify: command not found`
**解决方法:**
```bash
# Install globally
npm install -g docsify-cli
# If permission error on macOS/Linux
sudo npm install -g docsify-cli
# Verify installation
docsify --version
# If still not found, add npm global path
# Find npm global path
npm config get prefix
# Add to PATH (add to ~/.bashrc or ~/.zshrc)
export PATH="$PATH:/usr/local/bin"
```
### 文档无法加载
**问题:** Docsify 服务启动但内容未加载
**解决方法:**
```bash
# Ensure you're in the repository root
cd Data-Science-For-Beginners
# Check for index.html
ls index.html
# Serve with specific port
docsify serve --port 3000
# Check browser console for errors (F12)
```
### 图片无法显示
**问题:** 图片显示为断链图标
**解决方法:**
1. 检查图片路径是否为相对路径
2. 确保图片文件存在于仓库中
3. 清除浏览器缓存
4. 验证文件扩展名是否匹配(某些系统对大小写敏感)
## 数据和文件问题
### 文件未找到错误
**问题:** 加载数据时出现 `FileNotFoundError`
**解决方法:**
```python
import os
# Check current working directory
print(os.getcwd())
# Use absolute path
data_path = os.path.join(os.getcwd(), 'data', 'filename.csv')
df = pd.read_csv(data_path)
# Or use relative path from notebook location
df = pd.read_csv('../data/filename.csv')
# Verify file exists
print(os.path.exists('data/filename.csv'))
```
### CSV 读取错误
**问题:** 读取 CSV 文件时出现错误
**解决方法:**
```python
import pandas as pd
# Try different encodings
df = pd.read_csv('file.csv', encoding='utf-8')
# or
df = pd.read_csv('file.csv', encoding='latin-1')
# or
df = pd.read_csv('file.csv', encoding='ISO-8859-1')
# Handle missing values
df = pd.read_csv('file.csv', na_values=['NA', 'N/A', ''])
# Specify delimiter if not comma
df = pd.read_csv('file.csv', delimiter=';')
```
### 大数据集导致内存错误
**问题:** 加载大文件时出现 `MemoryError`
**解决方法:**
```python
# Read in chunks
chunk_size = 10000
chunks = []
for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
# Process chunk
chunks.append(chunk)
df = pd.concat(chunks)
# Or read specific columns only
df = pd.read_csv('file.csv', usecols=['col1', 'col2'])
# Use more efficient data types
df = pd.read_csv('file.csv', dtype={'column_name': 'int32'})
```
## 性能问题
### Notebook 性能缓慢
**问题:** Notebook 运行速度非常慢
**解决方法:**
1. **重启内核并清除输出**
- 内核 → 重启并清除输出
2. **关闭未使用的 Notebook**
3. **优化代码:**
```python
# Use vectorized operations instead of loops
# Bad:
result = []
for x in data:
result.append(x * 2)
# Good:
result = data * 2 # NumPy/Pandas vectorization
```
4. **对大数据集进行采样:**
```python
# Work with sample during development
df_sample = df.sample(n=1000) # or df.head(1000)
```
### 浏览器崩溃
**问题:** 浏览器崩溃或无响应
**解决方法:**
1. 关闭未使用的标签页
2. 清除浏览器缓存
3. 增加浏览器内存Chrome`chrome://settings/system`
4. 使用 JupyterLab 替代:
```bash
pip install jupyterlab
jupyter lab
```
## 获取额外帮助
### 在寻求帮助之前
1. 查看本故障排查指南
2. 搜索 [GitHub Issues](https://github.com/microsoft/Data-Science-For-Beginners/issues)
3. 查看 [INSTALLATION.md](INSTALLATION.md) 和 [USAGE.md](USAGE.md)
4. 尝试在线搜索错误信息
### 如何寻求帮助
在创建问题或寻求帮助时,请提供以下信息:
1. **操作系统:** Windows、macOS 或 Linux具体发行版
2. **Python 版本:** 运行 `python --version`
3. **错误信息:** 复制完整的错误信息
4. **复现步骤:** 错误发生前的操作
5. **已尝试的解决方法:** 你已经尝试过的解决方案
**示例:**
```
**Operating System:** macOS 12.0
**Python Version:** 3.9.7
**Error Message:** ModuleNotFoundError: No module named 'pandas'
**Steps to Reproduce:**
1. Activated virtual environment
2. Started Jupyter notebook
3. Tried to import pandas
**What I've Tried:**
- Ran pip install pandas
- Restarted Jupyter
```
### 社区资源
- **GitHub Issues** [创建问题](https://github.com/microsoft/Data-Science-For-Beginners/issues/new)
- **Discord** [加入我们的社区](https://aka.ms/ds4beginners/discord)
- **讨论区:** [GitHub Discussions](https://github.com/microsoft/Data-Science-For-Beginners/discussions)
- **Microsoft Learn** [问答论坛](https://docs.microsoft.com/answers/)
### 相关文档
- [INSTALLATION.md](INSTALLATION.md) - 安装说明
- [USAGE.md](USAGE.md) - 如何使用课程
- [CONTRIBUTING.md](CONTRIBUTING.md) - 如何贡献
- [README.md](README.md) - 项目概述
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,365 @@
# 使用指南
本指南提供了使用《数据科学入门》课程的示例和常见工作流程。
## 目录
- [如何使用本课程](../..)
- [学习课程内容](../..)
- [使用 Jupyter Notebooks](../..)
- [使用测验应用程序](../..)
- [常见工作流程](../..)
- [自学者提示](../..)
- [教师提示](../..)
## 如何使用本课程
本课程设计灵活,可通过多种方式使用:
- **自学**:根据自己的节奏独立完成课程
- **课堂教学**:作为结构化课程进行指导教学
- **学习小组**:与同伴协作学习
- **工作坊形式**:短期强化学习
## 学习课程内容
每节课遵循一致的结构,以最大化学习效果:
### 课程结构
1. **课前测验**:测试现有知识
2. **手绘笔记**(可选):关键概念的视觉总结
3. **视频**(可选):补充视频内容
4. **书面课程**:核心概念和解释
5. **Jupyter Notebook**:动手编码练习
6. **作业**:练习所学内容
7. **课后测验**:巩固理解
### 课程学习示例流程
```bash
# 1. Navigate to the lesson directory
cd 1-Introduction/01-defining-data-science
# 2. Read the README.md
# Open README.md in your browser or editor
# 3. Take the pre-lesson quiz
# Click the quiz link in the README
# 4. Open the Jupyter notebook (if available)
jupyter notebook
# 5. Complete the exercises in the notebook
# 6. Work on the assignment
# 7. Take the post-lesson quiz
```
## 使用 Jupyter Notebooks
### 启动 Jupyter
```bash
# Activate your virtual environment
source venv/bin/activate # On macOS/Linux
# OR
venv\Scripts\activate # On Windows
# Start Jupyter from the repository root
jupyter notebook
```
### 运行 Notebook 单元格
1. **执行单元格**:按 `Shift + Enter` 或点击“运行”按钮
2. **运行所有单元格**从菜单中选择“Cell” → “Run All”
3. **重启内核**如果遇到问题选择“Kernel” → “Restart”
### 示例:在 Notebook 中处理数据
```python
# Import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Load a dataset
df = pd.read_csv('data/sample.csv')
# Explore the data
df.head()
df.info()
df.describe()
# Create a visualization
plt.figure(figsize=(10, 6))
plt.plot(df['column_name'])
plt.title('Sample Visualization')
plt.xlabel('X-axis Label')
plt.ylabel('Y-axis Label')
plt.show()
```
### 保存您的工作
- Jupyter 会定期自动保存
- 手动保存:按 `Ctrl + S`macOS 上为 `Cmd + S`
- 您的进度保存在 `.ipynb` 文件中
## 使用测验应用程序
### 本地运行测验应用程序
```bash
# Navigate to quiz app directory
cd quiz-app
# Start the development server
npm run serve
# Access at http://localhost:8080
```
### 参加测验
1. 课前测验链接位于每节课顶部
2. 课后测验链接位于每节课底部
3. 每个测验包含 3 个问题
4. 测验旨在巩固学习,而非全面测试
### 测验编号
- 测验编号为 0-39共 40 个测验)
- 每节课通常有课前和课后测验
- 测验 URL 包含测验编号:`https://ff-quizzes.netlify.app/en/ds/quiz/0`
## 常见工作流程
### 工作流程 1完全初学者路径
```bash
# 1. Set up your environment (see INSTALLATION.md)
# 2. Start with Lesson 1
cd 1-Introduction/01-defining-data-science
# 3. For each lesson:
# - Take pre-lesson quiz
# - Read the lesson content
# - Work through the notebook
# - Complete the assignment
# - Take post-lesson quiz
# 4. Progress through all 20 lessons sequentially
```
### 工作流程 2特定主题学习
如果您对某个特定主题感兴趣:
```bash
# Example: Focus on Data Visualization
cd 3-Data-Visualization
# Explore lessons 9-13:
# - Lesson 9: Visualizing Quantities
# - Lesson 10: Visualizing Distributions
# - Lesson 11: Visualizing Proportions
# - Lesson 12: Visualizing Relationships
# - Lesson 13: Meaningful Visualizations
```
### 工作流程 3基于项目的学习
```bash
# 1. Review the Data Science Lifecycle lessons (14-16)
cd 4-Data-Science-Lifecycle
# 2. Work through a real-world example (Lesson 20)
cd ../6-Data-Science-In-Wild/20-Real-World-Examples
# 3. Apply concepts to your own project
```
### 工作流程 4基于云的数据科学
```bash
# Learn about cloud data science (Lessons 17-19)
cd 5-Data-Science-In-Cloud
# 17: Introduction to Cloud Data Science
# 18: Low-Code ML Tools
# 19: Azure Machine Learning Studio
```
## 自学者提示
### 保持条理
```bash
# Create a learning journal
mkdir my-learning-journal
# For each lesson, create notes
echo "# Lesson 1 Notes" > my-learning-journal/lesson-01-notes.md
```
### 定期练习
- 每天或每周安排固定时间学习
- 每周至少完成一节课
- 定期复习之前的课程
### 参与社区
- 加入 [Discord 社区](https://aka.ms/ds4beginners/discord)
- 参与 Discord 中的 #Data-Science-for-Beginners 频道 [Discord Discussions](https://aka.ms/ds4beginners/discord)
- 分享您的学习进度并提出问题
### 创建自己的项目
完成课程后,将概念应用到个人项目中:
```python
# Example: Analyze your own dataset
import pandas as pd
# Load your own data
my_data = pd.read_csv('my-project/data.csv')
# Apply techniques learned
# - Data cleaning (Lesson 8)
# - Exploratory data analysis (Lesson 7)
# - Visualization (Lessons 9-13)
# - Analysis (Lesson 15)
```
## 教师提示
### 课堂设置
1. 查看 [for-teachers.md](for-teachers.md) 获取详细指导
2. 设置共享环境GitHub Classroom 或 Codespaces
3. 建立沟通渠道Discord、Slack 或 Teams
### 课程计划
**建议的 10 周课程安排:**
- **第 1-2 周**:介绍(第 1-4 课)
- **第 3-4 周**:数据处理(第 5-8 课)
- **第 5-6 周**:数据可视化(第 9-13 课)
- **第 7-8 周**:数据科学生命周期(第 14-16 课)
- **第 9 周**:云数据科学(第 17-19 课)
- **第 10 周**:实际应用与最终项目(第 20 课)
### 运行 Docsify 以离线访问
```bash
# Serve documentation locally for classroom use
docsify serve
# Students can access at localhost:3000
# No internet required after initial setup
```
### 作业评分
- 检查学生的 Notebook 是否完成练习
- 通过测验分数检查理解情况
- 使用数据科学生命周期原则评估最终项目
### 创建作业
```python
# Example custom assignment template
"""
Assignment: [Topic]
Objective: [Learning goal]
Dataset: [Provide or have students find one]
Tasks:
1. Load and explore the dataset
2. Clean and prepare the data
3. Create at least 3 visualizations
4. Perform analysis
5. Communicate findings
Deliverables:
- Jupyter notebook with code and explanations
- Written summary of findings
"""
```
## 离线使用
### 下载资源
```bash
# Clone the entire repository
git clone https://github.com/microsoft/Data-Science-For-Beginners.git
# Download datasets in advance
# Most datasets are included in the repository
```
### 本地运行文档
```bash
# Serve with Docsify
docsify serve
# Access at localhost:3000
```
### 本地运行测验应用程序
```bash
cd quiz-app
npm run serve
```
## 访问翻译内容
翻译版本支持 40 多种语言:
```bash
# Access translated lessons
cd translations/fr # French
cd translations/es # Spanish
cd translations/de # German
# ... and many more
```
每种翻译版本的结构与英文版保持一致。
## 其他资源
### 继续学习
- [Microsoft Learn](https://docs.microsoft.com/learn/) - 更多学习路径
- [Student Hub](https://docs.microsoft.com/learn/student-hub) - 学生资源
- [Azure AI Foundry](https://aka.ms/foundry/forum) - 社区论坛
### 相关课程
- [AI 入门](https://aka.ms/ai-beginners)
- [ML 入门](https://aka.ms/ml-beginners)
- [Web 开发入门](https://aka.ms/webdev-beginners)
- [生成式 AI 入门](https://aka.ms/genai-beginners)
## 获取帮助
- 查看 [TROUBLESHOOTING.md](TROUBLESHOOTING.md) 了解常见问题
- 搜索 [GitHub Issues](https://github.com/microsoft/Data-Science-For-Beginners/issues)
- 加入我们的 [Discord](https://aka.ms/ds4beginners/discord)
- 查看 [CONTRIBUTING.md](CONTRIBUTING.md) 以报告问题或贡献内容
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,29 @@
- 介绍
- [定义数据科学](../1-Introduction/01-defining-data-science/README.md)
- [数据科学的伦理](../1-Introduction/02-ethics/README.md)
- [定义数据](../1-Introduction/03-defining-data/README.md)
- [概率与统计](../1-Introduction/04-stats-and-probability/README.md)
- 数据处理
- [关系型数据库](../2-Working-With-Data/05-relational-databases/README.md)
- [非关系型数据库](../2-Working-With-Data/06-non-relational/README.md)
- [Python](../2-Working-With-Data/07-python/README.md)
- [数据准备](../2-Working-With-Data/08-data-preparation/README.md)
- 数据可视化
- [数量可视化](../3-Data-Visualization/09-visualization-quantities/README.md)
- [分布可视化](../3-Data-Visualization/10-visualization-distributions/README.md)
- [比例可视化](../3-Data-Visualization/11-visualization-proportions/README.md)
- [关系可视化](../3-Data-Visualization/12-visualization-relationships/README.md)
- [有意义的可视化](../3-Data-Visualization/13-meaningful-visualizations/README.md)
- 数据科学生命周期
- [介绍](../4-Data-Science-Lifecycle/14-Introduction/README.md)
- [分析](../4-Data-Science-Lifecycle/15-analyzing/README.md)
- [沟通](../4-Data-Science-Lifecycle/16-communication/README.md)
- 云端数据科学
- [介绍](../5-Data-Science-In-Cloud/17-Introduction/README.md)
- [低代码](../5-Data-Science-In-Cloud/18-Low-Code/README.md)
- [Azure](../5-Data-Science-In-Cloud/19-Azure/README.md)
- 数据科学的实际应用
- [实际中的数据科学](../6-Data-Science-In-Wild/README.md)
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。虽然我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

@ -0,0 +1,136 @@
# 初学者友好的数据科学示例
欢迎来到示例目录!这套简单且注释清晰的示例旨在帮助您开始学习数据科学,即使您是完全的初学者。
## 📚 您将在这里找到什么
每个示例都是独立的,并包括:
- **清晰的注释**,解释每一步操作
- **简单易读的代码**,每次只展示一个概念
- **真实世界的背景**,帮助您理解这些技术的使用场景和原因
- **预期输出**,让您知道应该关注什么
## 🚀 开始使用
### 前置条件
在运行这些示例之前,请确保您已经:
- 安装了 Python 3.7 或更高版本
- 对如何运行 Python 脚本有基本了解
### 安装所需库
```bash
pip install pandas numpy matplotlib
```
## 📖 示例概览
### 1. Hello World - 数据科学风格
**文件名:** `01_hello_world_data_science.py`
您的第一个数据科学程序!学习如何:
- 加载一个简单的数据集
- 显示数据的基本信息
- 打印您的第一个数据科学输出
非常适合希望看到第一个数据科学程序运行效果的绝对初学者。
---
### 2. 加载和探索数据
**文件名:** `02_loading_data.py`
学习处理数据的基础知识:
- 从 CSV 文件读取数据
- 查看数据集的前几行
- 获取数据的基本统计信息
- 理解数据类型
这是任何数据科学项目的第一步!
---
### 3. 简单数据分析
**文件名:** `03_simple_analysis.py`
进行您的第一次数据分析:
- 计算基本统计数据(均值、中位数、众数)
- 找到最大值和最小值
- 统计值的出现次数
- 根据条件过滤数据
了解如何回答关于数据的简单问题。
---
### 4. 数据可视化基础
**文件名:** `04_basic_visualization.py`
创建您的第一个可视化:
- 制作简单的柱状图
- 创建折线图
- 生成饼图
- 将可视化保存为图片
学习如何通过可视化传达您的发现!
---
### 5. 使用真实数据
**文件名:** `05_real_world_example.py`
通过完整示例将所有内容结合起来:
- 从存储库加载真实数据
- 清理和准备数据
- 进行分析
- 创建有意义的可视化
- 得出结论
此示例展示了从头到尾的完整工作流程。
---
## 🎯 如何使用这些示例
1. **从头开始**:示例按难度排序编号。从 `01_hello_world_data_science.py` 开始,逐步学习。
2. **阅读注释**:每个文件都有详细的注释,解释代码的功能和原因。仔细阅读!
3. **尝试实验**:尝试修改代码。如果更改一个值会发生什么?打破代码并修复它——这是学习的方式!
4. **运行代码**:执行每个示例并观察输出。与您的预期结果进行比较。
5. **扩展它**:一旦理解了一个示例,尝试用自己的想法扩展它。
## 💡 初学者提示
- **不要着急**:在进入下一个示例之前,花时间理解每个示例
- **自己输入代码**:不要只是复制粘贴。输入代码有助于学习和记忆
- **查找不熟悉的概念**:如果看到不理解的内容,请在线搜索或参考主课程
- **提出问题**:如果需要帮助,请加入 [讨论论坛](https://github.com/microsoft/Data-Science-For-Beginners/discussions)
- **定期练习**:每天尝试编写一点代码,而不是每周进行一次长时间的学习
## 🔗 下一步
完成这些示例后,您可以:
- 学习主课程的内容
- 尝试每个课程文件夹中的作业
- 探索 Jupyter 笔记本以进行更深入的学习
- 创建自己的数据科学项目
## 📚 其他资源
- [主课程](../README.md) - 完整的20课课程
- [教师指南](../for-teachers.md) - 在课堂中使用此课程
- [Microsoft Learn](https://docs.microsoft.com/learn/) - 免费在线学习资源
- [Python 文档](https://docs.python.org/3/) - 官方 Python 参考
## 🤝 贡献
发现了错误或有新示例的想法?我们欢迎您的贡献!请参阅我们的 [贡献指南](../CONTRIBUTING.md)。
---
**祝学习愉快!🎉**
记住:每个专家都曾是初学者。一步一步来,不要害怕犯错——它们是学习过程的一部分!
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,67 @@
## 给教育工作者
想在课堂上使用这套课程吗?请随意使用!
事实上,您可以直接在 GitHub 上通过 GitHub Classroom 使用这套课程。
要做到这一点,请先 fork 此仓库。您需要为每节课创建一个单独的仓库,因此需要将每个文件夹提取到一个独立的仓库中。这样,[GitHub Classroom](https://classroom.github.com/classrooms) 就可以分别识别每节课。
这些[完整的说明](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/)将帮助您了解如何设置您的课堂。
## 按原样使用此仓库
如果您希望按当前形式使用此仓库,而不使用 GitHub Classroom也完全可以。您需要与学生沟通一起完成哪一节课程。
在在线教学环境中(如 Zoom、Teams 或其他平台您可以为测验创建分组讨论室并指导学生为学习做好准备。然后邀请学生参加测验并在特定时间以“issue”的形式提交答案。如果您希望学生公开协作完成作业也可以采用相同的方式。
如果您更喜欢更私密的形式,可以让学生逐节 fork 课程到他们自己的 GitHub 私有仓库,并授予您访问权限。这样,他们可以私下完成测验和作业,并通过您课堂仓库中的 issue 提交给您。
在在线课堂中,有很多方法可以让这套课程发挥作用。请告诉我们哪种方式最适合您!
## 本课程包含内容:
20 节课程40 个测验,以及 20 个作业。课程配有手绘笔记,适合视觉型学习者。许多课程同时提供 Python 和 R 的版本,可以通过 VS Code 中的 Jupyter notebooks 完成。了解更多关于如何设置课堂以使用这套技术栈的信息https://code.visualstudio.com/docs/datascience/jupyter-notebooks。
所有手绘笔记,包括一张大幅海报,都在[这个文件夹](../../sketchnotes)中。
您还可以使用 [Docsify](https://docsify.js.org/#/) 将这套课程作为一个独立的、离线友好的网站运行。[安装 Docsify](https://docsify.js.org/#/quickstart) 到您的本地机器,然后在本地副本的根文件夹中输入 `docsify serve`。网站将在本地的 3000 端口运行:`localhost:3000`。
课程的离线友好版本将作为一个独立的网页打开https://localhost:3000
课程分为 6 个部分:
- 1: 介绍
- 1: 数据科学的定义
- 2: 伦理
- 3: 数据的定义
- 4: 概率与统计概述
- 2: 数据处理
- 5: 关系型数据库
- 6: 非关系型数据库
- 7: Python
- 8: 数据准备
- 3: 数据可视化
- 9: 数量的可视化
- 10: 分布的可视化
- 11: 比例的可视化
- 12: 关系的可视化
- 13: 有意义的可视化
- 4: 数据科学生命周期
- 14: 介绍
- 15: 分析
- 16: 沟通
- 5: 云端数据科学
- 17: 介绍
- 18: 低代码选项
- 19: Azure
- 6: 数据科学的实际应用
- 20: 概述
## 请告诉我们您的想法!
我们希望这套课程能为您和您的学生带来帮助。请在讨论区中给我们反馈!也可以在讨论区为您的学生创建一个课堂专区。
---
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而导致的任何误解或误读,我们概不负责。

@ -0,0 +1,128 @@
# 测验
这些测验是数据科学课程的课前和课后测验课程网址为https://aka.ms/datascience-beginners
## 添加翻译后的测验集
通过在 `assets/translations` 文件夹中创建匹配的测验结构来添加测验翻译。原始测验位于 `assets/translations/en` 文件夹中。测验分为几个组别。请确保编号与正确的测验部分对齐。在整个课程中共有 40 个测验,编号从 0 开始。
编辑翻译后,请编辑翻译文件夹中的 `index.js` 文件,按照 `en` 文件夹中的约定导入所有文件。
编辑 `assets/translations` 文件夹中的 `index.js` 文件以导入新的翻译文件。
然后,编辑此应用中的 `App.vue` 文件中的下拉菜单以添加您的语言。将本地化缩写与您的语言文件夹名称匹配。
最后,编辑翻译课程中的所有测验链接(如果存在),以包含本地化查询参数,例如:`?loc=fr`。
## 项目设置
```
npm install
```
### 编译并热加载以进行开发
```
npm run serve
```
### 编译并压缩以进行生产环境
```
npm run build
```
### 检查并修复文件
```
npm run lint
```
### 自定义配置
请参阅 [配置参考](https://cli.vuejs.org/config/)。
致谢感谢此测验应用的原始版本https://github.com/arpan45/simple-quiz-vue
## 部署到 Azure
以下是帮助您入门的分步指南:
1. Fork GitHub 仓库
确保您的静态 Web 应用代码位于您的 GitHub 仓库中。Fork 此仓库。
2. 创建 Azure 静态 Web 应用
- 创建一个 [Azure 账户](http://azure.microsoft.com)
- 访问 [Azure 门户](https://portal.azure.com)
- 点击“创建资源”,搜索“静态 Web 应用”。
- 点击“创建”。
3. 配置静态 Web 应用
- 基本信息:
- 订阅:选择您的 Azure 订阅。
- 资源组:创建一个新的资源组或使用现有的资源组。
- 名称:为您的静态 Web 应用提供一个名称。
- 区域:选择离您的用户最近的区域。
- #### 部署详情:
- 来源选择“GitHub”。
- GitHub 账户:授权 Azure 访问您的 GitHub 账户。
- 组织:选择您的 GitHub 组织。
- 仓库:选择包含静态 Web 应用的仓库。
- 分支:选择您要部署的分支。
- #### 构建详情:
- 构建预设:选择您的应用所使用的框架(例如 React、Angular、Vue 等)。
- 应用位置:指定包含应用代码的文件夹(例如,如果在根目录则为 `/`)。
- API 位置:如果有 API请指定其位置可选
- 输出位置:指定生成构建输出的文件夹(例如 build 或 dist
4. 审核并创建
审核您的设置并点击“创建”。Azure 将设置必要的资源并在您的仓库中创建一个 GitHub Actions 工作流。
5. GitHub Actions 工作流
Azure 会自动在您的仓库中创建一个 GitHub Actions 工作流文件(.github/workflows/azure-static-web-apps-<name>.yml。此工作流将处理构建和部署过程。
6. 监控部署
进入 GitHub 仓库中的“Actions”标签。
您应该会看到一个工作流正在运行。此工作流将构建并部署您的静态 Web 应用到 Azure。
工作流完成后,您的应用将上线,您可以通过提供的 Azure URL 访问。
### 示例工作流文件
以下是 GitHub Actions 工作流文件的示例:
name: Azure Static Web Apps CI/CD
```
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main
jobs:
build_and_deploy_job:
runs-on: ubuntu-latest
name: Build and Deploy Job
steps:
- uses: actions/checkout@v2
- name: Build And Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
action: "upload"
app_location: "quiz-app" # App source code path
api_location: ""API source code path optional
output_location: "dist" #Built app content directory - optional
```
### 其他资源
- [Azure 静态 Web 应用文档](https://learn.microsoft.com/azure/static-web-apps/getting-started)
- [GitHub Actions 文档](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app)
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。

@ -0,0 +1,10 @@
在这里查看所有手绘笔记!
## 致谢
Nitya Narasimhan艺术家
![路线图手绘笔记](../../../translated_images/zh-CN/00-Roadmap.4905d6567dff47532b9bfb8e0b8980fc6b0b1292eebb24181c1a9753b33bc0f5.png)
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于重要信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。
Loading…
Cancel
Save