BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

   Perkembangan teknologi dan meningkatnya ketersediaan data mendorong penggunaan machine learning dalam berbagai bidang untuk melakukan klasifikasi, prediksi, maupun pengambilan keputusan. Dalam penerapannya, kualitas data yang digunakan sebagai masukan sangat berpengaruh terhadap kemampuan model dalam mengenali pola. Data yang tersedia sering kali memiliki berbagai karakteristik, seperti fitur yang tidak relevan, fitur yang berlebihan, maupun bentuk data yang belum sesuai dengan kebutuhan algoritma. Oleh karena itu, diperlukan proses pengolahan fitur sebelum data digunakan dalam pemodelan agar informasi yang terdapat dalam data dapat direpresentasikan dengan lebih baik.Penerapan feature engineering dapat berperan dalam meningkatkan kualitas fitur yang digunakan pada model machine learning (Darmawan dkk., 2026).
   Feature engineering merupakan proses mengolah fitur yang tersedia sehingga menjadi representasi yang lebih sesuai untuk digunakan dalam model machine learning. Proses ini dapat dilakukan melalui berbagai teknik, seperti transformasi fitur, pembentukan fitur baru, pengubahan bentuk data kategorik menjadi numerik, serta pemilihan fitur yang relevan. Salah satu penerapannya adalah encoding, yaitu mengubah data kategorik atau teks menjadi bentuk numerik agar dapat diproses oleh algoritma machine learning. Label encoding dan one-hot encoding merupakan bagian dari feature engineering yang dapat digunakan untuk mengubah data teks atau kategorik menjadi bentuk numerik yang lebih sesuai untuk proses pemodelan (Herdian dkk., 2024).
   Selain transformasi, seleksi fitur (feature selection) menjadi salah satu tahapan penting dalam feature engineering. Seleksi fitur dilakukan dengan memilih fitur yang relevan dan mengurangi fitur yang tidak diperlukan sehingga jumlah variabel yang digunakan dalam pemodelan menjadi lebih efisien. Penggunaan fitur yang tidak relevan dapat memengaruhi kinerja model dan meningkatkan kompleksitas proses pembelajaran.Penerapan metode seleksi fitur dapat memberikan pengaruh terhadap kinerja model Support Vector Machine.
   Berdasarkan uraian tersebut, praktikum kali ini dilakukan untuk memahami tahapan pengolahan fitur sebelum data digunakan dalam pemodelan machine learning. Melalui praktikum ini, dilakukan penerapan beberapa teknik pengolahan fitur, seperti transformasi dan seleksi fitur, sehingga dapat diketahui bagaimana perubahan representasi data dapat memengaruhi kesiapan data untuk proses pemodelan. Pemahaman terhadap feature engineering penting karena fitur yang tepat dan informatif dapat membantu menghasilkan model yang lebih efektif, efisien, serta mampu menangkap pola yang terdapat dalam data.

1.2 Rumusan Masalah

   Berdasarkan latar belakang, rumusan masalah yang disimpulkan adalah:
   1.  Bagaimana konsep dari berbagai jenis feature engiinering pada RStudio?
   2.  Bagaimana cara melakukan teknik feature engineering di program RStudio?

1.3 Tujuan Penelitian

   Berdasarkan rumusan masalah, tujuan yang dapat disimpulkan adalah:
   1. Mahasiswa memahami konsep dari berbagai jenis feature engineering pada RStudio.
   2. Mahasiswa dapat melakukan teknik feature engineering di program RStudio.

1.4 Manfaat Penelitian

   Adapun manfaat pada penelitian ini, yaitu: 
   1. Bagi penulis
      a. Dapat memberikan informasi serta pengetahuan tentang feature engineering.
      b. Dapat menerapkan wawasan ilmu yang telah diperoleh dalam bidang statistika tentang feature engineering.
   2. Bagi pembaca
      Menambah ilmu pengetahuan dan pemahaman yang berkaitan tentang feature engineering.

1.5 Batasan Masalah

   Gunakan dataset data curah hujan.xlsx untuk melakukan preprocessing data. NPM ganjil menggunakan mean imputation, shuffle splitting, dan Robust Scaler, sedangkan NPM genap menggunakan mode imputation, stratify splitting, dan Standard Scaler. Keduanya melakukan interpolasi pada Keadaan_Cuaca, capping pada data numerik, serta penanganan imbalance data menggunakan SMOTE. Tampilkan dan interpretasikan setiap output!

BAB II TINJAUAN PUSTAKA

