getwd()
## [1] "C:/Users/Lenovo/Documents"
setwd("C:/Users/Lenovo/OneDrive/Documents/komstat")
file.exists("dataset_praktikum_sampling.csv")
## [1] TRUE
data <- read.csv("dataset_praktikum_sampling.csv")
head(data)
## student_id gender study_hours attendance family_income exam_score pass
## 1 1 L 4.2 70.0 50034 74.0 1
## 2 2 P 8.1 64.5 52111 76.1 1
## 3 3 P 0.1 64.3 91400 60.6 1
## 4 4 L 3.6 81.8 115892 63.5 1
## 5 5 L 3.6 77.5 81109 55.0 0
## 6 6 L 6.9 61.3 33905 78.4 1
Penjelasan
read.csv() digunakan untuk membaca dataset CSV dan menyimpannya ke objek data. Fungsi head() menampilkan enam baris pertama.
str(data)
## 'data.frame': 500 obs. of 7 variables:
## $ student_id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ gender : chr "L" "P" "P" "L" ...
## $ study_hours : num 4.2 8.1 0.1 3.6 3.6 6.9 8.8 5.4 4.7 8.8 ...
## $ attendance : num 70 64.5 64.3 81.8 77.5 61.3 87.4 87.6 91.5 80.9 ...
## $ family_income: num 50034 52111 91400 115892 81109 ...
## $ exam_score : num 74 76.1 60.6 63.5 55 78.4 98.6 61.4 86.3 86.6 ...
## $ pass : int 1 1 1 1 0 1 1 1 1 1 ...
untuk memastikan tipe setiap variabel.
# Memilih variabel numerik
data_numerik <- data[sapply(data, is.numeric)]
# Menghitung statistik deskriptif
statistik <- data.frame(
Mean = sapply(data_numerik, mean),
SD = sapply(data_numerik, sd),
Min = sapply(data_numerik, min),
Max = sapply(data_numerik, max)
)
round(statistik, 2)
## Mean SD Min Max
## student_id 250.50 144.48 1.0 500.0
## study_hours 6.00 2.41 0.0 13.3
## attendance 80.47 11.50 60.1 99.9
## family_income 52631.32 51534.96 3548.0 401401.0
## exam_score 76.17 10.82 41.5 100.0
## pass 0.92 0.27 0.0 1.0
Penjelasan: Kode tersebut memilih seluruh variabel bertipe numerik, kemudian menghitung nilai rata-rata, standar deviasi, minimum, dan maksimum untuk setiap variabel.
Kesimpulan: Statistik deskriptif memberikan gambaran awal mengenai pusat dan penyebaran data pada setiap variabel numerik.```
Histogram
par(mfrow = c(1, 2))
hist(
data$exam_score,
main = "Histogram Exam Score",
xlab = "Exam Score",
breaks = 15
)
hist(
data$study_hours,
main = "Histogram Study Hours",
xlab = "Study Hours",
breaks = 15
)
par(mfrow = c(1, 1))
Penjelasan
hist() digunakan untuk melihat distribusi data. par(mfrow=c(1,2)) menempatkan dua histogram dalam satu baris.
Kesimpulan
Histogram membantu melihat bentuk distribusi exam_score dan study_hours, termasuk pusat, penyebaran, dan kemungkinan ketidaksimetrian data.
pop <- data
set.seed(123)
n <- 30
k <- 1000
set.seed(123) penting supaya simulasi menghasilkan hasil yang sama jika dijalankan ulang.
mean_sample <- replicate(
k,
mean(
sample(
pop$exam_score,
size = n,
replace = TRUE
)
)
)
Bayangkan ada 500 nilai mahasiswa.
R melakukan:
Ambil 30 nilai → cari rata-rata Ambil 30 nilai lagi → cari rata-rata … ulang 1000 kali
Semua 1000 rata-rata tersebut disimpan dalam: mean_sample
histogram
hist(
mean_sample,
main = "Distribusi Sampling Mean (n = 30)",
xlab = "Rata-rata Sampel",
breaks = 20
)
Mean dan SD empiris
mean_empiris <- mean(mean_sample)
sd_empiris <- sd(mean_sample)
mean_empiris
## [1] 76.10626
sd_empiris
## [1] 1.870663
Standard error teoretis
mean_pop <- mean(pop$exam_score)
sd_pop <- sd(pop$exam_score)
se_teoretis <- sd_pop / sqrt(n)
mean_pop
## [1] 76.171
sd_pop
## [1] 10.81776
se_teoretis
## [1] 1.975043
perbandingan_mean <- data.frame(
Mean_Populasi = mean_pop,
Mean_Empiris = mean_empiris,
SD_Empiris = sd_empiris,
SE_Teoretis = se_teoretis
)
round(perbandingan_mean, 3)
## Mean_Populasi Mean_Empiris SD_Empiris SE_Teoretis
## 1 76.171 76.106 1.871 1.975
Kesimpulan
Mean distribusi sampling seharusnya mendekati mean populasi, sedangkan standar deviasi distribusi sampling seharusnya mendekati standard error teoretis.
set.seed(123)
n_values <- c(5, 30, 100)
par(mfrow = c(1, 3))
for (n_i in n_values) {
means <- replicate(
1000,
mean(
sample(
pop$exam_score,
size = n_i,
replace = TRUE
)
)
)
hist(
means,
main = paste("n =", n_i),
xlab = "Rata-rata Sampel",
breaks = 20
)
}
par(mfrow = c(1, 1))
Penjelasan Kode melakukan simulasi yang sama tetapi menggunakan ukuran sampel yang berbeda.
grafik: n = 5 → paling lebar n = 30 → lebih sempit n = 100 → paling sempit
Kesimpulan Semakin besar ukuran sampel, distribusi sampling rata-rata semakin terkonsentrasi di sekitar mean populasi dan spread-nya semakin kecil. Distribusinya juga cenderung semakin mendekati bentuk normal.
p <- mean(pop$pass)
p
## [1] 0.924
data memiliki pass = 1
Simulasi
set.seed(123)
k <- 1000
n_prop <- 100
prop_sample <- replicate(
k,
mean(
sample(
pop$pass,
size = n_prop,
replace = TRUE
)
)
)
Histogram
hist(
prop_sample,
main = "Distribusi Sampling Proporsi Lulus",
xlab = "Proporsi Lulus",
breaks = 20
)
Bandingkan empiris dan teori
mean_prop_empiris <- mean(prop_sample)
sd_prop_empiris <- sd(prop_sample)
se_prop_teoretis <- sqrt(
p * (1 - p) / n_prop
)
hasil_proporsi <- data.frame(
Proporsi_Populasi = p,
Mean_Empiris = mean_prop_empiris,
SD_Empiris = sd_prop_empiris,
SE_Teoretis = se_prop_teoretis
)
round(hasil_proporsi, 4)
## Proporsi_Populasi Mean_Empiris SD_Empiris SE_Teoretis
## 1 0.924 0.925 0.0267 0.0265
Kesimpulan
Mean distribusi sampling proporsi mendekati proporsi populasi dan standar deviasi empiris seharusnya mendekati standard error teoretis.
Median data asli
median_asli <- median(pop$exam_score)
median_asli
## [1] 76.1
Bootstrap 2000 kali
set.seed(123)
B <- 2000
N <- length(pop$exam_score)
boot_median <- replicate(
B,
median(
sample(
pop$exam_score,
size = N,
replace = TRUE
)
)
)
Bootstrap melakukan:
Ambil 500 data dengan pengembalian ↓ Cari median
Ulangi 2000 kali
Histogram bootstrap
hist(
boot_median,
main = "Bootstrap Distribution of Median",
xlab = "Median Bootstrap",
breaks = 20
)
Confidence Interval 95%
ci_bootstrap <- quantile(
boot_median,
probs = c(0.025, 0.975)
)
median_asli
## [1] 76.1
ci_bootstrap
## 2.5% 97.5%
## 75.25 77.80
Penjelasan
Batas: 2.5% 97.5%
digunakan untuk membentuk interval bootstrap 95%.
Kesimpulan Confidence interval bootstrap menunjukkan rentang nilai yang masuk akal untuk median populasi berdasarkan proses resampling.
uji_welch <- t.test(
exam_score ~ gender,
data = pop,
var.equal = FALSE
)
uji_welch
##
## Welch Two Sample t-test
##
## data: exam_score by gender
## t = -1.8865, df = 497.63, p-value = 0.05981
## alternative hypothesis: true difference in means between group L and group P is not equal to 0
## 95 percent confidence interval:
## -3.71700835 0.07553213
## sample estimates:
## mean in group L mean in group P
## 75.27520 77.09593
Equal variance t-test
uji_equal <- t.test(
exam_score ~ gender,
data = pop,
var.equal = TRUE
)
uji_equal
##
## Two Sample t-test
##
## data: exam_score by gender
## t = -1.8863, df = 498, p-value = 0.05983
## alternative hypothesis: true difference in means between group L and group P is not equal to 0
## 95 percent confidence interval:
## -3.71714814 0.07567193
## sample estimates:
## mean in group L mean in group P
## 75.27520 77.09593
score_L <- pop$exam_score[pop$gender == "L"]
score_P <- pop$exam_score[pop$gender == "P"]
n_L <- length(score_L)
n_P <- length(score_P)
sd_pooled <- sqrt(
(
(n_L - 1) * var(score_L) +
(n_P - 1) * var(score_P)
) /
(n_L + n_P - 2)
)
cohen_d <- (
mean(score_L) - mean(score_P)
) / sd_pooled
cohen_d
## [1] -0.168741
Tanda negatif menunjukkan mean kelompok L berada di bawah P; besarnya efek relatif kecil.