BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Feature engineering merupakan salah satu tahapan penting dalam pengolahan data yang bertujuan untuk menghasilkan fitur atau variabel yang lebih informatif sebelum digunakan dalam pemodelan machine learning. Tahapan ini mencakup berbagai teknik, seperti transformasi fitur, pembentukan fitur baru, ekstraksi fitur, dan seleksi fitur untuk meningkatkan kualitas informasi dalam data. Penerapan feature engineering yang tepat dapat membantu model mengenali pola data dengan lebih baik (Faiz et al., 2022).

Dalam penerapannya, feature engineering perlu disesuaikan dengan karakteristik data dan tujuan analisis agar fitur yang dihasilkan dapat memberikan informasi yang relevan. Proses ini dapat dilakukan melalui beberapa teknik, seperti menangani nilai yang hilang, mengubah bentuk variabel, mengodekan data kategorik, serta memilih fitur yang paling sesuai untuk pemodelan. Pemilihan teknik yang tepat menjadi salah satu aspek penting dalam mendukung proses analisis dan meningkatkan kualitas hasil pemodelan (Rifa’i et al., 2024).

Salah satu perangkat lunak yang dapat digunakan untuk menerapkan berbagai teknik feature engineering adalah RStudio, yang menyediakan lingkungan pemrograman untuk mengolah, memanipulasi, dan menganalisis data menggunakan bahasa R. Melalui RStudio, proses feature engineering dapat dilakukan secara sistematis dengan memanfaatkan berbagai fungsi dan paket yang mendukung pengolahan data. Oleh karena itu, pemahaman mengenai konsep berbagai jenis feature engineering dan penerapan tekniknya melalui program RStudio diperlukan untuk mendukung pengolahan data sebelum dilakukan pemodelan machine learning (Darmawan et al., 2026).

1.2 Rumusan Masalah

Berdasarkan latar belakang di atas, masalah yang dapat disimpulkan adalah:

  1. Bagaimana memahami konsep dari berbagai jenis feature engineering pada RStudio?

  2. Bagaimana melakukan teknik feature engineering di program RStudio?

1.3 Tujuan

Berdasarkan rumusan masalah pada penelitian ini, tujuan yang dapat disimpulkan adalah:

  1. Mahasiswa dapat 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 Feature Engineering

Feature engineering adalah proses menggunakan pengetahuan domain untuk mengekstrak, membentuk, atau mengubah fitur baru dari data mentah menjadi informasi yang lebih relevan dan informatif. Proses ini bertujuan untuk meningkatkan kualitas fitur input karena performa model machine learning sangat bergantung pada informasi yang digunakan dalam pemodelan (Darmawan et al., 2026). 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 atau tidak ada nilai yang tersimpan untuk observasi tertentu dalam suatu variabel. Missing values 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.

  1. Kardinalitas

Kardinalitas merujuk pada jumlah nilai unik, atau label, yang terdapat dalam suatu variabel kategoris. Konsep ini digunakan untuk mengukur keunikan data dalam sebuah fitur. Kardinalitas dapat diklasifikasikan dalam spektrum, namun umumnya dibedakan menjadi kardinalitas rendah (low cardinality) dan kardinalitas tinggi (high cardinality).

  1. Splitting Data

Splitting data merupakan strategi fundamental dalam machine learning untuk membagi himpunan data menjadi bagian terpisah yaitu data training dan data testing. Pembagian ini krusial untuk membangun model yang robust dan dapat digeneralisasi dengan baik pada data baru. Proporsi pembagian data bersifat subjektif dan fleksibel.

  1. Handling Outlier

Outlier merupakan observasi atau titik data yang menunjukkan deviasi ekstrem dan berbeda secara signifikan dari sebagian besar data lain dalam suatu dataset. 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.

  1. 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 yang mendominasi proses pembelajaran hanya karena memiliki rentang nilai yang lebih besar dibandingkan variabel independen lainnya. Normalisasi data sering kali dapat meningkatkan performa model prediktif secara signifikan, terutama untuk algoritma yang sensitif terhadap skala input.

  1. Encoding