2.1 Machine Learning

   Machine learning merupakan salah satu bagian dari kecerdasan buatan yang memungkinkan komputer mempelajari pola atau karakteristik dari data untuk menghasilkan suatu prediksi maupun keputusan. Proses pembelajaran dilakukan dengan memanfaatkan data sebagai dasar dalam membangun model sehingga model dapat digunakan untuk melakukan analisis terhadap data baru. Penerapan machine learning telah berkembang pada berbagai bidang karena mampu membantu proses pengolahan data dalam jumlah besar dan menemukan pola yang sulit diperoleh melalui analisis secara manual(Rizaldi dkk., 2026).
   Machine learning secara umum dapat dibedakan berdasarkan proses pembelajarannya menjadi supervised learning dan unsupervised learning. Supervised learning menggunakan data yang telah memiliki label atau variabel target sehingga model mempelajari hubungan antara variabel masukan dan target untuk menghasilkan prediksi atau klasifikasi. Sementara itu, unsupervised learning menggunakan data tanpa label dan bertujuan menemukan pola, struktur, atau kelompok yang terdapat dalam data. Pemilihan jenis pembelajaran disesuaikan dengan tujuan analisis dan karakteristik data yang digunakan (Arian dkk., 2026).
   Dalam penerapan machine learning, data perlu dipersiapkan sebelum digunakan untuk membangun model. Tahapan persiapan dapat meliputi pembersihan data, pengolahan variabel, pembagian data menjadi data pelatihan dan pengujian, hingga evaluasi model. Tahap tersebut diperlukan karena karakteristik dan kualitas data dapat memengaruhi kemampuan model dalam mempelajari pola. Oleh karena itu, proses pengolahan data menjadi salah satu tahapan penting dalam menghasilkan model machine learning yang mampu memberikan hasil prediksi atau klasifikasi dengan baik (Faiz dkk., 2022).

2.2 Feature Engineering

   Feature Engineering adalah langkah-langkah untuk mengubah data mentah menjadi fitur-fitur yang dapat digunakan dalam algoritma machine learning. Selama proses feature engineering, variabel/fitur yang paling berpengaruh dipilih dan direkayasa untuk pemodelan. Feature engineering memerlukan pemahaman yang baik karena melibatkan kombinasi analisis data, pengetahuan tentang data, dan sedikit intuisi. Tujuan dari feature engineering adalah menyederhanakan dan mempercepat transformasi data sekaligus meningkatkan akurasi model. kualitas fitur jauh lebih penting daripada seberapa canggih algoritma  yang dipilih. Berikut merupakan beberapa jenis feature engineering yang harus dilakukan (Fransiska, 2026): 

1. Handling Missing Value

  Missing values atau missing data, terjadi ketika tidak ada data / tidak ada nilai yang tersimpan untuk observasi tertentu dalam suatu variabel. Missing data adalah kejadian yang umum dan dapat berdampak signifikan pada pemodelan machine learning. Data yang tidak lengkap adalah masalah yang tidak terhindarkan dalam menangani sebagian besar sumber data. 

2. Kardinalitas

  Kardinalitas merujuk pada jumlah nilai unik, atau label, yang terdapat dalam suatu variabel kategoris. Konsep ini digunakan untuk mengukur granularitas atau keunikan data dalam sebuah fitur. Kardinalitas dapat diklasifikasikan dalam spektrum, namun umumnya dibedakan menjadi kardinalitas rendah (low cardinality) dan kardinalitas tinggi (high cardinality). Pengaruh kardinalitas, sangat krusial terhadap performa model dan efisiensi komputasi. Pertama, variabel high cardinality dapat menyebabkan curse of dimensionality  jika ditransformasi menggunakan metode encoding standar seperti One-Hot Encoding. Metode ini akan menciptakan banyak fitur biner baru (sesuai jumlah label), membuat data menjadi sangat jarang dan secara drastis meningkatkan kompleksitas komputasi. Kedua, kardinalitas secara signifikan meningkatkan risiko overfitting. Hal ini terjadi karena banyak label mungkin hanya muncul beberapa kali dalam set data latih, sehingga model cenderung menghafal pola spesifik yang terkait dengan label langka tersebut, alih-alih mempelajari pola umum yang dapat digeneralisasi ke data yang belum pernah terlihat. 

3. Splitting Data

  Splitting data merupakan strategi fundamental dalam machine learning untuk membagi himpunan data menjadi bagian terpisah: data training dan data testing. Pembagian ini krusial untuk membangun model yang robust dan dapat digeneralisasi dengan baik pada data baru (Muraina, 2022). Proporsi pembagian data bersifat subjektif dan fleksibel. Rasio yang umum digunakan adalah 80% untuk training dan 20% untuk testing (Woschnagg dan Cipan, 2004). Namun, seperti yang ditekankan oleh Géron (2019), rasio ini dapat disesuaikan tergantung pada ukuran dataset. 

