Di bagian ini, saya ingin menggunakan Regresi Logistik untuk memprediksi apakah karyawan akan keluar atau tidak.

Penjelasan Singkat Regresi Logistik

Jika Anda pernah mempelajari statistika, Anda pasti familiar dengan Regresi Linier. Regresi Linier dapat memprediksi variabel terikat Y dengan adanya variabel bebas X. Model Regresi Linier dapat diwakili oleh persamaan (1)

atau untuk dataset yang memiliki lebih dari satu X, modelnya akan diwakili oleh persamaan (2)

Semuanya berjalan baik sampai kita memiliki data kategorikal untuk Y. Misalnya, tujuan kita adalah memprediksi apakah karyawan tersebut akan keluar atau tidak. Misalkan kita membagi karyawan menjadi 2 kategori yaitu 1 atau 0. Angka 1 untuk karyawan yang keluar dan nomor 0 untuk karyawan yang tetap. Jadi, masalahnya adalah memperkirakan probabilitas Y=1 jika diberi X atau Y=0 jika diberi X. Karena model Regresi Linier menghasilkan bilangan kontinu, hasilnya mungkin berada di luar interval dekat [0,1]. Untuk menangani masalah ini, kita harus menggunakan fungsi untuk mengubah hasilnya menjadi interval dekat [0,1].

Inilah fungsi sigmoid sebagai pahlawan. Fungsi sigmoid akan mengubah hasil Regresi Linier menjadi kurva berbentuk S dengan nilai dalam interval yang berdekatan [0,1]. Thresholdnya adalah 0,5, bila hasilnya di bawah 0,5 maka kelasnya adalah 0. Jika tidak maka kelasnya adalah 1. Fungsi sigmoid diwakili oleh persamaan (3)

Jadi, kita memiliki model Regresi Logistik.

Model Regresi Logistik

Sebelum kita memulai pelatihan, kita harus menyiapkan datasetnya. Anda dapat mengakses kumpulan data dari tautan di bawah ini.

Atrisi & Kinerja Karyawan IBM HR Analytics | Kaggle

Jadi, kami akan menggunakan Python untuk menjalankan proyek kami. Pertama, kita harus mengimpor perpustakaan penting seperti pandas, numpy, seaborn, dan matplotlib.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

Kemudian, kita akan menetapkan dataset ke dalam bingkai data menggunakan pandas.

employee_df = pd.read_csv('drive/MyDrive/Human_Resources.csv')

Pastikan Anda memiliki jalur yang benar untuk mengakses file. Dalam hal ini, saya menggunakan google drive untuk menyimpan dataset.

Dataset memiliki 35 kolom (34 variabel independen dan 1 variabel dependen) dan 1470 observasi. Untungnya, kami tidak memiliki nilai null dalam kumpulan data.

Sebelum kita melatih model, kita harus mempertimbangkan variabel kategori. Kami memiliki 6 variabel kategori yang memiliki lebih dari dua kategori dan 3 variabel kategori yang memiliki dua kategori. Untuk 3 variabel yang memiliki dua kategori yaitu Atrisi, Over18, dan OverTime, kita ingin mengubah “Ya” menjadi 1 dan “Tidak” menjadi 0. Untuk 6 variabel kategori, kita akan menggunakan metode pengkodean one-hot. Jadi, setiap kategori akan memiliki kolomnya sendiri dan berikut kodenya:

# Variables that have two categories
# transform "Yes" into 1 and "No" into 0.
# Let's replace 'Attritition' , 'overtime' , 'Over18' column with integers
employee_df['Attrition'] = employee_df['Attrition'].apply(lambda x:1 if x == "Yes" else 0)
employee_df['Over18'] = employee_df['Over18'].apply(lambda x:1 if x == "Y" else 0)
employee_df['OverTime'] = employee_df['OverTime'].apply(lambda x:1 if x == "Yes" else 0)
# Variables that have more than one two categories
X_cat = employee_df[['BusinessTravel','Department','EducationField','Gender','JobRole','MaritalStatus']]

