Penggabungan Sumber

Disiplin merge antar tabel: kebersihan kunci, jenis join, dan pemeriksaan hasilnya.

Daftar isi

Jawaban analisis hampir selalu tersebar di lebih dari satu sumber, dan penggabungannya adalah titik yang paling sering menggandakan baris diam-diam. Topik ini menetapkan disiplin merge pada pandas, mulai dari kebersihan kunci, pemilihan jenis join, pemeriksaan kardinalitas dengan validate, sampai audit baris yang tidak mendapat pasangan. Setelah membacanya, data pengukuran dan metadata stasiun pada dataset latihan ini dapat digabungkan dengan bukti bahwa jumlah barisnya tetap benar.

Kunci yang bersih mendahului join#

Merge memasangkan baris dengan membandingkan nilai kunci, sehingga kunci yang kotor memasangkan baris dengan pasangan yang salah atau tidak memasangkan sama sekali. Pembersihan kunci pada kedua sisi mendahului merge, dan pada dataset latihan ini berarti menyeragamkan nama stasiun terlebih dahulu, sebagaimana dikerjakan pada topik teks dan tanggal.

Pemeriksaan minimum yang murah adalah unique() pada kunci kedua sisi serta dtypes-nya, karena kunci berupa teks yang dibandingkan dengan kunci berupa angka menghasilkan join kosong tanpa error apa pun. Kunci dengan spasi menempel adalah bentuk yang paling sering lolos, dan .str.strip() pada kedua sisi menutupnya.

Keunikan kunci juga diperiksa sebelum join. Tabel metadata yang kuncinya tidak unik memasangkan setiap baris data dengan lebih dari satu pasangan, dan jumlah baris hasilnya membengkak tanpa peringatan, sehingga pemeriksaan duplicated() pada tabel kunci menjadi kebiasaan sebelum merge.

Jenis join dan yang dipilih secara bawaan#

Empat jenis join menjawab empat pertanyaan berbeda, dan tabel berikut merangkumnya.

JenisBaris yang dipertahankanPemakaian khas
inneryang punya pasangan di kedua sisianalisis yang butuh kedua sisi lengkap
leftseluruh baris kirimenempel metadata pada data utama
rightseluruh baris kananjarang dipakai, ditulis ulang sebagai left
outersemua baris kedua sisiaudit selisih antar sumber

Pilihan bawaan yang sehat untuk pekerjaan analisis adalah how="left" pada tabel data utama, karena pengukuran yang metadata-nya tidak ditemukan tetap tampil dengan kolom metadata kosong, dan kekosongan itu terlihat alih-alih menghilang sebagaimana pada inner join. Skrip berikut menggabungkan pengukuran dengan metadata stasiun, dengan pemeriksaan kardinalitas validate="m:1" yang menegaskan setiap nama stasiun unik di sisi metadata.

python penggabungan_sumber.py
"""Penggabungan dua sumber dengan merge: kunci bersih, jenis join, dan pemeriksaan."""
import pandas as pd

data = pd.read_csv(
    "ukuran_udara.csv",
    na_values=["kosong", "-999.0"],
    dtype={"pm25": "string", "kelembapan": "string"},
)
data["pm25"] = data["pm25"].astype("float")
data["stasiun"] = (
    data["stasiun"].str.strip().str.replace(r"\s+", " ", regex=True).str.title()
)
stasiun = pd.read_csv("stasiun.csv")

gabung = data.merge(
    stasiun, left_on="stasiun", right_on="nama", how="left", validate="m:1"
)
print(int(gabung["wilayah"].isna().sum()), "baris tanpa pasangan metadata")
print(gabung[["stasiun", "wilayah", "tahun_operasi"]].head(3).to_string(index=False))
print()

dipakai = set(data["stasiun"])
tanpa_ukur = [n for n in stasiun["nama"] if n not in dipakai]
print("stasiun pada metadata tanpa pengukuran:", tanpa_ukur)
text Keluaran
0 baris tanpa pasangan metadata
  stasiun         wilayah  tahun_operasi
Stasiun A Kawasan Sekolah           2019
Stasiun A Kawasan Sekolah           2019
Stasiun A Kawasan Sekolah           2019

stasiun pada metadata tanpa pengukuran: ['Stasiun C', 'Stasiun D']

Argumen validate="m:1" adalah pengaman yang paling sering menyelamatkan hasil, yaitu ia menghentikan merge dengan error apabila kunci di sisi kanan ternyata tidak unik, keadaan yang tanpa pengaman menggandakan baris data diam-diam. Kolom nama pada metadata berdampingan dengan kolom stasiun pada data, dan salah satu di antaranya dihapus setelah pemeriksaan bila hasilnya dipakai lebih lanjut.

Mengaudit baris tanpa pasangan#

Setiap join meninggalkan dua pertanyaan yang wajib dijawab, yaitu baris kiri mana yang tidak mendapat pasangan dan baris kanan mana yang tidak dipakai. Pertanyaan pertama dijawab dengan menghitung isna() pada kolom hasil join, yang pada keluaran di atas bernilai nol karena kedua stasiun data terdapat pada metadata.

Pertanyaan kedua adalah anti-join, yaitu mencari baris kanan yang tidak muncul di kiri, dan pada dataset ini metadatanya memuat Stasiun C dan D yang tidak memiliki pengukuran. Temuan itu bukan kesalahan, melainkan informasi yang harus diputuskan, misalnya metadata tersebut diperlukan untuk laporan ketersediaan alat, atau justru ditandai bahwa sumber datanya belum lengkap.

Pola audit yang paling eksplisit adalah merge dengan argumen indicator=True, yang menambahkan kolom merge berisi both, left_only, atau right_only untuk setiap baris, dan value_counts() pada kolom itu memberikan laporan lengkap dalam satu baris. Pola inilah yang dipakai ulang setiap kali kedua sumber berpotensi tidak selaras.

Kesalahan umum#

Kesalahan pertama adalah merge tanpa validate, sehingga kunci kanan yang tidak unik menggandakan baris dan seluruh statistik turunnya ikut dobel. Jumlah baris sebelum dan sesudah merge selalu dibandingkan, dan validate membuat pemeriksaan itu otomatis.

Kesalahan kedua adalah memilih inner join karena hasilnya tampak bersih. Baris yang hilang pasangannya menghilang tanpa jejak, dan kehilangan itu baru ketahuan saat laporan tidak cocok dengan sumber lainnya. Left join dengan audit kekosongan mempertahankan kejujuran jumlah baris.

Kesalahan ketiga adalah menggabungkan pada kunci yang belum diseragamkan, dan gejalanya adalah join yang kosong atau sebagian kosong. Pembersihan teks pada kedua sisi kunci, dilanjutkan unique() untuk membandingkan daftarnya, adalah pemeriksaan sepuluh detik yang mencegahnya.

Ringkasan#

  • Kunci dibersihkan dan diuji keunikannya pada kedua sisi sebelum merge, termasuk spasi menempel dan perbedaan tipe.
  • how="left" pada tabel data utama mempertahankan baris yang metadata-nya kosong, sehingga kekosongan tetap terlihat.
  • validate="m:1" menghentikan merge yang akan menggandakan baris, dan audit baris tanpa pasangan dilakukan dengan isna() maupun indicator=True.
  • Anti-join menghasilkan informasi yang diputuskan dan dicatat, bukan kesalahan yang disembunyikan.

Referensi#