library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.2
##
## 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
# Preprocess dan Akses Data
data_awal <- starwars
data_bersih <- data_awal %>% na.omit()
data_terpilih <- data_bersih %>% select(height, mass)
# Tampilan beberapa baris pertama data
head(data_terpilih)
## # A tibble: 6 × 2
## height mass
## <int> <dbl>
## 1 172 77
## 2 202 136
## 3 150 49
## 4 178 120
## 5 165 75
## 6 183 84
str(data_terpilih)
## tibble [29 × 2] (S3: tbl_df/tbl/data.frame)
## $ height: int [1:29] 172 202 150 178 165 183 182 188 228 180 ...
## $ mass : num [1:29] 77 136 49 120 75 84 77 84 112 80 ...
## - attr(*, "na.action")= 'omit' Named int [1:58] 2 3 8 12 15 16 18 19 22 27 ...
## ..- attr(*, "names")= chr [1:58] "2" "3" "8" "12" ...
summary(data_terpilih)
## height mass
## Min. : 88.0 Min. : 20.00
## 1st Qu.:172.0 1st Qu.: 75.00
## Median :180.0 Median : 79.00
## Mean :178.7 Mean : 77.77
## 3rd Qu.:188.0 3rd Qu.: 83.00
## Max. :228.0 Max. :136.00
# Eksplorasi Data dan Pencarian Pencilan
# Visualisasi Awal
hist(data_terpilih$height, main = "Histogram Tinggi", xlab = "Tinggi")

boxplot(data_terpilih$height, main = "Boxplot Tinggi")

hist(data_terpilih$mass, main = "Histogram Massa", xlab = "Massa")

boxplot(data_terpilih$mass, main = "Boxplot Massa")

