Memanggil dataset starwars pada library dplyr
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.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
data <- starwars
head(data)
## # A tibble: 6 × 14
## name height mass hair_color skin_color eye_color birth_year sex gender
## <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 Luke Sky… 172 77 blond fair blue 19 male mascu…
## 2 C-3PO 167 75 <NA> gold yellow 112 none mascu…
## 3 R2-D2 96 32 <NA> white, bl… red 33 none mascu…
## 4 Darth Va… 202 136 none white yellow 41.9 male mascu…
## 5 Leia Org… 150 49 brown light brown 19 fema… femin…
## 6 Owen Lars 178 120 brown, gr… light blue 52 male mascu…
## # ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
## # vehicles <list>, starships <list>
Buang amatan yang memiliki missing value
data = data %>% na.omit()
Ambil data nama, height, dan mass saja dengan menggunakan select()
data_selected <- data %>% select("name", "height", "mass")
head(data_selected)
## # A tibble: 6 × 3
## name height mass
## <chr> <int> <dbl>
## 1 Luke Skywalker 172 77
## 2 Darth Vader 202 136
## 3 Leia Organa 150 49
## 4 Owen Lars 178 120
## 5 Beru Whitesun Lars 165 75
## 6 Biggs Darklighter 183 84
#mengambil masing-masing data height dan mass untuk dilakukan analisis
height <- as.numeric(data_selected$height)
mass <- as.numeric(data_selected$mass)
#menghitung rata-rata dari height dan mass
rata_h <- mean(height)
rata_m <- mean(mass)
rata_h
## [1] 178.6552
rata_m
## [1] 77.77241
#menhitung simpangan baku dari height dan mass
sd_h <- sd(height)
sd_m <- sd(mass)
sd_h
## [1] 22.39942
sd_m
## [1] 23.08585
#membuat histogram untuk melihat sebaran data
hist(height)
hist(mass)
#memeriksa apakah data mengikuti sebaran normal
qqnorm(height, col = 'blue')
qqline(height)
qqnorm(mass, col = 'blue')
qqline(mass)
#memeriksa apakah data mengikuti sebaran normal, jika p-value kurang dari 0,05 maka data tidak mengikuti sebaran normal
#untuk height, rata-ratanya 178,66 dan simpangan bakunya 22,40
ks.test(height, "pnorm", 178.66, 22.40)
## Warning in ks.test.default(height, "pnorm", 178.66, 22.4): ties should not be
## present for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: height
## D = 0.21159, p-value = 0.149
## alternative hypothesis: two-sided
#untuk mass, rata-ratanya 77,77 dan simpangan bakunya 23,09
ks.test(mass, "pnorm", 77.77, 23.09)
## Warning in ks.test.default(mass, "pnorm", 77.77, 23.09): ties should not be
## present for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: mass
## D = 0.25572, p-value = 0.04506
## alternative hypothesis: two-sided
Kesimpulannya, pada taraf nyata 5%, data height menyebar dengan sebaran normal sementara data mass tidak menyebar dengan sebaran normal.
#memerikas apkaah data mass mengikuti sebaran chi~squared dengan menggunakan KS Test
ks.test(mass, "pchisq", 77.77)
## Warning in ks.test.default(mass, "pchisq", 77.77): ties should not be present
## for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: mass
## D = 0.19067, p-value = 0.2424
## alternative hypothesis: two-sided
Kesimpulannya, pada taraf nyata 5%, data mass menyebar dengan sebaran chi-square. ## b. pendeteksian pencilan
#membuat boxplot dari data height dan mass
boxplot(height, main = "Boxplot dari height")
boxplot(mass, main = "Boxplot dari mass")
#mencari pencilan pada daata height dengan menggunakan IQR
boxplot.stats(height)$out
## [1] 228 88
order.out = boxplot.stats(height)$out
pencicilan = which(height %in% c(order.out))
pencicilan
## [1] 9 18
terdapat pencilan di data height pada indeks 9 dan 18 dengan nilai 228 dan 88
#mencari pencilan pada daata mass dengan menggunakan IQR
boxplot.stats(mass)$out
## [1] 136.0 49.0 120.0 112.0 113.0 20.0 45.0 55.0 56.2 50.0
order.out = boxplot.stats(mass)$out
pencicilan = which(mass %in% c(order.out))
pencicilan
## [1] 2 3 4 9 14 18 19 22 26 27
terdapat pencilan di data mass pada indeks 2, 3, 4, 9, 14, 18, 19, 22, 26, dan 27 dengan nilai 136.0, 49.0, 120.0, 112.0, 113.0, 20.0, 45.0, 55.0, 56.2, 50.0
#memanggil lubrary datawizard
library(datawizard)
## Warning: package 'datawizard' was built under R version 4.3.3
#mencari rata-rata menggunakan winsorized
win.height=winsorize(
height,
threshold = 0.15,
method = "percentile",
robust = FALSE,
verbose = TRUE)
cat("\nSesudah : ",win.height)
##
## Sesudah : 172 193 170 178 170 183 182 188 193 180 170 170 183 190 177 175 180 170 185 193 175 178 188 193 188 170 170 193 183
win.mass=winsorize(
mass,
threshold = 0.15,
method = "percentile",
robust = FALSE,
verbose = TRUE)
cat("\nSesudah : ",win.mass)
##
## Sesudah : 77 84 55 84 75 84 77 84 84 80 77 75 78.2 84 79 79 83 55 55 66 80 55 84 82 80 56.2 55 80 79
mean(winsorize(win.height))
## [1] 180.1724
mean(winsorize(win.mass))
## [1] 74.91034
#mencari rata-rata menggunakan Trimmed mean
mean(height, trim=0.15)
## [1] 180.381
mean(mass, trim=0.15)
## [1] 76.68571
Hasil rata-rata menggunakan winsorized dan trimmed mean tidak berbeda jauh. kedua rata-rata data mass terpangkas sama sama lebih kecil jika dibandingkan dengan rata-rata aslinya. sedangkan kedua rata-rata data height terpangkas lebih besar jika dibandingkan dengan rata-rata aslinya. Menurut saya lebih baik menggunakan winsorized mean pada kasus ini karena datanya tidak terlalu terpengaruh dengan data outlier di pagar batas atas (winsorized mean<trimeed mean)
menambahkan amatan baru dengan height 200 dan mass 100
keterangan : menggunakan c, tidak menggunakan rbind. karena pada proses eksplorasi data height dan mass sudah terlanjur dipisah
#menambahkan amatan baru menggunakan rbind()
height_baru <- c(height, 210)
mass_baru <- c(mass, 100)
height_baru
## [1] 172 202 150 178 165 183 182 188 228 180 170 170 183 190 177 175 180 88 185
## [20] 196 175 178 188 198 188 170 166 193 183 210
#mencari pencilan dari height
Q1 <- quantile(height_baru, 0.25)
Q3 <- quantile(height_baru, 0.75)
IQR_value <- IQR(height_baru)
lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value
outliers <- height_baru[height_baru < lower_bound | height_baru > upper_bound]
outliers
## [1] 228 88
mass_baru
## [1] 77.0 136.0 49.0 120.0 75.0 84.0 77.0 84.0 112.0 80.0 77.0 75.0
## [13] 78.2 113.0 79.0 79.0 83.0 20.0 45.0 66.0 80.0 55.0 84.0 82.0
## [25] 80.0 56.2 50.0 80.0 79.0 100.0
#mencari pencilan dari mass
Q1 <- quantile(mass_baru, 0.25)
Q3 <- quantile(mass_baru, 0.75)
IQR_value <- IQR(mass_baru)
lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value
outliers <- mass_baru[mass_baru < lower_bound | mass_baru > upper_bound]
outliers
## [1] 136.0 49.0 120.0 112.0 113.0 20.0 45.0 55.0 56.2 50.0 100.0
Setelah ditelusuri menggunakan IQR, ternyata amatan baru pada height (210) tidak termasuk pencilan. sedangkan amatan baru pada mass (100) termasuk pencilan.