Machine learning bukanlah konsep yang baru. Sejak akhir tahun 1950-an, para peneliti telah berupaya mengembangkan algoritma yang memungkinkan mesin untuk belajar dari data. Salah satu pionirnya adalah Arthur Samuel, yang mengembangkan program bermain catur yang dapat “belajar” dari permainan sebelumnya untuk menjadi lebih baik. Seiring waktu, machine learning berkembang pesat dengan meningkatnya kemampuan komputasi dan ketersediaan data dalam jumlah besar. Di era digital saat ini, machine learning telah menjadi salah satu bidang yang paling cepat berkembang di dunia teknologi. Dari pengenalan pola sederhana hingga sistem pembelajaran mendalam (deep learning) yang kompleks, machine learning telah menjadi fondasi dari banyak inovasi teknologi modern, seperti pengenalan wajah, kendaraan otonom, asisten virtual, dan sistem rekomendasi (Bintoro dkk., 2024). Machine Learning terbagi menjadi 2 macam konsep pembelajaran, yaitu pertama Supervised Learning yang merupakan teknik machine learning yang membuat suatu fungsi berdasarkan data latihan yang sudah ada, dalam hal ini dapat dikatakan untuk teknik ini sudah tersedia data latihan secara detail dan terklasifikasi dengan baik yang akan dijadikan sebuah model data saat dilakukan proses uji coba dengan data tes yang baru dan menghasilkan hasil keluaran yang sesuai diharapkan sebelumnya berdasarkan data latihan yang ada. Kedua adalah Unsupervised Learning yang merupakan teknik machine learning yang berusaha untuk melakukan representasi pola sebuah input yang berasal dari data latihan dan salah satu yang menjadi perbedaan dengan Supervised Learning adalah tidak adanya pengklasifikasian dari input data. Dalam Machine Learning teknik Unsupervised Learning menjadi esensial karena sistem kerja yang diberikan sama dengan cara kerja otak manusia dimana dalam proses pembelajaran tidak ada role model atau informasi dan contoh yang tersedia untuk dijadikan sebagai model dalam melakukan proses uji coba untuk penyelesaian sebuah masalah dengan data yang baru (Fathurohman, 2021). Dalam mendukung transformasi digital, pengambilan keputusan terkait program vaksinasi, sanitasi, dan program kesehatan lainnya harus didukung dengan perangkat yang dapat mengolah data untuk menyajikan insight yang bersifat prediktif. Machine Learning dapat mengoptimalkan proses pengambilan keputusan dengan menyajikan insight yang bersifat prediktif dan berjalan secara otomatis. Pembelajaran mesin atau Machine Learning adalah studi berkelanjutan tentang konsep pengenalan pola dan pembelajaran komputasi dalam kecerdasan buatan yang menggunakan algoritma pembelajaran seperti diawasi dan tidak diawasi untuk memprediksi dan mendukung pengambilan keputusan otomatis berdasarkan sekumpulan data. Machine Learning tersebut dibangun dengan framework Data Preparation, serta framework Data Modelling yang dapat diluncurkan, dan berjalan secara otomatis (Wardhana, Wang, dan Sibuea., 2023).
Berdasarkan latar belakang tersebut, rumusan masalah yang dapat disimpulkan adalah: 1.Bagaimana memahami konsep dari berbagai jenis feature engineering pada R-Studio? 2.Bagaimana melakukan teknik feature engineering di program R-Studio?
Berdasarkan rumusan masalah tersebut, tujuan yang dapat disimpulkan adalah: 1.Mahasiswa memahami konsep dari berbagai jenis feature engineering pada R-Studio. 1.Mahasiswa dapat melakukan teknik feature engineering di program R-Studio.
Machine Learning adalah studi tentang algoritma untuk mempelajari bagaimana melakukan tugas-tugas tertentu yang dilakukan secara otomatis oleh orang-orang. Di sini, belajar mengacu pada kemampuan untuk melakukan berbagai kegiatan yang sudah ada atau untuk mengekstrapolasi kesimpulan baru dengan benar dari berbagai pola yang diamati sebelumnya. Salah satu subbidang kecerdasan buatan, Machine Learning, dapat berdampak pada sejumlah bidang lain, termasuk statistik, matematika, dan banyak bidang teoretis ilmu komputer. Intinya, tujuan machine learning adalah untuk mengembangkan algoritma yang dapat mengeksekusi sistem pembelajaran otonom dengan sangat sedikit masukan dari orang-orang pada umumnya. Berikut beberapa contoh algoritma dari konsep pembelajaran Supervised Learning dan Unsupervised Learning (Fathurohman, 2021): 1.Supervised Learning a.Logistic Regression: adalah strategi statistik yang dapat digunakan untuk memecahkan masalah dengan membuat prediksi variabel baru berdasarkan sejumlah variabel yang sudah ada dan yang ditentukan sebelumnya dan mencari korelasi antara variabel data input yang ditentukan sebelumnya dengan variabel prediksi baru. b.K-Nearest Neighbors Algorithm (KNN): memerlukan pembentukan ruang fitur di mana item yang menjadi data pelatihan dan model data diberi nilai berbobot dan direpresentasikan dalam vektor n-dimensi untuk menyelesaikan masalah klasifikasi. Kesulitan tersebut kemudian diselesaikan dengan menentukan jarak dari item baru yang dapat ditentukan menggunakan model data dalam vektor n-dimensi, dan objek baru tersebut kemudian diberikan kategori. 2.Unsupervised Learning a.Clustering: sebuah proses untuk membuat arketipe item yang digunakan dalam pembelajaran mesin untuk mengatasi tantangan seperti mengklasifikasikan atau mengkategorikan hal-hal ke dalam kelas atau kategori. Data yang digunakan sebagai model data belum membentuk kelompok data, sehingga tidak dapat mengidentifikasi klasifikasi suatu item. Akibatnya, pola dasar pertama-tama harus dibangun menggunakan sejumlah karakteristik yang diperlukan sebelum model data dan data pelatihan dapat digunakan. jika terjadi klasifikasi objek baru
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): A.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 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. B.Kardinalitas Kardinalitas merujuk pada jumlah nilai unik, atau label, yang terdapat dalam suatu variabel kategoris. Konsep ini digunakan untuk mengukur 2 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. C.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. D.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. E.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 independent 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. F.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. 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.
Adapun jenis data yang digunakan dalam penelitian ini berupa data kuantitatif. Data kuantitatif adalah jenis data yang dapat diukur (measurable) atau dihitung secara langsung sebagai variabel angka. Data kuantitatif disebut juga dikenal dengan data numerik. Sumber data yang digunakan dalam penelitian ini yaitu data sekunder. Data sekunder adalah data yang diperoleh secara tidak langsung oleh peneliti melainkan melalui prantara. Data sekunder dalam penelitian ini yaitu data yang diperoleh dari dari Asisten Prakrikum Machine Learning and Modern Prediction.
Variabel adalah objek penelitian atau apa yang menjadi titik perhatian Variabel yang digunakan dalam penelitian ini adalah variabel hujan, suhu, kelembapan, keadaan cuaca dan kecepatan angin.
Algoritma berdasarkan batasan masalah adalah: 1.Masukkan data. 2.Melakukan pemeriksaan dan preprocessing data. 3.Melakukan mode imputation. 4.Melakukan stratify splitting. 5.Melakukan standard scaler. 6.Melakukan interpolasi pada variabel keadaan_cuaca. 7.Melakukan capping pada data numerik. 8.Menangani imbalance data menggunakan SMOTE. 9.Menampilkan dan menginterpretasikan setiap output. 10.Kesimpulan.
Berikut ini library yang digunakan dan sintaks import data dari excel:
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
data <- read_excel("C:/Users/lenovo/Downloads/data curah hujan (1).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
Berdasarkan hasil tersebut, dataset terdiri atas 743 observasi dan lima variabel, yaitu Hujan, Suhu, Kelembapan, Keadaan_Cuaca, dan Kecepatan_Angin. Variabel Hujan memiliki nilai minimum 1 dan maksimum 2 sehingga menunjukkan bahwa variabel tersebut terdiri atas dua kelas. Variabel Suhu memiliki nilai antara 22,60 hingga 32,00 dengan rata-rata 26,54. Variabel Kelembapan memiliki nilai antara 52,00 hingga 100,00 dengan rata-rata 83,88. Sementara itu, Keadaan_Cuaca memiliki nilai minimum 1 dan maksimum 97 dengan rata-rata 15,11 serta terdapat 9 missing value. Variabel Kecepatan_Angin memiliki nilai minimum 2,00 dan maksimum 21,00 dengan rata-rata 6,655 serta memiliki 314 missing value. Hasil tersebut menunjukkan bahwa dataset memerlukan beberapa tahapan data preprocessing. Adanya missing value pada Keadaan_Cuaca dan Kecepatan_Angin menunjukkan perlunya dilakukan handling missing value. Rentang nilai pada variabel numerik perlu diperiksa untuk mengetahui keberadaan outlier, sehingga dilakukan handling outlier. Selanjutnya, perbedaan skala variabel numerik menjadi pertimbangan untuk melakukan scaling. Variabel Keadaan_Cuaca perlu diperiksa kardinalitasnya dan diubah ke bentuk numerik melalui encoding. Selain itu, distribusi kelas pada Hujan perlu diperiksa untuk mengetahui apakah terdapat imbalanced dataset. Oleh karena itu, statistik deskriptif menjadi dasar untuk menentukan tahapan data preprocessing yang dilakukan pada bagian selanjutnya.
Missing value merupakan kondisi ketika terdapat data yang tidak memiliki nilai pada suatu variabel. Berdasarkan hasil statistik deskriptif, variabel Hujan, Suhu, dan Kelembapan tidak memiliki missing value. Sementara itu, terdapat 9 missing value pada Keadaan_Cuaca dan 314 missing value pada Kecepatan_Angin. Sesuai dengan ketentuan praktikum untuk NPM genap, missing value pada Kecepatan_Angin ditangani menggunakan mode imputation, sedangkan missing value pada Keadaan_Cuaca ditangani menggunakan interpolasi.
Sintaks yang digunakan adalah sebagai berikut.
# Cek Missing Value
colSums(is.na(data))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 9 314
colMeans(is.na(data))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0.00000000 0.00000000 0.00000000 0.01211306 0.42261104
data %>% filter(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
# Penanganan Missing Value
data_dropna <- data %>% drop_na()
colSums(is.na(data_dropna))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 0 0
df_imp1 <- data %>% fill(Keadaan_Cuaca, .direction = "down")
colSums(is.na(df_imp1))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 0 314
df_imp2 <- data
df_imp2$Kecepatan_Angin[is.na(df_imp2$Kecepatan_Angin)] <- mean(
df_imp2$Kecepatan_Angin, na.rm = TRUE )
colSums(is.na(df_imp2))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 9 0
df_imp3 <- data
df_imp3$Kecepatan_Angin[is.na(df_imp3$Kecepatan_Angin)] <- median(
df_imp3$Kecepatan_Angin, na.rm = TRUE )
colSums(is.na(df_imp1))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 0 314
# Interpolasi
df_imp4 <- data
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 314
median_value <- median(df_imp4$Kecepatan_Angin, na.rm = TRUE)
df_imp4$Kecepatan_Angin[is.na(df_imp4$Kecepatan_Angin)] <- median_value
colSums(is.na(df_imp4))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 0 0
Fungsi colSums(is.na(data)) digunakan untuk mengetahui jumlah missing value pada setiap variabel. Fungsi colMeans(is.na(data)) digunakan untuk mengetahui proporsi missing value pada setiap variabel, sedangkan filter(if_any(…)) digunakan untuk menampilkan observasi yang memiliki setidaknya satu missing value. Hasil pemeriksaan awal menunjukkan bahwa terdapat 9 missing value pada Keadaan_Cuaca dan 314 missing value pada Kecepatan_Angin. Selain itu, terdapat 319 observasi yang memiliki setidaknya satu missing value. Proporsi missing value pada Keadaan_Cuaca sebesar 0,0121 atau sekitar 1,21%, sedangkan pada Kecepatan_Angin sebesar 0,4226 atau sekitar 42,26%. Selanjutnya, dilakukan mean imputation pada Kecepatan_Angin. Fungsi mean() digunakan untuk menghitung rata-rata nilai yang tersedia dengan mengabaikan missing value melalui na.rm = TRUE. Setelah proses tersebut dilakukan, seluruh missing value pada Kecepatan_Angin berhasil ditangani. Untuk Keadaan_Cuaca, dilakukan interpolasi menggunakan fungsi na.approx(). Interpolasi digunakan untuk memperkirakan nilai yang hilang berdasarkan nilai pengamatan yang tersedia di sekitarnya. Argumen rule = 2 digunakan agar nilai yang hilang pada bagian awal atau akhir data tetap dapat diisi berdasarkan nilai terdekat. Setelah dilakukan mode imputation dan interpolasi, hasil colSums(is.na(df_imp)) menunjukkan bahwa seluruh variabel sudah tidak memiliki missing value. Dengan demikian, permasalahan data hilang telah berhasil ditangani.
Berikut dilakukan Mode imputation pada data:
# Mode Imputation
df_imp5 <- data
modus <- names(sort(table(df_imp5$Kecepatan_Angin), decreasing = TRUE))[1]
df_imp5$Kecepatan_Angin[is.na(df_imp5$Kecepatan_Angin)] <- as.numeric(modus)
colSums(is.na(df_imp5))
## Hujan Suhu Kelembapan Keadaan_Cuaca Kecepatan_Angin
## 0 0 0 9 0
Berdasarkan hasil mode imputation, jumlah missing value pada variabel Hujan, Suhu, Kelembapan, dan Kecepatan_Angin adalah 0, sedangkan variabel Keadaan_Cuaca masih memiliki 9 missing value. Hal ini menunjukkan bahwa missing value pada variabel Kecepatan_Angin berhasil ditangani dengan mengisi nilai yang kosong menggunakan modus atau nilai yang paling sering muncul. Namun, masih terdapat 9 missing value pada variabel Keadaan_Cuaca, sehingga perlu dilakukan penanganan lebih lanjut.
Berikut ini dilakukan interpolasi pada data:
# Interpolasi
df_imp4 <- data
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 314
Berdasarkan hasil interpolasi menggunakan metode na.approx(), jumlah missing value pada variabel Keadaan_Cuaca berhasil berkurang dari 9 menjadi 0. Hal ini menunjukkan bahwa interpolasi berhasil mengisi nilai yang hilang pada variabel tersebut berdasarkan nilai numerik di sekitarnya. Namun, variabel Kecepatan_Angin memiliki 314 missing value, sehingga diperlukan penanganan lebih lanjut agar data siap digunakan pada tahap preprocessing berikutnya.
Berikut ini dilakukan stratify splitting pada data:
# Stratify
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_test)
## [1] 149 4
Berdasarkan hasil stratify splitting, diperoleh output dim(X_test) sebesar 149 baris dan 4 kolom. Hasil tersebut menunjukkan bahwa data testing terdiri atas 149 observasi dengan empat variabel prediktor, yaitu Suhu, Kelembapan, Keadaan_Cuaca, dan Kecepatan_Angin, sedangkan variabel Hujan tidak disertakan dalam data prediktor karena berperan sebagai variabel target yang akan diprediksi. Pada proses ini, dataset dibagi menjadi 80% data training dan 20% data testing menggunakan fungsi initial_split() dengan argumen strata = Hujan. Penggunaan stratifikasi bertujuan untuk mempertahankan proporsi kelas Hujan agar relatif seimbang antara data training dan data testing. Selanjutnya, fungsi training() dan testing() digunakan untuk memisahkan data, sedangkan select(-Hujan) digunakan untuk mengeluarkan variabel target dari data prediktor. Sementara itu, y_train dan y_test menyimpan nilai variabel Hujan sebagai target pada masing-masing bagian data. Dengan demikian, data training digunakan untuk proses pembentukan model machine learning, sedangkan data testing digunakan untuk menguji kemampuan model dalam melakukan prediksi terhadap data yang tidak digunakan selama pelatihan.
Berikut dilakukan deteksi outlier pada data:
## Handling Outlier
# Buat list fitur numerik
list_num <- c("Suhu", "Kelembapan", "Kecepatan_Angin")
# Siapkan wadah kosong untuk menampung hasil
list_outlier <- c()
list_lower_bound <- c()
list_upper_bound <- c()
# Hitung IQR untuk setiap kolom
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
# Tentukan batas bawah dan batas atas untuk outlier
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)
# Hitung jumlah outlier di bawah batas bawah dan di atas batas atas
num_outliers_lower <- sum(X_train[[i]] < lower_bound, na.rm = TRUE)
num_outliers_upper <- sum(X_train[[i]] > upper_bound, na.rm = TRUE)
# Jumlah total outlier
total_outliers <- num_outliers_lower + num_outliers_upper
list_outlier <- c(list_outlier, total_outliers)
}
# Mendefinisikan dataframe baru mengenai 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 0 -3.5000 16.5000
Berdasarkan hasil deteksi outlier menggunakan metode Interquartile Range (IQR), diperoleh bahwa variabel Suhu, Kelembapan, dan Kecepatan_Angin masing-masing memiliki jumlah outlier sebanyak 0. Pada variabel Suhu, batas bawah (Lower Bound) yang diperoleh sebesar 17,4625 dan batas atas (Upper Bound) sebesar 35,7625. Pada variabel Kelembapan, batas bawah sebesar 46,5000 dan batas atas sebesar 122,5000. Sementara itu, pada variabel Kecepatan_Angin, batas bawah sebesar -3,5000 dan batas atas sebesar 16,5000. Hasil tersebut menunjukkan bahwa tidak ditemukan pengamatan yang berada di luar batas bawah maupun batas atas pada ketiga variabel numerik yang diperiksa dalam data training. Dengan demikian, berdasarkan kriteria IQR yang digunakan, tidak ditemukan outlier pada variabel Suhu, Kelembapan, dan Kecepatan_Angin. Hasil deteksi ini menjadi dasar untuk mengevaluasi kebutuhan penanganan outlier sebelum data digunakan pada tahapan preprocessing berikutnya.
Berikut dilakukan capping pada data:
# 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
## Warning: Removed 250 rows containing non-finite outside the scale range
## (`stat_bin()`).
## Warning: Removed 250 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
##
## Kecepatan_Angin - After Capping
## Warning: Removed 250 rows containing non-finite outside the scale range (`stat_bin()`).
## Removed 250 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
Berdasarkan hasil penanganan outlier menggunakan fungsi Winsorize()
dengan membatasi nilai berdasarkan batas bawah dan batas atas IQR.
Berdasarkan plot histogram dan boxplot sebelum capping, variabel Suhu
menunjukkan sebaran data yang terkonsentrasi pada beberapa rentang suhu,
sedangkan Kelembapan didominasi oleh nilai kelembapan yang relatif
tinggi. Kedua variabel tersebut tidak memiliki outlier berdasarkan
metode IQR sehingga bentuk distribusinya relatif tidak berubah setelah
capping. Sementara itu, plot Kecepatan_Angin menunjukkan beberapa titik
di luar whisker boxplot yang menandakan adanya outlier. Setelah capping,
nilai Kecepatan_Angin dibatasi pada rentang 2,625–9,625 sehingga titik
ekstrem tidak lagi berada di luar batas tersebut. Dengan demikian,
capping terutama memengaruhi variabel Kecepatan_Angin dengan membatasi
nilai ekstrem tanpa menghapus observasi dari data.
Berikut dilakukan standard scaler pada data:
nilai_skew <- c()
nilai_skew_normal <- c()
for (i in list_num) {
skew_val <- skewness(
X_train_capped[[i]],
na.rm = TRUE
)
if (
skew_val >= -0.5 &&
skew_val <= 0.5
) {
nilai_skew_normal <-
c(nilai_skew_normal, i)
} else {
nilai_skew <-
c(nilai_skew, i)
}
}
cat(
"\nKolom untuk Standard Scaler:\n"
)
##
## Kolom untuk Standard Scaler:
print(nilai_skew_normal)
## [1] "Suhu" "Kecepatan_Angin"
cat(
"\nKolom dengan skewness tinggi:\n"
)
##
## Kolom dengan skewness tinggi:
print(nilai_skew)
## [1] "Kelembapan"
# ------------------------------------------------------------
# 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]
X_test_capped[[col]] <-
(
X_test_capped[[col]] -
mean_val[col]
) /
sd_val[col]
}
# ------------------------------------------------------------
# Robust Scaler untuk variabel skewed
# ------------------------------------------------------------
if (length(nilai_skew) > 0) {
median_val <- sapply(
X_train_capped[nilai_skew],
median,
na.rm = TRUE
)
iqr_val <- sapply(
X_train_capped[nilai_skew],
IQR,
na.rm = TRUE
)
for (col in nilai_skew) {
X_train_capped[[col]] <-
(
X_train_capped[[col]] -
median_val[col]
) /
iqr_val[col]
X_test_capped[[col]] <-
(
X_test_capped[[col]] -
median_val[col]
) /
iqr_val[col]
}
}
# Menyimpan hasil scaling
X_train_scale <- X_train_capped
X_test_scale <- X_test_capped
# Melihat hasil scaling
cat("\n--- HASIL STANDARD SCALER ---\n")
##
## --- HASIL STANDARD SCALER ---
print(
head(
X_train_scale[list_num]
)
)
## # A tibble: 6 × 3
## Suhu Kelembapan Kecepatan_Angin
## <dbl> <dbl> <dbl>
## 1 -1.39 0.474 NA
## 2 -1.00 0.211 NA
## 3 0.0947 -0.474 NA
## 4 1.19 -1.26 -1.41
## 5 1.66 -1.58 0.115
## 6 1.50 -1.53 0.725
# Mengecek mean
cat("\nMean setelah scaling:\n")
##
## Mean setelah scaling:
print(
sapply(
X_train_scale[nilai_skew_normal],
mean,
na.rm = TRUE
)
)
## Suhu Kecepatan_Angin
## -7.045562e-17 6.216024e-17
# Mengecek standar deviasi
cat("\nStandar deviasi setelah scaling:\n")
##
## Standar deviasi setelah scaling:
print(
sapply(
X_train_scale[nilai_skew_normal],
sd,
na.rm = TRUE
)
)
## Suhu Kecepatan_Angin
## 1 1
Pada tahap scaling data, variabel Suhu dan Kecepatan_Angin ditransformasikan menggunakan metode Standard Scaling, sedangkan variabel Kelembapan menggunakan median dan Interquartile Range (IQR). Proses ini bertujuan menyamakan skala data agar perbedaan rentang nilai antarvariabel tidak terlalu memengaruhi pemodelan. Hasil scaling menunjukkan bahwa Suhu dan Kecepatan_Angin memiliki rata-rata mendekati nol dan standar deviasi mendekati satu. Parameter scaling dihitung dari data latih, kemudian diterapkan pada data uji agar transformasi tetap konsisten.
Berikut dilakukan encoding dan SMOTE pada data:
## Encoding
# One Hot Encoder
library(recipes)
library(dplyr)
library(tidyr)
library(ggplot2)
library(themis)
# Memastikan variabel cuaca tersedia
stopifnot(
"Keadaan_Cuaca" %in% names(X_train_scale),
"Keadaan_Cuaca" %in% names(X_test_scale)
)
# Mengubah variabel cuaca menjadi faktor
X_train_scale$Keadaan_Cuaca <- factor(
X_train_scale$Keadaan_Cuaca
)
X_test_scale$Keadaan_Cuaca <- factor(
X_test_scale$Keadaan_Cuaca,
levels = levels(X_train_scale$Keadaan_Cuaca)
)
# Menentukan variabel kategorik
list_cat <- "Keadaan_Cuaca"
# Membuat recipe encoding
resep_encode <- recipe(
~ .,
data = X_train_scale
) %>%
step_dummy(
all_of(list_cat),
one_hot = TRUE
) %>%
prep(
training = X_train_scale
)
# Melakukan encoding
X_train_encoded <- bake(
resep_encode,
new_data = X_train_scale
)
X_test_encoded <- bake(
resep_encode,
new_data = X_test_scale
)
## Warning: ! There are new levels in `Keadaan_Cuaca`: NA.
## ℹ Consider using step_unknown() (`?recipes::step_unknown()`) before
## `step_dummy()` to handle missing values.
cat("\n--- HASIL ENCODING TRAINING ---\n")
##
## --- HASIL ENCODING TRAINING ---
print(head(X_train_encoded))
## # A tibble: 6 × 23
## Suhu Kelembapan Kecepatan_Angin Keadaan_Cuaca_X1 Keadaan_Cuaca_X2
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 -1.39 0.474 NA 0 0
## 2 -1.00 0.211 NA 1 0
## 3 0.0947 -0.474 NA 1 0
## 4 1.19 -1.26 -1.41 0 1
## 5 1.66 -1.58 0.115 1 0
## 6 1.50 -1.53 0.725 0 0
## # ℹ 18 more variables: Keadaan_Cuaca_X3 <dbl>, Keadaan_Cuaca_X5 <dbl>,
## # Keadaan_Cuaca_X10 <dbl>, Keadaan_Cuaca_X13 <dbl>, Keadaan_Cuaca_X14 <dbl>,
## # Keadaan_Cuaca_X15 <dbl>, Keadaan_Cuaca_X16 <dbl>, Keadaan_Cuaca_X17 <dbl>,
## # Keadaan_Cuaca_X21 <dbl>, Keadaan_Cuaca_X29 <dbl>, Keadaan_Cuaca_X60 <dbl>,
## # Keadaan_Cuaca_X61 <dbl>, Keadaan_Cuaca_X62 <dbl>, Keadaan_Cuaca_X63 <dbl>,
## # Keadaan_Cuaca_X65 <dbl>, Keadaan_Cuaca_X91 <dbl>, Keadaan_Cuaca_X95 <dbl>,
## # Keadaan_Cuaca_X97 <dbl>
cat("\n--- HASIL ENCODING TESTING ---\n")
##
## --- HASIL ENCODING TESTING ---
print(head(X_test_encoded))
## # A tibble: 6 × 23
## Suhu Kelembapan Kecepatan_Angin Keadaan_Cuaca_X1 Keadaan_Cuaca_X2
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1.74 -1.63 0.115 1 0
## 2 1.70 -1.47 1.03 0 1
## 3 -0.766 0.211 NA 0 1
## 4 -1.35 0.316 NA 0 1
## 5 1.85 -1.42 1.03 0 1
## 6 1.82 -1.16 1.03 0 1
## # ℹ 18 more variables: Keadaan_Cuaca_X3 <dbl>, Keadaan_Cuaca_X5 <dbl>,
## # Keadaan_Cuaca_X10 <dbl>, Keadaan_Cuaca_X13 <dbl>, Keadaan_Cuaca_X14 <dbl>,
## # Keadaan_Cuaca_X15 <dbl>, Keadaan_Cuaca_X16 <dbl>, Keadaan_Cuaca_X17 <dbl>,
## # Keadaan_Cuaca_X21 <dbl>, Keadaan_Cuaca_X29 <dbl>, Keadaan_Cuaca_X60 <dbl>,
## # Keadaan_Cuaca_X61 <dbl>, Keadaan_Cuaca_X62 <dbl>, Keadaan_Cuaca_X63 <dbl>,
## # Keadaan_Cuaca_X65 <dbl>, Keadaan_Cuaca_X91 <dbl>, Keadaan_Cuaca_X95 <dbl>,
## # Keadaan_Cuaca_X97 <dbl>
# MEMERIKSA MISSING VALUE
cat("\n--- MISSING VALUE TRAINING ---\n")
##
## --- MISSING VALUE TRAINING ---
print(colSums(is.na(X_train_encoded)))
## Suhu Kelembapan Kecepatan_Angin Keadaan_Cuaca_X1
## 0 0 250 0
## Keadaan_Cuaca_X2 Keadaan_Cuaca_X3 Keadaan_Cuaca_X5 Keadaan_Cuaca_X10
## 0 0 0 0
## Keadaan_Cuaca_X13 Keadaan_Cuaca_X14 Keadaan_Cuaca_X15 Keadaan_Cuaca_X16
## 0 0 0 0
## Keadaan_Cuaca_X17 Keadaan_Cuaca_X21 Keadaan_Cuaca_X29 Keadaan_Cuaca_X60
## 0 0 0 0
## Keadaan_Cuaca_X61 Keadaan_Cuaca_X62 Keadaan_Cuaca_X63 Keadaan_Cuaca_X65
## 0 0 0 0
## Keadaan_Cuaca_X91 Keadaan_Cuaca_X95 Keadaan_Cuaca_X97
## 0 0 0
cat("\n--- MISSING VALUE TESTING ---\n")
##
## --- MISSING VALUE TESTING ---
print(colSums(is.na(X_test_encoded)))
## Suhu Kelembapan Kecepatan_Angin Keadaan_Cuaca_X1
## 0 0 64 3
## Keadaan_Cuaca_X2 Keadaan_Cuaca_X3 Keadaan_Cuaca_X5 Keadaan_Cuaca_X10
## 3 3 3 3
## Keadaan_Cuaca_X13 Keadaan_Cuaca_X14 Keadaan_Cuaca_X15 Keadaan_Cuaca_X16
## 3 3 3 3
## Keadaan_Cuaca_X17 Keadaan_Cuaca_X21 Keadaan_Cuaca_X29 Keadaan_Cuaca_X60
## 3 3 3 3
## Keadaan_Cuaca_X61 Keadaan_Cuaca_X62 Keadaan_Cuaca_X63 Keadaan_Cuaca_X65
## 3 3 3 3
## Keadaan_Cuaca_X91 Keadaan_Cuaca_X95 Keadaan_Cuaca_X97
## 3 3 3
cat("\nJumlah NA pada y_train:\n")
##
## Jumlah NA pada y_train:
print(sum(is.na(y_train)))
## [1] 0
# MENANGANI MISSING VALUE
# Statistik imputasi dihitung dari data training
# Menangani prediktor numerik dengan median training
kolom_numerik <- names(X_train_encoded)[
sapply(X_train_encoded, is.numeric)
]
for (kol in kolom_numerik) {
nilai_median <- median(
X_train_encoded[[kol]],
na.rm = TRUE
)
if (is.finite(nilai_median)) {
X_train_encoded[[kol]][
is.na(X_train_encoded[[kol]])
] <- nilai_median
X_test_encoded[[kol]][
is.na(X_test_encoded[[kol]])
] <- nilai_median
}
}
# Memeriksa kembali missing value
cat("\n--- MISSING VALUE SETELAH IMPUTASI ---\n")
##
## --- MISSING VALUE SETELAH IMPUTASI ---
print(colSums(is.na(X_train_encoded)))
## Suhu Kelembapan Kecepatan_Angin Keadaan_Cuaca_X1
## 0 0 0 0
## Keadaan_Cuaca_X2 Keadaan_Cuaca_X3 Keadaan_Cuaca_X5 Keadaan_Cuaca_X10
## 0 0 0 0
## Keadaan_Cuaca_X13 Keadaan_Cuaca_X14 Keadaan_Cuaca_X15 Keadaan_Cuaca_X16
## 0 0 0 0
## Keadaan_Cuaca_X17 Keadaan_Cuaca_X21 Keadaan_Cuaca_X29 Keadaan_Cuaca_X60
## 0 0 0 0
## Keadaan_Cuaca_X61 Keadaan_Cuaca_X62 Keadaan_Cuaca_X63 Keadaan_Cuaca_X65
## 0 0 0 0
## Keadaan_Cuaca_X91 Keadaan_Cuaca_X95 Keadaan_Cuaca_X97
## 0 0 0
# Hentikan proses jika masih ada NA
if (anyNA(X_train_encoded)) {
stop(
"Masih ada NA pada prediktor training. Periksa kolomnya."
)
}
if (anyNA(y_train)) {
stop(
"Target y_train masih memiliki NA. Periksa data target."
)
}
if (anyNA(X_test_encoded)) {
stop(
"Masih ada NA pada data testing. Periksa kolomnya."
)
}
# DISTRIBUSI KELAS SEBELUM SMOTE
cat("\n--- DISTRIBUSI KELAS SEBELUM SMOTE ---\n")
##
## --- DISTRIBUSI KELAS SEBELUM SMOTE ---
print(table(y_train))
## y_train
## 1 2
## 131 463
cat("\nProporsi kelas sebelum SMOTE:\n")
##
## Proporsi kelas sebelum SMOTE:
print(prop.table(table(y_train)))
## y_train
## 1 2
## 0.2205387 0.7794613
# MENGGABUNGKAN PREDIKTOR DAN TARGET
train_full <- X_train_encoded %>%
mutate(Hujan = factor(y_train))
# Pastikan target mempunyai minimal dua kelas
if (nlevels(droplevels(train_full$Hujan)) < 2) {
stop("SMOTE membutuhkan minimal dua kelas pada target.")
}
train_full$Hujan <- droplevels(train_full$Hujan)
# Pastikan seluruh prediktor numerik
if (!all(sapply(
train_full %>% select(-Hujan),
is.numeric
))) {
stop("Semua prediktor untuk SMOTE harus berupa numerik.")
}
# BALANCING MENGGUNAKAN 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
# DISTRIBUSI KELAS SETELAH SMOTE
cat("\n--- DISTRIBUSI KELAS SETELAH SMOTE ---\n")
##
## --- DISTRIBUSI KELAS SETELAH SMOTE ---
print(table(y_train_balanced))
## y_train_balanced
## 1 2
## 463 463
cat("\nProporsi kelas setelah SMOTE:\n")
##
## Proporsi kelas setelah SMOTE:
print(prop.table(table(y_train_balanced)))
## y_train_balanced
## 1 2
## 0.5 0.5
# VISUALISASI SEBELUM DAN SESUDAH SMOTE
par(mfrow = c(1, 2))
barplot(
table(y_train),
main = "Sebelum SMOTE",
xlab = "Kelas Hujan",
ylab = "Frekuensi",
col = "skyblue"
)
barplot(
table(y_train_balanced),
main = "Setelah SMOTE",
xlab = "Kelas Hujan",
ylab = "Frekuensi",
col = "lightgreen"
)
par(mfrow = c(1, 1))
# HASIL AKHIR PREPROCESSING
cat("\n============================================\n")
##
## ============================================
cat(" HASIL AKHIR PREPROCESSING\n")
## HASIL AKHIR PREPROCESSING
cat("============================================\n")
## ============================================
cat("Jumlah data awal:",
nrow(data), "\n")
## Jumlah data awal: 743
cat("Data training awal:",
nrow(X_train), "\n")
## Data training awal: 594
cat("Data testing:",
nrow(X_test), "\n")
## Data testing: 149
cat("Data training setelah SMOTE:",
nrow(X_train_balanced), "\n")
## Data training setelah SMOTE: 926
cat("Jumlah fitur setelah encoding:",
ncol(X_train_encoded), "\n")
## Jumlah fitur setelah encoding: 23
cat("\nDistribusi kelas sebelum SMOTE:\n")
##
## Distribusi kelas sebelum SMOTE:
print(table(y_train))
## y_train
## 1 2
## 131 463
cat("\nDistribusi kelas setelah SMOTE:\n")
##
## Distribusi kelas setelah SMOTE:
print(table(y_train_balanced))
## y_train_balanced
## 1 2
## 463 463
Berdasarkan hasil, variabel kategorik Keadaan_Cuaca diubah menjadi beberapa variabel biner menggunakan metode One-Hot Encoding. Berdasarkan hasil pengolahan, terbentuk 10 variabel dummy, yaitu X0 hingga X9, yang mewakili kategori cuaca. Setiap variabel dummy menunjukkan ada atau tidaknya suatu kategori pada observasi, sehingga data kategorik dapat digunakan dalam proses pemodelan. Dengan demikian, encoding membantu mengubah informasi cuaca menjadi format numerik tanpa memberikan urutan tertentu pada setiap kategori Dilakukan penyeimbangan kelas variabel target Hujan menggunakan metode Synthetic Minority Over-sampling Technique (SMOTE). Sebelum balancing, kelas 1 berjumlah 131 observasi, sedangkan kelas 2 berjumlah 463 observasi, sehingga distribusi kelas tidak seimbang. Setelah SMOTE diterapkan dengan over_ratio = 1 dan neighbors = 5, jumlah masing-masing kelas menjadi 463 observasi, dengan total 926 observasi pada data latih. Hal ini terlihat pada plot setelah balancing, ketika jumlah kedua kelas menjadi sama. Proses ini bertujuan mengurangi ketidakseimbangan kelas agar model dapat mempelajari kedua kelas dengan lebih baik. Balancing hanya diterapkan pada data latih, sedangkan data uji tetap dipertahankan agar evaluasi model lebih objektif.
Machine Learning adalah studi tentang algoritma untuk mempelajari bagaimana melakukan tugas-tugas tertentu yang dilakukan secara otomatis oleh orang-orang. Di sini, belajar mengacu pada kemampuan untuk melakukan berbagai kegiatan yang sudah ada atau untuk mengekstrapolasi kesimpulan baru dengan benar dari berbagai pola yang diamati sebelumnya. Salah satu subbidang kecerdasan buatan, Machine Learning, dapat berdampak pada sejumlah bidang lain, termasuk statistik, matematika, dan banyak bidang teoretis ilmu komputer. Intinya, tujuan machine learning adalah untuk mengembangkan algoritma yang dapat mengeksekusi sistem pembelajaran otonom dengan sangat sedikit masukan dari orang-orang pada umumnya. 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. Berdasarkan hasil yang didapatkan, data curah hujan yang terdiri atas 743 observasi dan 5 variabel telah melalui tahapan prapemrosesan untuk mempersiapkan data sebelum dilakukan pemodelan machine learning. Hasil pemeriksaan awal menunjukkan bahwa variabel Keadaan_Cuaca memiliki 9 missing value, sedangkan Kecepatan_Angin memiliki 314 missing value. Selanjutnya, dilakukan pembagian data menggunakan metode stratify splitting dengan proporsi 80% data latih dan 20% data uji, yang menghasilkan 149 observasi dan 4 variabel prediktor pada data uji. Berdasarkan deteksi outlier menggunakan metode IQR, variabel Suhu, Kelembapan, dan Kecepatan_Angin masing-masing memiliki 0 pencilan. Oleh karena itu, proses capping pada Kecepatan_Angin tidak mengubah nilai data apabila seluruh pengamatan berada dalam batas yang telah ditentukan. Tahapan berikutnya meliputi standardisasi untuk menyamakan skala variabel numerik, encoding untuk mengubah variabel kategorik menjadi bentuk numerik, serta penerapan SMOTE untuk mengatasi ketidakseimbangan kelas pada data latih. Dengan demikian, rangkaian prapemrosesan ini diharapkan dapat menghasilkan data yang lebih terstruktur dan siap digunakan dalam tahap pemodelan serta evaluasi kinerja model machine learning.
Bintoro, P., Ratnasari., Wihardjo, E., Putri, I, P., Asari, A. (2024). Pengantar Machine Learning. Fathurohman, A. (2021). Machine Learning Untuk Pendidikan: Mengapa Dan Bagaimana. JURNAL JITEK, Vol 1 No. 3 November (2021), Hal 57-62. Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Laboratorium Statistika, Universitas Bengkulu. Wardhana, R. G., Wang, G., Sibuea, F. (2023). Penerapan Machine Learning Dalam Prediksi Tingkat Kasus Penyakit Di Indonesia. Journal of Information System Management (JOISM), Vol. 5, No. 1 (2023).