# Metode IQR untuk Tinggi
Q1_height <- quantile(data_terpilih$height, 0.25)
Q3_height <- quantile(data_terpilih$height, 0.75)
IQR_height <- Q3_height - Q1_height
lower_bound_height_iqr <- Q1_height - 1.5 * IQR_height
upper_bound_height_iqr <- Q3_height + 1.5 * IQR_height
outliers_height_iqr <- data_terpilih$height[data_terpilih$height < lower_bound_height_iqr | data_terpilih$height > upper_bound_height_iqr]
cat("Pencilan Tinggi (IQR):\n", outliers_height_iqr, "\n\n")
## Pencilan Tinggi (IQR):
## 228 88
# Metode IQR untuk Massa
Q1_mass <- quantile(data_terpilih$mass, 0.25)
Q3_mass <- quantile(data_terpilih$mass, 0.75)
IQR_mass <- Q3_mass - Q1_mass
lower_bound_mass_iqr <- Q1_mass - 1.5 * IQR_mass
upper_bound_mass_iqr <- Q3_mass + 1.5 * IQR_mass
outliers_mass_iqr <- data_terpilih$mass[data_terpilih$mass < lower_bound_mass_iqr | data_terpilih$mass > upper_bound_mass_iqr]
cat("Pencilan Massa (IQR):\n", outliers_mass_iqr, "\n\n")
## Pencilan Massa (IQR):
## 136 49 120 112 113 20 45 55 56.2 50
# Metode Z-score untuk Tinggi
mean_height <- mean(data_terpilih$height)
sd_height <- sd(data_terpilih$height)
zscore_height <- abs((data_terpilih$height - mean_height) / sd_height)
outliers_z_height <- data_terpilih$height[zscore_height > 3]
cat("Pencilan Tinggi (Z-score > 3):\n", outliers_z_height, "\n\n")
## Pencilan Tinggi (Z-score > 3):
## 88
# Metode Z-score untuk Massa (dengan ambang batas 3)
mean_mass <- mean(data_terpilih$mass)
sd_mass <- sd(data_terpilih$mass)
zscore_mass <- abs((data_terpilih$mass - mean_mass) / sd_mass)
outliers_z_mass <- data_terpilih$mass[zscore_mass > 3]
cat("Pencilan Massa (Z-score > 3):\n", outliers_z_mass, "\n\n")
## Pencilan Massa (Z-score > 3):
##
# 3. Trimmed Mean
alpha <- 0.15
trimmed_mean_height <- mean(data_terpilih$height, trim = alpha)
cat("Trimmed Mean Tinggi (alpha =", alpha, "):", trimmed_mean_height, "\n")
## Trimmed Mean Tinggi (alpha = 0.15 ): 180.381
trimmed_mean_mass <- mean(data_terpilih$mass, trim = alpha)
cat("Trimmed Mean Massa (alpha =", alpha, "):", trimmed_mean_mass, "\n\n")
## Trimmed Mean Massa (alpha = 0.15 ): 76.68571
# 4. Penambahan Amatan Baru dan Deteksi Pencilan
# Tambahkan amatan baru
data_terpilih_baru <- rbind(data_terpilih, data.frame(height = 210, mass = 100))
tail(data_terpilih_baru)
## # A tibble: 6 × 2
## height mass
## <dbl> <dbl>
## 1 188 80
## 2 170 56.2
## 3 166 50
## 4 193 80
## 5 183 79
## 6 210 100
# Hitung ulang batas IQR dengan data baru
Q1_height_baru <- quantile(data_terpilih_baru$height, 0.25)
Q3_height_baru <- quantile(data_terpilih_baru$height, 0.75)
IQR_height_baru <- Q3_height_baru - Q1_height_baru
lower_bound_height_iqr_baru <- Q1_height_baru - 1.5 * IQR_height_baru
upper_bound_height_iqr_baru <- Q3_height_baru + 1.5 * IQR_height_baru
Q1_mass_baru <- quantile(data_terpilih_baru$mass, 0.25)
Q3_mass_baru <- quantile(data_terpilih_baru$mass, 0.75)
IQR_mass_baru <- Q3_mass_baru - Q1_mass_baru
lower_bound_mass_iqr_baru <- Q1_mass_baru - 1.5 * IQR_mass_baru
upper_bound_mass_iqr_baru <- Q3_mass_baru + 1.5 * IQR_mass_baru
# Cek apakah amatan baru adalah pencilan berdasarkan batas IQR yang baru
new_height <- 210
new_mass <- 100
is_outlier_height_new_iqr <- (new_height < lower_bound_height_iqr_baru | new_height > upper_bound_height_iqr_baru)
cat("Apakah tinggi baru (", new_height, ") adalah pencilan (IQR)?", is_outlier_height_new_iqr, "\n")
## Apakah tinggi baru ( 210 ) adalah pencilan (IQR)? FALSE
is_outlier_mass_new_iqr <- (new_mass < lower_bound_mass_iqr_baru | new_mass > upper_bound_mass_iqr_baru)
cat("Apakah massa baru (", new_mass, ") adalah pencilan (IQR)?", is_outlier_mass_new_iqr, "\n")
## Apakah massa baru ( 100 ) adalah pencilan (IQR)? TRUE
# Hitung ulang Z-score dengan data baru
mean_height_baru <- mean(data_terpilih_baru$height)
sd_height_baru <- sd(data_terpilih_baru$height)
zscore_height_baru_obs <- abs((new_height - mean_height_baru) / sd_height_baru)
is_outlier_z_height_baru <- (zscore_height_baru_obs > 3)
cat("Apakah tinggi baru (", new_height, ") adalah pencilan (Z-score > 3)?", is_outlier_z_height_baru, "\n")
## Apakah tinggi baru ( 210 ) adalah pencilan (Z-score > 3)? FALSE
mean_mass_baru <- mean(data_terpilih_baru$mass)
sd_mass_baru <- sd(data_terpilih_baru$mass)
zscore_mass_baru_obs <- abs((new_mass - mean_mass_baru) / sd_mass_baru)
is_outlier_z_mass_baru <- (zscore_mass_baru_obs > 3)
cat("Apakah massa baru (", new_mass, ") adalah pencilan (Z-score > 3)?", is_outlier_z_mass_baru, "\n")
## Apakah massa baru ( 100 ) adalah pencilan (Z-score > 3)? FALSE