Feature encoding adalah proses mengubah fitur kategoris atau non numerik 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 One Hot Encoding dan Ordinal Encoding.

  1. 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 Sumber Data

Jenis data pada penelitian ini adalah data kuantitatif dan data kualitatif. Data kuantitatif merupakan data atau informasi yang didapatkan dalam bentuk angka atau numerik. Data kuantitatif dapat diproses menggunakan rumus matematika atau dapat juga dianalisis dengan sistem statistik. Data kualitatif adalah suatu data yang tidak bisa diukur dengan angka. Data kualitatif adalah data yang dinyatakan dalam bentuk deskriptif atau naratif, bukan dalam bentuk angka.

Sumber data yang digunakan oleh penulis merupakan data sekunder. Data sekunder adalah sumber data yang diperoleh secara tidak langsung atau melalui media perantara. Data yang digunakan pada batasan masalah laporan ini merupakan data yang diperoleh dari Asisten Praktikum.

3.2 Variabel Penelitian

Variabel penelitian adalah karakter atau segala sesuatu yang menjadi perhatian dalam suatu penelitian. Pada penelitian ini terdapat 5 variabel yang digunakan. Variabel-variabel tersebut meliputi hujan, suhu, kelembapan, keadaan cuaca, dan kecepatan angin.

3.3 Langkah-langkah Analisis

Algoritma yang digunakan pada penelitian untuk melakukan feature engineering dengan R adalah sebagai berikut:

  1. Input data.

  2. Pengecekan dan penanganan missing value menggunakan metode imputation dan interpolasi.

  3. Pembagian data latih dan data uji menggunakan metode stratified splitting.

  4. Pengecekan dan penanganan outlier menggunakan metode capping.

  5. Penerapan scaling menggunakan metode Standard Scaler.

  6. Penanganan ketidakseimbangan data menggunakan metode Synthetic Minority Over-sampling Technique (SMOTE).

  7. Pemeriksaan hasil akhir preprocessing.

  8. Output dan interpretasi.

BAB IV HASIL DAN PEMBAHASAN

4.1 Library dan Import Data

Langkah pertama yang dilakukan adalah memanggil library dan mengimport data yang akan digunakan untuk melakukan feature engineering.

# ============================================================
# 1. MEMANGGIL LIBRARY
# ============================================================

library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(rsample)
library(DescTools)
library(recipes)
## 
## Attaching package: 'recipes'
## The following object is masked from 'package:stats':
## 
##     step
library(themis)
library(ggplot2)
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
# ============================================================
# 2. IMPORT DATA
# ============================================================

data <- read_excel("D:/SEMESTER 7/Machine Learning/data curah hujan.xlsx")

# Melihat struktur dan ringkasan data
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 ...
dim(data)
## [1] 743   5
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  
##                                                   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

Berdasarkan hasil summary, dataset curah hujan terdiri atas 743 pengamatan dan 5 variabel, yaitu hujan, suhu, kelembapan, keadaan cuaca, dan kecepatan angin. Variabel Hujan memiliki nilai minimum 1 dan maksimum 2, dengan rata-rata 1,779 yang menunjukkan bahwa kategori 2 lebih banyak ditemukan dibandingkan kategori 1. Variabel suhu memiliki nilai antara 22,60 hingga 32,00 dengan rata-rata 26,54, sedangkan kelembapan berkisar antara 52 hingga 100 dengan rata-rata 83,88. Variabel keadaan cuaca memiliki nilai minimum 1, maksimum 97, dan rata-rata 15,11, dengan median 2, yang menunjukkan adanya perbedaan nilai cukup besar pada data tersebut. Kecepatan angin memiliki nilai antara 2 hingga 21 dengan rata-rata 6,655. Pemeriksaan missing value menunjukkan terdapat 9 nilai kosong pada variabel keadaan cuaca dan 314 nilai kosong pada kecepatan angin, sedangkan variabel lainnya tidak menunjukkan nilai kosong pada ringkasan tersebut. Oleh karena itu, diperlukan penanganan missing value sebelum data digunakan pada tahap analisis selanjutnya.

