資料可觀測性是確保資料品質的關鍵環節,尤其在資料驅動決策日益重要的今天,更顯得至關重要。本文將以一個模擬的系外行星資料集為例,逐步示範如何建構異常檢測演算法,特別是如何監控資料的 Freshness 和 Distribution 這兩個關鍵指標。我們將使用 SQLite 和 SQL 查詢來分析資料,並透過 Python 程式碼進行輔助處理。這個方法適用於各種資料函式庫環境,例如 MySQL 和 Snowflake 等,只需稍作修改即可。此資料集包含了系外行星的 ID、與地球的距離、表面重力、軌道週期、平均溫度以及資料新增日期等資訊。透過分析這些資料,我們可以瞭解資料更新的頻率、規律性,以及資料的分佈情況,從而及早發現潛在的異常問題,確保資料的可靠性和一致性。
圖表翻譯:
此圖示展示了已知未知和未知未知的範例,包括了常見的資料品質問題和潛在的異常情況。透過理解這些不同的資料問題型別,企業可以更好地設計和實施資料監控和異常檢測策略。
建構異常檢測演算法
為了具體呈現異常檢測的運作方式,讓我們透過一個真實世界的教學範例,來建立針對高度異常資料集的異常檢測器。 需要注意的是,建構資料品質監控的方法與技術多種多樣,具體選擇取決於您的技術堆積疊。在本範例中,我們採用以下語言和工具: • SQLite 和 SQL • Jupyter Notebooks • Python
我們的範例資料生態系統使用了模擬的關於宜居系外行星的天文資料。為了本次練習的目的,我們使用Python生成了資料集,並模擬了在生產環境中真實發生的異常情況。該資料集完全開放供使用,儲存函式庫中的utils資料夾包含了生成資料的程式碼,如果您對其組裝方式感興趣,可以進一步瞭解。
我們將使用SQLite3.32.3,這使得資料函式庫可以從命令提示字元或SQL檔案中輕鬆存取,且只需極少的設定。這些概念可以擴充套件到幾乎任何查詢語言,並且這些實作可以以最小的改動擴充套件到MySQL、Snowflake和其他資料函式庫環境。
以下,我們分享了關於EXOPLANETS資料集的表格資訊,包括五個特定的資料函式庫條目:
$ sqlite3 EXOPLANETS.db
sqlite> PRAGMA TABLE_INFO(EXOPLANETS);
_id | TEXT |0 | |0
distance | REAL |0 | |0
g | REAL |0 | |0
orbital_period | REAL |0 | |0
avg_temp | REAL |0 | |0
date_added | TEXT |0 | |0
EXOPLANETS中的一個資料函式庫條目包含以下資訊:
- _id:對應於該行星的UUID
- distance:與地球的距離,以光年為單位
- g:表面重力,以重力常數g的倍數表示
- orbital_period:單個軌道週期的長度,以天為單位
- avg_temp:平均表面溫度,以開爾文度為單位
- date_added:我們的系統發現該行星並自動將其新增至資料函式庫的日期
需要注意的是,由於資料缺失或錯誤,特定行星的distance、g、orbital_period和avg_temp中的一個或多個可能為NULL。
內容解密:
此段落描述了資料函式庫表格的結構與各欄位的意義。透過PRAGMA TABLE_INFO(EXOPLANETS);
命令,可以查詢到EXOPLANETS表格的欄位資訊,包括欄位名稱、資料型別等。這些資訊對於瞭解資料集的結構至關重要。
如果我們執行sqlite> SELECT * FROM EXOPLANETS LIMIT 5;
,可以從資料函式庫中提取五列資料。範例4-1展示了EXOPLANETS資料集中的五個資料函式庫條目,以突出資料的格式和分佈。
_id,distance,g,orbital_period,avg_temp,date_added
c168b188-ef0c-4d6a-8cb2-f473d4154bdb,34.6273036348341,,476.480044083599, ...
e7b56e84-41f4-4e62-b078-01b076cea369,110.196919810563,2.52507362359066, ...
a27030a0-e4b4-4bd7-8d24-5435ed86b395,26.6957950454452,10.2764970016067, ...
54f9cf85-eae9-4f29-b665-855357a14375,54.8883521129783,,173.788967912197, ...
4d06ec88-f5c8-4d03-91ef-7493a12cd89e,153.264217159834,0.922874568459221, ...
內容解密:
範例4-1展示了EXOPLANETS資料集中的五個資料列,每列代表一個系外行星的相關資料。這些資料包括行星的ID、與地球的距離、表面重力、軌道週期、平均溫度以及資料新增的日期。透過檢視這些資料,可以瞭解資料集的內容和格式。
需要注意的是,本次練習是回溯性的——我們正在檢視歷史資料。在生產環境中的資料環境中,異常檢測是即時的,並在資料生命週期的每個階段都得到應用,因此將涉及與此處所做內容略有不同的實作。
為了本次練習的目的,我們將為freshness和distribution建立資料可觀測性演算法,但在未來的文章中,我們將討論我們的五大支柱——以及更多。
監控Freshness
我們監控的資料可觀測性的第一大支柱是freshness,它可以為我們提供強有力的指標,告訴我們關鍵資料資產最後一次更新的時間。如果一個每小時定期更新的報告突然看起來非常陳舊,這種型別的異常應該給我們一個強烈的跡象,表明某些東西不準確或有其他問題。
首先,請注意DATE_ADDED欄位。SQL不會儲存關於何時新增個別記錄的元資料。因此,為了在這個回溯性設定中視覺化freshness,我們需要自己追蹤該資訊。按照DATE_ADDED欄位進行分組,可以讓我們瞭解EXOPLANETS每天的更新情況。如範例4-2所示,我們可以查詢每天新增的ID數量。
SELECT
DATE_ADDED,
COUNT(*) AS ROWS_ADDED
FROM
EXOPLANETS
GROUP BY
DATE_ADDED;
內容解密:
此SQL查詢按照DATE_ADDED
欄位進行分組,並計算每天新增的資料列數。這可以幫助我們瞭解資料集的更新頻率和規律。透過執行這個查詢,我們可以獲得每天新增的資料列數量,從而評估資料的freshness。
您可以透過在儲存函式庫中執行$ sqlite3 EXOPLANETS.db < queries/freshness/rows-added.sql
來自行執行此操作。我們得到的資料如範例4-3所示。
date_added ROWS_ADDED
2020-01-01 84
2020-01-02 92
2020-01-03 101
2020-01-04 102
2020-01-05 100
... ...
2020-07-14 104
2020-07-15 110
2020-07-16 103
2020-07-17 89
2020-07-18 104
內容解密:
範例4-3展示了根據範例4-2中的查詢獲得的結果。這些資料顯示了每天新增至EXOPLANETS資料集中的資料列數量。透過檢視這些資料,可以觀察到資料集的更新模式和可能的異常情況。
根據這個資料集的圖形表示,看起來EXOPLANETS每天都以大約100個新條目的數量一致地更新,儘管在某些日期沒有資料新增。回想一下,對於freshness,我們想要問的問題是「我的資料是最新的嗎?」——因此,瞭解表格更新中的那些間隙對於理解我們資料的可靠性至關重要。
下面的查詢(範例4-4)透過引入DAYS_SINCE_LAST_UPDATE的指標來操作化freshness(如圖4-2所示)。(注意:由於本教學使用SQLite3,因此計算時間差的SQL語法在MySQL、Snowflake和其他環境中會有所不同。)
WITH UPDATES AS (
SELECT
DATE_ADDED,
COUNT(*) AS ROWS_ADDED
FROM
EXOPLANETS
GROUP BY
DATE_ADDED
)
SELECT
DATE_ADDED,
JULIANDAY(DATE_ADDED) - JULIANDAY(LAG(DATE_ADDED) OVER (ORDER BY DATE_ADDED)) AS DAYS_SINCE_LAST_UPDATE
FROM
UPDATES;
內容解密:
範例4-4中的查詢首先建立了一個臨時表UPDATES
,其中包含了每天新增的資料列數量。然後,它計算了每個日期與前一個日期之間的差異,以天數表示,得到DAYS_SINCE_LAST_UPDATE
指標。這個指標可以幫助我們瞭解資料更新的頻率和連續性。
得到的表格(範例4-5)表示:「在日期X,EXOPLANETS中最新的資料是Y天前的。」這是從表格中的DATE_ADDED欄位無法直接獲得的資訊——但透過應用資料可觀測性,我們獲得了揭露它的工具。如圖4-3所示,freshness異常由高Y值表示。這表示表格更新的延遲,我們可以透過簡單的檢測器進行查詢。
DATE_ADDED DAYS_SINCE_LAST_UPDATE
2020–01–01
2020–01–02 1
2020–01–03 1
2020–01–04 1
2020–01–05 1
... ...
2020–07–14 1
2020–07–15 1
內容解密:
範例4-5展示了根據範例4-4中的查詢獲得的結果。這些資料顯示了每個日期與前一個日期之間的差異,以天數表示。透過檢視這些資料,可以觀察到資料更新的連續性和可能的異常情況。
graph LR A[開始] --> B[查詢資料] B --> C[計算DAYS_SINCE_LAST_UPDATE] C --> D[分析freshness] D --> E[檢測異常]
圖表翻譯:
此圖表展示了監控資料freshness的流程。首先,我們查詢資料並計算每天新增的資料列數量。然後,我們計算每個日期與前一個日期之間的差異,以天數表示,得到DAYS_SINCE_LAST_UPDATE
指標。透過分析這些資料,我們可以檢測到資料更新的異常情況。
進一步擴充
為了達到6,000至10,000字的要求,我們可以進一步擴充以下內容:
- 詳細介紹異常檢測的演算法和技術:探討各種異常檢測演算法的原理和實作方法。
- 提供更多實際案例和應用場景:分享更多實際的案例和應用場景,展示異常檢測在不同領域的應用。
- 比較不同資料函式庫環境下的實作差異:比較在不同資料函式庫環境下(如MySQL、Snowflake等)實作異常檢測的差異和挑戰。
- 探討資料可觀測性:討論資料可觀測性的未來發展趨勢和可能的創新方向。
透過這些擴充內容,可以進一步豐富文章,提升技術深度和廣度。
建構異常偵測演算法:資料新鮮度與分佈監控
在資料管線的監控與異常偵測中,資料的新鮮度(freshness)和分佈(distribution)是兩個至關重要的指標。本章節將探討如何利用SQL查詢來偵測資料新鮮度的異常,並進一步分析資料的分佈特性,以建立有效的異常偵測機制。
資料新鮮度異常偵測
資料新鮮度是指資料更新的及時性。在許多應用場景中,資料的新鮮度直接影響到決策的正確性。例如,在分析系外行星(exoplanet)的資料時,如果資料長時間未更新,可能意味著資料管線出現問題。
SQL查詢範例
以下是一個使用SQLite查詢來偵測資料新鮮度異常的範例:
WITH UPDATES AS (
SELECT
DATE_ADDED,
COUNT(*) AS ROWS_ADDED
FROM
EXOPLANETS
GROUP BY
DATE_ADDED
),
NUM_DAYS_UPDATES AS (
SELECT
DATE_ADDED,
JULIANDAY(DATE_ADDED) - JULIANDAY(LAG(DATE_ADDED) OVER (ORDER BY DATE_ADDED)) AS DAYS_SINCE_LAST_UPDATE
FROM
UPDATES
)
SELECT
*
FROM
NUM_DAYS_UPDATES
WHERE
DAYS_SINCE_LAST_UPDATE > 1;
內容解密:
- CTE(Common Table Expressions)使用:首先,我們定義了兩個CTE:
UPDATES
和NUM_DAYS_UPDATES
。UPDATES
計算每天新增的資料筆數,而NUM_DAYS_UPDATES
則計算每次更新之間的時間間隔。 - 時間間隔計算:使用
JULIANDAY
函式將日期轉換為Julian日,並利用LAG
視窗函式計算與前一次更新的時間差。 - 異常偵測:最後,我們篩選出
DAYS_SINCE_LAST_UPDATE > 1
的資料,即資料更新間隔超過一天的記錄。
設定門檻引數
在上述查詢中,DAYS_SINCE_LAST_UPDATE > 1
中的1
是一個門檻引數,用於決定何謂異常。調整這個引數會影響偵測的精確度和召回率(recall)。例如,將門檻設為7
,則只會偵測到更嚴重的異常(例如,資料更新間隔超過七天)。
SELECT
*
FROM
NUM_DAYS_UPDATES
WHERE
DAYS_SINCE_LAST_UPDATE > 7;
圖表翻譯:
此查詢結果視覺化為圖表(Figure4-6),顯示不同門檻值下的異常偵測結果。隨著門檻值的提高,較小的異常將被忽略。
資料分佈監控
除了資料新鮮度外,資料的分佈也是監控的重要導向。資料分佈告訴我們資料的預期值及其出現頻率。一個簡單的問題是:「我的資料有多少是NULL?」在許多情況下,一些缺失的資料是可以接受的,但如果NULL的比例從10%突然增加到90%,這就需要引起注意。
常態分佈與中央極限定理
統計學中,常態分佈(或稱高斯分佈)是描述資料分佈的重要工具。根據中央極限定理,當樣本數量足夠大時,樣本均值的分佈會趨近於常態分佈。利用常態分佈,我們可以計算每個觀測值的標準分數(z-score),進而判斷其是否為異常值。
SELECT
(VALUE - AVG(VALUE) OVER ()) / STDDEV(VALUE) OVER () AS Z_SCORE
FROM
YOUR_TABLE;
內容解密:
標準分數計算:利用視窗函式計算每個值的z-score,以判斷其與平均值的偏離程度。
異常值判斷:理論上,可以設定一個z-score的門檻來識別異常值。然而,實際應用中,單純依賴統計方法可能無法完全捕捉到「有趣」的異常,因為業務資料往往具有相關性和複雜性。
機器學習應用:結合機器學習演算法,提高異常偵測的準確性和效率。
即時監控:建立即時資料監控系統,及時發現並處理異常。
跨部門協作:加強資料團隊與業務部門的協作,共同制定異常偵測的標準和應對策略。
透過持續最佳化和改進異常偵測機制,我們可以更好地保障資料品質,為業務決策提供可靠的支援。
資料新鮮度異常視覺化
graph LR A[開始偵測] --> B[計算資料更新間隔] B --> C[設定門檻引數] C --> D[篩選異常資料] D --> E[視覺化異常結果]
圖表翻譯: 此圖表展示了資料新鮮度異常偵測的流程,從計算資料更新間隔到視覺化異常結果,每一步都至關重要。透過設定適當的門檻引數,可以有效篩選出需要關注的異常資料。