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.
"""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:
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 786Struktur 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 .