Python — 髒數據(Dirty Data)分析與實戰

此篇是個人的一個學習筆記,內容針對數據的預處理(Data Preprocessing)進行教學。手把手教學使用python從EXCEL讀取資料並分析,且快速呈現部分EXCEL功能,最後再進行資料視覺化的處理。

Photo by David Pupaza on Unsplash

筆者本身是工科背景出身,長久以來都以較直觀或是傳統手算的方法解決問題,一直到近半年來開始接觸程式語言,由一開始吃力學習到後來樂在其中,才是真正體會到了活用程式會 "事半功倍"的道理。

在本文,你將會學會以下python技巧:
1.讀取EXCEL資料
2.指定特定範圍下選取指定內容
3.資料剖析 (text to columns)
4.資料轉置 (transpose)
5.資料反轉 (data reverse)
6.刪除不必要的 columns (drop columns)
7.做圖 (draw plot)

以下正文開始:

筆者最近收到一個專案改善的計畫,一開始收到原始數據時,數據非常混亂,就是大家常說的髒數據(Dirty Data),若要將Dirty Data視覺化,不只是一般的輸入X軸和Y軸資料而已,而是要經過一連串的處理才能做成圖。以下本文提供的資料都是原始資料改過的,筆者只是自做一份“很像”的資料作為這次教學的練習範本,此範本會盡量模擬真實情況教學。

下圖為一開始收到的資料:

收到的資料一共有1000多筆,內容大致上是一間公司產品的流水帳,記錄了一週不同天內,在不同地點的銷售紀錄,資料分成兩部分,一為上週和這週的銷售數量比對,二為分別紀錄過去12個月的達成度。

Photo by Lukas Blazek on Unsplash

其中產品樣式一共有100多個,每個產品會根據放進的次數在EXCEL上留下次數不同的資料。本文以M1做為這次實戰演練的範例。

以M1為例

大部分初學者一拿到Raw data時都是不知道如何著手的,這時千萬不要緊張,筆者在這裡這裡教各位菜鳥秘笈, “資料分析三部曲”,相信使用後各位就會對資料較為敏感一點了。

資料分析三部曲: 1. 釐清目標  2. 分析資料 3. 實戰

以本文案例為例:

1.釐清目標:

本次目標為做兩張折線圖,其一為使用 "record" 和"last_12months"做一張過去12個月內達成度指標圖,和使用 “country”、”last_week”、”this_week” 做一張兩週銷售量對照表。

2.分析資料:

所使用的資料其內容大部分都聚集在同一格,且出現不必要的逗點,部分資料還是顛倒輸入的。透過上述敘述首先須採用資料剖析將其分開,再將資料顛倒過來,最後再將不必要的資料從中刪除。

3.實戰開始:

本次實戰前所需具備的基本技巧,Pandas 以及 matplotlib 。

Photo by Arnold Francisca on Unsplash

首先,先從讀取資料開始

  • import 所需的資料包 pandas,讀取所需的EXCEL檔

將讀取的資料show出,得到的結果如下:

透過資料讀取,可以發現有些資料是不必要的,我們只需挑選必要的資料出來。

在這裡有一作法是可以在EXCEL中刪除不必要的內容,留下必要的即可,但本文的宗旨為不影響原資料的情況下以python達成目標。一開始雖然慢,但等需要處理大數據時,就會快非常多,相較之下前者直接在EXCEL操作的方法就會浪費較多時間。

  • 使用選取列,loc[ ]定位法,指定所需的資料名稱,並控制所選取資料的範圍
  • 選取標題 “name_” 和 “num_of_place”,抓取這兩個所選目標的範圍值,”record” 和 “last_12months”

資料顯示如下:

初步讀取必要的資料已經出來了,但可發現每格的資料都由 "," 擠在一起,這時就要採用資料剖析的手法將其分開 ( Text to columns) 。

  • 對於python來說,EXCEL裡的資料型態都為string,故採用以下手法,以 "," 作為分割點進行資料剖析
str.split(',',expand = True)

其結果show出如下,以 ” record”為例,”last_12months”採用相同的做法即可。

實戰:若是初學者可以跳過這一步。今天若是處理大數據資料時,使用上述方法,內容名稱逐一輸入進行運算是非常耗時間的,最快的作法是將其寫成function,參數輸入進去一次就給他搞定。

  • 直接新增一包含兩需要運算的名稱list及一空list,採用for迴圈運算,每次處理完資料就將其append進空的list中

運算後直接show出,可發現結果相同:

兩張圖中第一張折線圖的準備資料大致上到這裡結束,接下來是第二張折線圖的資料準備。

首先也是採用和第一張圖相同的手法,採loc[ ]定位法,指定所需的資料名稱,控制所選取資料的範圍,再執行資料剖析。

結果show出如下:

停在這裡,出現兩個問題:一為透過 “country” 數據比較得知第二張圖的數據資料是相反的,且上張Columns 5是空白的,代表在EXCEL中是不存在數字的,這錯誤若沒校正,往往會影響最終結果的正確性,通常解決手法是補0或是直接刪除,在這裡我會採用直接刪除Columns的手法。

#補充:NaN補0語法import pandasdf = pandas.read_csv()df = df.fillna(0)
比對下發現資料都是相反的
  • 先將資料顛倒過來,在這裡我使用轉置語法操作:
data.T  #轉置data.T[::-1]  #轉置後的資料顛倒data.T[::-1].T  #再將其轉置回來

這方法雖然看起來像脫褲子放屁,但因為這裡資料是同個Model共5筆一起調整,需要使用線性代數中矩陣的概念轉換,若是list則可以直接使用reverse()語法解決。

  • 接下來使用 drop( columns = [ ] ) 語法將第5列刪除

很快的,結果顯示如下:

實戰:和第一張圖整理資料時一樣,若是內容名稱逐一輸入是相當耗時的,再次以相同手法寫成function,參數輸入進去一次就給他搞定。

最後一步,作圖,import資料包matplotlib,輸入相關條件做圖,下述為第一張折線圖的代碼實現:

值得注意的地方是,由於一開始提過每個 Model 都有5筆資料,故採 for迴圈的方式輪流在同一張圖內畫線,以提升效率

下圖為第二張折線圖的代碼:

最後圖片實現如下:

結語:活用python資料分析技巧,習慣與數據對話,將會大大提升做事效率。

--

--