Inilah bagian penutup proyek. Eksplorasi pada Bagian 3 menghasilkan banyak angka yang tersebar di beberapa tabel; pembaca laporan tidak boleh disuruh menyusunnya sendiri. Tugas terakhir kita adalah merapikan temuan ke dalam satu matriks ringkasan provinsi-tahun, mengambil lima temuan utama yang seluruh angkanya dihitung dari data, mengekspor ringkasan itu ke CSV, lalu menutup analisis dengan narasi batasan data yang jujur. Semua tekniknya sudah Anda kenal — pivot_table() dari section Menggabungkan dan Membentuk Data, groupby() dari section GroupBy dan Agregasi, dan to_csv() dari section Membaca dan Menulis Data — sehingga fokus kita adalah merangkainya menjadi produk akhir.
Matriks Ringkasan Provinsi x Tahun #
"""Menyusun temuan akhir: pivot ringkasan, temuan bernomor, ekspor CSV."""
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)
# 1) pivot ringkasan: provinsi x tahun untuk persen akses air bersih
matriks = df.pivot_table(
index="nama_provinsi",
columns="tahun",
values="persen_akses_air_bersih",
aggfunc="mean",
)
print(f"== Matriks persen provinsi x tahun: {matriks.shape[0]} x {matriks.shape[1]} ==")
print(matriks.head(4).round(1).to_string())
# 2) ringkasan per provinsi
ringkasan = pd.DataFrame({
"persen_rata2": df.groupby("nama_provinsi")["persen_akses_air_bersih"]
.mean()
.round(1),
"persen_2022": matriks[2022],
"persen_2024": matriks[2024],
})
ringkasan["perubahan_poin"] = (
ringkasan["persen_2024"] - ringkasan["persen_2022"]
).round(1)
ringkasan["dokter_2024"] = df[df["tahun"] == 2024].set_index("nama_provinsi")[
"jumlah_dokter"
]
ringkasan = ringkasan.sort_values("persen_rata2", ascending=False)
# 3) temuan bernomor (seluruh angka dihitung dari data, bukan diketik)
nasional = df.groupby("tahun")["persen_akses_air_bersih"].mean().round(1)
korr = df.corr(numeric_only=True)
total24 = df[df["tahun"] == 2024][["jumlah_puskesmas", "jumlah_dokter"]].sum()
i_naik = ringkasan["perubahan_poin"].idxmax()
i_turun = ringkasan["perubahan_poin"].idxmin()
print("\n== Temuan utama ==")
print(
f"1. Akses tertinggi {ringkasan.index[0]} "
f"({ringkasan['persen_rata2'].iloc[0]}%), terendah {ringkasan.index[-1]} "
f"({ringkasan['persen_rata2'].iloc[-1]}%)"
)
print(
f"2. Rata-rata nasional {nasional[2022]} (2022) -> {nasional[2024]} (2024), "
f"naik {round(nasional[2024] - nasional[2022], 1)} poin"
)
print(
f"3. Perubahan 2022->2024 terbesar {i_naik} "
f"(+{ringkasan.loc[i_naik, 'perubahan_poin']} poin), terendah {i_turun} "
f"({ringkasan.loc[i_turun, 'perubahan_poin']} poin)"
)
print(
"4. Korelasi terkuat antarkolom jumlah: dokter-puskesmas "
f"{korr.loc['jumlah_dokter', 'jumlah_puskesmas']:.2f}; "
"persen vs dokter "
f"{korr.loc['persen_akses_air_bersih', 'jumlah_dokter']:.2f}"
)
print(
f"5. Beban layanan 2024: {total24['jumlah_puskesmas']} puskesmas dan "
f"{total24['jumlah_dokter']} dokter"
)
# 4) ekspor ringkasan CSV lalu baca ulang (folder sementara terhapus otomatis)
print("\n== Ekspor ringkasan_provinsi.csv ==")
with tempfile.TemporaryDirectory() as folder:
berkas = Path(folder) / "ringkasan_provinsi.csv"
ringkasan.to_csv(berkas, index_label="nama_provinsi")
print(f"tersimpan: {berkas.name} ({berkas.stat().st_size} byte)")
kembali = pd.read_csv(berkas, index_col="nama_provinsi")
print(f"dibaca ulang: {kembali.shape[0]} baris x {kembali.shape[1]} kolom")
print(kembali.head(3).to_string())Output yang Dihasilkan:
== Matriks persen provinsi x tahun: 34 x 3 ==
tahun 2022 2023 2024
nama_provinsi
Aceh 61.6 64.1 61.8
Bali 64.7 62.8 66.0
Banten 67.1 68.7 70.0
Bengkulu 59.7 63.2 61.4
== Temuan utama ==
1. Akses tertinggi Jawa Barat (80.8%), terendah Maluku (60.0%)
2. Rata-rata nasional 65.8 (2022) -> 66.9 (2024), naik 1.1 poin
3. Perubahan 2022->2024 terbesar Sulawesi Tenggara (+5.8 poin), terendah Sulawesi Tengah (-2.8 poin)
4. Korelasi terkuat antarkolom jumlah: dokter-puskesmas 0.99; persen vs dokter 0.95
5. Beban layanan 2024: 6703 puskesmas dan 106096 dokter
== Ekspor ringkasan_provinsi.csv ==
tersimpan: ringkasan_provinsi.csv (1344 byte)
dibaca ulang: 34 baris x 5 kolom
persen_rata2 persen_2022 persen_2024 perubahan_poin dokter_2024
nama_provinsi
Jawa Barat 80.8 79.7 84.0 4.3 9045
Jawa Timur 80.4 80.7 79.7 -1.0 9643
Jawa Tengah 78.4 79.1 78.2 -0.9 8717Skrip memuat ulang dataset mentah, membersihkannya dengan bersihkan() dari Bagian 2, lalu bekerja dalam empat blok. Beberapa bagian pentingnya:
pivot_table(index="nama_provinsi", columns="tahun", ...): data panjang 102 baris berubah menjadi matriks 34 x 3 dengan satu persen per sel;aggfunc="mean"dipilih karena polanya memang satu nilai per pasangan provinsi-tahun.pd.DataFrame({...}): tabelringkasanmenyatukan rata-rata tiga tahun darigroupby(), nilai 2022 dan 2024 dari kolom matriks, selisih keduanya sebagaiperubahan_poin, dandokter_2024dari baris 2024 yang di-set_index("nama_provinsi")— penyelarasan index membuat pengisian kolom itu benar tanpa loop.idxmax()danidxmin()padaperubahan_poinmenemukan provinsi dengan perubahan terbesar dan terendah secara langsung.to_csv(index_label="nama_provinsi")menulis ringkasan ke CSV di dalamTemporaryDirectory, laluread_csv(index_col="nama_provinsi")membacanya ulang — pola verifikasi ekspor yang sama dengan proyek-proyek sebelumnya.
Temuan Bernomor dari Angka yang Dihitung #
Blok “Temuan utama” mencetak lima temuan, dan tiap angkanya diambil dari DataFrame pada saat program berjalan, bukan diketik manual. Ringkasannya: akses tertinggi Jawa Barat (80.8%) dan terendah Maluku (60.0%); rata-rata nasional naik 1.1 poin dari 65.8 (2022) ke 66.9 (2024); perubahan terbesar justru Sulawesi Tenggara (+5.8 poin) sementara Sulawesi Tengah turun -2.8 poin; korelasi terkuat antarkolom jumlah adalah dokter-puskesmas 0.99 dengan persen akses mengikuti 0.95; dan beban layanan 2024 tercatat 6.703 puskesmas serta 106.096 dokter. Temuan yang paling menarik justru kontras di dalamnya: Jawa Timur memegang dokter terbanyak (9.643) tetapi persennya turun 1.0 poin — jumlah fasilitas dan kualitas akses tidak selalu bergerak searah.
Ekspor Ringkasan dan Batasan Data #
Hasil ekspor ringkasan_provinsi.csv berukuran 1.344 byte dan setelah dibaca ulang menghasilkan 34 baris x 5 kolom dengan baris teratas Jawa Barat (80.8), Jawa Timur (80.4), dan Jawa Tengah (78.4). Berkasnya tinggal di folder sementara yang terhapus otomatis; pada pekerjaan nyata, cukup ganti lokasinya dengan folder kerja Anda.
Sebelum menutup laporan, empat batasan perlu dinyatakan. Pertama, data ini simulasi: angkanya dibuat untuk latihan dan tidak meniru publikasi statistik resmi. Kedua, cakupannya agregat provinsi, sehingga keragaman antar kabupaten/kota di dalam satu provinsi tidak terlihat. Ketiga, hanya tujuh kolom dan tiga tahun yang tersedia — tidak ada jumlah penduduk sebagai pembagi, tidak ada uji signifikansi, dan tren dua tahun belum bisa disebut kecenderungan jangka panjang. Keempat, sebagian kecil sel adalah hasil pengisian median dari Bagian 2, dan temuan yang menyentuh sel tersebut sebaiknya dibaca sebagai perkiraan.
Proyek eksplorasi dataset terbuka sampai di sini secara utuh: dari memilih dan memahami berkas, membersihkan dan memvalidasi, mengeksplorasi, hingga menyusun temuan. Perjalanan berikutnya memakai bekal yang sama pada situasi yang lebih menantang — data tidak lagi datang dari satu CSV, melainkan dari banyak sumber sekaligus. Di proyek berikutnya, Pipeline ETL dengan Pandas, Bagian 1: Mengambil Data dari Berbagai Sumber memandu Anda menarik data dari beberapa format dan menggabungkannya sebelum diolah.
Sumber bacaan resmi: pandas.pivot_table , pandas.DataFrame.to_csv , dan pandas.read_csv .