Proyek penutup memberi Anda kemandirian penuh: memilih dataset terbuka, membaca dokumentasinya, merumuskan pertanyaan sendiri, memvalidasi dan membersihkan, memilih serta menerapkan teknik analisis yang sesuai, memvisualisasikan temuan, dan menyusun laporan utuh — simulasi lengkap proyek data science dari nol. Berbeda dari empat proyek sebelumnya yang datanya sudah disediakan, kali ini keputusan paling menentukan ada di tangan Anda: dataset mana yang dipilih, pertanyaan apa yang layak diajukan, dan teknik apa yang pantas dipakai.

Supaya seluruh langkah tetap bisa diuji dan diulang, kita mengerjakan satu contoh secara penuh bersama-sama pada dataset kecil bernuansa sekolah Indonesia: nilai ujian 30 siswa dari dua kelas, lengkap dengan jam belajar mingguan dan persentase kehadiran. Dataset contoh ini sengaja diberi tiga masalah kualitas — satu baris duplikat, satu sel kehadiran kosong, dan satu penulisan kelas yang tidak konsisten — karena dataset terbuka nyaris selalu datang dalam kondisi serupa. Di setiap bagian, Anda tinggal mengganti data contoh ini dengan dataset pilihan Anda sendiri; seluruh pola kodenya tetap berlaku.

Alur Sebelas Bagian #

Kerjakan bagian-bagian ini sesuai urutannya karena setiap tahap dibangun di atas tahap sebelumnya:

BagianFokus tahap
Bagian 1: Memilih DatasetKriteria memilih dataset terbuka, sumber resmi, lisensi, dan etika
Bagian 2: Memahami Dokumentasi DatasetKamus data, konteks pengumpulan, dan batasan dokumentasi
Bagian 3: Merumuskan PertanyaanPertanyaan terukur yang dipetakan ke kolom dan teknik
Bagian 4: Memvalidasi DataPemeriksaan kualitas: bentuk, duplikat, sel kosong, kelas unik
Bagian 5: Membersihkan DataPenanganan satu per satu hingga 30 baris bersih
Bagian 6: Eksplorasi DataStatistik deskriptif per kelas dan pola awal
Bagian 7: Memilih Teknik AnalisisMemetakan pertanyaan ke teknik beserta alasannya
Bagian 8: Menerapkan Teknik AnalisisKorelasi Pearson, uji-t dua kelas, dan regresi linear
Bagian 9: Memvisualisasikan TemuanScatter plot dan grafik batang untuk laporan
Bagian 10: Menginterpretasikan HasilMenerjemahkan angka menjadi temuan yang jujur
Bagian 11: Menyusun LaporanLaporan akhir, refleksi, dan penutup Course

Katalog sumber dataset terbuka beserta pertimbangan lisensinya sudah kita rangkum pada chapter Dataset Terbuka ; proyek ini adalah tempat memakainya.

Dataset Mentah #

Berkas data/nilai_siswa.csv di bawah ini adalah titik awal seluruh analisis contoh. Kolomnya lima: siswa (nama panggilan), kelas (A atau B), jam_belajar_mingguan (rata-rata jam belajar per minggu), kehadiran_persen (persentase kehadiran), dan nilai_ujian (nilai ujian terakhir, skala 0-100). Perhatikan sejenak — tiga kejanggalan tersembunyi di dalamnya, dan justru kejanggalan itulah bahan Bagian 4 dan 5. Tautan unduh tersedia di kepala blok kode berikut:

csv
siswa,kelas,jam_belajar_mingguan,kehadiran_persen,nilai_ujian
Andi,A,12,92,71
Ayu,B,5,68,54
Bima,B,15,94,83
Budi,A,15,95,87
Cinta,B,7,76,67
Citra,A,8,85,71
Damar,B,10,85,72
Dewi,A,10,88,78
Eka,A,5,70,52
Elsa,B,3,64,44
Fajar,A,14,90,82
Farhan,B,16,95,87
Galang,B,9,80,75
Gita,a,7,80,58
Hadi,A,3,62,51
Indah,A,11,90,79
Joko,A,6,75,62
Kirana,A,13,93,76
Luki,A,4,65,51
Maya,A,9,95,72
Nia,A,16,96,91
Putri,A,10,78,78
Raka,B,11,75,73
Sari,B,8,83,64
Siti,B,14,92,74
Tono,B,6,92,64
Uma,B,9,-,65
Vina,B,13,88,77
Wulan,B,4,60,50
Yahya,B,12,90,71
Zaki,B,2,58,48
Joko,A,6,75,62

