Preprocessing data adalah persiapan data sebelum dilakukan analisis. Proses ini melibatkan berbagai teknik seperti cleaning, transforming, dan encoding.
Preprocessing data sangat penting dalam machine learning karena data yang tidak bersih dan tidak siap akan menghasilkan model yang buruk. Contohnya di dalam data terdapat informasi yang tidak sesuai dengan keadaan sebenarnya, seperti umur yang bernilai negatif, atau data yang hilang.
Data Cleaning
Data cleaning adalah proses mengidentifikasi dan memperbaiki (atau menghapus) data yang tidak lengkap, tidak akurat, tidak relevan, atau tidak konsisten.
Beberapa hal yang perlu diperhatikan dalam data cleaning adalah:
Rename Columns
Nama kolom yang jelas dan deskriptif akan memudahkan kita dalam membaca data. Format yang biasa digunakan di python yaitu snake_case
.
Artinya apabila terdapat nama kolom:
ID_
: perlu diubah menjadi id
Nama Lengkap
: perlu diubah menjadi nama_lengkap
G
: perlu diubah menjadi gender
import pandas as pd
data = {
'Nama Lengkap': ['Andi', 'Budi', 'Caca'],
'Umur': [20, 25, 22]
}
df = pd.DataFrame(data)
df.columns = ['nama_lengkap', 'umur']
print(df)
{
"nama_lengkap": ["Andi", "Budi", "Caca"],
"umur": [20, 25, 22]
}
Drop Columns
Kolom yang tidak relevan atau tidak diperlukan dapat dihapus. Hal ini akan mempercepat proses analisis data. Rekomendasi untuk melakukan drop kolom yaitu dengan membuat data frame baru tanpa kolom yang tidak diperlukan.
import pandas as pd
data = {
'nama': ['Andi', 'Budi', 'Caca'],
'umur': [20, 25, 22],
'pekerjaan': ['guru', 'dokter', 'pengacara']
}
df = pd.DataFrame(data)
df_new = df.drop(columns=['pekerjaan'])
print(df)
{
"nama": ["Andi", "Budi", "Caca"],
"umur": [20, 25, 22]
}
Duplicate Values
Duplicate value dapat terjadi karena kesalahan operator dalam pengumpulan atau pemrosesan data. Data yang baik seharusnya tidak memiliki duplikasi, alias semua data unik setiap rownya.
Teknik yang dapat digunakan untuk mengatasi duplicate value adalah dengan menggunakan fungsi drop_duplicates()
pada pandas.
import pandas as pd
data = {
'nama': ['Andi', 'Budi', 'Andi', 'Caca'],
'umur': [20, 25, 20, 22]
}
df = pd.DataFrame(data)
df.drop_duplicates(inplace=True)
print(df)
{
"nama": ["Andi", "Budi", "Caca"],
"umur": [20, 25, 22]
}
Handling Missing Values
Data yang hilang akan menghasilkan model yang buruk. Ada beberapa cara untuk mengatasi data yang hilang ini:
- Leave as it: biarkan saja data yang kosong tersebut
- Drop it: hapus data yang kosong tersebut apabila data tersebut tidak terlalu penting
- Imputation: isi data yang kosong tersebut dengan nilai yang masuk akal
Contoh apabila kita ingin menghapus data yang kosong:
data = {
'nama': ['Andi', 'Budi', None, 'Caca'],
'umur': [20, 25, None, 22]
}
df = pd.DataFrame(data)
df.dropna(inplace=True)
print(df)
{
"nama": ["Andi", "Budi", "Caca"],
"umur": [20, 25, 22]
}
Contoh lain apabila kita ingin mengisi data yang kosong dengan nilai rata-rata:
data = {
'nama': ['Andi', 'Budi', 'Sinta', 'Caca'],
'umur': [20, 25, None, 22]
}
df = pd.DataFrame(data)
df['umur'].fillna(df['umur'].mean(), inplace=True)
print(df)
{
"nama": ["Andi", "Budi", "Sinta", "Caca"],
"umur": [20, 25, 22.33, 22]
}
Permasalahannya ketika kita menggunakan rata-rata, apabila data tersebut memiliki outlier, maka rata-rata akan terpengaruh oleh outlier tersebut.
Deteksi Outlier dengan Box Plot
Outlier adalah data yang berbeda jauh dari data lainnya. Outlier dapat mempengaruhi hasil analisis data. Contoh:
Jumlah rata-rata pendapatan pekerja di Indonesia pada kenyataannya 5jt. Namun ketika terdapat outlier dengan pendapatan 100jt, maka rata-rata pendapatan pekerja akan terpengaruh, misalnya menjadi 15jt. Hal ini sangat jauh dari kenyataannya.
Untuk menghilangkan outlier, dapat menggunakan box plot:
- Hitung nilai median
- Hitung nilai min dan max
- Hitung nilai kuartil bawah (Q1) dan kuartil atas (Q3)
- Hitung IQR (Interquartile Range) = Q3 - Q1
- Hitung panjang langkah = 1.5 * IQR
- Tentukan batas bawah = Q1 - langkah
- Tentukan batas atas = Q3 + langkah
Data yang berada di luar batas bawah dan batas atas adalah outlier.
import pandas as pd
data = {
'umur': [20, 25, 22, 100]
}
df = pd.DataFrame(data)
Q1 = df['umur'].quantile(0.25)
Q3 = df['umur'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df = df[(df['umur'] > lower_bound) & (df['umur'] < upper_bound)]
print(df)
Data disebut outlier apabila:
X < Min Limit
atau X > Max Limit
, untuk setiap X yang ada di dalam data.
Transformasi data adalah proses mengubah data dari bentuk asalnya menjadi bentuk yang lebih berguna untuk analisis. Beberapa teknik transformasi data yang sering digunakan adalah:
Normalisasi
Normalisasi adalah proses mengubah data ke dalam skala yang sama. Normalisasi sangat penting dalam machine learning karena data yang tidak dinormalisasi akan menghasilkan model yang buruk.
Contoh normalisasi data:
import pandas as pd
data = {
'umur': [20, 25, 22, 30]
}
df = pd.DataFrame(data)
df['umur'] = (df['umur'] - df['umur'].min()) / (df['umur'].max() - df['umur'].min())
print(df)
{
"umur": [0.0, 0.25, 0.125, 1.0]
}
Scaling
Scaling adalah proses mengubah data ke dalam skala tertentu.
Contoh scaling data:
import pandas as pd
data = {
'umur': [20, 25, 22, 30]
}
df = pd.DataFrame(data)
df['umur'] = (df['umur'] - df['umur'].mean()) / df['umur'].std()
print(df)
{
"umur": [-0.94, -0.31, -0.63, 1.88]
}
Perbedaan Normalisasi dan Scaling
No |
Normalisasi |
Scaling |
1 |
Mengubah data ke dalam skala 0-1 |
Mengubah data ke dalam skala tertentu, misalnya -1 sampai 1 |
2 |
Cocok digunakan pada data yang memiliki distribusi normal |
Hanya mengubah skala fitur (mengubah rentang data), tetapi tidak mengubah distribusi data |
3 |
Mengurangi pengaruh outlier |
Tidak mengurangi pengaruh outlier |
4 |
Mengubah distribusi data |
Tidak mengubah distribusi data |
Feature Encoding
Feature encoding adalah proses mengubah data kategorikal menjadi data numerik. Hal ini penting karena model machine learning hanya dapat memproses data numerik.
Ada beberapa teknik encoding yang sering digunakan:
One Hot Encoding
One-Hot Encoding mengubah setiap kategori menjadi kolom biner (0 atau 1). Teknik ini cocok digunakan jika tidak ada urutan alami di antara kategori.
import pandas as pd
data = {
'warna': ['merah', 'biru', 'hijau', 'merah', 'biru']
}
df = pd.DataFrame(data)
df_encoded = pd.get_dummies(df, columns=['warna'])
print(df_encoded)
warna_biru warna_hijau warna_merah
0 0 0 1
1 1 0 0
2 0 1 0
3 0 0 1
4 1 0 0
Label Encoding
Label Encoding mengubah setiap kategori menjadi angka yang unik. Namun, teknik ini memberikan urutan pada kategori, sehingga kurang cocok untuk fitur yang tidak memiliki urutan alami.
import pandas as pd
from sklearn._preprocessing_ import LabelEncoder
data = {
'warna': ['merah', 'biru', 'hijau', 'merah', 'biru']
}
df = pd.DataFrame(data)
label_encoder = LabelEncoder()
df['warna_encoded'] = label_encoder.fit_transform(df['warna'])
print(df)
warna warna_encoded
0 merah 2
1 biru 0
2 hijau 1
3 merah 2
4 biru 0
Ordinal Encoding
Ordinal Encoding digunakan ketika kategori memiliki urutan yang jelas. Setiap kategori diubah menjadi nilai integer
sesuai urutannya.
import pandas as pd
from sklearn._preprocessing_ import OrdinalEncoder
data = {
'ukuran': ['kecil', 'sedang', 'besar', 'sedang', 'besar']
}
df = pd.DataFrame(data)
ordinal_encoder = OrdinalEncoder(categories=[['kecil', 'sedang', 'besar']])
df['ukuran_encoded'] = ordinal_encoder.fit_transform(df[['ukuran']])
print(df)
ukuran ukuran_encoded
0 kecil 0.0
1 sedang 1.0
2 besar 2.0
3 sedang 1.0
4 besar 2.0
Masih banyak teknik feature encoding lainnya seperti Target Encoding, Frequency Encoding, Binary Encoding dan lain-lain.
Kesimpulan
Preprocessing data adalah proses penting dalam machine learning. Data yang bersih dan siap akan menghasilkan model yang baik. Beberapa teknik preprocessing data yang sering digunakan adalah cleaning, transforming, dan encoding.