4. Handling Outlier

  Outlier, atau dikenal sebagai pencilan, merupakan observasi atau titik data yang menunjukkan deviasi ekstrem dan berbeda secara signifikan dari sebagian besar data lain dalam suatu set data. Keberadaan outlier dapat diatribusikan ke berbagai sumber, mulai dari kesalahan pengukuran, kesalahan entri data (misinput), kontaminasi data, hingga representasi sah dari kejadian langka atau variabilitas inheren dalam populasi. Dalam analisis statistik dan pemodelan machine learning, outlier menuntut perhatian khusus karena memiliki potensi untuk memberikan pengaruh yang tidak proporsional (disproportionate influence) terhadap hasil. 

5. Scaling data

  Scaling data adalah salah satu langkah pra-pemrosesan dalam analisis data untuk mentransformasi variabel data ke dalam rentang skala yang sama. Tujuannya adalah untuk memastikan bahwa tidak ada satu variabel independen pun yang mendominasi proses pembelajaran hanya karena memiliki rentang nilai yang lebih besar dibandingkan variabel independen lainnya. Sebagaimana dinyatakan oleh Singh dan Singh (2020), normalisasi data sering kali dapat meningkatkan performa model prediktif secara signifikan, terutama untuk algoritma yang sensitif terhadap skala input.

6. Encoding Feature

  Encoding adalah proses mengubah fitur kategoris atau nonnumerik menjadi format numerik yang dapat digunakan sebagai input untuk algoritma machine learning. Banyak algoritma machine learning membutuhkan input numerik. Ada beberapa teknik umum untuk feature encoding, seperti OneHot Encoding dan Ordinal Encoding. G. Imbalanced Dataset Imbalanced Dataset adalah sebuah dataset di mana distribusi kelas atau kategorinya tidak setara. Kelas-kelas yang mencakup proporsi besar dari set data disebut kelas mayoritas, sedangkan kelas-kelas yang mencakup proporsi lebih kecil disebut kelas minoritas. Dalam praktiknya, akan lebih sering menjumpai data yang tidak seimbang daripada yang seimbang. Hal ini tidak serta merta menjadi masalah jika variabel target hanya memiliki sedikit ketidakseimbangan. Sayangnya, kenyataannya tidak selalu demikian dan variabel target Anda mungkin sangat tidak seimbang, sebagai contoh, dengan rasio 10:1. 

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

   Jenis data pada penelitian ini adalah data kuantitatif. Data kuantitatif merupakan data atau informasi yang didapatkan dalam bentuk angka atau numerik. Pada batasan masalah, data yang digunakan adalah data curah hujan. Sumber data yang digunakan adalah data sekunder. Data sekunder adalah data yang telah dikumpulkan dan diolah sebelumnya oleh pihak lain, bukan oleh peneliti yang sedang melakukan penelitian saat ini. Data sekunder yang digunakan pada penelitian ini berasal dari Asisten Praktikum.

3.2 Variabel Penelitian

   Variabel penelitian adalah atribut atau nilai yang memiliki variasi tertentu dan dipilih peneliti untuk dianalisis. Terdapat 5 variabel yang digunakan dalam penelitian ini. variabel yang digunakan yaitu hujan, suhu, kelembapan, keadaan cuaca, dan kecepatan angin.

3.3 Langkah-langkah Analisis

   Berikut adalah algoritma untuk menyelesaiankan batasan masalah:
   1.Mulai.
   2.Menghitung distribusi kelas pada variabel target y_train.
   3.Menggabungkan data prediktor hasil encoding dengan variabel target Hujan.
   4.Mengubah variabel target Hujan menjadi tipe factor agar dapat digunakan dalam proses SMOTE.
   5.Menentukan seed untuk menjaga hasil proses tetap konsisten.
   6.Membuat recipe SMOTE dengan variabel Hujan sebagai target.
   7.Menentukan over_ratio = 1 dan jumlah tetangga (neighbors) sebanyak 5.
   8.Melakukan prep() berdasarkan data training.
   9.Menerapkan SMOTE menggunakan bake() untuk menghasilkan data training yang lebih seimbang.
  10.Menghasilkan train_balanced sebagai dataset hasil penanganan imbalanced dataset.
  11.Selesai.

BAB IV HASIL DAN PEMBAHASAN

4.1 Library

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(DescTools)
library(dplyr)
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(caret)   
## Loading required package: lattice
## 
## Attaching package: 'caret'
## 
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE
## 
## The following object is masked from 'package:rsample':
## 
##     calibration
## 
## The following object is masked from 'package:purrr':
## 
##     lift
# Import Data
data_ch <- read_excel("~/MACHINE LEARNING/data curah hujan.xlsx")
View(data_ch)
head(data_ch)
## # 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_ch)
## 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_ch)
##      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  
##                                                   NAs    :9      
##  Kecepatan_Angin 
##  Min.   : 2.000  
##  1st Qu.: 4.000  
##  Median : 6.000  
##  Mean   : 6.655  
##  3rd Qu.: 9.000  
##  Max.   :21.000  
##  NAs    :314