Skrip Pipeline Utuh #

Seluruh alur proyek dirangkum menjadi satu skrip di src/analisis_siswa.py: memuat data, memvalidasi, membersihkan, menghitung korelasi Pearson, menguji perbedaan dua kelas dengan uji-t, memfitting regresi linear sederhana, menulis laporan akhir, lalu mencetak ringkasan. Skrip ini deterministik — hasilnya sama setiap kali dijalankan pada data mentah yang sama, sehingga layak dijadikan pola untuk dataset pilihan Anda. Jalankan dari folder proyek dengan perintah python3 src/analisis_siswa.py:

python
"""Pipeline analisis dataset terbuka: nilai ujian siswa (dataset contoh).

Alur lengkap dalam satu skrip yang dapat diulang:
1. Muat data mentah (data/nilai_siswa.csv).
2. Validasi kualitas: baris duplikat, sel kehadiran "-",
   penulisan kelas tidak konsisten.
3. Bersihkan: buang duplikat, seragamkan kelas, tangani baris
   tanpa kehadiran.
4. Analisis: korelasi Pearson, uji-t dua kelas, regresi linear
   sederhana (nilai_ujian ~ jam_belajar_mingguan).
5. Tulis laporan/laporan-akhir.txt lalu cetak ringkasan.

Pemakaian (dari folder proyek):
    python3 src/analisis_siswa.py
"""

from pathlib import Path

import pandas as pd
from scipy import stats

DATA_PATH = "data/nilai_siswa.csv"
LAPORAN_PATH = "laporan/laporan-akhir.txt"


def muat_data(path=DATA_PATH):
    """Muat CSV mentah dataset nilai siswa."""
    return pd.read_csv(path)


def validasi(df):
    """Kumpulkan temuan masalah kualitas pada data mentah."""
    kelas = df["kelas"]
    return {
        "jumlah_baris": len(df),
        "siswa_unik": int(df["siswa"].nunique()),
        "duplikat_persis": int(df.duplicated().sum()),
        "sel_kehadiran_strip": int((df["kehadiran_persen"] == "-").sum()),
        "kelas_tak_konsisten": sorted(
            kelas.loc[kelas != kelas.str.upper()].unique().tolist()
        ),
    }


def bersihkan(df):
    """Perbaiki temuan validasi lalu kembalikan data bersih dan catatannya."""
    bersih = df.drop_duplicates().reset_index(drop=True)
    catatan = {"duplikat_dibuang": len(df) - len(bersih)}

    # Penulisan kelas diseragamkan ke huruf besar: "a" menjadi "A".
    tak_konsisten = bersih.loc[
        bersih["kelas"] != bersih["kelas"].str.upper(), "kelas"
    ].unique().tolist()
    bersih["kelas"] = bersih["kelas"].str.upper()
    catatan["kelas_diseragamkan"] = [
        f"'{nilai}' menjadi '{nilai.upper()}'" for nilai in tak_konsisten
    ]

    # Kehadiran "-" tidak punya rumus untuk dihitung ulang, jadi barisnya
    # dibuang dan keputusan ini dicatat (berbeda dengan mengisi ulang).
    bersih["kehadiran_persen"] = pd.to_numeric(
        bersih["kehadiran_persen"].replace("-", pd.NA)
    )
    catatan["baris_tanpa_kehadiran_dibuang"] = int(
        bersih["kehadiran_persen"].isna().sum()
    )
    bersih = bersih.dropna(subset=["kehadiran_persen"]).reset_index(drop=True)
    bersih["kehadiran_persen"] = bersih["kehadiran_persen"].astype(int)
    return bersih, catatan


def hitung_korelasi(df):
    """Korelasi Pearson untuk tiga pasang kolom numerik."""
    return {
        "jam_nilai": stats.pearsonr(df["jam_belajar_mingguan"], df["nilai_ujian"]),
        "kehadiran_nilai": stats.pearsonr(df["kehadiran_persen"], df["nilai_ujian"]),
        "jam_kehadiran": stats.pearsonr(
            df["jam_belajar_mingguan"], df["kehadiran_persen"]
        ),
    }


