聊天視窗

決策的數據語言:從原始數據到洞察力 - 第 2 章

第 2 章:數據採集與儲存

發布於 2026-03-03 08:48

# 第 2 章:數據採集與儲存 在數據科學的流程中,**數據採集與儲存**是決定後續分析品質與效率的基石。本章將帶領讀者從原始資料的取得,到結構化與非結構化資料的儲存,並探討設計資料管道時必須考量的關鍵原則與實務範例。 --- ## 2.1 何謂「數據採集」? - **定義**:從外部或內部來源,使用各種技術手段將資訊轉換成機器可讀的格式。<br> - **分類**: - **結構化資料**:表格、資料庫、CSV。<br> - **半結構化資料**:JSON、XML、YAML。<br> - **非結構化資料**:文字、圖片、影片、音訊。 - **目標**:保留資料完整性、可追溯性與可擴充性,為「資料品質管理」與「資料治理」奠定基礎。 --- ## 2.2 API(Application Programming Interface)採集 ### 2.2.1 為什麼選擇 API? | 優點 | 說明 | |------|------| | **即時性** | 透過 REST / GraphQL 可在毫秒級取得最新數據。 | | **結構化** | 回傳 JSON / XML,方便直接轉換為 DataFrame。 | | **授權機制** | OAuth、API Key 可確保資料安全。 | | **可測試性** | 可用 Postman / curl 進行單元測試。 | ### 2.2.2 實作範例:使用 Python 取得 Twitter Streaming API python import requests import json # 1. 設定授權資訊(示例,實務上請勿硬編碼) headers = { "Authorization": "Bearer YOUR_ACCESS_TOKEN" } # 2. 發送 GET 請求(此為舊版 REST 範例) url = "https://api.twitter.com/2/tweets/search/recent" params = { "query": "#DataScience -is:retweet", "max_results": 100 } response = requests.get(url, headers=headers, params=params) # 3. 解析回傳 JSON tweets = response.json() print(json.dumps(tweets, indent=2, ensure_ascii=False)) > **實務建議**:使用 `aiohttp` 或 `httpx` 進行非同步呼叫,可大幅提升吞吐量。 --- ## 2.3 Web Scraping ### 2.3.1 適用場景 - 無法透過官方 API 取得資料。<br> - 需要收集公開網站中的表格、文章或評論等資料。 ### 2.3.2 工具與框架 | 工具 | 說明 | |------|------| | BeautifulSoup | Python HTML 解析,適合簡單抓取。 | | Scrapy | 完整的爬蟲框架,支援分布式、異步。 | | Selenium | 需要執行 JavaScript 的網站可使用。 | ### 2.3.3 範例:Scrape 商品價格 python import requests from bs4 import BeautifulSoup url = "https://www.example.com/products/123" headers = {"User-Agent": "Mozilla/5.0"} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") price = soup.select_one("span.price").text.strip() print(f"商品價格:{price}") > **注意**:遵守網站的 robots.txt 規範,避免對服務造成過度負載。 --- ## 2.4 資料倉儲(Data Warehouse) vs 資料湖(Data Lake) | | 資料倉儲 | 資料湖 | |---|---|---| | **資料類型** | 結構化 | 非結構化、半結構化與結構化 | | **模式** | 模式先行(Schema‑on‑write) | 模式後行(Schema‑on‑read) | | **使用者** | 業務分析師、BI 工具 | 數據科學家、機器學習工程師 | | **技術棧** | Snowflake、Redshift、BigQuery | Hadoop、AWS S3、Azure Data Lake Storage | | **主要用途** | 報表、OLAP | 大數據處理、資料探索 | ### 2.4.1 資料倉儲設計原則 1. **主題導向**:以業務主題(如銷售、客戶、財務)作為分區。<br> 2. **星型 / 雪花型模型**:主表 (Fact) + 事實維度 (Dimension)。<br> 3. **ETL/ELT 流程**:提取 → 轉換 → 加載;或提取 → 加載 → 轉換。<br> 4. **資料治理**:版本控制、資料品質審核、資料字典管理。 ### 2.4.2 資料湖設計原則 1. **分層架構**:Raw、Curated、Refined 三層。<br> 2. **資料格式**:原始資料儲存為 Parquet / ORC;結構化資料可轉成 Delta Lake。<br> 3. **資料分類**:使用元資料 (Metadata) 進行標記,便於搜尋與重複使用。<br> 4. **存取權限**:使用 IAM、ACL 或 Lake Formation 等工具進行細粒度授權。 --- ## 2.5 設計資料管道的關鍵考量 | 步驟 | 重要點 | 工具範例 | |------|--------|----------| | **需求定義** | 商業 KPI、資料來源、更新頻率 | 需求文檔、Stakeholder 會議 | | **資料來源評估** | API、文件、傳感器、第三方資料 | Postman、SFTP、MQTT | | **ETL/ELT 工程** | 可擴充、可重複使用、容錯 | Airflow、Prefect、Databricks Jobs | | **資料品質** | 完整性、正確性、時效性 | Great Expectations、dbt | | **安全與合規** | 加密、審計、隱私保護 | Vault、Snowflake Vault Integration | | **監控與告警** | 成功率、延遲、資源利用率 | Prometheus、Grafana | ### 2.5.1 實務示例:金融交易數據管道 1. **來源**:交易系統 REST API + 日誌檔案。<br> 2. **ETL 工具**:Airflow DAG,使用 PythonOperator 下載 API,Spark 作業做資料清洗。<br> 3. **儲存**:Raw 資料放於 S3 Glacier,Curated 資料寫入 Snowflake。<br> 4. **資料品質**:利用 Great Expectations 在 Spark 作業中校驗欄位非空、數值範圍。<br> 5. **監控**:Airflow UI + Grafana 監控 DAG 執行時間,失敗即發送 Slack 通知。 --- ## 2.6 小結 - **數據採集**:選擇合適的技術(API、Web Scraping)以符合資料時效與結構化需求。<br> - **儲存結構**:資料倉儲適合業務報表,資料湖則更適合機器學習與大數據探索。<br> - **設計原則**:從商業需求出發,結合資料品質、安全合規與可監控性,構築穩定且可擴充的資料管道。<br> - **下一章**:將深入「數據清洗與前處理」,說明如何將「原始」資料轉化為「可分析」的乾淨資料集。 > **實務提示**:在每一步都加入版本控制(Git、DVC)與自動化測試,確保資料流的可追溯性與可靠性。