4.2 Handling Missing Value (Interpolasi)

# Memeriksa missing value
colSums(is.na(data))
##           Hujan            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##               0               0               0               9             314
colMeans(is.na(data)) * 100
##           Hujan            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##        0.000000        0.000000        0.000000        1.211306       42.261104
# Memeriksa distribusi variabel target
table(data$Hujan)
## 
##   1   2 
## 164 579
prop.table(table(data$Hujan)) * 100
## 
##        1        2 
## 22.07268 77.92732
# ============================================================
# 3. INTERPOLASI PADA KEADAAN_CUACA
# ============================================================

data$Keadaan_Cuaca <- na.approx(
  data$Keadaan_Cuaca,
  na.rm = FALSE,
  rule = 2
)

# Memeriksa hasil interpolasi
sum(is.na(data$Keadaan_Cuaca)) 
## [1] 0

Berdasarkan hasil pemeriksaan, terdapat 9 missing value (1,21%) pada variabel keadaan cuaca dan 314 missing value (42,26%) pada variabel kecepatan angin, sedangkan variabel lainnya tidak memiliki missing value. Distribusi variabel target hujan menunjukkan bahwa kategori 1 berjumlah 164 data (22,07%), sedangkan kategori 2 berjumlah 579 data (77,93%), sehingga distribusi kelas tidak seimbang. Selanjutnya, dilakukan penanganan missing value pada keadaan cuaca menggunakan interpolasi linear. Hasil pemeriksaan setelah interpolasi menunjukkan nilai kosong berjumlah 0, yang berarti seluruh missing value pada variabel tersebut telah berhasil ditangani.

4.3 Splitting Data

# ============================================================
# 4. STRATIFIED SPLITTING (80% TRAIN, 20% TEST)
# ============================================================

set.seed(200)

data$Hujan <- factor(data$Hujan)

split_stratify <- initial_split(
  data,
  prop = 0.80,
  strata = Hujan
)

train_data <- training(split_stratify)
test_data  <- testing(split_stratify)

# Memisahkan 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

# Memeriksa ukuran data
dim(X_train)
## [1] 594   4
dim(X_test)
## [1] 149   4
# Membandingkan proporsi kelas target
prop.table(table(y_train)) * 100
## y_train
##        1        2 
## 22.05387 77.94613
prop.table(table(y_test)) * 100
## y_test
##        1        2 
## 22.14765 77.85235

Berdasarkan hasil stratified splitting, dataset sebanyak 743 pengamatan dibagi menjadi 594 data latih (80%) dan 149 data uji (20%), dengan empat variabel prediktor pada masing-masing dataset. Proporsi kategori Hujan pada data latih adalah 22,05% untuk kategori 1 dan 77,95% untuk kategori 2, sedangkan pada data uji sebesar 22,15% untuk kategori 1 dan 77,85% untuk kategori 2. Proporsi kedua kategori pada data latih dan data uji yang relatif sama menunjukkan bahwa metode stratified splitting berhasil mempertahankan distribusi kelas variabel target pada kedua kelompok data.

4.4 Handling Missing Value (Imputasi Modus)

# ============================================================
# 5. MODE IMPUTATION PADA KECEPATAN_ANGIN
# ============================================================

# Membuat fungsi untuk mencari modus
get_mode <- function(x) {
  x <- x[!is.na(x)]
  
  if (length(x) == 0) {
    stop("Tidak ada nilai tersedia untuk menghitung modus.")
  }
  
  nilai_unik <- unique(x)
  nilai_unik[which.max(
    tabulate(match(x, nilai_unik))
  )]
}

# Menghitung modus hanya dari data latih
mode_angin <- get_mode(X_train$Kecepatan_Angin)