def uji_antar_kelas(df):
    """Bandingkan rata-rata nilai kelas A dan B dengan uji-t sampel bebas."""
    nilai_a = df.loc[df["kelas"] == "A", "nilai_ujian"]
    nilai_b = df.loc[df["kelas"] == "B", "nilai_ujian"]
    hasil_t = stats.ttest_ind(nilai_a, nilai_b)
    return {
        "rata_a": float(nilai_a.mean()),
        "rata_b": float(nilai_b.mean()),
        "n_a": len(nilai_a),
        "n_b": len(nilai_b),
        "t": float(hasil_t.statistic),
        "p": float(hasil_t.pvalue),
    }


def regresi_nilai(df):
    """Regresi linear sederhana: nilai_ujian ~ jam_belajar_mingguan."""
    hasil = stats.linregress(df["jam_belajar_mingguan"], df["nilai_ujian"])
    return {
        "slope": float(hasil.slope),
        "intercept": float(hasil.intercept),
        "r": float(hasil.rvalue),
        "r_kuadrat": float(hasil.rvalue) ** 2,
        "p": float(hasil.pvalue),
    }


def desimal_id(nilai, digit=2):
    """Format desimal dengan koma gaya Indonesia, mis. '0,94'."""
    return f"{nilai:.{digit}f}".replace(".", ",")


