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