# Mengisi missing value pada data latih
X_train$Kecepatan_Angin[
  is.na(X_train$Kecepatan_Angin)
] <- mode_angin

# Mengisi missing value pada data uji
X_test$Kecepatan_Angin[
  is.na(X_test$Kecepatan_Angin)
] <- mode_angin

# Memeriksa missing value setelah imputasi
colSums(is.na(X_train))
##            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##               0               0               0               0
colSums(is.na(X_test))
##            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##               0               0               0               0

Berdasarkan hasil penanganan missing value, nilai kosong pada variabel kecepatan angin di data latih dan data uji diisi menggunakan metode imputasi modus, yaitu mengganti nilai kosong dengan nilai yang paling sering muncul pada data latih. Penggunaan modus dari data latih pada kedua dataset bertujuan untuk menghindari kebocoran informasi dari data uji. Hasil pemeriksaan menunjukkan bahwa seluruh variabel prediktor pada data latih dan data uji memiliki 0 missing value, sehingga proses imputasi berhasil menangani seluruh nilai kosong yang tersisa.

4.5 Handling Outlier

# ============================================================
# 6. CAPPING PADA SELURUH VARIABEL NUMERIK PREDIKTOR
#    METODE IQR
# ============================================================

list_num <- c(
  "Suhu",
  "Kelembapan",
  "Keadaan_Cuaca",
  "Kecepatan_Angin"
)

# Menghitung batas bawah dan batas atas dari data latih
batas_capping <- data.frame(
  Variabel = list_num,
  Q1 = sapply(X_train[list_num], quantile,
              probs = 0.25, na.rm = TRUE),
  Q3 = sapply(X_train[list_num], quantile,
              probs = 0.75, na.rm = TRUE)
)

batas_capping$IQR <- batas_capping$Q3 -
  batas_capping$Q1

batas_capping$Lower_Bound <- batas_capping$Q1 -
  1.5 * batas_capping$IQR

batas_capping$Upper_Bound <- batas_capping$Q3 +
  1.5 * batas_capping$IQR

# Menampilkan batas capping setiap variabel
print(batas_capping)
##                            Variabel     Q1    Q3    IQR Lower_Bound Upper_Bound
## Suhu.25%                       Suhu 24.325 28.90  4.575     17.4625     35.7625
## Kelembapan.25%           Kelembapan 75.000 94.00 19.000     46.5000    122.5000
## Keadaan_Cuaca.25%     Keadaan_Cuaca  2.000 14.75 12.750    -17.1250     33.8750
## Kecepatan_Angin.25% Kecepatan_Angin  5.000  7.00  2.000      2.0000     10.0000
# Fungsi capping
fungsi_capping <- function(data, batas) {
  for (i in seq_len(nrow(batas))) {
    kolom <- batas$Variabel[i]
    bawah <- batas$Lower_Bound[i]
    atas  <- batas$Upper_Bound[i]
    
    data[[kolom]] <- pmin(
      pmax(data[[kolom]], bawah),
      atas
    )
  }
  
  return(data)
}

# Menerapkan capping pada data latih dan data uji
X_train_capped <- fungsi_capping(
  X_train, batas_capping
)

X_test_capped <- fungsi_capping(
  X_test, batas_capping
)

