所有文章

資料科學第四週-資料前處理

2,5517 分鐘閱讀
資料科學python資料前處理
資料科學第四週-資料前處理

資料前處理

所謂「前處理」是指在進行資料分析之前,先對資料進行一些處理,以便讓資料更適合進行分析。前處理的內容很多,包括「資料觀察」、「資料篩選」、「填補遺失值」、「資料轉換」與「刪除重複資料」等。 資料篩選在前面建立DataFrames時操作過一些條件篩選方式,除此之外,以下我們一一介紹。

資料觀察

可以透過Pandas中的info() describe()duplicated(),減少人為觀察時,粗心所造成的遺漏。 我們以某班的學期成績為例子來進行資料的觀察並作後續的動作。

在載入dataframe時,我們可以使用head()列出頭幾筆資料即可。 預設為前5筆資料(可填入參數,得到多筆資料列)

載入雲端資料:https://docs.google.com/spreadsheets/d/1KOFZLjejfUJTYO1hFCJvCj4KVzeFnaG0/edit?usp=drive_link&ouid=117481784464741084269&rtpof=true&sd=true

載入雲端硬碟與資料

python
from google.colab import drive
drive.mount('/content/drive')
python
import pandas as pd
df = pd.read_excel('/content/drive/MyDrive/專題/程式設計成績冊.xlsx')
df.head()
Image

閱讀基礎資訊 info()

在真實資料中大多不是完美的。所謂GIGO,如果在前面不先把資料處理好,分析出來的也會是垃圾喔! 會先對資料查看他的基本資訊。

python
df.info()
Image

可以看到「5 5_004作業_輸出格式化、算術運算 1 non-null float64」 這筆資料幾乎是空的,我們先不急著做刪除

查看關於數字的敘述 describe()

先看看describe會有什麼作用吧,可以看到:

  • 資料筆數(count)
  • 平均值(mean)
  • 標準差(std)
  • 最小值(min)
  • 最大值(max)
python
df.describe()
Image

基本的統計我們還是需要理解一下

標準差(std)

一組數值資料中各資料與平均值的分散程度。 (54,56,64,64,82)與(63,64,64,64,65)兩組數據,雖然有相同的平均數、中位數及眾數;但兩組標準差卻不同。

中位數(50%)

一組數值依大小排列順序後最中間值

中位數與平均數的差別

在薪資數據中,觀察平均數和中位數的差異,可以幫助了解薪資分佈的偏態。如果平均數遠高於中位數,通常表示薪資分佈具有右偏態,即少數高薪個體拉高了整體薪資水準。這種情況下,標準差往往也會較大,表示員工之間的收入差距較大。當企業想要了解薪資是否公平或透明時,除了看平均數外,觀察中位數和標準差能提供更深入的見解。 例如此篇報導: https://money.udn.com/money/story/10869/8224597

補缺失值 fillna()

可以看到儲存中有NaN代表沒有資料,需要將其補值或刪除,才不會影響計算結果 可以使用fillna()來填補值

想確認欄位名字的話可以用df.columns

python
df.columns
Image
python
#注意叫作20的欄,是數字
df[20]=df[20].fillna(0)
df.head()
Image

也可能補上平均值、中位數、眾數等等,可以更準確的預測這人平時該有的分數。 比如2號在「6_005作業_條件結構」是缺值的可以選擇

  1. 本次作業的平均
  1. 缺失的人的全部成績的平均

以欄位平均(本次作業難度為標準)填補缺失值

篩選缺失欄位 isna() 或 isnull()

先看看有誰缺失

python
miss=df['6_005作業_條件結構'].isna()
miss.head()
Image
python
df[miss]
Image

計算欄位平均值與填補缺失值

計算平均值

python
mean=df['6_005作業_條件結構'].mean()
mean
Image

python
df['6_005作業_條件結構']=df['6_005作業_條件結構'].fillna(mean)
df[df['6_005作業_條件結構']==mean]
Image

以列平均(個人能力為標準)補缺失值

每個人能力不均,實際上常常考0分,缺失值給他高分不見得合理 試以「012作業-進階與巢狀」用列平均補缺失值

缺失的人的全部成績的平均,一樣先把這些人找出來

找缺失值

python
miss = df['012作業-進階與巢狀'].isna()
miss.head(6)
Image
python
miss_data = df[miss]
miss_data
Image

以iloc 取列區域

iloc相對於loc是用index(標號)來做區域選取。

扣除前面幾欄的文字(姓名、性別)和後面幾欄(成績平均)後選取區域

python
miss_data_filter = miss_data.iloc[:,2:16]
miss_data_filter
Image

接者,取每一列的平均值

python
miss_data_filter_mean = miss_data_filter.mean(axis=1)
miss_data_filter_mean
Image
python
df['012作業-進階與巢狀'] = df['012作業-進階與巢狀'].fillna(miss_data_filter_mean)
df
Image

資料刪除

drop()

可以將不需要的欄位刪除,比如「5_004作業_輸出格式化、算術運算」

python
df.drop(['5_004作業_輸出格式化、算術運算'],axis=1,inplace=True)
df.head()

刪除這個欄位(axis=1)

dropna()

將有缺失值的欄位刪除,非常暴力! 建議僅在真的缺失太多時使用

python
df.dropna(axis=1,inplace=True)
df

資料轉換

在後面做機器學習的時候,有些文字需要轉換成獨一無二的二進制編碼,稱之為「獨熱編碼」(One-Hot Encoding),才好進行運算。 下面以男、女為例,進行資料的轉換。pandas 提供了一個非常方便的函數 get_dummies,可以將分類變數轉換為獨熱編碼。

python
df_dummies = pd.get_dummies(df,drop_first=True)
df_dummies
Image

此處男女,直接轉換成布林值

以上為常用前處理介紹,後續都會持續使用到!

版權聲明

文章標題:資料科學第四週-資料前處理

文章作者:阿盧老師

文章連結:https://codinglu.tw/blog/data-preprocessing

授權條款:本文採用 CC BY-NC 4.0 授權。轉載請標明出處。