def tulis_laporan(valid, catatan, korelasi, kelas, reg, jumlah_bersih):
    """Susun laporan akhir lalu tulis ke laporan/laporan-akhir.txt."""
    baris = []
    baris.append("=" * 64)
    baris.append("LAPORAN ANALISIS DATASET TERBUKA - NILAI UJIAN SISWA")
    baris.append("=" * 64)
    baris.append(f"Dataset      : {DATA_PATH} ({valid['jumlah_baris']} baris mentah)")
    baris.append(f"Analisis     : {jumlah_bersih} siswa bersih "
                 f"(kelas A: {kelas['n_a']}, kelas B: {kelas['n_b']})")
    baris.append("Alat         : pandas + scipy (src/analisis_siswa.py)")
    baris.append("")
    baris.append("1. RINGKASAN EKSEKUTIF")
    baris.append("-" * 64)
    baris.append(
        f"Jam belajar mingguan berkorelasi sangat kuat dengan nilai ujian\n"
        f"(r = {desimal_id(korelasi['jam_nilai'].statistic)}). Kehadiran juga berkorelasi\n"
        f"kuat dengan nilai (r = {desimal_id(korelasi['kehadiran_nilai'].statistic)})."
    )
    baris.append(
        f"Regresi sederhana memperkirakan tiap tambahan 1 jam belajar\n"
        f"per minggu berasosiasi dengan kenaikan sekitar {desimal_id(reg['slope'], 1)} poin\n"
        f"nilai; modelnya menjelaskan {desimal_id(100 * reg['r_kuadrat'], 1)}% variasi nilai."
    )
    baris.append(
        f"Rata-rata nilai kelas A ({desimal_id(kelas['rata_a'], 1)}) unggul tipis atas\n"
        f"kelas B ({desimal_id(kelas['rata_b'], 1)}), tetapi uji-t tidak menemukan\n"
        f"perbedaan bermakna (p = {desimal_id(kelas['p'])}); kesimpulan yang aman:\n"
        f"belum ada bukti cukup bahwa keduanya berbeda."
    )
    baris.append("")
    baris.append("2. METODE")
    baris.append("-" * 64)
    baris.append(f"- Data dimuat dari {DATA_PATH} ({valid['jumlah_baris']} baris).")
    baris.append(
        f"- Validasi menemukan {valid['duplikat_persis']} baris duplikat persis,\n"
        f"  {valid['sel_kehadiran_strip']} sel kehadiran bernilai '-', dan satu\n"
        f"  penulisan kelas '{''.join(valid['kelas_tak_konsisten'])}' yang seharusnya 'A'."
    )
    baris.append(
        f"- Pembersihan: {catatan['duplikat_dibuang']} duplikat dibuang, kelas\n"
        f"  diseragamkan ({'; '.join(catatan['kelas_diseragamkan'])}), dan\n"
        f"  {catatan['baris_tanpa_kehadiran_dibuang']} baris tanpa kehadiran dibuang\n"
        f"  karena tidak ada dasar untuk mengisi ulang nilainya."
    )
    baris.append(
        f"- Analisis pada {jumlah_bersih} baris bersih: korelasi Pearson,\n"
        f"  uji-t dua sampel bebas, dan regresi linear sederhana."
    )
    baris.append("")
    baris.append("3. TEMUAN UTAMA")
    baris.append("-" * 64)
    baris.append(
        f"T1. Jam belajar adalah prediktor terkuat nilai ujian.\n"
        f"    Korelasi Pearson r = {desimal_id(korelasi['jam_nilai'].statistic)}\n"
        f"    (p < 0,001) pada {jumlah_bersih} siswa."
    )
    baris.append(
        f"T2. Kehadiran ikut berkorelasi kuat dengan nilai\n"
        f"    (r = {desimal_id(korelasi['kehadiran_nilai'].statistic)}), tetapi jam belajar dan\n"
        f"    kehadiran saling berkorelasi (r = {desimal_id(korelasi['jam_kehadiran'].statistic)}):\n"
        f"    siswa yang rajin belajar umumnya juga rajin hadir, sehingga\n"
        f"    keduanya tidak bisa dipisahkan penyebabnya dari data ini."
    )
    baris.append(
        f"T3. Model regresi: nilai = {desimal_id(reg['intercept'])} + {desimal_id(reg['slope'])} x jam belajar\n"
        f"    (R-kuadrat = {desimal_id(reg['r_kuadrat'])}). Slope bermakna (p < 0,001);\n"
        f"    model berlaku untuk interpolasi pada rentang data 2-16 jam."
    )
    baris.append(
        f"T4. Selisih antar kelas tidak bermakna secara statistik.\n"
        f"    Kelas A {desimal_id(kelas['rata_a'], 1)} vs kelas B {desimal_id(kelas['rata_b'], 1)}\n"
        f"    (selisih {desimal_id(kelas['rata_a'] - kelas['rata_b'], 1)} poin);\n"
        f"    t = {desimal_id(kelas['t'])}, p = {desimal_id(kelas['p'])}. Dengan sampel\n"
        f"    {kelas['n_a']}+{kelas['n_b']} siswa, selisih sekecil ini wajar muncul\n"
        f"    meskipun kedua kelas sesungguhnya setara."
    )
    baris.append("")
    baris.append("4. KETERBATASAN")
    baris.append("-" * 64)
    baris.append(
        "- Korelasi bukan kausalitas: tidak ada siswa yang diacak untuk\n"
        "  jumlah jam belajarnya, jadi faktor lain (motivasi, latar\n"
        "  belajar, kondisi keluarga) mungkin menjelaskan hubungan ini."
    )
    baris.append(
        "- Sampel hanya 30 siswa dari satu ujian; temuan berlaku untuk\n"
        "  kelompok ini dan perlu dicek ulang pada data yang lebih besar."
    )
    baris.append(
        "- Hanya dua variabel kebiasaan yang terukur; variabel penting\n"
        "  lain (misalnya nilai ujian sebelumnya) tidak tersedia."
    )
    baris.append(
        "- Dataset ini adalah dataset contoh untuk latihan; ganti dengan\n"
        "  dataset pilihan Anda dan jalankan ulang skrip yang sama."
    )
    baris.append("")
    baris.append("5. LAMPIRAN: ANGKA KUNCI")
    baris.append("-" * 64)
    baris.append(f"- Baris mentah              : {valid['jumlah_baris']}")
    baris.append(f"- Baris bersih              : {jumlah_bersih} (A: {kelas['n_a']}, B: {kelas['n_b']})")
    baris.append(f"- r(jam belajar, nilai)     : {desimal_id(korelasi['jam_nilai'].statistic)}")
    baris.append(f"- r(kehadiran, nilai)       : {desimal_id(korelasi['kehadiran_nilai'].statistic)}")
    baris.append(f"- r(jam belajar, kehadiran) : {desimal_id(korelasi['jam_kehadiran'].statistic)}")
    baris.append(f"- Rata-rata nilai kelas A   : {desimal_id(kelas['rata_a'], 1)} (n = {kelas['n_a']})")
    baris.append(f"- Rata-rata nilai kelas B   : {desimal_id(kelas['rata_b'], 1)} (n = {kelas['n_b']})")
    baris.append(f"- Uji-t A vs B              : t = {desimal_id(kelas['t'])}, p = {desimal_id(kelas['p'])}")
    baris.append(f"- Slope regresi             : {desimal_id(reg['slope'])}")
    baris.append(f"- Intercept regresi         : {desimal_id(reg['intercept'])}")
    baris.append(f"- R-kuadrat model           : {desimal_id(reg['r_kuadrat'])}")
    baris.append("- Seluruh angka di laporan ini dapat direproduksi dengan")
    baris.append("  menjalankan ulang skrip yang sama pada data mentah yang sama.")
    baris.append("=" * 64)

    Path(LAPORAN_PATH).parent.mkdir(parents=True, exist_ok=True)
    with open(LAPORAN_PATH, "w", encoding="utf-8") as berkas:
        berkas.write("\n".join(baris) + "\n")
    return "\n".join(baris)


