Skip to main content

Manipulasi String & Missing Data

Ketika bekerja dengan dataset, data yang kita dapatkan tidak selalu berada dalam kondisi yang ideal.

Kita dapat menemukan berbagai masalah seperti:

Format teks tidak konsisten
Data kosong
Data dengan nilai NaN
Data yang perlu diubah

Contohnya, sebuah kolom Make mungkin memiliki data:

Toyota
TOYOTA
toyota
Toyota

Walaupun secara makna semuanya menunjukkan merek yang sama, komputer dapat menganggapnya sebagai nilai yang berbeda karena perbedaan huruf besar dan kecil.

Kita juga dapat menemukan data yang kosong:

Odometer
150000
120000
NaN
90000

Kondisi seperti ini perlu ditangani sebelum data digunakan untuk analisis atau Machine Learning.

Pada materi ini kita akan mempelajari dua konsep utama:

  1. Manipulasi string pada kolom DataFrame.
  2. Penanganan missing data atau data yang hilang.

Manipulasi String pada Pandas

Pandas menyediakan fitur khusus untuk bekerja dengan data bertipe teks atau string.

Fitur tersebut dapat diakses melalui:

.str

Dengan .str, kita dapat menggunakan berbagai operasi string pada sebuah Series.

Contohnya:

car_sales["Make"].str.lower()

Kode tersebut digunakan untuk mengubah teks pada kolom Make menjadi huruf kecil.


Mengubah String Menjadi Huruf Kecil

Misalnya kita memiliki data:

Make
Toyota
HONDA
BMW
TOYOTA

Kita dapat mengubah seluruh nilai menjadi huruf kecil menggunakan:

car_sales["Make"].str.lower()

Hasilnya secara konseptual:

Toyota → toyota
HONDA → honda
BMW → bmw
TOYOTA → toyota

Hal ini dapat membantu membuat format data menjadi lebih konsisten.


Menggunakan .str.lower()

Contoh:

car_sales["Make"].str.lower()

.str memberitahu Pandas bahwa kita ingin melakukan operasi terhadap data string.

Sedangkan:

lower()

digunakan untuk mengubah huruf menjadi lowercase.

Secara sederhana:

Series

.str

lower()

String menjadi huruf kecil

Mengapa Data Teks Perlu Dibersihkan?

Data dari dunia nyata sering memiliki format yang tidak konsisten.

Misalnya:

Toyota
toyota
TOYOTA
ToYoTa

Secara manusia, kita memahami bahwa semuanya adalah:

Toyota

Tetapi komputer dapat memperlakukannya sebagai nilai yang berbeda.

Ketidakkonsistenan seperti ini dapat menyebabkan masalah ketika:

  • melakukan filtering
  • menghitung kategori
  • melakukan grouping
  • melakukan analisis
  • melakukan preprocessing Machine Learning

Karena itu, standardisasi data teks merupakan bagian dari proses data cleaning.


Pentingnya Reassignment

Salah satu konsep penting ketika bekerja dengan Pandas adalah reassignment atau penugasan ulang.

Misalnya kita menjalankan:

car_sales["Make"].str.lower()

Operasi tersebut menghasilkan Series baru.

Namun, perubahan tersebut tidak otomatis berarti kolom asli pada DataFrame telah berubah.

Jika kita ingin menyimpan hasilnya ke kolom tersebut, lakukan reassignment:

car_sales["Make"] = car_sales["Make"].str.lower()

Perhatikan bagian:

car_sales["Make"] =

Hasil dari operasi .str.lower() diberikan kembali ke kolom Make.


Memahami Reassignment

Secara sederhana:

Data asli

.str.lower()

Hasil baru

Ditugaskan kembali

DataFrame berubah

Contohnya:

car_sales["Make"] = car_sales["Make"].str.lower()

Sebelum:

Toyota
Honda
BMW

Setelah:

toyota
honda
bmw

Operasi Pandas Tidak Selalu Mengubah Data Asli

Ini merupakan konsep yang sangat penting.

Ketika kita melakukan:

car_sales["Make"].str.lower()

jangan langsung berasumsi bahwa DataFrame sudah berubah.

Untuk menyimpan hasilnya:

car_sales["Make"] = car_sales["Make"].str.lower()

Konsep yang sama akan sering muncul ketika kita melakukan berbagai transformasi data lainnya.

Misalnya:

car_sales["Price"] = car_sales["Price"] * 1000

atau:

car_sales["Make"] = car_sales["Make"].str.lower()

Jadi, biasakan memperhatikan apakah hasil operasi perlu disimpan kembali.


Missing Data

Selain masalah pada format data, dataset juga dapat memiliki missing data atau data yang hilang.

Contohnya:

MakeOdometer
Toyota150000
Honda120000
BMWNaN
Nissan90000

