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")