# Transform The Category data to numeric using One Hot Encoding
from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder()
X_cat = onehotencoder.fit_transform(X_cat).toarray()

# Transform X_cat into dataframe
X_cat = pd.DataFrame(X_cat)

Oke, kita sudah menangani variabel kategori. Sekarang, mari kita lihat gambar 1.

Gambar 1 menunjukkan bahwa EmployeeCount, StandardHours, dan Over18 hanya memiliki 1 nilai. Variabel-variabel tersebut tidak akan mempengaruhi model. Jadi, kami ingin membatalkannya.

# It makes sense to drop 'EmployeeCount' , 'Standardhours' and 'Over18' since they do not change from one employee to the other
# Let's drop 'EmployeeNumber' as well
employee_df.drop(['EmployeeCount','StandardHours','Over18'], axis=1, inplace=True)

Jadi, kita memiliki 32 kolom termasuk Atrisi (variabel terikat).

Setelah kita menangani variabel kategori, kita harus menangani variabel numerik. Kami ingin mengubah setiap nilai variabel numerik menjadi interval tertutup [0,1] menggunakan Min-Max Scaler. Kita harus mentransformasikan nilainya karena ada variabel yang berskala besar, dan ada pula yang berskala kecil. Kami ingin memiliki skala yang sama, jadi kami menggunakan Min-Max Scaler.

# Numeric Variables
X_num = employee_df[['Age','DailyRate','DistanceFromHome','Education','EnvironmentSatisfaction',
                     'HourlyRate','JobInvolvement','JobLevel','JobSatisfaction','MonthlyIncome',
                     'MonthlyRate','NumCompaniesWorked','OverTime','PercentSalaryHike','PerformanceRating',
                     'RelationshipSatisfaction','StockOptionLevel','TotalWorkingYears','TrainingTimesLastYear','WorkLifeBalance',
                     'YearsAtCompany','YearsInCurrentRole','YearsSinceLastPromotion','YearsWithCurrManager']]

# Transform numeric varibles using Min-Max Scaler
# Scale the data using MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_num = scaler.fit_transform(X_num)
X_num = pd.DataFrame(X_num)
X_num

Kemudian, kita dapat menggabungkan variabel kategori dan variabel numerik sebagai X (variabel independen kita).

# Concat X_cat and X_num
X = pd.concat([X_cat,X_num], axis=1)

Jadi, kami menetapkan Atrisi sebagai variabel dependen kami.

y = employee_df['Attrition']

Selanjutnya kami ingin memisahkan data pelatihan dan data pengujian dengan proporsi 75:25.

# Split the data into train and test data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

Sekarang, kami siap untuk melatih Model Regresi Logistik kami.

# Train data using Logistic Regression
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)

# The prediction if we input test data
y_pred = model.predict(X_test)

Langkah terakhir adalah kita ingin melihat metrik untuk mengukur seberapa bagus model kita. Di sini saya akan menggunakan akurasi, presisi, perolehan, dan skor f1 sebagai metrik kami.

# Testing Set Performance
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report

# Accuracy
print("Accuracy {} %".format(100 * accuracy_score(y_test, y_pred)))

# Precision
print("Precision {} %".format(100 * precision_score(y_test, y_pred)))

# Recall
print("Recall {} %".format(100 * recall_score(y_test, y_pred)))

# f1-score
print("f1-score {} %".format(100 * f1_score(y_test, y_pred)))

Dan kami mendapatkan hasilnya.

Tampaknya model kami tidak cukup baik untuk memprediksi apakah karyawan tersebut akan keluar atau tidak. Nah, pada bagian selanjutnya kita akan memperbaiki atau menggunakan model lain untuk mendapatkan model terbaik. Sampai jumpa.

Referensi:

[1] G. James, D. Witten, T. Hastie, dan R. Tibshirani, Pengantar Pembelajaran Statistik. London: Springer New York Heidelberg Dordrecht London, 2014.