Pada baris BMW, nilai Odometer tidak tersedia.

Pandas biasanya merepresentasikan nilai yang hilang sebagai:

NaN

Apa Itu NaN?

NaN merupakan singkatan dari:

Not a Number

Dalam Pandas, NaN sering digunakan untuk merepresentasikan nilai yang tidak tersedia atau missing value.

Contohnya:

150000
120000
NaN
90000

Nilai NaN bukan berarti angka nol.

Perbedaannya:

0

Nilainya memang nol

NaN

Nilainya tidak tersedia / hilang

Ini merupakan perbedaan yang sangat penting.


Penyebab Missing Data

Missing data dapat terjadi karena berbagai alasan.

Misalnya:

Pengguna tidak mengisi data
Sensor gagal membaca nilai
Kesalahan saat input
Data tidak tersedia
Proses penggabungan dataset
Kesalahan ketika mengumpulkan data

Dalam dataset nyata, missing data merupakan sesuatu yang cukup umum.

Karena itu, kemampuan menangani missing data merupakan bagian penting dari Data Science dan Machine Learning.


Mengapa Missing Data Harus Ditangani?

Bayangkan kita memiliki data:

Odometer
100000
120000
NaN
90000

Jika kita ingin membuat model Machine Learning, keberadaan NaN dapat menyebabkan beberapa algoritma tidak dapat memproses data tersebut secara langsung.

Karena itu, kita perlu menentukan apa yang harus dilakukan terhadap missing value.

Beberapa pilihan:

Missing Data

├── Diisi dengan nilai tertentu

└── Baris/kolom dihapus

Keputusan tersebut harus disesuaikan dengan karakteristik dataset.


Mengisi Missing Data dengan .fillna()

Salah satu cara menangani missing data adalah menggunakan:

.fillna()

Method ini digunakan untuk mengganti nilai NaN dengan nilai tertentu.

Contohnya:

car_sales_missing["Odometer"].fillna(0)

Artinya:

Jika terdapat NaN

Ganti dengan 0

Namun, menggunakan 0 tidak selalu merupakan pilihan yang tepat.

Kita perlu mempertimbangkan makna dari data.


Mengisi Missing Data dengan Mean

Salah satu pendekatan yang umum untuk data numerik adalah mengganti missing value menggunakan mean atau rata-rata.

Misalnya:

Odometer
100000
120000
80000

Mean:

100000

Jika terdapat:

NaN

kita dapat menggantinya dengan nilai mean.

Contohnya:

car_sales_missing["Odometer"].fillna(
car_sales_missing["Odometer"].mean(numeric_only=True)
)

Mengapa Menggunakan Mean?

Misalnya kita memiliki:

100000
120000
80000
NaN

Rata-ratanya:

(100000 + 120000 + 80000) / 3

hasilnya:

100000

Sehingga:

100000
120000
80000
NaN

menjadi:

100000
120000
80000
100000

Dengan demikian, kita tetap mempertahankan jumlah baris dataset.

Namun, mean bukan selalu pilihan terbaik.

Jika data memiliki outlier yang besar, median mungkin lebih sesuai.


Reassignment pada .fillna()

Sama seperti .str.lower(), .fillna() dapat menghasilkan data yang perlu disimpan kembali.

Contohnya:

car_sales_missing["Odometer"] = car_sales_missing["Odometer"].fillna(
car_sales_missing["Odometer"].mean(numeric_only=true)
)

Alurnya:

Kolom Odometer

Cari NaN

Hitung Mean

Ganti NaN dengan Mean

Assign kembali ke Odometer

Pendekatan ini mudah dibaca dan jelas bagi pemula.


Parameter inplace

Pandas juga menyediakan parameter:

inplace=True

Parameter ini digunakan pada beberapa operasi Pandas untuk meminta operasi dilakukan langsung pada object yang bersangkutan.

Contohnya:

car_sales_missing["Odometer"].fillna(
car_sales_missing["Odometer"].mean(numeric_only=true),
inplace=True
)

Secara konsep:

inplace=True

Lakukan perubahan pada object

inplace=True vs Reassignment

Ada dua pola yang perlu dipahami.

Menggunakan Reassignment

car_sales_missing["Odometer"] = car_sales_missing["Odometer"].fillna(
car_sales_missing["Odometer"].mean(numeric_only=true)
)

Artinya hasil operasi disimpan kembali ke kolom.

Menggunakan inplace=True

car_sales_missing["Odometer"].fillna(
car_sales_missing["Odometer"].mean(numeric_only=true),
inplace=True
)

Secara konsep meminta Pandas melakukan perubahan secara langsung pada object tersebut.


Mana yang Sebaiknya Digunakan?

Untuk pembelajaran, reassignment sering lebih mudah dipahami karena alurnya eksplisit:

