Mengapa File CSV Lebih Sulit daripada yang Terlihat
Ketika saya bertanya kepada siswa baru tentang apa yang bisa salah dengan file CSV, mereka biasanya menjawab "tidak banyak—hanya teks." Kemudian saya menunjukkan kepada mereka koleksi mimpi buruk CSV dari dunia nyata saya, dan kepercayaan diri mereka menguap. CSV adalah singkatan dari "comma-separated values," tetapi nama itu menyesatkan. Dalam praktiknya, file CSV dipisahkan oleh koma, titik koma, tab, pipa, atau karakter lain yang dirasakan oleh orang yang mengekspor data pada hari itu. Mereka mungkin memiliki header, atau mungkin tidak. Mereka mungkin menggunakan tanda kutip di sekitar kolom teks, atau mereka mungkin menggunakan tanda kutip secara tidak konsisten. Mereka mungkin mengkodekan tanggal sebagai "MM/DD/YYYY" atau "DD-MM-YYYY" atau "YYYY/MM/DD" atau sebagai timestamp Unix atau sebagai nomor seri Excel (ya, sungguh). "Standar" CSV (RFC 4180) lebih merupakan saran yang dengan ceria diabaikan oleh sebagian besar perangkat lunak. Microsoft Excel mengekspor CSV dengan cara berbeda tergantung pada pengaturan regional Anda. Google Sheets memiliki idenya sendiri tentang format. Ekspor basis data mengikuti seperangkat konvensi lain. Dan ketika Anda menarik data dari beberapa sumber—yang pada dasarnya adalah setiap proyek dunia nyata—Anda dijamin akan menghadapi ketidakkonsistenan. Inilah yang membuat ini sangat berbahaya: Pandas akan mencoba untuk membantu. Ini akan membuat asumsi tentang tipe data Anda, pemisah Anda, pengkodean Anda, dan nilai-nilai yang hilang. Terkadang asumsi tersebut benar. Terkadang mereka salah secara bencana. Dan terkadang—seperti dalam kasus Sarah—mereka salah dengan cara yang tidak mengeluarkan kesalahan, mereka hanya diam-diam merusak data Anda. Saya telah melihat siswa menghabiskan berhari-hari membangun model pembelajaran mesin yang canggih pada dataset di mana Pandas salah mengurai 30% dari tanggal. Saya telah menyaksikan analis menyajikan rekomendasi bisnis berdasarkan angka pendapatan di mana Pandas mengartikan simbol mata uang sebagai teks dan mengonversi semuanya menjadi string. Saya telah mengatasi situasi di mana Pandas membaca "N/A" sebagai data yang hilang di satu kolom tetapi sebagai string literal "N/A" di kolom lain, karena tipe data berbeda. Solusinya bukan untuk menghindari file CSV—mereka ada di mana-mana dan sering kali tidak dapat dihindari. Solusinya adalah untuk memahami dengan tepat apa yang dilakukan Pandas saat ia membaca CSV Anda, dan untuk secara eksplisit mengendalikan setiap asumsi yang dibuatnya. Itu adalah tujuan tutorial ini: beralih dari "Saya berharap ini berhasil" menjadi "Saya tahu persis apa yang terjadi dengan data saya."Pipeline Membaca CSV di Pandas: Apa yang Sebenarnya Terjadi
Sebelum kita terjun ke kode, Anda perlu memahami apa yang terjadi di balik layar saat Anda memanggil `pd.read_csv()`. Ini bukan pengetahuan akademis—memahami pipeline ini adalah apa yang memisahkan siswa yang berjuang dengan file CSV dari siswa yang menanganinya dengan percaya diri. Ketika Pandas membaca file CSV, ia melewati beberapa fase yang berbeda: Fase 1: Akses File dan Deteksi Pengkodean Pandas membuka file dan mencoba mendekode byte menjadi teks. Secara default, ia mengasumsikan pengkodean UTF-8, yang bekerja untuk banyak file modern tetapi gagal spektakuler untuk data yang lebih lama. Jika pengkodean salah, Pandas mungkin mengeluarkan kesalahan, atau ia mungkin diam-diam mengganti karakter bermasalah dengan tanda tanya atau karakter pengganti Unicode. Fase 2: Deteksi Pemisah Pandas melihat beberapa baris pertama untuk menebak karakter apa yang memisahkan kolom Anda. Biasanya cukup baik dalam hal ini, tetapi "cukup baik" tidak sama dengan "selalu benar." Saya telah melihat file di mana 100 baris pertama menggunakan koma, tetapi baris 101 beralih ke titik koma karena seseorang mengedit file secara manual. Fase 3: Deteksi Header Pandas mengasumsikan bahwa baris pertama Anda berisi nama kolom kecuali Anda memberi tahunya sebaliknya. Jika CSV Anda tidak memiliki header, Pandas akan memperlakukan baris data pertama Anda sebagai nama kolom, yang menciptakan kekacauan. Jika CSV Anda memiliki beberapa baris header (umum dalam ekspor Excel), Pandas hanya akan menggunakan yang pertama. Fase 4: Inferensi Tipe Data Di sinilah hal-hal mulai menjadi menarik. Pandas memeriksa beberapa baris pertama dari setiap kolom dan menebak tipe data. Angka menjadi integer atau float. Teks menjadi string (atau “object” tipe data dalam terminologi Pandas). Tanggal... yah, tanggal cukup rumit. Pandas akan mencoba menguraikannya jika tampak seperti tanggal, tetapi definisi "mirip tanggal" mungkin tidak cocok dengan data Anda. Fase 5: Penanganan Nilai yang Hilang Pandas memiliki daftar bawaan string yang diperlakukan sebagai nilai yang hilang: "NA", "N/A", "NULL", "NaN", string kosong, dan beberapa lainnya. Jika data Anda menggunakan konvensi yang berbeda (seperti "MISSING" atau "---" atau "9999"), Pandas tidak akan mengenalinya sebagai nilai yang hilang. Setiap fase ini melibatkan asumsi. Dan setiap asumsi adalah kesempatan untuk kerusakan data yang diam. Kunci untuk impor CSV yang dapat diandalkan adalah membuat asumsi ini eksplisit melalui parameter.Kisah Titik Desimal yang Tidak Terlihat
Izinkan saya memberi tahu Anda tentang Marcus, seorang siswa dari kelompok musim semi 2023 saya. Dia sedang menganalisis data penjualan untuk perusahaan e-commerce Eropa, dan analisanya menunjukkan bahwa nilai pesanan rata-rata secara misterius turun 90% di Q3. Manajernya panik, berpikir mereka memiliki masalah bisnis besar. Marcus menghabiskan dua hari menyelidiki. Dia memeriksa kueri basis data, memverifikasi proses ekspor, memeriksa file CSV mentah di editor teks—semuanya tampak baik-baik saja. Angka-angka dalam CSV benar: "1.234,56" untuk seribu dua ratus tiga puluh empat euro dan lima puluh enam sen, menggunakan konvensi Eropa tentang titik untuk pemisah ribuan dan koma untuk titik decimal. Tetapi ketika dia memuat data ke dalam Pandas, angka-angka itu menjadi 1.234 (satu titik dua tiga empat). Pandas melihat titik dan mengartikannya sebagai titik desimal, karena itu adalah konvensi Amerika. Koma? Pandas menganggap itu sebagai pemisah ribuan dan mengabaikannya. Jadi "1.234,56" menjadi 1.234, dan "5.678,90" menjadi 5.678. Setiap nilai moneter dalam dataset salah oleh faktor 100 atau lebih. Perbaikannya sederhana setelah kami mengidentifikasinya: tentukan parameter `decimal` dan `thousands` dalam `pd.read_csv()`. Tetapi menemukan masalahnya memerlukan waktu berhari-hari karena data tampak wajar pada pandangan pertama. Angka-angka tersebut adalah numerik, mereka berada di kolom yang benar, mereka kebetulan sepenuhnya salah. Inilah yang saya maksud ketika saya mengatakan impor CSV itu berbahaya. Kesalahan tidak selalu jelas. Mereka tidak selalu melempar pengecualian. Terkadang data Anda hanya menjadi tidak benar dengan tenang, dan Anda tidak menyadari sampai Anda telah membuat keputusan berdasarkan data tersebut. Kisah Marcus memiliki akhir yang bahagia—kami menangkap kesalahan itu sebelum kerusakan sebenarnya terjadi. Tetapi saya telah mendengar cerita horor dari rekan industri tentang analisis yang sampai ke presentasi eksekutif sebelum seseorang menyadari data tersebut salah. Satu perusahaan hampir membuat keputusan investasi multi-juta dolar berdasarkan impor CSV yang rusak.Memahami Tipe Data: Fondasi dari Impor yang Benar
Mari kita praktis. Berikut adalah tabel yang menunjukkan masalah tipe data paling umum yang saya lihat di proyek siswa, dan cara menanganinya:| Tipe Data | Masalah Umum | Perilaku Default Pandas | Pendekatan yang Benar |
|---|---|---|---|
| Integer | Nol di depan (kode pos), angka besar disimpan sebagai teks | Mengonversi ke int64, menghilangkan nol di depan | Gunakan dtype='str' untuk kode, dtype='Int64' untuk integer yang dapat bernilai null |
| Float | Simbol mata uang, pemisah ribuan, desimal Eropa | Mengonversi ke objek (string) jika karakter non-numerik ada | Bersihkan data terlebih dahulu atau gunakan parameter converters |
| Tanggal | Banyak format, masalah zona waktu, tanggal serial Excel | Menjaga sebagai string kecuali formatnya jelas | Gunakan parse_dates dengan string format eksplisit |
| Boolean | Ya/Tidak, Benar/Salah, 1/0, variasi Y/N | Menjaga sebagai string | Gunakan converter atau peta setelah impor |
| Kategori | Nilai string yang diulang (negara bagian, negara, jenis produk) | Menyimpan sebagai objek, membuang memori | Gunakan dtype='category' untuk efisiensi |
| Nilai yang Hilang | String kosong, "N/A", "NULL", "---", 9999, dll. | Hanya mengenali nilai NA standar | Gunakan parameter na_values untuk menentukan indikator kustom yang hilang |
Masalah Pengkodean: Mengapa Data Internasional Anda Rusak
Izinkan saya membagikan sesuatu yang mengejutkan sebagian besar siswa: ada puluhan cara berbeda untuk mengkodekan teks sebagai byte, dan file CSV tidak menyertakan metadata tentang pengkodean apa yang mereka gunakan. Anda hanya perlu menebak, dan jika Anda menebak salah, data Anda akan rusak."Saya menghabiskan enam bulan menganalisis data umpan balik pelanggan sebelum saya menyadari bahwa setiap tanda aksen, setiap emoji, setiap karakter non-Inggris dalam ulasan internasional kami telah rusak selama impor. Model analisis sentimen kami dilatih pada data sampah, dan tidak ada yang memperhatikan karena ulasan bahasa Inggris tampak baik-baik saja." — Mantan siswa, sekarang insinyur ML di perusahaan Fortune 500UTF-8 adalah standar modern dan harus menjadi tebakan pertama Anda. Tetapi sistem yang lebih tua sering menggunakan Latin-1 (juga disebut ISO-8859-1), sistem Windows mungkin menggunakan CP1252, dan jika Anda bekerja dengan data dari Asia Timur, Anda mungkin menemui Shift-JIS, GB2312, atau Big5. Bagaimana Anda tahu pengkodean mana yang harus digunakan? Terkadang Anda dapat bertanya kepada siapa pun yang memberi Anda file tersebut. Terkadang Anda dapat...