iT邦幫忙

2021 iThome 鐵人賽

DAY 2
1
自我挑戰組

資料分析及AI深度學習-簡單基礎實作系列 第 2

DAY2:離職率預測(上)

人工智慧共創平台-離職率預測(上)

  • 資料來源

因為工作偶爾也會有閒暇時間,尤其我們是業務單位提出需求,我們才有專案做,所以呢閒暇時間我也不想浪費掉,我就找到了一個類似kaggle的平台,人工智慧共創平台,他也有練習場,裡面有幾個題目可以讓各位小試身手。

於是我選擇了員工離職率預測(資料連結),這是我第一次拿到資料後,從頭到尾自己做,成績如何就不要太在意啦,之後有時間會再繼續調整把名次往上爬的。
但對於這個平台我必須說一下,這個離職率預測竟然沒有資料欄位介紹!!!而他的欄位又有點看不懂,例如:

甚麼工作資歷又分12345、訓練時數又有ABC...等等,我是真的不太懂,但還是繼續給他做下去,如果有大神看得懂可以留言幫我解釋一下,我是真的想了解每個欄位的意思!


  • 拿到資料先觀察資料型態

import pandas as pd
train = pd.read_csv('./train.csv')
test = pd.read_csv('./test.csv')

print(train.head(5))

查看前五筆資料。


可以看出來這份資料應該都幫我們處理過,但為確保裡面資料都label過,我們還是來看看每個變數的值。

for i in train.columns:
    print(i)
    print(list(train[i].unique()))
    print("================================================")

因為變數很多,就截一部分就好,確定除了NA值外,沒有別的文字了。

還可以看看敘述統計~

print(train.describe())

可以從中看到總筆數和平均值等等的數據,train資料集的總筆數是14392筆

接下來呢,我會針對NA值去做處理,先看每個變數的NA值總數。

train_na_sum = train.isna().sum()
print(train_na_sum)
print("===============================")
test_na_sum = test.isna().sum()
print(test_na_sum)
print("===============================")

可以發現train和test的最高學歷畢業學校類別兩個變數的NA值特別多,而其他的train是73個,test是18個。

train

test


  • 資料前處理

因為最高學歷畢業學校類別兩個變數的NA值佔總筆數比例太高,我會直接刪除此兩個變數,而其他的變數我這邊偷懶,則填入中位數。

注意喔,這裡只是簡單示範,但NA值有時候有它的意義,要嚴謹的話就必須檢查,或許可以把它當作一類,而且這邊大部分都是類別變數,多數作法會不太建議類別變數補值,又或者是可以在不影響原樣本比例的情況下隨機填補

對於NA值處理可以參考[這邊]。(https://notesforai.blogspot.com/2018/05/05.html?m=1)

train = train.drop(columns=['最高學歷','畢業學校類別'])
for i in train.columns:
        train[i] = train[i].fillna(train[i].median())

再執行一次看各個變數的NA值。

train_na_sum = train.isna().sum()
print(train_na_sum)
print("===============================")
test_na_sum = test.isna().sum()
print(test_na_sum)
print("===============================")

結果發現NA值都為0囉~

接著我們看看幾個年份。

print(train['yyyy'].unique())

train資料集總共有4個年份,我們要預測test資料集的員工是否2018年有離職。

那會不會有比如說2016年沒離職但2017年卻就沒有資料的員工呢?
我們來觀察看看~

for i in train['PerNo'].unique():
    df = train[train["PerNo"] == i ]
    df_last = df.iloc[-1]
    if df_last["yyyy"] != 2017 and df_last.PerStatus == 0.0:
        train = train[~train["PerNo"].isin([i])]
        n += 1
    else:
        m += 1
print("留下員編數:" , m , "刪除員編數:" ,n)

結果真的有阿,我把這些員工的資料都給刪除掉,共留下4295個員工資料,總資料筆數剩下13870筆。


  • 今日小結

今天先到這邊吧!明天再來介紹簡單的資料視覺化及建模!

很多人拿到資料就很興奮直接把資料丟進去建模,得到結果,NONONO~拿到資料一定要先剖析資料,雖然我也沒怎麼剖析XDD。切記拿到資料後一定要先觀察資料型態,做資料清洗的動作,再丟入建模型。

資料分析就像做菜一樣,收集資料如同買菜,資料清洗如同是洗菜、切菜、備料,一定要準備、清洗好材料,才能讓廚師做出一道完美的料理。

若有不夠完善的地方,歡迎各位邦友留言補充和指教喔~要鞭的話鞭小力一點XDDD

參考文章:

缺失值處理 https://notesforai.blogspot.com/2018/05/05.html?m=1


上一篇
DAY1:我竟然參加鐵人賽了!!!
下一篇
DAY3:離職率預測(下)
系列文
資料分析及AI深度學習-簡單基礎實作30

尚未有邦友留言

立即登入留言