Data

Transformasi

Simpan hasil

Contohnya:

car_sales_missing["Odometer"] = car_sales_missing["Odometer"].fillna(
car_sales_missing["Odometer"].mean(numeric_only=true)
)

Selain itu, penggunaan inplace=True pada operasi tertentu dapat memiliki perilaku yang perlu diperhatikan pada versi Pandas modern, terutama ketika operasi dilakukan melalui chained indexing.

Karena itu, sebagai kebiasaan umum:

Gunakan assignment eksplisit

ketika ingin membuat kode yang lebih jelas dan mudah dipelihara.


Menghapus Missing Data dengan .dropna()

Tidak semua missing value harus diisi.

Dalam kondisi tertentu, kita justru ingin menghapus baris yang memiliki missing value.

Pandas menyediakan:

.dropna()

Contohnya:

car_sales_missing.dropna()

Method tersebut akan menghasilkan DataFrame yang tidak memiliki baris dengan missing value berdasarkan aturan default.


Contoh .dropna()

Misalnya:

MakeOdometer
Toyota150000
HondaNaN
BMW80000
NissanNaN

Jika menggunakan:

car_sales_missing.dropna()

maka baris yang memiliki NaN akan dihilangkan.

Hasilnya:

MakeOdometer
Toyota150000
BMW80000

Reassignment dengan .dropna()

Jika kita ingin menyimpan hasilnya ke variable baru:

car_sales_missing_dropped = car_sales_missing.dropna()

Sekarang:

car_sales_missing

adalah data asli.

Sedangkan:

car_sales_missing_dropped

berisi data setelah baris dengan missing value dihapus.

Ini merupakan pendekatan yang baik ketika kita ingin mempertahankan dataset asli.


Mengapa Tidak Selalu Menghapus Missing Data?

Menghapus data memang sederhana, tetapi tidak selalu menjadi solusi terbaik.

Misalnya dataset hanya memiliki:

100 baris

dan:

40 baris

memiliki missing value.

Jika kita menggunakan:

dropna()

kita mungkin kehilangan sebagian besar dataset.

Akibatnya, jumlah data untuk Machine Learning menjadi jauh lebih sedikit.

Karena itu, kita perlu mempertimbangkan:

Berapa banyak missing value?
Di kolom mana?
Mengapa data hilang?
Seberapa penting kolom tersebut?
Berapa banyak data yang akan hilang jika dihapus?

Fillna vs Dropna

Dua pendekatan utama:

MethodFungsi
fillna()Mengisi missing value
dropna()Menghapus data yang memiliki missing value

Secara sederhana:

NaN

├── fillna()
│ ↓
│ Diganti

└── dropna()

Dihapus

Pemilihan metode bergantung pada masalah dan karakteristik dataset.


Contoh Penggunaan fillna()

Misalnya:

car_sales_missing["Odometer"] = car_sales_missing["Odometer"].fillna(
car_sales_missing["Odometer"].mean(numeric_only=true)
)

Artinya:

Cari nilai NaN

Hitung mean Odometer

Ganti NaN dengan mean

Simpan kembali

Contoh Penggunaan dropna()

Jika ingin menghapus baris yang memiliki missing value:

car_sales_missing_dropped = car_sales_missing.dropna()

Data hasilnya disimpan ke:

car_sales_missing_dropped

Dataset asli:

car_sales_missing

tetap tersedia.


Mengekspor Data Hasil Cleaning

Setelah melakukan data cleaning, kita mungkin ingin menyimpan hasilnya ke dalam file CSV.

Contohnya:

car_sales_missing_dropped.to_csv(
"car_sales_missing_dropped.csv"
)

Pandas akan menghasilkan file:

car_sales_missing_dropped.csv

yang berisi data setelah proses cleaning.


Memperhatikan Index Saat Export

Ketika mengekspor DataFrame ke CSV, kita sering kali tidak ingin index DataFrame ikut menjadi kolom baru.

Karena itu, biasanya lebih baik menggunakan:

car_sales_missing_dropped.to_csv(
"car_sales_missing_dropped.csv",
index=False
)

Dengan:

index=False

index DataFrame tidak ikut ditulis sebagai kolom pada file CSV.


Workflow Data Cleaning

Secara sederhana, workflow pada materi ini dapat digambarkan:

Dataset

Periksa Data

Temukan Masalah

Data Teks Tidak Konsisten

.str.lower()

Reassignment

Cari Missing Data

NaN

┌───────────────┐
│ │
▼ ▼
fillna() dropna()
│ │
▼ ▼
Isi Data Hapus Data
│ │
└───────┬───────┘

Data Bersih

Contoh Workflow Lengkap

Berikut contoh sederhana yang menggabungkan konsep pada materi ini:

import pandas as pd