Interpretasi statdesk

Berdasarkan hasil pemeriksaan struktur data menggunakan fungsi str(data_ch), dataset curah hujan terdiri dari 743 pengamatan dan 5 variabel, yaitu Hujan, Suhu, Kelembapan, Keadaan_Cuaca, dan Kecepatan_Angin. Kelima variabel tersebut terbaca sebagai tipe data numerik (numeric), sehingga perlu dipastikan kembali apakah variabel Hujan dan Keadaan_Cuaca merupakan data numerik atau kode kategori. Selanjutnya, hasil statistik deskriptif menggunakan fungsi summary(data_ch) menunjukkan bahwa variabel Suhu memiliki rentang nilai 22,60–32,00 dengan rata-rata 26,54, sedangkan Kelembapan memiliki rentang 52–100 dengan rata-rata 83,88. Variabel Hujan memiliki nilai 1–2 dengan rata-rata 1,779, Keadaan_Cuaca memiliki nilai maksimum 97, dan Kecepatan_Angin memiliki rentang nilai 2–21 dengan rata-rata 6,655. Hasil pemeriksaan juga menunjukkan adanya 9 missing value pada variabel Keadaan_Cuaca dan 314 missing value pada Kecepatan_Angin. Berdasarkan hasil tersebut, tahapan preprocessing yang perlu dilakukan meliputi pemeriksaan tipe dan kode variabel, penanganan missing value, pemeriksaan data duplikat, serta identifikasi nilai ekstrem (outlier). Selain itu, teknik encoding dapat diterapkan apabila terdapat variabel kategorik, sedangkan scaling dilakukan apabila diperlukan oleh algoritma machine learning yang digunakan. Penanganan data yang hilang dan pemeriksaan nilai maksimum Keadaan_Cuaca perlu dilakukan terlebih dahulu agar data yang digunakan untuk analisis selanjutnya lebih sesuai dan berkualitas.

4.2 Handling Missing Value

# Jumlah missing value setiap variabel
colSums(is.na(data_ch))
##           Hujan            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##               0               0               0               9             314
# Persentase missing value setiap variabel
colMeans(is.na(data_ch))
##           Hujan            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##      0.00000000      0.00000000      0.00000000      0.01211306      0.42261104
# Melihat baris yang memiliki missing value
data_ch %>% 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
#Interpolasi
df_imp <- data_ch

df_imp$Keadaan_Cuaca <- na.approx(
  df_imp$Keadaan_Cuaca,
  na.rm = FALSE
)

# Melihat jumlah missing setelah interpolasi
colSums(is.na(df_imp))
##           Hujan            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##               0               0               0               0             314
# Menghitung nilai mean Kecepatan_Angin
mean_angin <- mean(
  df_imp$Kecepatan_Angin,
  na.rm = TRUE
)

# Mengisi missing value dengan mean
df_imp$Kecepatan_Angin[
  is.na(df_imp$Kecepatan_Angin)
] <- mean_angin

# Mengecek kembali missing value
colSums(is.na(df_imp))
##           Hujan            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##               0               0               0               0               0

Intepretasi Hasil 4.2

Berdasarkan hasil pemeriksaan missing value sebelum dan sesudah preprocessing, awalnya terdapat 9 nilai hilang pada variabel Keadaan_Cuaca atau sekitar 1,21% dan 314 nilai hilang pada variabel Kecepatan_Angin atau sekitar 42,26%. Tiga variabel lainnya, yaitu Hujan, Suhu, dan Kelembapan, tidak memiliki nilai hilang. Setelah dilakukan penanganan missing value, variabel Keadaan_Cuaca berhasil memiliki 0 nilai hilang, sedangkan Kecepatan_Angin masih memiliki 314 nilai hilang. Pada pemeriksaan berikutnya, seluruh variabel menunjukkan 0 nilai hilang. Dengan demikian, preprocessing berhasil mengatasi seluruh missing value pada dataset.

4.3 Kadinalitas

# Melihat kategori unik Keadaan_Cuaca
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
# Membuat interval
bins <- c(
  0, 10, 20, 30, 40,
  50, 60, 70, 80, 90, 100
)

# Membuat label kategori
labels <- 0:9

# Mengurangi jumlah kategori
df_imp$Keadaan_Cuaca_reduced <- cut(
  df_imp$Keadaan_Cuaca,
  breaks = bins,
  labels = labels,
  right = TRUE,
  include.lowest = TRUE
)