def main():
    print("== Pipeline Analisis Dataset Terbuka - Nilai Siswa ==")
    mentah = muat_data()
    print(f"Muat data mentah   : {DATA_PATH} ({len(mentah)} baris)")

    print("\nValidasi data mentah:")
    temuan_validasi = validasi(mentah)
    print(f"  - baris duplikat persis        : {temuan_validasi['duplikat_persis']}")
    print(f"  - sel kehadiran bernilai '-'   : {temuan_validasi['sel_kehadiran_strip']}")
    print(f"  - penulisan kelas tak konsisten: {temuan_validasi['kelas_tak_konsisten']}")

    bersih, catatan = bersihkan(mentah)
    jumlah_a = int((bersih["kelas"] == "A").sum())
    jumlah_b = int((bersih["kelas"] == "B").sum())
    print(f"\nPembersihan selesai: {len(bersih)} baris bersih "
          f"(kelas A: {jumlah_a}, kelas B: {jumlah_b})")

    korelasi = hitung_korelasi(bersih)
    print("\nAnalisis korelasi (Pearson):")
    print(f"  - r(jam belajar, nilai)      : {korelasi['jam_nilai'].statistic:.4f}")
    print(f"  - r(kehadiran, nilai)        : {korelasi['kehadiran_nilai'].statistic:.4f}")
    print(f"  - r(jam belajar, kehadiran)  : {korelasi['jam_kehadiran'].statistic:.4f}")

    uji = uji_antar_kelas(bersih)
    print("\nPerbandingan dua kelas:")
    print(f"  - rata-rata kelas A          : {uji['rata_a']:.2f} (n = {uji['n_a']})")
    print(f"  - rata-rata kelas B          : {uji['rata_b']:.2f} (n = {uji['n_b']})")
    print(f"  - uji-t sampel bebas         : t = {uji['t']:.4f}, p-value = {uji['p']:.4f}")

    reg = regresi_nilai(bersih)
    print("\nRegresi linear sederhana (nilai ~ jam belajar):")
    print(f"  - slope                      : {reg['slope']:.4f}")
    print(f"  - intercept                  : {reg['intercept']:.4f}")
    print(f"  - R-squared                  : {reg['r_kuadrat']:.4f}")

    tulis_laporan(temuan_validasi, catatan, korelasi, uji, reg, len(bersih))
    print(f"\nLaporan ditulis ke: {LAPORAN_PATH}")


if __name__ == "__main__":
    main()

Output yang Dihasilkan:

text
== Pipeline Analisis Dataset Terbuka - Nilai Siswa ==
Muat data mentah   : data/nilai_siswa.csv (32 baris)

Validasi data mentah:
  - baris duplikat persis        : 1
  - sel kehadiran bernilai '-'   : 1
  - penulisan kelas tak konsisten: ['a']

Pembersihan selesai: 30 baris bersih (kelas A: 15, kelas B: 15)

Analisis korelasi (Pearson):
  - r(jam belajar, nilai)      : 0.9395
  - r(kehadiran, nilai)        : 0.8664
  - r(jam belajar, kehadiran)  : 0.8676

Perbandingan dua kelas:
  - rata-rata kelas A          : 70.60 (n = 15)
  - rata-rata kelas B          : 66.87 (n = 15)
  - uji-t sampel bebas         : t = 0.7904, p-value = 0.4359

