Pertemuan 2 : Data Cleaning with Pandas

Handling Dirty Data using Pandas
Published

April 15, 2024

Kembali ke EDA

Gathering Data

Data yang kita terima seringkali tidak berupa 1 tabel yang lengkap berisi seluruh informasi yang dibutuhkan. Terkadang kita perlu menggabungkan 2 atau lebih data yang saling berhubungan. Pandas memiliki beberapa fungsi yang dapat kita gunakan untuk menggabungkan beberapa data tersebut.

Concatenate & Merge

Concatenate

Concatenate digunakan untuk menggabungkan 2 atau lebih series/dataframe. Argumen axis= digunakan untuk mengatur opsi penggabungan data menurut index baris atau index kolom. Berikut contoh penggunaan pada 2 series :

import numpy as np
import pandas as pd

series1 = pd.Series(['a','b','c'])
series2 = pd.Series(['x','y','z'])

axis=0 (default) akan menggabungkan data pada index baris.

pd.concat([series1,series2], axis=0)

axis=1 akan menggabungkan data pada index kolom.

pd.concat([series1,series2], axis=1)

ignore_index=True akan mengabaikan index awal dari masing-masing data sehingga hasil penggabungan memiliki index baru.

pd.concat([series1,series2], ignore_index=True)

Kita dapat menambahkan keys sebagai penanda dari masing-masing series sebelum digabungkan.

pd.concat([series1,series2], keys=['Series 1','Series 2'])
Tip

Hasil penggabungan dengan argumen keys= akan menambahkan keys sebagai index gabungan, sehingga pada contoh di atas, index dari masing-masing value adalah sebuah tuple yang merupakan pasangan index gabungan dan index masing-masing.

pd.concat([series1,series2], keys=['Series 1','Series 2']).index

Berikut contoh penggunaan pada DataFrame :

df1=pd.DataFrame({'col 1':['a','b','c'],'col 2':[0,1,2]})
df2=pd.DataFrame({'col 1':['x','y','z'],'col 2':[4,5,6]})
df1
df2

axis=0 (default) akan menggabungkan data pada index baris.

pd.concat([df1,df2])

axis=1 akan menggabungkan data pada index kolom.

pd.concat([df1,df2], axis=1)

Perhatikan bahwa nama kolom df1 dan df2 sama. Misalkan kita menggabungkan 2 dataframe dengan nama kolom yang berbeda.

df3=pd.DataFrame({'col 2':[3,4,5],'col 3':['m','n','o']})
df3

Concatenate pada DataFrame melihat index kolom sebagai acuan untuk penggabungan pada axis=0 (baris).

pd.concat([df1,df3])

Karena df1 dan df3 memiliki nama kolom yang berbeda, maka terjadi penggabungan baris sekaligus kolom.


Untuk kolom yang beririsan, bisa menggunakan argumen join= untuk mengatur bagaimana penggabungan dilakukan (pada keseluruhan data atau pada data yang beririsan saja)

pd.concat([df1,df3], join='inner') # df1 ⋂ df3
pd.concat([df1,df3], join='outer') # df1 ⋃ df3

Merge

Fungsi merge pada pandas digunakan untuk menggabungkan 2 atau lebih dataframe berdasarkan index kolom tertentu.

karyawan = pd.DataFrame({'id':[1,2,3,4],'nama':['Joko','Alvin','Rafi','Lita']})
karyawan
gaji = pd.DataFrame({'id':[2,1,3,5,4,6],'gaji':[100.0,200.0,300.0,400.0,500.0,600.0]})
gaji
pd.merge(karyawan, gaji, on='id')

Data nama karyawan dan gaji digabungkan dalam 1 dataframe, dengan nilai-nilai pada kolom id sebagai acuan.

NoteMerge & Join

Pada modul ini, hanya dibahas mengenai dasar penggunaan fungsi merge untuk menggabungkan dataset. Untuk penggunaan lebih spesifik dengan argumen left=, right=, left_on=, right_on= dan how= akan dibahas pada materi Data Wrangling

Assessing Data

Setelah memiliki data yang komplit, langkah selanjutnya adalah mengidentifikasi validitas data yang kita punya. Apakah data yang kita miliki sudah cukup baik? Apakah sudah bisa dilakukan analisis pada data yang ada? Perlukah perubahan dan perbaruan data?

Pertama, kita perlu melihat keberadaan data yang buruk dalam kumpulan data kita.

Data yang buruk dapat berupa:

  • Data dalam format yang salah (Data integer terbaca sebagai suatu string)
  • Sel yang kosong (Missing)
  • Duplikat (Data yang sama muncul lebih dari 1 kali)
  • Data yang salah (Data yang tidak masuk akal. Misalnya seseorang berumur 600 tahun)

