library(ggplot2)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.4.3
# Memuat dataset diamonds
data("diamonds")

# Melihat beberapa baris pertama dari dataset
head(diamonds)
## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
## 2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
## 3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
## 4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
## 5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
## 6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
# Menambahkan missing values pada kolom price secara acak
set.seed(123)
diamonds$price[sample(1:nrow(diamonds), 100)] <- NA

# Mengecek apakah ada missing values
sum(is.na(diamonds$price))  # Menampilkan jumlah missing values pada kolom 'price'
## [1] 100
# Mengganti missing values dengan median dari kolom price
diamonds$price[is.na(diamonds$price)] <- median(diamonds$price, na.rm = TRUE)

# Memastikan tidak ada missing values lagi
sum(is.na(diamonds$price))
## [1] 0
# Menghitung IQR untuk kolom 'carat'
Q1 <- quantile(diamonds$carat, 0.25)
Q3 <- quantile(diamonds$carat, 0.75)
IQR <- Q3 - Q1

# Menentukan batas bawah dan atas untuk mendeteksi outlier
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR

# Menandai data yang merupakan outlier
outliers <- diamonds$carat < lower_bound | diamonds$carat > upper_bound
sum(outliers)  # Jumlah outliers
## [1] 1889
# Menampilkan boxplot untuk visualisasi outliers
boxplot(diamonds$carat, main = "Boxplot Carat", col = "lightblue")

# Winsorizing: Mengganti nilai outlier dengan batas
diamonds$carat[outliers] <- ifelse(diamonds$carat[outliers] < lower_bound, lower_bound, upper_bound)

# Cek lagi jumlah outliers
sum(diamonds$carat < lower_bound | diamonds$carat > upper_bound)
## [1] 0
# Menampilkan boxplot untuk visualisasi outliers setelah ditangani
boxplot(diamonds$carat, main = "Boxplot Carat", col = "lightblue")

# Mengecek apakah ada duplikasi
sum(duplicated(diamonds))  # Jumlah baris yang duplikat
## [1] 145
# Menghapus baris duplikat
diamonds <- diamonds[!duplicated(diamonds), ]

# Memastikan tidak ada duplikasi
sum(duplicated(diamonds))
## [1] 0
# Melihat ringkasan statistik setelah preprocessing
summary(diamonds)
##      carat               cut        color        clarity          depth      
##  Min.   :0.2000   Fair     : 1598   D: 6755   SI1    :13032   Min.   :43.00  
##  1st Qu.:0.4000   Good     : 4891   E: 9776   VS2    :12229   1st Qu.:61.00  
##  Median :0.7000   Very Good:12069   F: 9520   SI2    : 9150   Median :61.80  
##  Mean   :0.7925   Premium  :13748   G:11262   VS1    : 8156   Mean   :61.75  
##  3rd Qu.:1.0400   Ideal    :21489   H: 8272   VVS2   : 5057   3rd Qu.:62.50  
##  Max.   :2.0000                     I: 5407   VVS1   : 3647   Max.   :79.00  
##                                     J: 2803   (Other): 2524                  
##      table           price             x                y         
##  Min.   :43.00   Min.   :  326   Min.   : 0.000   Min.   : 0.000  
##  1st Qu.:56.00   1st Qu.:  953   1st Qu.: 4.710   1st Qu.: 4.720  
##  Median :57.00   Median : 2401   Median : 5.700   Median : 5.710  
##  Mean   :57.46   Mean   : 3930   Mean   : 5.731   Mean   : 5.735  
##  3rd Qu.:59.00   3rd Qu.: 5316   3rd Qu.: 6.540   3rd Qu.: 6.540  
##  Max.   :95.00   Max.   :18823   Max.   :10.740   Max.   :58.900  
##                                                                   
##        z         
##  Min.   : 0.000  
##  1st Qu.: 2.910  
##  Median : 3.530  
##  Mean   : 3.539  
##  3rd Qu.: 4.030  
##  Max.   :31.800  
## 
# Visualisasi distribusi kolom 'carat' setelah winsorizing
ggplot(diamonds, aes(x = carat)) +
  geom_histogram(bins = 30, fill = "lightblue", color = "black") +
  labs(title = "Distribusi Carat setelah Winsorizing")