# Memeriksa ringkasan setelah capping
summary(X_train_capped[list_num])
##       Suhu         Kelembapan     Keadaan_Cuaca    Kecepatan_Angin 
##  Min.   :22.60   Min.   : 52.00   Min.   : 1.000   Min.   : 2.000  
##  1st Qu.:24.32   1st Qu.: 75.00   1st Qu.: 2.000   1st Qu.: 5.000  
##  Median :26.00   Median : 86.00   Median : 2.000   Median : 5.000  
##  Mean   :26.56   Mean   : 83.76   Mean   : 9.409   Mean   : 5.759  
##  3rd Qu.:28.90   3rd Qu.: 94.00   3rd Qu.:14.750   3rd Qu.: 7.000  
##  Max.   :32.00   Max.   :100.00   Max.   :33.875   Max.   :10.000
summary(X_test_capped[list_num])
##       Suhu         Kelembapan     Keadaan_Cuaca   Kecepatan_Angin 
##  Min.   :22.60   Min.   : 55.00   Min.   : 1.00   Min.   : 2.000  
##  1st Qu.:24.30   1st Qu.: 75.00   1st Qu.: 2.00   1st Qu.: 5.000  
##  Median :26.00   Median : 87.00   Median : 2.00   Median : 5.000  
##  Mean   :26.47   Mean   : 84.38   Mean   :10.07   Mean   : 5.792  
##  3rd Qu.:28.50   3rd Qu.: 94.00   3rd Qu.:17.00   3rd Qu.: 7.000  
##  Max.   :31.60   Max.   :100.00   Max.   :33.88   Max.   :10.000

Berdasarkan hasil penerapan capping menggunakan metode Interquartile Range (IQR). Hasilnya menunjukkan bahwa variabel suhu dan kelembapan tidak mengalami perubahan nilai ekstrem karena seluruh pengamatannya masih berada dalam batas capping, sedangkan kecepatan angin dibatasi hingga nilai maksimum 10. Pada variabel keadaan cuaca, nilai maksimum dibatasi dari 97 menjadi sekitar 33,875 pada data latih dan 33,88 pada data uji. Dengan demikian, capping berhasil membatasi nilai ekstrem pada variabel yang melewati batas IQR, tanpa menghapus baris pengamatan.

4.6 Scalling Data

# ============================================================
# 7. STANDARD SCALER
# ============================================================

# Menghitung mean dan standar deviasi dari data latih
mean_train <- sapply(
  X_train_capped[list_num],
  mean,
  na.rm = TRUE
)

sd_train <- sapply(
  X_train_capped[list_num],
  sd,
  na.rm = TRUE
)

# Menghindari pembagian dengan nol
if (any(sd_train == 0 | is.na(sd_train))) {
  stop("Ada variabel dengan standar deviasi nol atau NA.")
}

# Standardisasi data latih
X_train_scale <- X_train_capped

for (kolom in list_num) {
  X_train_scale[[kolom]] <-
    (X_train_capped[[kolom]] - mean_train[kolom]) /
    sd_train[kolom]
}

# Standardisasi data uji menggunakan parameter data latih
X_test_scale <- X_test_capped

for (kolom in list_num) {
  X_test_scale[[kolom]] <-
    (X_test_capped[[kolom]] - mean_train[kolom]) /
    sd_train[kolom]
}

# Memeriksa hasil standardisasi
summary(X_train_scale[list_num])
##       Suhu           Kelembapan      Keadaan_Cuaca     Kecepatan_Angin  
##  Min.   :-1.5477   Min.   :-2.7493   Min.   :-0.6855   Min.   :-1.7146  
##  1st Qu.:-0.8732   1st Qu.:-0.7582   1st Qu.:-0.6040   1st Qu.:-0.3463  
##  Median :-0.2182   Median : 0.1941   Median :-0.6040   Median :-0.3463  
##  Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000  
##  3rd Qu.: 0.9159   3rd Qu.: 0.8867   3rd Qu.: 0.4355   3rd Qu.: 0.5659  
##  Max.   : 2.1281   Max.   : 1.4062   Max.   : 1.9946   Max.   : 1.9342
summary(X_test_scale[list_num])
##       Suhu            Kelembapan       Keadaan_Cuaca      Kecepatan_Angin   
##  Min.   :-1.54772   Min.   :-2.48962   Min.   :-0.68551   Min.   :-1.71460  
##  1st Qu.:-0.88295   1st Qu.:-0.75817   1st Qu.:-0.60399   1st Qu.:-0.34630  
##  Median :-0.21817   Median : 0.28071   Median :-0.60399   Median :-0.34630  
##  Mean   :-0.03314   Mean   : 0.05352   Mean   : 0.05368   Mean   : 0.01491  
##  3rd Qu.: 0.75944   3rd Qu.: 0.88671   3rd Qu.: 0.61888   3rd Qu.: 0.56590  
##  Max.   : 1.97169   Max.   : 1.40615   Max.   : 1.99461   Max.   : 1.93421

