Dataset 102 baris hasil Bagian 2 sudah bersih dan bertipe benar, sehingga kini aman untuk dieksplorasi. Eksplorasi data adalah tahap bertanya sebelum menyimpulkan: bagaimana sebaran tiap kolom, apakah kolom-kolom bergerak bersama, dan siapa yang menempati puncak maupun dasar peringkat. Tiga lapis pertanyaan itu kita jawab berurutan dengan alat pandas yang sesuai — describe(), quantile(), dan value_counts() untuk satu kolom; groupby() dan corr(numeric_only=True) untuk dua kolom; nlargest() dan nsmallest() untuk peringkat. Hasilnya menjadi bahan temuan yang dirangkai Bagian 4.

Tiga Lapis Eksplorasi dalam Satu Skrip #

Skrip berikut memuat ulang dataset mentah, membersihkannya lewat bersihkan() dari Bagian 2, lalu mencetak hasil ketiga lapis eksplorasi sekaligus — statistik ringkas, kuantil, kelengkapan per tahun, rata-rata per tahun dan per provinsi, matriks korelasi, serta dua tabel peringkat.

python
"""Eksplorasi dataset indikator kesehatan: univariat, bivariat, peringkat."""
from pathlib import Path
import tempfile

import pandas as pd

from buat_dataset import bersihkan, buat_dataset


if __name__ == "__main__":
    with tempfile.TemporaryDirectory() as folder:
        berkas = Path(folder) / "indikator_kesehatan.csv"
        buat_dataset().to_csv(berkas, index=False)
        mentah = pd.read_csv(berkas, dtype={"kode_provinsi": "str"})

    df = bersihkan(mentah)
    print(f"data bersih: {len(df)} baris x {df.shape[1]} kolom\n")

    print("== Univariat: statistik kolom numerik (dibulatkan 1 desimal) ==")
    print(
        df[["jumlah_puskesmas", "jumlah_rumah_sakit", "jumlah_dokter",
            "persen_akses_air_bersih"]].describe().round(1).to_string()
    )

    print("\n== Univariat: kuantil persen akses air bersih ==")
    print(df["persen_akses_air_bersih"].quantile([0.25, 0.5, 0.75]).to_string())

    print("\n== Univariat: banyak baris per tahun (value_counts) ==")
    print(df["tahun"].value_counts().sort_index().to_string())

    print("\n== Bivariat: rata-rata persen per tahun ==")
    print(df.groupby("tahun")["persen_akses_air_bersih"].mean().round(1).to_string())

    print("\n== Bivariat: rata-rata persen per provinsi (5 teratas) ==")
    per_prov = df.groupby("nama_provinsi")["persen_akses_air_bersih"].mean()
    print(per_prov.sort_values(ascending=False).head(5).round(1).to_string())

    print("\n== Bivariat: korelasi antarkolom numerik ==")
    print(df.corr(numeric_only=True).round(2).to_string())

    print("\n== Peringkat: tiga baris dengan dokter terbanyak ==")
    print(
        df.nlargest(3, "jumlah_dokter")[
            ["nama_provinsi", "tahun", "jumlah_dokter"]
        ].to_string(index=False)
    )

    print("\n== Peringkat: tiga baris dengan dokter paling sedikit ==")
    print(
        df.nsmallest(3, "jumlah_dokter")[
            ["nama_provinsi", "tahun", "jumlah_dokter"]
        ].to_string(index=False)
    )

Output yang Dihasilkan:

text
data bersih: 102 baris x 7 kolom

== Univariat: statistik kolom numerik (dibulatkan 1 desimal) ==
       jumlah_puskesmas  jumlah_rumah_sakit  jumlah_dokter  persen_akses_air_bersih
count             102.0               102.0          102.0                    102.0
mean              191.5                24.6         3013.2                     66.4
std               146.1                19.2         2324.5                      5.6
min                50.0                 6.0          778.0                     57.8
25%               103.2                13.0         1615.8                     62.3
50%               140.0                17.5         2196.0                     64.9
75%               243.8                32.0         3649.0                     68.5
max               593.0                78.0         9643.0                     84.0

== Univariat: kuantil persen akses air bersih ==
0.25    62.325
0.50    64.900
0.75    68.525

== Univariat: banyak baris per tahun (value_counts) ==
tahun
2022    34
2023    34
2024    34

== Bivariat: rata-rata persen per tahun ==
tahun
2022    65.8
2023    66.6
2024    66.9

== Bivariat: rata-rata persen per provinsi (5 teratas) ==
nama_provinsi
Jawa Barat        80.8
Jawa Timur        80.4
Jawa Tengah       78.4
DKI Jakarta       76.6
Sumatera Utara    71.8

