Perkembangan teknologi informasi yang semakin pesat menyebabkan jumlah data yang tersedia untuk dianalisis menjadi semakin besar dan kompleks. Kondisi tersebut mendorong pemanfaatan machine learning sebagai pendekatan untuk memperoleh pola dan informasi dari data yang dapat digunakan dalam proses prediksi maupun klasifikasi. Dalam penerapannya, data yang digunakan sebagai masukan model perlu memiliki karakteristik yang sesuai agar proses pembelajaran dapat berjalan dengan baik. Oleh karena itu, pengolahan data dan pembentukan representasi fitur menjadi salah satu bagian penting dalam tahapan pemodelan machine learning (Verdonck dkk., 2021).
Feature engineering merupakan proses mengolah data mentah menjadi fitur yang lebih sesuai dengan kebutuhan model machine learning. Proses tersebut dapat dilakukan melalui transformasi fitur, pembentukan fitur baru, ekstraksi informasi, maupun pemilihan fitur yang dianggap relevan. Fitur yang telah direpresentasikan dengan baik dapat membantu model memperoleh informasi yang lebih sesuai dengan pola yang terdapat dalam data. Dengan demikian, feature engineering menjadi salah satu tahapan yang berkaitan dengan bagaimana informasi dari data direpresentasikan sebelum digunakan dalam proses pemodelan (Forke & Tropmann-Frick, 2021).
Data yang digunakan dalam machine learning dapat memiliki berbagai permasalahan yang perlu diperhatikan sebelum proses pemodelan dilakukan. Permasalahan tersebut dapat berupa nilai yang hilang, nilai pencilan, variabel dengan kategori yang banyak, perbedaan skala antarvariabel, serta ketidakseimbangan kelas pada data kategoris. Kondisi data tersebut dapat memengaruhi proses pengolahan dan penggunaan fitur dalam model sehingga diperlukan tahapan persiapan data yang sesuai dengan karakteristik dataset. Proses persiapan tersebut merupakan bagian dari feature engineering yang bertujuan menghasilkan data dengan bentuk yang lebih sesuai untuk pemodelan (Kotsiantis dkk., 2021).
Berdasarkan uraian tersebut, feature engineering merupakan salah satu tahapan penting dalam pengolahan data sebelum membangun model machine learning. Proses ini mencakup berbagai kegiatan yang berkaitan dengan pengolahan dan pembentukan fitur, mulai dari pemeriksaan kondisi data hingga transformasi fitur agar dapat digunakan secara tepat oleh algoritma. Pengolahan fitur yang sesuai dapat membantu menghasilkan representasi data yang lebih terstruktur dan informatif untuk kebutuhan pemodelan. Oleh karena itu, pemahaman mengenai berbagai tahapan feature engineering diperlukan dalam proses persiapan data machine learning.
Berdasarkan latar belakang di atas dapat disimpulkan bahwa rumusan masalah sebagai berikut:
Berdasarkan rumusan masalah di atas, tujuan penelitian yang dapat disimpulkan sebagai berikut:
Adapun manfaat yang didapatkan dari penelitian ini adalah sebagai berikut:
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!
Adapun sistematika penulisan dari praktikum ini adalah sebagai berikut:
BAB I PENDAHULUAN
Bab ini merupakan bab yang memuat latar belakang penelitian, rumusan masalah, tujuan dan manfaat penelitian, batasan masalah penelitian, dan sistematika penelitian.
BAB II TINJAUAN PUSTAKA
Bab ini merupakan bab yang memuat pengertian dari teori yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.
BAB III METODE PENELITIAN
Bab ini merupakan bab yang memuat uraian mengenai jenis dan sumber penelitian, variabel penelitian, dan analisis data.
BAB IV HASIL DAN PEMBAHASAN
Bab ini merupakan bab yang memuat hasil analisis, pembahasan dari hasil yang telah diperoleh, dan interpretasi.
BAB V KESIMPULAN DAN SARAN
Bab ini merupakan bab yang memuat rangkuman dari hasil keseluruhan dan saran yang diberikan oleh penulis terhadap hasil maupun analisis yang telah dilakukan.
DAFTAR PUSTAKA
Machine learning merupakan pendekatan komputasional yang memungkinkan sistem mempelajari pola dari data untuk menghasilkan prediksi atau keputusan. Dalam pendekatan ini, model tidak hanya diprogram menggunakan aturan yang bersifat eksplisit, tetapi dilatih menggunakan pasangan data dan target, struktur data tanpa target, atau umpan balik tertentu. Berdasarkan proses pembelajarannya, machine learning umumnya dibedakan menjadi supervised learning, unsupervised learning, dan reinforcement learning. Pada supervised learning, model mempelajari hubungan antara variabel prediktor dan variabel respons. Pada unsupervised learning, model berusaha menemukan struktur atau pola tanpa target yang telah ditentukan (Koukaras & Tjortjis, 2025)
Kinerja model machine learning dipengaruhi oleh kualitas data, representasi variabel, algoritma, parameter model, serta strategi validasi. Oleh sebab itu, pemilihan algoritma saja tidak cukup untuk menjamin model yang baik. Data perlu diubah ke dalam bentuk yang informatif, konsisten, dan sesuai dengan asumsi atau mekanisme kerja algoritma. Tahap tersebut menjadi alasan mengapa feature engineering memiliki kedudukan penting dalam pengembangan model prediktif (Mumuni & Mumuni, 2025).
Data preprocessing merupakan tahapan awal dalam pengolahan data yang bertujuan mengubah data mentah menjadi bentuk yang lebih sesuai untuk proses analisis atau pemodelan. Tahapan ini diperlukan karena data yang diperoleh dari sumber nyata dapat mengandung berbagai permasalahan, seperti missing value, data tidak konsisten, kesalahan pencatatan, outlier, serta perbedaan format atau skala antarvariabel. Proses data preprocessing dapat mencakup pembersihan data (data cleaning), penanganan nilai yang hilang, transformasi data, normalisasi atau standardisasi, serta pengubahan data kategorik ke bentuk yang dapat digunakan oleh metode analisis. Kualitas hasil pemodelan sangat berkaitan dengan kualitas data yang digunakan sehingga proses preprocessing menjadi bagian penting sebelum analisis lebih lanjut dilakukan (Maharana dkk., 2022).
Teknik data preprocessing perlu disesuaikan dengan karakteristik dan permasalahan yang terdapat pada dataset. Penanganan missing value, misalnya, dapat dilakukan melalui penghapusan observasi tertentu maupun metode imputasi, sedangkan data yang memiliki skala berbeda dapat ditransformasikan melalui standardisasi atau normalisasi agar lebih sesuai dengan kebutuhan metode analisis. Penanganan nilai yang hilang menjadi penting karena pengabaian terhadap missing value dapat menyebabkan hasil analisis menjadi bias atau kurang tepat (Emmanuel dkk., 2021).
Feature engineering merupakan proses mengubah data yang tersedia menjadi fitur yang dapat digunakan secara lebih efektif dalam proses pemodelan machine learning. Fitur merupakan variabel atau atribut yang merepresentasikan karakteristik suatu objek atau observasi dalam dataset. Proses feature engineering dapat mencakup transformasi, konstruksi, ekstraksi, dan seleksi fitur untuk memperoleh representasi data yang sesuai dengan tujuan analisis. Proses tersebut dilakukan agar informasi yang terkandung dalam data dapat direpresentasikan dalam bentuk yang dapat digunakan oleh algoritma machine learning (De Winter dkk., 2025).
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 (Fransiska, 2026). Berikut merupakan beberapa jenis Feature engineering yang harus dilakukan:
Missing values merupakan kondisi ketika suatu nilai pada variabel atau atribut dalam dataset tidak tersedia. Nilai yang hilang dapat terjadi pada sebagian atau seluruh variabel tertentu dan dapat ditemukan dalam berbagai bentuk dataset. Keberadaan missing values menyebabkan informasi yang tersedia dalam suatu observasi menjadi tidak lengkap sehingga perlu diperhatikan sebelum data digunakan dalam proses analisis. Penanganan missing values dapat dilakukan dengan menghapus observasi tertentu atau mengganti nilai yang hilang melalui metode imputasi (Jadhav dkk., 2021).
Kardinalitas (cardinality) merupakan jumlah nilai unik atau kategori yang terdapat dalam suatu variabel. Pada variabel kategoris, kardinalitas menunjukkan banyaknya kategori berbeda yang dimiliki oleh variabel tersebut. Variabel dengan jumlah kategori yang relatif sedikit memiliki kardinalitas rendah, sedangkan variabel dengan jumlah kategori yang banyak memiliki kardinalitas tinggi. Kardinalitas perlu diperhatikan dalam proses feature engineering karena jumlah kategori dapat memengaruhi bentuk representasi fitur setelah dilakukan proses encoding (Pargent dkk., 2022).
Data splitting merupakan proses membagi dataset menjadi beberapa bagian untuk tujuan yang berbeda dalam pemodelan machine learning. Pembagian yang umum digunakan adalah data training dan data testing. Data training digunakan untuk membangun atau melatih model, sedangkan data testing digunakan untuk mengevaluasi kemampuan model pada data yang tidak digunakan selama proses pelatihan. Pemisahan data bertujuan agar evaluasi model dapat menggambarkan kemampuan model dalam melakukan prediksi terhadap data yang belum digunakan dalam proses pembelajaran (Bischl dkk., 2023).
Outlier atau pencilan merupakan observasi yang memiliki karakteristik berbeda secara signifikan dibandingkan dengan sebagian besar observasi lainnya dalam suatu dataset Pencilan dapat muncul akibat kesalahan pengukuran, kesalahan pencatatan, maupun kondisi tertentu yang memang terdapat dalam data. Keberadaan Outlier perlu diperiksa karena observasi tersebut dapat memberikan pengaruh terhadap hasil pengolahan dan pemodelan data. Penanganan pencilan dapat dilakukan melalui identifikasi, pemeriksaan, penghapusan, transformasi, atau metode lain yang disesuaikan dengan karakteristik data (Borrohou dkk., 2023).
Scaling data merupakan proses mengubah nilai pada fitur numerik sehingga berada pada rentang atau skala tertentu. Setiap variabel dalam suatu dataset dapat memiliki satuan dan rentang nilai yang berbeda sehingga diperlukan proses penyetaraan skala pada kondisi tertentu. Scaling dapat dilakukan menggunakan beberapa metode, seperti normalization dan standardization. Proses tersebut terutama diperlukan pada algoritma yang sensitif terhadap perbedaan skala antarfitur karena nilai fitur digunakan dalam perhitungan tertentu selama proses pemodelan (Chaining dkk., 2022).
Feature encoding merupakan proses mengubah variabel kategoris menjadi bentuk numerik agar dapat digunakan sebagai masukan dalam algoritma machine learning. Variabel kategoris memiliki nilai berupa label atau kategori yang tidak secara langsung dapat diproses oleh sebagian besar algoritma machine learning. Oleh karena itu, kategori perlu direpresentasikan dalam bentuk numerik melalui metode encoding. Beberapa metode yang dapat digunakan antara lain one-hot encoding, label encoding, dan target encoding (Pargent dkk., 2022).
Imbalanced dataset merupakan kondisi ketika jumlah observasi pada setiap kelas dalam variabel target tidak memiliki proporsi yang seimbang. Kelas dengan jumlah observasi lebih banyak disebut sebagai kelas mayoritas, sedangkan kelas dengan jumlah observasi lebih sedikit disebut sebagai kelas minoritas. Kondisi tersebut dapat menyebabkan proses pembelajaran model lebih dipengaruhi oleh kelas mayoritas sehingga representasi kelas minoritas menjadi kurang optimal. Penanganan imbalanced dataset dapat dilakukan melalui pendekatan pada data maupun algoritma untuk menghasilkan proses pembelajaran yang lebih seimbang (Santos dkk., 2022).
Jenis data yang digunakan pada penelitian ini yaitu data kuantitatif. Data kuantitatif adalah data penelitian yang berbentuk angka dan data yang dapat dilakukan analisis. Data kuantitatif disebut juga dikenal dengan data numerik.
Sumber data yang digunakan dalam penelitian ini merupakan 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 adalah curah hujan yang diberikan oleh asisten praktikum.
Variabel merupakan objek penelitian atau hal yang menjadi titik perhatian dalam suatu studi. Variabel yang digunakan dalam praktikum ini terdiri atas hujan, suhu, kelembapan, keadaan cuaca, dan kecepatan angin. Variabel hujan, suhu, kelembapan, dan kecepatan angin merupakan variabel numerik, sedangkan keadaan cuaca merupakan variabel kategorik. kelima variabel tersebut digunakan dalam proses preprocessing data untuk mempersiapkan data sebelum dilakukan analisis selanjutnya.
Langkah-langkah yang digunakan pada penelitian untuk batasan masalah adalah sebagai berikut:
y_train.over_ratio = 1 dan jumlah tetangga
(neighbors) sebanyak 5.prep() berdasarkan data
training.bake() untuk menghasilkan
data training yang lebih seimbang.train_balanced sebagai dataset
hasil penanganan imbalanced dataset.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 <- read_excel("C:/Users/LENOVO/Downloads/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 ...
Fungsi head(data) menampilkan enam baris pertama dari data curah hujan, sedangkan str(data) menunjukkan bahwa data berupa tibble dengan 743 observasi dan 5 variabel, yaitu Hujan, Suhu, Kelembapan, Keadaan_Cuaca, dan Kecepatan_Angin, seluruhnya bertipe numerik (num). Pada enam baris pertama sudah terlihat nilai NA pada Kecepatan_Angin, yang mengindikasikan adanya data hilang. Perlu dicatat bahwa Keadaan_Cuaca bertipe numerik padahal secara substansi merupakan variabel kategorik berupa kode cuaca, sehingga perlu penanganan khusus pada tahap berikutnya.
# Jumlah missing value setiap variabel
colSums(is.na(data))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 9 314
# Persentase missing value setiap variabel
colMeans(is.na(data))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0.00000000 0.00000000 0.00000000 0.01211306 0.42261104
# Melihat baris yang memiliki missing value
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
#Interpolasi
df_imp <- data
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
Hasil colSums(is.na(data)) menunjukkan nilai hilang pada Keadaan_Cuaca sebanyak 9 data dan Kecepatan_Angin sebanyak 314 data, sedangkan Hujan, Suhu, dan Kelembapan lengkap. Persentasenya sebesar 1,21% untuk Keadaan_Cuaca dan 42,26% untuk Kecepatan_Angin. Proporsi 42,26% tergolong sangat besar, sehingga penghapusan baris tidak dipilih karena akan membuang hampir separuh data. Tabel baris bermasalah memperlihatkan 319 baris yang memuat setidaknya satu NA, dan pola awalnya menunjukkan data hilang pada Kecepatan_Angin terkonsentrasi di awal rangkaian data. Setelah interpolasi linear (na.approx), nilai hilang Keadaan_Cuaca menjadi 0, sedangkan Kecepatan_Angin masih 314. Setelah diimputasi dengan rata-rata (sekitar 6,66, tampak pada kolom Kecepatan_Angin di baris pertama output 4.3), seluruh variabel tidak lagi memiliki nilai hilang. Catatan metodologis: interpolasi pada variabel kode kategorik menghasilkan nilai non-bulat seperti 1,5, sebagaimana tampak pada daftar nilai unik di 4.3, dan imputasi rata-rata menurunkan variansi Kecepatan_Angin karena 42% datanya diseragamkan pada satu nilai.
# 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
Variabel Keadaan_Cuaca awalnya memiliki 23 nilai unik (antara lain 1, 2, 3, 5, 10, 14, 60, 95, 97, dan 1,5), yang tergolong kardinalitas tinggi. Jika langsung di-one-hot encoding, jumlah kolom akan melonjak dan berisiko menimbulkan sparsitas. Reduksi dengan cut pada interval lebar 10 menurunkan jumlah kategori menjadi 7 level aktual (0, 1, 2, 4, 5, 6, 7, 8, 9) dari 10 level yang didefinisikan. Level 0 mencakup kode 0 sampai 10 sehingga mendominasi, seperti terlihat pada 10 baris pertama yang seluruhnya masuk kategori 0. Artinya reduksi berhasil menyederhanakan fitur, tetapi mengorbankan perbedaan antarkode di dalam satu interval.
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
Dengan set.seed(200) dan proporsi 0,8, data terbagi menjadi 594 observasi training dan 149 observasi testing, masing-masing dengan 5 kolom prediktor setelah variabel Hujan dipisahkan sebagai target (kolom prediktor termasuk Keadaan_Cuaca_reduced). Proporsi 594/743 sebesar 79,9% sesuai target 80:20. Penggunaan set.seed menjamin pembagian dapat direproduksi.
# 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
Metode IQR pada data training menghasilkan batas Suhu 17,4 sampai 35,8 dengan 0 outlier, Kelembapan 46,5 sampai 122,5 dengan 0 outlier, dan Kecepatan_Angin 2,0 sampai 10,0 dengan 50 outlier. Jadi Suhu dan Kelembapan tidak memiliki pencilan, sedangkan seluruh pencilan berada pada Kecepatan_Angin, sekitar 8,4% dari 594 observasi. Rentang antarkuartil Kecepatan_Angin yang sempit (hanya 2 sampai 10) sebagian besar disebabkan oleh imputasi rata-rata yang menumpuk banyak nilai di sekitar 6,66.
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
Nilai di luar batas IQR dari data training dipotong ke batas terdekat, dan batas yang sama dipakai untuk data testing sehingga tidak terjadi kebocoran data. Pada pasangan histogram dan boxplot, variabel Suhu dan Kelembapan tampak identik sebelum dan sesudah capping karena memang tanpa pencilan. Untuk Kecepatan_Angin, boxplot sebelum capping menampilkan titik-titik pencilan di luar whisker, sedangkan setelah capping titik tersebut hilang dan nilai menumpuk pada batas 2 dan 10, yang tampak sebagai batang tinggi di tepi histogram. Ini menunjukkan capping berhasil menekan pengaruh nilai ekstrem tanpa membuang observasi.
# 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
Median dan IQR dihitung dari data training yang sudah di-capping, lalu rumus (x − median)/IQR diterapkan pada training dan testing. Hasilnya, nilai variabel numerik berpusat di sekitar 0 dan bernilai positif maupun negatif, misalnya Suhu −0,500 dan 1,09 serta Kelembapan 0,579 dan −0,947 pada baris-baris awal. Nilai 0 berarti sama dengan median, dan satuannya kini adalah kelipatan IQR. Karena berbasis median dan IQR, metode ini tahan terhadap sisa efek pencilan.
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>
Variabel Keadaan_Cuaca_reduced diubah dengan one-hot encoding menjadi 10 kolom biner (X0 sampai X9), dengan nilai 1 pada kolom kategori yang sesuai dan 0 pada lainnya. Pada enam baris pertama training, baris pertama berkategori 6 (X6 bernilai 1) dan lima baris lainnya berkategori 0 (X0 bernilai 1). Karena recipe di-prep dengan data training, data testing ditransformasi dengan skema kolom yang sama. Beberapa kolom (misalnya X3, X7, X8) seluruhnya bernilai 0 karena kategori tersebut tidak muncul pada data.
# 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
Sebelum SMOTE, target Hujan pada data training berdistribusi 128 observasi kelas 1 dan 466 observasi kelas 2, atau rasio sekitar 21,5% berbanding 78,5%, yang menunjukkan ketidakseimbangan kelas. Setelah SMOTE dengan over_ratio = 1 dan 5 tetangga, kedua kelas masing-masing berjumlah 466, sehingga total data training menjadi 932. Kelas minoritas ditambah 338 observasi sintetis tanpa mengurangi kelas mayoritas. SMOTE hanya diterapkan pada data training, sehingga data testing tetap mencerminkan distribusi asli dan evaluasi model tidak bias.
Mahasiswa dapat memahami konsep dan tujuan dari berbagai jenis feature engineering yang digunakan dalam pengolahan data menggunakan RStudio. Pemahaman tersebut mencakup fungsi feature engineering dalam mempersiapkan dan meningkatkan kualitas variabel sebelum dilakukan analisis lebih lanjut. Mahasiswa juga dapat memahami bahwa setiap teknik feature engineering memiliki fungsi dan penerapan yang berbeda sesuai dengan karakteristik data. Pemahaman konsep tersebut menjadi dasar dalam menentukan teknik yang sesuai untuk mengolah suatu dataset. Dengan demikian, tujuan pertama mengenai pemahaman konsep berbagai jenis feature engineering pada RStudio telah tercapai.
Mahasiswa juga mampu menerapkan berbagai teknik feature engineering menggunakan program RStudio sesuai dengan kebutuhan data. Penerapan tersebut dilakukan melalui tahapan pengolahan variabel, seperti penanganan data, transformasi, reduksi kategori, dan pembentukan fitur yang lebih sesuai untuk analisis. Penggunaan RStudio membantu mahasiswa melakukan proses feature engineering secara sistematis dan efisien. Hasil penerapan menunjukkan bahwa teknik feature engineering dapat digunakan untuk menghasilkan data yang lebih siap dan sesuai untuk tahap analisis berikutnya. Dengan demikian, tujuan kedua mengenai kemampuan melakukan teknik feature engineering pada RStudio juga telah tercapai.
Berdasarkan hasil batasan masalah dapat disimpulkan bahwa tahap preprocessing terhadap 743 observasi data curah hujan menunjukkan adanya nilai yang hilang pada variabel Keadaan_Cuaca sebanyak 9 observasi dan Kecepatan_Angin sebanyak 314 observasi. Nilai yang hilang pada variabel Keadaan_Cuaca ditangani melalui metode interpolasi, sedangkan missing value pada Kecepatan_Angin digantikan menggunakan nilai rata-rata. Selanjutnya, kategori pada variabel Keadaan_Cuaca disederhanakan dari 23 kategori menjadi 7 kategori dengan melakukan pengelompokan berdasarkan interval tertentu. Dataset kemudian dibagi menjadi data training sebanyak 594 observasi dan data testing sebanyak 149 observasi. Pemeriksaan terhadap pencilan dilakukan pada variabel numerik Suhu, Kelembapan, dan Kecepatan_Angin menggunakan metode IQR, kemudian pencilan ditangani dengan teknik capping berdasarkan batas IQR yang dihitung dari data training. Tahap berikutnya adalah melakukan standardisasi terhadap variabel numerik menggunakan metode Robust Scaling yang mempertimbangkan nilai median dan IQR, sedangkan variabel kategorik Keadaan_Cuaca_reduced dikonversi menjadi variabel dummy. Berdasarkan distribusi variabel target Hujan, diperoleh 128 observasi pada kelas 1 dan 466 observasi pada kelas 2 yang menunjukkan adanya ketidakseimbangan kelas. Untuk mengatasi kondisi tersebut, metode SMOTE diterapkan pada data training sehingga masing-masing kelas memiliki 466 observasi. Dengan demikian, data training setelah proses SMOTE memiliki distribusi kelas yang seimbang dan dapat digunakan untuk tahap pemodelan klasifikasi.
Pada membuat laporan praktikum ini penulis menyarankan untuk selalu memperhatikan sintaks pada program R yang digunakan. Selain itu, perlu untuk memperhatikan tata cara penulisan yang sesuai dengan KBBI dan penulisan yang bercetak tebal. Sehingga dapat menghasilkan laporan yang baik.
Bischl, B., Binder, M., Lang, M., Pargent, F., Pfisterer, F., Coors, S., Thomas, J., & Probst, P. (2023). Hyperparameter optimization: Foundations, algorithms, best practices and open challenges. WIREs Data Mining and Knowledge Discovery, 13(2), e1484. https://doi.org/10.1002/widm.1484
Borrohou, S., Fissoune, R., & Badir, H. (2023). Data cleaning survey and challenges—Improving outlier detection algorithm in machine learning. Smart Cities and Regional Development Journal, 7(3), 125–140. https://doi.org/10.3233/SCS-230008
Chaining, C., Zarlis, M., & Candra, A. (2022). Chaining Z-score and feature scaling methods to improve neural networks for classification. Applied Soft Computing, 123, 108908. https://doi.org/10.1016/j.asoc.2022.108908
De Winter, C., Frasincar, F., de Peuter, B., Matsiiako, V., Ido, E., & Klinkhamer, J. (2025). Automated feature engineering for automated machine learning. Knowledge-Based Systems, 321, 113671. https://doi.org/10.1016/j.knosys.2025.113671
Emmanuel, T., Maupong, T., Mpoeleng, D., Semong, T., Mphago, B., & Tabona, O. (2021). A survey on missing data in machine learning. Journal of Big Data, 8, 140. https://doi.org/10.1186/s40537-021-00516-9
Forke, C.-M., & Tropmann-Frick, M. (2021). Feature engineering techniques and spatio-temporal data processing. Datenbank-Spektrum, 21, 237–244. https://doi.org/10.1007/s13222-021-00391-x
Fransiska, H. (2026). Modul Praktikum Machine Learning. Universitas Bengkulu
Jadhav, V., Ramanathan, K., & Kaur, M. (2021). A comparative study of imputation methods for missing data in machine learning. Journal of Big Data, 8, Article 120.
Kotsiantis, S., Kanellopoulos, D., & Pintelas, P. (2021). Data preprocessing for supervised learning. International Journal of Computer Science and Applications, 18(3), 1–15.
Koukaras, P., & Tjortjis, C. (2025). Data Preprocessing and Feature Engineering for Data Mining: Techniques, Tools, and Best Practices. In AI (Switzerland) (Vol. 6, Number 10). https://doi.org/10.3390/ai6100257
Maharana, K., Mondal, S., & Nemade, B. (2022). A review: Data pre-processing and data augmentation techniques. Global Transitions Proceedings, 3(2), 91–99. https://doi.org/10.1016/j.gltp.2022.04.020
Mumuni, A., & Mumuni, F. (2025). Automated data processing and feature engineering for deep learning and big data applications: A survey. Journal of Information and Intelligence, 3(2). https://doi.org/10.1016/j.jiixd.2024.01.002
Pargent, F., Pfisterer, F., Thomas, J., & Bischl, B. (2022). Regularized target encoding outperforms traditional methods in supervised machine learning with high cardinality features. Computational Statistics, 37, 2671–2692. https://doi.org/10.1007/s00180-022-01207-6
Santos, M. S., Abreu, P. H., Japkowicz, N., Fernández, A., Soares, C., Wilk, S., & Santos, J. (2022). On the joint-effect of class imbalance and overlap: A critical review. Artificial Intelligence Review, 55, 6207–6275. https://doi.org/10.1007/s10462-022-10150-3
Verdonck, T., Baesens, B., Óskarsdóttir, M., & vanden Broucke, S. (2021). Special issue on feature engineering editorial. Machine Learning, 113, 3917–3928. https://doi.org/10.1007/s10994-021-06042-2