BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Tuliskan latar belakang penelitian di sini.

1.2 Rumusan Masalah

Tuliskan pertanyaan penelitian yang ingin dijawab.

1.3 Tujuan

Tuliskan tujuan penelitian .

BAB II TINJAUAN PUSTAKA

2.1 Landasan Teori 1

Jelaskan teori pertama yang mendukung penelitian ini. pada sintaks baris ke-91 itu include_grahics(“masukkan nama file gambarnya”) pastikan file gambar dan file rmd ini berada dalam 1 folder yang sama.

Berikut contoh menampilkan gambar dari komputer pribadi:

Gambar 1. Contoh encoding kategori

Gambar 1. Contoh encoding kategori

Gambar 2. Perbandingan metode scaling

Gambar 2. Perbandingan metode scaling

2.2 Landasan Teori 2

pagar 1 untuk judul besar, pagar 2 untuk sub judul. kalo mau nambahkan equation gunakan dolarnya 1 je untuk inline seperti ini contohnya \(a=5%\) sedangkan kalo mau equationnya ditengah itu gunakan tanda dollar sebanyak 2 seperti contoh dibawah ini.

\[ I = \frac{n}{W} \frac{\sum_i \sum_j w_{ij}(x_i - \bar{x})(x_j - \bar{x})}{\sum_i (x_i - \bar{x})^2} \] sedangkan untuk tulisan italik gunain tanda * 1 saja. contoh ini teksnya akan jadi italik.

untuk menulis sintaks R nya teman-teman bisa mengklik huruf C yang warna hijau nggak jauh dari tab run dan disebalh tanda arah atas

BAB III METODE PENELITIAN

3.1 Sumber Data

seperti biasa tuliskan disini ya

3.2 Variabel Penelitian

Daftar dan definisikan setiap variabel yang digunakan

3.3 Langkah-langkah Analisis

Jelaskan prosedur analisis mulai dari tahap awal hingga akhir.

BAB IV HASIL DAN PEMBAHASAN

4.1 Library

kolom kotak abu ini bagian tempat kalian menuliskan sintaksnya ya, sedangkan tombol pause warna hijau dikanan atas itu untuk runingnya tapi bisa jg makai ctrl+enter

library(zoo) 
## Warning: package 'zoo' was built under R version 4.5.3
## 
## 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.5.3
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.5.3
## Warning: package 'ggplot2' was built under R version 4.5.3
## Warning: package 'tibble' was built under R version 4.5.3
## Warning: package 'tidyr' was built under R version 4.5.3
## Warning: package 'readr' was built under R version 4.5.3
## Warning: package 'purrr' was built under R version 4.5.3
## Warning: package 'dplyr' was built under R version 4.5.3
## Warning: package 'stringr' was built under R version 4.5.3
## Warning: package 'forcats' was built under R version 4.5.3
## Warning: package 'lubridate' was built under R version 4.5.3
## ── 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.5.3
library(e1071)
## Warning: package 'e1071' was built under R version 4.5.3
## 
## 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.5.3
library(dplyr)
library(ggplot2)
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.5.3
## 
## Attaching package: 'gridExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
library(recipes)
## Warning: package 'recipes' was built under R version 4.5.3
## 
## 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.5.3
library(caret)
## Warning: package 'caret' was built under R version 4.5.3
## 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/USER/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 ...

jangan lupa jelaskan statistik deskriptifnya itu apa maksudnya ya.apa yang dibutuhkan untuk Data preprocessing.

4.2 Handling Missing Value

# 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

4.3 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               6
##  2     1  24           90             1               6
##  3     1  26.8         77             1               6
##  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
bins <- c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
labels <- 0:9