# Melihat hasil
head(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  23           95             5            6.66 0                    
##  2     1  24           90             1            6.66 0                    
##  3     1  26.8         77             1            6.66 0                    
##  4     1  29.6         62             2            2    0                    
##  5     1  30.8         56             1            7    0                    
##  6     1  31           55             1            7    0                    
##  7     1  30.4         57             3            9    0                    
##  8     2  30.9         58             2           10    0                    
##  9     2  30.2         62             2            8    0                    
## 10     2  29.7         62             2            7    0
# Membandingkan jumlah kategori
cat(
  "Jumlah kategori Keadaan_Cuaca asli :",
  length(unique(df_imp$Keadaan_Cuaca)),
  "\n"
)
## Jumlah kategori Keadaan_Cuaca asli : 23
cat(
  "Jumlah kategori Keadaan_Cuaca setelah reduksi :",
  length(unique(df_imp$Keadaan_Cuaca_reduced)),
  "\n"
)
## Jumlah kategori Keadaan_Cuaca setelah reduksi : 7
# Melihat kategori hasil reduksi
unique(df_imp$Keadaan_Cuaca_reduced)
## [1] 0 1 5 6 2 9 4
## Levels: 0 1 2 3 4 5 6 7 8 9

Intepretasi Hasil 4.3

Berdasarkan hasil pemeriksaan menggunakan fungsi unique(), terdapat 23 nilai unik pada variabel Keadaan_Cuaca, seperti 1, 2, 5, 14, 60, 91, dan 97. Selanjutnya, fungsi cut() digunakan untuk membagi nilai tersebut ke dalam 10 interval, yaitu 0–10, 10–20, 20–30, dan seterusnya hingga 90–100, dengan label kategori 0 sampai 9. Sebagai contoh, nilai Keadaan_Cuaca sebesar 1, 2, dan 5 akan masuk ke kategori 0 karena berada pada interval 0–10, sedangkan nilai 14 akan masuk ke kategori 1 karena berada pada interval 10–20. Berdasarkan hasil reduksi, kategori yang muncul dalam data adalah 0, 1, 2, 4, 5, 6, dan 9. Artinya, dari 10 kelompok yang telah dibuat, hanya 7 kelompok yang memiliki data, sedangkan 3 kelompok lainnya tidak muncul. Dengan demikian, proses ini membuat nilai Keadaan_Cuaca lebih terkelompok berdasarkan rentang angkanya sehingga dapat mempermudah pengolahan data selanjutnya. Namun, pembagian interval ini perlu disesuaikan dengan arti nilai asli Keadaan_Cuaca agar pengelompokan yang dilakukan tetap sesuai dengan informasi kondisi cuaca yang sebenarnya.

4.4 Splitting Data

set.seed(200)

split_shuffle <- initial_split(
  df_imp,
  prop = 0.8
)

# Data training
train_data <- training(split_shuffle)

# Data testing
test_data <- testing(split_shuffle)

# Memisahkan variabel prediktor dan target
X_train <- train_data %>% select(-Hujan)
X_test  <- test_data %>% select(-Hujan)

y_train <- train_data$Hujan
y_test  <- test_data$Hujan

# Melihat ukuran data
dim(X_train)
## [1] 594   5
dim(X_test)
## [1] 149   5

Intepretasi Hasil 4.4

Berdasarkan hasil pemisahan variabel prediktor dan target, variabel Hujan ditetapkan sebagai variabel target (Y) yang akan diprediksi, sedangkan variabel lainnya digunakan sebagai variabel prediktor (X). Proses ini menghasilkan X_train sebanyak 594 baris dan 5 kolom sebagai data latih, serta X_test sebanyak 149 baris dan 5 kolom sebagai data uji. Sementara itu, y_train menyimpan nilai target Hujan dari data latih dan y_test menyimpan nilai target Hujan dari data uji. Dengan demikian, data telah dipisahkan menjadi sekitar 80% data latih dan 20% data uji. Data latih digunakan untuk membangun model machine learning, sedangkan data uji digunakan untuk mengukur kemampuan model dalam memprediksi data yang belum pernah digunakan selama proses pelatihan.

4.5 Handling Outlier

# Variabel numerik
list_num <- c(
  "Suhu",
  "Kelembapan",
  "Kecepatan_Angin"
)

# Menyiapkan wadah hasil
list_outlier <- c()
list_lower_bound <- c()
list_upper_bound <- c()

# Menghitung batas outlier dengan IQR
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
  
  num_outliers_lower <- sum(
    X_train[[i]] < lower_bound,
    na.rm = TRUE
  )
  
  num_outliers_upper <- sum(
    X_train[[i]] > upper_bound,
    na.rm = TRUE
  )
  
  total_outliers <-
    num_outliers_lower + num_outliers_upper
  
  list_outlier <- c(
    list_outlier,
    total_outliers
  )
  
  list_lower_bound <- c(
    list_lower_bound,
    lower_bound
  )
  
  list_upper_bound <- c(
    list_upper_bound,
    upper_bound
  )
}