Regresi linear sederhana (nilai ~ jam belajar):
  - slope                      : 2.8794
  - intercept                  : 42.0505
  - R-squared                  : 0.8826

Laporan ditulis ke: laporan/laporan-akhir.txt

Dari ringkasan tersebut cerita utuhnya sudah terbaca: jam belajar berkorelasi sangat kuat dengan nilai, kehadiran ikut berkorelasi tetapi sulit dipisahkan dari jam belajar, dan selisih antar kelas ternyata tidak bermakna secara statistik. Bagian-bagian berikutnya membedah dari mana angka-angka itu berasal, langkah demi langkah.

Laporan Akhir #

Skrip di atas juga menulis laporan/laporan-akhir.txt — laporan datar lima bagian (ringkasan eksekutif, metode, temuan utama, keterbatasan, lampiran angka kunci) yang bisa dibaca tanpa membuka Python. Anda bisa mengunduhnya melalui tautan pada kepala blok berikut:

text
================================================================
LAPORAN ANALISIS DATASET TERBUKA - NILAI UJIAN SISWA
================================================================
Dataset      : data/nilai_siswa.csv (32 baris mentah)
Analisis     : 30 siswa bersih (kelas A: 15, kelas B: 15)
Alat         : pandas + scipy (src/analisis_siswa.py)

1. RINGKASAN EKSEKUTIF
----------------------------------------------------------------
Jam belajar mingguan berkorelasi sangat kuat dengan nilai ujian
(r = 0,94). Kehadiran juga berkorelasi
kuat dengan nilai (r = 0,87).
Regresi sederhana memperkirakan tiap tambahan 1 jam belajar
per minggu berasosiasi dengan kenaikan sekitar 2,9 poin
nilai; modelnya menjelaskan 88,3% variasi nilai.
Rata-rata nilai kelas A (70,6) unggul tipis atas
kelas B (66,9), tetapi uji-t tidak menemukan
perbedaan bermakna (p = 0,44); kesimpulan yang aman:
belum ada bukti cukup bahwa keduanya berbeda.

2. METODE
----------------------------------------------------------------
- Data dimuat dari data/nilai_siswa.csv (32 baris).
- Validasi menemukan 1 baris duplikat persis,
  1 sel kehadiran bernilai '-', dan satu
  penulisan kelas 'a' yang seharusnya 'A'.
- Pembersihan: 1 duplikat dibuang, kelas
  diseragamkan ('a' menjadi 'A'), dan
  1 baris tanpa kehadiran dibuang
  karena tidak ada dasar untuk mengisi ulang nilainya.
- Analisis pada 30 baris bersih: korelasi Pearson,
  uji-t dua sampel bebas, dan regresi linear sederhana.

3. TEMUAN UTAMA
----------------------------------------------------------------
T1. Jam belajar adalah prediktor terkuat nilai ujian.
    Korelasi Pearson r = 0,94
    (p < 0,001) pada 30 siswa.
T2. Kehadiran ikut berkorelasi kuat dengan nilai
    (r = 0,87), tetapi jam belajar dan
    kehadiran saling berkorelasi (r = 0,87):
    siswa yang rajin belajar umumnya juga rajin hadir, sehingga
    keduanya tidak bisa dipisahkan penyebabnya dari data ini.
T3. Model regresi: nilai = 42,05 + 2,88 x jam belajar
    (R-kuadrat = 0,88). Slope bermakna (p < 0,001);
    model berlaku untuk interpolasi pada rentang data 2-16 jam.
T4. Selisih antar kelas tidak bermakna secara statistik.
    Kelas A 70,6 vs kelas B 66,9
    (selisih 3,7 poin);
    t = 0,79, p = 0,44. Dengan sampel
    15+15 siswa, selisih sekecil ini wajar muncul
    meskipun kedua kelas sesungguhnya setara.

4. KETERBATASAN
----------------------------------------------------------------
- Korelasi bukan kausalitas: tidak ada siswa yang diacak untuk
  jumlah jam belajarnya, jadi faktor lain (motivasi, latar
  belajar, kondisi keluarga) mungkin menjelaskan hubungan ini.
- Sampel hanya 30 siswa dari satu ujian; temuan berlaku untuk
  kelompok ini dan perlu dicek ulang pada data yang lebih besar.
