# 資料預處理步驟:如何清理企業資料

> 了解如何透過資料預處理步驟,將雜亂的企業記錄轉化為可靠的洞察,並附中小企業實例。看看 ELECTE 如何將這些步驟自動化。

Source: https://www.electe.net/tc/post/data-preprocessing-steps

Site guide: https://www.electe.net/tc/llms.txt

你匯出了一份看起來已經整理好的銷售資料。訂單、成本和日期都填滿了試算表。接著,一份預測報告送到財務主管桌上,平均訂單金額卻突然上升,而產品目錄明明沒有任何變動。

這種跳升通常是預處理出錯,而不是客戶購買行為改變。在檔案裡仍有重複發票時就填補空白價格,或是在保留任何資料列之前就對整份匯出資料進行縮放,都會讓模型提前學到不該看到的資訊。大多數文章會把**資料預處理步驟**當作可以任意順序套用的獨立技巧來列舉,但真正讓結果被高估的,正是順序問題。

以下是我建議分析師在處理正在使用的業務檔案時採用的流程。你會看到執行順序、我視為起點而非鐵律的門檻值,以及鎖定每項擬合設定的方法,讓下一次資料載入沿用相同的處理流程。

## 依正確順序執行的七個資料預處理步驟

一份銷售匯出資料看起來可能很完整,卻仍藏有重複的發票列、空白的單位成本,以及兩種格式並存的日期。如果清理順序錯誤,之後的每個平均值都會繼承這些問題。

**任何需要從資料中學習數值的步驟,都必須在資料拆分之後執行。**若以整份檔案計算平均值、中位數或縮放範圍,驗證資料列就會影響訓練。這樣得出的評分看起來會比模型在下個月訂單上的實際表現更好。

步驟操作內容完成標準1. 檢視與清理檢查列數、資料類型與空值比例；刪除完全重複的資料；統一日期與標籤格式取得乾淨的基礎資料表，每個類別只有一個標籤2. 拆分資料隨機打亂資料列，再分為訓練集與驗證集已建立兩個資料集，且尚未計算任何需從資料學習的設定3. 處理缺失值刪除資料列、刪除該特徵，或僅使用訓練資料進行填補每個欄位皆已完整，或缺漏處已標示4. 編碼與特徵工程將類別轉換為數值；建立比率、時間component與移動平均取得可供模型使用的特徵表，各欄位皆有文件說明5. 處理離群值先確認極端值，再進行封頂、轉換或標記極端值皆有合理解釋，而非憑空猜測6. 數值特徵縮放以訓練資料擬合縮放器，再套用至驗證資料數值欄位的範圍具有可比性7. 固定處理流程儲存所有已擬合的轉換，讓新資料依循相同路徑處理流程可重複執行，適用於每次載入的新資料

假設一家零售商有 12,000 筆訂單明細，其中 900 筆是重複的發票列。如果在刪除這些重複列之前就填補缺漏的價格，同一張發票會被算兩次，平均值也會偏離價目表。

> **實用原則：**下一列要用到的數字，必須等目前這一列處理完才計算。

把你手上開著的檔案對照這七列。第一個尚未完成的列，就是今天唯一值得動手處理的一列。

## 剖析並清理原始業務資料

資料剖析只需一小時，主管在任何人開啟模型之前就能完成。請保持原始檔案不動，並把每一項變更寫進清理記錄，讓財務主管能看出總額為何變動。

1. **計算列數與欄數，再確認每個欄位的類型。**以文字儲存的成本無法加總，而且不會明確報錯。在信任任何總額之前，先轉換格式。
2. **計算每個欄位的空值率。**空白超過 30% 的欄位，應交給缺漏值規則處理，而不是隨手填補。只有在空白超過 50%，且該欄位對決策並非必要時，我才會直接刪除整個欄位。
3. **只移除完全重複的資料，不要動相似的資料。**以發票號碼、日期與金額三者同時比對。明細編號不同的第二筆訂單，是一筆真實的銷售。只因客戶與日期相同就刪除它，會讓營收被低估。
4. **一次完成格式標準化。**統一日期格式，每個欄位只用一種貨幣，代碼中不留多餘空格。格式混用會把同一個產品拆成兩條數列，也會讓之後的資料串接出錯。
5. **統一類別標籤。**`UK`、`U.K.` 與 `United Kingdom` 指的是同一個市場。三年期電商匯出檔中，同一條產品線若有四種寫法，造成的損害也一樣。選定一個標籤，其餘全部對應過去。

