Lewati ke konten utama

Membersihkan Data di SQL

Dalam tutorial ini, Anda akan mempelajari teknik untuk membersihkan data berantakan di SQL, keterampilan wajib bagi setiap data scientist.
Diperbarui 28 Sep 2026  · 10 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

Data dunia nyata hampir selalu berantakan. Sebagai data scientist, analis data, atau bahkan pengembang, jika Anda perlu menemukan fakta tentang data, sangat penting memastikan data cukup rapi untuk melakukannya. Sebenarnya ada definisi yang matang tentang data rapi (tidy data), dan Anda bisa melihat halaman wiki ini untuk menemukan lebih banyak sumber tentang topik tersebut.

Dalam tutorial ini, Anda akan berlatih beberapa teknik pembersihan data paling umum di SQL. Anda akan membuat dataset dummy sendiri, namun tekniknya dapat diterapkan juga pada data dunia nyata (berbentuk tabular). Ada banyak hal yang akan dibahas. Mari mulai!

Catatan bahwa Anda sebaiknya sudah mengetahui cara menulis kueri SQL dasar di PostgreSQL (RDBMS yang akan Anda gunakan dalam tutorial ini). Jika Anda perlu meninjau kembali konsepnya, berikut beberapa sumber yang mungkin berguna:

Beragam tipe data, nilai yang berantakan, dan solusinya

Dalam data berbentuk tabel, tipe data yang paling umum adalah string, numeric, atau date-time. Anda bisa menjumpai nilai berantakan pada semua tipe ini. Sekarang mari ambil masing-masing tipe tersebut dan lihat beberapa contoh nilai berantakan beserta contohnya. Kita mulai dari tipe numeric.

Angka yang berantakan

Angka bisa berantakan dalam sejumlah cara. Di sini, Anda akan dikenalkan pada yang paling umum:

  • Tipe tidak diinginkan/Ketidaksesuaian tipe: Misalkan ada kolom bernama age dalam dataset yang sedang Anda kerjakan. Anda melihat nilai yang ada di kolom tersebut bertipe float—contohnya 23.0, 45.0, 34.0, dan seterusnya. Dalam kasus ini, Anda tidak perlu kolom age bertipe float. Bukankah begitu?

  • Nilai null: Meski ini umum terjadi pada semua tipe data yang disebutkan di atas, nilai null di sini sekadar berarti nilainya tidak tersedia/kosong. Namun, nilai null juga bisa hadir dalam bentuk lain. Ambil contoh dataset Pima Indian Diabetes. Dataset tersebut memuat nilai nol untuk kolom seperti Plasma glucose concentration, Diastolic blood pressure yang secara praktis tidak valid. Jika Anda melakukan analisis statistik pada dataset tanpa menangani entri tidak valid ini, analisis Anda tidak akan akurat.

Sekarang mari pelajari masalah yang bisa timbul dari isu-isu ini dan bagaimana menanganinya.

Masalah dengan angka berantakan dan cara menanganinya

Sekarang mari lihat masalah paling umum yang mungkin Anda hadapi jika Anda tidak membersihkan data berantakan (terkait tipe yang disebutkan sebelumnya).

1. Agregasi data

Misalkan Anda memiliki entri null untuk sebuah kolom numerik dan Anda menghitung statistik ringkasan (seperti mean, nilai maksimum, minimum) pada kolom tersebut. Hasilnya tidak akan tersampaikan secara akurat dalam kasus ini. Pertimbangkan lagi dataset Pima Indian Diabetes dengan entri nol yang tidak valid. Jika Anda menghitung statistik ringkasan pada kolom-kolom seperti disebutkan sebelumnya, apakah Anda akan mendapatkan hasil yang benar? Bukankah hasilnya akan keliru? Lalu, bagaimana mengatasinya? Ada beberapa cara:

- Removing the entries containing missing/null values (not recommended)
- Imputing the null entries with a numeric value (typically with mean or median of the respective column)

Sekarang mari praktik langsung dengan masalah ini dan opsi kedua untuk mengatasi nilai null.

Pertimbangkan tabel PostgreSQL berikut bernama entries:

PostgreSQL table

Anda dapat melihat dua entri null pada tabel di atas. Misalkan Anda ingin mendapatkan nilai rata-rata berat dari tabel ini dan Anda mengeksekusi kueri berikut:

select avg(weight_in_lbs) as average_weight_in_lbs from entries;