df_imp4$Keadaan_Cuaca_reduced <- cut(
  df_imp4$Keadaan_Cuaca,
  breaks = bins,
  labels = labels,
  right = TRUE,
  include.lowest = TRUE
)

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  30.4         68             2              11 0                    
##  2     2  25.4         89             2               6 0                    
##  3     2  25.7         92            13               6 1                    
##  4     2  25.5         90             2               7 0                    
##  5     2  23.9         97            95               6 9                    
##  6     2  26.4         89             2               6 0                    
##  7     2  23.5         98            21               6 2                    
##  8     1  23.5         98            61               5 6                    
##  9     2  25.7         86             2               3 0                    
## 10     1  23.8         97            91               6 9
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

4.4 Splitting Data

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   5
## samakan level Keadaan_Cuaca_reduced
all_levels <- levels(df_imp4$Keadaan_Cuaca_reduced)

X_train$Keadaan_Cuaca_reduced <- factor(X_train$Keadaan_Cuaca_reduced, levels = all_levels)
X_test$Keadaan_Cuaca_reduced  <- factor(X_test$Keadaan_Cuaca_reduced,  levels = all_levels)

4.5 Handling Outlier

## 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            106      2.6250      9.6250
df_num <- X_train[, list_num]
nilai_skew <- c()
nilai_skew_normal <- c()

for (i in colnames(df_num)) {
  skew_val <- skewness(X_train[[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("kolom yang mempunyai nilai skewness sedang :", nilai_skew, "\n")
## kolom yang mempunyai nilai skewness sedang : Kelembapan Kecepatan_Angin
cat("kolom yang mempunyai nilai skewness normal :", nilai_skew_normal, "\n")
## kolom yang mempunyai nilai skewness normal : Suhu
outliers_indexed <- outliers %>% filter(Kolom == "Kecepatan_Angin")
lower_kecepatan <- outliers_indexed$Lower_Bound
upper_kecepatan <- outliers_indexed$Upper_Bound

outliers_KecepAngin <- ifelse(
  X_train$Kecepatan_Angin > upper_kecepatan, TRUE,
  ifelse(X_train$Kecepatan_Angin < lower_kecepatan, TRUE, FALSE)
)

# Trimming
X_train_trimmed1 <- X_train[!outliers_KecepAngin, ]

cat("Size dataset - Before trimming :", dim(X_train), "\n")
## Size dataset - Before trimming : 594 5
cat("Size dataset - After trimming  :", dim(X_train_trimmed1), "\n")
## Size dataset - After trimming  : 488 5
# 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

4.6 Scalling Data

## Scalling
nilai_skew <- c()
nilai_skew_normal <- c()

for (i in colnames(df_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("kolom yang mempunyai nilai skewness sedang :", nilai_skew, "\n")
## kolom yang mempunyai nilai skewness sedang : Kelembapan
cat("kolom yang mempunyai nilai skewness normal :", nilai_skew_normal, "\n")
## kolom yang mempunyai nilai skewness normal : Suhu Kecepatan_Angin
# 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]
}

# Robust scaler
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]
}
for (col in nilai_skew) {
  X_test_capped[[col]] <- (X_test_capped[[col]] - median_val[col]) / iqr_val[col]
}

X_train_scale <- X_train_capped
X_test_scale <- X_test_capped

4.7 Encoding

## Encoding - One Hot Encoder
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)

X_train_encoded
## # A tibble: 594 × 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                        1                        0                        0
##  8                        1                        0                        0
##  9                        1                        0                        0
## 10                        1                        0                        0
## # ℹ 584 more rows
## # ℹ 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>
X_test_encoded
## # A tibble: 149 × 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                        1                        0                        0
##  8                        1                        0                        0
##  9                        1                        0                        0
## 10                        0                        0                        0
## # ℹ 139 more rows
## # ℹ 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>

BAB V KESIMPULAN

5.1 Kesimpulan

tuliskan kesimpulan apa yang bisa diambil dari hasil processing data tersebut

DAFTAR PUSTAKA

Kalian bisa buat referensi seperti laporan praktikum biasa dengan menggunakan word terus ditempelkan kesini atau bisa juga menggunakan sistasi langsung dari rmaakrdown ini.