假設該匯出檔在某一年把訂單日期存成 `2024-03-01`，另一年則存成 `01/03/2024`。在兩者統一成同一種格式之前，月度圖表會重複計算三月，或漏掉三月。

### 清理記錄與隱私處理保護了什麼

清理記錄是一張簡短的表格：欄位、規則、變更列數、負責人、日期。當財務問起為何去年三月的數字縮水，你可以直接指向重複資料規則，而不必憑記憶重建檔案。

在檔案進入任何分析平台之前，先移除客戶姓名、電子郵件與付款資料。預測需求並不需要這些資料，而把它們留在匯出檔中，會造成模型也無法挽回的隱私問題。

如果你想參考商業資料匯出檔的「良好」標準，[Pipecorn 的銷售資料品質洞察](https://pipecorn.com/blog/data-quality-standards)是一份實用的檢查清單，涵蓋識別碼、完整性與一致性。可用它來決定哪些欄位值得保留，再回頭套用上面的空值率篩選。

## 在任何學習開始之前先切分資料

切分就像一道圍欄。任何需要估算統計量的步驟，都不該在完整檔案上進行。

在監督式文字分類中,[Google 的文字分類指南](https://developers.google.com/machine-learning/guides/text-classification/step-3)建議在切分前先打亂資料,因為保留原始順序可能讓兩個資料集都產生偏差。打亂之後,常見的切分方式是 **80%** 的樣本用於訓練,**20%** 用於驗證。兩個資料集隨後套用相同的轉換,但這些轉換必須先在訓練資料列上學習完成。

### 為什麼已排序的銷售檔案會誤導結果

匯出的資料常按日期、地區或客戶排序。如果從上到下切分這樣的檔案,你會用 2023 年的資料訓練,卻用 2024 年底的資料驗證。得出的分數反映的是日曆、促銷檔期,或單一地區的組合,而不是模型是否真正理解了訂單。

當每一列都是獨立個案時,就應該打亂資料,例如已成交的訂單、已流失的帳戶、已分類的工單。若問題是預測,則不要打亂。

> 預測時請保留時間順序。用較早月份訓練,用較晚月份測試。打亂資料會讓模型看到未來,還被當成是能力。

### 文字欄位需要依頻率篩選

客服工單和產品描述會膨脹成數千個詞元。在同一套 Google 流程中,你要捨棄出現次數少於 **兩次** 的詞元,保留前 **20,000** 個詞元特徵,並用基於 F 檢定的重要性分數為剩下的詞元排序。只出現一次的詞元通常是錯字或一次性的 SKU,不是值得佔用一個欄位的規律。

切分之後,所有對應都只用訓練資料來擬合,再把這份固定的對應套用到驗證資料。若在保留的資料列上重新計算詞彙表或類別清單,同樣會把答案洩漏到資料準備過程中。

## 填補缺失值,又不扭曲結果

欄位空白的頻率,以及決策是否需要該欄位,決定了處理方式。以下區間只是實務上的經驗法則,並非定律。受監管的風險模型可能不允許刪除資料列,而零售預測則可以刪除。

缺失比例特徵重要性處理方式低於 5%任何程度若剩餘資料足夠,直接刪除這些資料列5% 至 30%低刪除該特徵5% 至 30%高僅依訓練資料列進行填補超過 30%高進行填補、新增缺失標記欄位,並調查該欄位為何留空超過 30%低刪除該特徵

一份原本完整的訂單檔案中,只有少數幾筆成本欄位空白,這是第一種情況。刪除這幾行,損失比捏造一個價格小。中段那個很少使用的調查欄位,也不值得硬填一個猜測值,所以直接刪掉整欄。你用來分析流失的客戶年資則要保留,並加以估算。

[Google 關於準備資料的分群指引](https://developers.google.com/machine-learning/clustering/prepare-data)列出三個實用選項:移除含有缺失值的樣本、移除該特徵,或根據其他資料預測缺失值。缺漏很少時,可以考慮刪除資料列;缺漏頻繁時,通常要捨棄該特徵或進行插補。

### 預測缺漏值,而不是貼上一個常數

對於數值欄位,可以用有值的資料列訓練迴歸模型,再估算空白處。例如,缺少的客戶年齡可以根據收入與年資推估,而不是全部換成全公司的同一個平均值。這樣運用的是你已經信任的變數關係。

訂單金額呈偏態分布。少數大額批發單會拉高**平均值**,所以用平均值填補,會讓一般購物籃看起來比實際更有價值。**中位數**貼近典型訂單,出現一張大宗發票時變動也較小。填補前後請比較摘要統計量。若變化很大,代表這個方法是在改寫業務實況,而不是補上一個缺口。

對於類別欄位,可以把空白標記為 `Unknown`。缺漏本身往往就是訊號:例如結帳時沒有記錄地區,或產品沒有供應商代碼。把它變成一個真正的類別,既保留了該資料列,也讓模型知道該欄位是刻意留空的。

在營運中,頻繁的空白並不罕見。一項 2025 年針對不完整用水資料的研究,描述了一個建築物資料集:2019 年 2 月至 2023 年 12 月共有 **33,888** 筆每小時記錄,其中 **20%** 的時段有缺失值。這個比例下,若一律刪除資料列,會丟掉太多歷史資料([該研究](https://arxiv.org/html/2506.08882v1))。

插補器只能用訓練資料列來擬合。若你想進一步檢視方法選擇,[ELECTE 的缺失資料指南](https://www.electe.net/post/missing-data-imputation)更詳細地說明了各種插補選項。

## 編碼類別並設計實用特徵

這裡有兩件事要做:把標籤轉成模型可用的數字,並建立能回答業務問題的欄位,這些問題是原始欄位答不了的。

### 編碼時避免產生虛假排序

**獨熱編碼(one-hot encoding)**適合取值很少的類別,例如五個銷售區域。每個區域都成為各自的「是或否」欄位,沒有任何區域比其他區域「更大」。

**序數編碼(ordinal encoding)**適合有真實順序的資料,例如尺寸 S、M、L。這些數字對應的是業務上本來就在使用的排序。

不要把 1、2、3 指派給沒有順序的名稱,例如通路或城市。模型會把較大的代碼視為「更多」的意思。這種錯誤排序之後會表現為一個很有把握卻錯誤的係數。若某個欄位有數百個類別,獨熱編碼會產生非常寬的資料表。編碼前請把罕見類別歸入 `Other`,而且這個歸類只能依據訓練資料列來學習。

### 回答業務問題的欄位

建立一份與單一決策相關的精簡清單,而不是把你能想到的每個比率全部傾倒進去。

- **毛利率:** `(price − cost) / price` 可以判斷促銷價是否仍高於成本,這是只看營收做不到的。
- **距上次購買天數:**流失檢討需要的是最近一次購買的時間,而不是客戶 ID 的另一份複本。
- **星期幾與月份:**需求規劃關心的是週五的高峰和季節性月份,而這些資訊都藏在完整的時間戳記裡。
- **7 日滾動平均:**每日銷量起伏很大,週平均才看得出需求是否在上升。
- **庫存銷售比:**庫存經理能比只看現有庫存數量更早發現缺貨正在形成。

我會先從與該項決策相關的十到十五個特徵著手。當兩個欄位的相關性高於 0.95 時,刪掉其中一個,因為第二個欄位只是重複第一個。請在資料字典中,把業務含義寫在欄位名稱旁邊。如果編碼對照表或滾動平均是用整份檔案(包含你打算保留作驗證的資料列)學出來的,就會重蹈你在資料切分時已經防堵的洩漏問題。

## 縮放數值並處理離群值

極端值不一定是錯誤。B2B 客戶的一筆 40 件訂單是真實的銷售。請為它加上標記,避免它主導平均值,但仍保留在歷史資料中。把 1,000 的單價誤輸入成 100,000 則是輸入錯誤。請修正那個數字,而不是把它當成需求來「處理」。

### 刪除極端值之前先檢查

兩種檢查搭配使用效果很好。**1.5 倍四分位距**規則會標出遠離欄位中間範圍的資料點。領域檢查則是問這個值是否可能存在:負庫存、十年後的日期、高於售價的折扣。先查證,然後再以第 1 和第 99 百分位數設定上下限、對偏態的營收做對數轉換,或加上標記並保留原始數值供報表使用。

> 你刪掉的大宗訂單,是你再也預測不到的營收。你保留下來的輸入錯誤,會變成模型以為客戶願意支付的價格。

設定上下限後,請重新執行摘要統計。欄位的中心位置應該幾乎不變。如果中位數大幅跳動,代表上下限動得太多,你應該重新檢視來源資料列。

### 哪種縮放器符合資料特性

縮放可避免年營收這類大單位的欄位,淹沒每筆訂單件數這類小單位的欄位。[Scikit-learn 的預處理文件](https://scikit-learn.org/stable/modules/preprocessing.html)指出,**StandardScaler** 以訓練集的平均值為中心,並依變異數縮放各特徵,而在存在大量離群值時,效果可能不佳。**RobustScaler** 是可直接替換的選項,它使用對離群值更不敏感的中心與範圍估計值。

資料特徵縮放器適用原因大致對稱，極端值很少StandardScaler以平均值為中心，並依變異數進行縮放離群值嚴重，例如偶爾出現的大宗訂單RobustScaler使用中位數與四分位距，不易受極端值影響數值需要固定範圍，例如 1 到 5 分的評分MinMaxScaler將數值對應到 0-1，且不改變其分布形狀

請僅以訓練資料擬合縮放器，再將該擬合結果套用於驗證資料。若在保留集上重新擬合，驗證資料中的極端值就會左右縮放比例。若想進一步了解如何在選擇處理方式之前找出極端值，請參閱 [ELECTE 的離群值指南](https://www.electe.net/post/outlier-statistica)。

## 將流程自動化並檢查其輸出

存放在單一筆記本中的清理後檔案，每次執行之間可能出現偏差。新檔案可能得到不同的插補值、類別編碼或縮放比例，使儀表板出現變化，即使背後的業務並沒有改變。

管線會將已擬合的插補器、編碼器和縮放器放在一起，並對新檔案套用相同的轉換。這些步驟只使用訓練分割來擬合。將擬合後的設定套用到驗證與測試資料，不要重新計算。[IBM 關於資料洩漏的說明](https://www.ibm.com/think/topics/data-leakage-machine-learning)解釋了為何在訓練與測試資料上一併擬合前處理步驟，會使資訊洩漏到評估中。

### 每次執行後的檢查

作業成功只代表流程已執行完畢。請檢查輸出結果是否仍與來源資料及您設定的規則相符:

- **列數:**將載入的檔案與匯出檔案核對,並將已記錄的重複資料計算在內。
- **各欄位空值率:**若突然上升,請立即調查,這可能代表某個來源欄位已停止傳入。
- **數值範圍:**確認價格、數量與日期仍在可接受的範圍內。
- **新類別:**將未曾出現的地區或 SKU 歸入已定義的類別,而不是在無通知的情況下直接捨棄。

想了解[資料驗證的實際範例](https://www.electe.net/post/data-validation-techniques)，請參閱這些檢查如何應用於企業檔案。請將自動化輸出視為估計值，並在以其觸發警示之前，先人工檢視最初幾個週期。

**ELECTE** 是專為成長型企業打造的 AI 驅動數據分析平台,可連接會計軟體或上傳的檔案,無需分析師即可進行數據分析與預測。客戶透過自動化財務分析,每週節省 10 小時以上。這項協助的前提,是採用能經得起審查的擬合步驟,而不是每次上傳都重新計算。

本週請選一個資料集,對照這份七列的表格走一遍,並標出哪些步驟仍是人工操作。可將重複性的步驟自動化,但需要判斷的情況,例如重複資料與真實補貨訂單、打字錯誤與大宗訂單,在規則穩定之前,應保留人工審核。

---

ELECTE 可連接您的會計資料或上傳的檔案,完成資料準備,並將其轉化為可與團隊一同審閱的預測與報告。若您希望每次載入資料時,都以相同方式套用這些資料預處理步驟,請造訪 [ELECTE](https://www.electe.net),了解平台如何以您自己的數據執行整個流程。