Berdasarkan hasil penerapan Standard Scaler, seluruh variabel numerik prediktor, yaitu suhu, kelembapan, keadaan cuaca, dan kecepatan angin, telah distandarisasi menggunakan rata-rata dan standar deviasi dari data latih. Hasil standardisasi pada data latih menunjukkan bahwa rata-rata setiap variabel menjadi mendekati 0, sedangkan nilainya dinyatakan dalam satuan simpangan baku. Pada data uji, rata-rata tidak harus bernilai 0 karena proses standardisasi menggunakan parameter dari data latih. Dengan demikian, Standard Scaler berhasil menyamakan skala variabel tanpa menghitung ulang parameter berdasarkan data uji, sehingga dapat mencegah kebocoran informasi dalam proses preprocessing.

4.7 Imbalance Data

# ============================================================
# 8. SMOTE UNTUK MENANGANI IMBALANCE DATA
#    HANYA PADA DATA LATIH
# ============================================================

# Menggabungkan prediktor dan target data latih
train_full <- X_train_scale %>%
  mutate(Hujan = y_train)

train_full$Hujan <- factor(train_full$Hujan)

# Memeriksa distribusi kelas sebelum SMOTE
cat("Distribusi kelas sebelum SMOTE:\n")
## Distribusi kelas sebelum SMOTE:
print(table(train_full$Hujan))
## 
##   1   2 
## 131 463
set.seed(42)

# Membuat recipe SMOTE
resep_smote <- recipe(Hujan ~ ., data = train_full) %>%
  step_smote(
    Hujan,
    over_ratio = 1,
    neighbors = 5
  )

# Menyesuaikan recipe pada data latih
resep_smote_prep <- prep(
  resep_smote,
  training = train_full
)

# Menghasilkan data latih yang sudah seimbang
train_balanced <- bake(
  resep_smote_prep,
  new_data = NULL
)

# Memeriksa distribusi kelas setelah SMOTE
cat("Distribusi kelas setelah SMOTE:\n")
## Distribusi kelas setelah SMOTE:
print(table(train_balanced$Hujan))
## 
##   1   2 
## 463 463
# Memisahkan kembali prediktor dan target
X_train_final <- train_balanced %>%
  select(-Hujan)

y_train_final <- train_balanced$Hujan

# Data uji tidak dikenai SMOTE
X_test_final <- X_test_scale
y_test_final <- y_test

Berdasarkan hasil penerapan Synthetic Minority Over-sampling Technique (SMOTE), distribusi kelas pada data latih sebelum SMOTE menunjukkan bahwa kategori hujan = 1 sebanyak 131 data, sedangkan kategori hujan = 2 sebanyak 463 data, sehingga terdapat ketidakseimbangan kelas. Setelah SMOTE diterapkan dengan over ratio = 1 dan neighbors = 5, jumlah data pada kategori 1 meningkat menjadi 463 melalui pembentukan data sintetis, sehingga kedua kategori memiliki jumlah yang seimbang, yaitu masing-masing 463 data. Data uji tidak dikenai SMOTE bertujuan agar distribusi kelas aslinya tetap terjaga untuk evaluasi model. Dengan demikian, SMOTE berhasil menyeimbangkan distribusi kelas pada data latih dari 131:463 menjadi 463:463.

4.8 Pemeriksaan Akhir Hasil

# ============================================================
# 9. PEMERIKSAAN AKHIR HASIL PREPROCESSING
# ============================================================

