Proyek analisis yang baik terbaca seperti satu cerita utuh, yaitu data masuk, diolah, dimodelkan, lalu keluar sebagai grafik beserta kesimpulan. Topik ini mengerjakan proyek rekap nilai ujian dari awal sampai akhir di dalam satu berkas skrip, mulai dari penyiapan berkas data, impor dengan read_csv, inspeksi dengan glimpse, peringkasan dengan dplyr, pemodelan dengan lm(), sampai penyimpanan dua grafik. Seluruh hasilnya, baik angka maupun grafik, dibangkitkan kembali oleh satu perintah yang sama.
Pertanyaan dan rancangan skrip#
Pertanyaan yang dijawab proyek ini adalah apakah rata-rata nilai ujian meningkat dari semester ke semester dan seberapa besar kenaikannya. Pertanyaan itu dirumuskan pada tahap penetapan lingkup, dan seluruh isi skrip diarahkan untuk menjawabnya. Jawaban yang dituju berupa satu angka kenaikan per semester yang diestimasi dari data, bukan kesan umum bahwa nilai terlihat membaik.
Skrip analisis.R terbagi menjadi enam bagian yang berurutan, sebagaimana tabel berikut.
| Bagian skrip | Tugas | Fungsi utama |
|---|---|---|
| 1. Penyiapan data | Menulis berkas data/rekap-nilai.csv lalu membacanya kembali | set.seed(), write_csv(), read_csv() |
| 2. Inspeksi | Memeriksa ukuran tabel dan tipe kolom | glimpse() |
| 3. Transformasi | Menghitung rata-rata nilai per kelas per semester | group_by(), summarize() |
| 4. Model | Mengestimasi kenaikan per semester | lm() |
| 5. Grafik | Menyimpan dua grafik SVG | ggplot(), ggsave() |
| 6. Ringkasan teks | Mencetak angka-angka utama ke konsol | cat() |
Bagian penyiapan data menulis ulang berkas dataset setiap kali skrip dijalankan, sehingga proyek dapat direproduksi dari satu berkas skrip saja. Pada proyek dengan data sungguhan, bagian ini diganti dengan penempatan berkas mentah yang tidak pernah disunting, sedangkan bagian-bagian berikutnya tetap sama. Data sintetis dibangkitkan dengan seed yang sama seperti pada topik Penetapan Lingkup Proyek, sehingga angkanya persis sama.
Skrip analisis.R#
Skrip utuh proyek ini ditempatkan sebagai berkas analisis.R pada folder proyek. Pemanggilan library(tidyverse) dibungkus suppressPackageStartupMessages() agar pesan pemuatan paket tidak bercampur dengan keluaran analisis. Komentar bernomor di dalam skrip menandai keenam bagian tersebut, dan urutannya mengikuti tabel rancangan di atas.
# Analisis lengkap: tren nilai ujian dua sekolah selama empat semester
# Jalankan dari folder proyek dengan: Rscript analisis.R
suppressPackageStartupMessages(library(tidyverse))
# 1. Menyiapkan berkas data, lalu mengimpornya kembali ------------------------
set.seed(23)
dir.create("data", showWarnings = FALSE)
rekap_baru <- expand_grid(
sekolah = c("SMP Harapan", "SMP Nusantara"),
kelas = c("7A", "7B"),
semester = 1:4,
siswa = 1:8
) |>
mutate(
pangkal = if_else(sekolah == "SMP Harapan", 76, 72) +
if_else(kelas == "7B", 1.5, 0),
nilai = round(pangkal + 2.0 * (semester - 1) +
rnorm(n(), mean = 0, sd = 6), 1)
) |>
select(sekolah, kelas, semester, nilai)
write_csv(rekap_baru, file.path("data", "rekap-nilai.csv"))
rekap <- read_csv(file.path("data", "rekap-nilai.csv"), show_col_types = FALSE)
# 2. Inspeksi singkat ----------------------------------------------------------
glimpse(rekap)
# 3. Rata-rata nilai per kelas per semester ------------------------------------
rata_kelas <- rekap |>
group_by(sekolah, kelas, semester) |>
summarize(rata = mean(nilai), .groups = "drop")
print(rata_kelas)
# 4. Model linear sederhana ----------------------------------------------------
model <- lm(nilai ~ semester, data = rekap)
# 5. Dua grafik hasil analisis -------------------------------------------------
p_tren <- ggplot(rata_kelas, aes(x = semester, y = rata, color = sekolah)) +
geom_line() +
geom_point() +
labs(
title = "Rata-rata nilai ujian per semester",
x = "Semester",
y = "Nilai rata-rata",
color = "Sekolah"
) +
theme_minimal()
ggsave("rekap-tren-sekolah.svg", p_tren, width = 5, height = 3.2)
p_model <- ggplot(rekap, aes(x = semester, y = nilai)) +
geom_point(alpha = 0.35) +
geom_smooth(method = "lm", se = FALSE, formula = y ~ x) +
labs(
title = "Nilai ujian dan garis tren hasil model",
x = "Semester",
y = "Nilai ujian"
) +
theme_minimal()
ggsave("rekap-model-nilai.svg", p_model, width = 5, height = 3.2)
# 6. Ringkasan teks --------------------------------------------------------------
koef <- unname(coef(model))
cat(sprintf("Intersep model (prediksi pada semester 0): %.2f\n", koef[1]))
cat(sprintf("Kenaikan rata-rata per semester: %.2f poin\n", koef[2]))
cat(sprintf("R-squared model: %.3f\n", summary(model)$r.squared))Menjalankan skrip#
Skrip dijalankan dari folder proyek melalui terminal dengan satu perintah, dan seluruh berkas yang dibuatnya lahir di direktori kerja tempat perintah itu dipanggil. Hasil yang dimaksud adalah folder data/ beserta isi CSV-nya dan dua grafik SVG pada folder akar proyek. Jalur di dalam skrip sengaja ditulis relatif, sehingga proyek tetap berjalan apabila foldernya dipindah ke lokasi lain. Eksekusinya selesai dalam beberapa detik karena ukuran datanya kecil, dan keluaran muncul berurutan mengikuti bagian skripnya, yaitu hasil inspeksi, tabel ringkasan, lalu tiga baris ringkasan model.
# jalankan seluruh analisis dari folder proyek
Rscript analisis.RRows: 128
Columns: 4
$ sekolah <chr> "SMP Harapan", "SMP Harapan", "SMP Harapan", "SMP Harapan", "~
$ kelas <chr> "7A", "7A", "7A", "7A", "7A", "7A", "7A", "7A", "7A", "7A", "~
$ semester <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3~
$ nilai <dbl> 77.2, 73.4, 81.5, 86.8, 82.0, 82.6, 74.3, 82.1, 78.3, 87.5, 7~
# A tibble: 16 x 4
sekolah kelas semester rata
<chr> <chr> <dbl> <dbl>
1 SMP Harapan 7A 1 80.0
2 SMP Harapan 7A 2 78.1
3 SMP Harapan 7A 3 79.7
4 SMP Harapan 7A 4 81.4
5 SMP Harapan 7B 1 76.5
6 SMP Harapan 7B 2 79.2
7 SMP Harapan 7B 3 81.8
8 SMP Harapan 7B 4 84.2
9 SMP Nusantara 7A 1 70.7
10 SMP Nusantara 7A 2 72.8
11 SMP Nusantara 7A 3 76.3
12 SMP Nusantara 7A 4 80.2
13 SMP Nusantara 7B 1 75.9
14 SMP Nusantara 7B 2 75.0
15 SMP Nusantara 7B 3 79.0
16 SMP Nusantara 7B 4 79.5
Intersep model (prediksi pada semester 0): 73.21
Kenaikan rata-rata per semester: 1.97 poin
R-squared model: 0.117Membaca ringkasan hasil#
Bagian inspeksi menegaskan tabel terbaca utuh, yaitu 128 baris dengan empat kolom bertipe character dan double. Tabel ringkasan setelahnya memuat rata-rata setiap kombinasi sekolah, kelas, dan semester, sebanyak 16 baris. Pola yang terlihat pada tabel itu adalah naiknya rata-rata dari semester 1 menuju semester 4 pada setiap kelas, meskipun tidak semua kelas menunjukkan kenaikan yang monoton karena variasi antarsiswa.
Tiga baris terakhir adalah ringkasan model. Intersep 73,21 adalah nilai yang diprediksi model pada semester 0, wilayah di luar data yang hanya menjadi titik pijak garis. Angka yang menjawab pertanyaan proyek adalah kemiringannya, yaitu kenaikan rata-rata 1,97 poin per semester, sangat dekat dengan tren dua poin yang ditanamkan pada data. Nilai R-squared 0,117 berarti model semester saja menjelaskan sekitar 12 persen variasi nilai, karena perbedaan antarsiswa jauh lebih besar daripada tren antarsemester, dan keadaan semacam ini lazim pada data nilai ujian.
Grafik hasil analisis#
Skrip menyimpan dua grafik SVG pada direktori kerja, yaitu rekap-tren-sekolah.svg dan rekap-model-nilai.svg, dan keduanya disematkan berikut ini. Grafik pertama menggambar rata-rata per semester untuk setiap sekolah, sehingga kenaikan sekitar dua poin per semester terlihat sebagai dua garis yang naik relatif sejajar. Kedua garis juga memperlihatkan jarak yang konsisten antara dua sekolah, sesuai nilai pangkal yang berbeda pada datanya.
Grafik kedua menampilkan seluruh 128 nilai siswa sebagai titik, dilengkapi garis tren hasil model linear. Garis yang naik dari kiri bawah ke kanan atas merupakan bentuk visual dari kemiringan 1,97 pada ringkasan sebelumnya. Sebaran titik yang lebar di sekitar garis menjelaskan mengapa R-squared model kecil, yaitu variasi antarsiswa mendominasi tren antarsemester.
Reprodusibilitas dari satu berkas#
Seluruh proyek dapat diulang dari nol dengan menghapus folder data/ dan kedua berkas SVG, lalu menjalankan Rscript analisis.R sekali lagi. Keluarannya identik sampai angka terakhir karena seed ditetapkan di awal, tidak ada fungsi yang bergantung pada tanggal, dan setiap angka dihitung ulang dari data yang dibaca ulang dari berkas CSV. Perubahan sekecil apa pun pada urutan baris yang memanggil fungsi acak tetap menggeser hasilnya, karena generator angka acak membaca seed secara berurutan. Sifat inilah yang membedakan proyek yang dapat dipercaya dari kumpulan perintah yang kebetulan berhasil.
Struktur yang sama dapat diperbesar tanpa mengubah kebiasaannya. Dataset yang lebih besar tetap ditempatkan pada folder data/, grafik tambahan disisipkan pada bagian kelima, dan ringkasan teks diperluas seperlunya. Quarto melangkah lebih jauh dengan menyatukan skrip, narasi, dan hasil dalam satu dokumen yang dapat dirender ulang.
Langkah lanjutan#
Pada akhir jalur ini, seluruh alat sudah dipakai dalam satu proyek utuh yang dapat direproduksi. Buku R for Data Science edisi kedua menjadi bacaan lanjutan yang paling menyambung, karena bab-babnya membahas alur kerja, transformasi, pemodelan, dan komunikasi hasil dengan kedalaman yang jauh lebih lengkap dari topik mana pun di jalur ini. Untuk pelaporan, Quarto menyatukan narasi, kode, dan grafik dalam satu dokumen yang dapat dirender ulang setiap kali datanya berubah, dan dokumentasinya memandu langkah pertama sampai laporan terparameterisasi. Dokumentasi resmi paket di situs tidyverse menjadi rujukan tercepat untuk memeriksa perilaku setiap fungsi beserta argumennya, sebagaimana halaman dplyr yang dirujuk pada bagian Referensi.
Ringkasan#
- Satu skrip analisis.R membawa proyek dari penyiapan berkas data, impor, inspeksi, peringkasan, pemodelan, sampai dua grafik dan ringkasan teks.
- Kemiringan model menjawab pertanyaan proyek, yaitu kenaikan rata-rata nilai per semester, sedangkan intersep hanyalah titik pijak di luar rentang data.
- R-squared yang kecil menandakan variasi antarsiswa jauh lebih besar daripada tren antarsemester, dan angkanya harus dilaporkan apa adanya.
- Menjalankan ulang skrip pada folder yang bersih menghasilkan angka dan grafik yang identik karena seed ditetapkan dan tidak ada fungsi yang bergantung tanggal.
Referensi#
- R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — Buku resmi alur kerja tidyverse yang membahas seluruh tahap proyek ini lebih dalam.
- dplyr: A Grammar of Data Manipulation — tidyverse
— Dokumentasi resmi verba transformasi seperti
group_by()dansummarize()yang dipakai skrip. - Quarto — Posit — Dokumentasi resmi untuk mengubah analisis menjadi laporan yang dapat dirender ulang.