car_sales_missing = pd.read_csv("car-sales-missing.csv")

# Mengubah Make menjadi huruf kecil
car_sales_missing["Make"] = car_sales_missing["Make"].str.lower()

# Mengisi missing value pada Odometer dengan mean
car_sales_missing["Odometer"] = car_sales_missing["Odometer"].fillna(
car_sales_missing["Odometer"].mean(numeric_only=true)
)

# Menyimpan hasil
car_sales_missing.to_csv(
"car_sales_cleaned.csv",
index=False
)

Workflow tersebut:

CSV

DataFrame

Standardisasi teks

Menangani missing value

Data bersih

Export CSV

Alternatif Menghapus Missing Data

Jika keputusan analisis mengharuskan missing data dihapus:

car_sales_missing_dropped = car_sales_missing.dropna()

car_sales_missing_dropped.to_csv(
"car_sales_missing_dropped.csv",
index=False
)

Dalam project nyata, keputusan antara fillna() dan dropna() harus didasarkan pada karakteristik data, bukan sekadar karena salah satu metode lebih mudah digunakan.


Data Cleaning dalam Machine Learning

Data cleaning merupakan bagian penting dari Machine Learning.

Secara umum:

Raw Data

Data Cleaning

Data Transformation

Data Preprocessing

Feature Engineering

Model Training

Jika data yang masuk ke model bermasalah, kualitas model juga dapat terpengaruh.

Contohnya:

Missing Value
Inconsistent Text
Wrong Data Type
Duplicate Data
Outlier

Karena itu, sebelum membuat model Machine Learning, kita perlu memahami dan membersihkan data terlebih dahulu.


Catatan Penting tentang Missing Value

Mengisi missing value dengan mean memang mudah, tetapi jangan menganggapnya sebagai aturan universal.

Contohnya:

car_sales_missing["Odometer"].fillna(
car_sales_missing["Odometer"].mean(numeric_only=true)
)

dapat masuk akal untuk contoh pembelajaran.

Namun dalam project Machine Learning nyata, kita perlu mempertimbangkan:

  • distribusi data
  • outlier
  • jenis variabel
  • alasan data hilang
  • jumlah missing value
  • kebutuhan model
  • kemungkinan data leakage

Untuk preprocessing Machine Learning yang serius, proses pengisian missing value sebaiknya dilakukan dengan hati-hati dan hanya menggunakan informasi yang tersedia dari data training.


Checklist Pemula

Setelah mempelajari materi ini, pastikan sudah memahami:

  • Apa fungsi .str?
  • Apa fungsi .str.lower()?
  • Mengapa string perlu distandardisasi?
  • Apa yang dimaksud dengan reassignment?
  • Mengapa hasil operasi perlu disimpan kembali?
  • Apa itu missing data?
  • Apa itu NaN?
  • Apa perbedaan NaN dengan 0?
  • Apa fungsi .fillna()?
  • Apa fungsi .dropna()?
  • Apa perbedaan fillna() dan dropna()?
  • Apa fungsi inplace=True?
  • Apa alternatif penggunaan inplace=True?
  • Mengapa kita tidak selalu boleh menghapus semua missing data?
  • Mengapa data cleaning penting dalam Machine Learning?

Ringkasan Sintaks

Mengubah teks menjadi lowercase

car_sales["Make"] = car_sales["Make"].str.lower()

Mengisi missing value dengan mean

car_sales["Odometer"] = car_sales["Odometer"].fillna(
car_sales["Odometer"].mean(numeric_only=true)
)

Mengisi missing value menggunakan inplace

car_sales["Odometer"].fillna(
car_sales["Odometer"].mean(numeric_only=true),
inplace=True
)

Menghapus baris dengan missing value

car_sales_dropped = car_sales.dropna()

Export DataFrame

car_sales_dropped.to_csv(
"car_sales_dropped.csv",
index=False
)

Kesimpulan

Dalam pengolahan data, dataset yang kita dapatkan tidak selalu bersih dan siap digunakan.

Pandas menyediakan berbagai fitur untuk melakukan data cleaning.

Untuk memanipulasi data string, kita dapat menggunakan .str.

Contohnya:

car_sales["Make"] = car_sales["Make"].str.lower()

Untuk menangani missing value, kita dapat menggunakan:

fillna()

atau:

dropna()

Contohnya:

car_sales["Odometer"] = car_sales["Odometer"].fillna(
car_sales["Odometer"].mean(numeric_only=true)
)

atau:

car_sales_dropped = car_sales.dropna()

Konsep penting dari materi ini:

Data Mentah

Data Cleaning

Standardisasi Data

Penanganan Missing Value

Data Lebih Bersih

Data Preprocessing

Machine Learning

Kemampuan membersihkan data merupakan salah satu skill paling penting dalam Data Science dan Machine Learning.