# Membuat tabel hasil
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

Intepretasi Hasil 4.5

Berdasarkan hasil deteksi outlier menggunakan metode Interquartile Range (IQR), variabel Suhu tidak memiliki outlier karena seluruh data berada dalam batas bawah 17,4 dan batas atas 35,8. Variabel Kelembapan juga tidak memiliki outlier, dengan batas bawah 46,5 dan batas atas 122,5. Sementara itu, variabel Kecepatan_Angin memiliki 50 outlier, dengan batas bawah 2 dan batas atas 10. Artinya, terdapat 50 data kecepatan angin yang nilainya berada di luar rentang tersebut. Oleh karena itu, variabel Kecepatan_Angin perlu diperiksa lebih lanjut untuk memastikan apakah nilai-nilai tersebut merupakan kesalahan pencatatan atau memang kondisi yang terjadi pada data. Nilai yang terdeteksi sebagai outlier tidak harus langsung dihapus karena dapat saja merupakan nilai yang valid.

4.6 Capping

X_train_capped <- X_train
X_test_capped <- X_test

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
  
  # Capping data training
  X_train_capped[[i]] <- pmin(
    pmax(
      X_train[[i]],
      lower_bound
    ),
    upper_bound
  )
  
  # Capping data testing menggunakan
  # batas dari data training
  X_test_capped[[i]] <- pmin(
    pmax(
      X_test[[i]],
      lower_bound
    ),
    upper_bound
  )
}
diagnostic_plots <- function(df, variable) {
  
  p1 <- ggplot(
    df,
    aes(x = .data[[variable]])
  ) +
    geom_histogram(
      bins = 30,
      fill = "navy",
      color = "black"
    ) +
    ggtitle("Histogram") +
    theme_minimal()
  
  p2 <- ggplot(
    df,
    aes(y = .data[[variable]])
  ) +
    geom_boxplot(
      fill = "navy"
    ) +
    ggtitle("Boxplot") +
    theme_minimal()
  
  grid.arrange(
    p1,
    p2,
    ncol = 2
  )
}

for (col in list_num) {
  
  cat(
    col,
    "- Sebelum Capping\n"
  )
  
  diagnostic_plots(
    X_train,
    col
  )
  
  cat(
    "\n",
    col,
    "- Setelah Capping\n"
  )
  
  diagnostic_plots(
    X_train_capped,
    col
  )
}
## Suhu - Sebelum Capping

## 
##  Suhu - Setelah Capping

## Kelembapan - Sebelum Capping

## 
##  Kelembapan - Setelah Capping

## Kecepatan_Angin - Sebelum Capping

## 
##  Kecepatan_Angin - Setelah Capping

# Intepretasi Hasil 4.5 Hasil visualisasi histogram dan boxplot menunjukkan bahwa variabel Suhu berada pada kisaran 22,5–31,5 dan tidak memperlihatkan adanya titik pencilan pada boxplot. Hal serupa juga terlihat pada variabel Kelembapan yang memiliki rentang nilai sekitar 52–100 tanpa titik yang berada di luar whisker. Berbeda dengan kedua variabel tersebut, Kecepatan_Angin memiliki rentang nilai sekitar 2–21, dengan sebagian besar pengamatan terkonsentrasi pada nilai yang lebih rendah. Boxplot variabel ini memperlihatkan beberapa titik di atas whisker, yaitu pada kisaran 11–21, yang menunjukkan adanya nilai pencilan (outlier). Oleh karena itu, pencilan terutama ditemukan pada variabel Kecepatan_Angin, sedangkan Suhu dan Kelembapan tidak menunjukkan indikasi pencilan secara visual. Penanganan selanjutnya dapat dilakukan menggunakan metode capping untuk membatasi nilai ekstrem agar berada dalam rentang yang telah ditentukan.

4.6 scalling data dengan robust scaler

# Robust Scaling menggunakan median dan IQR
median_val <- sapply(
  X_train_capped[list_num],
  median,
  na.rm = TRUE
)

iqr_val <- sapply(
  X_train_capped[list_num],
  IQR,
  na.rm = TRUE
)

# Scaling data training
for (col in list_num) {
  
  X_train_capped[[col]] <-
    (
      X_train_capped[[col]] -
        median_val[col]
    ) /
    iqr_val[col]
}

# Scaling data testing menggunakan
# median dan IQR dari data training
for (col in list_num) {
  
  X_test_capped[[col]] <-
    (
      X_test_capped[[col]] -
        median_val[col]
    ) /
    iqr_val[col]
}

