在本系列文章的第一篇——第一個原創Power BI 報表製作Day1——的結尾部分,我交代了Day2的主要任務,就是對數據集的檢查、處理和清洗,為後續對數據的分析作準備。
為了更清晰地理解這個流程的必要性,我再次打開這個流程圖:
在Day1的數據收集和準備階段,我已經對數據集有了一個大致的了解和檢查,所以今天剩下來的主要任務就是:數據處理和數據清洗。
數據處理是一個龐大的概念,因為本次練習打算是用Power BI 來完成,所以本篇文章談到的【數據處理】和【數據清洗】,可以合併理解為【在Power BI 環境下的數據準備】,也就是對數據進行ETL (extract, transform and load),提取,轉換和加載。
ETL過程,可以描述為,從數據源提取數據,然後對其進行轉換、驗證、標準化、更正、質量檢查等,並最終加載到數據存儲庫(例如,數據集市或數據倉庫)中,在此進行簡化以進行分析和報告。
通常,數據的ETL由專門的工具來完成,不過在Power BI Desktop 和Power Query 中,用戶能夠將數據提取、轉換和加載到Power BI 的內部表中,然後將其用作Power BI 可視化的來源。
由於Power Query 會保留對攝取、轉換和加載數據所採取的每個操作的分步記錄,因此在需要刷新數據時可以重複這些相同的步驟。刷新源數據後,所有Power BI 可視化文件也將使用更新後的數據進行刷新。
所以,我們可以直接藉助Power BI Desktop 和 Power Query 來進行這一動作,從標題為【在Power BI 中清理、轉換和加載數據】的官方文檔中,可以看到Power Query 可以對數據進行如下動作的調整和清洗:
識別列標頭和名稱
提升標頭
重命名列
刪除前幾行
刪除列
逆透視列
透視列
重命名查詢
替換值
替換 NULL 值
刪除重複項
評估和更改列數據類型
將多個表合併為一個表
檢查數據結構
查找數據異常和數據統計信息
使用高級編輯器修改 M 代碼
... ...等等
可以看出,Power Query 有各種各樣的功能,可以發現和糾正數據中的錯誤,提升數據質量,還可以簡化複雜模型,或者知曉哪些列包含有價值可用於深入分析的信息,等。
我目前無法判斷上述哪些步驟是需要的,哪些不需要,僅僅觀察數據集也難以得到準確的答案,所以每一種方式我都試了一哈。
「對初始數據進行調整的第一步是標識數據內的列標頭和名稱,然後評估它們所在的位置以確保它們位於正確的位置。」
官方文檔這麼描述這個步驟,我的理解就是檢查每個表的表頭是否存在錯誤的描述或者錯位的情況。
因為我找的這個數據集是IBM設計的經過驗證的BI練習專用的數據集,所以應該不存在這種錯誤,不過我還是檢查了一遍,逐一查看了9個表的表頭和名稱。
「當表在 Power BI Desktop 中創建後,Power Query 編輯器會假設所有數據都屬於表行。但是,數據源的第一行可能會包含列名稱, 若要更正此誤差,需要將第一個表行提升為列標頭。
可以通過兩種方式提升標頭:在「主頁」選項卡上選擇「將第一行用作標頭」選項,或選擇Column1 旁邊的下拉菜單按鈕,然後選擇「將第一行用作標頭」。
檢查了一下,沒有發生這樣的錯位,標頭位置都是正常的。
「一列或多列的標頭錯誤、標頭拼寫錯誤,或者標頭命名約定不一致或對用戶不友好。 」
數據非常規整,未發現標頭名稱相關問題。
「在調整數據時,可能需要刪除前幾行,例如,當這些行為空白或者包含報表中不需要的數據時。 比如下面這樣,就要把紅框內的行刪除。」
本數據集未發現此種異常,無需操作。
「 數據調整過程中的一個關鍵步驟是刪除不必要的列。 越早刪除這些列越好。刪除列的一種方式是在從數據源獲取數據時限制列。例如,如果使用 SQL 從關係資料庫中提取數據,則需要在 SELECT 語句中使用列列表對提取的列進行限制。
在此過程的早期階段刪除列(而不是之後再進行刪除)是最好的,特別是在表之間建立了關係的情況下。 刪除不必要的列將有助於你專注於所需的數據,並有助於改進 Power BI Desktop 數據集和報表的整體性能。
檢查每一列,並詢問自己是否真的需要裡面所含的數據。如果不打算在報表中使用這些數據,那麼這些列對你的數據模型而言沒有任何價值。因此,應該刪除這些列。 如果你的需求隨著時間改變了,你之後可以隨時添加這些列。」
經過檢查,發生了一件奇怪的事,staff表裡竟然多出來兩列:
我看了下源數據表,這兩列是空白的,但是導入到PQ後,竟然多出來兩列,原因暫時查不出來,我先在PQ將這兩列刪掉。
我這裡沒有直接選中右邊這多出來的兩列然後右鍵單擊」刪除「,而是選中了左邊的6列後右鍵單擊」刪除其他列「,為什麼這樣呢?請看群討論,有專家解釋:
微軟官方文檔,https://docs.microsoft.com/zh-cn/learn/modules/clean-data-power-bi/2-shape-data,有詳細介紹兩種刪除列的方法。
本案例數據結構無需此操作
本案例數據結構無需此操作
目前編輯器裡不存在自定義查詢,所以暫時無需此操作。
本案例數據集數據非常規整,不存在需要替換的錯誤值,無需此操作。
未發現null值,無需此操作。
未發現錯誤重複項,無需此操作。
「 當你從任意數據源導入表時,Power BI Desktop 將自動開始掃描前 1,000 行(默認設置)並嘗試檢測列中的數據類型。Power BI Desktop 在某些情況下可能不會檢測到正確的數據類型。如果出現不正確的數據類型,你會遇到性能問題。
在處理平面文件時,例如逗號分隔值 (.CSV) 文件和 Excel 工作簿 (.XLSX),有很大的機率會遇到數據類型錯誤,因為數據是手動輸入到工作表中的,因此會存在錯誤。相反,在資料庫中,數據類型是在創建表或視圖時預定義的。
最佳做法是在將數據加載到 Power BI 數據模型中之前在 Power Query 編輯器中評估列數據類型。如果確定數據類型不正確,則可以進行更改。可能還需要對列中的值應用某一格式,並且更改列的匯總默認設置。
為了繼續對銷售數據進行清理和轉換以準備用於報表,現在需要評估列以確保它們擁有正確的數據類型。你需要更正識別到的所有錯誤。
不正確的數據類型將阻止你創建某些計算、派生層次結構或創建與其他表的正確關係。「
所以,確保你的模型表裡每個欄位的數據類型是正確的,是很有必要的,尤其是那些需要參與計算或者參與報表呈現的欄位。
Power BI 裡,數據類型有這些類型:
中文分別是:
小數
定點小數
整數
百分比
日期/時間
日期
時間
日期/時間/時區
持續時間
文本
布爾值(True/False)
二進位
我檢查了模型裡9個表所有欄位的數據類型,將下面這個欄位的數據類型從數值調整為文本了:
其它列沒動,都是非常標準的數據類型。
另外,我以前一直以為表裡面的編號類欄位應該是文本型,比如下面這幾種:
今天來自大連的老劉同志給我看了個MySQL相關的電子書的片段:
這種數字鍵一般就是數值型,而不是我之前認為的文本型數字,順帶提一下。
可以通過兩種不同的方式合併表:合併和追加。
因為本案例的9個模型表功能和數據結構各不相同,所以不建議進行追加查詢。
為了感受合併查詢的魅力,我進行了多個嘗試:
挺好玩,很強大。
「在 Power Query 編輯器中開始檢查數據之前,應首先了解整理數據的基本數據結構。可以在 Power BI Desktop 的「模型」選項卡下查看當前的數據模型。」
在進入PQ編輯器之前,已經檢查過:
但未對表之間的關聯關係進行處理,打算在數據建模階段再行處理。
通過Power Query 編輯器裡的「列分布」功能,可以觀察數據中是否存在異常的離群值,確定存在哪些異常可有助於確定數據的正常分布情況,以及是否存在需要進一步調查的特定數據點。
Power Query 通過查看【201904 sales reciepts】表前1000行的數據,可以得到如下統計信息:
可以看出,這個表的數據非常理想,100%都是有效數據。
這個功能很強大,可以快速檢查數據中是否存在異常情況。
本案例暫時無需此操作
經過了這些步驟,可以看出,由於這個數據集質量非常高,數據整理和清洗階段的工作量非常少。
你會發現,如果你手上拿到的是一個高質量的數據集,那麼可以減少多少工作量。
在現代BI世界中,數據準備被認為是最困難、最昂貴和最耗時的任務。據專家估計,數據準備一般需要花費分析項目60%-80%的時間和成本。
面對一個未經處理的數據集,需要對其進行數據的準備和清洗,使數據達到高質量的標準,這些標準包括:
有效性
準確性
完整性
一致性
統一性
具體解釋可見下圖:
可以製作一個專用於數據檢查、整理及清洗的To-Do List,方便照著清單一項項的檢查,比如下面我用Notion製作的一個:
好的,本篇Day2的內容就到這裡,明天Day3我們再見。
目前數據初步整理好了,那麼下一步就是進行探索性數據分析,通過視覺方法,來理解數據裡包含的信息。
需要說明的是,對數據的探索過程可能導致額外的數據清理或對數據的額外請求,因此這些活動本質上可能是迭代的。