chore(i18n): sync translations with latest source changes (chunk 8/9, 94 changes)

update-translations
localizeflow[bot] 6 days ago
parent 3f52543aa9
commit 5de935fc99

@ -0,0 +1,190 @@
# 處理數據:關聯式資料庫
|![ Sketchnote 由 [(@sketchthedocs)](https://sketchthedocs.dev) 製作 ](../../sketchnotes/05-RelationalData.png)|
|:---:|
| 處理數據:關聯式資料庫 - _Sketchnote 由 [@nitya](https://twitter.com/nitya) 製作_ |
你很可能過去曾使用過試算表來儲存資訊。你有一組列和欄,列包含資訊(或數據),欄描述該資訊(有時稱為元資料)。關聯式資料庫建立在表格中欄和列的核心原則上,允許你將資訊分散在多個表格中。這讓你能處理更複雜的數據,避免重複,並在探索數據時擁有彈性。讓我們來探索關聯式資料庫的概念。
## [課前測驗](https://ff-quizzes.netlify.app/en/ds/quiz/8)
## 一切從表格開始
關聯式資料庫的核心是表格。就像試算表一樣,表格是欄和列的集合。列包含我們想處理的數據或資訊,例如城市名稱或降雨量。欄描述它們所儲存的數據。
讓我們開始探索,建立一個表格來儲存城市資訊。我們可能會從城市名稱和國家開始。你可以將它儲存在表格中,如下所示:
| City | Country |
| -------- | ------------- |
| Tokyo | Japan |
| Atlanta | United States |
| Auckland | New Zealand |
注意欄名 **city**、**country** 和 **population** 描述所儲存的數據,每一列包含一個城市的資訊。
## 單一表格方法的缺點
你可能覺得上面的表格相當熟悉。讓我們開始為我們的新資料庫添加一些額外數據——年度降雨量以毫米計。我們將關注2018、2019和2020年。如果我們為東京添加可能會是這樣
| City | Country | Year | Amount |
| ----- | ------- | ---- | ------ |
| Tokyo | Japan | 2020 | 1690 |
| Tokyo | Japan | 2019 | 1874 |
| Tokyo | Japan | 2018 | 1445 |
你注意到表格有什麼嗎?你可能會注意到我們不斷重複城市的名稱和國家。這可能佔用相當多的儲存空間,而且多份複製基本上是不必要的。畢竟,東京只有一個我們感興趣的名稱。
好,讓我們試試別的方法。為每年新增欄位:
| City | Country | 2018 | 2019 | 2020 |
| -------- | ------------- | ---- | ---- | ---- |
| Tokyo | Japan | 1445 | 1874 | 1690 |
| Atlanta | United States | 1779 | 1111 | 1683 |
| Auckland | New Zealand | 1386 | 942 | 1176 |
雖然這避免了列的重複,但帶來了其他挑戰。每當有新的一年時,我們需要修改表格結構。此外,隨著數據增長,將年份作為欄位會使檢索和計算數值變得更複雜。
這就是為什麼我們需要多個表格和關聯。透過拆分數據,我們可以避免重複,並在處理數據時擁有更多彈性。
## 關聯的概念
讓我們回到數據,決定如何拆分。我們知道要儲存城市的名稱和國家,所以這可能最好放在一個表格中。
| City | Country |
| -------- | ------------- |
| Tokyo | Japan |
| Atlanta | United States |
| Auckland | New Zealand |
但在建立下一個表格之前我們需要找出如何參考每個城市。我們需要某種識別符、ID或在技術資料庫術語中主鍵。主鍵是用來識別表格中特定一列的值。雖然這可以基於值本身例如使用城市名稱但幾乎總是應該是數字或其他識別符。我們不希望ID改變因為那會破壞關聯。你會發現大多數情況下主鍵或ID會是自動生成的數字。
> ✅ 主鍵常縮寫為 PK
### cities
| city_id | City | Country |
| ------- | -------- | ------------- |
| 1 | Tokyo | Japan |
| 2 | Atlanta | United States |
| 3 | Auckland | New Zealand |
> ✅ 你會注意到在本課程中我們交替使用「id」和「主鍵」這兩個術語。這些概念也適用於你稍後會探索的 DataFrames。DataFrames 不使用「主鍵」這個術語,但你會發現它們的行為非常相似。
建立了城市表格後讓我們儲存降雨量。與其重複城市的完整資訊我們可以使用ID。我們還應確保新建立的表格也有一個 *id* 欄位因為所有表格都應該有id或主鍵。
### rainfall
| rainfall_id | city_id | Year | Amount |
| ----------- | ------- | ---- | ------ |
| 1 | 1 | 2018 | 1445 |
| 2 | 1 | 2019 | 1874 |
| 3 | 1 | 2020 | 1690 |
| 4 | 2 | 2018 | 1779 |
| 5 | 2 | 2019 | 1111 |
| 6 | 2 | 2020 | 1683 |
| 7 | 3 | 2018 | 1386 |
| 8 | 3 | 2019 | 942 |
| 9 | 3 | 2020 | 1176 |
注意新建立的 **rainfall** 表格中的 **city_id** 欄。這欄包含參考 **cities** 表中ID的值。在技術關聯資料術語中這稱為 **外鍵**;它是另一個表的主鍵。你可以把它當作參考或指標。**city_id** 1 參考東京。
> [!NOTE]
> 外鍵常縮寫為 FK
## 取回數據
將數據分成兩個表格後,你可能想知道如何取回它。如果我們使用像 MySQL、SQL Server 或 Oracle 這樣的關聯式資料庫我們可以使用一種叫做結構化查詢語言Structured Query LanguageSQL的語言。SQL有時讀作 sequel是用來取回和修改關聯式資料庫中數據的標準語言。
取回數據時使用命令 `SELECT`。基本上,你**選擇**想看的欄位,**從**它們所在的表格中取出。如果你只想顯示城市名稱,可以使用以下語句:
```sql
SELECT city
FROM cities;
-- Output:
-- Tokyo
-- Atlanta
-- Auckland
```
`SELECT` 是列出欄位的地方,`FROM` 是列出表格的地方。
> [!NOTE]
> SQL 語法不區分大小寫,`select` 和 `SELECT` 意思相同。但根據你使用的資料庫類型,欄位和表格名稱可能區分大小寫。因此,最佳實務是將程式碼中所有東西都視為區分大小寫。撰寫 SQL 查詢時,常見慣例是將關鍵字全部大寫。
上述查詢會顯示所有城市。假設我們只想顯示紐西蘭的城市我們需要某種過濾條件。SQL 的關鍵字是 `WHERE`,意思是「在某條件為真時」。
```sql
SELECT city
FROM cities
WHERE country = 'New Zealand';
-- Output:
-- Auckland
```
## 連接數據
到目前為止,我們只從單一表格取回數據。現在我們想將 **cities****rainfall** 的數據合併。這是透過*連接*它們完成的。你會在兩個表格之間建立一個接縫,並匹配每個表格中某欄的值。
在我們的例子中,我們會將 **rainfall** 中的 **city_id** 欄與 **cities** 中的 **city_id** 欄匹配。這會將降雨量與其對應的城市匹配起來。我們執行的連接類型稱為*內部*連接,意思是如果有任何列在另一個表中找不到匹配,就不會顯示。在我們的情況中,每個城市都有降雨量,所以全部都會顯示。
讓我們取回2019年所有城市的降雨量。
我們將分步進行。第一步是透過指定接縫的欄位——前面提到的 **city_id**,將數據連接起來。
```sql
SELECT cities.city
rainfall.amount
FROM cities
INNER JOIN rainfall ON cities.city_id = rainfall.city_id
```
我們已標示出想要的兩個欄位,以及我們想用 **city_id** 連接表格。現在我們可以加上 `WHERE` 語句只篩選2019年。
```sql
SELECT cities.city
rainfall.amount
FROM cities
INNER JOIN rainfall ON cities.city_id = rainfall.city_id
WHERE rainfall.year = 2019
-- Output
-- city | amount
-- -------- | ------
-- Tokyo | 1874
-- Atlanta | 1111
-- Auckland | 942
```
## 總結
關聯式資料庫的核心是將資訊分散在多個表格中,然後再合併顯示和分析。這提供了高度的彈性來執行計算和操作數據。你已經看到關聯式資料庫的核心概念,以及如何在兩個表格之間執行連接。
## 🚀 挑戰
網路上有許多關聯式資料庫可用。你可以利用上述學到的技能來探索數據。
## 課後測驗
## [課後測驗](https://ff-quizzes.netlify.app/en/ds/quiz/9)
## 複習與自學
在 [Microsoft Learn](https://docs.microsoft.com/learn?WT.mc_id=academic-77958-bethanycheum) 上有多個資源,供你繼續探索 SQL 和關聯式資料庫概念
- [描述關聯數據的概念](https://docs.microsoft.com//learn/modules/describe-concepts-of-relational-data?WT.mc_id=academic-77958-bethanycheum)
- [開始使用 Transact-SQL 查詢](https://docs.microsoft.com//learn/paths/get-started-querying-with-transact-sql?WT.mc_id=academic-77958-bethanycheum)Transact-SQL 是 SQL 的一個版本)
- [Microsoft Learn 上的 SQL 內容](https://docs.microsoft.com/learn/browse/?products=azure-sql-database%2Csql-server&expanded=azure&WT.mc_id=academic-77958-bethanycheum)
## 作業
[顯示機場數據](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免責聲明**
本文件係使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我哋致力於確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件之母語版本應視為權威來源。對於重要資訊,建議採用專業人工翻譯。對於因使用本翻譯而引起之任何誤解或誤釋,我哋概不負責。
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,65 @@
# 顯示機場數據
您已獲得一個基於 [SQLite](https://sqlite.org/index.html) 的 [資料庫](https://raw.githubusercontent.com/Microsoft/Data-Science-For-Beginners/main/2-Working-With-Data/05-relational-databases/airports.db),其中包含有關機場的資訊。以下顯示了該資料庫的結構。您將使用 [Visual Studio Code](https://code.visualstudio.com?WT.mc_id=academic-77958-bethanycheum) 中的 [SQLite 擴展](https://marketplace.visualstudio.com/items?itemName=alexcvzz.vscode-sqlite&WT.mc_id=academic-77958-bethanycheum) 來顯示不同城市的機場資訊。
## 指示
要開始此任務,您需要完成幾個步驟。您需要安裝一些工具並下載範例資料庫。
### 設置您的系統
您可以使用 Visual Studio Code 和 SQLite 擴展來與資料庫互動。
1. 前往 [code.visualstudio.com](https://code.visualstudio.com?WT.mc_id=academic-77958-bethanycheum) 並按照指示安裝 Visual Studio Code
1. 按照 Marketplace 頁面上的指示安裝 [SQLite 擴展](https://marketplace.visualstudio.com/items?itemName=alexcvzz.vscode-sqlite&WT.mc_id=academic-77958-bethanycheum)
### 下載並打開資料庫
接下來,您需要下載並打開資料庫。
1. 從 [GitHub 下載資料庫文件](https://raw.githubusercontent.com/Microsoft/Data-Science-For-Beginners/main/2-Working-With-Data/05-relational-databases/airports.db) 並將其保存到一個目錄中
1. 打開 Visual Studio Code
1. 在 SQLite 擴展中打開資料庫,按下 **Ctl-Shift-P**(或在 Mac 上按 **Cmd-Shift-P**),然後輸入 `SQLite: Open database`
1. 選擇 **Choose database from file** 並打開您之前下載的 **airports.db** 文件
1. 打開資料庫後(螢幕上不會顯示更新),通過按下 **Ctl-Shift-P**(或在 Mac 上按 **Cmd-Shift-P**)並輸入 `SQLite: New query` 創建一個新的查詢窗口
打開後,新的查詢窗口可用於對資料庫執行 SQL 語句。您可以使用命令 **Ctl-Shift-Q**(或在 Mac 上按 **Cmd-Shift-Q**)來執行資料庫查詢。
> [!NOTE]
> 有關 SQLite 擴展的更多資訊,您可以參考 [文檔](https://marketplace.visualstudio.com/items?itemName=alexcvzz.vscode-sqlite&WT.mc_id=academic-77958-bethanycheum)
## 資料庫結構
資料庫的結構是其表格設計和架構。**airports** 資料庫有兩個表格,`cities` 包含英國和愛爾蘭的城市列表,`airports` 包含所有機場的列表。由於某些城市可能有多個機場,因此創建了兩個表格來存儲資訊。在此練習中,您將使用連接來顯示不同城市的資訊。
| Cities |
| ---------------- |
| id (PK, integer) |
| city (text) |
| country (text) |
| Airports |
| -------------------------------- |
| id (PK, integer) |
| name (text) |
| code (text) |
| city_id (FK to id in **Cities**) |
## 任務
創建查詢以返回以下資訊:
1. `Cities` 表中的所有城市名稱
1. `Cities` 表中所有位於愛爾蘭的城市
1. 所有機場名稱及其所在城市和國家
1. 所有位於英國倫敦的機場
## 評分標準
| 優秀 | 合格 | 需要改進 |
| --------- | --------- | ------------- |
---
**免責聲明**
本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。

@ -0,0 +1,149 @@
# 使用資料:非關聯式資料
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的速記筆記](../../sketchnotes/06-NoSQL.png)|
|:---:|
|使用 NoSQL 資料 - _速記筆記由 [@nitya](https://twitter.com/nitya) 提供_ |
## [課前測驗](https://ff-quizzes.netlify.app/en/ds/quiz/10)
資料並不限於關聯式資料庫。本課程聚焦於非關聯式資料,並將涵蓋試算表和 NoSQL 的基礎知識。
## 試算表
試算表是一種流行的資料存儲和探索方式,因為它需要較少的設置工作即可開始使用。在本課程中,您將學習試算表的基本組成部分,以及公式和函數。範例將以 Microsoft Excel 為例,但大多數部分和主題在其他試算表軟體中名稱和步驟相似。
![一個空的 Microsoft Excel 工作簿,包含兩個工作表](../../../../2-Working-With-Data/06-non-relational/images/parts-of-spreadsheet.png)
試算表是一個檔案,可以在電腦、設備或基於雲端的檔案系統中存取。軟體本身可能是基於瀏覽器的,或者需要安裝在電腦上的應用程式,或下載為應用程式。在 Excel 中,這些檔案也被定義為 **工作簿**,本課程將使用此術語。
工作簿包含一個或多個 **工作表**,每個工作表都以標籤命名。在工作表中有稱為 **儲存格** 的矩形,這些儲存格包含實際的資料。儲存格是行和列的交叉點,其中列以字母標記,行以數字標記。一些試算表會在前幾行中包含標題,以描述儲存格中的資料。
了解了 Excel 工作簿的這些基本元素後,我們將使用 [Microsoft Templates](https://templates.office.com/) 中的範例,專注於庫存管理,來進一步了解試算表的其他部分。
### 管理庫存
名為 "InventoryExample" 的試算表檔案是一個格式化的庫存項目試算表,包含三個工作表,標籤分別為 "Inventory List"、"Inventory Pick List" 和 "Bin Lookup"。Inventory List 工作表的第 4 行是標題,描述了標題列中每個儲存格的值。
![Microsoft Excel 庫存清單範例中高亮顯示的公式](../../../../2-Working-With-Data/06-non-relational/images/formula-excel.png)
有些情況下儲存格的值依賴於其他儲存格的值來生成。在此範例中Inventory List 試算表追蹤庫存中每個項目的成本,但如果我們需要知道整個庫存的價值呢?[**公式**](https://support.microsoft.com/en-us/office/overview-of-formulas-34519a4e-1e8d-4f4b-84d4-d642c4f63263) 用於對儲存格資料執行操作,並在此範例中計算庫存的成本。此試算表在 Inventory Value 列中使用公式,通過將 QTY 標題下的數量與 COST 標題下的成本相乘來計算每個項目的價值。雙擊或高亮顯示儲存格即可查看公式。您會注意到公式以等號開頭,後面是計算或操作。
![Microsoft Excel 庫存清單範例中高亮顯示的函數](../../../../2-Working-With-Data/06-non-relational/images/function-excel.png)
我們可以使用另一個公式將所有 Inventory Value 的值相加來獲得其總價值。這可以通過逐一相加每個儲存格來計算但這可能是一項繁瑣的任務。Excel 提供了 [**函數**](https://support.microsoft.com/en-us/office/sum-function-043e1c7d-7726-4e80-8f32-07b23e057f89),即預定義的公式,用於對儲存格值進行計算。函數需要參數,即執行這些計算所需的值。如果函數需要多個參數,則需要按特定順序列出,否則函數可能無法計算正確的值。此範例使用 SUM 函數,並使用 Inventory Value 的值作為參數,生成列於第 3 行、第 B 列(也稱為 B3的總值。
## NoSQL
NoSQL 是一個涵蓋非關聯式資料存儲方式的術語,可以解釋為 "非 SQL"、"非關聯式" 或 "不僅僅是 SQL"。這類型的資料庫系統可以分為四種類型。
![鍵值資料存儲的圖形表示,顯示 4 個唯一的數字鍵與 4 個不同的值相關聯](../../../../2-Working-With-Data/06-non-relational/images/kv-db.png)
> 來源:[Michał Białecki Blog](https://www.michalbialecki.com/2018/03/18/azure-cosmos-db-key-value-database-cloud/)
[鍵值](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data#keyvalue-data-stores) 資料庫將唯一鍵(唯一識別符)與值配對。這些配對使用 [哈希表](https://www.hackerearth.com/practice/data-structures/hash-tables/basics-of-hash-tables/tutorial/) 和適當的哈希函數存儲。
![圖形資料存儲的圖形表示,顯示人、興趣和地點之間的關係](../../../../2-Working-With-Data/06-non-relational/images/graph-db.png)
> 來源:[Microsoft](https://docs.microsoft.com/en-us/azure/cosmos-db/graph/graph-introduction#graph-database-by-example)
[圖形](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data#graph-data-stores) 資料庫描述資料中的關係,並以節點和邊的集合表示。節點表示實體,即現實世界中存在的事物,例如學生或銀行對帳單。邊表示兩個實體之間的關係。每個節點和邊都有屬性,提供有關節點和邊的額外資訊。
![列式資料存儲的圖形表示,顯示一個客戶資料庫,包含兩個列族,分別為 Identity 和 Contact Info](../../../../2-Working-With-Data/06-non-relational/images/columnar-db.png)
[列式](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data#columnar-data-stores) 資料存儲將資料組織為列和行,類似於關聯式資料結構,但每列被分為稱為列族的群組,其中一列下的所有資料是相關的,可以作為一個單元檢索和更改。
### 使用 Azure Cosmos DB 的文件資料存儲
[文件](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data#document-data-stores) 資料存儲基於鍵值資料存儲的概念,由一系列欄位和物件組成。本節將使用 Cosmos DB 模擬器探索文件資料庫。
Cosmos DB 資料庫符合 "不僅僅是 SQL" 的定義,其中 Cosmos DB 的文件資料庫依賴 SQL 來查詢資料。[前一課程](../05-relational-databases/README.md) 涵蓋了 SQL 的基礎知識,我們將能夠在此處將一些相同的查詢應用於文件資料庫。我們將使用 Cosmos DB 模擬器,它允許我們在電腦上本地創建和探索文件資料庫。更多關於模擬器的資訊請參閱[此處](https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator?tabs=ssl-netstd21)。
文件是由欄位和物件值組成的集合,其中欄位描述物件值的含義。以下是一個文件範例。
```json
{
"firstname": "Eva",
"age": 44,
"id": "8c74a315-aebf-4a16-bb38-2430a9896ce5",
"_rid": "bHwDAPQz8s0BAAAAAAAAAA==",
"_self": "dbs/bHwDAA==/colls/bHwDAPQz8s0=/docs/bHwDAPQz8s0BAAAAAAAAAA==/",
"_etag": "\"00000000-0000-0000-9f95-010a691e01d7\"",
"_attachments": "attachments/",
"_ts": 1630544034
}
```
此文件中的主要欄位包括:`firstname`、`id` 和 `age`。其餘帶有下劃線的欄位是由 Cosmos DB 自動生成的。
#### 使用 Cosmos DB 模擬器探索資料
您可以[在此處下載並安裝 Windows 版模擬器](https://aka.ms/cosmosdb-emulator)。如果您使用 macOS 或 Linux請參閱[此文件](https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator?tabs=ssl-netstd21#run-on-linux-macos)了解如何運行模擬器。
模擬器啟動後會打開一個瀏覽器窗口,其中的 Explorer 視圖允許您探索文件。
![Cosmos DB 模擬器的 Explorer 視圖](../../../../2-Working-With-Data/06-non-relational/images/cosmosdb-emulator-explorer.png)
如果您正在跟隨操作,請點擊 "Start with Sample" 生成一個名為 SampleDB 的範例資料庫。展開 SampleDB您會看到一個名為 `Persons` 的容器。容器包含一系列項目,即容器內的文件。您可以探索 `Items` 下的四個單獨文件。
![在 Cosmos DB 模擬器中探索範例資料](../../../../2-Working-With-Data/06-non-relational/images/cosmosdb-emulator-persons.png)
#### 使用 Cosmos DB 模擬器查詢文件資料
我們還可以通過點擊 "New SQL Query" 按鈕(左側第二個按鈕)來查詢範例資料。
`SELECT * FROM c` 返回容器中的所有文件。讓我們添加一個 where 子句,查找年齡小於 40 的人。
`SELECT * FROM c where c.age < 40`
![在 Cosmos DB 模擬器中運行 SELECT 查詢,查找年齡欄位值小於 40 的文件](../../../../2-Working-With-Data/06-non-relational/images/cosmosdb-emulator-persons-query.png)
查詢返回了兩個文件,注意每個文件的年齡值都小於 40。
#### JSON 與文件
如果您熟悉 JavaScript Object Notation (JSON),您會注意到文件看起來與 JSON 類似。此目錄中有一個 `PersonsData.json` 檔案,包含更多資料,您可以通過模擬器中的 `Upload Item` 按鈕上傳到 Persons 容器。
在大多數情況下,返回 JSON 資料的 API 可以直接轉移並存儲到文件資料庫中。以下是另一個文件範例,它表示從 Microsoft Twitter 帳戶檢索的推文,這些推文是通過 Twitter API 獲取後插入到 Cosmos DB 中的。
```json
{
"created_at": "2021-08-31T19:03:01.000Z",
"id": "1432780985872142341",
"text": "Blank slate. Like this tweet if youve ever painted in Microsoft Paint before. https://t.co/cFeEs8eOPK",
"_rid": "dhAmAIUsA4oHAAAAAAAAAA==",
"_self": "dbs/dhAmAA==/colls/dhAmAIUsA4o=/docs/dhAmAIUsA4oHAAAAAAAAAA==/",
"_etag": "\"00000000-0000-0000-9f84-a0958ad901d7\"",
"_attachments": "attachments/",
"_ts": 1630537000
```
此文件中的主要欄位包括:`created_at`、`id` 和 `text`
## 🚀 挑戰
目錄中有一個 `TwitterData.json` 檔案,您可以上傳到 SampleDB 資料庫。建議您將其添加到一個單獨的容器中。操作步驟如下:
1. 點擊右上角的 "New Container" 按鈕
1. 選擇現有資料庫 (SampleDB),為容器創建一個容器 ID
1. 將分區鍵設置為 `/id`
1. 點擊 OK可以忽略此視圖中的其他資訊因為這是一個小型資料集運行於您的本地機器
1. 打開新容器,使用 `Upload Item` 按鈕上傳 Twitter Data 檔案
嘗試運行一些 SELECT 查詢,查找 `text` 欄位中包含 Microsoft 的文件。提示:嘗試使用 [LIKE 關鍵字](https://docs.microsoft.com/en-us/azure/cosmos-db/sql/sql-query-keywords#using-like-with-the--wildcard-character)。
## [課後測驗](https://ff-quizzes.netlify.app/en/ds/quiz/11)
## 回顧與自學
- 試算表中還有一些額外的格式和功能本課程未涵蓋。如果您有興趣了解更多Microsoft 提供了[大量的 Excel 文件和影片](https://support.microsoft.com/excel)。
- 此架構文件詳細說明了不同類型非關聯式資料的特徵:[非關聯式資料與 NoSQL](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data)。
- Cosmos DB 是一個基於雲端的非關聯式資料庫,也可以存儲本課程中提到的不同 NoSQL 類型。了解更多請參閱此 [Cosmos DB Microsoft Learn 模組](https://docs.microsoft.com/en-us/learn/paths/work-with-nosql-data-in-azure-cosmos-db/)。
## 作業
[Soda Profits](assignment.md)
---
**免責聲明**
本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。

@ -0,0 +1,24 @@
# 蘇打水利潤
## 說明
[Coca Cola Co 試算表](../../../../2-Working-With-Data/06-non-relational/CocaColaCo.xlsx)缺少一些計算。您的任務是:
1. 計算 2015、2016、2017 和 2018 財年的毛利
- 毛利 = 營業收入淨額 - 銷售成本
1. 計算所有毛利的平均值。嘗試使用函數完成此操作。
- 平均值 = 毛利總和除以財年數量 (10)
- [AVERAGE 函數](https://support.microsoft.com/en-us/office/average-function-047bac88-d466-426c-a32b-8f33eb960cf6) 的文件
1. 這是一個 Excel 文件,但應該可以在任何試算表平台上編輯
[數據來源感謝 Yiyi Wang](https://www.kaggle.com/yiyiwang0826/cocacola-excel)
## 評分標準
卓越 | 合格 | 需要改進
--- | --- | --- |
---
**免責聲明**
本文件使用 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,282 @@
# 使用數據Python 和 Pandas 庫
| ![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的速記筆記](../../sketchnotes/07-WorkWithPython.png) |
| :-------------------------------------------------------------------------------------------------------: |
| 使用 Python - _由 [@nitya](https://twitter.com/nitya) 繪製的速記筆記_ |
[![介紹影片](../../../../translated_images/zh-MO/video-ds-python.245247dc811db8e4d5ac420246de8a118c63fd28f6a56578d08b630ae549f260.png)](https://youtu.be/dZjWOGbsN4Y)
雖然資料庫提供了非常高效的方式來存儲數據並使用查詢語言進行查詢,但最靈活的數據處理方式是編寫自己的程式來操作數據。在許多情況下,使用資料庫查詢可能更有效。然而,當需要更複雜的數據處理時,使用 SQL 可能不容易完成。
數據處理可以用任何程式語言編寫,但有些語言在處理數據方面更高效。數據科學家通常偏好以下語言之一:
* **[Python](https://www.python.org/)** 是一種通用程式語言因其簡單性常被認為是初學者的最佳選擇。Python 擁有許多額外的庫,可以幫助解決許多實際問題,例如從 ZIP 壓縮檔案中提取數據或將圖片轉換為灰度。除了數據科學Python 也常用於網頁開發。
* **[R](https://www.r-project.org/)** 是一個傳統工具箱專為統計數據處理而設計。它擁有大量的庫CRAN使其成為數據處理的良好選擇。然而R 不是通用程式語言,通常僅限於數據科學領域使用。
* **[Julia](https://julialang.org/)** 是另一種專為數據科學設計的語言。它旨在提供比 Python 更好的性能,是科學實驗的理想工具。
在本課程中,我們將重點使用 Python 進行簡單的數據處理。我們假設您已對該語言有基本的熟悉。如果您想深入了解 Python可以參考以下資源
* [使用 Turtle Graphics 和 Fractals 以有趣的方式學習 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)
## 表格數據和 DataFrame
當我們討論關聯式資料庫時,您已經接觸過表格數據。當您擁有大量數據並且它包含在許多不同的連結表中時,使用 SQL 來處理它是非常合理的。然而,在許多情況下,我們有一個數據表,並需要對該數據進行一些**理解**或**洞察**,例如分佈、值之間的相關性等。在數據科學中,經常需要對原始數據進行一些轉換,然後進行可視化。這兩個步驟都可以輕鬆地使用 Python 完成。
在 Python 中,有兩個最有用的庫可以幫助您處理表格數據:
* **[Pandas](https://pandas.pydata.org/)** 允許您操作所謂的 **DataFrame**,它類似於關聯式表格。您可以擁有命名的列,並對行、列以及整個 DataFrame 執行不同的操作。
* **[Numpy](https://numpy.org/)** 是一個用於處理 **張量**(即多維**陣列**)的庫。陣列具有相同的基礎類型值,比 DataFrame 更簡單,但提供了更多的數學操作,並且開銷更少。
此外,還有幾個您應該了解的庫:
* **[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 的入門代碼。我們僅在此概述一些例子,您可以查看完整的筆記本。
舉個例子我們想分析我們冰淇淋店的銷售情況。讓我們生成一段時間內的銷售數字每天售出的商品數量Series
```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-MO/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-MO/timeseries-2.aae51d575c55181ceda81ade8c546a2fc2024f9136934386d57b8a189d7570ff.png)
> **注意**:我們沒有使用簡單的語法 `total_items+additional_items`。如果使用該語法,我們會在結果 Series 中得到許多 `NaN`*非數值*)值。這是因為在 `additional_items` Series 的某些索引點缺少值,並且將 `NaN` 與任何值相加都會得到 `NaN`。因此,我們需要在相加時指定 `fill_value` 參數。
使用時間序列,我們還可以使用不同的時間間隔對 Series 進行**重採樣**。例如,假設我們想計算每月的平均銷售量。我們可以使用以下代碼:
```python
monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')
```
![每月時間序列平均值](../../../../translated_images/zh-MO/timeseries-3.f3147cbc8c624881008564bc0b5d9fcc15e7374d339da91766bd0e1c6bd9e3af.png)
### DataFrame
DataFrame 本質上是具有相同索引的 Series 集合。我們可以將幾個 Series 組合成一個 DataFrame
```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` 表示轉置 DataFrame 的操作,即更改行和列,而 `rename` 操作允許我們重命名列以匹配前面的例子。
以下是我們可以對 DataFrame 執行的一些最重要的操作:
**列選擇**。我們可以通過編寫 `df['A']` 選擇單個列——此操作返回一個 Series。我們還可以通過編寫 `df[['B','A']]` 選擇列的子集到另一個 DataFrame——此操作返回另一個 DataFrame。
**篩選**符合條件的行。例如,要僅保留列 `A` 大於 5 的行,我們可以編寫 `df[df['A']>5]`
> **注意**:篩選的工作方式如下。表達式 `df['A']<5` 返回一個布林 Series指示原始 Series `df['A']` 的每個元素是否為 `True``False`。當布林 Series 用作索引時,它返回 DataFrame 中的行子集。因此,不能使用任意的 Python 布林表達式,例如,編寫 `df[df['A']>5 and df['A']<7]` 是錯誤的。相反,您應該使用布林 Series 的特殊 `&` 操作,編寫 `df[(df['A']>5) & (df['A']<7)]`*括號在這裡很重要*)。
**創建新的可計算列**。我們可以通過使用直觀的表達式輕鬆為 DataFrame 創建新的可計算列:
```python
df['DivA'] = df['A']-df['A'].mean()
```
此例子計算 A 與其平均值的偏差。實際上,我們正在計算一個 Series然後將此 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)
```
執行上述操作後,我們將得到以下 DataFrame
| | 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` 結構。例如,要選擇 DataFrame 的前 5 行:
```python
df.iloc[:5]
```
**分組**通常用於獲得類似於 Excel 中*樞紐分析表*的結果。假設我們想計算列 `A` 的平均值,按 `LenB` 的每個數字分組。然後我們可以按 `LenB` 分組 DataFrame並調用 `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-MO/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-MO/covidtreat.b2ba59f57ca45fbcda36e0ddca3f8cfdddeeed6ca879ea7f866d93fa6ec65791.png)
## 處理圖像數據
最近,已經開發出非常強大的 AI 模型,可以幫助我們理解圖像。有許多任務可以使用預訓練的神經網絡或雲服務解決。一些例子包括:
* **圖像分類**,可以幫助你將圖像分類到預定義的類別之一。你可以使用像 [Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77958-bethanycheum) 這樣的服務輕鬆訓練自己的圖像分類器。
* **物體檢測**,用於檢測圖像中的不同物體。像 [Computer Vision](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 照片,試圖了解什麼使人們更喜歡某張照片。我們首先使用 [Computer Vision](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) 構建可解釋的模型。
* 在 [Facial Studies Workshop](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)
* [在 Microsoft Learn 上開始你的 Python 第一步](https://docs.microsoft.com/learn/paths/python-first-steps/?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,28 @@
# 使用 Python 進行數據處理的作業
在這份作業中,我們將要求您詳細說明我們在挑戰中開始開發的代碼。作業分為兩部分:
## COVID-19 傳播模型
- [ ] 在一個圖中繪製 5-6 個不同國家的 *R* 圖表進行比較,或者使用多個並排的圖表。
- [ ] 查看死亡人數和康復人數與感染病例數之間的關聯。
- [ ] 通過視覺上比較感染率和死亡率,並尋找一些異常情況,找出典型疾病持續的時間。您可能需要查看不同國家的數據來得出結論。
- [ ] 計算致死率以及其隨時間的變化。*您可能需要考慮疾病持續的天數,將一個時間序列進行偏移後再進行計算。*
## COVID-19 論文分析
- [ ] 建立不同藥物的共現矩陣,並查看哪些藥物經常一起出現(即在同一摘要中提到)。您可以修改用於建立藥物和診斷共現矩陣的代碼。
- [ ] 使用熱圖可視化此矩陣。
- [ ] 作為額外目標,使用 [chord diagram](https://en.wikipedia.org/wiki/Chord_diagram) 可視化藥物的共現情況。[此庫](https://pypi.org/project/chord/) 可能有助於您繪製 chord diagram。
- [ ] 作為另一個額外目標,使用正則表達式提取不同藥物的劑量(例如 **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 @@
# 資料處理:資料準備
|![由 [(@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`即非數值Not a Number。這實際上是一個特殊值是 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 將其視為整數。`''` 則稍微微妙一些。雖然我們在第一部分中使用它來表示空字串值,但它仍然是一個字串對象,而不是 pandas 所認為的空值。
現在,讓我們反過來以更接近實際使用的方式使用這些方法。您可以直接將布林掩碼用作 ``Series`` 或 ``DataFrame`` 的索引,這在處理孤立的缺失(或存在)值時非常有用。
> **重點**`isnull()` 和 `notnull()` 方法在 `DataFrame` 中的使用結果相似:它們顯示結果及其索引,這將在您處理資料時幫助您。
- **移除空值**除了識別缺失值pandas 還提供了一種方便的方法來移除 `Series``DataFrame` 中的空值。(特別是在大型資料集上,通常更建議直接移除缺失 [NA] 值,而不是以其他方式處理它們。)讓我們回到 `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,19 @@
# 評估表單數據
一位客戶正在測試一個[小型表單](../../../../2-Working-With-Data/08-data-preparation/index.html),以收集一些關於其客戶群的基本數據。他們將測試結果帶給你,希望你能驗證所收集的數據。你可以在瀏覽器中打開 `index.html` 頁面查看表單。
你已獲得一份[包含表單記錄的 csv 數據集](../../../../data/form.csv),其中包括表單的輸入內容以及一些基本的可視化圖表。客戶指出某些可視化圖表看起來不正確,但他們不確定如何解決這些問題。你可以在[作業筆記本](assignment.ipynb)中進行探索。
## 指導
使用本課程中的技術提出建議,幫助表單收集準確且一致的信息。
## 評分標準
卓越 | 合格 | 需要改進
--- | --- | --- |
---
**免責聲明**
此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解讀概不負責。

@ -0,0 +1,22 @@
# 資料處理
![data love](../../../translated_images/zh-MO/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 @@
# 視覺化數量
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的手繪筆記](../../sketchnotes/09-Visualizing-Quantities.png)|
|:---:|
| 視覺化數量 - _手繪筆記由 [@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,16 @@
# 折線圖、散點圖與長條圖
## 說明
在這節課中,你學習了如何使用折線圖、散點圖和長條圖來展示這個數據集中的有趣事實。在這次作業中,深入挖掘數據集,發現關於某種特定鳥類的事實。例如,創建一個筆記本,視覺化展示你能找到的所有關於雪雁的有趣數據。使用上述三種圖表,在你的筆記本中講述一個故事。
## 評分標準
優秀 | 合格 | 需要改進
--- | --- | -- |
筆記本包含良好的註解、完整的故事敘述以及吸引人的圖表 | 筆記本缺少其中一個要素 | 筆記本缺少其中兩個要素
---
**免責聲明**
本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤讀概不負責。

@ -0,0 +1,100 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# 一起來了解鳥類吧\n",
"\n",
"## 鳥類是什麼?\n",
"\n",
"鳥類是一種擁有羽毛的溫血動物。牠們是地球上最具多樣性的生物之一,從小巧的蜂鳥到巨大的鴕鳥,種類繁多。\n",
"\n",
"[!NOTE] 鳥類的羽毛不僅用於飛行,還能提供保暖和偽裝。\n",
"\n",
"---\n",
"\n",
"## 鳥類的主要特徵\n",
"\n",
"1. **羽毛**:所有鳥類都有羽毛,這是牠們的標誌性特徵。\n",
"2. **喙**:鳥類沒有牙齒,牠們用喙來進食。\n",
"3. **蛋**:鳥類產下硬殼的蛋。\n",
"4. **骨骼**:鳥類的骨骼輕巧但堅固,適合飛行。\n",
"\n",
"[!TIP] 並非所有鳥類都能飛行,例如企鵝和鴕鳥。\n",
"\n",
"---\n",
"\n",
"## 鳥類的棲息地\n",
"\n",
"鳥類幾乎可以在任何地方找到,從熱帶雨林到寒冷的極地。牠們的適應能力非常強,能夠在各種環境中生存。\n",
"\n",
"[!WARNING] 棲息地的破壞對鳥類的生存構成了重大威脅。\n",
"\n",
"---\n",
"\n",
"## 為什麼鳥類重要?\n",
"\n",
"- **生態平衡**:鳥類在控制昆蟲數量和傳播種子方面扮演著重要角色。\n",
"- **文化意義**:鳥類在藝術、文學和宗教中經常出現。\n",
"- **科學研究**:鳥類幫助我們了解進化、行為和生態系統。\n",
"\n",
"[!IMPORTANT] 保護鳥類就是保護我們的生態系統。\n",
"\n",
"---\n",
"\n",
"## 如何幫助鳥類?\n",
"\n",
"1. **提供食物和水**:在庭院中放置鳥食器和水盆。\n",
"2. **種植本地植物**:這些植物能吸引鳥類並提供棲息地。\n",
"3. **避免使用殺蟲劑**:化學物質可能對鳥類有害。\n",
"4. **支持保育組織**:參與或捐助保護鳥類的活動。\n",
"\n",
"[!CAUTION] 不要餵食鳥類加工食品,這可能對牠們的健康有害。\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:42:48+00:00",
"source_file": "3-Data-Visualization/09-visualization-quantities/notebook.ipynb",
"language_code": "mo"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,209 @@
# 視覺化分佈
|![由 [(@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']` 篩選器以顯示標籤分佈。
直方圖還提供了一些漂亮的顏色和標籤增強功能可以嘗試:
建立一個 2D 直方圖來比較兩個分佈之間的關係。我們來比較 `MaxBodyMass``MaxLength`。Matplotlib 提供了一種內建方式,透過更亮的顏色顯示收斂:
```python
x = filteredBirds['MaxBodyMass']
y = filteredBirds['MaxLength']
fig, ax = plt.subplots(tight_layout=True)
hist = ax.hist2d(x, y)
```
沿著預期軸,這兩個元素之間似乎存在預期的相關性,其中有一個特別強的收斂點:
![2D 圖](../../../../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,16 @@
# 運用你的技能
## 指示
到目前為止,你已經使用了明尼蘇達州鳥類數據集來探索有關鳥類數量和人口密度的信息。嘗試使用不同的數據集來練習這些技術,或許可以從 [Kaggle](https://www.kaggle.com/) 獲取數據。建立一個筆記本,講述這個數據集的故事,並確保在討論時使用直方圖。
## 評分標準
卓越 | 合格 | 需要改進
--- | --- | -- |
提供了一個包含有關此數據集的註解包括其來源的筆記本並使用至少5個直方圖來探索數據的事實。 | 提供了一個筆記本,但註解不完整或存在錯誤。 | 提供了一個筆記本,但沒有註解且包含錯誤。
---
**免責聲明**
本文件已使用 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": "e5272cbcbffd1ddcc09e44d3d8e7e8cd",
"translation_date": "2025-09-02T09:04:33+00:00",
"source_file": "3-Data-Visualization/10-visualization-distributions/notebook.ipynb",
"language_code": "mo"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,195 @@
# 視覺化比例
|![由 [(@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')
```
將這些數據中的 "類別" 列轉換為分類:
```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)。
現在你知道如何分組數據並將其顯示為圓餅圖或甜甜圈圖,你可以探索其他類型的圖表。試試華夫圖,這是一種不同的方式來探索數量。
## 華夫圖!
華夫圖是一種以 2D 方格陣列視覺化數量的方式。試著視覺化這個數據集中蘑菇帽顏色的不同數量。為此,你需要安裝一個名為 [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,16 @@
# 在 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:36:37+00:00",
"source_file": "3-Data-Visualization/11-visualization-proportions/notebook.ipynb",
"language_code": "mo"
}
},
"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年首次出現的毀滅性「蜂群崩潰症候群 (CCD)」http://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-MO/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-MO/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-MO/scatter3.3c160a3d1dcb36b37900ebb4cf97f34036f28ae2b7b8e6062766c7c1dfc00853.png)
這是否只是供需的簡單案例?由於氣候變化和蜂群崩潰等因素,是否每年可供購買的蜂蜜減少,因此價格上漲?
為了探索數據集中某些變數之間的相關性,讓我們來看看一些折線圖。
## 折線圖
問題:蜂蜜每磅價格是否每年都有明顯上漲?您可以通過創建一個單一折線圖來最容易地發現這一點:
```python
sns.relplot(x="year", y="priceperlb", kind="line", data=honey);
```
答案是的除了2003年左右有一些例外
![line chart 1](../../../../translated_images/zh-MO/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-MO/line2.a5b3493dc01058af6402e657aaa9ae1125fafb5e7d6630c777aa60f900a544e4.png)
答案:並不完全。如果您查看總產量,實際上在那一年似乎有所增加,儘管總體而言,蜂蜜的生產量在這些年中呈下降趨勢。
問題在這種情況下2003年蜂蜜價格的激增可能是什麼原因
為了探索這一點,您可以使用 Facet Grid。
## Facet Grids
Facet Grid 可以選擇數據集的一個面在我們的例子中您可以選擇「年份」以避免生成過多的面。Seaborn 可以為您選擇的 x 和 y 坐標生成每個面的圖表方便比較。2003年是否在這種比較中顯得突出
繼續使用 Seaborn 的 `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"
)
```
在這個視覺化中您可以比較每年的每群產量和蜂群數量並將列的包裹設置為3
![facet grid](../../../../translated_images/zh-MO/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-MO/dual-line.a4c28ce659603fab2c003f4df816733df2bf41d1facb7de27989ec9afbf01b33.png)
雖然在2003年沒有明顯的異常但這讓我們以一個稍微樂觀的結論結束這節課儘管蜂群數量總體上在下降但蜂群數量正在穩定即使每群產量在減少。
加油,蜜蜂們,加油!
🐝❤️
## 🚀 挑戰
在本課中,您學到了更多關於散點圖和折線圖,包括 Facet Grid 的其他用途。挑戰自己使用不同的數據集創建 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,16 @@
# 探索蜂巢
## 說明
在這節課中,你開始研究一組有關蜜蜂及其蜂蜜產量的數據,這些數據涵蓋了一段時間,而這段時間內蜂群數量整體上有所減少。深入挖掘這組數據,建立一個筆記本,講述蜂群健康狀況的故事,按州和年份進行分析。你是否在這組數據中發現了什麼有趣的內容?
## 評分標準
| 優秀 | 合格 | 需要改進 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | --------------------------------------- |
| 提供了一個筆記本,包含至少三個不同的圖表,註解展示數據集的各個方面,按州和年份進行分析 | 筆記本缺少其中一個要素 | 筆記本缺少其中兩個要素 |
---
**免責聲明**
此文件已使用 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:55:52+00:00",
"source_file": "3-Data-Visualization/12-visualization-relationships/notebook.ipynb",
"language_code": "mo"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,173 @@
# 製作有意義的視覺化圖表
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的手繪筆記](../../sketchnotes/13-MeaningfulViz.png)|
|:---:|
| 有意義的視覺化圖表 - _由 [@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 軸,根據日期顯示了與事實相反的內容:
![糟糕的圖表 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 病例數下降的結論。事實上,如果仔細查看日期,你會發現日期被重新排列以製造出誤導性的下降趨勢。
![糟糕的圖表 2](../../../../3-Data-Visualization/13-meaningful-visualizations/images/bad-chart-2.jpg)
這個臭名昭著的例子使用顏色和反轉的 Y 軸來誤導:原本應該得出槍支友好立法通過後槍支死亡率激增的結論,卻讓人誤以為相反的情況是真實的:
![糟糕的圖表 3](../../../../3-Data-Visualization/13-meaningful-visualizations/images/bad-chart-3.jpg)
這張奇怪的圖表展示了比例如何被操控,效果令人捧腹:
![糟糕的圖表 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 圖表](../../../../3-Data-Visualization/13-meaningful-visualizations/images/3d.png)
## 動畫和3D圖表顯示
如今一些最好的數據視覺化是動畫化的。Shirley Wu 使用 D3 創作了令人驚嘆的作品,例如「[電影之花](http://bl.ocks.org/sxywu/raw/d612c6c653fb8b4d7ff3d422be164a5d/)」每朵花都是一部電影的視覺化。另一個例子是《衛報》的「Bussed Out」這是一個結合 Greensock 和 D3 的視覺化與滾動敘事文章格式的互動體驗,展示了紐約市如何通過將人們送出城市來處理無家可歸者問題。
![Bussed Out](../../../../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展示一本書《危險關係》的動畫社交網絡視覺化。
> 《Les Liaisons Dangereuses》危險關係是一部書信體小說或以書信形式呈現的小說。由 Choderlos de Laclos 於1782年撰寫講述了18世紀法國貴族中兩位主角 Vicomte de Valmont 和 Marquise de Merteuil 的惡毒、道德敗壞的社交操縱故事。兩人最終都遭遇了悲劇,但在此之前造成了巨大的社會損害。小說以一系列寫給圈內各人的信件展開,信件中包含復仇計劃或純粹的惡作劇。創建這些信件的視覺化,探索敘事中的主要角色,並以視覺方式呈現。
你將完成一個網頁應用,顯示這個社交網絡的動畫視圖。它使用了一個庫來創建[網絡視覺化](https://github.com/emiliorizzo/vue-d3-network),基於 Vue.js 和 D3。當應用運行時你可以在屏幕上拖動節點來重新排列數據。
![危險關係](../../../../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,16 @@
# 建立你自己的自定義視覺化
## 指導說明
使用此專案中的程式碼範例來建立一個社交網絡,模擬你自己的社交互動數據。你可以繪製你的社交媒體使用情況,或者製作一個家庭成員的圖表。創建一個有趣的網頁應用程式,展示一個獨特的社交網絡視覺化。
## 評分標準
卓越 | 合格 | 需要改進
--- | --- | -- |
提供一個 GitHub 儲存庫,其中的程式碼能正常運行(嘗試將其部署為靜態網頁應用程式),並附有註解清晰的 README 說明專案 | 儲存庫無法正常運行或文檔不完善 | 儲存庫無法正常運行且文檔不完善
---
**免責聲明**
本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤讀概不負責。

@ -0,0 +1,31 @@
# 危險關係數據可視化項目
開始之前,請確保您的機器上已安裝並運行 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,31 @@
# 危險關係數據可視化項目
要開始使用,請確保您的機器上已安裝 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,225 @@
# 視覺化數量
|![由 [(@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` 是一個基於圖形語法Grammar of Graphics聲明式創建圖形的系統。[圖形語法](https://en.wikipedia.org/wiki/Ggplot2) 是一種數據視覺化的通用方案,它將圖表分解為語義組件,例如比例和層次。換句話說,`ggplot2` 使得用少量代碼創建單變量或多變量數據的圖表和圖形變得非常容易,因此成為 R 中最受歡迎的視覺化套件。使用者告訴 `ggplot2` 如何將變數映射到美學屬性,使用哪些圖形元素,然後 `ggplot2` 負責其餘部分。
> ✅ 圖表 = 數據 + 美學 + 幾何
> - 數據指的是數據集
> - 美學表示要研究的變數x 和 y 變數)
> - 幾何指的是圖表類型(折線圖、柱狀圖等)
根據您的數據和想要通過圖表講述的故事,選擇最佳的幾何(圖表類型)。
> - 分析趨勢:折線圖、柱狀圖
> - 比較數值:條形圖、柱狀圖、餅圖、散點圖
> - 顯示部分與整體的關係:餅圖
> - 顯示數據分佈:散點圖、柱狀圖
> - 顯示數值之間的關係:折線圖、散點圖、氣泡圖
✅ 您也可以查看這份描述性的 [ggplot2 速查表](https://nyu-cdsc.github.io/learningr/assets/data-visualization-2.1.pdf)。
## 建立鳥類翼展值的折線圖
打開 R 控制台並導入數據集。
> 注意:數據集存儲在此 repo 的 `/data` 文件夾中。
讓我們導入數據集並觀察數據的前五行。
```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()` 函數,因為我們的目標是繪製折線圖。
![MaxWingspan-lineplot](../../../../../translated_images/zh-MO/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()` 為圖表/圖形命名。
![MaxWingspan-lineplot-improved](../../../../../translated_images/zh-MO/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 軸上的標籤以減少圖表的混亂。
您發現了什麼?
![MaxWingspan-scatterplot](../../../../../translated_images/zh-MO/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`,然後繪製了一個散點圖。通過篩選掉異常值,您的數據現在更加一致且易於理解。
![MaxWingspan-scatterplot-improved](../../../../../translated_images/zh-MO/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` 套件繪製條形圖並指定不同類別的顏色和標籤。
![Stacked bar chart](../../../../../translated_images/zh-MO/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()` 則繪製水平條形圖。
![category-length](../../../../../translated_images/zh-MO/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` 數據,然後繪製條形圖。
![comparing data](../../../../../translated_images/zh-MO/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()
```
![super-imposed values](../../../../../translated_images/zh-MO/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,16 @@
# 折線圖、散點圖與長條圖
## 課程指引
在本課程中,你學習了如何使用折線圖、散點圖和長條圖來展示這個數據集中的有趣事實。在這次作業中,深入探索數據集,發掘關於某種鳥類的有趣事實。例如,撰寫一個腳本,視覺化所有你能找到的關於雪雁的有趣數據。使用上述三種圖表,在你的筆記本中講述一個故事。
## 評分標準
卓越 | 合格 | 需要改進
--- | --- | --- |
腳本具有良好的註解、完整的故事敘述以及吸引人的圖表 | 腳本缺少其中一個元素 | 腳本缺少其中兩個元素
---
**免責聲明**
此文件已使用 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-MO/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-MO/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-MO/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-MO/filtered-histogram.6bf5d2bfd82533220e1bd4bc4f7d14308f43746ed66721d9ec8f460732be6674.png)
✅ 嘗試其他篩選條件和數據點。要查看數據的完整分佈,移除 `['MaxBodyMass']` 篩選器以顯示標籤分佈。
直方圖還提供了一些不錯的顏色和標籤增強功能可以嘗試:
創建一個 2D 直方圖來比較兩個分佈之間的關係。讓我們比較 `MaxBodyMass``MaxLength`。`ggplot2` 提供了一種內建方式來通過更亮的顏色顯示收斂:
```r
ggplot(data=birds_filtered_1, aes(x=MaxBodyMass, y=MaxLength) ) +
geom_bin2d() +scale_fill_continuous(type = "viridis")
```
沿著預期的軸,這兩個元素之間似乎存在預期的相關性,其中有一個特別強的收斂點:
![2D 圖表](../../../../../translated_images/zh-MO/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-MO/wingspan-conservation-collation.4024e9aa6910866aa82f0c6cb6a6b4b925bd10079e6b0ef8f92eefa5a6792f76.png)
最小翼展和保育狀態之間似乎沒有良好的相關性。使用此方法測試數據集的其他元素。你可以嘗試不同的篩選條件。你是否發現了任何相關性?
## 密度圖
你可能已經注意到,我們到目前為止看到的直方圖是“階梯式”的,並沒有平滑地呈弧形。要顯示更平滑的密度圖,可以嘗試使用密度圖。
現在讓我們來使用密度圖!
```r
ggplot(data = birds_filtered_1, aes(x = MinWingspan)) +
geom_density()
```
![密度圖](../../../../../translated_images/zh-MO/density-plot.675ccf865b76c690487fb7f69420a8444a3515f03bad5482886232d4330f5c85.png)
你可以看到該圖表反映了之前的最小翼展數據;它只是稍微平滑了一些。如果你想重新訪問第二個圖表中那條鋸齒狀的最大體重線,可以通過使用此方法非常好地將其平滑化:
```r
ggplot(data = birds_filtered_1, aes(x = MaxBodyMass)) +
geom_density()
```
![體重密度](../../../../../translated_images/zh-MO/bodymass-smooth.d31ce526d82b0a1f19a073815dea28ecfbe58145ec5337e4ef7e8cdac81120b3.png)
如果你想要一條平滑但不過於平滑的線,可以編輯 `adjust` 參數:
```r
ggplot(data = birds_filtered_1, aes(x = MaxBodyMass)) +
geom_density(adjust = 1/5)
```
![較不平滑的體重密度](../../../../../translated_images/zh-MO/less-smooth-bodymass.10f4db8b683cc17d17b2d33f22405413142004467a1493d416608dafecfdee23.png)
✅ 閱讀此類圖表可用的參數並進行實驗!
這種類型的圖表提供了非常具有解釋性的視覺化效果。例如,通過幾行代碼,你可以顯示每個鳥類目最大體重的密度:
```r
ggplot(data=birds_filtered_1,aes(x = MaxBodyMass, fill = Order)) +
geom_density(alpha=0.5)
```
![每目體重密度](../../../../../translated_images/zh-MO/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,16 @@
# 運用你的技能
## 指示
到目前為止,你已經使用了明尼蘇達州鳥類數據集來探索有關鳥類數量和人口密度的信息。嘗試使用不同的數據集來練習這些技術,或許可以從 [Kaggle](https://www.kaggle.com/) 獲取數據。撰寫一個 R 腳本來講述這個數據集的故事,並確保在討論時使用直方圖。
## 評分標準
卓越 | 合格 | 需要改進
--- | --- | -- |
提供了一個腳本,包含有關此數據集的註解,包括其來源,並使用至少 5 個直方圖來探索數據的事實。 | 提供了一個腳本,但註解不完整或存在錯誤。 | 提供了一個腳本,但沒有註解且包含錯誤。
---
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤讀概不負責。

@ -0,0 +1,191 @@
# 視覺化比例
|![由 [(@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-MO/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-MO/donut-wb.34e6fb275da9d834c2205145e39a3de9b6878191dcdba6f7a9e85f4b520449bc.png)
這段代碼使用了兩個庫——ggplot2 和 webr。使用 webr 庫的 PieDonut 函數,我們可以輕鬆創建甜甜圈圖!
在 R 中僅使用 ggplot2 庫也可以製作甜甜圈圖。你可以在[這裡](https://www.r-graph-gallery.com/128-ring-or-donut-plot.html)了解更多並自己嘗試。
現在你已經知道如何分組數據並將其顯示為圓餅圖或甜甜圈圖,你可以探索其他類型的圖表。試試華夫圖,這是一種不同的方式來探索數量。
## 華夫圖!
華夫圖是一種以 2D 方格陣列視覺化數量的方式。試著視覺化這個數據集中蘑菇帽顏色的不同數量。為此,你需要安裝一個名為 [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-MO/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,170 @@
# 視覺化關係:蜂蜜的故事 🍯
|![ 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://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-MO/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-MO/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-MO/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-MO/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-MO/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-MO/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-MO/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,173 @@
# 製作有意義的視覺化圖表
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的速記筆記](../../../sketchnotes/13-MeaningfulViz.png)|
|:---:|
| 有意義的視覺化圖表 - _由 [@nitya](https://twitter.com/nitya) 繪製的速記筆記_ |
> 「如果你對數據施加足夠的壓力,它會承認任何事情」-- [Ronald Coase](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 的《How Charts Lie》](../../../../../translated_images/zh-MO/tornado.2880ffc7f135f82b5e5328624799010abefd1080ae4b7ecacbdc7d792f1d8849.png)](https://www.youtube.com/watch?v=oX74Nge8Wkw "How charts lie")
> 🎥 點擊上方圖片觀看有關誤導性圖表的會議演講
這張圖表反轉了 X 軸,根據日期顯示了與事實相反的內容:
![糟糕的圖表 1](../../../../../translated_images/zh-MO/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-MO/bad-chart-2.62edf4d2f30f4e519f5ef50c07ce686e27b0196a364febf9a4d98eecd21f9f60.jpg)
這個臭名昭著的例子使用顏色和翻轉的 Y 軸來誤導:原本應該得出槍支友好立法通過後槍支死亡率激增的結論,事實上卻讓人誤以為情況正好相反:
![糟糕的圖表 3](../../../../../translated_images/zh-MO/bad-chart-3.e201e2e915a230bc2cde289110604ec9abeb89be510bd82665bebc1228258972.jpg)
這張奇怪的圖表展示了比例如何被操控,效果令人捧腹:
![糟糕的圖表 4](../../../../../translated_images/zh-MO/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-MO/3d.db1734c151eee87d924989306a00e23f8cddac6a0aab122852ece220e9448def.png)
## 動畫和 3D 圖表展示
如今一些最好的數據視覺化是動畫化的。Shirley Wu 使用 D3 創作了令人驚嘆的作品,例如「[電影之花](http://bl.ocks.org/sxywu/raw/d612c6c653fb8b4d7ff3d422be164a5d/)」每朵花都是一部電影的視覺化。另一個例子是《衛報》的「Bussed Out」這是一個結合 Greensock 和 D3 的視覺化和滾動敘事文章格式的互動體驗,展示了紐約市如何通過將無家可歸者送出城市來處理其無家可歸問題。
![Bussed Out](../../../../../translated_images/zh-MO/busing.8157cf1bc89a3f65052d362a78c72f964982ceb9dcacbe44480e35909c3dce62.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 世紀晚期法國貴族中兩位主角 Vicomte de Valmont 和 Marquise de Merteuil 的惡毒、道德敗壞的社交手段。兩人最終都遭遇了悲劇,但在此之前造成了大量的社會損害。小說以寫給圈內各人的信件形式展開,信件內容包括復仇計劃或純粹製造麻煩。創建一個這些信件的視覺化,探索敘事中的主要角色。
你將完成一個網頁應用,展示這個社交網絡的動畫化視圖。它使用了一個庫,該庫旨在使用 Vue.js 和 D3 創建[網絡視覺化](https://github.com/emiliorizzo/vue-d3-network)。當應用運行時,你可以在屏幕上拖動節點來重新排列數據。
![危險關係](../../../../../translated_images/zh-MO/liaisons.90ce7360bcf8476558f700bbbaf198ad697d5b5cb2829ba141a89c0add7c6ecd.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://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,33 @@
# 視覺化
![一隻蜜蜂停在薰衣草花上](../../../translated_images/zh-MO/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 修訂。該數據集包括描述假設樣本,對應於 Agaricus 和 Lepiota 家族中 23 種有鰓蘑菇。蘑菇信息取自《Audubon Society Field Guide to North American Mushrooms》1981。該數據集於 1987 年捐贈給 UCI ML 27。
🦆 明尼蘇達州鳥類數據來自 [Kaggle](https://www.kaggle.com/hannahcollins/minnesota-birds),由 Hannah Collins 從 [Wikipedia](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-MO/data-science-lifecycle.a1e362637503c4fb0cd5e859d7552edcdb4aa629a279727008baa121f2d33f32.jpg)
> 圖片來源:[Berkeley School of Information](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-MO/tdsp-lifecycle2.e19029d598e2e73d5ef8a4b98837d688ec6044fe332c905d4dbb69eb6d5c1d96.png) | ![資料科學過程聯盟圖示](../../../../translated_images/zh-MO/CRISP-DM.8bad2b4c66e62aa75278009e38e3e99902c73b0a6f63fd605a67c687a536698c.png) |
| 圖片來源:[Microsoft](https://docs.microsoft.comazure/architecture/data-science-process/lifecycle) | 圖片來源:[Data Science Process Alliance](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,28 @@
# 評估數據集
一位客戶向您的團隊尋求幫助,希望調查紐約市計程車乘客的季節性消費習慣。
他們想知道:**紐約市的黃色計程車乘客在冬季還是夏季給司機的小費更多?**
您的團隊目前處於數據科學生命周期的[捕捉階段](Readme.md#Capturing),而您負責處理數據集。您已獲得一個筆記本和[數據](../../../../data/taxi.csv)進行探索。
在此目錄中,有一個[筆記本](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)。找出一個可能對回答客戶問題有幫助的額外數據集。
- 提出 3 個您會向客戶詢問的問題,以獲得更多澄清並更好地理解問題。
請參考[數據集字典](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",
"請參考 [Data dictionary](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:34:20+00:00",
"source_file": "4-Data-Science-Lifecycle/14-Introduction/notebook.ipynb",
"language_code": "mo"
}
},
"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)
在數據生命周期中的分析階段確認數據是否能回答所提出的問題或解決特定問題。這一步驟也可以用來確認模型是否正確地解決了這些問題。本課程專注於探索性數據分析Exploratory Data AnalysisEDA這是一種用於定義數據特徵和關係的技術並可用於為建模準備數據。
我們將使用 [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:31:08+00:00",
"source_file": "4-Data-Science-Lifecycle/15-analyzing/assignment.ipynb",
"language_code": "mo"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,27 @@
# 探索答案
這是上一課[作業](../14-Introduction/assignment.md)的延續,我們之前簡單地查看了數據集。現在,我們將更深入地分析這些數據。
再次重申,客戶想知道的問題是:**紐約市的黃計程車乘客在冬季或夏季是否給司機更多的小費?**
您的團隊目前處於數據科學生命周期的[分析](README.md)階段負責對數據集進行探索性數據分析。您已獲得一個筆記本和包含2019年1月和7月200筆計程車交易的數據集。
## 指示
在此目錄中有一個[筆記本](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:28:44+00:00",
"source_file": "4-Data-Science-Lifecycle/15-analyzing/notebook.ipynb",
"language_code": "mo"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,213 @@
# 數據科學生命周期:溝通
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的手繪筆記](../../sketchnotes/16-Communicating.png)|
|:---:|
| 數據科學生命周期:溝通 - _手繪筆記由 [@nitya](https://twitter.com/nitya) 提供_ |
## [課前測驗](https://ff-quizzes.netlify.app/en/ds/quiz/30)
透過上方的課前測驗來檢驗你對即將學習內容的了解!
# 簡介
### 什麼是溝通?
讓我們從定義溝通的含義開始這節課。**溝通是傳遞或交換信息的過程。** 信息可以是想法、思考、感受、訊息、隱秘信號、數據——任何一個**_發送者_**(傳遞信息的人)希望**_接收者_**(接收信息的人)理解的內容。在這節課中,我們將把發送者稱為溝通者,而接收者稱為受眾。
### 數據溝通與故事講述
我們知道,溝通的目的是傳遞或交換信息。但在進行數據溝通時,你的目標不應該僅僅是向受眾傳遞數字。你的目標應該是通過數據講述一個故事——有效的數據溝通與故事講述是密不可分的。受眾更可能記住你講述的故事,而不是你提供的數字。在這節課的後面,我們將討論一些方法,幫助你更有效地利用故事講述來進行數據溝通。
### 溝通的類型
在這節課中,我們將討論兩種不同的溝通類型:單向溝通和雙向溝通。
**單向溝通** 是指發送者向接收者傳遞信息,但沒有任何反饋或回應。我們每天都能看到單向溝通的例子——例如群發郵件、新聞報導最新事件,或者電視廣告告訴你他們的產品有多好。在這些情況下,發送者並不尋求信息的交換,他們只是想傳遞或提供信息。
**雙向溝通** 是指所有參與方既是發送者又是接收者。一方開始傳遞信息,另一方則提供反饋或回應。雙向溝通是我們通常所理解的溝通方式。我們通常會想到人們進行的對話——無論是面對面、電話、社交媒體還是短信。
在進行數據溝通時,有些情況下你會使用單向溝通(例如在會議或大型群體中進行演講,之後不會直接回答問題),而有些情況下你會使用雙向溝通(例如用數據說服幾位利益相關者支持某個提案,或者說服同事投入時間和精力開發新項目)。
# 有效溝通
### 作為溝通者的責任
在溝通時,你的責任是確保接收者能夠理解你希望他們理解的信息。在進行數據溝通時,你不僅希望接收者記住數字,還希望他們能夠理解由數據支撐的故事。一個好的數據溝通者也是一個好的故事講述者。
那麼,如何用數據講述故事呢?方法無窮無盡——但以下是我們在這節課中將討論的六種方法:
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主管們更有可能從會議中獲得艾默生希望他們記住的重點——即投訴和錯誤的處理方式可以改進並且有兩個解決方案可以實施以實現這一改進。這種方法將更有效地傳達艾默生希望溝通的數據和故事。
# 結論
### 主要要點摘要
- 溝通是傳遞或交換信息。
- 在溝通數據時,目標不應僅僅是向觀眾傳遞數字。目標應該是傳達一個由數據支持的故事。
- 溝通有兩種類型:單向溝通(信息傳遞無需回應)和雙向溝通(信息在雙方之間交流)。
- 有許多策略可以用來用數據講故事,我們討論了以下五種策略:
- 了解你的觀眾、媒介和溝通方式
- 從終點開始思考
- 像講述真正的故事一樣進行
- 使用有意義的詞語和短語
- 善用情感
### 自學推薦資源
[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,17 @@
# 講述一個故事
## 指引
數據科學的核心在於講述故事。選擇任意一個數據集,撰寫一篇短文,講述你可以從中挖掘出的故事。你希望你的數據集能揭示什麼?如果它的揭示結果出現問題,你會怎麼做?如果你的數據無法輕易解鎖其秘密,又該如何應對?思考你的數據集可能呈現的各種情境,並將它們記錄下來。
## 評分標準
卓越 | 合格 | 需要改進
--- | --- | -- |
一篇完整的文章以 .doc 格式呈現,數據集被清楚地解釋、記錄並標註來源,並且圍繞數據集講述了一個連貫的故事,包含詳細的數據示例。| 一篇較短的文章,細節不夠充分 | 文章在上述某些細節方面有所欠缺。
---
**免責聲明**
本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。

@ -0,0 +1,21 @@
# 數據科學生命週期
![communication](../../../translated_images/zh-MO/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,104 @@
# 雲端中的資料科學入門
|![ 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):使用者透過網際網路按需訪問軟體應用程式,通常是基於訂閱的方式。使用者不需要擔心托管和管理軟體應用程式、基礎設施或維護,例如軟體升級和安全修補。
一些最大的雲端提供商包括 Amazon Web Services、Google Cloud Platform 和 Microsoft 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 Streaming APIs
* 建立一個 Stream Analytics 作業
* 指定作業輸入和查詢
* 建立輸出接收器並指定作業輸出
* 啟動作業
查看完整過程,請參考[文件](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,16 @@
# 市場調查
## 說明
在這節課中,你學到了幾個重要的雲端服務提供商。進行一些市場調查,了解每個提供商能為數據科學家提供什麼服務。這些服務是否具有可比性?撰寫一篇文章,描述三個或更多這些雲端服務提供商的服務內容。
## 評分標準
優秀 | 合格 | 需要改進
--- | --- | -- |
一篇一頁的文章描述了三個雲端服務提供商的數據科學服務,並區分了它們之間的差異。 | 提交了一篇較短的文章 | 提交了一篇文章,但未完成分析
---
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對於因使用此翻譯而引起的任何誤解或錯誤解讀概不負責。

@ -0,0 +1,341 @@
# 雲端中的數據科學:「低代碼/無代碼」方式
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的速記筆記](../../sketchnotes/18-DataScience-Cloud.png)|
|:---:|
| 雲端中的數據科學:低代碼 - _由 [@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**:一個基於網頁的 Azure Machine Learning 平臺,提供低代碼和無代碼選項,用於模型訓練、部署、自動化、跟蹤和資產管理。該 Studio 與 Azure Machine Learning SDK 集成,提供無縫體驗。
- **Jupyter Notebooks**:快速原型設計和測試 ML 模型。
- **Azure Machine Learning Designer**:允許通過拖放模塊來構建實驗,並在低代碼環境中部署管道。
- **自動化機器學習界面 (AutoML)**:自動化機器學習模型開發的迭代任務,能夠以高效和高生產力的方式構建 ML 模型,同時保持模型質量。
- **數據標籤**:一種輔助 ML 工具,用於自動標籤數據。
- **Visual Studio Code 的機器學習擴展**:提供完整的開發環境,用於構建和管理 ML 項目。
- **機器學習 CLI**:提供命令行管理 Azure ML 資源的命令。
- **與開源框架集成**:如 PyTorch、TensorFlow、Scikit-learn 等,用於訓練、部署和管理端到端的機器學習過程。
- **MLflow**:一個開源庫,用於管理機器學習實驗的生命周期。**MLFlow Tracking** 是 MLflow 的一個組件,用於記錄和跟蹤訓練運行的指標和模型工件,無論實驗環境如何。
### 1.2 心臟衰竭預測項目:
毫無疑問,製作和構建項目是檢驗技能和知識的最佳方式。在本課程中,我們將探索兩種不同的方法來構建心臟衰竭攻擊預測的數據科學項目,分別是通過低代碼/無代碼方式和通過 Azure ML SDK如下圖所示
![項目架構](../../../../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 機器學習的頂級資源,提供了一個集中式位置,用於管理您使用 Azure 機器學習創建的所有工件。工作區保留所有訓練運行的歷史記錄,包括日誌、指標、輸出以及腳本的快照。您可以使用這些信息來確定哪次訓練運行生成了最佳模型。[了解更多](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 機器學習,請在您的 Azure 訂閱中創建工作區。然後,您可以使用此工作區來管理與機器學習工作負載相關的數據、計算資源、代碼、模型和其他工件。
> **_注意_** 您的 Azure 訂閱將因數據存儲而產生少量費用,只要 Azure 機器學習工作區存在於您的訂閱中。因此,我們建議在不再使用工作區時刪除它。
1. 使用與您的 Azure 訂閱相關聯的 Microsoft 賬戶登錄 [Azure 入口網站](https://ms.portal.azure.com/)。
2. 選擇 **+創建資源**
![工作區-1](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-1.PNG)
搜索 Machine Learning 並選擇 Machine Learning 磚塊
![工作區-2](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-2.PNG)
點擊創建按鈕
![工作區-3](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-3.PNG)
按以下方式填寫設置:
- 訂閱:您的 Azure 訂閱
- 資源組:創建或選擇一個資源組
- 工作區名稱:輸入工作區的唯一名稱
- 地區:選擇距您最近的地理區域
- 存儲帳戶:注意將為您的工作區創建的默認新存儲帳戶
- 密鑰保管庫:注意將為您的工作區創建的默認新密鑰保管庫
- 應用洞察:注意將為您的工作區創建的默認新應用洞察資源
- 容器註冊表:無(第一次將模型部署到容器時會自動創建)
![工作區-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 機器學習工作區。
![工作區-5](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-5.PNG)
5. 在 Azure Machine Learning Studio 中,切換左上角的 ☰ 圖標以查看界面中的各個頁面。您可以使用這些頁面來管理工作區中的資源。
![工作區-6](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/workspace-6.PNG)
您可以使用 Azure 入口網站管理您的工作區但對於數據科學家和機器學習運營工程師來說Azure Machine Learning Studio 提供了一個更專注的用戶界面,用於管理工作區資源。
### 2.2 計算資源
計算資源是基於雲的資源,您可以在其上運行模型訓練和數據探索過程。您可以創建四種類型的計算資源:
- **計算實例**數據科學家用於處理數據和模型的開發工作站。這涉及創建虛擬機VM並啟動筆記本實例。然後您可以通過筆記本調用計算集群來訓練模型。
- **計算集群**:可擴展的虛擬機集群,用於按需處理實驗代碼。訓練模型時需要使用計算集群。計算集群還可以使用專門的 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 中,點擊 "Compute" 菜單,然後選擇 "Compute cluster" 標籤,點擊 "+ New" 按鈕以建立計算叢集。
![22](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/cluster-1.PNG)
1. 選擇您的選項:專用 vs 低優先級、CPU 或 GPU、虛擬機器大小和核心數量您可以保留此專案的預設設定
2. 點擊 "Next" 按鈕。
![23](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/cluster-2.PNG)
3. 為叢集命名。
4. 選擇您的選項:最小/最大節點數量、閒置秒數後縮減、SSH 存取。請注意,如果最小節點數量為 0當叢集閒置時您可以節省成本。請注意最大節點數量越高訓練時間越短。建議的最大節點數量為 3。
5. 點擊 "Create" 按鈕。此步驟可能需要幾分鐘。
![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/) 中,點擊左側菜單中的 "Datasets",然後點擊 "+ Create dataset" 按鈕以建立數據集。選擇 "From local files" 選項並選擇我們之前下載的 Kaggle 數據集。
![24](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/dataset-1.PNG)
2. 為您的數據集命名、選擇類型並添加描述。點擊 "Next"。從文件中上傳數據。點擊 "Next"。
![25](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/dataset-2.PNG)
3. 在 Schema 中將以下特徵的數據類型更改為布林值anaemia、diabetes、高血壓、性別、吸煙和 DEATH_EVENT。點擊 "Next" 並點擊 "Create"。
![26](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/dataset-3.PNG)
太棒了!現在數據集已經準備好,計算叢集也已建立,我們可以開始訓練模型了!
### 2.4 使用 AutoML 進行低代碼/無代碼訓練
傳統的機器學習模型開發需要大量資源,並且需要豐富的領域知識和時間來生成和比較多個模型。
自動化機器學習AutoML是一種自動化機器學習模型開發中耗時且迭代任務的過程。它使數據科學家、分析師和開發者能夠以高效和生產力的方式構建 ML 模型,同時保持模型質量。它減少了生成可投入生產的 ML 模型所需的時間,並且操作簡便高效。[了解更多](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/) 中,點擊左側菜單中的 "Automated ML",選擇您剛剛上傳的數據集。點擊 "Next"。
![27](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/aml-1.PNG)
2. 輸入新的實驗名稱、目標列DEATH_EVENT以及我們建立的計算叢集。點擊 "Next"。
![28](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/aml-2.PNG)
3. 選擇 "Classification" 並點擊 "Finish"。此步驟可能需要 30 分鐘到 1 小時,具體取決於您的計算叢集大小。
![30](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/aml-3.PNG)
4. 一旦運行完成,點擊 "Automated ML" 標籤,點擊您的運行,然後在 "Best model summary" 卡片中點擊算法。
![31](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/aml-4.PNG)
在這裡,您可以看到 AutoML 生成的最佳模型的詳細描述。您還可以在 "Models" 標籤中探索其他模型。花幾分鐘時間探索 "Explanations (preview)" 按鈕中的模型。一旦您選擇了要使用的模型(在此我們選擇 AutoML 選擇的最佳模型),接下來我們將了解如何部署它。
## 3. 低代碼/無代碼模型部署及端點使用
### 3.1 模型部署
自動化機器學習界面允許您將最佳模型部署為網絡服務,僅需幾個步驟。部署是模型的整合,使其能夠根據新數據進行預測並識別潛在的機會領域。對於此專案,部署到網絡服務意味著醫療應用程序將能夠使用模型來即時預測患者的心臟病風險。
在最佳模型描述中,點擊 "Deploy" 按鈕。
![deploy-1](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/deploy-1.PNG)
15. 為其命名、添加描述、選擇計算類型Azure Container Instance啟用身份驗證並點擊 "Deploy"。此步驟可能需要約 20 分鐘完成。部署過程包括註冊模型、生成資源並配置它們以供網絡服務使用。部署狀態下會顯示狀態消息。定期點擊 "Refresh" 檢查部署狀態。當狀態顯示 "Healthy" 時,表示已部署並正在運行。
![deploy-2](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/deploy-2.PNG)
16. 部署完成後,點擊 "Endpoint" 標籤並點擊您剛剛部署的端點。在這裡,您可以找到有關端點的所有詳細信息。
![deploy-3](../../../../5-Data-Science-In-Cloud/18-Low-Code/images/deploy-3.PNG)
太棒了!現在我們已經部署了模型,可以開始使用端點。
### 3.2 端點使用
點擊 "Consume" 標籤。在這裡,您可以找到 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,16 @@
# 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,303 @@
# 雲端中的數據科學:使用 "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 AutoML 配置和訓練](../../../../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
數據科學家和人工智能開發者使用 Azure Machine Learning SDK 與 Azure Machine Learning 服務一起構建和運行機器學習工作流。您可以在任何 Python 環境中與該服務交互,包括 Jupyter Notebooks、Visual Studio Code 或您喜愛的 Python IDE。
SDK 的主要功能包括:
- 探索、準備和管理機器學習實驗中使用的數據集的生命周期。
- 管理雲端資源以監控、記錄和組織您的機器學習實驗。
- 在本地或使用雲端資源(包括 GPU 加速的模型訓練)訓練模型。
- 使用自動化機器學習,該功能接受配置參數和訓練數據,並自動迭代算法和超參數設置以找到最佳模型進行預測。
- 部署 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/) 中,進入計算菜單,您將看到不同的計算資源。
![計算實例-1](../../../../5-Data-Science-In-Cloud/19-Azure/images/compute-instance-1.PNG)
讓我們創建一個計算實例來提供 Jupyter Notebook。
1. 點擊 + 新建按鈕。
2. 為您的計算實例命名。
3. 選擇您的選項CPU 或 GPU、VM 大小和核心數量。
4. 點擊創建按鈕。
恭喜,您剛剛創建了一個計算實例!我們將在[建立筆記本部分](../../../../5-Data-Science-In-Cloud/19-Azure)中使用此計算實例。
### 2.3 加載數據集
如果您尚未上傳數據集,請參考[上一課](../18-Low-Code/README.md)中的 **2.3 加載數據集** 部分。
### 2.4 建立筆記本
> **_注意:_** 接下來的步驟,您可以選擇從頭創建一個新的筆記本,或者上傳我們之前創建的 [筆記本](../../../../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. 在應用程序部分,點擊 Jupyter 選項。
2. 勾選 "是,我理解" 框並點擊繼續按鈕。
![筆記本-1](../../../../5-Data-Science-In-Cloud/19-Azure/images/notebook-1.PNG)
3. 這將在新瀏覽器標籤中打開您的 Jupyter Notebook 實例。點擊 "新建" 按鈕以創建筆記本。
![筆記本-2](../../../../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 配置和訓練
要設置 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 上部署並訓練的模型!
> **_NOTE:_** 完成專案後,別忘了刪除所有資源。
## 🚀 挑戰
透過 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,16 @@
# 使用 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:36:07+00:00",
"source_file": "5-Data-Science-In-Cloud/19-Azure/notebook.ipynb",
"language_code": "mo"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,25 @@
# 雲端中的數據科學
![cloud-picture](../../../translated_images/zh-MO/cloud-picture.f5526de3c6c6387b2d656ba94f019b3352e5e3854a78440e4fb00c93e2dea675.jpg)
> 圖片來源:[Jelleke Vanooteghem](https://unsplash.com/@ilumire) 來自 [Unsplash](https://unsplash.com/s/photos/cloud?orientation=landscape)
當涉及到使用大數據進行數據科學時,雲端可以成為改變遊戲規則的關鍵。在接下來的三節課中,我們將了解什麼是雲端以及為什麼它非常有用。我們還將探索一個心臟衰竭數據集,並建立一個模型來幫助評估某人發生心臟衰竭的可能性。我們將利用雲端的強大功能來訓練、部署和以兩種不同的方式使用模型。一種方式是僅使用用戶界面,以低代碼/無代碼的方式進行;另一種方式是使用 Azure Machine Learning Software Developer Kit (Azure ML SDK)。
![project-schema](../../../translated_images/zh-MO/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) 帶著☁️和💕撰寫。
心臟衰竭預測項目的數據來源於 [Larxel](https://www.kaggle.com/andrewmvd) 在 [Kaggle](https://www.kaggle.com/andrewmvd/heart-failure-clinical-data) 上提供的數據。該數據遵循 [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 @@
# 數據科學在現實世界中的應用
| ![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的速寫筆記](../../sketchnotes/20-DataScience-RealWorld.png) |
| :--------------------------------------------------------------------------------------------------------------: |
| 數據科學在現實世界中的應用 - _由 [@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) - 專注於_預測分析_團隊和球員分析例如 [Moneyball](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-MO/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)部分。
## 數據科學 + 研究
| ![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的速寫筆記](../../sketchnotes/20-DataScience-Research.png) |
| :---------------------------------------------------------------------------------------------------------------: |
| 數據科學與研究 - _由 [@nitya](https://twitter.com/nitya) 繪製的速寫筆記_ |
雖然現實世界的應用通常專注於行業中的大規模使用案例_研究_應用和項目可以從兩個角度提供價值
* _創新機會_ - 探索先進概念的快速原型設計以及下一代應用的用戶體驗測試。
* _部署挑戰_ - 調查數據科學技術在現實世界中的潛在危害或意外後果。
對於學生而言,這些研究項目既能提供學習機會,也能提供合作機會,幫助你加深對主題的理解,並擴展你與相關領域中工作的人或團隊的接觸和參與。那麼研究項目是什麼樣的?它們如何產生影響?
讓我們看一個例子——[MIT Gender Shades Study](http://gendershades.org/overview.html),由 Joy BuolamwiniMIT 媒體實驗室)進行,並與 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)倡議。
## 數據科學 + 人文
| ![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的速寫筆記](../../sketchnotes/20-DataScience-Humanities.png) |
| :---------------------------------------------------------------------------------------------------------------: |
| 數據科學與數字人文 - _由 [@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 和情感的韻律"](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)中的一些工具來進行這些探究。
## 數據科學 + 可持續性
| ![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的速寫筆記](../../sketchnotes/20-DataScience-Sustainability.png) |
| :---------------------------------------------------------------------------------------------------------------: |
| 數據科學與可持續性 - _由 [@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) - 提供數百萬兆字節的地球系統數據(免費且托管於 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 Project 目前處於預覽階段(截至 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,41 @@
# 探索行星電腦數據集
## 說明
在這節課中,我們討論了各種數據科學的應用領域,並深入探討了與研究、可持續性和數字人文相關的例子。在這次作業中,您將更詳細地探索其中一個例子,並應用您學到的有關數據可視化和分析的知識,從可持續性數據中獲取洞察。
[行星電腦](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-MO/planetary-computer-explorer.c1e95a9b053167d64e2e8e4347cfb689e47e2037c33103fc1bbea1a149d4f85b.png)
`您的任務:`
現在,研究瀏覽器中渲染的可視化,並回答以下問題:
* 該數據集有哪些_特徵_
* 該可視化提供了哪些_洞察_或結果
* 這些洞察對於該項目的可持續性目標有什麼_影響_
* 該可視化的_局限性_是什麼您未能獲得哪些洞察
* 如果您能獲取原始數據您會創建哪些_替代可視化_為什麼
`額外加分:`
申請一個帳戶——並在獲批後登錄。
* 使用 _Launch Hub_ 選項在Notebook中打開原始數據。
* 交互式地探索數據,並實現您想到的替代可視化。
* 現在分析您的自定義可視化——您是否能夠獲得之前錯過的洞察?
## 評分標準
優秀 | 合格 | 需要改進
--- | --- | -- |
回答了所有五個核心問題。學生清楚地指出了當前和替代可視化如何提供有關可持續性目標或結果的洞察。| 學生詳細回答了至少前三個問題表明他們對Explorer有實際操作經驗。| 學生未能回答多個問題,或提供的細節不足——表明未對該項目進行有意義的嘗試。 |
---
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解讀概不負責。

@ -0,0 +1,16 @@
# 野外數據科學
數據科學在各行各業中的實際應用。
### 主題
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 開始,最多 39共 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 代碼風格指南
- 使用清晰的變數名稱,解釋所分析的數據
- 在代碼單元之前包含帶有解釋的 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,14 @@
# 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/)。
欲了解更多資訊,請參閱 [行為準則 FAQ](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 和 Clone
1. **在 GitHub 上 Fork 此倉庫**
2. **在本地 Clone 您的 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. **運行 linter**
```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"
```
撰寫清晰的提交訊息:
- 使用現在式(例如 "Add feature" 而非 "Added feature"
- 使用命令式語氣(例如 "Move cursor to..." 而非 "Moves cursor to..."
- 第一行限制在 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] Fix Python notebook import error`
- `[Quiz App] Add German translation`
- `[Docs] Update README with new prerequisites`
- `[Fix] Correct data path in visualization lesson`
### PR 描述
在您的 PR 描述中包含:
- **What**:您做了哪些更改?
- **Why**:為什麼需要這些更改?
- **How**:您如何實現這些更改?
- **Testing**:您如何測試這些更改?
- **Screenshots**:對於視覺更改,請包含截圖
- **Related Issues**:連結相關問題(例如 "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-MO/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 機器人將自動判斷您是否需要提供 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 @@
# 資料科學初學者課程
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=344191198)
[![GitHub license](https://img.shields.io/github/license/microsoft/Data-Science-For-Beginners.svg)](https://github.com/microsoft/Data-Science-For-Beginners/blob/master/LICENSE)
[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/Data-Science-For-Beginners.svg)](https://GitHub.com/microsoft/Data-Science-For-Beginners/graphs/contributors/)
[![GitHub issues](https://img.shields.io/github/issues/microsoft/Data-Science-For-Beginners.svg)](https://GitHub.com/microsoft/Data-Science-For-Beginners/issues/)
[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/Data-Science-For-Beginners.svg)](https://GitHub.com/microsoft/Data-Science-For-Beginners/pulls/)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[![GitHub watchers](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 forks](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 stars](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 Cloud 擁護者很高興提供一個為期 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-MO/00-Title.8af36cd35da1ac55.webp)|
|:---:|
| 資料科學初學者 - _由 [@nitya](https://twitter.com/nitya) 繪製筆記_ |
### 🌐 多語言支援
#### 透過 GitHub Action 支援(自動且持續更新)
<!-- CO-OP TRANSLATOR LANGUAGES TABLE START -->
[Arabic](../ar/README.md) | [Bengali](../bn/README.md) | [Bulgarian](../bg/README.md) | [Burmese (Myanmar)](../my/README.md) | [Chinese (Simplified)](../zh-CN/README.md) | [Chinese (Traditional, Hong Kong)](../zh-HK/README.md) | [Chinese (Traditional, Macau)](./README.md) | [Chinese (Traditional, Taiwan)](../zh-TW/README.md) | [Croatian](../hr/README.md) | [Czech](../cs/README.md) | [Danish](../da/README.md) | [Dutch](../nl/README.md) | [Estonian](../et/README.md) | [Finnish](../fi/README.md) | [French](../fr/README.md) | [German](../de/README.md) | [Greek](../el/README.md) | [Hebrew](../he/README.md) | [Hindi](../hi/README.md) | [Hungarian](../hu/README.md) | [Indonesian](../id/README.md) | [Italian](../it/README.md) | [Japanese](../ja/README.md) | [Kannada](../kn/README.md) | [Korean](../ko/README.md) | [Lithuanian](../lt/README.md) | [Malay](../ms/README.md) | [Malayalam](../ml/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Nigerian Pidgin](../pcm/README.md) | [Norwegian](../no/README.md) | [Persian (Farsi)](../fa/README.md) | [Polish](../pl/README.md) | [Portuguese (Brazil)](../pt-BR/README.md) | [Portuguese (Portugal)](../pt-PT/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Romanian](../ro/README.md) | [Russian](../ru/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Slovak](../sk/README.md) | [Slovenian](../sl/README.md) | [Spanish](../es/README.md) | [Swahili](../sw/README.md) | [Swedish](../sv/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Tamil](../ta/README.md) | [Telugu](../te/README.md) | [Thai](../th/README.md) | [Turkish](../tr/README.md) | [Ukrainian](../uk/README.md) | [Urdu](../ur/README.md) | [Vietnamese](../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 -->
**若希望有其他語言支援,可參考此處列出的語言 [here](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 學習系列,更多詳情及參與請訪問 [Learn with AI Series](https://aka.ms/learnwithai/discord),活動期間為 2025 年 9 月 18 日至 30 日。你將學到使用 GitHub Copilot 進行資料科學的秘訣與技巧。
![Learn with AI series](../../translated_images/zh-MO/1.2b28cdc6205e26fe.webp)
# 你是學生嗎?
可以從以下資源開始:
- [學生中心頁面](https://docs.microsoft.com/en-gb/learn/student-hub?WT.mc_id=academic-77958-bethanycheum) 在此頁你會找到初學者資源、學生包甚至取得免費認證券的方法。這頁是你必須收藏並定期查看的,因為我們至少每月會更新內容。
- [Microsoft Learn 學生大使](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 資料夾能找到解答代碼。另一個方法是與朋友組成讀書會一起研讀內容。若想更進一步,我們推薦 [Microsoft Learn](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 "宣傳影片")
**Gif 由** [Mohit Jaisal](https://www.linkedin.com/in/mohitjaisal) 製作
> 🎥 點擊上方圖片觀看介紹這個專案及創作者的影片!
## 教學法
我們在設計這個課程時選擇了兩個教學原則:確保課程以專案為基礎,並包含頻繁的小測驗。在這個系列結束時,學生將學會基本的資料科學原理,包括倫理概念、資料準備、不同的資料處理方式、資料視覺化、資料分析、資料科學的實際應用案例等。
此外,課前的小測驗能設定學生學習主題的意圖,而課後的第二次測驗則有助於加深記憶。這套課程設計靈活有趣,可以全程或部分進行。專案從小型開始,隨著十週學習周期結束而漸趨複雜。
> 請參閱我們的 [行為準則](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-MO/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 | 處理非關聯式資料 | [資料處理](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 機器學習工作室部署模型。 | [課程](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. 點擊 Code 下拉選單並選擇 Open with Codespaces 選項。
2. 在窗格底部選擇 + New codespace。
更多資訊請參閱 [GitHub 文件](https://docs.github.com/en/codespaces/developing-in-codespaces/creating-a-codespace-for-a-repository#creating-a-codespace)。
## VSCode 遠端 - Containers
請依照下列步驟使用本機電腦與 VSCode 搭配 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/#/) 離線查看此文件。請先分叉此儲存庫,並在本機安裝 [Docsify](https://docsify.js.org/#/quickstart),然後在此儲存庫根目錄輸入 `docsify serve`。網站會在本機的 3000 端口啟動:`localhost:3000`。
> 注意,筆記本不會由 Docsify 呈現,因此要執行筆記本時請在 VS Code 中使用 Python 核心另行執行。
## 其他課程
我們團隊還有其他課程!請參考:
### 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 for Beginners](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 / Agents
[![AZD for Beginners](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 for Beginners](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 for Beginners](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 Agents for Beginners](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)
---
### Generative AI Series
[![Generative AI for Beginners](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)
[![Generative 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)
[![Generative 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)
[![Generative 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)
---
### Core Learning
[![ML for Beginners](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)
[![Data Science for Beginners](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)
[![AI for Beginners](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)
[![Cybersecurity for Beginners](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 Dev for Beginners](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)
[![IoT for Beginners](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 Development for Beginners](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 Series
[![Copilot for AI Paired Programming](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 for 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 Adventure](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 -->
## Getting Help
**遇到問題嗎?** 請參閱我們的[疑難排解指南](TROUBLESHOOTING.md)以獲得常見問題的解決方案。
如果您在構建 AI 應用時遇到困難或有任何疑問,歡迎加入其他學習者和有經驗的開發者的討論。這是一個支持性的社群,歡迎提問並自由分享知識。
[![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)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於確保準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為具權威性的資料來源。關於重要資訊,建議採用專業人工翻譯。我們不對因使用此翻譯而產生的任何誤解或誤釋承擔責任。
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,42 @@
## 安全性
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 Security Response Center (MSRC) 回報,網址為 [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report)。
如果您希望在不登入的情況下提交,請發送電子郵件至 [secure@microsoft.com](mailto:secure@microsoft.com)。如果可能,請使用我們的 PGP 金鑰加密您的訊息;您可以從 [Microsoft Security Response Center PGP Key 頁面](https://www.microsoft.com/en-us/msrc/pgp-key-msrc) 下載。
您應該在 24 小時內收到回覆。如果因某些原因未收到,請透過電子郵件跟進,以確保我們收到您的原始訊息。更多資訊請參閱 [microsoft.com/msrc](https://www.microsoft.com/msrc)。
請提供以下所需資訊(盡可能詳細),以幫助我們更好地了解問題的性質和範圍:
* 問題類型例如緩衝區溢位、SQL 注入、跨站腳本攻擊等)
* 與問題相關的原始檔案的完整路徑
* 受影響原始碼的位置(標籤/分支/提交或直接 URL
* 重現問題所需的任何特殊配置
* 重現問題的逐步指導
* 概念驗證或漏洞利用程式碼(如果可能)
* 問題的影響,包括攻擊者可能如何利用該問題
這些資訊將幫助我們更快速地處理您的報告。
如果您是為了漏洞賞金計劃而回報,提供更完整的報告可能有助於獲得更高的賞金獎勵。請造訪我們的 [Microsoft Bug Bounty Program](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,15 @@
# 支援
## 如何提交問題和獲取幫助
此專案使用 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 核心問題
**問題:** "Kernel not found" 或 "Kernel keeps dying"
**解決方法:**
```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 failed to load" 或保存錯誤
**解決方法:**
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. **重啟核心:** 核心菜單 → Restart
3. **檢查代碼中的無限循環**
4. **清除輸出:** Cell → All Output → Clear
### 圖表無法顯示
**問題:** `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
```
### 端口已被佔用
**問題:** "Port 8080 is already in use"
**解決方法:**
```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. **重啟核心並清除輸出**
- 核心 → Restart & Clear Output
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 Notebook](../..)
- [使用測驗應用程式](../..)
- [常見工作流程](../..)
- [自學者的提示](../..)
- [教師的提示](../..)
## 如何使用此課程
此課程設計靈活,可用於多種方式:
- **自學**:按照自己的速度獨立完成課程
- **課堂教學**:作為結構化課程進行指導教學
- **學習小組**:與同伴合作學習
- **工作坊形式**:密集的短期學習課程
## 使用課程
每節課遵循一致的結構以最大化學習效果:
### 課程結構
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 Notebook
### 啟動 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 討論](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 for Beginners](https://aka.ms/ai-beginners)
- [ML for Beginners](https://aka.ms/ml-beginners)
- [Web Dev for Beginners](https://aka.ms/webdev-beginners)
- [Generative AI for Beginners](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,31 @@
- 介紹
- [定義資料科學](../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 這個 repo。您需要為每一課創建一個 repo因此需要將每個資料夾提取到一個單獨的 repo 中。這樣,[GitHub Classroom](https://classroom.github.com/classrooms) 就能分別處理每一課。
這些[完整的指導說明](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/)將幫助您了解如何設置您的課堂。
## 直接使用這個 repo
如果您希望直接使用目前的 repo而不使用 GitHub Classroom也完全可以。您需要與學生溝通告訴他們要一起完成哪一課。
在線上課程形式(如 Zoom、Teams 或其他)中,您可以為測驗設置分組討論室,並指導學生準備學習。然後邀請學生參加測驗,並在特定時間將答案提交為 "issues"。如果您希望學生公開合作完成作業,也可以採用相同的方式。
如果您更喜歡較為私密的形式,可以要求學生逐課 fork 課程到他們自己的 GitHub 私人 repo並授予您訪問權限。這樣他們可以私下完成測驗和作業並通過 classroom repo 的 issues 提交給您。
在線課堂有許多不同的運作方式。請告訴我們哪種方式最適合您!
## 課程內容包括:
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) 到您的本地機器,然後在本地 repo 的根目錄中輸入 `docsify serve`。網站將在本地端的 3000 埠上運行:`localhost:3000`。
課程的離線友好版本將以獨立網頁形式打開https://localhost:3000
課程分為六個部分:
- 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,130 @@
# 測驗
這些測驗是數據科學課程的課前和課後測驗課程網址為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 儲存庫**
確保您的靜態網站應用程式程式碼位於您的 GitHub 儲存庫中。Fork 此儲存庫。
2. **建立 Azure 靜態網站應用程式**
- 建立一個 [Azure 帳戶](http://azure.microsoft.com)
- 前往 [Azure 入口網站](https://portal.azure.com)
- 點擊「建立資源」,搜尋「靜態網站應用程式」。
- 點擊「建立」。
3. **配置靜態網站應用程式**
- **基本設定**
- 訂閱:選擇您的 Azure 訂閱。
- 資源群組:建立一個新的資源群組或使用現有的資源群組。
- 名稱:為您的靜態網站應用程式提供一個名稱。
- 區域:選擇最接近使用者的區域。
- **部署詳細資訊**
- 原始碼選擇「GitHub」。
- GitHub 帳戶:授權 Azure 存取您的 GitHub 帳戶。
- 組織:選擇您的 GitHub 組織。
- 儲存庫:選擇包含靜態網站應用程式的儲存庫。
- 分支:選擇您要部署的分支。
- **建置詳細資訊**
- 建置預設值:選擇應用程式使用的框架(例如 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」標籤。
您應該會看到一個正在運行的工作流程。此工作流程將建置並部署您的靜態網站應用程式到 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 靜態網站應用程式文件](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,12 @@
在這裡找到所有的手繪筆記!
## 致謝
Nitya Narasimhan藝術家
![roadmap sketchnote](../../../translated_images/zh-MO/00-Roadmap.4905d6567dff47532b9bfb8e0b8980fc6b0b1292eebb24181c1a9753b33bc0f5.png)
---
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤讀概不負責。

@ -0,0 +1,422 @@
{
"1-Introduction/01-defining-data-science/README.md": {
"original_hash": "43212cc1ac137b7bb1dcfb37ca06b0f4",
"translation_date": "2025-10-25T18:41:02+00:00",
"source_file": "1-Introduction/01-defining-data-science/README.md",
"language_code": "zh-TW"
},
"1-Introduction/01-defining-data-science/assignment.md": {
"original_hash": "4e0f1773b9bee1be3b28f9fe2c71b3de",
"translation_date": "2025-08-25T16:56:10+00:00",
"source_file": "1-Introduction/01-defining-data-science/assignment.md",
"language_code": "zh-TW"
},
"1-Introduction/01-defining-data-science/solution/assignment.md": {
"original_hash": "a8f79b9c0484c35b4f26e8aec7fc4d56",
"translation_date": "2025-08-25T16:57:11+00:00",
"source_file": "1-Introduction/01-defining-data-science/solution/assignment.md",
"language_code": "zh-TW"
},
"1-Introduction/02-ethics/README.md": {
"original_hash": "58860ce9a4b8a564003d2752f7c72851",
"translation_date": "2025-10-03T16:09:59+00:00",
"source_file": "1-Introduction/02-ethics/README.md",
"language_code": "zh-TW"
},
"1-Introduction/02-ethics/assignment.md": {
"original_hash": "b588c0fc73014f52520c666efc3e0cc3",
"translation_date": "2025-08-25T16:49:23+00:00",
"source_file": "1-Introduction/02-ethics/assignment.md",
"language_code": "zh-TW"
},
"1-Introduction/03-defining-data/README.md": {
"original_hash": "12339119c0165da569a93ddba05f9339",
"translation_date": "2025-09-05T11:56:40+00:00",
"source_file": "1-Introduction/03-defining-data/README.md",
"language_code": "zh-TW"
},
"1-Introduction/03-defining-data/assignment.md": {
"original_hash": "2e5cacb967c1e9dfd07809bfc441a0b4",
"translation_date": "2025-08-25T17:01:08+00:00",
"source_file": "1-Introduction/03-defining-data/assignment.md",
"language_code": "zh-TW"
},
"1-Introduction/04-stats-and-probability/README.md": {
"original_hash": "ce95884566a74db72572cd51f0cb25ad",
"translation_date": "2025-09-06T13:07:57+00:00",
"source_file": "1-Introduction/04-stats-and-probability/README.md",
"language_code": "zh-TW"
},
"1-Introduction/04-stats-and-probability/assignment.md": {
"original_hash": "01d1b493e8b51a6ebb42524f6b1bcfff",
"translation_date": "2025-08-25T17:10:29+00:00",
"source_file": "1-Introduction/04-stats-and-probability/assignment.md",
"language_code": "zh-TW"
},
"1-Introduction/README.md": {
"original_hash": "696a8474a01054281704cbfb09148949",
"translation_date": "2025-08-25T16:38:06+00:00",
"source_file": "1-Introduction/README.md",
"language_code": "zh-TW"
},
"2-Working-With-Data/05-relational-databases/README.md": {
"original_hash": "11739c7b40e7c6b16ad29e3df4e65862",
"translation_date": "2025-12-19T10:48:40+00:00",
"source_file": "2-Working-With-Data/05-relational-databases/README.md",
"language_code": "zh-TW"
},
"2-Working-With-Data/05-relational-databases/assignment.md": {
"original_hash": "25b37acdfb2452917c1aa2e2ca44317a",
"translation_date": "2025-10-24T09:53:26+00:00",
"source_file": "2-Working-With-Data/05-relational-databases/assignment.md",
"language_code": "zh-TW"
},
"2-Working-With-Data/06-non-relational/README.md": {
"original_hash": "c182e87f9f80be7e7cdffc7b40bbfccf",
"translation_date": "2025-09-05T11:44:44+00:00",
"source_file": "2-Working-With-Data/06-non-relational/README.md",
"language_code": "zh-TW"
},
"2-Working-With-Data/06-non-relational/assignment.md": {
"original_hash": "f824bfdb8b12d33293913f76f5c787c5",
"translation_date": "2025-08-25T16:36:17+00:00",
"source_file": "2-Working-With-Data/06-non-relational/assignment.md",
"language_code": "zh-TW"
},
"2-Working-With-Data/07-python/README.md": {
"original_hash": "7bfec050f4717dcc2dfd028aca9d21f3",
"translation_date": "2025-09-06T15:29:13+00:00",
"source_file": "2-Working-With-Data/07-python/README.md",
"language_code": "zh-TW"
},
"2-Working-With-Data/07-python/assignment.md": {
"original_hash": "dc8f035ce92e4eaa078ab19caa68267a",
"translation_date": "2025-08-25T16:31:12+00:00",
"source_file": "2-Working-With-Data/07-python/assignment.md",
"language_code": "zh-TW"
},
"2-Working-With-Data/08-data-preparation/README.md": {
"original_hash": "1b560955ff39a2bcf2a049fce474a951",
"translation_date": "2025-09-05T11:46:51+00:00",
"source_file": "2-Working-With-Data/08-data-preparation/README.md",
"language_code": "zh-TW"
},
"2-Working-With-Data/08-data-preparation/assignment.md": {
"original_hash": "f9d5a7275e046223fa6474477674b810",
"translation_date": "2025-08-25T16:23:39+00:00",
"source_file": "2-Working-With-Data/08-data-preparation/assignment.md",
"language_code": "zh-TW"
},
"2-Working-With-Data/README.md": {
"original_hash": "abc3309ab41bc5a7846f70ee1a055838",
"translation_date": "2025-08-25T16:12:36+00:00",
"source_file": "2-Working-With-Data/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/09-visualization-quantities/README.md": {
"original_hash": "a49d78e32e280c410f04e5f2a2068e77",
"translation_date": "2025-09-05T11:51:12+00:00",
"source_file": "3-Data-Visualization/09-visualization-quantities/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/09-visualization-quantities/assignment.md": {
"original_hash": "ad163c4fda72c8278280b61cad317ff4",
"translation_date": "2025-08-25T18:39:22+00:00",
"source_file": "3-Data-Visualization/09-visualization-quantities/assignment.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/10-visualization-distributions/README.md": {
"original_hash": "80a20467e046d312809d008395051fc7",
"translation_date": "2025-09-05T11:52:50+00:00",
"source_file": "3-Data-Visualization/10-visualization-distributions/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/10-visualization-distributions/assignment.md": {
"original_hash": "40eeb9b9f94009c537c7811f9f27f037",
"translation_date": "2025-08-25T18:07:56+00:00",
"source_file": "3-Data-Visualization/10-visualization-distributions/assignment.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/11-visualization-proportions/README.md": {
"original_hash": "42119bcc97bee88254e381156d770f3c",
"translation_date": "2025-09-05T11:50:02+00:00",
"source_file": "3-Data-Visualization/11-visualization-proportions/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/11-visualization-proportions/assignment.md": {
"original_hash": "1e00fe6a244c2f8f9a794c862661dd4f",
"translation_date": "2025-08-25T18:43:07+00:00",
"source_file": "3-Data-Visualization/11-visualization-proportions/assignment.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/12-visualization-relationships/README.md": {
"original_hash": "0764fd4077f3f04a1d968ec371227744",
"translation_date": "2025-09-06T11:30:44+00:00",
"source_file": "3-Data-Visualization/12-visualization-relationships/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/12-visualization-relationships/assignment.md": {
"original_hash": "680419753c086eef51be86607c623945",
"translation_date": "2025-08-25T18:12:14+00:00",
"source_file": "3-Data-Visualization/12-visualization-relationships/assignment.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/13-meaningful-visualizations/README.md": {
"original_hash": "cfb068050337a36e348debaa502a24fa",
"translation_date": "2025-09-05T11:51:44+00:00",
"source_file": "3-Data-Visualization/13-meaningful-visualizations/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/13-meaningful-visualizations/assignment.md": {
"original_hash": "e56df4c0f49357e30ac8fc77aa439dd4",
"translation_date": "2025-08-25T18:02:45+00:00",
"source_file": "3-Data-Visualization/13-meaningful-visualizations/assignment.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/13-meaningful-visualizations/solution/README.md": {
"original_hash": "5c51a54dd89075a7a362890117b7ed9e",
"translation_date": "2025-08-25T18:04:06+00:00",
"source_file": "3-Data-Visualization/13-meaningful-visualizations/solution/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/13-meaningful-visualizations/starter/README.md": {
"original_hash": "5c51a54dd89075a7a362890117b7ed9e",
"translation_date": "2025-08-25T18:03:27+00:00",
"source_file": "3-Data-Visualization/13-meaningful-visualizations/starter/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/R/09-visualization-quantities/README.md": {
"original_hash": "22acf28f518a4769ea14fa42f4734b9f",
"translation_date": "2025-08-25T18:21:59+00:00",
"source_file": "3-Data-Visualization/R/09-visualization-quantities/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/R/09-visualization-quantities/assignment.md": {
"original_hash": "0ea21b6513df5ade7419c6b7d65f10b1",
"translation_date": "2025-08-25T18:25:56+00:00",
"source_file": "3-Data-Visualization/R/09-visualization-quantities/assignment.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/R/10-visualization-distributions/README.md": {
"original_hash": "ea67c0c40808fd723594de6896c37ccf",
"translation_date": "2025-08-25T18:13:08+00:00",
"source_file": "3-Data-Visualization/R/10-visualization-distributions/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/R/10-visualization-distributions/assignment.md": {
"original_hash": "a233d542512136c4dd29aad38ca0175f",
"translation_date": "2025-08-25T18:16:05+00:00",
"source_file": "3-Data-Visualization/R/10-visualization-distributions/assignment.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/R/11-visualization-proportions/README.md": {
"original_hash": "47028abaaafa2bcb1079702d20569066",
"translation_date": "2025-08-25T18:30:54+00:00",
"source_file": "3-Data-Visualization/R/11-visualization-proportions/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/R/12-visualization-relationships/README.md": {
"original_hash": "a33c5d4b4156a2b41788d8720b6f724c",
"translation_date": "2025-08-25T18:17:09+00:00",
"source_file": "3-Data-Visualization/R/12-visualization-relationships/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/R/13-meaningful-vizualizations/README.md": {
"original_hash": "b4039f1c76548d144a0aee0bf28304ec",
"translation_date": "2025-08-25T18:27:04+00:00",
"source_file": "3-Data-Visualization/R/13-meaningful-vizualizations/README.md",
"language_code": "zh-TW"
},
"3-Data-Visualization/README.md": {
"original_hash": "1441550a0d789796b2821e04f7f4cc94",
"translation_date": "2025-08-25T17:57:08+00:00",
"source_file": "3-Data-Visualization/README.md",
"language_code": "zh-TW"
},
"4-Data-Science-Lifecycle/14-Introduction/README.md": {
"original_hash": "07e12a25d20b8f191e3cb651c27fdb2b",
"translation_date": "2025-09-06T20:31:52+00:00",
"source_file": "4-Data-Science-Lifecycle/14-Introduction/README.md",
"language_code": "zh-TW"
},
"4-Data-Science-Lifecycle/14-Introduction/assignment.md": {
"original_hash": "564445c39ad29a491abcb9356fc4d47d",
"translation_date": "2025-08-25T17:44:43+00:00",
"source_file": "4-Data-Science-Lifecycle/14-Introduction/assignment.md",
"language_code": "zh-TW"
},
"4-Data-Science-Lifecycle/15-analyzing/README.md": {
"original_hash": "661dad02c3ac239644d34c1eb51e76f8",
"translation_date": "2025-09-06T20:31:37+00:00",
"source_file": "4-Data-Science-Lifecycle/15-analyzing/README.md",
"language_code": "zh-TW"
},
"4-Data-Science-Lifecycle/15-analyzing/assignment.md": {
"original_hash": "fcc7547171f4530f159676dd73ed772e",
"translation_date": "2025-08-25T17:47:50+00:00",
"source_file": "4-Data-Science-Lifecycle/15-analyzing/assignment.md",
"language_code": "zh-TW"
},
"4-Data-Science-Lifecycle/16-communication/README.md": {
"original_hash": "215a3254ba5a222a57c5bb0192cea8e3",
"translation_date": "2025-09-06T20:32:14+00:00",
"source_file": "4-Data-Science-Lifecycle/16-communication/README.md",
"language_code": "zh-TW"
},
"4-Data-Science-Lifecycle/16-communication/assignment.md": {
"original_hash": "8980d7efd101c82d6d6ffc3458214120",
"translation_date": "2025-08-25T17:56:17+00:00",
"source_file": "4-Data-Science-Lifecycle/16-communication/assignment.md",
"language_code": "zh-TW"
},
"4-Data-Science-Lifecycle/README.md": {
"original_hash": "dd173fd30fc039a7a299898920680723",
"translation_date": "2025-08-25T17:40:50+00:00",
"source_file": "4-Data-Science-Lifecycle/README.md",
"language_code": "zh-TW"
},
"5-Data-Science-In-Cloud/17-Introduction/README.md": {
"original_hash": "5f8e7cdefa096664ae86f795be571580",
"translation_date": "2025-09-05T11:43:34+00:00",
"source_file": "5-Data-Science-In-Cloud/17-Introduction/README.md",
"language_code": "zh-TW"
},
"5-Data-Science-In-Cloud/17-Introduction/assignment.md": {
"original_hash": "96f3696153d9ed54b19a1bb65438c104",
"translation_date": "2025-08-25T17:31:33+00:00",
"source_file": "5-Data-Science-In-Cloud/17-Introduction/assignment.md",
"language_code": "zh-TW"
},
"5-Data-Science-In-Cloud/18-Low-Code/README.md": {
"original_hash": "bd4da10766c64fce4294a98f6479dfb0",
"translation_date": "2025-09-05T11:42:24+00:00",
"source_file": "5-Data-Science-In-Cloud/18-Low-Code/README.md",
"language_code": "zh-TW"
},
"5-Data-Science-In-Cloud/18-Low-Code/assignment.md": {
"original_hash": "8fdc4a5fd9bc27a8d2ebef995dfbf73f",
"translation_date": "2025-08-25T17:26:57+00:00",
"source_file": "5-Data-Science-In-Cloud/18-Low-Code/assignment.md",
"language_code": "zh-TW"
},
"5-Data-Science-In-Cloud/19-Azure/README.md": {
"original_hash": "472d3fab1c5be50f387336e7a686dbe1",
"translation_date": "2025-09-05T11:44:00+00:00",
"source_file": "5-Data-Science-In-Cloud/19-Azure/README.md",
"language_code": "zh-TW"
},
"5-Data-Science-In-Cloud/19-Azure/assignment.md": {
"original_hash": "386efdbc19786951341f6956247ee990",
"translation_date": "2025-08-25T17:38:23+00:00",
"source_file": "5-Data-Science-In-Cloud/19-Azure/assignment.md",
"language_code": "zh-TW"
},
"5-Data-Science-In-Cloud/README.md": {
"original_hash": "8dfe141a0f46f7d253e07f74913c7f44",
"translation_date": "2025-08-25T17:19:23+00:00",
"source_file": "5-Data-Science-In-Cloud/README.md",
"language_code": "zh-TW"
},
"6-Data-Science-In-Wild/20-Real-World-Examples/README.md": {
"original_hash": "0f67a4139454816631526779a456b734",
"translation_date": "2025-09-06T18:18:34+00:00",
"source_file": "6-Data-Science-In-Wild/20-Real-World-Examples/README.md",
"language_code": "zh-TW"
},
"6-Data-Science-In-Wild/20-Real-World-Examples/assignment.md": {
"original_hash": "d1e05715f9d97de6c4f1fb0c5a4702c0",
"translation_date": "2025-08-25T17:18:12+00:00",
"source_file": "6-Data-Science-In-Wild/20-Real-World-Examples/assignment.md",
"language_code": "zh-TW"
},
"6-Data-Science-In-Wild/README.md": {
"original_hash": "07faf02ff163e609edf0b0308dc5d4e6",
"translation_date": "2025-08-25T17:11:59+00:00",
"source_file": "6-Data-Science-In-Wild/README.md",
"language_code": "zh-TW"
},
"AGENTS.md": {
"original_hash": "cc2e18ab65df63e75d3619c4752e9b22",
"translation_date": "2025-10-03T11:07:53+00:00",
"source_file": "AGENTS.md",
"language_code": "zh-TW"
},
"CODE_OF_CONDUCT.md": {
"original_hash": "c06b12caf3c901eb3156e3dd5b0aea56",
"translation_date": "2025-08-25T16:10:11+00:00",
"source_file": "CODE_OF_CONDUCT.md",
"language_code": "zh-TW"
},
"CONTRIBUTING.md": {
"original_hash": "10f86fb29b5407088445ac803b3d0ed1",
"translation_date": "2025-10-03T13:34:27+00:00",
"source_file": "CONTRIBUTING.md",
"language_code": "zh-TW"
},
"INSTALLATION.md": {
"original_hash": "a64d8afa22ffcc2016bb239188d6acb1",
"translation_date": "2025-10-03T15:16:49+00:00",
"source_file": "INSTALLATION.md",
"language_code": "zh-TW"
},
"README.md": {
"original_hash": "8ec92ecfeb14923af733851239552146",
"translation_date": "2026-01-30T01:19:54+00:00",
"source_file": "README.md",
"language_code": "zh-TW"
},
"SECURITY.md": {
"original_hash": "0d575483100c332b2dbaefef915bb3c4",
"translation_date": "2025-08-25T16:10:51+00:00",
"source_file": "SECURITY.md",
"language_code": "zh-TW"
},
"SUPPORT.md": {
"original_hash": "872be8bc1b93ef1dd9ac3d6e8f99f6ab",
"translation_date": "2025-08-25T16:08:12+00:00",
"source_file": "SUPPORT.md",
"language_code": "zh-TW"
},
"TROUBLESHOOTING.md": {
"original_hash": "93a6a8a8a209128cbfedcbc076ee21b0",
"translation_date": "2025-10-03T15:33:09+00:00",
"source_file": "TROUBLESHOOTING.md",
"language_code": "zh-TW"
},
"USAGE.md": {
"original_hash": "f546349678757508d69ce9e1d2688446",
"translation_date": "2025-10-03T14:56:08+00:00",
"source_file": "USAGE.md",
"language_code": "zh-TW"
},
"docs/_sidebar.md": {
"original_hash": "3767555b3cc28a2865c79202f4374204",
"translation_date": "2025-08-25T16:37:06+00:00",
"source_file": "docs/_sidebar.md",
"language_code": "zh-TW"
},
"examples/README.md": {
"original_hash": "9bef7fd96c8f262339933117d9b3e342",
"translation_date": "2025-10-03T12:58:06+00:00",
"source_file": "examples/README.md",
"language_code": "zh-TW"
},
"for-teachers.md": {
"original_hash": "f7440be10c17a8a9262713af3d2818a9",
"translation_date": "2025-09-06T19:53:32+00:00",
"source_file": "for-teachers.md",
"language_code": "zh-TW"
},
"quiz-app/README.md": {
"original_hash": "e92c33ea498915a13c9aec162616db18",
"translation_date": "2025-08-25T17:39:20+00:00",
"source_file": "quiz-app/README.md",
"language_code": "zh-TW"
},
"sketchnotes/README.md": {
"original_hash": "3a848466cb63aff1a93411affb152c2a",
"translation_date": "2025-08-25T17:11:25+00:00",
"source_file": "sketchnotes/README.md",
"language_code": "zh-TW"
}
}

@ -0,0 +1,167 @@
# 定義資料科學
| ![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的手繪筆記](../../sketchnotes/01-Definitions.png) |
| :----------------------------------------------------------------------------------------------------: |
| 資料科學的定義 - _由 [@nitya](https://twitter.com/nitya) 繪製的手繪筆記_ |
---
[![資料科學定義影片](../../../../translated_images/zh-TW/video-def-ds.6623ee2392ef1abf6d7faf3fad10a4163642811749da75f44e35a5bb121de15c.png)](https://youtu.be/beZ7Mb_oz9I)
## [課前測驗](https://ff-quizzes.netlify.app/en/ds/quiz/0)
## 什麼是資料?
在我們的日常生活中,我們不斷被資料包圍著。你現在正在閱讀的文字就是資料。你智慧型手機中朋友的電話號碼列表是資料,手錶上顯示的當前時間也是資料。作為人類,我們自然地與資料互動,例如計算我們擁有的金錢或寫信給朋友。
然而,隨著電腦的誕生,資料變得更加重要。電腦的主要功能是進行計算,但它們需要資料來操作。因此,我們需要了解電腦如何存儲和處理資料。
隨著網際網路的出現,電腦作為資料處理設備的角色更加重要。如果仔細想想,我們現在使用電腦更多是用於資料處理和通信,而不是進行實際的計算。當我們寫電子郵件給朋友或在網際網路上搜尋資訊時,我們本質上是在創建、存儲、傳輸和操作資料。
> 你能記得上一次真正用電腦進行計算是什麼時候嗎?
## 什麼是資料科學?
在 [維基百科](https://en.wikipedia.org/wiki/Data_science) 中,**資料科學**被定義為 *一個科學領域,使用科學方法從結構化和非結構化資料中提取知識和洞察,並將資料中的知識和可行洞察應用於廣泛的應用領域*
這個定義突出了資料科學的以下重要方面:
* 資料科學的主要目標是從資料中**提取知識**,換句話說,就是**理解**資料,找到一些隱藏的關係並建立**模型**。
* 資料科學使用**科學方法**,例如概率和統計。事實上,當*資料科學*這個術語首次被提出時,有些人認為資料科學只是統計學的一個新潮名稱。如今,顯然這個領域要廣泛得多。
* 獲得的知識應用於產生一些**可行的洞察**,即可以應用於實際商業情境的實用洞察。
* 我們應能操作**結構化**和**非結構化**資料。我們稍後會在課程中討論不同類型的資料。
* **應用領域**是一個重要概念,資料科學家通常需要在問題領域中至少具備一定程度的專業知識,例如:金融、醫學、行銷等。
> 資料科學的另一個重要方面是研究如何使用電腦收集、存儲和操作資料。雖然統計學為我們提供了數學基礎,資料科學則應用數學概念來實際從資料中獲得洞察。
根據 [Jim Gray](https://en.wikipedia.org/wiki/Jim_Gray_(computer_scientist)) 的說法,資料科學可以被視為一種獨立的科學範式:
* **實證科學**,主要依賴觀察和實驗結果
* **理論科學**,從現有科學知識中產生新概念
* **計算科學**,基於一些計算實驗發現新原則
* **資料驅動科學**,基於發現資料中的關係和模式
## 其他相關領域
由於資料無處不在,資料科學本身也是一個廣泛的領域,涉及許多其他學科。
<dl>
<dt>資料庫</dt>
<dd>
一個重要的考量是<b>如何存儲</b>資料,也就是如何以允許更快處理的方式結構化資料。有不同類型的資料庫可以存儲結構化和非結構化資料,這些我們會在<a href="../../2-Working-With-Data/README.md">課程中進一步探討</a>
</dd>
<dt>大數據</dt>
<dd>
我們經常需要存儲和處理結構相對簡單但數量非常龐大的資料。有一些特殊的方法和工具可以將這些資料分散存儲在計算機集群中,並高效地進行處理。
</dd>
<dt>機器學習</dt>
<dd>
理解資料的一種方法是<b>建立模型</b>,該模型能夠預測所需的結果。從資料中開發模型被稱為<b>機器學習</b>。你可以查看我們的<a href="https://aka.ms/ml-beginners">機器學習初學者課程</a>以了解更多。
</dd>
<dt>人工智慧</dt>
<dd>
機器學習的一個分支領域稱為人工智慧AI它也依賴於資料並涉及建立模仿人類思維過程的高複雜度模型。AI方法通常能夠將非結構化資料例如自然語言轉化為結構化洞察。
</dd>
<dt>視覺化</dt>
<dd>
大量的資料對人類來說是難以理解的,但一旦我們使用這些資料創建有用的視覺化,我們就能更好地理解資料並得出一些結論。因此,了解多種視覺化資訊的方法非常重要——這是我們在<a href="../../3-Data-Visualization/README.md">課程第三部分</a>中會涵蓋的內容。相關領域還包括<b>資訊圖表</b><b>人機互動</b>
</dd>
</dl>
## 資料的類型
如我們之前提到的,資料無處不在。我們只需要以正確的方式捕捉它!區分**結構化**和**非結構化**資料是很有用的。前者通常以某種良好結構化的形式表示,通常是表格或多個表格,而後者則僅僅是文件的集合。有時我們也可以談論**半結構化**資料,它具有某種結構,但可能差異很大。
| 結構化 | 半結構化 | 非結構化 |
| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | --------------------------------------- |
| 人員及其電話號碼的列表 | 帶有連結的維基百科頁面 | 《大英百科全書》的文字 |
| 過去20年中每分鐘建築物所有房間的溫度 | 以JSON格式存儲的科學論文集合包括作者、出版日期和摘要 | 公司文件的文件共享 |
| 進入建築物的所有人的年齡和性別資料 | 網頁 | 監控攝像機的原始視頻流 |
## 資料的來源
資料的來源有很多,列舉所有來源是不可能的!然而,我們可以提到一些典型的資料來源:
* **結構化**
- **物聯網**IoT包括來自不同感測器如溫度或壓力感測器的資料提供了許多有用的資料。例如如果辦公樓配備了物聯網感測器我們可以自動控制供暖和照明以降低成本。
- **調查問卷**,例如在購物後或訪問網站後要求用戶完成的問卷。
- **行為分析**,例如幫助我們了解用戶瀏覽網站的深度以及離開網站的典型原因。
* **非結構化**
- **文字**可以是豐富的洞察來源,例如整體**情感分數**,或提取關鍵字和語義含義。
- **圖片**或**視頻**。監控攝像機的視頻可以用來估算道路上的交通流量,並通知人們可能的交通堵塞。
- 網頁伺服器的**日誌**可以用來了解我們網站的哪些頁面最常被訪問,以及訪問的時長。
* **半結構化**
- **社交網絡**圖表可以是用戶個性和信息傳播潛力的絕佳資料來源。
- 當我們擁有一堆派對照片時,我們可以嘗試通過建立人們互相拍照的圖表來提取**群體動態**資料。
了解不同的資料來源後,你可以嘗試思考不同的情境,應用資料科學技術來更好地了解情況並改善業務流程。
## 資料的用途
在資料科學中,我們專注於資料旅程的以下步驟:
<dl>
<dt>1) 資料獲取</dt>
<dd>
第一步是收集資料。雖然在許多情況下這可能是一個簡單的過程例如資料從網頁應用程式進入資料庫但有時我們需要使用特殊技術。例如來自物聯網感測器的資料可能過於龐大使用像IoT Hub這樣的緩衝端點來收集所有資料以進行後續處理是一個好方法。
</dd>
<dt>2) 資料存儲</dt>
<dd>
存儲資料可能具有挑戰性,特別是當我們談論大數據時。在決定如何存儲資料時,考慮未來希望如何查詢資料是有意義的。資料可以通過以下幾種方式存儲:
<ul>
<li>關聯式資料庫存儲表格集合並使用一種名為SQL的特殊語言來查詢它們。通常表格被組織到不同的組中稱為模式。在許多情況下我們需要將資料從原始形式轉換為適合模式的形式。</li>
<li><a href="https://en.wikipedia.org/wiki/NoSQL">NoSQL</a>資料庫,例如<a href="https://azure.microsoft.com/services/cosmos-db/?WT.mc_id=academic-77958-bethanycheum">CosmosDB</a>不對資料強制執行模式並允許存儲更複雜的資料例如分層的JSON文件或圖表。然而NoSQL資料庫沒有SQL的豐富查詢功能並且無法強制執行參考完整性即表格結構和表格之間關係的規則。</li>
<li><a href="https://en.wikipedia.org/wiki/Data_lake">資料湖</a>存儲用於以原始、非結構化形式存儲大量資料。資料湖通常用於大數據,當所有資料無法容納在一台機器上時,必須由伺服器集群存儲和處理。<a href="https://en.wikipedia.org/wiki/Apache_Parquet">Parquet</a>是通常與大數據一起使用的資料格式。</li>
</ul>
</dd>
<dt>3) 資料處理</dt>
<dd>
這是資料旅程中最令人興奮的部分,涉及將資料從原始形式轉換為可用於視覺化/模型訓練的形式。當處理非結構化資料如文字或圖片我們可能需要使用一些AI技術來提取<b>特徵</b>,從而將其轉換為結構化形式。
</dd>
<dt>4) 視覺化 / 人類洞察</dt>
<dd>
為了理解資料,我們通常需要對其進行視覺化。擁有多種視覺化技術,我們可以找到合適的方式來獲得洞察。通常,資料科學家需要“玩轉資料”,多次進行視覺化並尋找一些關係。此外,我們可能使用統計技術來測試假設或證明不同資料之間的相關性。
</dd>
<dt>5) 訓練預測模型</dt>
<dd>
由於資料科學的最終目標是能夠根據資料做出決策,我們可能希望使用<a href="http://github.com/microsoft/ml-for-beginners">機器學習</a>技術來建立預測模型。然後,我們可以使用這些模型對具有相似結構的新資料集進行預測。
</dd>
</dl>
當然,根據實際資料的不同,有些步驟可能會缺失(例如,當我們已經在資料庫中擁有資料,或者當我們不需要模型訓練時),或者有些步驟可能會重複多次(例如資料處理)。
## 數位化與數位轉型
在過去的十年中,許多企業開始理解在做出商業決策時資料的重要性。要將資料科學原則應用於企業運營,首先需要收集一些資料,也就是將業務流程轉化為數位形式。這被稱為**數位化**。將資料科學技術應用於這些資料以指導決策,可以顯著提高生產力(甚至是業務轉型),這被稱為**數位轉型**。
讓我們來看一個例子。假設我們有一門資料科學課程(像這門課程),我們在線上向學生提供,並希望利用資料科學來改進它。我們該怎麼做?
我們可以先問自己“什麼可以數位化?”最簡單的方法是測量每位學生完成每個模組所需的時間,並通過在每個模組結束時進行選擇題測試來測量所獲得的知識。通過計算所有學生的平均完成時間,我們可以找出哪些模組對學生來說最具挑戰性,並著手簡化它們。
> 您可能會認為這種方法並不理想,因為模組的長度可能不同。或許更公平的做法是將時間除以模組的長度(以字元數計算),然後比較這些值。
當我們開始分析多選測驗的結果時,可以嘗試找出學生難以理解的概念,並利用這些資訊來改進內容。為了做到這一點,我們需要設計測驗,使每個問題都能對應到某個特定的概念或知識塊。
如果我們想進一步深入分析,可以將每個模組所需的時間與學生的年齡類別進行對比。我們可能會發現某些年齡層完成模組所需的時間過長,或者學生在完成模組之前就中途退出。這可以幫助我們為模組提供年齡建議,並減少因錯誤期望而導致的不滿。
## 🚀 挑戰
在這次挑戰中,我們將嘗試通過分析文本來找出與資料科學領域相關的概念。我們將選取一篇關於資料科學的維基百科文章,下載並處理文本,然後建立一個像這樣的文字雲:
![資料科學文字雲](../../../../translated_images/zh-TW/ds_wordcloud.664a7c07dca57de017c22bf0498cb40f898d48aa85b3c36a80620fea12fadd42.png)
請訪問 [`notebook.ipynb`](../../../../1-Introduction/01-defining-data-science/notebook.ipynb ':ignore') 閱讀程式碼。您也可以執行程式碼,並即時查看它如何進行所有的資料轉換。
> 如果您不知道如何在 Jupyter Notebook 中執行程式碼,可以查看 [這篇文章](https://soshnikov.com/education/how-to-execute-notebooks-from-github/)。
## [課後測驗](https://ff-quizzes.netlify.app/en/ds/quiz/1)
## 作業
* **任務 1**:修改上述程式碼,找出與 **大數據** 和 **機器學習** 領域相關的概念
* **任務 2**[思考資料科學場景](assignment.md)
## 致謝
本課程由 [Dmitry Soshnikov](http://soshnikov.com) 用 ♥️ 編寫。
---
**免責聲明**
本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或誤釋不承擔責任。

@ -0,0 +1,35 @@
# 作業:數據科學場景
在這份首次作業中,我們希望你思考一些現實生活中的流程或問題,涵蓋不同的問題領域,並考慮如何使用數據科學流程來改進它們。請思考以下問題:
1. 你可以收集哪些數據?
1. 你會如何收集這些數據?
1. 你會如何存儲這些數據?這些數據的規模可能有多大?
1. 你可能從這些數據中獲得哪些洞察?基於這些數據,我們可以做出哪些決策?
試著思考三個不同的問題/流程,並針對每個問題領域描述上述每一點。
以下是一些可以幫助你開始思考的問題領域和問題:
1. 你如何使用數據來改進學校中兒童的教育流程?
1. 你如何使用數據來控制疫情期間的疫苗接種?
1. 你如何使用數據來確保自己在工作中保持高效?
## 指導說明
填寫以下表格(如果需要,可以用你自己的問題領域替換建議的問題領域):
| 問題領域 | 問題 | 收集哪些數據 | 如何存儲數據 | 我們可以做出的洞察/決策 |
|----------|------|--------------|--------------|--------------------------|
| 教育 | | | | |
| 疫苗接種 | | | | |
| 生產力 | | | | |
## 評分標準
優秀 | 合格 | 需要改進
--- | --- | -- |
能夠為所有問題領域識別出合理的數據來源、數據存儲方式以及可能的決策/洞察 | 解決方案的某些方面未詳細說明,未討論數據存儲,至少描述了兩個問題領域 | 僅描述了部分數據解決方案,僅考慮了一個問題領域。
**免責聲明**
本文件使用 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,37 @@
# 作業:數據科學情境
在這次的作業中,我們希望你思考一些現實生活中的流程或問題,涵蓋不同的問題領域,並考慮如何利用數據科學流程來改進它們。請思考以下問題:
1. 你可以收集哪些數據?
1. 你會如何收集這些數據?
1. 你會如何儲存這些數據?這些數據的規模可能有多大?
1. 你可能從這些數據中獲得哪些洞察?我們可以根據這些數據做出哪些決策?
試著思考三個不同的問題/流程,並針對每個問題領域描述上述每一點。
以下是一些問題領域和問題,幫助你開始思考:
1. 如何利用數據改進學校中兒童的教育流程?
1. 如何利用數據在疫情期間控制疫苗接種?
1. 如何利用數據確保自己在工作中保持高效?
## 指導說明
請填寫以下表格(如果需要,可以用自己的問題領域替代建議的問題領域):
| 問題領域 | 問題 | 收集哪些數據 | 如何儲存數據 | 我們可以做出的洞察/決策 |
|----------|------|--------------|--------------|--------------------------|
| 教育 | 在大學中,我們通常發現課堂出勤率較低,我們假設出勤率較高的學生在考試中的表現會更好。我們希望提高出勤率並驗證這一假設。 | 我們可以通過課堂上的監控攝像頭拍攝的照片來追蹤出勤率,或者通過追蹤學生手機的藍牙/WiFi 地址來記錄出勤情況。考試數據已經存儲在大學的數據庫中。 | 如果我們追蹤監控攝像頭的圖像我們需要儲存一些5-10 張)課堂期間的照片(非結構化數據),然後使用 AI 識別學生的臉部(將數據轉換為結構化形式)。 | 我們可以計算每位學生的平均出勤率,並查看是否與考試成績有任何相關性。我們會在[概率與統計](../../04-stats-and-probability/README.md)部分進一步討論相關性。為了提高學生的出勤率,我們可以在學校門戶網站上發布每週出勤排名,並在出勤率最高的學生中抽獎。 |
| 疫苗接種 | | | | |
| 生產力 | | | | |
> *我們提供了一個答案作為範例,讓你了解這次作業的期望。*
## 評分標準
優秀 | 合格 | 需要改進
--- | --- | -- |
能夠為所有問題領域識別出合理的數據來源、數據儲存方式以及可能的決策/洞察 | 解決方案的某些方面不夠詳細,未討論數據儲存,至少描述了 2 個問題領域 | 僅描述了部分數據解決方案,僅考慮了一個問題領域。
**免責聲明**
本文件使用 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,259 @@
# 資料倫理概論
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的速寫筆記](../../sketchnotes/02-Ethics.png)|
|:---:|
| 資料科學倫理 - _由 [@nitya](https://twitter.com/nitya) 繪製的速寫筆記_ |
---
我們都是生活在數據化世界中的數據公民。
市場趨勢顯示到2022年三分之一的大型組織將通過線上[市場和交易所](https://www.gartner.com/smarterwithgartner/gartner-top-10-trends-in-data-and-analytics-for-2020/)購買和出售其數據。作為**應用程式開發者**,我們將更容易且更便宜地將數據驅動的洞察力和算法驅動的自動化整合到日常用戶體驗中。但隨著人工智慧的普及,我們也需要了解這些算法在大規模應用中可能造成的[武器化](https://www.youtube.com/watch?v=TQHs8SA1qpk)危害。
趨勢顯示到2025年我們將生成和消耗超過[180澤字節](https://www.statista.com/statistics/871513/worldwide-data-created/)的數據。對於**數據科學家**而言,這種信息爆炸提供了前所未有的個人和行為數據的訪問權。這使得建立詳細的用戶檔案並微妙地影響決策成為可能——通常以促進[自由選擇的幻覺](https://www.datasciencecentral.com/the-pareto-set-and-the-paradox-of-choice/)的方式進行。雖然這可以用來引導用戶朝向偏好的結果,但也引發了關於數據隱私、自主性以及算法影響的倫理界限的關鍵問題。
資料倫理現在是數據科學和工程的_必要防護措施_幫助我們減少數據驅動行動可能帶來的潛在危害和意外後果。[Gartner人工智慧技術成熟度曲線](https://www.gartner.com/smarterwithgartner/2-megatrends-dominate-the-gartner-hype-cycle-for-artificial-intelligence-2020/)指出數字倫理、負責任的人工智慧以及人工智慧治理是推動人工智慧_民主化_和_工業化_的主要趨勢。
![Gartner 2020年人工智慧技術成熟度曲線](https://images-cdn.newscred.com/Zz1mOWJhNzlkNDA2ZTMxMWViYjRiOGFiM2IyMjQ1YmMwZQ==)
在本課程中,我們將探索資料倫理這個迷人的領域——從核心概念和挑戰,到案例研究以及應用人工智慧概念(如治理),幫助在處理數據和人工智慧的團隊和組織中建立倫理文化。
## [課前測驗](https://ff-quizzes.netlify.app/en/ds/quiz/2) 🎯
## 基本定義
讓我們先了解一些基本術語。
「倫理」一詞源自[希臘詞 "ethikos"](https://en.wikipedia.org/wiki/Ethics)(及其根源 "ethos"意為_品格或道德本質_。
**倫理**是指在社會中規範我們行為的共同價值觀和道德原則。倫理並非基於法律,而是基於廣泛接受的「對與錯」的規範。然而,倫理考量可以影響企業治理倡議和政府法規,從而創造更多遵從的激勵措施。
**資料倫理**是一個[新的倫理分支](https://royalsocietypublishing.org/doi/full/10.1098/rsta.2016.0360#sec-1)研究和評估與_數據、算法及相關實踐_相關的道德問題。在這裡**「數據」**側重於生成、記錄、策劃、處理、傳播、共享和使用的行動,**「算法」**側重於人工智慧、代理、機器學習和機器人,**「實踐」**則側重於負責任的創新、編程、駭客行為以及倫理守則等主題。
**應用倫理**是[道德考量的實際應用](https://en.wikipedia.org/wiki/Applied_ethics)。它是積極調查_現實世界行動、產品和流程_中的倫理問題並採取糾正措施以確保這些行動與我們定義的倫理價值保持一致的過程。
**倫理文化**是關於[將應用倫理_付諸實踐_](https://hbr.org/2019/05/how-to-design-an-ethical-organization),以確保我們的倫理原則和實踐在整個組織中以一致且可擴展的方式被採用。成功的倫理文化定義了全組織範圍的倫理原則,提供有意義的遵從激勵措施,並通過鼓勵和放大期望的行為來加強每個層級的倫理規範。
## 倫理概念
在本節中,我們將討論**共同價值觀**(原則)和**倫理挑戰**(問題)等資料倫理概念,並探索**案例研究**,幫助您在現實世界的背景中理解這些概念。
### 1. 倫理原則
每個資料倫理策略都始於定義_倫理原則_——描述可接受行為並指導合規行動的「共同價值觀」用於我們的數據和人工智慧項目。您可以在個人或團隊層面定義這些原則。然而大多數大型組織會在企業層面定義這些原則並在所有團隊中一致執行通常以_倫理人工智慧_使命聲明或框架的形式呈現。
**範例:** 微軟的[負責任人工智慧](https://www.microsoft.com/en-us/ai/responsible-ai)使命聲明寫道_「我們致力於推動以倫理原則為基礎的人工智慧將人放在首位」_並在以下框架中確定了六個倫理原則
![微軟的負責任人工智慧](https://docs.microsoft.com/en-gb/azure/cognitive-services/personalizer/media/ethics-and-responsible-use/ai-values-future-computed.png)
讓我們簡要探討這些原則。_透明性_和_問責性_是其他原則的基礎價值觀因此我們從這裡開始
* [**問責性**](https://www.microsoft.com/en-us/ai/responsible-ai?activetab=pivot1:primaryr6)使實踐者對其數據和人工智慧操作以及遵守這些倫理原則負責。
* [**透明性**](https://www.microsoft.com/en-us/ai/responsible-ai?activetab=pivot1:primaryr6)確保數據和人工智慧行動對用戶是_可理解的_可解釋的並解釋決策背後的原因。
* [**公平性**](https://www.microsoft.com/en-us/ai/responsible-ai?activetab=pivot1%3aprimaryr6)——確保人工智慧公平對待_所有人_解決數據和系統中的任何系統性或隱性社會技術偏見。
* [**可靠性與安全性**](https://www.microsoft.com/en-us/ai/responsible-ai?activetab=pivot1:primaryr6)——確保人工智慧以_一致性_的方式行事並減少潛在危害或意外後果。
* [**隱私與安全**](https://www.microsoft.com/en-us/ai/responsible-ai?activetab=pivot1:primaryr6)——了解數據的來源並為用戶提供_數據隱私及相關保護_。
* [**包容性**](https://www.microsoft.com/en-us/ai/responsible-ai?activetab=pivot1:primaryr6)——有意設計人工智慧解決方案並使其適應_廣泛的人類需求_和能力。
> 🚨 想一想您的資料倫理使命聲明可能是什麼。探索其他組織的倫理人工智慧框架——以下是[IBM](https://www.ibm.com/cloud/learn/ai-ethics)、[Google](https://ai.google/principles)和[Facebook](https://ai.facebook.com/blog/facebooks-five-pillars-of-responsible-ai/)的範例。他們有哪些共同的價值觀?這些原則如何與他們所運營的人工智慧產品或行業相關?
### 2. 倫理挑戰
一旦我們定義了倫理原則下一步就是評估我們的數據和人工智慧行動是否符合這些共同價值觀。思考您的行動可以分為兩類_數據收集_和_算法設計_。
在數據收集方面,行動可能涉及**個人數據**或可識別的個人信息PII這些信息可以識別特定的活人。這包括[多樣化的非個人數據項目](https://ec.europa.eu/info/law/law-topic/data-protection/reform/what-personal-data_en)這些數據_共同_識別一個人。倫理挑戰可能涉及_數據隱私_、_數據所有權_以及相關主題如_知情同意_和_知識產權_。
在算法設計方面,行動將涉及收集和策劃**數據集**,然後使用它們來訓練和部署**數據模型**以在現實世界的背景中預測結果或自動化決策。倫理挑戰可能源於_數據集偏差_、_數據質量_問題、_不公平性_以及算法中的_誤導性_——包括一些系統性問題。
在這兩種情況下,倫理挑戰突出了我們的行動可能與共同價值觀發生衝突的領域。為了檢測、緩解、最小化或消除這些問題,我們需要針對行動提出道德的「是/否」問題,然後根據需要採取糾正措施。讓我們來看看一些倫理挑戰及其引發的道德問題:
#### 2.1 數據所有權
數據收集通常涉及可以識別數據主體的個人數據。[數據所有權](https://permission.io/blog/data-ownership)是關於與數據的創建、處理和傳播相關的_控制_和[_用戶權利_](https://permission.io/blog/data-ownership)。
需要提出的道德問題包括:
* 誰擁有數據?(用戶或組織)
* 數據主體擁有哪些權利?(例如:訪問、刪除、可攜性)
* 組織擁有哪些權利?(例如:糾正惡意用戶評論)
#### 2.2 知情同意
[知情同意](https://legaldictionary.net/informed-consent/)指的是用戶在充分了解相關事實(包括目的、潛在風險和替代方案)的情況下同意某項行動(如數據收集)。
需要探討的問題包括:
* 用戶(數據主體)是否允許數據的捕獲和使用?
* 用戶是否理解捕獲數據的目的?
* 用戶是否理解參與可能帶來的潛在風險?
#### 2.3 知識產權
[知識產權](https://en.wikipedia.org/wiki/Intellectual_property)指的是由人類創造的無形產物可能對個人或企業具有_經濟價值_。
需要探討的問題包括:
* 收集的數據是否對用戶或企業具有經濟價值?
* **用戶**是否擁有知識產權?
* **組織**是否擁有知識產權?
* 如果這些權利存在,我們如何保護它們?
#### 2.4 數據隱私
[數據隱私](https://www.northeastern.edu/graduate/blog/what-is-data-privacy/)或信息隱私指的是保護用戶隱私和身份,特別是與可識別的個人信息相關的隱私。
需要探討的問題包括:
* 用戶的(個人)數據是否安全,防止駭客攻擊和洩漏?
* 用戶的數據是否僅在授權的用戶和上下文中可訪問?
* 用戶的匿名性是否在數據共享或傳播時得到保護?
* 用戶是否可以從匿名數據集中被去識別?
#### 2.5 被遺忘的權利
[被遺忘的權利](https://en.wikipedia.org/wiki/Right_to_be_forgotten)或[刪除權](https://www.gdpreu.org/right-to-be-forgotten/)為用戶提供額外的個人數據保護。具體而言,它允許用戶在特定情況下請求刪除或移除個人數據,從而在網上獲得新的開始,不再因過去的行為而受到影響。
需要探討的問題包括:
* 系統是否允許數據主體請求刪除?
* 用戶撤回同意是否應觸發自動刪除?
* 數據是否在未經同意或非法手段下被收集?
* 我們是否符合政府對數據隱私的法規?
#### 2.6 數據集偏差
數據集或[收集偏差](http://researcharticles.com/index.php/bias-in-data-collection-in-research/)指的是選擇_非代表性_的數據子集進行算法開發可能導致對不同群體的結果不公平。偏差類型包括選擇或抽樣偏差、志願者偏差和工具偏差。
需要探討的問題包括:
* 我們是否招募了代表性數據主體?
* 我們是否測試了收集或策劃的數據集以檢測各種偏差?
* 我們是否能緩解或消除發現的偏差?
#### 2.7 數據質量
[數據質量](https://lakefs.io/data-quality-testing/)檢查用於開發算法的策劃數據集的有效性,確保特徵和記錄符合人工智慧目的所需的準確性和一致性要求。
需要探討的問題包括:
* 我們是否捕獲了適合我們使用案例的有效_特徵_
* 數據是否在不同數據來源中_一致地_捕獲
* 數據集是否在不同條件或場景下_完整_
* 是否能準確地反映現實中的資訊?
#### 2.8 演算法公平性
[演算法公平性](https://towardsdatascience.com/what-is-algorithm-fairness-3182e161cf9f)檢查演算法設計是否系統性地對特定數據群體造成歧視,導致在資源分配(例如拒絕或扣留資源)和服務品質(例如 AI 對某些群體的準確性低於其他群體)方面的[潛在傷害](https://docs.microsoft.com/en-us/azure/machine-learning/concept-fairness-ml)。
需要探討的問題包括:
* 我們是否評估了模型在不同群體和條件下的準確性?
* 我們是否仔細檢查系統可能造成的傷害(例如刻板印象)?
* 我們是否能修正數據或重新訓練模型以減輕已識別的傷害?
探索像[AI 公平性檢查清單](https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RE4t6dA)等資源以了解更多。
#### 2.9 錯誤呈現
[數據錯誤呈現](https://www.sciencedirect.com/topics/computer-science/misrepresentation)探討我們是否以欺騙方式傳達從誠實報告的數據中得出的洞察,以支持某種期望的敘述。
需要探討的問題包括:
* 我們是否報告了不完整或不準確的數據?
* 我們是否以誤導性結論的方式可視化數據?
* 我們是否使用選擇性統計技術操縱結果?
* 是否存在可能提供不同結論的替代解釋?
#### 2.10 自由選擇
[自由選擇的假象](https://www.datasciencecentral.com/profiles/blogs/the-illusion-of-choice)發生在系統的「選擇架構」使用決策演算法引導人們選擇偏好的結果,同時看似給予他們選擇和控制權。這些[黑暗模式](https://www.darkpatterns.org/)可能對用戶造成社會和經濟上的傷害。由於用戶的決策會影響行為檔案,這些行動可能驅動未來的選擇,進一步放大或延伸這些傷害的影響。
需要探討的問題包括:
* 用戶是否理解做出該選擇的影響?
* 用戶是否了解(替代)選擇及其各自的優缺點?
* 用戶是否能夠逆轉自動化或受影響的選擇?
### 3. 案例研究
為了將這些倫理挑戰放在現實世界的背景中,研究案例有助於了解忽視這些倫理問題可能對個人和社會造成的潛在傷害和後果。
以下是一些例子:
| 倫理挑戰 | 案例研究 |
|--- |--- |
| **知情同意** | 1972 - [塔斯基吉梅毒研究](https://en.wikipedia.org/wiki/Tuskegee_Syphilis_Study) - 參與研究的非裔美國男性被承諾提供免費醫療服務但研究人員欺騙了受試者未告知其診斷或治療的可用性。許多受試者死亡其伴侶或子女也受到影響研究持續了40年。 |
| **數據隱私** | 2007 - [Netflix數據獎](https://www.wired.com/2007/12/why-anonymous-data-sometimes-isnt/)向研究人員提供了_50K客戶的10M匿名電影評分_以改進推薦演算法。然而研究人員能夠將匿名數據與外部數據集例如IMDb評論中的個人身份數據相關聯實際上「去匿名化」了一些Netflix訂閱者。|
| **收集偏差** | 2013 - 波士頓市[開發了Street Bump](https://www.boston.gov/transportation/street-bump),一款讓市民報告路面坑洞的應用程式,幫助城市獲得更好的道路數據以發現和修復問題。然而,[低收入群體的人們較少擁有汽車和手機](https://hbr.org/2013/04/the-hidden-biases-in-big-data)使得他們的道路問題在此應用程式中不可見。開發者與學者合作解決公平性問題例如_公平訪問和數字鴻溝_。|
| **演算法公平性** | 2018 - MIT [Gender Shades研究](http://gendershades.org/overview.html)評估性別分類AI產品的準確性揭示了女性和有色人種的準確性差距。一款[2019年Apple Card](https://www.wired.com/story/the-apple-card-didnt-see-genderand-thats-the-problem/)似乎給女性提供的信用額度低於男性。這兩個例子都說明了演算法偏差導致的社會經濟傷害。|
| **數據錯誤呈現** | 2020 - [喬治亞州公共衛生部發布COVID-19圖表](https://www.vox.com/covid-19-coronavirus-us-response-trump/2020/5/18/21262265/georgia-covid-19-cases-declining-reopening)圖表似乎通過非時間順序的x軸誤導公民關於確診病例趨勢的資訊。這說明了通過可視化技巧進行的錯誤呈現。|
| **自由選擇的假象** | 2020 - 學習應用程式[ABCmouse支付了1000萬美元以解決FTC投訴](https://www.washingtonpost.com/business/2020/09/04/abcmouse-10-million-ftc-settlement/),家長被困於無法取消的訂閱付款中。這說明了選擇架構中的黑暗模式,用戶被引導做出可能有害的選擇。|
| **數據隱私與用戶權利** | 2021 - Facebook [數據洩漏](https://www.npr.org/2021/04/09/986005820/after-data-breach-exposes-530-million-facebook-says-it-will-not-notify-users)洩漏了530M用戶的數據導致向FTC支付了50億美元的和解金。然而它拒絕通知用戶洩漏事件違反了用戶關於數據透明性和訪問的權利。|
想探索更多案例研究?查看以下資源:
* [Ethics Unwrapped](https://ethicsunwrapped.utexas.edu/case-studies) - 涵蓋多個行業的倫理困境。
* [數據科學倫理課程](https://www.coursera.org/learn/data-science-ethics#syllabus) - 探討標誌性案例研究。
* [問題出在哪裡](https://deon.drivendata.org/examples/) - Deon清單中的示例。
> 🚨 思考你所見過的案例研究——你是否曾經遇到或受到類似倫理挑戰的影響?你能想到至少一個其他案例研究來說明我們在本節中討論的倫理挑戰嗎?
## 應用倫理
我們已經討論了倫理概念、挑戰以及在現實世界中的案例研究。但我們如何開始在項目中_應用_倫理原則和實踐又如何_實現_這些實踐以改善治理讓我們探索一些現實世界的解決方案
### 1. 專業守則
專業守則為組織提供了一種選擇通過「激勵」成員支持其倫理原則和使命聲明。守則是專業行為的_道德指南_幫助員工或成員做出符合其組織原則的決策。守則的效力取決於成員的自願遵守然而許多組織提供額外的獎勵和懲罰以激勵成員遵守。
示例包括:
* [Oxford Munich](http://www.code-of-ethics.org/code-of-conduct/)倫理守則
* [數據科學協會](http://datascienceassn.org/code-of-conduct.html)行為守則創建於2013年
* [ACM倫理守則與專業行為守則](https://www.acm.org/code-of-ethics)自1993年起
> 🚨 你是否屬於某個專業工程或數據科學組織?探索其網站,查看是否定義了專業倫理守則。這些守則說明了哪些倫理原則?他們如何「激勵」成員遵守守則?
### 2. 倫理檢查清單
雖然專業守則定義了從業者所需的_倫理行為_但它們在執行方面[存在已知的局限性](https://resources.oreilly.com/examples/0636920203964/blob/master/of_oaths_and_checklists.md),特別是在大型項目中。因此,許多數據科學專家[提倡使用檢查清單](https://resources.oreilly.com/examples/0636920203964/blob/master/of_oaths_and_checklists.md),這些清單可以**將原則與實踐**更具決定性地聯繫起來。
檢查清單將問題轉化為「是/否」任務,可以操作化,並允許它們作為標準產品發布工作流程的一部分進行跟蹤。
示例包括:
* [Deon](https://deon.drivendata.org/) - 一個通用數據倫理檢查清單,基於[行業建議](https://deon.drivendata.org/#checklist-citations)創建,並提供命令行工具以便於集成。
* [隱私審核檢查清單](https://cyber.harvard.edu/ecommerce/privacyaudit.html) - 從法律和社會曝光角度提供信息處理實踐的一般指導。
* [AI公平性檢查清單](https://www.microsoft.com/en-us/research/project/ai-fairness-checklist/) - 由AI從業者創建用於支持公平性檢查的採用和集成到AI開發周期中。
* [數據與AI倫理的22個問題](https://medium.com/the-organization/22-questions-for-ethics-in-data-and-ai-efb68fd19429) - 更開放式的框架,結構化用於設計、實施和組織背景下的倫理問題初步探索。
### 3. 倫理法規
倫理是關於定義共享價值並自願做正確的事情。**合規**是指在有法律規定的情況下_遵守法律_。**治理**則涵蓋了組織為執行倫理原則並遵守既定法律所採取的所有方式。
今天,治理在組織內部有兩種形式。首先,它是關於定義**倫理AI**原則並建立實踐以操作化採用涵蓋組織內所有與AI相關的項目。其次它是關於遵守所有政府規定的**數據保護法規**,適用於其運營的地區。
數據保護和隱私法規的示例:
* `1974`[美國隱私法案](https://www.justice.gov/opcl/privacy-act-1974) - 規範_聯邦政府_收集、使用和披露個人信息。
* `1996`[美國健康保險流通與責任法案HIPAA](https://www.cdc.gov/phlp/publications/topic/hipaa.html) - 保護個人健康數據。
* `1998`[美國兒童在線隱私保護法案COPPA](https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule) - 保護13歲以下兒童的數據隱私。
* `2018`[通用數據保護法規GDPR](https://gdpr-info.eu/) - 提供用戶權利、數據保護和隱私。
* `2018`[加州消費者隱私法案CCPA](https://www.oag.ca.gov/privacy/ccpa) - 賦予消費者更多關於其個人數據的_權利_。
* `2021`,中國[個人信息保護法](https://www.reuters.com/world/china/china-passes-new-personal-data-privacy-law-take-effect-nov-1-2021-08-20/)剛剛通過,創造了全球最強的在線數據隱私法規之一。
> 🚨 歐盟定義的GDPR通用數據保護法規仍然是今天最具影響力的數據隱私法規之一。你知道它還定義了[8項用戶權利](https://www.freeprivacypolicy.com/blog/8-user-rights-gdpr)以保護公民的數字隱私和個人數據嗎?了解這些權利是什麼以及它們為什麼重要。
### 4. 倫理文化
請注意_合規_僅僅滿足「法律條文」的要求與解決[系統性問題](https://www.coursera.org/learn/data-science-ethics/home/week/4)例如僵化、信息不對稱和分配不公平之間仍然存在無形的差距這些問題可能加速AI的武器化。
後者需要[協作方式來定義倫理文化](https://towardsdatascience.com/why-ai-ethics-requires-a-culture-driven-approach-26f451afa29f),在行業內部建立情感聯繫和一致的共享價值。這需要在組織內部[正式化數據倫理文化](https://www.codeforamerica.org/news/formalizing-an-ethical-data-culture)允許_任何人_在過程早期[拉動安燈繩](https://en.wikipedia.org/wiki/Andon_(manufacturing))提出倫理問題並將_倫理評估_例如在招聘中作為AI項目團隊組建的核心標準。
---
## [課後測驗](https://ff-quizzes.netlify.app/en/ds/quiz/3) 🎯
## 回顧與自學
課程和書籍有助於理解核心倫理概念和挑戰,而案例研究和工具則有助於在現實世界中應用倫理實踐。以下是一些入門資源。
* [機器學習入門](https://github.com/microsoft/ML-For-Beginners/blob/main/1-Introduction/3-fairness/README.md) - 來自 Microsoft 的公平性課程。
* [負責任 AI 的原則](https://docs.microsoft.com/en-us/learn/modules/responsible-ai-principles/) - Microsoft Learn 提供的免費學習路徑。
* [倫理與數據科學](https://resources.oreilly.com/examples/0636920203964) - O'Reilly 電子書 (M. Loukides, H. Mason 等人著)
* [數據科學倫理](https://www.coursera.org/learn/data-science-ethics#syllabus) - 密西根大學提供的線上課程。
* [倫理解讀](https://ethicsunwrapped.utexas.edu/case-studies) - 來自德州大學的案例研究。
# 作業
[撰寫一篇數據倫理案例研究](assignment.md)
---
**免責聲明**
本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。

@ -0,0 +1,24 @@
## 撰寫數據倫理案例研究
## 指導說明
您已經學習了各種[數據倫理挑戰](README.md#2-ethics-challenges),並且看過一些反映現實世界中數據倫理挑戰的[案例研究](README.md#3-case-studies)示例。
在這項作業中,您將撰寫自己的案例研究,反映您自身經歷或您熟悉的相關現實世界情境中的數據倫理挑戰。只需按照以下步驟進行:
1. `選擇一個數據倫理挑戰`。查看[課程示例](README.md#2-ethics-challenges)或探索線上示例,例如[Deon清單](https://deon.drivendata.org/examples/)以獲取靈感。
2. `描述一個現實世界的例子`。思考您聽說過的情境(新聞頭條、研究報告等)或您親身經歷過的情境(當地社區),其中發生了這一特定挑戰。思考與該挑戰相關的數據倫理問題,並討論因該問題而產生的潛在危害或意外後果。加分項:思考可能的解決方案或流程,這些方案或流程可以幫助消除或減輕該挑戰的不利影響。
3. `提供相關資源列表`。分享一個或多個資源(文章鏈接、個人博客文章或圖片、線上研究報告等),以證明這是一個現實世界中發生的事件。加分項:分享同時展示該事件的潛在危害與後果的資源,或突出防止事件重演的積極措施的資源。
## 評分標準
卓越 | 合格 | 需改進
--- | --- | -- |
識別出一個或多個數據倫理挑戰。<br/><br/>案例研究清楚地描述了反映該挑戰的現實世界事件,並突出了其造成的不良後果或危害。<br/><br/>至少有一個鏈接資源證明該事件的發生。 | 識別出一個數據倫理挑戰。<br/><br/>至少簡要討論了一個相關的危害或後果。<br/><br/>然而,討論有限或缺乏現實世界事件的證據。 | 識別出一個數據挑戰。<br/><br/>然而,描述或資源未能充分反映該挑戰或證明其現實世界的發生。 |
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。

@ -0,0 +1,76 @@
# 定義資料
|![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/03-DefiningData.png)|
|:---:|
|定義資料 - _Sketchnote by [@nitya](https://twitter.com/nitya)_ |
資料是用來進行探索和支持明智決策的事實、資訊、觀察和測量。一個資料點是資料集中的單一資料單位,而資料集則是由多個資料點組成的集合。資料集可能有不同的格式和結構,通常取決於其來源或資料的來源。例如,一家公司的月度收益可能以電子表格的形式呈現,而智能手錶的每小時心率資料可能以 [JSON](https://stackoverflow.com/a/383699) 格式呈現。資料科學家通常需要處理資料集中不同類型的資料。
本課程重點在於根據資料的特徵和來源來識別和分類資料。
## [課前測驗](https://ff-quizzes.netlify.app/en/ds/quiz/4)
## 資料的描述方式
### 原始資料
原始資料是指來自其來源的初始狀態,尚未被分析或整理的資料。為了理解資料集中的情況,必須將其整理成一種人類和技術都能理解的格式。資料集的結構描述了其如何被組織,可以分為結構化、非結構化和半結構化。這些結構類型會因來源而異,但最終都屬於這三類之一。
### 定量資料
定量資料是資料集中以數字形式呈現的觀察值通常可以進行分析、測量並用於數學運算。一些定量資料的例子包括一個國家的人口、一個人的身高或一家公司季度收益。通過進一步分析定量資料可以用來發現空氣品質指數AQI的季節性趨勢或估算典型工作日的高峰交通概率。
### 定性資料
定性資料,也稱為分類資料,是無法像定量資料那樣客觀測量的資料。它通常是各種格式的主觀資料,用來捕捉某物的品質,例如產品或流程。有時,定性資料是數字形式,但通常不會用於數學運算,例如電話號碼或時間戳。一些定性資料的例子包括:影片評論、汽車的品牌和型號或你最親密朋友的最喜歡的顏色。定性資料可以用來了解消費者最喜歡哪些產品或識別求職申請中流行的關鍵字。
### 結構化資料
結構化資料是以行和列的形式組織的資料,其中每一行都具有相同的列集合。列代表特定類型的值,並以描述該值代表內容的名稱來識別,而行則包含實際的值。列通常會有一組特定的規則或限制,以確保值準確地代表該列。例如,想像一個客戶的電子表格,其中每一行都必須有一個電話號碼,且電話號碼不能包含字母字符。可能會對電話號碼列施加規則,以確保它永遠不會是空的,並且只包含數字。
結構化資料的一個優勢是它可以以某種方式組織,使其可以與其他結構化資料相關聯。然而,由於資料被設計成以特定方式組織,對其整體結構進行更改可能需要付出大量努力。例如,向客戶電子表格中添加一個不能為空的電子郵件列,意味著需要找出如何將這些值添加到資料集中現有的客戶行。
結構化資料的例子:電子表格、關聯式資料庫、電話號碼、銀行對帳單
### 非結構化資料
非結構化資料通常無法分類為行或列,並且不包含格式或規則集。由於非結構化資料對其結構的限制較少,因此相比於結構化資料集更容易添加新資訊。如果一個每兩分鐘捕捉一次氣壓資料的感測器收到更新,現在可以測量和記錄溫度,那麼如果資料是非結構化的,就不需要更改現有資料。然而,這可能會使分析或調查這類資料的過程變得更耗時。例如,一位科學家希望從感測器的資料中找到上個月的平均溫度,但發現感測器在某些記錄中用 "e" 表示它壞了,而不是典型的數字,這意味著資料不完整。
非結構化資料的例子:文字檔案、簡訊、影片檔案
### 半結構化資料
半結構化資料具有結構化和非結構化資料的特徵。它通常不符合行和列的格式,但以某種被認為是結構化的方式組織,並可能遵循固定的格式或規則集。結構會因來源而異,例如從明確定義的層次結構到更靈活的方式,允許輕鬆整合新資訊。中繼資料是幫助決定資料如何組織和存儲的指標,並根據資料類型有不同的名稱。一些常見的中繼資料名稱包括標籤、元素、實體和屬性。例如,一封典型的電子郵件訊息會有主題、正文和一組收件人,可以根據發送者或發送時間進行組織。
半結構化資料的例子HTML、CSV 檔案、JavaScript Object Notation (JSON)
## 資料來源
資料來源是資料生成的初始位置,或其“存在”的地方,會根據資料的收集方式和時間而有所不同。由使用者生成的資料被稱為原始資料,而二手資料則來自於為一般用途收集資料的來源。例如,一群科學家在雨林中收集觀察資料被視為原始資料,而如果他們決定與其他科學家分享,對於使用這些資料的人來說則被視為二手資料。
資料庫是常見的資料來源,依賴資料庫管理系統來托管和維護資料,使用者可以使用稱為查詢的命令來探索資料。作為資料來源的檔案可以是音訊、影像和影片檔案,也可以是像 Excel 這樣的電子表格。網路來源是托管資料的常見位置資料庫和檔案都可以在其中找到。應用程式介面API允許程式設計師通過網路創建與外部使用者共享資料的方式而網頁爬取則是從網頁中提取資料的過程。[《資料操作》課程](../../../../../../../../../2-Working-With-Data) 將重點介紹如何使用各種資料來源。
## 結論
在本課程中,我們學到了:
- 資料的定義
- 資料的描述方式
- 資料的分類和歸類方式
- 資料的來源
## 🚀 挑戰
Kaggle 是一個開放資料集的絕佳來源。使用 [資料集搜尋工具](https://www.kaggle.com/datasets) 找到一些有趣的資料集,並根據以下標準分類 3-5 個資料集:
- 資料是定量還是定性?
- 資料是結構化、非結構化還是半結構化?
## [課後測驗](https://ff-quizzes.netlify.app/en/ds/quiz/5)
## 回顧與自學
- Microsoft Learn 單元 [分類你的資料](https://docs.microsoft.com/en-us/learn/modules/choose-storage-approach-in-azure/2-classify-data) 詳細介紹了結構化、半結構化和非結構化資料。
## 作業
[分類資料集](assignment.md)
---
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解讀概不負責。

@ -0,0 +1,68 @@
# 資料集分類
## 指示
按照本作業中的提示,識別並分類資料,並為以下每種資料類型選擇一個:
**結構類型**:結構化、半結構化或非結構化
**數值類型**:定性或定量
**來源類型**:主要或次要
1. 一家公司被收購,現在有了母公司。資料科學家從母公司收到了一份包含客戶電話號碼的電子表格。
結構類型:
數值類型:
來源類型:
---
2. 一款智慧手錶正在收集佩戴者的心率數據,原始數據以 JSON 格式存儲。
結構類型:
數值類型:
來源類型:
---
3. 一份存儲在 CSV 文件中的員工士氣工作場所調查。
結構類型:
數值類型:
來源類型:
---
4. 天體物理學家正在訪問由太空探測器收集的星系數據庫。該數據包含每個星系中的行星數量。
結構類型:
數值類型:
來源類型:
---
5. 一款個人理財應用程式使用 API 連接到用戶的金融帳戶,以計算其淨資產。用戶可以看到所有交易,格式為行和列,類似於電子表格。
結構類型:
數值類型:
來源類型:
## 評分標準
卓越 | 合格 | 需要改進
--- | --- | -- |
正確識別所有結構、數值和來源 | 正確識別 3 個結構、數值和來源 | 正確識別 2 個或更少的結構、數值和來源 |
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。

@ -0,0 +1,271 @@
# 統計與機率簡介
|![由 [(@sketchthedocs)](https://sketchthedocs.dev) 繪製的手繪筆記](../../sketchnotes/04-Statistics-Probability.png)|
|:---:|
| 統計與機率 - _手繪筆記由 [@nitya](https://twitter.com/nitya) 提供_ |
統計學與機率論是數學中高度相關的兩個領域,對於數據科學來說尤為重要。即使在缺乏深厚數學知識的情況下也可以操作數據,但了解一些基本概念仍然是有益的。在這裡,我們將提供一個簡短的介紹,幫助您入門。
[![介紹影片](../../../../translated_images/zh-TW/video-prob-and-stats.e4282e5efa2f2543400843ed98b1057065c9600cebfc8a728e8931b5702b2ae4.png)](https://youtu.be/Z5Zy85g4Yjw)
## [課前測驗](https://ff-quizzes.netlify.app/en/ds/quiz/6)
## 機率與隨機變數
**機率** 是介於 0 和 1 之間的一個數字,用來表示某個 **事件** 發生的可能性。它被定義為正向結果(導致該事件發生的結果)的數量,除以總結果數量,前提是所有結果的可能性相等。例如,當我們擲骰子時,得到偶數的機率是 3/6 = 0.5。
當我們討論事件時,我們使用 **隨機變數**。例如,表示擲骰子結果的隨機變數可以取值 1 到 6。1 到 6 的集合被稱為 **樣本空間**。我們可以討論隨機變數取某個值的機率,例如 P(X=3)=1/6。
上述例子中的隨機變數被稱為 **離散型**,因為它有一個可數的樣本空間,也就是說,它有可以枚舉的分離值。有些情況下,樣本空間是一個實數範圍,或者是整個實數集合。這樣的變數被稱為 **連續型**。一個很好的例子是公車到達的時間。
## 機率分佈
對於離散型隨機變數,可以通過函數 P(X) 輕鬆描述每個事件的機率。對於樣本空間 *S* 中的每個值 *s*,它會給出一個介於 0 和 1 之間的數字,並且所有事件的 P(X=s) 值的總和為 1。
最著名的離散分佈是 **均勻分佈**,其中樣本空間有 N 個元素,每個元素的機率相等,為 1/N。
描述連續型變數的機率分佈則更為困難,這些變數的值來自某個區間 [a,b],或者整個實數集合 ℝ。以公車到達時間為例,實際上,對於每個確切的到達時間 *t*,公車正好在該時間到達的機率是 0
> 現在您知道了,機率為 0 的事件是可能發生的,而且經常發生!至少每次公車到達時都是如此!
我們只能討論變數落在某個值區間內的機率,例如 P(t<sub>1</sub>≤X<t<sub>2</sub>)。在這種情況下,機率分佈由 **機率密度函數** p(x) 描述,其滿足以下公式:
![P(t_1\le X<t_2)=\int_{t_1}^{t_2}p(x)dx](../../../../translated_images/zh-TW/probability-density.a8aad29f17a14afb519b407c7b6edeb9f3f9aa5f69c9e6d9445f604e5f8a2bf7.png)
連續型均勻分佈是均勻分佈的連續類比,定義在一個有限區間內。變數 X 落入長度為 l 的區間的機率與 l 成正比,並且總和為 1。
另一個重要的分佈是 **正態分佈**,我們將在下面更詳細地討論。
## 平均值、方差與標準差
假設我們從隨機變數 X 中抽取 n 個樣本x<sub>1</sub>, x<sub>2</sub>, ..., x<sub>n</sub>。我們可以用傳統方式定義該序列的 **平均值**(或 **算術平均值**),即 (x<sub>1</sub>+x<sub>2</sub>+...+x<sub>n</sub>)/n。隨著樣本數量的增加即 n→∞我們將得到分佈的平均值也稱為 **期望值**)。我們用 **E**(x) 表示期望值。
> 可以證明,對於任何具有值 {x<sub>1</sub>, x<sub>2</sub>, ..., x<sub>N</sub>} 和相應機率 p<sub>1</sub>, p<sub>2</sub>, ..., p<sub>N</sub> 的離散分佈,其期望值為 E(X)=x<sub>1</sub>p<sub>1</sub>+x<sub>2</sub>p<sub>2</sub>+...+x<sub>N</sub>p<sub>N</sub>
為了確定數值的分散程度,我們可以計算方差 σ<sup>2</sup> = ∑(x<sub>i</sub> - μ)<sup>2</sup>/n其中 μ 是序列的平均值。值 σ 被稱為 **標準差**,而 σ<sup>2</sup> 被稱為 **方差**。
## 眾數、中位數與四分位數
有時,平均值無法充分代表數據的「典型」值。例如,當存在一些極端值遠遠超出範圍時,它們可能會影響平均值。另一個很好的指標是 **中位數**,即一個值,使得一半的數據點低於它,另一半高於它。
為了幫助我們理解數據的分佈,討論 **四分位數** 是有幫助的:
* 第一四分位數Q1使得 25% 的數據低於該值
* 第三四分位數Q3使得 75% 的數據低於該值
我們可以用一種稱為 **箱型圖** 的圖表來直觀表示中位數與四分位數之間的關係:
<img src="../../../../translated_images/zh-TW/boxplot_explanation.4039b7de08780fd4.webp" alt="箱型圖解釋" width="50%">
在這裡,我們還計算了 **四分位距** IQR=Q3-Q1以及所謂的 **異常值**——即落在 [Q1-1.5*IQR, Q3+1.5*IQR] 範圍之外的值。
對於包含少量可能值的有限分佈,一個好的「典型」值是出現頻率最高的值,稱為 **眾數**。它通常應用於分類數據,例如顏色。考慮這樣一種情況:有兩組人,一組強烈偏愛紅色,另一組偏愛藍色。如果我們用數字編碼顏色,最喜歡的顏色的平均值可能落在橙色-綠色光譜之間,這無法反映任何一組的實際偏好。然而,眾數可能是其中一種顏色,或者如果兩種顏色的投票人數相等,則樣本被稱為 **多眾數**。
## 真實世界數據
當我們分析來自現實生活的數據時,它們通常不是嚴格意義上的隨機變數,因為我們並未進行未知結果的實驗。例如,考慮一支棒球隊及其隊員的身體數據,如身高、體重和年齡。這些數字並非完全隨機,但我們仍然可以應用相同的數學概念。例如,一組人的體重序列可以被視為從某個隨機變數中抽取的一組值。以下是來自 [美國職棒大聯盟](http://mlb.mlb.com/index.jsp) 的實際棒球運動員的體重數據(取自 [這個數據集](http://wiki.stat.ucla.edu/socr/index.php/SOCR_Data_MLB_HeightsWeights)),為方便起見,僅顯示前 20 個值:
```
[180.0, 215.0, 210.0, 210.0, 188.0, 176.0, 209.0, 200.0, 231.0, 180.0, 188.0, 180.0, 185.0, 160.0, 180.0, 185.0, 197.0, 189.0, 185.0, 219.0]
```
> **注意**:要查看使用此數據集的示例,請參閱 [配套筆記本](notebook.ipynb)。本課程中還有許多挑戰,您可以通過向該筆記本添加一些代碼來完成它們。如果您不確定如何操作數據,請不要擔心——我們稍後會回到使用 Python 操作數據的部分。如果您不知道如何在 Jupyter Notebook 中運行代碼,請參閱 [這篇文章](https://soshnikov.com/education/how-to-execute-notebooks-from-github/)。
以下是顯示我們數據的平均值、中位數和四分位數的箱型圖:
![體重箱型圖](../../../../translated_images/zh-TW/weight-boxplot.1dbab1c03af26f8a008fff4e17680082c8ab147d6df646cbac440bbf8f5b9c42.png)
由於我們的數據包含不同球員 **角色** 的信息,我們還可以按角色繪製箱型圖——這將幫助我們了解參數值在不同角色之間的差異。這次我們將考慮身高:
![按角色繪製的箱型圖](../../../../translated_images/zh-TW/boxplot_byrole.036b27a1c3f52d42f66fba2324ec5cde0a1bca6a01a619eeb0ce7cd054b2527b.png)
這張圖表表明,平均而言,一壘手的身高高於二壘手的身高。在本課程的後面部分,我們將學習如何更正式地檢驗這一假設,以及如何證明我們的數據在統計上具有顯著性。
> 在處理真實世界數據時,我們假設所有數據點都是從某個機率分佈中抽取的樣本。這一假設使我們能夠應用機器學習技術並構建有效的預測模型。
為了了解我們數據的分佈,我們可以繪製一個稱為 **直方圖** 的圖表。X 軸包含若干不同的體重區間(即 **箱**),而 Y 軸顯示隨機變數樣本落在給定區間內的次數。
![真實世界數據的直方圖](../../../../translated_images/zh-TW/weight-histogram.bfd00caf7fc30b145b21e862dba7def41c75635d5280de25d840dd7f0b00545e.png)
從這個直方圖中可以看出,所有值都集中在某個平均體重附近,距離該體重越遠,該值出現的次數越少。也就是說,棒球運動員的體重與平均體重差異很大的可能性非常小。體重的方差顯示了體重與平均值可能的差異程度。
> 如果我們取其他人(非棒球聯盟成員)的體重,分佈可能會有所不同。然而,分佈的形狀將保持相同,但平均值和方差會改變。因此,如果我們用棒球運動員訓練模型,當應用於大學學生時,可能會得出錯誤的結果,因為底層分佈不同。
## 正態分佈
我們上面看到的體重分佈非常典型,許多來自現實世界的測量值遵循相同類型的分佈,但具有不同的平均值和方差。這種分佈被稱為 **正態分佈**,它在統計學中扮演著非常重要的角色。
使用正態分佈是生成潛在棒球運動員隨機體重的正確方法。一旦我們知道平均體重 `mean` 和標準差 `std`,我們可以用以下方式生成 1000 個體重樣本:
```python
samples = np.random.normal(mean,std,1000)
```
如果我們繪製生成樣本的直方圖,我們將看到與上圖非常相似的圖像。如果我們增加樣本數量和箱數,我們可以生成更接近理想的正態分佈圖像:
![平均值=0 和標準差=1 的正態分佈](../../../../translated_images/zh-TW/normal-histogram.dfae0d67c202137d552d0015fb87581eca263925e512404f3c12d8885315432e.png)
*平均值=0 和標準差=1 的正態分佈*
## 信賴區間
當我們討論棒球運動員的體重時,我們假設存在某個 **隨機變數 W**,它對應於所有棒球運動員體重的理想機率分佈(即 **母體**)。我們的體重序列對應於我們稱為 **樣本** 的所有棒球運動員的一個子集。一個有趣的問題是,我們能否知道 W 的分佈參數,即母體的平均值和方差?
最簡單的答案是計算我們樣本的平均值和方差。然而,可能發生的情況是,我們的隨機樣本無法準確代表完整的母體。因此,討論 **信賴區間** 是有意義的。
> **信賴區間** 是基於我們的樣本對母體真實平均值的估計,其準確性具有一定的機率(或 **置信水平**)。
假設我們有一個樣本 X
1</sub>, ..., X<sub>n</sub> 從我們的分佈中抽取樣本。每次從分佈中抽取樣本,我們都會得到不同的平均值 μ。因此,μ 可以被視為一個隨機變數。一個具有置信度 p 的 **置信區間** 是一對值 (L<sub>p</sub>,R<sub>p</sub>),使得 **P**(L<sub>p</sub>≤μ≤R<sub>p</sub>) = p也就是說測量的平均值落在區間內的概率等於 p。
詳細討論如何計算這些置信區間超出了我們的簡短介紹範圍。更多細節可以在 [維基百科](https://en.wikipedia.org/wiki/Confidence_interval) 中找到。簡而言之,我們定義了計算的樣本平均值相對於母體真實平均值的分佈,這被稱為 **學生分佈**。
> **有趣的事實**:學生分佈的名稱來自數學家 William Sealy Gosset他以筆名 "Student" 發表了他的論文。他在健力士啤酒廠工作,根據其中一個版本,他的雇主不希望公眾知道他們使用統計測試來檢測原材料的質量。
如果我們希望以置信度 p 估計母體的平均值 μ,我們需要取學生分佈 A 的 *(1-p)/2 百分位數*,這可以從表中獲得,或者使用統計軟件(例如 Python、R 等)的內建函數計算。然後 μ 的區間將由 X±A*D/√n 給出,其中 X 是樣本的平均值D 是標準差。
> **注意**:我們也省略了與學生分佈相關的重要概念 [自由度](https://en.wikipedia.org/wiki/Degrees_of_freedom_(statistics)) 的討論。您可以參考更完整的統計書籍以更深入地理解這個概念。
一個關於體重和身高的置信區間計算示例可以在 [附帶的筆記本](notebook.ipynb) 中找到。
| p | 體重平均值 |
|-----|-----------|
| 0.85 | 201.73±0.94 |
| 0.90 | 201.73±1.08 |
| 0.95 | 201.73±1.28 |
注意,置信概率越高,置信區間越寬。
## 假設檢定
在我們的棒球球員數據集中,有不同的球員角色,可以總結如下(查看 [附帶的筆記本](notebook.ipynb) 以了解如何計算此表):
| 角色 | 身高 | 體重 | 數量 |
|------|--------|--------|-------|
| 捕手 | 72.723684 | 204.328947 | 76 |
| 指定打擊手 | 74.222222 | 220.888889 | 18 |
| 一壘手 | 74.000000 | 213.109091 | 55 |
| 外野手 | 73.010309 | 199.113402 | 194 |
| 救援投手 | 74.374603 | 203.517460 | 315 |
| 二壘手 | 71.362069 | 184.344828 | 58 |
| 游擊手 | 71.903846 | 182.923077 | 52 |
| 先發投手 | 74.719457 | 205.163636 | 221 |
| 三壘手 | 73.044444 | 200.955556 | 45 |
我們可以注意到,一壘手的平均身高高於二壘手。因此,我們可能會得出結論:**一壘手比二壘手高**。
> 這個陳述被稱為 **假設**,因為我們不知道這個事實是否真的成立。
然而,是否可以得出這個結論並不總是顯而易見的。從上面的討論中我們知道,每個平均值都有一個相關的置信區間,因此這種差異可能僅僅是統計誤差。我們需要更正式的方法來檢驗我們的假設。
讓我們分別計算一壘手和二壘手的身高置信區間:
| 置信度 | 一壘手 | 二壘手 |
|------------|---------------|----------------|
| 0.85 | 73.62..74.38 | 71.04..71.69 |
| 0.90 | 73.56..74.44 | 70.99..71.73 |
| 0.95 | 73.47..74.53 | 70.92..71.81 |
我們可以看到,在任何置信度下,區間都不重疊。這證明了我們的假設,即一壘手比二壘手高。
更正式地說,我們正在解決的問題是檢查 **兩個概率分佈是否相同**,或者至少是否具有相同的參數。根據分佈的不同,我們需要使用不同的檢驗方法。如果我們知道分佈是正態分佈,我們可以應用 **[學生 t 檢驗](https://en.wikipedia.org/wiki/Student%27s_t-test)**。
在學生 t 檢驗中,我們計算所謂的 **t 值**,它表示平均值之間的差異,並考慮到方差。已證明 t 值遵循 **學生分佈**,這使我們能夠獲得給定置信度 **p** 的閾值(這可以計算或在數值表中查找)。然後我們將 t 值與該閾值進行比較,以批准或拒絕假設。
在 Python 中,我們可以使用 **SciPy** 套件,其中包括 `ttest_ind` 函數(以及許多其他有用的統計函數!)。它為我們計算 t 值,並且還反向查找置信度 p 值,因此我們只需查看置信度即可得出結論。
例如,我們比較一壘手和二壘手的身高,得到以下結果:
```python
from scipy.stats import ttest_ind
tval, pval = ttest_ind(df.loc[df['Role']=='First_Baseman',['Height']], df.loc[df['Role']=='Designated_Hitter',['Height']],equal_var=False)
print(f"T-value = {tval[0]:.2f}\nP-value: {pval[0]}")
```
```
T-value = 7.65
P-value: 9.137321189738925e-12
```
在我們的情況下p 值非常低,這意味著有強有力的證據支持一壘手更高。
此外,我們可能希望檢驗其他類型的假設,例如:
* 證明某個樣本遵循某種分佈。在我們的情況下,我們假設身高是正態分佈的,但這需要正式的統計驗證。
* 證明樣本的平均值與某個預定值相符
* 比較多個樣本的平均值(例如,不同年齡組的幸福水平差異)
## 大數法則與中心極限定理
正態分佈如此重要的原因之一是所謂的 **中心極限定理**。假設我們有一個由獨立的 N 個值 X<sub>1</sub>, ..., X<sub>N</sub> 組成的大樣本,這些值來自任何具有平均值 μ 和方差 σ<sup>2</sup> 的分佈。那麼,當 N 足夠大時(換句話說,當 N→∞平均值 Σ<sub>i</sub>X<sub>i</sub> 將呈正態分佈,平均值為 μ,方差為 σ<sup>2</sup>/N。
> 另一種解釋中心極限定理的方法是說,無論分佈如何,當您計算任何隨機變數值的和的平均值時,最終都會得到正態分佈。
根據中心極限定理,當 N→∞ 時,樣本平均值等於 μ 的概率變為 1。這被稱為 **大數法則**。
## 協方差與相關性
數據科學的一項工作是尋找數據之間的關係。我們說兩個序列 **相關**,當它們在同一時間表現出相似的行為,即它們同時上升/下降,或者一個序列上升時另一個序列下降,反之亦然。換句話說,兩個序列之間似乎存在某種關係。
> 相關性並不一定表示兩個序列之間存在因果關係;有時兩個變量可能依賴於某個外部原因,或者兩個序列的相關性可能純屬偶然。然而,強數學相關性是一個很好的指標,表明兩個變量以某種方式相互關聯。
數學上,顯示兩個隨機變數之間關係的主要概念是 **協方差**其計算公式為Cov(X,Y) = **E**\[(X-**E**(X))(Y-**E**(Y))\]。我們計算兩個變數偏離其平均值的偏差,然後計算這些偏差的乘積。如果兩個變數一起偏離,乘積將始終為正值,並累加為正協方差。如果兩個變數不同步偏離(即一個低於平均值時另一個高於平均值),我們將始終得到負數,並累加為負協方差。如果偏差不相關,它們將累加為大約零。
協方差的絕對值並不能告訴我們相關性有多大,因為它取決於實際值的大小。為了標準化,我們可以將協方差除以兩個變數的標準差,得到 **相關性**。相關性的好處是它始終在 [-1,1] 範圍內,其中 1 表示值之間的強正相關,-1 表示強負相關0 表示完全無相關(變數是獨立的)。
**示例**:我們可以計算棒球球員數據集中體重和身高之間的相關性:
```python
print(np.corrcoef(weights,heights))
```
結果,我們得到如下的 **相關性矩陣**
```
array([[1. , 0.52959196],
[0.52959196, 1. ]])
```
> 相關性矩陣 C 可以為任意數量的輸入序列 S<sub>1</sub>, ..., S<sub>n</sub> 計算。C<sub>ij</sub> 的值是 S<sub>i</sub> 和 S<sub>j</sub> 之間的相關性,對角元素始終為 1這也是 S<sub>i</sub> 的自相關性)。
在我們的情況下,值 0.53 表明體重和身高之間存在一定的相關性。我們還可以繪製一個值對另一個值的散點圖,以直觀地查看關係:
![體重與身高的關係](../../../../translated_images/zh-TW/weight-height-relationship.3f06bde4ca2aba9974182c4ef037ed602acd0fbbbbe2ca91cefd838a9e66bcf9.png)
> 更多關於相關性和協方差的示例可以在 [附帶的筆記本](notebook.ipynb) 中找到。
## 結論
在本節中,我們學習了:
* 數據的基本統計屬性,例如平均值、方差、眾數和四分位數
* 隨機變數的不同分佈,包括正態分佈
* 如何找到不同屬性之間的相關性
* 如何使用數學和統計的嚴謹工具來證明一些假設
* 如何根據數據樣本計算隨機變數的置信區間
雖然這絕不是概率和統計中所有主題的完整列表,但應該足以讓您在本課程中有一個良好的開始。
## 🚀 挑戰
使用筆記本中的示例代碼來測試以下假設:
1. 一壘手比二壘手年齡更大
2. 一壘手比三壘手更高
3. 游擊手比二壘手更高
## [課後測驗](https://ff-quizzes.netlify.app/en/ds/quiz/7)
## 回顧與自學
概率和統計是一個非常廣泛的主題,值得開設自己的課程。如果您有興趣深入理論,可以繼續閱讀以下一些書籍:
1. [Carlos Fernandez-Granda](https://cims.nyu.edu/~cfgranda/) 紐約大學的講義 [Probability and Statistics for Data Science](https://cims.nyu.edu/~cfgranda/pages/stuff/probability_stats_for_DS.pdf)(在線提供)
1. [Peter and Andrew Bruce. Practical Statistics for Data Scientists.](https://www.oreilly.com/library/view/practical-statistics-for/9781491952955/) [[R 示例代碼](https://github.com/andrewgbruce/statistics-for-data-scientists)]。
1. [James D. Miller. Statistics for Data Science](https://www.packtpub.com/product/statistics-for-data-science/9781788290678) [[R 示例代碼](https://github.com/PacktPublishing/Statistics-for-Data-Science)]
## 作業
[小型糖尿病研究](assignment.md)
## 致謝
本課程由 [Dmitry Soshnikov](http://soshnikov.com) 用 ♥️ 編寫。
---
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解讀概不負責。

@ -0,0 +1,262 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"## 概率與統計簡介\n",
"## 作業\n",
"\n",
"在這次作業中,我們將使用糖尿病患者的數據集,該數據集取自[此處](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html)。\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 13,
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"df = pd.read_csv(\"../../data/diabetes.tsv\",sep='\\t')\n",
"df.head()"
],
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" AGE SEX BMI BP S1 S2 S3 S4 S5 S6 Y\n",
"0 59 2 32.1 101.0 157 93.2 38.0 4.0 4.8598 87 151\n",
"1 48 1 21.6 87.0 183 103.2 70.0 3.0 3.8918 69 75\n",
"2 72 2 30.5 93.0 156 93.6 41.0 4.0 4.6728 85 141\n",
"3 24 1 25.3 84.0 198 131.4 40.0 5.0 4.8903 89 206\n",
"4 50 1 23.0 101.0 192 125.4 52.0 4.0 4.2905 80 135"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>AGE</th>\n",
" <th>SEX</th>\n",
" <th>BMI</th>\n",
" <th>BP</th>\n",
" <th>S1</th>\n",
" <th>S2</th>\n",
" <th>S3</th>\n",
" <th>S4</th>\n",
" <th>S5</th>\n",
" <th>S6</th>\n",
" <th>Y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>59</td>\n",
" <td>2</td>\n",
" <td>32.1</td>\n",
" <td>101.0</td>\n",
" <td>157</td>\n",
" <td>93.2</td>\n",
" <td>38.0</td>\n",
" <td>4.0</td>\n",
" <td>4.8598</td>\n",
" <td>87</td>\n",
" <td>151</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>48</td>\n",
" <td>1</td>\n",
" <td>21.6</td>\n",
" <td>87.0</td>\n",
" <td>183</td>\n",
" <td>103.2</td>\n",
" <td>70.0</td>\n",
" <td>3.0</td>\n",
" <td>3.8918</td>\n",
" <td>69</td>\n",
" <td>75</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>72</td>\n",
" <td>2</td>\n",
" <td>30.5</td>\n",
" <td>93.0</td>\n",
" <td>156</td>\n",
" <td>93.6</td>\n",
" <td>41.0</td>\n",
" <td>4.0</td>\n",
" <td>4.6728</td>\n",
" <td>85</td>\n",
" <td>141</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>24</td>\n",
" <td>1</td>\n",
" <td>25.3</td>\n",
" <td>84.0</td>\n",
" <td>198</td>\n",
" <td>131.4</td>\n",
" <td>40.0</td>\n",
" <td>5.0</td>\n",
" <td>4.8903</td>\n",
" <td>89</td>\n",
" <td>206</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>50</td>\n",
" <td>1</td>\n",
" <td>23.0</td>\n",
" <td>101.0</td>\n",
" <td>192</td>\n",
" <td>125.4</td>\n",
" <td>52.0</td>\n",
" <td>4.0</td>\n",
" <td>4.2905</td>\n",
" <td>80</td>\n",
" <td>135</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"metadata": {},
"execution_count": 13
}
],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"在此數據集中,欄位如下:\n",
"* 年齡和性別不需額外解釋\n",
"* BMI 是身體質量指數\n",
"* BP 是平均血壓\n",
"* S1 到 S6 是不同的血液測量值\n",
"* Y 是一年內疾病進展的定性指標\n",
"\n",
"讓我們使用概率和統計方法來研究這個數據集。\n",
"\n",
"### 任務 1計算所有值的平均值和方差\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"### 任務 2根據性別繪製 BMI、BP 和 Y 的箱型圖\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"### 任務 3年齡、性別、BMI 和 Y 變量的分佈是什麼?\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"### 任務 4測試不同變數與疾病進展Y之間的相關性\n",
"\n",
"> **提示** 相關矩陣可以提供最有用的資訊,幫助您了解哪些值是相互依賴的。\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {}
},
{
"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",
"version": "3.8.8",
"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.8.8 64-bit (conda)"
},
"interpreter": {
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
},
"coopTranslator": {
"original_hash": "6d945fd15163f60cb473dbfe04b2d100",
"translation_date": "2025-09-06T17:14:03+00:00",
"source_file": "1-Introduction/04-stats-and-probability/assignment.ipynb",
"language_code": "tw"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,29 @@
# 小型糖尿病研究
在這次作業中,我們將使用一個小型糖尿病患者的數據集,該數據集來源於[此處](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html)。
| | 年齡 | 性別 | BMI | 血壓 | S1 | S2 | S3 | S4 | S5 | S6 | Y |
|---|-----|-----|-----|----|----|----|----|----|----|----|----|
| 0 | 59 | 2 | 32.1 | 101. | 157 | 93.2 | 38.0 | 4. | 4.8598 | 87 | 151 |
| 1 | 48 | 1 | 21.6 | 87.0 | 183 | 103.2 | 70. | 3. | 3.8918 | 69 | 75 |
| 2 | 72 | 2 | 30.5 | 93.0 | 156 | 93.6 | 41.0 | 4.0 | 4. | 85 | 141 |
| ... | ... | ... | ... | ...| ...| ...| ...| ...| ...| ...| ... |
## 指導說明
* 在 jupyter notebook 環境中打開 [assignment notebook](../../../../1-Introduction/04-stats-and-probability/assignment.ipynb)
* 完成 notebook 中列出的所有任務,包括:
* [ ] 計算所有值的平均值和方差
* [ ] 根據性別繪製 BMI、血壓和 Y 的箱型圖
* [ ] 分析年齡、性別、BMI 和 Y 變數的分佈情況
* [ ] 測試不同變數與疾病進展Y之間的相關性
* [ ] 檢驗糖尿病進展程度在男性和女性之間是否存在差異的假設
## 評分標準
卓越 | 合格 | 需要改進
--- | --- | -- |
所有要求的任務均已完成,並且有圖形展示和詳細解釋 | 大部分任務已完成,但缺少圖形或獲得值的解釋和結論 | 只完成了基本任務,例如計算平均值/方差和基本圖表,未從數據中得出結論
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。

@ -0,0 +1,581 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction to Probability and Statistics\n",
"在本筆記中,我們將試玩一些之前討論過的概念。許多機率與統計的概念都在 Python 的主要資料處理函式庫中得到很好的體現,例如 `numpy` 和 `pandas`。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import random\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 隨機變數與分布\n",
"讓我們從 0 到 9 的均勻分布中抽取 30 個值的樣本。我們還將計算平均值和變異數。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sample = [ random.randint(0,10) for _ in range(30) ]\n",
"print(f\"Sample: {sample}\")\n",
"print(f\"Mean = {np.mean(sample)}\")\n",
"print(f\"Variance = {np.var(sample)}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"要目視估計樣本中有多少不同的值,我們可以繪製**直方圖**\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.hist(sample)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 分析真實數據\n",
"\n",
"平均值和變異數在分析真實世界的數據時非常重要。讓我們從 [SOCR MLB Height/Weight Data](http://wiki.stat.ucla.edu/socr/index.php/SOCR_Data_MLB_HeightsWeights) 載入有關棒球選手的數據。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv(\"../../data/SOCR_MLB.tsv\",sep='\\t', header=None, names=['Name','Team','Role','Weight','Height','Age'])\n",
"df\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> 我們這裡使用一個叫做 [**Pandas**](https://pandas.pydata.org/) 的套件來做資料分析。在這門課程的後面,我們會更深入討論 Pandas 以及在 Python 中操作資料的方法。\n",
"\n",
"讓我們來計算年齡、身高和體重的平均值:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df[['Age','Height','Weight']].mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"現在讓我們專注於身高,並計算標準差和變異數:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(list(df['Height'])[:20])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mean = df['Height'].mean()\n",
"var = df['Height'].var()\n",
"std = df['Height'].std()\n",
"print(f\"Mean = {mean}\\nVariance = {var}\\nStandard Deviation = {std}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"除了平均值之外,也有必要查看中位數和四分位數。它們可以用 **盒鬍圖** 來視覺化:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,2))\n",
"plt.boxplot(df['Height'].ffill(), vert=False, showmeans=True)\n",
"plt.grid(color='gray', linestyle='dotted')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我們也可以對資料集的子集製作箱型圖,例如依玩家角色分組。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.boxplot(column='Height', by='Role', figsize=(10,8))\n",
"plt.xticks(rotation='vertical')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **注意**:此圖表顯示,平均而言,一壘手的身高高於二壘手的身高。稍後我們將學習如何更正式地檢驗此假設,以及如何證明我們的資料在統計上具有顯著性。 \n",
"\n",
"年齡、身高和體重都是連續型隨機變數。你認為它們的分佈是什麼?一個不錯的方法是繪製數值的直方圖: \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df['Weight'].hist(bins=15, figsize=(10,6))\n",
"plt.suptitle('Weight distribution of MLB Players')\n",
"plt.xlabel('Weight')\n",
"plt.ylabel('Count')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 常態分布\n",
"\n",
"讓我們建立一個符合常態分布的人工體重樣本,其平均數和變異數與我們的實際數據相同:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"generated = np.random.normal(mean, std, 1000)\n",
"generated[:20]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.hist(generated, bins=15)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.hist(np.random.normal(0,1,50000), bins=300)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"由於現實生活中的大多數數值呈常態分佈,我們不應使用均勻隨機數生成器來產生樣本數據。以下是若嘗試使用均勻分布(由 `np.random.rand` 生成)來產生體重數據時的情況:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"wrong_sample = np.random.rand(1000)*2*std+mean-std\n",
"plt.figure(figsize=(10,6))\n",
"plt.hist(wrong_sample)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 信賴區間\n",
"\n",
"現在我們來計算棒球選手體重和身高的信賴區間。我們將使用[這個 stackoverflow 討論](https://stackoverflow.com/questions/15033511/compute-a-confidence-interval-from-sample-data)中的程式碼:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import scipy.stats\n",
"\n",
"def mean_confidence_interval(data, confidence=0.95):\n",
" a = 1.0 * np.array(data)\n",
" n = len(a)\n",
" m, se = np.mean(a), scipy.stats.sem(a)\n",
" h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)\n",
" return m, h\n",
"\n",
"for p in [0.85, 0.9, 0.95]:\n",
" m, h = mean_confidence_interval(df['Weight'].fillna(method='pad'),p)\n",
" print(f\"p={p:.2f}, mean = {m:.2f} ± {h:.2f}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 假設檢定\n",
"\n",
"讓我們來探索我們的棒球選手資料集中不同的角色:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.groupby('Role').agg({ 'Weight' : 'mean', 'Height' : 'mean', 'Age' : 'count'}).rename(columns={ 'Age' : 'Count'})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"讓我們來檢驗一個假設:一壘手比二壘手身高。最簡單的方法是檢驗信賴區間:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for p in [0.85,0.9,0.95]:\n",
" m1, h1 = mean_confidence_interval(df.loc[df['Role']=='First_Baseman',['Height']],p)\n",
" m2, h2 = mean_confidence_interval(df.loc[df['Role']=='Second_Baseman',['Height']],p)\n",
" print(f'Conf={p:.2f}, 1st basemen height: {m1-h1[0]:.2f}..{m1+h1[0]:.2f}, 2nd basemen height: {m2-h2[0]:.2f}..{m2+h2[0]:.2f}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我們可以看到區間並未重疊。\n",
"\n",
"一個在統計上更正確的證明方法是使用**Student t檢定**\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from scipy.stats import ttest_ind\n",
"\n",
"tval, pval = ttest_ind(df.loc[df['Role']=='First_Baseman',['Height']], df.loc[df['Role']=='Second_Baseman',['Height']],equal_var=False)\n",
"print(f\"T-value = {tval[0]:.2f}\\nP-value: {pval[0]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`ttest_ind` 函數返回的兩個值是:\n",
"* p 值可以被視為兩個分布具有相同平均值的機率。在我們的例子中p 值非常低,這意味著有強烈的證據支持一壘手比較高。\n",
"* t 值是標準化平均差異的中間值,用於 t 檢定,並且會與給定信心水準的閾值進行比較。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用中心極限定理模擬常態分佈\n",
"\n",
"Python 中的偽隨機生成器是設計來產生均勻分佈的。如果我們想要創建一個常態分佈的生成器,我們可以使用中心極限定理。要得到一個常態分佈的值,我們只需計算一組均勻生成樣本的平均值。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def normal_random(sample_size=100):\n",
" sample = [random.uniform(0,1) for _ in range(sample_size) ]\n",
" return sum(sample)/sample_size\n",
"\n",
"sample = [normal_random() for _ in range(100)]\n",
"plt.figure(figsize=(10,6))\n",
"plt.hist(sample)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 相關性與邪惡棒球公司\n",
"\n",
"相關性讓我們能找到資料序列之間的關係。在我們的玩具範例中假設有一家邪惡的棒球公司根據球員的身高支付薪水——球員身高越高拿到的錢就越多。假設有基本薪資1000美元以及根據身高額外支付0到100美元的獎金。我們將使用MLB的真實球員資料計算他們的假想薪水\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"heights = df['Height'].fillna(method='pad')\n",
"salaries = 1000+(heights-heights.min())/(heights.max()-heights.mean())*100\n",
"print(list(zip(heights, salaries))[:10])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"現在讓我們計算這些序列的共變異數與相關係數。`np.cov` 會給我們所謂的 **共變異數矩陣**,這是共變異數在多變量上的擴展。共變異數矩陣 $M$ 的元素 $M_{ij}$ 是輸入變量 $X_i$ 與 $X_j$ 之間的共變異數,而對角線上的值 $M_{ii}$ 則是 $X_i$ 的變異數。類似地,`np.corrcoef` 會給我們 **相關係數矩陣**。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(f\"Covariance matrix:\\n{np.cov(heights, salaries)}\")\n",
"print(f\"Covariance = {np.cov(heights, salaries)[0,1]}\")\n",
"print(f\"Correlation = {np.corrcoef(heights, salaries)[0,1]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"相關係數等於1表示兩個變數之間存在強烈的**線性關係**。我們可以透過繪製一個變數相對於另一個變數的散點圖來直觀地觀察這種線性關係:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.scatter(heights,salaries)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"讓我們看看如果關係不是線性的會發生什麼。假設我們的公司決定隱藏身高和薪資之間明顯的線性依賴關係,並在公式中引入一些非線性,比如 `sin`\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"salaries = 1000+np.sin((heights-heights.min())/(heights.max()-heights.mean()))*100\n",
"print(f\"Correlation = {np.corrcoef(heights, salaries)[0,1]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"在這種情況下,相關性略微降低,但仍然相當高。現在,為了讓這個關係不那麼明顯,我們可能想通過給薪水加入一些隨機變數來增加額外的隨機性。讓我們看看會發生什麼:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"salaries = 1000+np.sin((heights-heights.min())/(heights.max()-heights.mean()))*100+np.random.random(size=len(heights))*20-10\n",
"print(f\"Correlation = {np.corrcoef(heights, salaries)[0,1]}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.scatter(heights, salaries)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> 你能猜出為什麼這些點會排列成這樣的垂直線嗎?\n",
"\n",
"我們已經觀察到了像薪水這樣的人為設計概念與觀察變數*身高*之間的相關性。現在讓我們看看兩個觀察變數,例如身高和體重,是否也存在相關性:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"np.corrcoef(df['Height'].ffill(),df['Weight'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"不幸的是,我們沒有得到任何結果——只有一些奇怪的 `nan` 值。這是因為我們序列中的某些值是未定義的,以 `nan` 表示,導致運算結果也未定義。從矩陣中我們可以看到,`Weight` 是有問題的欄位,因為已經計算了 `Height` 值之間的自我相關。\n",
"\n",
"> 這個範例顯示了**資料準備**與**清理**的重要性。沒有妥善的資料,我們無法計算任何東西。\n",
"\n",
"讓我們使用 `fillna` 方法來填補缺失值,並計算相關性:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"np.corrcoef(df['Height'].fillna(method='pad'), df['Weight'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"確實存在相關性,但並不像我們的人工範例中那麼強烈。事實上,如果我們將一個值與另一個值繪製散點圖,關係會不那麼明顯:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.scatter(df['Weight'],df['Height'])\n",
"plt.xlabel('Weight')\n",
"plt.ylabel('Height')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 結論\n",
"\n",
"在本筆記本中,我們學會了如何對資料執行基本操作以計算統計函數。我們現在知道如何使用完善的數學和統計工具來證明一些假設,以及如何根據資料樣本計算任意變量的信賴區間。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**免責聲明** \n本文件係使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力確保翻譯的準確性,但自動翻譯可能仍包含錯誤或不準確之處。原始文件的母語版本應被視為權威版本。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用本翻譯所引起的任何誤解或誤譯負責。\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
},
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.6"
},
"coopTranslator": {
"original_hash": "0f899e3c5019f948e7c787b22f3b2304",
"translation_date": "2026-01-16T10:10:46+00:00",
"source_file": "1-Introduction/04-stats-and-probability/notebook.ipynb",
"language_code": "tw"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Loading…
Cancel
Save