# Melihat hasil scaling
head(X_train_capped)
## # A tibble: 6 × 5
##      Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin Keadaan_Cuaca_reduced
##     <dbl>      <dbl>         <dbl>           <dbl> <fct>                
## 1 -0.500       0.579            61           0     6                    
## 2  1.09       -0.947             2           1.67  0                    
## 3  0.0870     -0.263             3          -0.828 0                    
## 4  1.15       -1.53              2           1.17  0                    
## 5  0.674      -0.421             2           0     0                    
## 6  0.391      -0.368             2          -1.83  0

Intepretasi Hasil 4.6

Hasil penerapan Robust Scaling menunjukkan bahwa variabel numerik, yaitu Suhu, Kelembapan, dan Kecepatan_Angin, telah diubah ke skala baru dengan menggunakan median dan IQR sebagai dasar perhitungannya. Pada enam pengamatan pertama, nilai Suhu berkisar antara -0,50 hingga 1,15, Kelembapan berada pada rentang -0,95 hingga 0,58, sedangkan Kecepatan_Angin memiliki nilai antara -1,83 hingga 1,67. Nilai positif menandakan bahwa pengamatan berada di atas median, sementara nilai negatif menunjukkan posisi di bawah median. Adapun variabel Keadaan_Cuaca masih menggunakan nilai kategori karena proses encoding belum dilakukan. Secara keseluruhan, proses Robust Scaling berhasil menyetarakan skala variabel numerik dengan tetap menunjukkan posisi setiap pengamatan relatif terhadap median data.

4.7 encoding

list_cat <- c(
  "Keadaan_Cuaca_reduced"
)

resep_encode <- recipe(
  ~ Keadaan_Cuaca_reduced,
  data = X_train_capped
) %>%
  step_dummy(
    all_of(list_cat),
    one_hot = TRUE
  ) %>%
  prep(
    training = X_train_capped
  )

X_train_encoded <- bake(
  resep_encode,
  new_data = X_train_capped
)

X_test_encoded <- bake(
  resep_encode,
  new_data = X_test_capped
)

# Melihat hasil encoding
head(X_train_encoded)
## # A tibble: 6 × 10
##   Keadaan_Cuaca_reduced_X0 Keadaan_Cuaca_reduced_X1 Keadaan_Cuaca_reduced_X2
##                      <dbl>                    <dbl>                    <dbl>
## 1                        0                        0                        0
## 2                        1                        0                        0
## 3                        1                        0                        0
## 4                        1                        0                        0
## 5                        1                        0                        0
## 6                        1                        0                        0
## # ℹ 7 more variables: 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>
head(X_test_encoded)
## # A tibble: 6 × 10
##   Keadaan_Cuaca_reduced_X0 Keadaan_Cuaca_reduced_X1 Keadaan_Cuaca_reduced_X2
##                      <dbl>                    <dbl>                    <dbl>
## 1                        1                        0                        0
## 2                        1                        0                        0
## 3                        1                        0                        0
## 4                        1                        0                        0
## 5                        1                        0                        0
## 6                        1                        0                        0
## # ℹ 7 more variables: 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>

Intepretasi Hasil 4.7

Hasil encoding menunjukkan bahwa variabel Keadaan_Cuaca_reduced yang semula berupa data kategorik telah dikonversi menjadi sejumlah variabel dummy dengan nilai 0 dan 1. Proses ini menghasilkan 10 kolom yang mewakili kategori cuaca dari 0 hingga 9. Pada enam baris data pertama, angka 1 menandakan kategori yang sesuai dengan pengamatan tersebut, sedangkan angka 0 menunjukkan kategori yang tidak sesuai. Dengan demikian, data kategorik telah diubah menjadi bentuk numerik sehingga dapat digunakan sebagai variabel masukan dalam pemodelan machine learning.

4.8 Balancing data dengan SMOTE

# Melihat distribusi target sebelum SMOTE
table(y_train)
## y_train
##   1   2 
## 128 466
# Menggabungkan X dan y
train_full <- X_train_encoded %>%
  mutate(
    Hujan = factor(y_train)
  )

# SMOTE
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
)

# Memisahkan kembali X dan y
X_train_balanced <- train_balanced %>%
  select(-Hujan)

y_train_balanced <-
  train_balanced$Hujan

# Melihat distribusi setelah SMOTE
table(y_train_balanced)
## y_train_balanced
##   1   2 
## 466 466

Intepretasi Hasil 4.8