cat("Dimensi data latih sebelum SMOTE:\n")
## Dimensi data latih sebelum SMOTE:
print(dim(X_train_scale))
## [1] 594   4
cat("Dimensi data latih setelah SMOTE:\n")
## Dimensi data latih setelah SMOTE:
print(dim(X_train_final))
## [1] 926   4
cat("Dimensi data uji:\n")
## Dimensi data uji:
print(dim(X_test_final))
## [1] 149   4
cat("Missing value pada data latih akhir:\n")
## Missing value pada data latih akhir:
print(colSums(is.na(X_train_final)))
##            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##               0               0               0               0
cat("Missing value pada data uji akhir:\n")
## Missing value pada data uji akhir:
print(colSums(is.na(X_test_final)))
##            Suhu      Kelembapan   Keadaan_Cuaca Kecepatan_Angin 
##               0               0               0               0
cat("Distribusi target data latih akhir:\n")
## Distribusi target data latih akhir:
print(table(y_train_final))
## y_train_final
##   1   2 
## 463 463
cat("Distribusi target data uji:\n")
## Distribusi target data uji:
print(table(y_test_final))
## y_test_final
##   1   2 
##  33 116

Berdasarkan hasil pemeriksaan akhir, data latih setelah penerapan SMOTE memiliki 926 baris dan 4 variabel prediktor, sedangkan data uji terdiri atas 149 baris dan 4 variabel prediktor. Seluruh variabel pada data latih dan data uji sudah tidak memiliki missing value. Distribusi target pada data latih juga telah seimbang, yaitu masing-masing 463 data untuk kategori hujan = 1 dan hujan = 2. Data uji tetap memiliki distribusi asli, yaitu 33 data pada kategori 1 dan 116 data pada kategori 2, karena tidak dilakukan SMOTE pada data uji. Dengan demikian, preprocessing telah menghasilkan data yang siap digunakan untuk pemodelan dan evaluasi.

BAB V KESIMPULAN

5.1 Kesimpulan

Konsep berbagai jenis feature engineering pada RStudio meliputi teknik pengolahan data untuk meningkatkan kualitas data sebelum digunakan dalam pemodelan. Teknik tersebut mencakup penanganan missing value, kardinalitas, pembagian data, penanganan outlier, scaling, encoding variabel kategorik, dan penanganan ketidakseimbangan data. Setiap teknik memiliki fungsi yang berbeda sesuai dengan karakteristik dan permasalahan data.

Teknik feature engineering dapat dilakukan di RStudio menggunakan berbagai fungsi dan package yang sesuai dengan tahapan preprocessing. Proses dimulai dari memasukkan data, menangani missing value, melakukan splitting data, capping, standard scaler, hingga SMOTE. Setiap tahapan dilakukan secara berurutan untuk menghasilkan data yang lebih siap digunakan dalam pemodelan.

Berdasarkan hasil batasan masalah dapat disimpulkan bahwa proses feature engineering pada dataset curah hujan berhasil dilakukan melalui penanganan missing value, pembagian data secara stratifikasi, penanganan outlier, standardisasi variabel numerik, dan penyeimbangan kelas menggunakan SMOTE. Hasil akhir menunjukkan bahwa data latih terdiri atas 926 pengamatan dengan distribusi kelas seimbang, sedangkan data uji terdiri atas 149 pengamatan dengan distribusi kelas asli. Seluruh variabel prediktor pada kedua dataset juga telah bebas dari missing value, sehingga data siap digunakan untuk tahap pemodelan dan evaluasi.

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), 236–249. https://doi.org/10.23960/jitet.v14i1.8303

Faiz, M. N., Somantri, O., & Muhammad, A. W. (2022). Rekayasa Fitur Berbasis Machine Learning untuk Mendeteksi Serangan DDoS. 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 dan Modern Prediction. Laboratorium Matematika Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Bengkulu.

Rifa’i, A., Suntoro, J., & Setiaji, G. G. (2024). GA-SVM Wrapper Feature Selection untuk Penanganan Data Berdimensi Tinggi. Jurnal Transformatika, 21(2), 64–72. https://doi.org/10.26623/transformatika.v21i2.8886