Machine learning merupakan metode yang dapat digunakan untuk menganalisis data dan membangun model prediksi. Dalam penerapannya, data perlu dipersiapkan dalam bentuk fitur yang sesuai agar dapat digunakan oleh algoritma machine learning. Salah satu tahapan yang dapat dilakukan adalah feature engineering, yaitu proses mengolah atau membentuk fitur dari data agar lebih sesuai dengan kebutuhan pemodelan (Faiz et al., 2022).Feature engineering dapat dilakukan melalui berbagai teknik, salah satunya adalah seleksi fitur untuk menentukan fitur yang relevan dalam proses pemodelan. Seleksi fitur dapat membantu mengurangi jumlah fitur yang digunakan dan pada kondisi tertentu dapat meningkatkan performa model machine learning (Tangkawarow et al., 2023) Berdasarkan uraian diatas, praktikum ini dilakukan untuk memahami penerapan feature engineering dalam mempersiapkan data sebelum digunakan pada pemodelan machine learning, khususnya melalui proses pengolahan dan pemilihan fitur.
Adapun batasan masalah pada penelitian ini yaitu, 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!
Machine learning merupakan pendekatan komputasional yang memungkinkan sistem mengenali pola dalam data untuk menghasilkan prediksi atau keputusan. Pada pendekatan ini, sistem tidak hanya bergantung pada aturan yang telah ditentukan secara langsung, tetapi dapat mempelajari pola melalui data beserta targetnya, data tanpa target, maupun umpan balik tertentu.achine learning memiliki 3 pendekatan yaitu: Supervised Learning, Unsupervised Learning dan Reinforcement Learning (Mursalim et al., 2024)
Feature Engineering adalah sebuah teknik merekayasa fitur-fitur, karena sangat diperlukan untuk menciptakan representasi data yang sesuai untuk model pembelajaran. Feature engineering merupakan langkah krusial dalam machine learning yang mencakup proses pembuatan, pemilihan, serta transformasi fitur dari data mentah dengan tujuan meningkatkan kinerja model (Firman dkk., 2025). Salah satu teknik Feature Engineering adalah”One-Hot Encoding,” yang digunakan untuk mengatasi data kategorikal atau berlabel. Beberapa metode dalam feature engineering yaitu (Herdian et al., 2024):
Teknik feature engineering pada program RStudio diterapkan melalui beberapa tahapan pengolahan data. Missing value ditangani melalui penghapusan data, forward fill, mean imputation, median imputation, dan interpolasi. Pada tahap kardinalitas, dilakukan binning untuk mengurangi jumlah kategori. Pembagian data dilakukan menggunakan metode non-shuffle, shuffle, dan stratified. Selanjutnya, outlier diidentifikasi berdasarkan metode IQR dan ditangani melalui trimming atau capping. Pen-skala-an variabel numerik dilakukan dengan standard scaling dan robust scaling. Variabel kategorik kemudian ditransformasikan menggunakan One-Hot Encoding dan Ordinal Encoding. Tahap terakhir dilakukan dengan menerapkan SMOTE untuk menangani ketidakseimbangan dat (Fransiska, 2026)
Jenis data pada penelitian ini adalah data numerik. Data numerik adalah jenis data yang terdiri dari angka dan dapat diukur atau dihitung secara kuantitatif. Sumber data yang digunakan dalam penelitian ini yaitu data sekunder yang diperoleh secara tidak langsung melalui perantara (diperoleh dan dicatat oleh pihak lain). Data sekunder yang dimaksud adalah dari modul praktikum Machine Learning and Modern Prediction.
Variabel penelitian yang digunakan terdiri atas variabel prediktor dan variabel target. Variabel target yang digunakan yaitu Hujan, sedangkan variabel prediktor terdiri atas Suhu, Kelembapan, Keadaan Cuaca, dan Kecepatan Angin. Variabel Hujan merupakan nilai curah hujan yang diamati, Suhu merupakan nilai suhu udara, Kelembapan menunjukkan tingkat kelembapan udara, Keadaan Cuaca menunjukkan kondisi cuaca, sedangkan Kecepatan Angin merupakan nilai kecepatan angin yang diamati.
Adapun langkah-langkah yang dilakukan dalam penelitian ini adalah sebagai berikut:
library(zoo)
## Warning: package 'zoo' was built under R version 4.6.1
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(readxl)
## Warning: package 'readxl' was built under R version 4.6.1
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.6.1
## Warning: package 'ggplot2' was built under R version 4.6.1
## Warning: package 'tibble' was built under R version 4.6.1
## Warning: package 'tidyr' was built under R version 4.6.1
## Warning: package 'readr' was built under R version 4.6.1
## Warning: package 'purrr' was built under R version 4.6.1
## Warning: package 'dplyr' was built under R version 4.6.1
## Warning: package 'stringr' was built under R version 4.6.1
## Warning: package 'forcats' was built under R version 4.6.1
## Warning: package 'lubridate' was built under R version 4.6.1
## ── 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)
## Warning: package 'rsample' was built under R version 4.6.1
library(e1071)
## Warning: package 'e1071' was built under R version 4.6.1
##
## Attaching package: 'e1071'
##
## The following object is masked from 'package:rsample':
##
## permutations
##
## The following object is masked from 'package:ggplot2':
##
## element
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.6.1
library(dplyr)
library(ggplot2)
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.6.1
##
## Attaching package: 'gridExtra'
##
## The following object is masked from 'package:dplyr':
##
## combine
library(recipes)
## Warning: package 'recipes' was built under R version 4.6.1
##
## Attaching package: 'recipes'
##
## The following object is masked from 'package:stringr':
##
## fixed
##
## The following object is masked from 'package:stats':
##
## step
library(themis)
## Warning: package 'themis' was built under R version 4.6.1
library(caret)
## Warning: package 'caret' was built under R version 4.6.1
## 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
data <- read_excel("F:/anggi/laprak semester 7/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
## 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
Statistik deskriptif digunakan untuk memberikan gambaran umum mengenai karakteristik data yang digunakan sebelum dilakukan preprocessing. Berdasarkan hasil statistik deskriptif, variabel Hujan memiliki nilai minimum 1, maksimum 2, dan rata-rata sebesar 1,779. Variabel Suhu memiliki nilai minimum 22,60, maksimum 32,00, dan rata-rata sebesar 26,54. Variabel Kelembapan memiliki nilai minimum 52, maksimum 100, dan rata-rata sebesar 83,88. Variabel Keadaan_Cuaca memiliki nilai minimum 1, maksimum 97, dan rata-rata sebesar 15,11, serta terdapat 9 nilai NA. Sementara itu, variabel Kecepatan_Angin memiliki nilai minimum 2, maksimum 21, dan rata-rata sebesar 6,655, serta terdapat 314 nilai NA.
# 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
# Lihat baris yang kosong di keadaan_cuaca
data %>% filter(is.na(Keadaan_Cuaca))
## # A tibble: 9 × 5
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 26 92 NA NA
## 2 1 23.8 98 NA 5
## 3 1 23.3 97 NA NA
## 4 2 28.8 79 NA 12
## 5 2 24.6 92 NA NA
## 6 1 22.8 98 NA 4
## 7 2 25.5 96 NA NA
## 8 2 27 80 NA 4
## 9 2 31 57 NA 6
Berdasarkan hasil pemeriksaan missing value terdapat 9 observasi (1,21%) yang memiliki nilai kosong (NA) pada variabel Keadaan_Cuaca dan terdapat 314 observasi (42.26%) yang memiliki nilai kosong (NA) pada variabel kecepatan_angin. Nilai NA tersebut ditemukan pada beberapa observasi dengan karakteristik nilai Hujan, Suhu, Kelembapan, dan Kecepatan_Angin yang berbeda.
# Mode Imputation
df_imp2 <- data
df_imp2$Kecepatan_Angin[is.na(df_imp2$Kecepatan_Angin)] <-
as.numeric(names(sort(table(df_imp2$Kecepatan_Angin), decreasing = TRUE)[1]))
colSums(is.na(df_imp2))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 9 0
Berdasarkan hasil Mode Imputation, seluruh nilai yang hilang pada variabel Kecepatan_Angin telah berhasil diisi menggunakan nilai modus dari variabel tersebut. Hal ini ditunjukkan dengan jumlah nilai NA pada Kecepatan_Angin menjadi 0, sedangkan pada variabel Keadaan_Cuaca masih terdapat 9 nilai NA karena variabel tersebut akan ditangani menggunakan metode interpolasi.
# Interpolasi
df_imp4 <- df_imp2
df_imp4$Keadaan_Cuaca <- na.approx(
df_imp4$Keadaan_Cuaca,
na.rm = FALSE
)
colSums(is.na(df_imp4))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 0 0
Berdasarkan hasil interpolasi, 9 nilai NA pada variabel Keadaan_Cuaca telah berhasil diisi menggunakan nilai yang diperkirakan berdasarkan nilai di sekitar data yang hilang. Setelah dilakukan interpolasi, jumlah nilai NA pada Keadaan_Cuaca menjadi 0. Selain itu, Kecepatan_Angin yang sebelumnya telah ditangani menggunakan mode imputation juga memiliki 0 nilai NA. Dengan demikian, seluruh variabel dalam data sudah tidak memiliki missing value dan data dapat dilanjutkan ke tahap preprocessing berikutnya.
## Kardinalitas
head(df_imp4, 10)
## # A tibble: 10 × 5
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 23 95 5 3
## 2 1 24 90 1 3
## 3 1 26.8 77 1 3
## 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
unique(df_imp4$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
# 1. Tentukan batas bin
bins <- c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
# 2. Tentukan label untuk setiap bin (10 label: 0 s/d 9)
labels <- 0:9
# 3. Terapkan cut()
df_imp4$Keadaan_Cuaca_reduced <- cut(
df_imp4$Keadaan_Cuaca,
breaks = bins,
labels = labels,
right = TRUE,
include.lowest = TRUE
)
# 4. Verifikasi
cat("--- Hasil Perbandingan ---\n")
## --- Hasil Perbandingan ---
print(df_imp4[sample(nrow(df_imp4), 10), ])
## # A tibble: 10 × 6
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin Keadaan_Cuaca_reduced
## <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
## 1 2 24.8 84 2 3 0
## 2 2 25 84 2 3 0
## 3 2 29.8 66 3 11 0
## 4 2 28.3 84 2 3 0
## 5 2 29.2 74 2 9 0
## 6 2 25.7 95 13 3 1
## 7 2 24.6 95 5 3 0
## 8 1 25.3 92 21 4 2
## 9 2 27 84 3 4 0
## 10 2 28.6 78 2 5 0
cat("\n--- Pengecekan Kardinalitas ---\n")
##
## --- Pengecekan Kardinalitas ---
cat('Jumlah kategori di "Keadaan_Cuaca" asli :',
length(unique(df_imp4$Keadaan_Cuaca)), "\n")
## Jumlah kategori di "Keadaan_Cuaca" asli : 23
cat('Jumlah kategori di "Keadaan_Cuaca_reduced" :',
length(unique(df_imp4$Keadaan_Cuaca_reduced)), "\n")
## Jumlah kategori di "Keadaan_Cuaca_reduced" : 7
cat("\nKategori unik yang baru (reduced):\n")
##
## Kategori unik yang baru (reduced):
print(unique(df_imp4$Keadaan_Cuaca_reduced))
## [1] 0 1 5 6 2 9 4
## Levels: 0 1 2 3 4 5 6 7 8 9
Interpretasi :
set.seed(200)
split_stratify <- initial_split(df_imp4, prop = 0.8, strata = Hujan)
X_train <- training(split_stratify) %>% select(-Hujan)
X_test <- testing(split_stratify) %>% select(-Hujan)
y_train <- training(split_stratify)$Hujan
y_test <- testing(split_stratify)$Hujan
dim(X_train)
## [1] 594 5
dim(X_test)
## [1] 149 5
Pada Spliting data menggunakan Stratify spliting, Data dibagi menjadi 80% data training dan 20% data testing menggunakan berdasarkan variabel Hujan. Hasil pembagian menunjukkan data training terdiri dari 594 observasi dan 5 variabel, sedangkan data testing terdiri dari 149 observasi dan 5 variabel
## 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)
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)
}
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.4625 35.7625
## 2 Kelembapan 0 46.5000 122.5000
## 3 Kecepatan_Angin 12 -3.0000 13.0000
Berdasarkan hasil perhitungan IQR, variabel Suhu dan Kelembapan tidak memiliki outlier, sedangkan Kecepatan_Angin memiliki 12 data outlier dengan batas bawah -3 dan batas atas 13. Oleh karena itu, penanganan outlier selanjutnya dilakukan dengan metode capping pada data yang berada di luar batas tersebut.
# Capping
X_train_capped <- X_train
X_train_capped$Kecepatan_Angin <- Winsorize(
X_train$Kecepatan_Angin,
val = c(lower_bound, upper_bound)
)
X_test_capped <- X_test
X_test_capped$Kecepatan_Angin <- Winsorize(
X_test$Kecepatan_Angin,
val = c(lower_bound, upper_bound)
)
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("\n", 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
list_num <- c("Suhu", "Kelembapan", "Kecepatan_Angin")
nilai_skew_normal <- list_num
# Standard scaler
mean_val <- sapply(X_train_capped[nilai_skew_normal], mean, na.rm = TRUE)
sd_val <- sapply(X_train_capped[nilai_skew_normal], sd, na.rm = TRUE)
for (col in nilai_skew_normal) {
X_train_capped[[col]] <- (X_train_capped[[col]] - mean_val[col]) / sd_val[col]
}
for (col in nilai_skew_normal) {
X_test_capped[[col]] <- (X_test_capped[[col]] - mean_val[col]) / sd_val[col]
}
# Menyimpan hasil scaling
X_train_scale <- X_train_capped
X_test_scale <- X_test_capped
head(X_train_capped)
## # A tibble: 6 × 5
## Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin Keadaan_Cuaca_reduced
## <dbl> <dbl> <dbl> <dbl> <fct>
## 1 -1.39 0.973 5 -0.693 0
## 2 -1.00 0.540 1 -0.693 0
## 3 0.0947 -0.585 1 -0.693 0
## 4 1.19 -1.88 2 -1.03 0
## 5 1.66 -2.40 1 0.646 0
## 6 1.50 -2.32 3 1.32 0
Berdasarkan hasil standardisasi, nilai pada variabel Suhu, Kelembapan, dan Kecepatan_Angin telah berubah dari nilai awal menjadi nilai dalam skala standar. Sebagai contoh, nilai Suhu yang sebelumnya berada pada skala pengukuran aslinya berubah menjadi nilai seperti -1,3913 dan 1,1896, sedangkan Kelembapan dan Kecepatan_Angin juga menunjukkan perubahan ke nilai standar. Hal ini menunjukkan bahwa ketiga variabel numerik tersebut telah berhasil dilakukan proses scaling. Variabel Keadaan_Cuaca dan Keadaan_Cuaca_reduced tetap pada nilai kategorinya sehingga tidak mengalami proses scaling
list_cat <- c("Keadaan_Cuaca_reduced")
resep_encode <- recipe(~ Keadaan_Cuaca_reduced, data = X_train_scale) %>%
step_dummy(all_of(list_cat), 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)
head(X_train_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>
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>
Berdasarkan hasil One Hot Encoder pada data training dan data testing, variabel Keadaan_Cuaca_reduced telah berhasil diubah dari bentuk kategori menjadi beberapa variabel indikator dengan nilai 0 dan 1, seperti Keadaan_Cuaca_reduced_X0, Keadaan_Cuaca_reduced_X1, dan Keadaan_Cuaca_reduced_X2. Nilai 1 menunjukkan bahwa suatu observasi termasuk ke dalam kategori tersebut, sedangkan nilai 0 menunjukkan bahwa observasi tidak termasuk ke dalam kategori tersebut. Hasil encoding pada data training dan testing memiliki struktur variabel yang sama sehingga keduanya dapat digunakan pada tahap preprocessing selanjutnya.
Feature engineering merupakan tahapan untuk mempersiapkan dan mengolah data sebelum digunakan dalam pemodelan machine learning. Penerapannya pada RStudio dapat dilakukan melalui beberapa teknik, seperti penanganan missing value, pengurangan kardinalitas, splitting, penanganan outlier, scaling, encoding, dan balancing data.
Pada data curah hujan, hasil preprocessing menunjukkan bahwa terdapat 9 nilai missing pada Keadaan_Cuaca dan 314 nilai missing pada Kecepatan_Angin, yang kemudian berhasil ditangani sehingga seluruh variabel memiliki 0 nilai missing. Variabel Keadaan_Cuaca yang semula memiliki 23 nilai unik berhasil direduksi menjadi 7 kategori. Data kemudian terbagi menjadi 594 observasi training dan 149 observasi testing. Hasil pemeriksaan outlier menunjukkan bahwa terdapat 12 outlier pada Kecepatan_Angin, sedangkan Suhu dan Kelembapan tidak memiliki outlier. Setelah dilakukan SMOTE, jumlah kelas 1 dan kelas 2 menjadi seimbang, yaitu masing-masing 463 observasi. Dengan demikian, data telah berhasil melalui seluruh tahapan preprocessing yang ditentukan dan siap digunakan untuk pemodelan machine learning.
Fransiska, H. (2026). Modul praktikum machine learning and modern prediction. Universitas Bengkulu.
Firman, M. A., Djamalilleil, S. A. F., Zega, W., Efrizoni, L., & Rahmaddeni. (2025). Model klasifikasi IPK mahasiswa menggunakan algoritma decision tree dan random forest berbasis feature engineering. Techno.Com, 24(2), 391–404. https://doi.org/10.62411/tc.v24i2.12384
Herdian, C., Kamila, A., Tampinongkol, F. F., Kembau, A. S., & Budidarma, I. G. A. M. (2024). One-hot encoding feature engineering untuk label-based data studi kasus prediksi harga mobil bekas. Informasi Interaktif : Jurnal Informatika Dan Teknologi Informasi, 9(1), 10–16. https://doi.org/10.37159/jii.v9i1.41
Muhammad Nur Faiz, Oman Somantri, & Arif Wirawan Muhammad. (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
Mursalim, M., Aprilia, T., Samas, M. A., Rahmawati, A., & Mufidah, I. F. (2024). Pengenalan Machine Learning Untuk Mahasiswa Menggunakan Metode Service Learning. Abdimasku : Jurnal Pengabdian Masyarakat, 7(2), 493. https://doi.org/10.62411/ja.v7i2.1959
Tangkawarow, I., Hostiadi, D. P., Fatonah, N. S., Mohammad Yazdi, & Hariyanti, E. (2023). Analisis Seleksi Fitur untuk Optimasi Metode Klasifikasi k-NN pada Studi Kasus Penilaian Kinerja Karyawan. Jurnal Sistem Dan Informatika (JSI), 18(1), 18–28. https://doi.org/10.30864/jsi.v18i1.593