Berdasarkan syntax dan hasil yang diperoleh, proses encoding dilakukan menggunakan recipe() dan step_dummy() untuk mengubah variabel kategorik Keadaan_Cuaca_reduced menjadi variabel dummy berbentuk numerik, sehingga dapat digunakan dalam pemodelan machine learning. Selanjutnya, distribusi variabel target Hujan diperiksa sebelum penerapan SMOTE dan menunjukkan bahwa kategori 1 berjumlah 128 data, sedangkan kategori 2 berjumlah 466 data. Perbedaan jumlah tersebut menunjukkan bahwa distribusi kelas target tidak seimbang. Oleh karena itu, metode Synthetic Minority Over-sampling Technique (SMOTE) diterapkan menggunakan step_smote() untuk menambah sampel pada kelas minoritas melalui pembentukan sampel sintetis. Setelah proses SMOTE, jumlah data pada kategori 1 meningkat menjadi 466, sehingga kedua kategori memiliki jumlah yang sama, yaitu masing-masing 466 data. Dengan demikian, penerapan SMOTE berhasil menyeimbangkan distribusi kelas pada data latih, sehingga model memiliki kesempatan yang lebih seimbang untuk mempelajari kedua kategori Hujan.

BAB V KESIMPULAN

5.1 Kesimpulan

Konsep dari berbagai jenis feature engineering pada RStudio adalah melakukan pengolahan atau perubahan terhadap fitur pada dataset agar data menjadi lebih sesuai untuk digunakan dalam analisis dan pemodelan machine learning. Beberapa teknik yang dapat digunakan meliputi feature transformation untuk mengubah skala atau bentuk data, encoding untuk mengubah variabel kategorik menjadi bentuk numerik, feature selection untuk memilih fitur yang relevan, serta feature extraction untuk memperoleh fitur baru dari fitur yang tersedia. Penerapan teknik tersebut disesuaikan dengan karakteristik data dan tujuan pemodelan sehingga fitur yang digunakan dapat memberikan informasi yang lebih optimal. Teknik feature engineering pada program RStudio dapat dilakukan dengan memanfaatkan berbagai fungsi dan package yang tersedia dalam R. Tahapannya dimulai dari membaca dan memeriksa dataset, mengidentifikasi karakteristik setiap fitur, kemudian melakukan teknik pengolahan yang diperlukan seperti mengubah tipe data, melakukan encoding pada variabel kategorik, melakukan normalisasi atau standardisasi pada data numerik, serta memilih fitur yang relevan. Setelah proses tersebut dilakukan, hasil feature engineering dapat diperiksa kembali untuk memastikan data telah sesuai dan siap digunakan pada tahap pemodelan machine learning. Berdasarkan batasan masalah diperoleh bahwa dataset curah hujan terdiri dari 743 pengamatan dan 5 variabel, dengan permasalahan utama berupa missing value dan outlier pada beberapa variabel. Penanganan missing value dilakukan menggunakan interpolasi linear pada variabel Keadaan_Cuaca dan imputasi mean pada Kecepatan_Angin, sedangkan reduksi kategori dilakukan dengan membagi nilai Keadaan_Cuaca menjadi 10 interval. Data kemudian dibagi menjadi 80% data latih dan 20% data uji. Hasil deteksi outlier menggunakan metode IQR menunjukkan bahwa terdapat 50 pencilan pada variabel Kecepatan_Angin, sehingga dilakukan penanganan menggunakan metode capping. Selanjutnya, Robust Scaling diterapkan untuk menyetarakan skala variabel numerik, sedangkan encoding digunakan untuk mengubah data kategorik menjadi variabel dummy. Terakhir, penerapan SMOTE berhasil menyeimbangkan distribusi kelas target Hujan pada data latih, dari sebelumnya 128 data pada kategori 1 dan 466 data pada kategori 2 menjadi masing-masing 466 data. Dengan demikian, tahapan feature engineering telah dilakukan untuk mempersiapkan data sebelum digunakan dalam pemodelan machine learning.

DAFTAR PUSTAKA

Arian, S. A., Alifia, P. R., Prihantoro, B., Disriansyah, M. I., Tania, K. D., Meiriza, A., & Rifai, A. (2026).       Perbandingan model klasifikasi supervised machine learning dalam knowledge discovery layanan TI Pertamina Prabumulih.      Indonesian Journal of Machine Learning and Computer Science, 6(2), 705–715.
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), 236-249.
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.
Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Bengkulu: Universitas Bengkulu.
Herdian, C., Kamila, A., & Budidarma, I. G. A. M. (2024). Studi Kasus Feature Engineering untuk Data Teks: Perbandingan Label Encoding dan One-Hot Encoding pada Metode Linear Regresi. Jurnal Ilmiah, 15(1), 93-108.
Rizaldi, M. R., Srihanto, A. E. A., Afidah, I. N. A., Selviani, A., Sabilla, A. D., & Mahendra, D. (2026). Penerapan machine learning berbasis supervised learning menggunakan metode Naive Bayes untuk klasifikasi prestasi siswa. Journal of Information System and Computer, 6(1).