返回目錄
A
數據洞察:以資料科學驅動商業決策 - 第 2 章
第二章:資料收集與管道設計
發布於 2026-03-02 01:47
# 第二章:資料收集與管道設計
資料科學的第一步是確保資料來源完整、品質良好,並且能夠高效地進入分析流程。本章將從資料來源分類、收集方式、ETL 流程到資料湖與資料倉儲的設計與實務落地,為後續模型建構與部署奠定堅實基礎。
---
## 2.1 資料來源概覽
| 資料類型 | 典型來源 | 特性 | 典型使用情境 |
|---|---|---|---|
| 結構化 | ERP、CRM、交易系統 | 完整表結構、鍵值關聯 | 財務報表、客戶關係管理 |
| 半結構化 | JSON、XML、Log 檔 | 可解析字段、可擴充 | API 回傳、Web 伺服器日誌 |
| 非結構化 | 影像、影片、語音、文字檔 | 無固定結構 | 產品照片、客服語音、社群貼文 |
> **實務提示**:先針對業務目標確認「核心資料」與「輔助資料」的比例,避免在收集初期即投入大量資源於不必要的資料。
---
## 2.2 內部系統資料
### 2.2.1 企業關鍵系統
| 系統 | 典型表格 | 重要指標 |
|---|---|---|
| ERP(Enterprise Resource Planning) | `sales_order`, `inventory`, `purchase_order` | 交易金額、庫存週轉率 |
| CRM(Customer Relationship Management) | `customer`, `lead`, `activity` | 客戶終身價值、轉化率 |
| IoT 裝置 | `device_status`, `sensor_reading` | 設備可靠度、維修頻率 |
### 2.2.2 資料抽取方式
- **資料庫連線**:使用 JDBC / ODBC 直接讀取資料庫。
- **批次抽取**:利用 ETL 工具定時抽取資料表。
- **CDC(Change Data Capture)**:捕捉資料庫變更流,減少資料重複。
sql
-- 範例:使用 Snowflake 提取 ERP 資料
SELECT * FROM ERP.SALES_ORDER WHERE ORDER_DATE >= '2024-01-01';
---
## 2.3 第三方 API
第三方 API 提供即時或批次的業務數據,常見於金融、天氣、行銷等領域。
### 2.3.1 RESTful API
http
GET https://api.example.com/v1/sales?date=2024-02-01
Accept: application/json
- **認證**:OAuth2、API Key、JWT。
- **速率限制**:需設計重試機制與排程策略。
### 2.3.2 GraphQL
GraphQL 允許客戶端自行指定回傳欄位,減少不必要的資料傳輸。
graphql
query {
sales(date: "2024-02-01") {
orderId
amount
customer {
name
region
}
}
}
> **實務建議**:使用 SDK 或自動生成程式碼(如 OpenAPI Codegen)可快速落地;同時將 API 請求結果緩存於資料湖,以利後續分析。
---
## 2.4 網路爬蟲
對於公開網頁或社群平台,爬蟲是收集非結構化資料的重要手段。
### 2.4.1 技術棧
| 工具 | 說明 |
|---|---|
| Scrapy | Python 網路爬蟲框架,支援異步、管道處理 |
| BeautifulSoup | HTML 解析器,適合簡易抓取 |
| Selenium | 虛擬瀏覽器,能處理 JavaScript 渲染 |
### 2.4.2 爬蟲流程
1. **目標定義**:確定要抓取的 URL 與資料結構。
2. **抓取**:使用 Scrapy 的 Spider 定義抓取邏輯。
3. **清洗**:在 Item Pipeline 中進行資料清洗、驗證。
4. **存儲**:輸出至 JSON、CSV 或直接寫入資料湖。
python
# Scrapy 爬蟲範例:抓取商品價格
import scrapy
class ProductSpider(scrapy.Spider):
name = "product"
start_urls = ["https://example.com/products"]
def parse(self, response):
for product in response.css('.product'):
yield {
'name': product.css('.name::text').get(),
'price': product.css('.price::text').get(),
'url': product.css('a::attr(href)').get(),
}
> **注意**:爬蟲請遵守 robots.txt 規範,並避免對目標網站造成過度負載。
---
## 2.5 ETL 基礎架構
### 2.5.1 定義
- **ETL**:Extract(抽取)→ Transform(轉換)→ Load(載入)。
- **ELT**:Extract → Load → Transform,適用於資料湖。
### 2.5.2 資料流程圖
┌───────────────┐ ┌─────────────────┐ ┌───────────────┐
│ 資料來源 │──▶│ ETL/ELT 流程 │──▶│ 目的地 │
└───────────────┘ └─────────────────┘ └───────────────┘
### 2.5.3 常見 ETL 工具
| 工具 | 優勢 |
|---|---|
| Airflow | 工作流編排、可視化、擴充性 |
| Prefect | Python 原生、錯誤重試自動化 |
| dbt | 資料轉換、測試、版本控制 |
| Talend | 封裝化、可視化設計 |
### 2.5.4 轉換策略
- **Schema-on-read vs Schema-on-write**:資料湖常採 Schema-on-read,資料倉儲採 Schema-on-write。
- **資料清洗**:缺失值處理、重複刪除、資料類型轉換。
- **資料品質檢測**:數值範圍、字串格式、關聯完整性。
---
## 2.6 資料湖 vs 資料倉儲
| 特色 | 資料湖 | 資料倉儲 |
|---|---|---|
| 儲存格式 | 原始檔案(Parquet、ORC、CSV、JSON) | 結構化表格(Star / Snowflake schema) |
| 讀寫模式 | Schema-on-read | Schema-on-write |
| 成本 | 低(存儲成本) | 高(運算 & 存儲) |
| 目的 | 原始資料探索、機器學習 | 商業報表、BI 分析 |
| 性能 | 依賴查詢引擎(Presto、Spark) | OLAP 引擎(Snowflake、Redshift) |
> **實務建議**:以資料湖為核心,將需要即時報表的資料轉換為資料倉儲;同時保留原始資料以供模型訓練或追溯。
---
## 2.7 建置要點
1. **統一元資料平台**:選擇雲端或自建,確保跨團隊存取一致。
2. **資料治理**:建立資料目錄、元資料管理、存取權限。
3. **安全機制**:加密(在傳輸與靜態)、身份驗證、審計日誌。
4. **彈性伸縮**:使用容器化(K8s)或無伺服器(Serverless)以降低運維成本。
5. **監控 & 報警**:ETL 作業失敗、資料延遲、容量告警等。
6. **成本管理**:利用預留實例、資料分層儲存(熱冷分層)。
---
## 2.8 工具生態
| 類別 | 工具 | 主要功能 |
|---|---|---|
| 數據抽取 | Fivetran, Stitch | 雙向同步,支持多種資料源 |
| 工作流 | Airflow, Prefect, Dagster | 任務排程、依賴關係管理 |
| 資料轉換 | dbt, Spark | SQL / PySpark 轉換、測試 |
| 資料湖 | AWS S3, Azure Data Lake, Google Cloud Storage | 大規模檔案儲存 |
| 資料倉儲 | Snowflake, BigQuery, Redshift | OLAP、即時查詢 |
| 元資料 | DataHub, Amundsen | 資料目錄、搜尋 |
> **選型提示**:根據企業規模、技術棧與成本考量,逐步構建「金字塔式」資料平台:底層為資料湖,頂層為資料倉儲。
---
## 2.9 實務案例
### 2.9.1 零售客流分析
| 步驟 | 具體做法 |
|---|---|
| 1. 資料收集 | 透過 POS 系統、Wi‑Fi 熱點、客流監測攝像頭收集
| 2. ETL | 使用 Airflow 定時抽取,dbt 轉換為每日客流表
| 3. 資料湖 | 存於 S3,檔案格式為 Parquet
| 4. 資料倉儲 | Snowflake 中建立星型 schema,供 BI 報表使用
| 5. 商業洞察 | 分析高峰時段、商品停留時間,優化陳列策略
| 6. 成效 | 平均客單價提升 5%,庫存周轉率提升 8% |
### 2.9.2 製造業機器維修預測
| 步驟 | 具體做法 |
|---|---|
| 1. 資料收集 | IoT 裝置發送實時溫度、振動資料至 MQTT
| 2. ETL | 使用 Spark Structured Streaming 進行即時聚合
| 3. 資料湖 | 以 Delta Lake 格式儲存 30 天快照
| 4. 資料倉儲 | Redshift 中建立維修事件表
| 5. 模型 | 以歷史維修記錄訓練 LightGBM 預測維修機率
| 6. 部署 | 模型 API 部署於 SageMaker,Slack 事件通知
| 7. 成效 | 未預期停機時間降低 20%,維修成本降低 12% |
---
## 2.10 常見挑戰與解決方案
| 挑戰 | 可能原因 | 解決方案 |
|---|---|---|
| 資料不一致 | 不同系統格式差異 | 采用統一資料模式(JSON Schema)與 ETL 標準化流程 |
| 資料延遲 | 網路或處理瓶頸 | 引入即時處理(Kafka + Spark Streaming)與資源擴容 |
| 成本失控 | 大量資料存儲與運算 | 建立資料分層、冷熱分離、使用預留實例 |
| 安全合規 | GDPR/個資法 | 數據加密、資料匿名化、訪問審計 |
| 人才缺口 | 資料工程師短缺 | 內部培訓、外包平台(Upwork、Toptal) |
---
## 2.11 小結
本章從資料來源到管道設計,涵蓋了資料收集的全流程與實務工具。掌握資料湖與資料倉儲的設計要點,以及 ETL/ELT 的最佳實踐,將使資料科學團隊能夠快速、穩健地提供高品質資料,為後續分析、建模與決策提供堅實基礎。