Anda mendapatkan keluaran 90.45. Apakah ini benar? Lalu, apa yang bisa dilakukan? Mari isi entri null dengan nilai rata-rata ini dengan bantuan fungsi COALESCE().

Mari isi nilai yang hilang terlebih dahulu dengan COALESCE() (ingat bahwa COALESCE() tidak mengubah nilai di tabel asli, fungsi ini hanya mengembalikan tampilan sementara dari tabel dengan nilai yang telah diubah):

select *, COALESCE(weight_in_lbs, 90.45) as corrected_weights from entries;

Anda seharusnya mendapatkan keluaran seperti:

output

Sekarang Anda bisa menerapkan AVG() lagi:

select avg(corrected_weights) from
(select *, COALESCE(weight_in_lbs, 90.45) as corrected_weights from entries) as subquery;

Ini adalah hasil yang jauh lebih akurat daripada sebelumnya. Sekarang mari pelajari masalah lain yang dapat terjadi jika Anda memiliki ketidaksesuaian pada tipe data kolom.

2. Join tabel

Misalkan Anda bekerja dengan tabel student_metadata dan department_details berikut:

tables

Anda dapat melihat pada tabel student_mtadata, dept_id bertipe integer, dan pada tabel department_details, kolom tersebut bertipe teks. Sekarang, misalkan Anda ingin menggabungkan kedua tabel ini dan membuat laporan yang akan memuat kolom berikut:

  • id
  • name
  • dept_name

Untuk melakukan ini, Anda menjalankan kueri berikut:

select id, name, dept_name from
student_metadata s join department_details d
on s.dept_id = d.dept_id;

Lalu Anda akan menjumpai galat berikut:

ERROR: operator does not exist: smallint = text

Berikut infografik yang sangat bagus yang menggambarkan masalah ini (dari kursus DataCamp Reporting in SQL):

infographic

Ini terjadi karena tipe data tidak cocok saat menggabungkan kedua tabel. Di sini, Anda bisa melakukan CAST pada kolom dept_id di tabel department_details menjadi integer saat melakukan join. Berikut caranya:

select id, name, dept_name from
student_metadata s join department_details d
on s.dept_id = cast(d.dept_id as smallint);

Dan Anda mendapatkan laporan yang diinginkan:

report

Sekarang mari bahas bagaimana string dapat hadir dalam bentuk berantakan, masalahnya, dan cara menanganinya.

String berantakan dan cara membersihkannya

Nilai string juga sangat umum. Mari mulai bagian ini dengan melihat nilai pada kolom dept_name (menunjukkan nama departemen) yang diambil dari tabel bernama student_details:

table

Nilai string seperti di atas dapat menyebabkan banyak masalah tak terduga. I.T, Information Technology, dan i.t semuanya bermakna departemen yang sama, yaitu Information Technology dan misalkan dokumen spesifikasi mengharuskan nilainya hadir sebagai I.T saja. Sekarang, katakanlah Anda ingin menghitung jumlah siswa yang berasal dari departemen I.T., dan Anda menjalankan kueri ini:

select dept_name, count(dept_name) as student_count
from student_details
group by dept_name;

Dan Anda mendapatkan:

output

Apakah ini laporan yang akurat? - Tidak! Lalu, bagaimana Anda dapat mengatasi masalah ini?

Mari identifikasi dulu masalahnya secara lebih terperinci:

  • Anda memiliki Information Technology sebagai nilai yang harus diubah menjadi I.T dan
  • Anda memiliki i.t sebagai nilai lain yang harus diubah menjadi I.T.

Pada kasus pertama, Anda dapat melakukan REPLACE nilai Information Technology menjadi I.T, dan pada kasus kedua, Anda mengubah karakter menjadi huruf UPPER. Anda dapat menyelesaikan ini dalam satu kueri meski disarankan untuk menangani masalah seperti ini secara bertahap. Berikut kueri untuk mengatasi masalahnya:

select upper(replace(dept_name, 'Information Technology', 'I.T')) as dept_cleaned,
count(dept_name) as student_count
from student_details
group by dept_cleaned;

Dan laporannya:

report

Anda dapat membaca lebih lanjut tentang fungsi string PostgreSQL di sini.

Sekarang mari bahas beberapa contoh di mana nilai date dapat berantakan dan apa yang bisa Anda lakukan untuk membersihkannya.

Tanggal berantakan dan cara membersihkannya

