Latar Belakang
Sebuah perusahaan ingin menganalisis distribusi gaji karyawannya untuk :
- Memastikan tidak ada kesalahan input data.
- Mengidentifikasi anomali (misal: gaji terlalu tinggi/rendah).
- Membersihkan data sebelum analisis lebih lanjut.
Dataset
Kita akan menggunakan dataset simulasi gaji karyawan (dalam juta rupiah).
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import stats # Data gaji karyawan (dalam juta rupiah) data_gaji = { 'Nama': ['Andi', 'Budi', 'Cici', 'Dedi', 'Eva', 'Fani', 'Gita', 'Hana', 'Ivan', 'Joko', 'Kiki', 'Lina', 'Mira', 'Nina', 'Oscar'], 'Gaji': [15, 18, 22, 17, 25, 28, 20, 19, 200, 21, 17, 23, 24, 2, 30] } df_gaji = pd.DataFrame(data_gaji) print(df_gaji)
Output :
Nama Gaji 0 Andi 15 1 Budi 18 2 Cici 22 3 Dedi 17 4 Eva 25 5 Fani 28 6 Gita 20 7 Hana 19 8 Ivan 200 9 Joko 21 10 Kiki 17 11 Lina 23 12 Mira 24 13 Nina 2 14 Oscar 30
Catatan:
200
(Ivan) dan2
(Nina) kemungkinan besar adalah outlier.
Deteksi Outlier dengan Metode Statistik
a. Menggunakan Z-Score
# Hitung Z-Score untuk kolom 'Gaji' df_gaji['Z-Score'] = stats.zscore(df_gaji['Gaji']) # Tentukan outlier (|Z-Score| > 2) df_gaji['Outlier_Z'] = np.abs(df_gaji['Z-Score']) > 2 # Tampilkan data outlier outlier_z = df_gaji[df_gaji['Outlier_Z']] print("Outlier (Z-Score):\n", outlier_z[['Nama', 'Gaji', 'Z-Score']])
Output :
Outlier (Z-Score): Nama Gaji Z-Score 8 Ivan 200 4.260034 13 Nina 2 -2.130017
Interpretasi:
Ivan
(Gaji: 200) memiliki Z-Score 4.26 (jauh di atas mean).Nina
(Gaji: 2) memiliki Z-Score -2.13 (jauh di bawah mean).
b. Menggunakan IQR (Interquartile Range)
Q1 = df_gaji['Gaji'].quantile(0.25) Q3 = df_gaji['Gaji'].quantile(0.75) IQR = Q3 - Q1 batas_bawah = Q1 - 1.5 * IQR batas_atas = Q3 + 1.5 * IQR df_gaji['Outlier_IQR'] = (df_gaji['Gaji'] < batas_bawah) | (df_gaji['Gaji'] > batas_atas) # Tampilkan data outlier outlier_iqr = df_gaji[df_gaji['Outlier_IQR']] print("\nOutlier (IQR):\n", outlier_iqr[['Nama', 'Gaji']])
Output :
Outlier (IQR): Nama Gaji 8 Ivan 200 13 Nina 2
Interpretasi :
- IQR juga mengidentifikasi
Ivan
danNina
sebagai outlier.
Visualisasi Outlier
a. Boxplot
plt.figure(figsize=(8, 5)) plt.boxplot(df_gaji['Gaji'], vert=False, patch_artist=True) plt.title('Distribusi Gaji Karyawan (Outlier Terdeteksi)') plt.xlabel('Gaji (Juta Rupiah)') plt.show()
Hasil :
- Titik di sebelah kiri (
2
) dan kanan (200
) adalah outlier.
b. Scatter Plot
plt.figure(figsize=(10, 5)) plt.scatter(df_gaji['Nama'], df_gaji['Gaji'], color='blue', label='Normal') plt.scatter(outlier_iqr['Nama'], outlier_iqr['Gaji'], color='red', label='Outlier') plt.title('Scatter Plot Gaji Karyawan') plt.xticks(rotation=45) plt.legend() plt.grid() plt.show()
Hasil:
- Outlier terlihat jelas di luar cluster data normal.
Penanganan Outlier
Opsi 1: Menghapus Outlier
df_clean = df_gaji[~df_gaji['Outlier_IQR']] print("\nData setelah menghapus outlier:\n", df_clean[['Nama', 'Gaji']])
Opsi 2: Mengganti Outlier dengan Median
median_gaji = df_gaji['Gaji'].median() df_gaji['Gaji_Adjusted'] = np.where(df_gaji['Outlier_IQR'], median_gaji, df_gaji['Gaji']) print("\nData setelah penyesuaian:\n", df_gaji[['Nama', 'Gaji', 'Gaji_Adjusted']])
Output (Contoh Opsi 2) :
Nama Gaji Gaji_Adjusted 0 Andi 15 15.0 1 Budi 18 18.0 ... 8 Ivan 200 21.0 # Gaji diubah ke median 13 Nina 2 21.0 # Gaji diubah ke median
Analisis Hasil
- Outlier
200
(Ivan):- Kemungkinan kesalahan input (seharusnya
20
). - Jika benar, bisa jadi direktur (perlu konfirmasi).
- Kemungkinan kesalahan input (seharusnya
- Outlier
2
(Nina):- Mungkin karyawan magang atau kesalahan input.
Rekomendasi:
- Validasi Data: Cek ke HR apakah gaji
200
dan2
valid. - Gunakan Data Bersih untuk analisis selanjutnya (misal: menghitung rata-rata gaji).
Rekomendasi studi kasus lain
- Coba dengan Dataset Lain:
- Data harga rumah (outlier = harga ekstrem).
- Data nilai mahasiswa (outlier = nilai terlalu tinggi/rendah).
- Bandingkan Metode:
- Apakah Z-Score dan IQR selalu memberikan hasil sama?
- Eksperimen dengan Threshold:
- Ubah batas Z-Score dari
2
menjadi3
, bagaimana hasilnya?
- Ubah batas Z-Score dari
Kesimpulan:
- Outlier dapat dideteksi secara statistik dan visual.
- Penanganan outlier tergantung pada konteks data (hapus, ganti, atau biarkan).
- Penting untuk selalu memvalidasi outlier sebelum menghapus/mengubahnya!