1. Eksplorasi Data

Langkah 1

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.

Langkah 2

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.

Langkah 3

# 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.```

Langkah 4

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.

2. Distribusi Sampling Rata-Rata

Langkah 1

pop <- data

set.seed(123)

n <- 30
k <- 1000

set.seed(123) penting supaya simulasi menghasilkan hasil yang sama jika dijalankan ulang.

Langkah 2

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

Langkah 3

histogram

hist(
  mean_sample,
  main = "Distribusi Sampling Mean (n = 30)",
  xlab = "Rata-rata Sampel",
  breaks = 20
)

Langkah 4

Mean dan SD empiris

mean_empiris <- mean(mean_sample)
sd_empiris <- sd(mean_sample)

mean_empiris
## [1] 76.10626
sd_empiris
## [1] 1.870663

Langkah 5

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

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.

3. Pengaruh Ukuran Sampel

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.

4. Distribusi Sampling Proporsi

Langkah 1

p <- mean(pop$pass)

p
## [1] 0.924

data memiliki pass = 1

Langkah 2

Simulasi

set.seed(123)

k <- 1000
n_prop <- 100

prop_sample <- replicate(
  k,
  mean(
    sample(
      pop$pass,
      size = n_prop,
      replace = TRUE
    )
  )
)

Langkah 3

Histogram

hist(
  prop_sample,
  main = "Distribusi Sampling Proporsi Lulus",
  xlab = "Proporsi Lulus",
  breaks = 20
)

Langkah 4

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.

5. Bootstrap untuk Median

Langkah 1

Median data asli

median_asli <- median(pop$exam_score)

median_asli
## [1] 76.1

Langkah 2

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

Langkah 3

Histogram bootstrap

hist(
  boot_median,
  main = "Bootstrap Distribution of Median",
  xlab = "Median Bootstrap",
  breaks = 20
)

Langkah 4

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.

6. Uji Hipotesis

6.a Welch t-test

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

6.b Cohen’s d tanpa package tambahan

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.