BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

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.

1.2 Rumusan Masalah

  1. Apa saja jenis-jenis feature engineering yang dapat dilakukan menggunakan RStudio?
  2. Bagaimana cara menerapkan teknik feature engineering menggunakan program RStudio pada suatu dataset?

1.3 Tujuan

  1. Mahasiswa memahami konsep dari berbagai jenis feature engineering pada RStudio.
  2. Mahasiswa dapat melakukan teknik feature engineering di program RStudio.

BAB II TINJAUAN PUSTAKA

2.1 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.

2.2 Feature Engineering

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.

BAB III METODE PENELITIAN

3.1 Sumber Data

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.

3.2 Variabel Penelitian

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.

3.3 Langkah-langkah Analisis

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.

BAB IV HASIL DAN PEMBAHASAN

4.1 Library dan Statistik Deskriptif

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.

library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(readxl)
library(tidyverse)
## ── 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
library(rsample)
library(e1071)
## 
## Attaching package: 'e1071'
## 
## The following object is masked from 'package:rsample':
## 
##     permutations
## 
## The following object is masked from 'package:ggplot2':
## 
##     element
library(ggplot2)
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
library(recipes)
## 
## 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
str(data)
## 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 ...
summary(data)
##      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.

4.2 Handling Missing Value

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.

# Cek Missing Value
colSums(is.na(data))
##           Hujan            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##               0               0               0               9             314
colMeans(is.na(data))
##           Hujan            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##      0.00000000      0.00000000      0.00000000      0.01211306      0.42261104
data %>% filter(if_any(everything(), is.na)) 
## # 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.

4.3 Kardinalitas

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.

## Reduksi Kardinalitas

# Melihat 10 data pertama
head(df_imp, 10)
## # 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
# Melihat kategori unik variabel asli
unique(df_imp$Keadaan_Cuaca)
##  [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 ---
print(df_imp[sample(nrow(df_imp), 10), ])
## # 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
# Memeriksa kardinalitas
cat("\n--- Pengecekan Kardinalitas ---\n")
## 
## --- Pengecekan Kardinalitas ---
cat("Jumlah kategori unik asli:",
    length(unique(na.omit(df_imp$Keadaan_Cuaca))),"\n")
## 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
cat( "Jumlah level faktor setelah reduksi:",
     nlevels(df_imp$Keadaan_Cuaca_reduced),"\n")
## Jumlah level faktor setelah reduksi: 10
# Menampilkan kategori unik secara berurutan
cat("\nKategori unik yang baru (reduced):\n")
## 
## Kategori unik yang baru (reduced):
print(sort(unique(na.omit(df_imp$Keadaan_Cuaca_reduced))))
## [1] 0 1 2 4 5 6 9
## Levels: 0 1 2 3 4 5 6 7 8 9
# Menampilkan frekuensi setiap kategori
cat("\nTabel frekuensi kategori hasil reduksi:\n")
## 
## Tabel frekuensi kategori hasil reduksi:
print(table(df_imp$Keadaan_Cuaca_reduced, useNA = "ifany"))
## 
##   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.

4.4 Splitting Data

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
dim(X_test)
## [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.

4.5 Handling Outlier

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
summary(X_train_capped[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.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.

4.6 Scaling Data

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.

4.7 Encoding

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>
dim(X_train_final)
## [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.

4.8 Handling Imbalanced Dataset dengan SMOTE

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.

## Balancing Data (SMOTE)
table(y_train)
## 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
dim(train_balanced)
## [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.

BAB V KESIMPULAN

5.1 Kesimpulan

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.

DAFTAR PUSTAKA

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