Misalkan Anda bekerja dengan tabel bernama employees yang memuat kolom birthdate tetapi bukan dalam tipe tanggal yang sesuai. Sekarang, Anda ingin mengeksekusi kueri dengan fungsi date khusus seperti DATE_PART(). Anda tidak akan bisa melakukannya kecuali Anda melakukan CAST pada kolom birthdate menjadi tipe date. Mari lihat ini secara praktik.

Anggap birthdate berformat YYYY-MM-DD.

Berikut tampilan tabel employees:

employees table

Sekarang, Anda menjalankan kueri berikut untuk mengekstrak bulan dari tanggal lahir:

select date_part('month', birthdate) from employees;

Dan Anda langsung mendapatkan galat ini:

ERROR: function date_part(unknown, text) does not exist

Bersamaan dengan galat tersebut, Anda juga mendapat petunjuk yang sangat bagus:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Mari ikuti petunjuknya dan lakukan CAST pada birthdate ke tipe date yang sesuai lalu terapkan DATE_PART():

select date_part('month', CAST(birthdate AS date)) as birthday_months from employees;

Anda seharusnya mendapatkan hasil:

result

Sekarang mari lanjut ke bagian pra-penutup tutorial ini di mana Anda akan mempelajari dampak duplikasi data dan cara mengatasinya.

Duplikasi data: Penyebab, dampak, dan solusinya

Pada bagian ini, Anda akan mempelajari beberapa penyebab paling umum yang mengarah ke duplikasi data. Anda juga akan melihat dampaknya dan beberapa cara untuk mencegahnya. Pertimbangkan dua tabel berikut band_details dan some_festival_record:

tables

Tabel band_details menyampaikan informasi tentang grup musik; tabel ini berisi pengenal, nama, dan total pertunjukan yang telah mereka lakukan. Di sisi lain, tabel some_festival_record menggambarkan sebuah festival musik hipotetis dan memuat catatan tentang band yang tampil di sana.

Sekarang, misalkan Anda ingin membuat laporan yang memuat nama band, jumlah pertunjukan mereka, dan total berapa kali mereka tampil di festival. Diperlukan INNER join di sini. Anda menjalankan kueri berikut:

select band_name, sum(total_show_count) as total_shows, sum(performed) as total_times_performed
from band_details b join some_festival_record s
on b.id = s.band_id
group by band_name;

Dan kueri tersebut menghasilkan:

query product

Bukankah nilai total_shows di sini keliru? Karena dari tabel band_details, Anda tahu bahwa Band_1 telah menampilkan total 36 pertunjukan. Lalu apa yang salah di sini? Duplikasi!

Saat menggabungkan kedua tabel, Anda keliru melakukan agregasi pada kolom total_show_count yang menyebabkan duplikasi data pada hasil join perantara. Jika Anda menghapus agregasi dan menyesuaikan kuerinya, Anda akan mendapatkan hasil yang diharapkan:

select band_name, total_show_count, sum(performed) as total_times_performed
from band_details b join some_festival_record s
on b.id = s.band_id
group by band_name, total_show_count;

Sekarang Anda mendapatkan hasil yang diharapkan:

expected results

Ada cara lain untuk mencegah duplikasi data, yaitu menambahkan field lain dalam klausa JOIN agar tabel bergabung dengan kondisi yang lebih ketat.

Anda dapat menggunakan berkas .SQL ini untuk menghasilkan tabel yang digunakan di sini beserta nilai yang ditampilkan.

Melangkah lebih jauh

Terima kasih telah membaca tutorial ini. Tutorial ini memperkenalkan Anda pada salah satu langkah paling vital dalam alur analisis data—pembersihan data. Anda melihat berbagai bentuk data berantakan dan cara menanganinya. Namun, ada teknik yang lebih lanjut untuk menangani masalah pembersihan data yang lebih kompleks, dan jika Anda ingin mendalaminya, berikut beberapa kursus DataCamp yang sangat baik untuk Anda ikuti:

Jangan ragu untuk menyampaikan pandangan Anda di bagian Comments.

Topik
SQL

Kursus SQL

Kursus

Manipulasi Data di SQL

4 jam
338.8K
Kuasai kueri SQL yang kompleks yang diperlukan untuk menjawab berbagai pertanyaan ilmu data dan menyiapkan set data yang kuat untuk analisis di PostgreSQL.
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat SelengkapnyaLihat Selengkapnya