Machine learning merupakan salah satu pendekatan dalam analisis data yang memungkinkan komputer mempelajari pola dari data untuk menghasilkan prediksi atau keputusan tanpa harus diprogram secara eksplisit untuk setiap kondisi. Penerapan machine learning membutuhkan data yang memiliki karakteristik sesuai dengan kebutuhan algoritma agar proses pembelajaran dapat berlangsung dengan baik. Kualitas data dan fitur yang digunakan dalam pemodelan dapat memengaruhi kemampuan model dalam mengenali pola serta menghasilkan prediksi yang akurat. Salah satu tahapan yang berperan dalam mempersiapkan data sebelum pemodelan adalah feature engineering. Feature engineering merupakan proses mengolah, mentransformasi, memilih, atau membentuk fitur dari data mentah agar menjadi lebih sesuai untuk digunakan dalam algoritma machine learning. Penelitian Darmawan dkk. (2026) menunjukkan bahwa penerapan feature engineering dapat memberikan pengaruh terhadap kinerja model machine learning, sehingga pengolahan fitur perlu diperhatikan sebelum pemodelan dilakukan.
Berbagai teknik dapat diterapkan dalam feature engineering berdasarkan karakteristik data yang digunakan. Teknik tersebut meliputi handling missing value, identifikasi kardinalitas, splitting data, handling outlier, scaling, encoding, dan penanganan imbalanced dataset (Fransiska, 2026). Setiap teknik memiliki tujuan yang berbeda dalam mempersiapkan data agar dapat digunakan secara lebih optimal dalam pemodelan. Penelitian Santoso dan Priyadi (2024) menunjukkan bahwa penerapan teknik feature engineering, seperti encoding dan transformasi fitur, dapat digunakan untuk meningkatkan kualitas fitur dalam pemodelan prediktif. Penanganan imbalanced dataset juga diperlukan karena ketidakseimbangan distribusi kelas dapat menyebabkan model lebih cenderung mengenali kelas mayoritas dibandingkan kelas minoritas (Indrawati, 2021).
Oleh karena itu, praktikum ini dilakukan untuk memberikan pemahaman mengenai konsep dan berbagai jenis feature engineering menggunakan program RStudio. Praktikum ini juga bertujuan memberikan keterampilan kepada mahasiswa dalam melakukan persiapan dan transformasi data melalui berbagai teknik feature engineering. Pemahaman terhadap teknik tersebut diharapkan dapat membantu mahasiswa mengidentifikasi permasalahan pada data, menentukan metode pengolahan yang sesuai, serta mempersiapkan data sebelum digunakan dalam proses pemodelan machine learning.
Machine learning merupakan pendekatan dalam analisis data yang memungkinkan komputer mempelajari pola dan hubungan yang terdapat dalam data untuk menghasilkan prediksi atau keputusan. Proses pembelajaran dilakukan dengan menggunakan data sebagai dasar untuk membangun suatu model sehingga model dapat digunakan untuk melakukan prediksi terhadap data baru. Secara umum, machine learning dapat digunakan untuk beberapa tujuan analisis, seperti klasifikasi, regresi, dan pengelompokan. Klasifikasi digunakan untuk menentukan kelas suatu observasi, regresi digunakan untuk memprediksi nilai numerik, sedangkan pengelompokan digunakan untuk membentuk kelompok berdasarkan kemiripan karakteristik. Kemampuan model dalam menghasilkan prediksi dipengaruhi oleh kualitas dan karakteristik data yang digunakan sehingga diperlukan proses persiapan data sebelum dilakukan pemodelan. Faiz dkk. (2022) menunjukkan bahwa proses feature engineering dapat diterapkan sebagai bagian dari pemodelan machine learning untuk menghasilkan fitur yang mendukung proses pembelajaran dan meningkatkan kemampuan model dalam mengenali pola pada data.
Feature engineering merupakan proses mengolah data mentah menjadi fitur yang lebih sesuai untuk digunakan dalam pemodelan machine learning. Proses tersebut dapat dilakukan melalui pemilihan, transformasi, maupun pembentukan fitur berdasarkan karakteristik data dan tujuan analisis. Fitur yang relevan dapat membantu model dalam mengenali pola pada data dan menghasilkan prediksi yang lebih baik. Penerapan feature engineering dapat memberikan pengaruh terhadap kinerja model machine learning, sehingga kualitas fitur perlu diperhatikan sebelum proses pemodelan dilakukan (Darmawan dkk., 2026). Santoso dan Priyadi (2024) juga menunjukkan bahwa penerapan berbagai teknik feature engineering dapat meningkatkan kualitas pemodelan prediktif. Beberapa teknik feature engineering yang umum digunakan meliputi handling missing value, kardinalitas, splitting data, handling outlier, scaling, encoding, dan penanganan imbalanced dataset (Fransiska, 2026).
1. Handling Missing Value
Missing value merupakan kondisi ketika suatu observasi tidak memiliki nilai pada variabel tertentu. Keberadaan missing value dapat disebabkan oleh kesalahan pencatatan, kesalahan dalam proses pengumpulan data, atau informasi yang tidak tersedia. Kondisi tersebut perlu diperhatikan karena dapat mengurangi informasi yang tersedia dan mengganggu proses pemodelan. Penanganan missing value dapat dilakukan dengan menghapus observasi yang memiliki nilai hilang atau melakukan imputasi menggunakan nilai tertentu, seperti rata-rata, median, atau modus. Pemilihan metode penanganan perlu disesuaikan dengan jenis variabel, jumlah missing value, serta karakteristik data agar informasi yang tersedia tetap dapat dimanfaatkan secara optimal (Fransiska, 2026).
2. Kardinalitas
Kardinalitas menunjukkan jumlah nilai unik yang terdapat dalam suatu variabel. Identifikasi kardinalitas terutama penting pada variabel kategoris karena jumlah kategori dapat memengaruhi proses pengolahan dan pemodelan data. Variabel dengan jumlah kategori yang sedikit relatif lebih mudah diolah, sedangkan variabel dengan jumlah kategori yang sangat banyak dapat menghasilkan jumlah fitur yang besar apabila dilakukan encoding. Oleh karena itu, pemeriksaan kardinalitas diperlukan untuk mengetahui karakteristik variabel dan membantu menentukan teknik pengolahan yang sesuai sebelum data digunakan dalam pemodelan machine learning (Fransiska, 2026).
3. Splitting Data
Splitting data merupakan proses membagi dataset menjadi beberapa bagian yang digunakan untuk tujuan pembangunan dan evaluasi model. Pembagian yang umum digunakan adalah data training dan testing, dengan data training digunakan untuk membangun model dan data testing digunakan untuk mengevaluasi kemampuan model terhadap data yang belum digunakan selama proses pembelajaran. Pembagian data diperlukan untuk mengetahui kemampuan model dalam melakukan generalisasi terhadap data baru serta mengidentifikasi kemungkinan terjadinya overfitting. Pada permasalahan klasifikasi, pembagian data dapat dilakukan secara stratified dengan mempertahankan proporsi kelas pada data training dan testing (Fransiska, 2026).
4. Handling Outlier
Outlier merupakan observasi yang memiliki nilai berbeda secara ekstrem dibandingkan sebagian besar observasi lainnya. Keberadaan outlier dapat disebabkan oleh kesalahan pengukuran, kesalahan pencatatan, atau kondisi tertentu yang memang terdapat pada objek pengamatan. Identifikasi outlier dapat dilakukan menggunakan metode statistik, seperti Interquartile Range (IQR), maupun secara visual menggunakan boxplot. Nilai IQR dapat dirumuskan sebagai berikut:
\[ IQR = Q_3 - Q_1 \]
Batas bawah dan batas atas untuk mengidentifikasi outlier dapat dirumuskan sebagai:
\[ Batas\;Bawah = Q_1 - 1,5(IQR) \]
\[ Batas\;Atas = Q_3 + 1,5(IQR) \]
Penanganan outlier perlu dilakukan secara hati-hati karena observasi ekstrem tidak selalu merupakan kesalahan dan dapat mengandung informasi penting mengenai karakteristik data (Fransiska, 2026).
5. Scaling
Scaling merupakan proses mengubah skala nilai suatu fitur agar perbedaan rentang antarvariabel tidak terlalu memengaruhi proses pembelajaran model. Salah satu metode yang umum digunakan adalah standardization, yaitu mengubah nilai suatu variabel berdasarkan rata-rata dan simpangan bakunya. Persamaan standardization dapat dituliskan sebagai berikut:
\[ z_i = \frac{x_i-\bar{x}}{s} \]
dengan \(z_i\) merupakan nilai hasil scaling, \(x_i\) merupakan nilai pengamatan, \(\bar{x}\) merupakan rata-rata variabel, dan \(s\) merupakan simpangan baku. Metode lain yang dapat digunakan adalah min-max normalization yang mengubah nilai ke dalam rentang tertentu, umumnya 0 sampai 1, dengan persamaan:
\[ x_i' = \frac{x_i-x_{\min}}{x_{\max}-x_{\min}} \] Metode scaling lainnya adalah Robust Scaler, yaitu metode transformasi yang menggunakan median dan Interquartile Range (IQR) sebagai dasar perhitungan. Metode ini menggunakan median sebagai ukuran pemusatan dan IQR sebagai ukuran penyebaran sehingga relatif tidak sensitif terhadap nilai ekstrem (Indini dkk., 2026). Persamaan transformasi Robust Scaler dapat dituliskan sebagai berikut (Izonin dkk., 2022):
\[ x_i^*=\frac{x_i-\operatorname{Median}(X)}{IQR(X)} \]
dengan \(x_i^*\) merupakan nilai hasil transformasi, \(x_i\) merupakan nilai pengamatan, dan \({Median}(X)\) merupakan median variabel, serta IQR merupakan selisih antara kuartil ketiga dan kuartil pertama.
Penerapan scaling terutama penting pada algoritma yang menggunakan perhitungan jarak karena perbedaan skala dapat menyebabkan fitur tertentu lebih dominan dibandingkan fitur lainnya. Teknik transformasi seperti normalisasi juga merupakan salah satu bentuk pengolahan fitur yang dapat memengaruhi hasil pemodelan prediktif (Santoso dan Priyadi, 2024).
6. Encoding
Encoding merupakan proses mengubah variabel kategoris ke dalam bentuk numerik agar dapat digunakan oleh algoritma machine learning. Variabel kategoris dapat berupa jenis kelamin, status pekerjaan, tingkat pendidikan, atau kategori lainnya yang umumnya dinyatakan dalam bentuk teks atau label. Salah satu metode yang dapat digunakan adalah label encoding, yaitu memberikan nilai numerik pada setiap kategori, sedangkan metode one-hot encoding membentuk variabel biner untuk setiap kategori. Pemilihan metode encoding perlu disesuaikan dengan karakteristik variabel dan algoritma yang digunakan agar representasi kategori tidak menghasilkan hubungan yang tidak sesuai. Santoso dan Priyadi (2024) menunjukkan bahwa penerapan encoding sebagai bagian dari feature engineering dapat memberikan perbaikan terhadap kualitas pemodelan prediktif.
7. Imbalanced Dataset
Imbalanced dataset merupakan kondisi ketika jumlah observasi pada setiap kelas dalam variabel target tidak seimbang sehingga terdapat kelas mayoritas dan kelas minoritas. Ketidakseimbangan tersebut dapat menyebabkan model lebih cenderung memprediksi kelas mayoritas dan kurang mampu mengenali kelas minoritas. Evaluasi model pada kondisi tersebut tidak cukup hanya menggunakan akurasi, tetapi dapat mempertimbangkan precision, recall, F1-score, dan matriks konfusi. Penanganan imbalanced dataset dapat dilakukan melalui oversampling untuk meningkatkan jumlah observasi kelas minoritas, undersampling untuk mengurangi jumlah observasi kelas mayoritas, maupun kombinasi keduanya. Indrawati (2021) menunjukkan bahwa teknik oversampling dan undersampling dapat digunakan untuk menangani ketidakseimbangan kelas pada data sebelum digunakan dalam pemodelan machine learning.
Salah satu metode oversampling untuk menangani ketidakseimbangan kelas adalah Synthetic Minority Over-sampling Technique (SMOTE). Metode ini membentuk observasi sintetis untuk kelas minoritas dengan memanfaatkan observasi minoritas dan tetangga terdekatnya. SMOTE telah diterapkan pada analisis klasifikasi data kemiskinan di Indonesia sebagai salah satu pendekatan untuk menangani ketidakseimbangan kelas (Pratama dan Oktora, 2023).
Pembentukan observasi sintetis dapat dinyatakan dengan persamaan berikut:
\[ x_{\text{baru}}=x_i+\lambda(x_{nn}-x_i) \] dengan \(x_{baru}\) merupakan observasi sintetis, \(x_i\) merupakan observasi kelas minoritas yang dipilih, \(x_{nn}\) merupakan salah satu tetangga terdekat dari observasi tersebut, dan \(\lambda\) merupakan bilangan acak dalam rentang 0 sampai 1. Nilai \(\lambda\) menentukan posisi observasi sintetis di antara kedua observasi tersebut.
Jenis data yang digunakan dalam praktikum ini berupa data kuantitatif. Data kuantitatif adalah jenis data yang dapat diukur dan dinyatakan dalam bentuk angka. Data kuantitatif dapat digunakan untuk melakukan berbagai perhitungan dan analisis statistik.
Sumber data yang digunakan pada praktikum ini ialah data sekunder. Data sekunder adalah data yang telah dikumpulkan sebelumnya oleh pihak lain dan digunakan kembali untuk memenuhi kebutuhan suatu penelitian atau analisis. Data yang digunakan dalam praktikum ini merupakan data yang diperoleh dari asisten praktikum. Data tersebut berupa data cuaca dengan jumlah 743 observasi dan lima variabel, yaitu Hujan, Suhu, Kelembapan, Keadaan_Cuaca, dan Kecepatan_Angin.
Variabel penelitian yang digunakan dalam praktikum ini terdiri dari lima variabel, yaitu “Hujan”, “Suhu”, “Kelembapan”, “Keadaan_Cuaca”, dan “Kecepatan_Angin”. Variabel “Hujan” merupakan variabel target yang digunakan untuk menentukan kelas kondisi hujan. Variabel “Hujan” memiliki dua kelas, yaitu kelas 1 dan kelas 2, sehingga variabel tersebut termasuk variabel kategoris.
Variabel “Suhu” merupakan variabel kuantitatif yang menunjukkan suhu udara dalam satuan derajat Celsius. Variabel “Kelembapan” merupakan variabel kuantitatif yang menunjukkan tingkat kelembapan udara. Variabel “Keadaan_Cuaca” merupakan variabel yang menunjukkan kondisi cuaca dalam bentuk nilai atau kategori tertentu. Variabel ini kemudian dikelompokkan untuk mengurangi jumlah nilai unik sebelum dilakukan proses encoding. Sedangkan variabel “Kecepatan_Angin” merupakan variabel kuantitatif yang menunjukkan kecepatan angin.
Langkah-langkah analisis yang dilakukan dalam praktikum feature engineering adalah sebagai berikut: 1. Membuka aplikasi RStudio. 2. Memasukkan dataset yang diperoleh dari asisten praktikum ke dalam RStudio. 3. Melakukan pemeriksaan struktur data untuk mengetahui jumlah observasi, variabel, dan tipe data yang digunakan. 4. Melakukan pemeriksaan missing value pada setiap variabel. 5. Melakukan handling missing value pada variabel Kecepatan_Angin menggunakan metode mean imputation. 6. Melakukan handling missing value pada variabel Keadaan_Cuaca menggunakan metode interpolasi. 7. Melakukan pemeriksaan kembali untuk memastikan missing value telah ditangani. 8. Melakukan pemeriksaan kardinalitas pada variabel Keadaan_Cuaca. 9. Mengurangi kardinalitas variabel Keadaan_Cuaca dengan mengelompokkan nilai ke dalam beberapa kategori. 10. Melakukan splitting data menjadi data training dan data testing dengan proporsi 80% data training dan 20% data testing. 11. Melakukan identifikasi outlier pada variabel Suhu, Kelembapan, dan Kecepatan_Angin menggunakan metode Interquartile Range (IQR). 12. Melakukan handling outlier menggunakan metode capping berdasarkan batas bawah dan batas atas yang diperoleh dari data training. 13. Melakukan scaling pada variabel Suhu, Kelembapan, dan Kecepatan_Angin menggunakan metode robust scaling. 14. Melakukan encoding pada variabel Keadaan_Cuaca yang telah dikelompokkan menggunakan metode one-ho encoding. 15. Melakukan pemeriksaan distribusi kelas pada variabel Hujan untuk mengetahui apakah data mengalami ketidakseimbangan kelas atau imbalanced dataset. 16. Melakukan penanganan imbalanced dataset pada data training menggunakan metode SMOTE (Synthetic Minority Over-sampling Technique). 17. Melakukan pemeriksaan kembali terhadap data setelah seluruh tahapan feature engineering selesai dilakukan. 18. Menampilkan hasil akhir pengolahan data yang selanjutnya dapat digunakan dalam proses pemodelan machine learning.
Pada tahap awal dilakukan pemanggilan beberapa library yang
diperlukan untuk proses pengolahan dan analisis data. Library
merupakan kumpulan fungsi dan fasilitas yang dapat digunakan untuk
membantu proses analisis pada RStudio. Selain memanggil
library, pada tahap ini dilakukan proses impor data menggunakan
fungsi read_excel(), kemudian dilakukan pemeriksaan awal
terhadap struktur dan karakteristik dataset.
Sintaks yang digunakan adalah sebagai berikut.
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.1 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.3 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
##
## Attaching package: 'e1071'
##
## The following object is masked from 'package:rsample':
##
## permutations
##
## The following object is masked from 'package:ggplot2':
##
## element
##
## Attaching package: 'gridExtra'
##
## The following object is masked from 'package:dplyr':
##
## combine
##
## Attaching package: 'recipes'
##
## The following object is masked from 'package:stringr':
##
## fixed
##
## The following object is masked from 'package:stats':
##
## step
library(themis)
library(dplyr)
data <- read_excel("D:/SEMESTER 7/Laprak/ML/data curah hujan.xlsx")
head(data)## # A tibble: 6 × 5
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 23 95 5 NA
## 2 1 24 90 1 NA
## 3 1 26.8 77 1 NA
## 4 1 29.6 62 2 2
## 5 1 30.8 56 1 7
## 6 1 31 55 1 7
## tibble [743 × 5] (S3: tbl_df/tbl/data.frame)
## $ Hujan : num [1:743] 1 1 1 1 1 1 1 2 2 2 ...
## $ Suhu : num [1:743] 23 24 26.8 29.6 30.8 31 30.4 30.9 30.2 29.7 ...
## $ Kelembapan : num [1:743] 95 90 77 62 56 55 57 58 62 62 ...
## $ Keadaan_Cuaca : num [1:743] 5 1 1 2 1 1 3 2 2 2 ...
## $ Kecepatan_Angin: num [1:743] NA NA NA 2 7 7 9 10 8 7 ...
## Hujan Suhu Kelembapan Keadaan_Cuaca
## Min. :1.000 Min. :22.60 Min. : 52.00 Min. : 1.00
## 1st Qu.:2.000 1st Qu.:24.30 1st Qu.: 75.00 1st Qu.: 2.00
## Median :2.000 Median :26.00 Median : 86.00 Median : 2.00
## Mean :1.779 Mean :26.54 Mean : 83.88 Mean :15.11
## 3rd Qu.:2.000 3rd Qu.:28.90 3rd Qu.: 94.00 3rd Qu.:15.00
## Max. :2.000 Max. :32.00 Max. :100.00 Max. :97.00
## NA's :9
## Kecepatan_Angin
## Min. : 2.000
## 1st Qu.: 4.000
## Median : 6.000
## Mean : 6.655
## 3rd Qu.: 9.000
## Max. :21.000
## NA's :314
Sintaks library() digunakan untuk memanggil
library yang diperlukan dalam proses analisis. Fungsi
read_excel() digunakan untuk membaca dataset dari file
Excel. Fungsi head() digunakan untuk menampilkan beberapa
baris awal data, sedangkan str() digunakan untuk mengetahui
struktur dataset, seperti jumlah observasi, jumlah variabel, dan tipe
data setiap variabel. Fungsi summary() digunakan untuk
memperoleh statistik deskriptif dari setiap variabel.
Statistik deskriptif merupakan tahap awal yang digunakan untuk mengetahui karakteristik dan kondisi dataset sebelum dilakukan data preprocessing. Statistik deskriptif memberikan ringkasan data melalui beberapa ukuran, yaitu nilai minimum, kuartil pertama (Q1), median, mean, kuartil ketiga (Q3), maksimum, dan jumlah missing value.
Nilai minimum dan maksimum digunakan untuk mengetahui rentang nilai suatu variabel. Mean menunjukkan nilai rata-rata data, sedangkan median menunjukkan nilai tengah setelah data diurutkan. Q1 menunjukkan nilai yang membatasi 25% data terendah, sedangkan Q3 menunjukkan nilai yang membatasi 75% data. Nilai Q1 dan Q3 juga dapat digunakan untuk menghitung Interquartile Range (IQR) yang selanjutnya digunakan dalam identifikasi outlier. Selain itu, jumlah missing value digunakan untuk mengetahui apakah terdapat data yang hilang dan perlu ditangani sebelum data digunakan untuk pemodelan.
Dengan demikian, statistik deskriptif tidak hanya digunakan untuk mengetahui gambaran umum data, tetapi juga menjadi dasar dalam menentukan kebutuhan data preprocessing. Berdasarkan hasil pemeriksaan statistik deskriptif dapat diketahui apakah dataset memiliki missing value, outlier, perbedaan skala, kategori yang perlu diubah, atau ketidakseimbangan kelas. Hasil tersebut kemudian digunakan untuk menentukan teknik preprocessing yang sesuai.
Berdasarkan hasil summary(data), diperoleh statistik
deskriptif sebagai berikut.
| Variabel | Min | Q1 | Median | Mean | Q3 | Max | Missing Value |
|---|---|---|---|---|---|---|---|
| Hujan | 1,00 | 2,00 | 2,00 | 1,779 | 2,00 | 2,00 | 0 |
| Suhu | 22,60 | 24,30 | 26,00 | 26,54 | 28,90 | 32,00 | 0 |
| Kelembapan | 52,00 | 75,00 | 86,00 | 83,88 | 94,00 | 100,00 | 0 |
| Keadaan_Cuaca | 1,00 | 2,00 | 2,00 | 15,11 | 15,00 | 97,00 | 9 |
| Kecepatan_Angin | 2,00 | 4,00 | 6,00 | 6,655 | 9,00 | 21,00 | 314 |
Berdasarkan hasil tersebut, dataset terdiri atas 743 observasi dan
lima variabel, yaitu Hujan, Suhu,
Kelembapan, Keadaan_Cuaca, dan
Kecepatan_Angin. Variabel Hujan memiliki nilai
minimum 1 dan maksimum 2 sehingga menunjukkan bahwa variabel tersebut
terdiri atas dua kelas.
Variabel Suhu memiliki nilai antara 22,60 hingga 32,00
dengan rata-rata 26,54. Variabel Kelembapan memiliki nilai
antara 52,00 hingga 100,00 dengan rata-rata 83,88. Sementara itu,
Keadaan_Cuaca memiliki nilai minimum 1 dan maksimum 97
dengan rata-rata 15,11 serta terdapat 9 missing value. Variabel
Kecepatan_Angin memiliki nilai minimum 2,00 dan maksimum
21,00 dengan rata-rata 6,655 serta memiliki 314 missing
value.
Hasil tersebut menunjukkan bahwa dataset memerlukan beberapa tahapan
data preprocessing. Adanya missing value pada
Keadaan_Cuaca dan Kecepatan_Angin menunjukkan
perlunya dilakukan handling missing value. Rentang nilai pada
variabel numerik perlu diperiksa untuk mengetahui keberadaan
outlier, sehingga dilakukan handling outlier.
Selanjutnya, perbedaan skala variabel numerik menjadi pertimbangan untuk
melakukan scaling. Variabel Keadaan_Cuaca perlu
diperiksa kardinalitasnya dan diubah ke bentuk numerik melalui
encoding. Selain itu, distribusi kelas pada Hujan
perlu diperiksa untuk mengetahui apakah terdapat imbalanced
dataset. Oleh karena itu, statistik deskriptif menjadi dasar untuk
menentukan tahapan data preprocessing yang dilakukan pada
bagian selanjutnya.
Missing value merupakan kondisi ketika terdapat data yang
tidak memiliki nilai pada suatu variabel. Berdasarkan hasil statistik
deskriptif, variabel Hujan, Suhu, dan
Kelembapan tidak memiliki missing value. Sementara
itu, terdapat 9 missing value pada Keadaan_Cuaca
dan 314 missing value pada Kecepatan_Angin. Sesuai
dengan ketentuan praktikum untuk NPM ganjil, missing value pada
Kecepatan_Angin ditangani menggunakan mean
imputation, sedangkan missing value pada
Keadaan_Cuaca ditangani menggunakan interpolasi.
Sintaks yang digunakan adalah sebagai berikut.
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 9 314
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0.00000000 0.00000000 0.00000000 0.01211306 0.42261104
## # A tibble: 319 × 5
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 23 95 5 NA
## 2 1 24 90 1 NA
## 3 1 26.8 77 1 NA
## 4 1 25 89 2 NA
## 5 1 24.6 90 2 NA
## 6 2 24.2 90 2 NA
## 7 2 23.9 90 2 NA
## 8 2 23.7 91 2 NA
## 9 2 23.5 92 2 NA
## 10 2 23.3 92 2 NA
## # ℹ 309 more rows
# Mean Imputation (Kecepatan_Angin)
df_imp <- data
df_imp$Kecepatan_Angin[is.na(df_imp$Kecepatan_Angin)] <- mean(
df_imp$Kecepatan_Angin,
na.rm = TRUE
)
colSums(is.na(df_imp))## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 9 0
# Interpolasi (Keadaan_Cuaca)
df_imp$Keadaan_Cuaca <- na.approx(
df_imp$Keadaan_Cuaca,
na.rm = FALSE,
rule = 2
)
colSums(is.na(df_imp))## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 0 0
Fungsi colSums(is.na(data)) digunakan untuk mengetahui
jumlah missing value pada setiap variabel. Fungsi
colMeans(is.na(data)) digunakan untuk mengetahui proporsi
missing value pada setiap variabel, sedangkan
filter(if_any(...)) digunakan untuk menampilkan observasi
yang memiliki setidaknya satu missing value.
Hasil pemeriksaan awal menunjukkan bahwa terdapat 9 missing
value pada Keadaan_Cuaca dan 314 missing
value pada Kecepatan_Angin. Selain itu, terdapat 319
observasi yang memiliki setidaknya satu missing value. Proporsi
missing value pada Keadaan_Cuaca sebesar 0,0121
atau sekitar 1,21%, sedangkan pada Kecepatan_Angin sebesar
0,4226 atau sekitar 42,26%.
Selanjutnya, dilakukan mean imputation pada
Kecepatan_Angin. Fungsi mean() digunakan untuk
menghitung rata-rata nilai yang tersedia dengan mengabaikan missing
value melalui na.rm = TRUE. Setelah proses tersebut
dilakukan, seluruh missing value pada
Kecepatan_Angin berhasil ditangani.
Untuk Keadaan_Cuaca, dilakukan interpolasi menggunakan
fungsi na.approx(). Interpolasi digunakan untuk
memperkirakan nilai yang hilang berdasarkan nilai pengamatan yang
tersedia di sekitarnya. Argumen rule = 2 digunakan agar
nilai yang hilang pada bagian awal atau akhir data tetap dapat diisi
berdasarkan nilai terdekat.
Setelah dilakukan mean imputation dan interpolasi, hasil
colSums(is.na(df_imp)) menunjukkan bahwa seluruh variabel
sudah tidak memiliki missing value. Dengan demikian,
permasalahan data hilang telah berhasil ditangani.
Kardinalitas menunjukkan jumlah nilai unik yang terdapat pada suatu
variabel. Pemeriksaan kardinalitas dilakukan pada variabel
Keadaan_Cuaca untuk mengetahui banyaknya nilai berbeda
sebelum dilakukan pengelompokan.
Sintaks yang digunakan adalah sebagai berikut.
## # A tibble: 10 × 5
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 23 95 5 6.66
## 2 1 24 90 1 6.66
## 3 1 26.8 77 1 6.66
## 4 1 29.6 62 2 2
## 5 1 30.8 56 1 7
## 6 1 31 55 1 7
## 7 1 30.4 57 3 9
## 8 2 30.9 58 2 10
## 9 2 30.2 62 2 8
## 10 2 29.7 62 2 7
## [1] 5.0 1.0 2.0 3.0 14.0 60.0 61.0 21.0 29.0 10.0 16.0 62.0 63.0 65.0 15.0
## [16] 17.0 13.0 95.0 91.0 49.0 97.0 56.0 1.5
# Menentukan interval dan label kategori baru
bins <- c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
labels <- 0:9
# Melakukan reduksi kardinalitas
df_imp$Keadaan_Cuaca_reduced <- cut(
df_imp$Keadaan_Cuaca,
breaks = bins,
labels = labels,
right = TRUE,
include.lowest = TRUE
)
# Membandingkan data asli dan hasil reduksi
cat("--- Hasil Perbandingan ---\n")## --- Hasil Perbandingan ---
## # A tibble: 10 × 6
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin Keadaan_Cuaca_reduced
## <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
## 1 1 24 90 1 6.66 0
## 2 2 30 65 1 5 0
## 3 1 23.2 98 61 6.66 6
## 4 2 28.9 74 2 5 0
## 5 2 24.4 91 2 6.66 0
## 6 2 25.2 92 1 6.66 0
## 7 2 28.7 70 3 8 0
## 8 2 27.8 79 2 3 0
## 9 2 32 58 2 10 0
## 10 1 23.8 97 65 9 6
##
## --- Pengecekan Kardinalitas ---
## Jumlah kategori unik asli: 23
cat("Jumlah kategori teramati setelah reduksi:",
length(unique(na.omit(df_imp$Keadaan_Cuaca_reduced))),"\n")## Jumlah kategori teramati setelah reduksi: 7
## Jumlah level faktor setelah reduksi: 10
##
## Kategori unik yang baru (reduced):
## [1] 0 1 2 4 5 6 9
## Levels: 0 1 2 3 4 5 6 7 8 9
##
## Tabel frekuensi kategori hasil reduksi:
##
## 0 1 2 3 4 5 6 7 8 9
## 523 48 46 0 1 28 71 0 0 26
Fungsi unique() digunakan untuk mengetahui nilai yang
berbeda dalam suatu variabel. Fungsi length() kemudian
digunakan untuk menghitung jumlah nilai unik tersebut. Sementara itu,
fungsi cut() digunakan untuk mengelompokkan nilai
Keadaan_Cuaca ke dalam beberapa interval.
Hasil pemeriksaan menunjukkan bahwa variabel
Keadaan_Cuaca memiliki 23 nilai unik. Selanjutnya, nilai
tersebut dikelompokkan menjadi interval 0–10, 10–20, dan seterusnya
hingga 90–100. Setelah dilakukan pengelompokan, terbentuk 7 kategori
yang memiliki observasi.
Berdasarkan hasil table(), kategori 0 memiliki 523
observasi, kategori 1 sebanyak 48 observasi, kategori 2 sebanyak 46
observasi, kategori 4 sebanyak 1 observasi, kategori 5 sebanyak 28
observasi, kategori 6 sebanyak 71 observasi, dan kategori 9 sebanyak 26
observasi. Sementara itu, kategori 3, 7, dan 8 tidak memiliki
observasi.
Pengelompokan tersebut dilakukan untuk menyederhanakan representasi
nilai Keadaan_Cuaca sehingga variabel lebih mudah digunakan
pada tahap encoding.
Splitting data merupakan proses membagi dataset menjadi data training dan data testing. Data training digunakan untuk proses pembelajaran model, sedangkan data testing digunakan untuk mengevaluasi kemampuan model pada data yang tidak digunakan selama proses pembelajaran.
Sesuai dengan ketentuan praktikum untuk NPM ganjil, metode yang digunakan adalah shuffle splitting. Data dibagi dengan proporsi 80% untuk data training dan 20% untuk data testing.
Sintaks yang digunakan adalah sebagai berikut.
## Splitting Data (Shuffle)
set.seed(200)
split_shuffle <- initial_split(
df_imp,
prop = 0.8
)
X_train <- training(split_shuffle) %>%
dplyr::select(-Hujan)
X_test <- testing(split_shuffle) %>%
dplyr::select(-Hujan)
y_train <- training(split_shuffle)$Hujan
y_test <- testing(split_shuffle)$Hujan
dim(X_train)## [1] 594 5
## [1] 149 5
Fungsi set.seed(200) digunakan agar hasil pembagian data
tetap sama ketika sintaks dijalankan kembali. Fungsi
initial_split() digunakan untuk membagi dataset secara acak
dengan proporsi 80% data training dan 20% data
testing. Fungsi training() digunakan untuk
mengambil bagian data training, sedangkan
testing() digunakan untuk mengambil bagian data
testing.
Hasil pembagian menunjukkan bahwa data training terdiri atas 594 observasi dengan 5 variabel prediktor, sedangkan data testing terdiri atas 149 observasi dengan 5 variabel prediktor.
Variabel Hujan dipisahkan dari variabel prediktor dan
disimpan sebagai y_train dan y_test. Variabel
selain Hujan digunakan sebagai prediktor dan disimpan dalam
X_train dan X_test.
Outlier merupakan nilai yang memiliki jarak relatif jauh dari sebagian besar data. Keberadaan outlier perlu diperiksa karena nilai ekstrem dapat memengaruhi hasil analisis dan proses pemodelan.
Identifikasi outlier dilakukan pada variabel numerik, yaitu
Suhu, Kelembapan, dan
Kecepatan_Angin. Metode yang digunakan adalah
Interquartile Range (IQR).
## Handling Outlier
list_num <- c(
"Suhu",
"Kelembapan",
"Kecepatan_Angin"
)
list_outlier <- c()
list_lower_bound <- c()
list_upper_bound <- c()
for (i in list_num) {
Q1 <- quantile(X_train[[i]], 0.25, na.rm = TRUE)
Q3 <- quantile(X_train[[i]], 0.75, na.rm = TRUE)
IQR_val <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR_val
upper_bound <- Q3 + 1.5 * IQR_val
list_lower_bound <- c(list_lower_bound, lower_bound)
list_upper_bound <- c(list_upper_bound, upper_bound)
total_outliers <- sum(
X_train[[i]] < lower_bound,
na.rm = TRUE
) +
sum(
X_train[[i]] > upper_bound,
na.rm = TRUE
)
list_outlier <- c(list_outlier, total_outliers)
}
outliers <- data.frame(
Kolom = list_num,
Jumlah_Outlier = list_outlier,
Lower_Bound = list_lower_bound,
Upper_Bound = list_upper_bound
)
outliers## Kolom Jumlah_Outlier Lower_Bound Upper_Bound
## 1 Suhu 0 17.4 35.8
## 2 Kelembapan 0 46.5 122.5
## 3 Kecepatan_Angin 50 2.0 10.0
Batas outlier ditentukan berdasarkan:
\[
IQR=Q3-Q1
\] \[
Batas\;Bawah=Q1-1,5(IQR)
\] \[
Batas\;Atas=Q3+1,5(IQR)
\] Berdasarkan hasil identifikasi, variabel Suhu
memiliki 0 outlier dengan batas bawah 17,4 dan batas atas 35,8.
Variabel Kelembapan juga memiliki 0 outlier,
dengan batas bawah 46,5 dan batas atas 122,5. Sementara itu,
Kecepatan_Angin memiliki 50 outlier, dengan batas
bawah 2 dan batas atas 10.
Selanjutnya dilakukan capping pada variabel numerik menggunakan batas yang diperoleh dari data training. Nilai yang berada di bawah batas bawah disesuaikan menjadi batas bawah, sedangkan nilai yang berada di atas batas atas disesuaikan menjadi batas atas.
# Capping pada variabel numerik terpilih
X_train_capped <- X_train
X_test_capped <- X_test
for (k in seq_along(list_num)) {
col <- list_num[k]
X_train_capped[[col]] <- pmin(
pmax(X_train[[col]], list_lower_bound[k]),
list_upper_bound[k]
)
X_test_capped[[col]] <- pmin(
pmax(X_test[[col]], list_lower_bound[k]),
list_upper_bound[k]
)
}
summary(X_train[list_num])## Suhu Kelembapan Kecepatan_Angin
## Min. :22.60 Min. : 52 Min. : 2.000
## 1st Qu.:24.30 1st Qu.: 75 1st Qu.: 5.000
## Median :26.00 Median : 86 Median : 6.655
## Mean :26.54 Mean : 84 Mean : 6.642
## 3rd Qu.:28.90 3rd Qu.: 94 3rd Qu.: 7.000
## Max. :31.60 Max. :100 Max. :21.000
## Suhu Kelembapan Kecepatan_Angin
## Min. :22.60 Min. : 52 Min. : 2.000
## 1st Qu.:24.30 1st Qu.: 75 1st Qu.: 5.000
## Median :26.00 Median : 86 Median : 6.655
## Mean :26.54 Mean : 84 Mean : 6.447
## 3rd Qu.:28.90 3rd Qu.: 94 3rd Qu.: 7.000
## Max. :31.60 Max. :100 Max. :10.000
Hasil perbandingan sebelum dan sesudah capping menunjukkan
bahwa nilai maksimum Kecepatan_Angin berubah dari 21
menjadi 10. Rata-rata Kecepatan_Angin juga berubah dari
6,642 menjadi 6,447. Sementara itu, Suhu dan
Kelembapan tidak mengalami perubahan karena tidak memiliki
outlier berdasarkan batas IQR.
Untuk melihat perubahan distribusi data secara visual, digunakan histogram dan boxplot sebelum dan sesudah dilakukan capping.
diagnostic_plots <- function(df, variable) {
p1 <- ggplot(df, aes(x = .data[[variable]])) +
geom_histogram(
bins = 30,
fill = "#008080",
color = "black"
) +
ggtitle("Histogram") +
theme_minimal()
p2 <- ggplot(df, aes(y = .data[[variable]])) +
geom_boxplot(fill = "#008080") +
ggtitle("Boxplot") +
theme_minimal()
grid.arrange(p1, p2, ncol = 2)
}
for (col in list_num) {
cat(col, "- Before Capping\n")
diagnostic_plots(X_train, col)
cat(col, "- After Capping\n")
diagnostic_plots(X_train_capped, col)
}## Suhu - Before Capping
## Suhu - After Capping
## Kelembapan - Before Capping
## Kelembapan - After Capping
## Kecepatan_Angin - Before Capping
## Kecepatan_Angin - After Capping
Hasil visualisasi menunjukkan bahwa perubahan paling terlihat pada
variabel Kecepatan_Angin. Setelah dilakukan
capping, nilai-nilai yang sebelumnya berada di atas batas atas
sebesar 10 dibatasi menjadi 10. Dengan demikian, nilai ekstrem dapat
dikendalikan tanpa menghapus observasi dari dataset.
Scaling merupakan proses mengubah skala variabel numerik agar perbedaan rentang antarvariabel dapat dikurangi. Sesuai dengan ketentuan praktikum untuk NPM ganjil, metode scaling yang digunakan adalah Robust Scaler.
Robust Scaler menggunakan median dan IQR sehingga lebih tahan terhadap pengaruh nilai ekstrem. Rumus transformasi yang digunakan adalah:
\[ X^*=\frac{X-\text{Median}(X)}{IQR(X)} \]
Sintaks yang digunakan adalah sebagai berikut.
## Scaling (Robust Scaler)
median_val <- sapply(
X_train_capped[list_num],
median,
na.rm = TRUE
)
iqr_val <- sapply(
X_train_capped[list_num],
IQR,
na.rm = TRUE
)
X_train_scale <- X_train_capped
X_test_scale <- X_test_capped
for (col in list_num) {
X_train_scale[[col]] <-
(X_train_capped[[col]] - median_val[col]) /
iqr_val[col]
X_test_scale[[col]] <-
(X_test_capped[[col]] - median_val[col]) /
iqr_val[col]
}
summary(X_train_scale[list_num])## Suhu Kelembapan Kecepatan_Angin
## Min. :-0.7391 Min. :-1.7895 Min. :-2.3275
## 1st Qu.:-0.3696 1st Qu.:-0.5789 1st Qu.:-0.8275
## Median : 0.0000 Median : 0.0000 Median : 0.0000
## Mean : 0.1177 Mean :-0.1053 Mean :-0.1041
## 3rd Qu.: 0.6304 3rd Qu.: 0.4211 3rd Qu.: 0.1725
## Max. : 1.2174 Max. : 0.7368 Max. : 1.6725
Median dan IQR dihitung berdasarkan data training. Nilai tersebut kemudian digunakan untuk melakukan transformasi terhadap data training dan data testing. Pendekatan tersebut dilakukan agar parameter transformasi tidak diperoleh dari data testing.
Berdasarkan hasil transformasi, median ketiga variabel numerik
menjadi 0. Variabel Suhu memiliki nilai minimum -0,7391 dan
maksimum 1,2174. Variabel Kelembapan memiliki nilai minimum
-1,7895 dan maksimum 0,7368. Sementara itu, Kecepatan_Angin
memiliki nilai minimum -2,3275 dan maksimum 1,6725.
Hasil tersebut menunjukkan bahwa ketiga variabel numerik telah ditransformasikan ke skala yang relatif sebanding dengan menggunakan median dan IQR sebagai dasar transformasi.
Encoding merupakan proses mengubah variabel kategorik
menjadi bentuk numerik sehingga dapat digunakan oleh algoritma
machine learning. Pada tahap ini digunakan metode one-hot
encoding terhadap variabel Keadaan_Cuaca_reduced.
Sintaks yang digunakan adalah sebagai berikut.
## Encoding (One Hot)
resep_encode <- recipe(
~ Keadaan_Cuaca_reduced,
data = X_train_scale
) %>%
step_dummy(
Keadaan_Cuaca_reduced,
one_hot = TRUE
) %>%
prep(training = X_train_scale)
X_train_encoded <- bake(
resep_encode,
new_data = NULL
)
X_test_encoded <- bake(
resep_encode,
new_data = X_test_scale
)
# Gabungkan fitur numerik + hasil one-hot
X_train_final <- bind_cols(
X_train_scale[, list_num],
X_train_encoded
)
X_test_final <- bind_cols(
X_test_scale[, list_num],
X_test_encoded
)
head(X_train_final)## # A tibble: 6 × 13
## Suhu Kelembapan Kecepatan_Angin Keadaan_Cuaca_reduced_X0
## <dbl> <dbl> <dbl> <dbl>
## 1 -0.500 0.579 0 0
## 2 1.09 -0.947 1.67 1
## 3 0.0870 -0.263 -0.828 1
## 4 1.15 -1.53 1.17 1
## 5 0.674 -0.421 0 1
## 6 0.391 -0.368 -1.83 1
## # ℹ 9 more variables: Keadaan_Cuaca_reduced_X1 <dbl>,
## # Keadaan_Cuaca_reduced_X2 <dbl>, Keadaan_Cuaca_reduced_X3 <dbl>,
## # Keadaan_Cuaca_reduced_X4 <dbl>, Keadaan_Cuaca_reduced_X5 <dbl>,
## # Keadaan_Cuaca_reduced_X6 <dbl>, Keadaan_Cuaca_reduced_X7 <dbl>,
## # Keadaan_Cuaca_reduced_X8 <dbl>, Keadaan_Cuaca_reduced_X9 <dbl>
## [1] 594 13
Fungsi recipe() digunakan untuk menyusun tahapan
preprocessing, sedangkan step_dummy() digunakan
untuk melakukan one-hot encoding. Argumen
one_hot = TRUE digunakan agar setiap kategori
direpresentasikan sebagai variabel indikator.
Hasil encoding menghasilkan 10 kolom indikator, yaitu
Keadaan_Cuaca_reduced_X0 sampai
Keadaan_Cuaca_reduced_X9. Meskipun hanya terdapat 7
kategori yang memiliki observasi, seluruh 10 level tetap
direpresentasikan karena faktor Keadaan_Cuaca_reduced
memiliki level 0 sampai 9.
Selanjutnya, variabel hasil encoding digabungkan dengan tiga
variabel numerik yang telah melalui Robust Scaler, yaitu
Suhu, Kelembapan, dan
Kecepatan_Angin.
Berdasarkan hasil dim(X_train_final), diperoleh 594
observasi dan 13 variabel prediktor. Dengan demikian, data
training telah memiliki bentuk numerik yang dapat digunakan
pada tahap berikutnya.
Imbalanced dataset merupakan kondisi ketika jumlah observasi
pada setiap kelas tidak seimbang. Pemeriksaan distribusi kelas dilakukan
pada variabel target Hujan setelah data training
melalui tahapan preprocessing sebelumnya.
Sintaks untuk melihat distribusi kelas adalah sebagai berikut.
## y_train
## 1 2
## 128 466
Hasil pemeriksaan menunjukkan bahwa kelas 1 memiliki 128 observasi, sedangkan kelas 2 memiliki 466 observasi. Perbedaan jumlah tersebut menunjukkan bahwa data training mengalami ketidakseimbangan kelas. Kelas 1 merupakan kelas minoritas, sedangkan kelas 2 merupakan kelas mayoritas.
Ketidakseimbangan kelas dapat menyebabkan model lebih cenderung mempelajari kelas mayoritas. Oleh karena itu, sesuai dengan ketentuan praktikum dilakukan penanganan imbalanced dataset menggunakan SMOTE (Synthetic Minority Over-sampling Technique).
Sintaks yang digunakan adalah sebagai berikut.
train_full <- X_train_final %>%
mutate(Hujan = factor(y_train))
set.seed(42)
resep_smote <- recipe(
Hujan ~ .,
data = train_full
) %>%
step_smote(
Hujan,
over_ratio = 1,
neighbors = 5
)
resep_smote_prep <- prep(
resep_smote,
training = train_full
)
train_balanced <- bake(
resep_smote_prep,
new_data = NULL
)
X_train_balanced <- train_balanced %>%
dplyr::select(-Hujan)
y_train_balanced <- train_balanced$Hujan
table(y_train_balanced)## y_train_balanced
## 1 2
## 466 466
## [1] 932 14
Fungsi mutate() digunakan untuk mengubah variabel
Hujan menjadi faktor. Fungsi step_smote()
digunakan untuk menerapkan SMOTE dengan over_ratio = 1 dan
neighbors = 5. Parameter over_ratio = 1
digunakan untuk menghasilkan jumlah kelas minoritas yang seimbang dengan
kelas mayoritas, sedangkan neighbors = 5 menunjukkan jumlah
tetangga yang digunakan dalam pembentukan observasi sintetis.
Hasil setelah SMOTE menunjukkan bahwa kelas 1 meningkat dari 128 menjadi 466 observasi, sedangkan kelas 2 tetap sebanyak 466 observasi.
| Kelas Hujan | Sebelum SMOTE | Sesudah SMOTE |
|---|---|---|
| 1 | 128 | 466 |
| 2 | 466 | 466 |
| Total | 594 | 932 |
Dengan demikian, jumlah data training setelah proses SMOTE
menjadi 932 observasi dengan distribusi kelas yang seimbang. Data
tersebut terdiri atas 13 variabel prediktor dan satu variabel target
Hujan.
Proses SMOTE diterapkan hanya pada data training. Data testing tidak diseimbangkan menggunakan SMOTE sehingga tetap merepresentasikan kondisi data yang sebenarnya dan dapat digunakan untuk mengevaluasi performa model secara lebih objektif.
Secara keseluruhan, tahapan data preprocessing pada dataset dilakukan berdasarkan kondisi yang ditemukan melalui pemeriksaan awal dan statistik deskriptif. Tahapan tersebut meliputi mean imputation, interpolasi, reduksi kardinalitas, shuffle splitting, handling outlier menggunakan capping, Robust Scaling, one-hot encoding, dan SMOTE. Hasil akhir menunjukkan bahwa data training telah memiliki prediktor dalam bentuk numerik, nilai hilang telah ditangani, nilai ekstrem telah dikendalikan, skala numerik telah ditransformasi, dan distribusi kelas telah diseimbangkan sehingga data siap digunakan untuk tahap pemodelan.
Feature engineering pada RStudio merupakan proses pengolahan data yang dilakukan untuk meningkatkan kualitas dan kesiapan data sebelum digunakan dalam pemodelan machine learning. Teknik yang digunakan dalam praktikum meliputi penanganan missing value dengan mean imputation dan interpolasi, reduksi kardinalitas, data splitting, penanganan outlier dengan capping, scaling, encoding, serta penanganan imbalanced dataset menggunakan SMOTE. Setiap teknik memiliki fungsi dalam mengatasi permasalahan yang terdapat pada data sehingga karakteristik data dapat disesuaikan dengan kebutuhan analisis dan pemodelan.
Penerapan feature engineering pada RStudio dilakukan melalui
tahapan pemeriksaan data, penanganan missing value, reduksi
kardinalitas, pembagian data, penanganan outlier,
scaling, encoding, dan penanganan imbalanced
dataset. Teknik yang diterapkan untuk NPM ganjil meliputi mean
imputation, shuffle splitting, dan Robust Scaler,
serta interpolasi pada Keadaan_Cuaca, capping pada
variabel numerik, one-hot encoding, dan SMOTE pada data latih.
Seluruh tahapan tersebut dapat dilakukan menggunakan fungsi dan paket
yang tersedia pada RStudio.
Hasil preprocessing menunjukkan bahwa seluruh missing
value berhasil ditangani, variabel Keadaan_Cuaca
mengalami reduksi dari 23 nilai unik menjadi 10 kategori dengan 7
kategori yang memiliki observasi, dan pembagian data menghasilkan 594
data latih serta 149 data uji. Sebanyak 50 outlier ditemukan
pada Kecepatan_Angin dan ditangani menggunakan
capping dengan batas atas 10. Proses Robust Scaling
diterapkan pada variabel numerik, sedangkan one-hot encoding
menghasilkan 13 variabel prediktor. Ketidakseimbangan kelas yang semula
terdiri atas 128 observasi kelas 1 dan 466 observasi kelas 2 berhasil
diseimbangkan menggunakan SMOTE menjadi masing-masing 466 observasi,
sehingga diperoleh 932 observasi data latih.
Darmawan, R., Yut, I. V., Hernando, A., Handayani, R. I., Pratiwi, R. L., & Widanengsih, E. (2026). Analisis peran feature engineering pada kinerja model machine learning untuk klasifikasi potensi tsunami. Jurnal Informatika dan Teknik Elektro Terapan, 14(1). https://doi.org/10.23960/jitet.v14i1.8303
Faiz, M. N., Somantri, O., & Muhammad, A. W. (2022). Machine learning-based feature engineering to detect DDoS attacks. Jurnal Nasional Teknik Elektro dan Teknologi Informasi, 11(3), 176–182. https://doi.org/10.22146/jnteti.v11i3.3423
Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Laboratorium Matematika Universitas Bengkulu.
Indini, D. P., Ariza, S., & Sitorus, Z. (2026). Optimasi algoritma K-Means terhadap data outlier menggunakan robust dalam segmentasi pelanggan Biznet Medan. Journal of Science and Social Research, 9(3), 4505–4515. https://doi.org/10.54314/jssr.v9i3.6568
Indrawati, A. (2021). Penerapan teknik kombinasi oversampling dan undersampling untuk mengatasi permasalahan imbalanced dataset. JIKO (Jurnal Informatika dan Komputer), 4(1), 38–43. https://doi.org/10.33387/jiko.v4i1.2561
Izonin, I., Tkachenko, R., Shakhovska, N., Ilchyshyn, B., & Singh, K. K. (2022). A two-step data normalization approach for improving classification accuracy in the medical diagnosis domain. Mathematics, 10(11), 1942. https://doi.org/10.3390/math10111942
Pratama, F. R. A., & Oktora, S. I. (2023). Synthetic minority over-sampling technique (SMOTE) for handling imbalanced data in poverty classification. Statistical Journal of the IAOS, 39(1), 233–239. https://doi.org/10.3233/SJI-220080
Santoso, L., & Priyadi. (2024). Comparative study of feature engineering techniques for predictive data analytics. Journal of Technology Informatics and Engineering, 3(2), 417–435. https://doi.org/10.51903/jtie.v3i2.225