== Bivariat: korelasi antarkolom numerik ==
                         tahun  jumlah_puskesmas  jumlah_rumah_sakit  jumlah_dokter  persen_akses_air_bersih
tahun                     1.00              0.04                0.02           0.04                     0.08
jumlah_puskesmas          0.04              1.00                0.99           0.99                     0.95
jumlah_rumah_sakit        0.02              0.99                1.00           0.99                     0.95
jumlah_dokter             0.04              0.99                0.99           1.00                     0.95
persen_akses_air_bersih   0.08              0.95                0.95           0.95                     1.00

== Peringkat: tiga baris dengan dokter terbanyak ==
nama_provinsi  tahun  jumlah_dokter
   Jawa Timur   2024           9643
   Jawa Barat   2023           9279
   Jawa Barat   2024           9045

== Peringkat: tiga baris dengan dokter paling sedikit ==
   nama_provinsi  tahun  jumlah_dokter
        Bengkulu   2022            778
  Sulawesi Barat   2022            780
Kalimantan Utara   2022            786

Struktur skripnya sederhana: satu blok TemporaryDirectory untuk menyimulasikan unduhan, satu pemanggilan bersihkan(mentah), lalu serangkaian cetakan per lapis. Karena data masuknya deterministik, seluruh angka pada output pasti sama di komputer Anda.

Membaca Hasil Univariat #

Bagian univariat membaca tiga tabel pertama. Statistik ringkas memperlihatkan provinsi paling sedikit memiliki 50 puskesmas, 6 rumah sakit, dan 778 dokter, sedangkan yang terbanyak mencapai 593 puskesmas dan 9.643 dokter — rentang yang lebar karena ukuran provinsi berbeda jauh. Kuantil persen akses air bersih bernilai 62.3, 64.9, dan 68.5; median 64.9 di bawah rata-rata 66.4 menandakan sebaran condong ke kanan, ditarik provinsi-provinsi besar. value_counts() pada tahun menghasilkan 34 baris untuk tiap tahun — pemeriksaan kelengkapan murah yang memastikan tidak ada tahun hilang setelah pembersihan.

Membaca Hasil Bivariat #

Bagian bivariat menghitung rata-rata persen per tahun lewat df.groupby("tahun"), rata-rata per provinsi yang diurutkan dengan sort_values(ascending=False).head(5), lalu matriks df.corr(numeric_only=True). Rata-rata persen nasional naik perlahan dari 65.8 (2022) ke 66.6 (2023) dan 66.9 (2024), sementara lima provinsi teratas — Jawa Barat 80.8, Jawa Timur 80.4, Jawa Tengah 78.4, DKI Jakarta 76.6, dan Sumatera Utara 71.8 — semuanya provinsi besar. Matriks korelasi menjelaskan polanya: tiga kolom jumlah saling berkorelasi 0.99 karena digerakkan ukuran provinsi yang sama, dan persen akses ikut berkorelasi 0.95 dengan ketiganya.

Ada satu angka yang mudah terlewat: korelasi tahun terhadap kolom jumlah hanya 0.02 sampai 0.08. Pertumbuhan tahunan memang ada, tetapi variasi antar provinsi jauh lebih besar sehingga pengaruh tahun nyaris tenggelam — pengingat bahwa korelasi peka terhadap skala variasi.

Membaca Peringkat dengan nlargest dan nsmallest #

Lapis terakhir menjawab pertanyaan “yang mana”. nlargest(3, "jumlah_dokter") menghasilkan Jawa Timur 2024 (9.643 dokter), Jawa Barat 2023 (9.279), dan Jawa Barat 2024 (9.045) — perhatikan bahwa 2023 bisa mengungguli 2024 karena noise antartahun. nsmallest(3, "jumlah_dokter") menghasilkan Bengkulu 2022 (778), Sulawesi Barat 2022 (780), dan Kalimantan Utara 2022 (786). Kedua tabel hanya menampilkan tiga kolom relevan dan dicetak dengan to_string(index=False) agar rapi.

Ketiga lapis eksplorasi ini sudah menjawab banyak hal, tetapi masih tersebar di beberapa tabel. Bagian 4 menyatukannya: ringkasan provinsi-tahun berbentuk matriks lewat pivot_table(), daftar temuan bernomor, ekspor CSV, dan narasi batasan data yang jujur.

Sumber bacaan resmi: pandas.DataFrame.groupby , pandas.DataFrame.corr , pandas.DataFrame.nlargest , dan pandas.Series.quantile .