sampling
Riski C
2025-09-18
library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
Exam_score <- read_excel("C:/Users/D3LL/Downloads/Exam_score.xlsx")
View(Exam_score)
# Load library
library(dplyr)
##
## 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)
library(readxl)
Exam_score <- read_excel("C:/Users/D3LL/Downloads/Exam_score.xlsx")
# Tampilkan struktur data
str(Exam_score)
## tibble [30,641 × 15] (S3: tbl_df/tbl/[Link])
## $ ID : num [1:30641] 0 1 2 3 4 5 6 7 8 9 ...
## $ Gender : chr [1:30641] "female" "female" "female" "male" ...
## $ EthnicGroup : chr [1:30641] NA "group C" "group B" "group A" ...
## $ ParentEduc : chr [1:30641] "bachelor's degree" "some college" "master's degree" "associate's degree" ...
## $ LunchType : chr [1:30641] "standard" "standard" "standard" "free/reduced" ...
## $ TestPrep : chr [1:30641] "none" NA "none" "none" ...
## $ ParentMaritalStatus: chr [1:30641] "married" "married" "single" "married" ...
## $ PracticeSport : chr [1:30641] "regularly" "sometimes" "sometimes" "never" ...
## $ IsFirstChild : chr [1:30641] "yes" "yes" "yes" "no" ...
## $ NrSiblings : num [1:30641] 3 0 4 1 0 1 1 1 3 NA ...
## $ TransportMeans : chr [1:30641] "school_bus" NA "school_bus" NA ...
## $ WklyStudyHours : chr [1:30641] "< 5" "45935" "< 5" "45935" ...
## $ MathScore : num [1:30641] 71 69 87 45 76 73 85 41 65 37 ...
## $ ReadingScore : num [1:30641] 71 90 93 56 78 84 93 43 64 59 ...
## $ WritingScore : num [1:30641] 74 88 91 42 75 79 89 39 68 50 ...
head(Exam_score)
## # A tibble: 6 × 15
## ID Gender EthnicGroup ParentEduc LunchType TestPrep ParentMaritalStatus
## <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 0 female <NA> bachelor's de… standard none married
## 2 1 female group C some college standard <NA> married
## 3 2 female group B master's degr… standard none single
## 4 3 male group A associate's d… free/red… none married
## 5 4 male group C some college standard none married
## 6 5 female group B associate's d… standard none married
## # ℹ 8 more variables: PracticeSport <chr>, IsFirstChild <chr>,
## # NrSiblings <dbl>, TransportMeans <chr>, WklyStudyHours <chr>,
## # MathScore <dbl>, ReadingScore <dbl>, WritingScore <dbl>
# Cek total NA di seluruh dataset
sum([Link](Exam_score))
## [1] 13901
# Hapus satu kolom
Exam_score$math <- NULL
mengganti missing value
Exam_score$MathScore[[Link](Exam_score$MathScore)] <- 0
Exam_score$NrSiblings[[Link](Exam_score$NrSiblings)] <- 0
Exam_score$EthnicGroup[[Link](Exam_score$EthnicGroup)] <- "Unknown"
Exam_score$ParentEduc[[Link](Exam_score$ParentEduc)] <- "Unknown"
Exam_score$ParentMaritalStatus[[Link](Exam_score$ParentMaritalStatus)] <- "Unknown"
Exam_score$TestPrep[[Link](Exam_score$TestPrep)] <- "Unknown"
Exam_score$PracticeSport[[Link](Exam_score$PracticeSport)] <- "Unknown"
Exam_score$IsFirstChild[[Link](Exam_score$IsFirstChild)] <- "Unknown"
Exam_score$TransportMeans[[Link](Exam_score$TransportMeans)] <- "Unknown"
Exam_score$WklyStudyHours[[Link](Exam_score$WklyStudyHours)] <- "Unknown"
contoh simple
# Simple Random Sampling: ambil 100 sampel acak
[Link](29)
srs_sample <- Exam_score %>% sample_n(100)
# Hitung estimasi rata-rata matematika
srs_math_mean <- mean(srs_sample$MathScore)
print(paste("Estimasi Nilai Rata-rata Matematika (SRS):", round(srs_math_mean, 2)))
## [1] "Estimasi Nilai Rata-rata Matematika (SRS): 68.59"
# Tampilkan ukuran sampel
print(paste("Jumlah sampel SRS:", nrow(srs_sample)))
## [1] "Jumlah sampel SRS: 100"
contoh systematic
# Systematic Sampling
n_population <- nrow(Exam_score)
n_sample_sys <- 100
k <- floor(n_population / n_sample_sys) # interval
# Mulai dari titik acak antara 1 hingga k
[Link](29)
start <- sample(1:k, 1)
# Pilih indeks secara sistematis
indices <- seq(start, n_population, by = k)
systematic_sample <- Exam_score[indices, ]
systematic_math_mean <- mean(systematic_sample$MathScore)
print(paste("Estimasi Nilai Rata-rata Matematika (Systematic):", round(systematic_math_mean, 2)))
## [1] "Estimasi Nilai Rata-rata Matematika (Systematic): 63.7"
print(paste("Jumlah sampel Systematic:", nrow(systematic_sample)))
## [1] "Jumlah sampel Systematic: 100"
contoh stratified
# Stratified Sampling berdasarkan 'Gender'
[Link](29)
stratified_sample <- Exam_score %>%
group_by(Gender) %>%
sample_frac(0.1) # ambil 10% dari setiap strata
stratified_math_mean <- mean(stratified_sample$MathScore)
print(paste("Estimasi Nilai Rata-rata Matematika (Stratified by Gender):", round(stratified_math_mean, 2)))
## [1] "Estimasi Nilai Rata-rata Matematika (Stratified by Gender): 66.81"
# Tampilkan jumlah per strata
print("Jumlah sampel per gender:")
## [1] "Jumlah sampel per gender:"
table(stratified_sample$Gender)
##
## female male
## 1542 1522
contoh cluster
# Cluster Sampling berdasarkan 'EthnicGroup'
[Link](29)
clusters <- unique(Exam_score$EthnicGroup)
selected_clusters <- sample(clusters, 2) # Pilih 2 cluster acak
cluster_sample <- Exam_score %>% filter(EthnicGroup %in% selected_clusters)
cluster_math_mean <- mean(cluster_sample$MathScore)
print(paste("Estimasi Nilai Rata-rata Matematika (Cluster):", round(cluster_math_mean, 2)))
## [1] "Estimasi Nilai Rata-rata Matematika (Cluster): 66.6"
print(paste("Cluster yang terpilih:", paste(selected_clusters, collapse = ", ")))
## [1] "Cluster yang terpilih: group D, group A"
print(paste("Jumlah sampel Cluster:", nrow(cluster_sample)))
## [1] "Jumlah sampel Cluster: 9722"
contoh multi-stage
# Multi-Stage Sampling
[Link](29)
# Stage 1: Pilih 3 cluster acak berdasarkan 'ParentEduc'
educ_clusters <- unique(Exam_score$ParentEduc)
selected_educ_clusters <- sample(educ_clusters, 3)
# Stage 2: Di setiap cluster terpilih, lakukan stratified sampling berdasarkan 'LunchType'
multi_stage_sample <- [Link]()
for(cluster in selected_educ_clusters) {
cluster_data <- Exam_score %>% filter(ParentEduc == cluster)
# Stratify by LunchType within the selected education cluster
stratified_cluster <- cluster_data %>%
group_by(LunchType) %>%
sample_n(500) # ambil 5 sampel dari setiap lunch type
multi_stage_sample <- bind_rows(multi_stage_sample, stratified_cluster)
}
multi_stage_math_mean <- mean(multi_stage_sample$MathScore)
print(paste("Estimasi Nilai Rata-rata Matematika (Multi-Stage):", round(multi_stage_math_mean, 2)))
## [1] "Estimasi Nilai Rata-rata Matematika (Multi-Stage): 64.48"
print(paste("Cluster Pendidikan Orang Tua yang terpilih:", paste(selected_educ_clusters, collapse = ", ")))
## [1] "Cluster Pendidikan Orang Tua yang terpilih: high school, associate's degree, Unknown"
print(paste("Jumlah sampel Multi-Stage:", nrow(multi_stage_sample)))
## [1] "Jumlah sampel Multi-Stage: 3000"
# Tampilkan distribusi per cluster dan strata
print("Distribusi sampel:")
## [1] "Distribusi sampel:"
table(multi_stage_sample$ParentEduc, multi_stage_sample$LunchType)
##
## free/reduced standard
## associate's degree 500 500
## high school 500 500
## Unknown 500 500
Analisis deskriptif populasi
# Analisis deskriptif populasi
Exam_descriptive <- Exam_score %>%
summarise(
N = n(),
Mean_MathScore = mean(MathScore),
Median_MathScore = median(MathScore),
SD_MathScore = sd(MathScore),
Min_MathScore = min(MathScore),
Max_MathScore = max(MathScore),
Q1_MathScore = quantile(MathScore, 0.25),
Q3_MathScore = quantile(MathScore, 0.75),
IQR_MathScore = IQR(MathScore),
)
print("DESKRIPTIF POPULASI ASLI:")
## [1] "DESKRIPTIF POPULASI ASLI:"
print(Exam_descriptive)
## # A tibble: 1 × 9
## N Mean_MathScore Median_MathScore SD_MathScore Min_MathScore Max_MathScore
## <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 30641 66.6 67 15.4 0 100
## # ℹ 3 more variables: Q1_MathScore <dbl>, Q3_MathScore <dbl>,
## # IQR_MathScore <dbl>
Buat fungsi untuk analisis deskriptif
analyze_descriptive <- function(data, sample_name) {
result <- data %>%
summarise(
Sample = sample_name,
N = n(),
Mean = mean(MathScore),
Median = median(MathScore),
SD = sd(MathScore),
Min = min(MathScore),
Max = max(MathScore),
Q1 = quantile(MathScore, 0.25),
Q3 = quantile(MathScore, 0.75),
IQR = IQR(MathScore),
SE = sd(MathScore)/sqrt(n()) # Standard Error
)
return(result)
}
Analisis untuk semua sampel
all_analysis <- bind_rows(
analyze_descriptive(srs_sample, "SIMPLE RANDOM"),
analyze_descriptive(systematic_sample, "SYSTEMATIC"),
analyze_descriptive(stratified_sample, "STRATIFIED"),
analyze_descriptive(cluster_sample, "CLUSTER"),
analyze_descriptive(multi_stage_sample, "MULTI-STAGE")
)
print("HASIL ANALISIS DESKRIPTIF SEMUA SAMPLING:")
## [1] "HASIL ANALISIS DESKRIPTIF SEMUA SAMPLING:"
print(all_analysis, digits = 3)
## Warning: `...` must be empty in `[Link]()`
## Caused by error in `format_tbl()`:
## ! `...` must be empty.
## ✖ Problematic argument:
## • digits = 3
## # A tibble: 6 × 12
## Sample N Mean Median SD Min Max Q1 Q3 IQR SE Gender
## <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 SIMPLE RA… 100 68.6 70 16.5 29 100 58 81 23 1.65 <NA>
## 2 SYSTEMATIC 100 63.7 63 16.7 25 100 52.8 75 22.2 1.67 <NA>
## 3 STRATIFIED 1542 64.2 64 15.6 9 100 54 76 22 0.396 female
## 4 STRATIFIED 1522 69.4 70 14.6 21 100 60 80 20 0.374 male
## 5 CLUSTER 9722 66.6 67 15.1 7 100 56 77 21 0.153 <NA>
## 6 MULTI-STA… 3000 64.5 65 15.5 9 100 54 75 21 0.283 <NA>