df.info()

Method .info() dapat digunakan untuk melihat informasi dasar suatu dataframe seperti jumlah entri keseluruhan, nama kolom, jumlah nilai non-null tiap kolom, tipe data tiap kolom hingga penggunaan memori suatu dataframe

Misalkan kita gunakan dataset pokemon pada modul sebelumnya,

df = pd.read_csv('https://raw.githubusercontent.com/farhanage/dataset-for-study/main/pokemon_data.csv')
df.head()
df.info()

Missing Values

Terdapat 2 tipe missing value.

  1. Data bernilai NaN (Not a Number)
  2. Data bernilai 0 (Null)
WarningNull

Data bernilai 0 (Null) tidak selalu bersifat sebagai data yang hilang, bisa juga data memang memiliki data yang bernilai 0. Oleh karena itu, penting bagi kita untuk mengetahui konteks dari data yang dianalisis.


df = pd.DataFrame({"Evan" : [np.nan,100,95,94,99],"Boy" : [100,np.nan,95,99,94],"Maxwell" : [95,100,99,np.nan,94]})
df

Untuk melihat data mana saja yang mengandung value NaN (Not a Number), kita gunakan method .isna() atau .isnull(). (Kedua method ini memiliki fungsi yang sama dan dapat digunakan secara bergantian/salah satu saja)

df.isna()

Untuk melihat jumlah value NaN pada data, tambahkan method .sum() pada kode di atas.

df.isna().sum()
NoteMethod .sum()

Method .sum() digunakan untuk menjumlahkan nilai-nilai pada tiap kolom dataframe (Juga dalam suatu Series).

Untuk melihat entri-entri yang memiliki nilai NaN pada kolom tertentu, lakukan filtering pada dataframe dengan df['<nama-kolom>'].isna() sebagai kondisi yang diinginkan.

df[df['Evan'].isna()]   # Entri yang memiliki nilai `NaN` pada kolom `Evan`

Duplicates

Data duplikat pada dataframe adalah entri yang memiliki nilai yang sama pada setiap kolom. Jika terdapat setidaknya 1 nilai kolom yang berbeda antara 2 entri, data tersebut bukanlah sebuah duplikat.

df = pd.DataFrame({
    "id" : [1,2,3,4,3,6],
    "Karyawan" : ['Joko','Alvin','Rafi','Lita','Rafi','Jennie'],
    "Gaji" : [100.0, 200.0, 300.0, 400.0, 300.0, 600.0]})
df

Untuk melihat data yang memiliki duplikat pada dataframe, kita gunakan method .duplicated().

df.duplicated()

Perhatikan bahwa data yang terbaca sebagai duplikat adalah data yang muncul setelah kemunculan data pertama kali (data duplikat pertama tidak dianggap sebagai duplikat)

Dengan cara yang sama seperti pada Missing Value, kita bisa menggunakan method .sum() untuk melihat jumlah data duplikat pada suatu dataframe.

df.duplicated().sum()

Untuk melihat entri-entri yang memiliki nilai duplikat pada kolom tertentu, lakukan filtering pada dataframe dengan df['<nama-kolom>'].duplicated() sebagai kondisi yang diinginkan.

df[df['id'].duplicated()]   # Entri yang memiliki nilai `id` duplikat

Descriptive Statistics

Untuk mengidentifikasi apakah terdapat data yang salah, jika kita perlu tahu konteks data tersebut. Seperti bagaimana cara data diperoleh? Apakah ada batas-batas nilai pada variabel-variabel tertentu?

Salah satu cara mudah untuk mengidentifikasi persebaran suatu data adalah dengan melihat statistik deskriptif suatu data. Kita bisa menggunakan method .describe() untuk melihat ukuran persebaran data dari masing-masing variabel pada suatu dataframe.

df = pd.read_csv('https://raw.githubusercontent.com/farhanage/dataset-for-study/main/pokemon_data.csv')
df.head()
df.describe()

Namun, metode ini hanya dapat digunakan pada data numerik. Sehingga untuk data non-numerik, perlu pemahaman lebih lanjut mengenai konteks data dan metode yang digunakan untuk mengonfirmasi validitas data.

Cleaning Data

Memperbaiki Format Data yang Salah

Terdapat lebih dari 1 cara untuk memperbaiki format data yang salah. Tidak disalahkan bagi anda untuk mencarinya di internet sendiri. Silakan merujuk pada berbagai sumber. Salah satunya adalah jawaban dari pertanyaan pada forum StackOverflow berikut : Link

Mengimputasi sel yang kosong

df.fillna(value='<value>', inplace=True)

Menghapus data duplikat

df.drop_duplicates(inplace=True)