- Hanya dua variabel kebiasaan yang terukur; variabel penting
  lain (misalnya nilai ujian sebelumnya) tidak tersedia.
- Dataset ini adalah dataset contoh untuk latihan; ganti dengan
  dataset pilihan Anda dan jalankan ulang skrip yang sama.

5. LAMPIRAN: ANGKA KUNCI
----------------------------------------------------------------
- Baris mentah              : 32
- Baris bersih              : 30 (A: 15, B: 15)
- r(jam belajar, nilai)     : 0,94
- r(kehadiran, nilai)       : 0,87
- r(jam belajar, kehadiran) : 0,87
- Rata-rata nilai kelas A   : 70,6 (n = 15)
- Rata-rata nilai kelas B   : 66,9 (n = 15)
- Uji-t A vs B              : t = 0,79, p = 0,44
- Slope regresi             : 2,88
- Intercept regresi         : 42,05
- R-kuadrat model           : 0,88
- Seluruh angka di laporan ini dapat direproduksi dengan
  menjalankan ulang skrip yang sama pada data mentah yang sama.
================================================================

Cara Mengerjakan #

Unduh ketiga berkas di atas ke satu folder dengan struktur yang sama (data/, src/, laporan/), lalu ikuti sebelas bagian secara berurutan. Setiap bagian memuat kode yang bisa dijalankan langsung dan membaca berkas data yang sama, sehingga kondisi proyek tetap utuh di setiap tahap. Untuk versi mandiri, ganti nilai_siswa.csv dengan dataset pilihan Anda — mulai dari Kaggle Datasets , UCI Machine Learning Repository , atau GitHub datasets — lalu sesuaikan nama kolomnya pada tiap langkah; alur validasi, pembersihan, analisis, hingga pelaporannya tidak berubah. Skrip analisis_siswa.py juga tampil di bagian Berkas Sumber pada tiap halaman bagian untuk memudahkan pengunduhan.

Mari kita mulai dari keputusan pertama yang menentukan arah seluruh proyek: Bagian 1: Memilih Dataset .

# Bagian 1: Memilih Dataset

Pilih dataset terbuka yang tepat dengan kriteria pertanyaan, ukuran, dokumentasi, dan lisensi sebelum menyentuh analisis.

Buka →
# Bagian 2: Memahami Dokumentasi Dataset

Baca dan susun dokumentasi dataset: kamus data, konteks pengumpulan, serta batas interpretasinya.

Buka →
# Bagian 3: Merumuskan Pertanyaan

Rumuskan pertanyaan analisis yang terukur dan petakan ke kolom serta teknik yang menjawabnya.

Buka →
# Bagian 4: Memvalidasi Data

Periksa kualitas data mentah: bentuk, tipe, duplikat, sel kosong, dan konsistensi nilai kelas.

Buka →
# Bagian 5: Membersihkan Data

Tangani setiap masalah data satu per satu hingga menghasilkan 30 baris data bersih yang terverifikasi.

Buka →
# Bagian 6: Eksplorasi Data

Jelajahi 30 baris data bersih dengan statistik deskriptif per kelas dan tandai pola awal sebelum analisis formal dijalankan.

Buka →
# Bagian 7: Memilih Teknik Analisis

Uji kesesuaian korelasi Pearson, uji-t, dan regresi linear untuk tiap pertanyaan — dan pahami mengapa teknik lain justru tidak dipilih.

Buka →
# Bagian 8: Menerapkan Teknik Analisis

Jawab P1 sampai P4 dengan korelasi Pearson, uji-t dua sampel bebas, dan regresi linear — lalu baca setiap angkanya dengan hati-hati.

Buka →
# Bagian 9: Memvisualisasikan Temuan

Sajikan temuan lewat scatter plot jam belajar vs nilai per kelas, grafik batang rata-rata kelas, dan garis regresi untuk laporan akhir.

Buka →
# Bagian 10: Menginterpretasikan Hasil

Terjemahkan angka menjadi temuan yang jujur: pisahkan korelasi dari kausalitas, hargai keterbatasan sampel, dan pilih kalimat laporan yang tepat.

Buka →
# Bagian 11: Menyusun Laporan

Susun laporan akhir lima bagian, periksa keterulangan angkanya, refleksikan proyek mandiri Anda, dan tutup perjalanan Course Data Science.

Buka →