Anda di halaman 1dari 87

ilmudatapy.

com

Modul Data Science - 2

Data Preparation

Dengan Python

Disusun oleh:

LUTFIA AFIFAH

Berdasarkan pengalaman penyusun belajar data science dari berbagai


pelatihan dan kursus baik offline maupun online.
Penyusun: Lutfia Afifah, S.Komp

Email: lutfia.afifah@ilmudatapy.com

Github: https://github.com/lutfiaafifah

Website: https://ilmudatapy.com

Hak Cipta

Paket modul data science ini, termasuk ebook dan file IPYNB, hanya bisa didapatkan melalui website
https://ilmudatapy.com.

Dilarang menyebarluaskan ebook atau file IPYNB modul ini baik secara komersial maupun non-
komersial.
Kata Pengantar

Paket modul belajar data science ini ditujukan untuk siapa saja yang sedang belajar data science dan ingin
mempelajari bagaimana penerapan kode pemrograman Python untuk data science. Modul Data Preparation
dengan Python ini merupakan modul kedua dari paket ini yang membahas tentang apa saja yang dilakukan
pada tahap data preparation atau preprocessing sebelum melakukan pemodelan machine learning.

Bagi sebagian orang yang memiliki latar belakang pendidikan non-IT, mempelajari bahasa pemrograman
Python adalah suatu tantangan tersendiri dalam belajar data science. Oleh karena itu, modul ini dibuat untuk
memudahkan Anda belajar data preparation dengan bahasa pemrograman Python dengan langsung memberi
contoh kode program dan menampilkan outputnya.

Paket modul belajar data science ini juga menyediakan versi file IPYNB atau file Jupyter Notebook sehingga
Anda dapat langsung menjalankan kode-kode program tersebut serta mencoba-coba dengan nilai dan
parameter lainnya untuk berlatih.

Akhir kata, semoga ebook ini bermanfaat bagi Anda untuk memperoleh skill baru yang mungkin berguna
untuk karir Anda ke depannya. Jika Anda memiliki saran, kritik atau masukan positif apapun yang dapat
membantu kami memperbaiki modul ini di masa depan, silahkan kirimkan ke email penyusun
lutfia.afifah@ilmudatapy.com.

Salam,

Lutfia Afifah
Pengenalan Pandas - 2

Outliers - 10

Missing Values - 21

Duplicates - 29

Data Formatting - 35

Data Binning - 41

Data Encoding - 49

Data Scaling - 58

Reshaping - 63

Grouping - 68

Joining - 73

ilmudatapy.com
1
Pengenalan Pandas

Pandas adalah salah satu library di Python yang digunakan dalam mengolah data, baik itu berupa dataframe
maupun series.

Di awal pembahasan tentang data preparation ini, kita akan membahas sekilas tentang Pandas, tentang
bagaimana cara membuat dataframe dan series, load data, serta mengakses data pada dataframe. Proses-
proses tersebut merupakan hal-hal dasar yang harus diketahui sebelum mempelajari hal-hal yang lainnya.

Baiklah, mari kita mulai dengan bahasan tentang dataframe dan series.

Sebelumnya, pastikan bahwa Anda telah menginstal Pandas, kemudian import Pandas sebelum digunakan.

import pandas as pd

Dataframe dan Series


Dataframe dan Series merupakan dua jenis objek di Pandas untuk menyimpan data secara terstruktur.

Series adalah suatu objek satu dimensi untuk menyimpan berbagai jenis tipe data seperti integer, string, float,
dan sebagainya.

Dataframe adalah suatu objek dua dimensi untuk menyimpan data secara terstruktur. Dataframe memiliki
format baris dan kolom sehingga dia memiliki dua indeks, yaitu indeks baris dan indeks kolom. Data dalam satu
kolom harus memiliki tipe data yang sama, namun bisa berbeda antarkolom-nya.

Membuat series
Misalnya kita memiliki list buah seperti di bawah ini.

# Membuat list buah

buah = ['jeruk', 'melon', 'pisang', 'semangka', 'apel']

ilmudatapy.com
2
Kemudian dari list tersebut, kita akan membuat series s.

# Membuat series dari list buah

a = pd.Series(buah, index=[1, 2, 3, 4, 5])


a

Jika tidak diberi parameter index, secara otomatis indeks akan dimulai dari 0.
# Membuat series dengan indeks default

b = pd.Series(buah)
b

Indeks pada series juga bisa berupa non-numerik seperti string atau karakter.
# Membuat series dengan indeks berupa string/karakter

c = pd.Series(buah, index=['A', 'B', 'C', 'D', 'E'])


c

Harap dicatat bahwa jumlah indeks dan elemen pada series harus sama. Jika berbeda, maka akan terjadi
ValueError.

Membuat dataframe
Membuat dataframe akan lebih mudah dan rapi jika kita membuat dictionary terlebih dahulu. Misalnya disini
kita akan membuat dictionary dic yang menampung data ID, Name, dan Gender.
# Membuat dictionary

dic = {'ID': [110, 276, 298, 312, 501, 529],


'Name': ['Mark', 'Michelle', 'Alina', 'Noah', 'Justin', 'Sherin'],
'Gender': ['Male', 'Female', 'Female', 'Male', 'Male', 'Female'],
}

ilmudatapy.com
3
Selanjutnya kita buat dataframe df_x dari dictionary tersebut dengan cara di bawah ini.

# Membuat dataframe

df_x = pd.DataFrame(dic)
df_x

Load data
Selain membuat dataframe secara langsung, kita juga dapat memuat data yang sudah ada, misalnya data yang
berekstensi .csv, .xlsx, .data, dan lain sebagainya. Untuk me-load data CSV, kita dapat menggunakan method
read_csv(), sedangkan untuk data EXCEL, kita dapat menggunakan read_excel().

Sebagai contoh, misalnya kita ingin menampilkan data dari file austin_weather.csv. Untuk menampilkannya
dapat dilakukan dengan cara di bawah ini.
# Load data CSV

df = pd.read_csv('datasets/austin_weather.csv')
df

File austin_weather.csv berada pada folder datasets, jadi nama folder harus diikutsertakan juga agar
Python dapat menemukannya. Namun, jika file Jupyter notebook yang sedang Anda kerjakan dengan file
datasetnya berada dalam satu folder yang sama, Anda dapat langsung menuliskan nama filenya.

Kita juga dapat me-load data dari alamat URL, namun kita harus terhubung ke internet. Caranya sama, yaitu
dengan meletakkan alamat URL di dalam tanda kurung () dengan diapit tanda kutip.

ilmudatapy.com
4
# Load data CSV dari internet

df = pd.read_csv('https://ilmudatapy.com/austin_weather/')
df

Menampilkan data teratas


Kita dapat menampilkan beberapa data saja yang terletak di awal menggunakan method head(). Perhatikan
contoh berikut.

df.head() # Menampilkan data teratas

Jika kita tidak memasukkan sebuah bilangan integer di dalam tanda kurung, default data yang akan ditampilkan
adalah 5 data teratas seperti pada output di atas. Sekarang mari kita coba memasukkan sebuah bilangan integer
di dalam tanda kurung.

df.head(3) # Menampilkan 3 data teratas

Menampilkan beberapa data teratas dapat memperlihatkan gambaran singkat tentang struktur dataset tersebut.

ilmudatapy.com
5
Menampilkan data terbawah
Tidak hanya menampilkan data teratas, kita juga dapat menampilkan data terbawah dengan method tail().
Default dari metode tail() ini juga sama seperti head() yaitu 5.

df.tail() # Menampilkan terbawah

Menampilkan info dan deskriptif statistik data


Kita juga dapat melihat info singkat tentang masing-masing kolom dengan method info().
df.info() # Melihat info singkat masing-masing kolom

Untuk melihat gambaran tentang deskriptif statistiknya kita dapat menggunakan metode describe().
df.describe() # Melihat deskriptif statistik

ilmudatapy.com
6
Penjelasan singkat

 count : jumlah data yang ada


 mean : nilai rata-rata
 std : standar deviasi
 min : nilai minimum
 25% : nilai kuartil 1 (Q1)
 50% : nilai kuartil 2 (Q2) atau median
 75% : nilai kuartil 3 (Q3)
 max : nilai maksimum

Dari output describe() di atas, kita hanya melihat tiga kolom yaitu TempHighF, TempAvgF, dan TempLowF,
padahal seperti yang kita tahu ada 21 kolom. Mengapa hanya 3 yang muncul saat kita menampilkan deskriptif
statistiknya?

Jika kita lihat output yang sebelumnya, yakni output dari info(), kita bisa melihat bahwa hanya kolom
TempHighF, TempAvgF, dan TempLowF yang bertipe int64, selebihnya bertipe object. Nah, jadi apa maksudnya?

Method describe() hanya akan menampilkan kolom yang bertipe numerik, baik itu int64 atau float64, karena
outputnya adalah perhitungan statistik. Tipe object berarti kolom tersebut terdeteksi sebagai string meskipun
sebenarnya isinya adalah angka-angka. Oleh karena itu, kolom lainnya tidak terdeteksi.

Mengakses data
Untuk melihat data kolom tertentu, kita dapat dengan mudah melakukannya dengan cara menuliskan nama
dataframe yang disertai nama kolom yang diletakkan pada tanda kurung siku []. Cara ini akan menampilkan
data kolom tersebut sebagai Series.

Misalnya kita ingin menampilkan kolom TempLowF.

a = df['TempLowF'] # Menampilkan kolom TempLowF sebagai Series


a

Jika ingin menampilkan beberapa kolom sekaligus, kita dapat melakukannya dengan menuliskan nama-nama
kolom di dalam kurung siku ganda setelah nama dataframe. Perhatikan contoh berikut.

ilmudatapy.com
7
b = df[['Date', 'TempAvgF', 'HumidityAvgPercent', 'WindAvgMPH']]
b

Untuk menampilkan data teratas saja dari gabungan kolom pilihan di atas, kita dapat dengan mudah
menambahkan .head() di belakangnya seperti di bawah ini.

df[['Date', 'TempAvgF', 'HumidityAvgPercent', 'WindAvgMPH']].head()

Mengakses data tertentu berdasarkan indeks


Kita juga dapat mengakses data tertentu pada dataframe menggunakan indeks dengan atribut iloc. Cara ini
tentunya mengharuskan kita untuk mengetahui ada pada indeks berapa data tersebut, baik indeks barisnya
maupun indeks kolomnya.

Misalnya, kita ingin menampilkan angka 48 di kolom TempAvgF baris ke-2. Seperti yang kita tahu, pada
dataframe df indeks baris ke-2 adalah 1, dan indeks kolom TempAvgF adalah 2, maka kita dapat menuliskan
kodenya seperti ini.

df.iloc[1,2] # Menampilkan data pada indeks baris 1 kolom 2

Mari kita lihat contoh lainnya.

df.iloc[872, 16] # Menampilkan data pada indeks baris 872 kolom 16

df.iloc[1199, 8] # Menampilkan data pada indeks baris 1199 kolom 8

ilmudatapy.com
8
Mengakses data tertentu berdasarkan nama kolom
Selain menggunakan indeks, kita juga dapat menggunakan nama kolom untuk mendapatkan data pada posisi
tertentu dengan atribut loc. Perhatikan contoh berikut.

df.loc[0, 'TempAvgF'] # Menampilkan data baris 0 kolom TempAvgF

Mari kita lihat contoh lainnya.

df.loc[100, 'Date'] # Menampilkan data baris 100 kolom Date

df.loc[1287, 'WindHighMPH'] # Menampilkan data baris 1287 kolom WindHighMPH

Slicing
Kita juga dapat melakukan slicing, baik berdasarkan indeks mapun nama kolom. Perhatikan contoh di bawah ini.

df.iloc[0:6, 2:5] # Slicing dataframe

df.loc[795:800, 'VisibilityHighMiles':'WindGustMPH'] # Slicing dataframe

ilmudatapy.com
9
Outliers

Di dalam statistika, outliers merupakan data yang nilainya terlalu jauh dengan data lainnya atau disebut juga
dengan pencilan. Keberadaan outliers akan membuat analisis terhadap data tersebut menjadi bias atau dengan
kata lain tidak mencerminkan fenomena yang sebenarnya.

Contoh outliers misalnya nilai mahasiswa dalam satu kelas berkisar antara 60 sampai 100, namun ada satu
mahasiswa yang nilainya 5. Nah, nilai 5 ini dianggap sebagai outliers karena tentunya akan mempengaruhi
statistik data seperti mean alias nilai rata-rata kelas. Oleh sebab itu, biasanya data yang mengandung outliers
akan dihapus.

Dataset
Dataset yang digunakan adalah dataset Automobile yang berasal dari UCI Machine Learning Repository.

Pertama kita import pandas, kemudian load datasetnya ke dataframe.

import pandas as pd
import numpy as np

df = pd.read_csv('datasets/automobile.data', header=None)
df.head()

ilmudatapy.com
10
Untuk dapat memudahkan analisis data, sebaiknya kita mengubah/menambahkan header yang sesuai untuk
menggambarkan masing-masing kolom.

column_names = ['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration',


'num-of-doors', 'body-style', 'drive-wheels', 'engine-location',
'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-type',
'num-of-cylinders', 'engine-size', 'fuel-system', 'bore', 'stroke',
'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg',
'price']

# Mengubah nama kolom


df.columns = column_names
df.head()

Identifikasi Outliers
Ada beberapa cara yang dapat dilakukan untuk menemukan outliers dalam dataframe, yaitu dengan visualisasi
ataupun dengan perhitungan matematika.

Menemukan outliers dengan visualisasi


Untuk menemukan outliers dengan metode visualisasi data, kita dapat menggunakan library Matplotlib atau
Seaborn yang ada di Python. Di bagian ini, saya akan sedikit membahas visualisasi data seperti Box plot dan
Scatter plot sebagai cara untuk menemukan outliers. Pembahasan mengenai visualisasi data secara lebih
lengkap dan detail disampaikan pada modul khusus tentang Data Visualization.

Box plot

Untuk memvisualisasikan data dengan Box plot, kita dapat menggunakan kedua library Python Matplotlib dan
Seaborn. Sekarang mari kita buat contoh penggunaan masing-masing library tersebut dalam membuat Box plot.

Untuk membuat Box plot dengan Matplotlib, kita harus mengimpornya terlebih dahulu.
import matplotlib.pyplot as plt
%matplotlib inline

ilmudatapy.com
11
Sekarang kita coba memeriksa apakah ada outliers pada kolom wheel-base.

# Memeriksa outliers menggunakan box plot

df['wheel-base'].plot(kind='box')
plt.title('Box plot of Wheel Base', size=16)
plt.show()

Dari output di atas, kita dapat melihat ada 2 titik di atas yang menandakan outliers pada kolom tersebut.
Sekarang mari kita coba periksa kolom numerik lainnya, namun kali ini kita akan menggunakan library visualisasi
data lainnya yaitu Seaborn.
import seaborn as sns

# Memeriksa outliers menggunakan box plot dengan Seaborn


sns.boxplot(y=df['engine-size']).set_title('Box plot of Engine Size', size=16)

Ternyata dari hasil visualisasi di atas, pada kolom engine-size juga ditemukan sejumlah outliers.

Kita juga dapat memeriksa outliers pada kolom tertentu untuk tiap kategori pada kolom lainnya. Misalnya kita
akan cek outliers di kolom symboling berdasarkan kolom fuel-type.

ilmudatapy.com
12
import seaborn as sns

# Membuat boxplot untuk kolom symboling berdasarkan kolom fuel-type


sns.boxplot(y=df['symboling'], x=df['fuel-type']).set_title('Group by fuel-type', size=16)

Seperti yang kita lihat, untuk fule-type gas tidak ada outliers di kolom symboling, sedangkan untuk fuel-
type diesel ada beberapa outliers.

Scatter plot

Scatter plot adalah jenis visualisasi data yang digunakan untuk melihat relasi antara dua variabel yang
direpresentasikan dengan data point (titik). Untuk memeriksa outliers dengan scatter plot, kita dapat melihat
apakah ada titik yang berada jauh dari kumpulan titik lainnya. Jika ada kemungkinan itu adalah outliers.

Mari kita cek kolom engine-size dan wheel-base menggunakan visualisasi Matplotlib

# Memeriksa outliers dengan scatter plot

df.plot(kind='scatter', x='engine-size', y='wheel-base')

plt.xlabel('Engine Size')
plt.ylabel('Wheel Base')
plt.show()

Dari output yang kita lihat, ada beberapa data point yang berada jauh dari kumpulan data point lainnya.
Sekarang mari kita coba cek kolom engine-size dan compression-ratio menggunakan visualisasi Seaborn.

ilmudatapy.com
13
# Memeriksa outliers dengan scatter plot Seaborn

sns.scatterplot(x=df['engine-size'], y=df['compression-ratio']).set(xlabel='Engine Size',


ylabel='Compression Ratio')

Dari output di atas dapat kita lihat bahwa, ada sekitar delapan data point yang memiliki compression-ratio
jauh lebih tinggi dari rata-rata. Itu dapat dikatakan sebagai outliers

Menemukan outliers dengan IQR Score


IQR atau Interquartile Range adalah selisih dari kuartil ketiga (persentil 75) dengan kuartil pertama (persentil 25).
Jika ditulis dalam formula IQR = Q3 - Q1. IQR dapat digunakan untuk menemukan outliers di dataframe.

Box plot menggunakan perhitungan IQR untuk menampilkan visualisasi data dan outliers. Namun, kita tidak
dapat mengetahui data pada indeks berapa sajakah yang merupakan outliers jika menggunakan box plot. Karena
itu, pada bagaian ini kita akan mencoba mengidentifikasi outliers menggunakan perhitungann IQR dan
mendapatkan indeks outliers tersebut.

Bagaimana tahapannya?

1. Hitung nilai Q1 dan Q3


2. Hitung nilai IQR
3. Kalikan IQR dengan 1.5 (konstanta untuk menemukan outliers)
4. Untuk nilai minimum IQR, kurangi Q1 dengan 1.5 x IQR
5. Untuk nilai maximum IQR, tambahkan Q3 dengan 1.5 x IQR
6. Cari nilai minimum dan maksimum dari data
7. Jika nilai minimum data kurang dari nilai minimum IQR, berarti ada low outlier
8. Jika nilai maximum data lebih dari nilai maximum IQR, berarti ada high outlier

Nah, sekarang mari kita buat kode programnya.

Misalnya kita ingin menghitung nilai IQR untuk kolom wheel-base. Untuk mencari nilai Q1 dan Q3, Python
memiliki built-in function-nya yaitu quantile(). Kita hanya perlu mendefinisikan parameter berupa bilangan
float di dalam tanda kurungnya kuartil berapa yang ingin kita cari. Perhatikan kode berikut.

ilmudatapy.com
14
# Menghitung nilai IQR

Q1 = df['wheel-base'].quantile(0.25) # mencari kuartil 1


Q3 = df['wheel-base'].quantile(0.75) # mencari kuartil 3
IQR = Q3-Q1 # menghitung IQR

print('Q1 = ', Q1)


print('Q3 = ', Q3)
print('IQR wheel-base = ', IQR)

Setelah itu, kita cari nilai maksimum dan minimum dari kolom wheel-base, dan juga nilai minimun IQR dan
maksimum IQR. Kemudian kita buat kondisi dimana jika nilai minimum pada kolom wheel-base kurang dari
nilai minimum IQR, maka tampilkan tulisan bahwa ada low outliers. Begitu juga untuk nilai maksimum. Jika nilai
maksimum pada kolom wheel-base lebih dari nilai maksimum IQR, maka ada high outliers. Jangan lupa
tampilkan juga indeks outliers tersebut dengan atribut .index.

# Memeriksa outlier

nilai_min = df['wheel-base'].min() # mencari nilai minimum


nilai_max = df['wheel-base'].max() # mencari nilai maksimum

min_IQR = Q1 - 1.5 * IQR # menghitung nilai minimum IQR


max_IQR = Q3 + 1.5 * IQR # menghitung nilai maksimum IQR

# buat kondisi untuk mencari low outlier


if (nilai_min < min_IQR):
print('Low outlier is found <', min_IQR)

# menampilkan indeks low outlier


print('Low Outlier Index :', list(df[df['wheel-base'] < min_IQR].index))

# buat kondisi untuk mencari high outlier


if (nilai_max > max_IQR):
print('High outlier is found >', max_IQR)

# menampilkan indeks high outlier


print('High outlier Index : ', list(df[df['wheel-base'] > max_IQR].index))

Sampai di sini kita telah menemukan outliers pada kolom wheel-base yaitu ada pada indeks 70, 71 dan 73.

Selanjutnya bagaimana caranya agar kita dapat langsung mengetahui keberadaan outliers pada seluruh kolom
numerik di dataframe? Kita dapat memasukkan kode program di atas ke dalam perulangan sehingga tidak perlu
melakukan cara tersebut berulang kali untuk tiap kolomnya. Perhatikan kode berikut.

ilmudatapy.com
15
# Menghitung IQR dan memeriksa outlier untuk semua kolom bertipe int64 dan float64

for i in (df.columns): # membuat perulangan untuk tiap kolom di dalam dataframe


if (df[i].dtypes in ['int64','float64']):
print(i,':',df[i].dtypes) # mencetak nama kolom dan tipe datanya

Q1 = df[i].quantile(0.25)
print('Q1', Q1)

Q3 = df[i].quantile(0.75)
print('Q3', Q3)

IQR = Q3-Q1
print('IQR', IQR)

nilai_min = df[i].min()
nilai_max = df[i].max()

min_IQR = Q1 - 1.5 * IQR


max_IQR = Q3 + 1.5 * IQR

# Mencari outlier
if (nilai_min < min_IQR):
print('Low outlier is found <', min_IQR)
print('Low Outlier Index :', list(df[df[i] < min_IQR].index))
if (nilai_max > max_IQR):
print('High outlier is found >', max_IQR)
print('High outlier Index : ', list(df[df[i] > max_IQR].index))

print('\n')

Note: Output yang ditampilkan di atas terpotong. Silahkan jalankan file versi IPYNB-nya untuk melihat output secara keseluruhan.

Kode di atas persis sama dengan kode sebelumnya, hanya saja kita memasukkannya ke dalam for looping dan
juga membuat kondisi untuk memilih kolom yang bertipe numerik seperti int64 atau float64.

ilmudatapy.com
16
Memfilter dan menghapus outliers
Untuk menangani outliers kita dapat memfilternya untuk melihat data pada kolom lainnya ataukah langsung
menghapusnya. Di sini kita akan membahas cara memfilter dan menghapus baris data baik per kolom ataupun
langsung secara keseluruhan.

Memfilter outliers per kolom


Setelah kita mengetahui dari output kode program sebelumnya bahwa kolom wheel-base mengandung
outliers pada data indeks 70, 71, dan 73, kita dapat langsung memfilternya untuk melihat datanya
menggunaakn .iloc seperti di bawah ini.

# Menampilkan data yang mengandung outliers pada kolom wheel-base

df.iloc[[70,71,73], :]

Menghapus outliers per kolom


Kita juga dapat menghapus baris 70, 71, dan 73 tersebut dengan drop() dengan memberikan parameter axis
= 0 yang menandakan bahwa kita ingin menghapus baris, bukan kolom.

# Menghapus baris yang mengandung outliers pada kolom wheel-base

df.drop([70, 71, 73], axis=0)

ilmudatapy.com
17
Memfilter outliers secara keseluruhan
Untuk memfilter ataupun menghapus baris data yang mengandung outliers secara keseluruhan, kita perlu sedikit
menambahkan beberapa baris kode program dari kode sebelumnya. Perhatikan kode di bawah ini.

# import chain yang berfungsi untuk membuat flat list, contoh:[[1,2,3][3,4]] menjadi
[1,2,3,3,4]
from itertools import chain

outlier_index =[] # mendefinisikan list kosong untuk menyimpan indeks


outliers

for i in (df.columns): # membuat perulangan untuk tiap kolom di dalam dataframe


if (df[i].dtypes in ['int64','float64']):
print(i,':',df[i].dtypes) # mencetak nama kolom dan tipe datanya

Q1 = df[i].quantile(0.25)
print('Q1', Q1)

Q3 = df[i].quantile(0.75)
print('Q3', Q3)

IQR = Q3-Q1
print('IQR', IQR)

nilai_min = df[i].min()
nilai_max = df[i].max()

min_IQR = Q1 - 1.5 * IQR


max_IQR = Q3 + 1.5 * IQR

# Mencari outlier
if (nilai_min < min_IQR):
print('Low outlier is found <', min_IQR)
print('Low Outlier Index :', list(df[df[i] < min_IQR].index))

# memasukkan indeks outliers ke variabel outlier_index


outlier_index.append(list(df[df[i] < min_IQR].index))

if (nilai_max > max_IQR):


print('High outlier is found >', max_IQR)
print('High outlier Index : ', list(df[df[i] > max_IQR].index))

# memasukkan indeks outliers ke variabel outlier_index


outlier_index.append(list(df[df[i] > max_IQR].index))

print('\n')

# mengaplikasikan chain, serta mengambil nilai uniknya saja, lalu memasukkan lagi ke dalam
list baru unique_out_ind

unique_out_ind = list(set(list(chain(*outlier_index))))

print(unique_out_ind) # Mencetak list indeks outlier unik

ilmudatapy.com
18
Note: Output yang ditampilkan di atas terpotong. Silahkan jalankan file versi IPYNB-nya untuk melihat output secara keseluruhan.

Sekarang mari kita cetak list indeks outliers tersebut secara terurut.

# Mencetak indeks data yang mengandung outliers secara terurut

print(sorted(unique_out_ind))

Kita dapat menggunakan list indeks tersebut untuk memfilter atau melihat seluruh baris data yang mengandung
outliers tersebut untuk kemudian diputuskan akan menghapus seluruhnya atau membiarkannya.

# Menampilkan seluruh baris data yang mengandung outliers

df.iloc[sorted(unique_out_ind), :]

Note: Output yang ditampilkan di atas terpotong. Silahkan jalankan file versi IPYNB-nya untuk melihat output secara keseluruhan.

ilmudatapy.com
19
Menghapus outliers secara keseluruhan
Setelah di atas kita mendapatkan list indeks outliers, kita juga dapat menggunakannya untuk langsung
menghapus keseluruhan baris data tersebut.

# Menghapus seluruh baris yang mengandung outliers

df.drop(sorted(unique_out_ind), axis=0).head()

Jika Anda ingin menyimpan dataframe yang sudah dihapus outliers-nya, Anda dapat memasukkannya ke dalam
variabel baru lalu mereset indeksnya seperti di bawah ini.

df_without_outlier = df.drop(sorted(unique_out_ind), axis=0)

# mereset indeks dataframe setelah menghapus outliers


df_without_outlier.reset_index(drop=True, inplace=True)
df_without_outlier.head()

ilmudatapy.com
20
Missing Values

Missing values atau nilai yang hilang adalah nilai yang tidak terdefinisi di dataset. Bentuknya beragam, bisa
berupa blank cell, ataupun simbol-simbol tertentu seperti NaN (Not a Number), NA (Not Available), dan
sebagainya. Missing values dapat menjadi masalah dalam analisis data serta tentunya dapat mempengaruhi hasil
modeling machine learning. Karena itu, sebaiknya kita menanganinya dengan benar.

Dataset
Dataset yang digunakan adalah dataset Automobile yang berasal dari UCI Machine Learning Repository.

Pertama kita import pandas, kemudian load datasetnya ke dataframe. Kemudian seperti pada bab yang
membahas outliers sebelumnya, kita mengubah/menambahkan header yang sesuai untuk menggambarkan
masing-masing kolom untuk dapat memudahkan analisis data.

import pandas as pd
import numpy as np

column_names = ['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration',


'num-of-doors', 'body-style', 'drive-wheels', 'engine-location',
'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-type',
'num-of-cylinders', 'engine-size', 'fuel-system', 'bore', 'stroke',
'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg',
'price']

df = pd.read_csv('datasets/automobile.data', names=column_names)
df.head()

ilmudatapy.com
21
Sekarang coba kita lihat info dari dataset tersebut.

df.info()

Seperti yang kita lihat di atas, ada 26 kolom dan 205 baris data. Dilihat dari jumlah data pada masing-masing
kolom, sepertinya tidak ada missing values pada dataset tersebut karena semua kolomnya lengkap berjumlah
205. Namun apakah benar begitu?

Kita tidak boleh langsung percaya begitu saja tanpa memeriksanya, karena terkadang missing values bisa dalam
bentuk lain.

Identifikasi Missing Values


Untuk dapat menangani missing values tentunya kita harus mengetahui seperti apa missing values juga
bagaimana cara mengetahui keberadaannya, karena jika datasetnya dalam jumlah besar kita tidak mungkin
mencarinya secara manual bukan?

Tanda missing values di dataset


Pada umumnya, missing values ditandai dengan NaN di dataset. Jika pada suatu kolom dataframe mengandung
NaN otomatis itu akan terdeteksi oleh Python sebagai missing values.

ilmudatapy.com
22
Namun dalam kasus lain, banyak dataset yang sebenarnya mengandung missing values tetapi dalam bentuk
berbeda sehingga Python tidak menganggapnya sebagai missing values, misalnya dalam bentuk NA, n.a., ?, -,
atau blank cell. Seperti misalnya pada dataset yang kita gunakan sekarang.

Mari kita lihat kolom normalized-losses

df['normalized-losses'].head(10)

Kita lihat bahwa ada tanda '?' pada beberapa data yang menandakan bahwa itu adalah missing values. Tanda '?'
atau simbol lainnya yang bukan berupa NaN tidak dianggap missing values oleh Python melainkan string. Oleh
karena itu kita harus selalu memeriksanya sebelum lanjut ke tahap pemodelan.

Menangani jenis missing value yang tidak sesuai


Untuk menangani jenis missing values yang tidak sesuai seperti pada kasus ini, kita dapat memformatnya
menjadi NaN terlebih dahulu pada saat load dataset di awal untuk memperjelas bahwa itu adalah missing values.

# Definisikan format missing values yang mungkin ada


missing_value_format = ['N.A', 'na', 'n.a.', 'n/a', '?', '-']

# Tambahkan parameter na_values untuk memformat missing values


df = pd.read_csv('datasets/automobile.data', names=column_names,
na_values=missing_value_format)
df.head()

Dapat kita lihat sekarang tanda '?' sudah berubah menjadi NaN. Ketika kita cek info(), missing values sudah
terdekteksi oleh Python. Pada beberapa kolom ada data yang berjumlah kurang dari 205 seperti di bawah ini.

ilmudatapy.com
23
df.info()

Menandai missing values di dataframe dengan Boolean


Kita dapat menandai missing values di dataframe dengan Boolean, True atau False, menggunakan built-in
function isnull() atau notnull().

 isnull() : menandai missing values dengan True, selainnya False


 notnull() : menandai missing values dengan False, selainnya True

df['normalized-losses'].isnull().head(10) # Menandai missing value dengan True

df['normalized-losses'].notnull().head(10) # Menandai missing value dengan False

ilmudatapy.com
24
Mengecek apakah ada missing values?
isnull() dan notnull() juga dapat digunakan untuk mendeteksi missing values secara keseluruhan
dataframe maupun tiap kolom dengan menggunakannya bersama fungsi any().

df.isnull().values.any() # Mengecek missing values untuk keseluruhan dataframe

df.isnull().any() # Mengecek missing values untuk tiap kolom

Menghitung jumlah missing values


Kita juga dapat menggunakan isnull() untuk melihat ada berapa missing values di tiap kolom dengan
menggunakannya bersama dengan fungsi sum().

df.isnull().sum() # Memeriksa jumlah missing values di tiap kolom

ilmudatapy.com
25
Menghapus baris yang mengandung missing values
Salah satu cara untuk menangani missing values adalah dengan menghapusnya, bisa menghapus baris ataupun
kolom. Menghapus kolom dapat dilakukan jika hampir seluruh data pada kolom tersebut adalah missing values.
Dalam kasus ini, tidak ada kolom yang mengandung missing values sebanyak itu. Oleh karena itu, kita tidak akan
menghapus kolom untuk dataframe ini.

Untuk kolom price karena merupakan dependent variable, kita akan menghapus 4 baris data yang
mengandung missing values di kolom tersebut.

Menghapus baris yang mengandung missing values dapat menggunakan fungsi dropna() dengan axis=0. Jika
ingin menghapus kolom, kita dapat mengganti nilai axis menjadi 1.

# Menghapus baris
df.dropna(subset=['price'], axis=0, inplace=True)

# Me-reset indeks karena ada data yang terhapus


df.reset_index(drop=True, inplace=True)

df.head()

inplace=True berfungsi untuk menimpa atau mengganti data sebelumnya dengan data yang telah di-edit.

Kita melakukan reset_index() agar indeksnya tidak terloncat setelah penghapusan. Saat me-reset indeks,
dataframe akan membuat indeks baru sehingga indeks sebelumnya menjadi kolom pertama. Karena itu kita
harus memberikan parameter drop=True untuk menghapusnya. Default-nya adalah False.

Imputing missing values


Jika kita tidak memiliki banyak data, ada baiknya kita tidak menghapus missing values melainkan menggantinya
dengan sebuah nilai. Ada beberapa cara untuk mengisi missing values, diantaranya dengan menggantinya
dengan konstanta tertentu, mean atau median dari kolom tersebut, mengganti dengan nilai pada baris
sebelumnya.

Mengisi missing values dengan nilai tertentu


Kita dapat mengisi missing values dengan sebuah nilai tertentu menggunakan fungsi fillna().

ilmudatapy.com
26
Misalnya missing values pada kolom num-of-doors akan kita isi dengan four yang merupakan jumlah
terbanyak pada kolom tersebut. Untuk mendapatkan four sebagai pengganti missing values tentunya kita harus
mengeceknya terlebih dahulu dengan fungsi value_counts().

df['num-of-doors'].value_counts()

Kemudian kita gunakan fungsi fillna() dan mendefinisikan four sebagai nilai yang akan diisikan pada missing
values.

# Mengisi missing values pada kolom num-of-doors dengan 4

df['num-of-doors'].fillna('four', inplace=True)

Mengisi missing values dengan mean/median


Masih menggunakan fillna(), kita juga dapat menggunakannya bersama dengan fungsi mean() atau
median() untuk mengisi missing values pada kolom numerik.

Misalnya kita akan mengisi kolom normalized-losses dengan nilai rata-rata dari kolom tersebut alias mean.

# Mengisi missing values di kolom normalized-losses dengan mean

df['normalized-losses'].fillna(df['normalized-losses'].mean(), inplace=True)

Sekarang coba kita print data teratasnya, karena seperti yang kita tahu bahwa sebelumnya ada missing values
pada data teratas kolom normalized-losses.

df.head()

Untuk kolom num-of-doors pada contoh sebelumnya, Anda juga dapat menggunakan fungsi mode() jika Anda
memang ingin mengisinya dengan frekuensi terbanyak, dimana penggunaannya sama dengan mean.

Mengisi missing values dengan nilai pada baris sebelumnya atau sesudahnya
Untuk mengisi missing values dengan nilai pada baris sebelumnya atau sesudahnya, kita dapat menambahkan
parameter method di dalam fillna().

ilmudatapy.com
27
Misalnya kita akan mengisi missing values pada kolom bore dengan nilai sebelumnya dengan memberikan
parameter method='pad'.

# Mengisi missing values pada kolom bore dengan nilai sebelumnya


df['bore'].fillna(method='pad', inplace=True)

Sekarang kita akan mengisi missing values pada kolom stroke dengan nilai sesudahnya dengan memberikan
parameter method='bfill'.

# Mengisi missing values pada kolom stroke dengan nilai sesudahnya


df['stroke'].fillna(method='bfill', inplace=True)

Menggunakan fungsi replace()


Setelah di atas kita telah menggunakan fungsi fillna(), kita juga dapat menggunakan fungsi replace()
untuk mengganti missing values.

Misalnya, kita akan mengganti missing values pada kolom horsepower dan peak-rpm dengan nilai mean-nya
menggunakan replace()
# Replace missing values pada kolom horsepower dengan mean
df['horsepower'].replace(np.nan, df['horsepower'].mean(), inplace=True)

# Replace missing values pada kolom peak-rpm dengan mean


df['peak-rpm'].replace(np.nan, df['peak-rpm'].mean(), inplace=True)

Setelah kita menangani semua missing values pada dataframe, sekarang coba kita cek lagi info detailnya.

df.info()

Dapat dilihat pada output di atas, semua kolom sekarang berisi 201 data setelah mengganti dan menghapus 4
baris yang memiliki missing values pada kolom price.

ilmudatapy.com
28
Duplicates

Duplikat data adalah baris data yang memiliki nilai yang sama baik itu untuk seluruh kolom ataupun untuk salah
satu kolom saja, misalnya ada dua orang yang memiliki ID yang sama.

Dataset
Dataset yang digunakan adalah dataset ILPD (Indian Liver Patient Dataset) yang berasal dari UCI Machine
Learning Repository.

Seperti biasa kita import Pandas terlebih dahulu kemudian load dataset ke dalam dataframe Pandas
menggunakan read_csv(). Karena dataset tersebut belum memiliki header, ada baiknya kita tambahkan
dahulu header sesuai dengan informasi atribut di atas untuk tiap kolom.

import pandas as pd
import numpy as np

column_names = ['Age','Gender','Total Bilirubin','Direct Bilirubin','Alkaline Phosphotase',


'SGPT','SGOT','Total Protein', 'Albumin','Albumin and Globulin Ratio',
'Class']

df = pd.read_csv('datasets/Indian-Liver-Patient-Dataset-(ILPD).csv', names=column_names)
df.head()

ilmudatapy.com
29
Mengidentifikasi duplikat data
Ada dua makna duplikat data, yaitu baris data yang secara keseluruhan sama dengan baris lainnya dan juga baris
data yang memiliki nilai yang sama dengan baris lainnya hanya pada kolom tertentu.

Menemukan duplikat data berdasarkan semua kolom


Untuk menemukan duplikat data pada dataframe, kita dapat menggunakan fungsi duplicated(). Perhatikan
kode berikut.

df.duplicated().values.any()

Kita menambahkan values.any() setelah duplicated() untuk menghasilkan nilai Boolean yang menjawab
apakah ada duplikat data di dataframe df. Output dari kode di atas adalah True yang artinya ada data duplikat
pada dataframe tersebut.

Jika kita hanya menggunakan duplicated(), maka yang akan menghasilkan nilai Boolean untuk tiap baris data
seperti di bawah ini.

df.duplicated()

Lalu bagaimana jika kita ingin melihat data yang duplikat tersebut? Perhatikan kode berikut.

df[df.duplicated(keep=False)]

Note: Output yang ditampilkan di atas terpotong. Silahkan jalankan file versi IPYNB-nya untuk melihat output secara keseluruhan.

ilmudatapy.com
30
Seperti yang dapat kita lihat di atas, ada beberapa baris data yang memiliki nilai yang sama persis untuk semua
kolomnya, misalnya baris 18 dan 19, 25 dan 26, dan sebagainya.

Parameter keep=False akan menampilkan semua baris data yang sama seperti di atas, misalnya baris 18 dan
19 yang memiliki nilai yang sama akan ditampilkan semuanya.

Jika hanya ingin menampilkan data kedua yang duplikat saja, dalam hal ini baris 19, 26, 34, dan sebagainya, kita
dapat memberikan nilai keep='first'.

df[df.duplicated(keep='first')]

Jika hanya ingin menampilkan data pertama yang duplikat saja, dalam hal ini baris 18, 25, 33, dan sebagainya,
kita dapat memberikan nilai keep='last'.

df[df.duplicated(keep='last')]

ilmudatapy.com
31
Menemukan duplikat data berdasarkan kolom tertentu
Kita juga dapat menemukan data duplikat berdasarkan kolom tertentu saja. Untuk contoh ini rasanya kurang pas
jika memakai dataset di atas, jadi saya akan membuat dataframe baru agar lebih mudah dipahami seperti di
bawah ini.
# Membuat dataframe df_student

student = {'Name': ['David', 'Jessica', 'Mark', 'David', 'Sophia', 'Alice', 'Arthur'],


'Age': [23, 27, 19, 25, 24, 26, 27],
'Gender': ['Male', 'Female', 'Male', 'Male', 'Female', 'Female', 'Male']}

df_student = pd.DataFrame(student)
df_student

Karena ini merupakan dataframe sederhana, tentunya kita dapat dengan mudah menemukan data dengan nilai
yang sama bukan?! Misalnya pada kolom Name kita tahu ada dua data dengan nama David.

Namun, jika datanya ratusan atau bahkan ribuan, kita tentu akan memerlukan fungsi duplicated() untuk
menemukannya. Perhatikan kode berikut.
# Menemukan duplikat data pada kolom Name

df_student[df_student.duplicated(subset='Name', keep=False)]

Kita juga dapat mengatur parameter keep untuk menandakan yang mana yang dianggap data duplikat. Jika
keep='first' maka yang dianggap data duplikat adalah yang setelah data pertama yang ditemukan. Jika
keep='last' maka yang dianggap data duplikat adalah selain data terakhir yang ditemukan.

df_student[df_student.duplicated(subset='Name', keep='first')] # contoh keep='first'

df_student[df_student.duplicated(subset='Name', keep='last')] # contoh keep='last'

ilmudatapy.com
32
Menghapus duplikat data
Untuk menghapus duplikat data kita dapat menggunakan fungsi drop_duplicates() yang ada di Python.
Penggunaannya mirip dengan fungsi duplicated() di atas.

Menghapus duplikat data berdasarkan semua kolom


Misalnya kita akan menghapus data duplikat setelah data pertama yang ditemukan, jadi kita menggunakan
keep='first'.

df_drop = df.drop_duplicates(keep='first')
df_drop.head(20)

Note: Output yang ditampilkan di atas terpotong. Silahkan jalankan file versi IPYNB-nya untuk melihat output secara keseluruhan.

Jika kita lihat dari output di atas, indeks 19 sudah tidak ada. Seperti yang kita tahu sebelumnya bahwa indeks 18
dan 19 memiliki nilai yang sama persis. Begitu juga dengan data duplikat lainnya sudah tidak ada di dataframe.

Mari kita cek lagi.

df_drop.duplicated().values.any() # Mengecek keberadaan data duplikat

Karena sudah dihapus sekarang sudah bernilai False.

Setelah penghapusan dataframe df_drop di atas indeksnya menjadi tidak terurut karena ada yang terloncat.
Untuk mengatasinya, kita dapat menggunakan reset_index() dengan memberi parameter drop=True agar
indeks sebelumnya terhapus. Perhatikan kode berikut.
df_drop = df_drop.reset_index(drop=True) # mereset indeks
df_drop.head(20)

Note: Output yang ditampilkan di atas terpotong. Silahkan jalankan file versi IPYNB-nya untuk melihat output secara keseluruhan.

ilmudatapy.com
33
Menghapus duplikat data berdasarkan kolom tertentu
Kita juga dapat menghapus baris data duplikat yang ada pada kolom tertentu dengan fungsi
drop_duplicates() dengan memberikan parameter subset. Perhatikan kode di bawah ini.

df_drop_student = df_student.drop_duplicates(subset='Name', keep='first')


df_drop_student

Dapat kita lihat bahwa sekarang nama David hanya ada satu yakni pada indeks 0, sementara yang berada pada
indeks 3 sudah dihapus.

Lalu kita juga dapat mereset indeksnya agar terurut lagi.

df_drop_student = df_drop_student.reset_index(drop=True)
df_drop_student

ilmudatapy.com
34
Data Formatting

Data formatting berarti mengubah format data menjadi bentuk lain yang lebih sesuai. Data formatting dapat
berupa perubahan tipe data, atau mengubah format satuan data ke dalam bentuk yang lebih dapat dimengerti
oleh banyak orang.

Dataset
Dataset yang digunakan adalah dataset Automobile yang berasal dari UCI Machine Learning Repository.

Seperti biasa kita import Pandas terlebih dahulu kemudian load dataset ke dalam dataframe Pandas
menggunakan read_csv(). Karena dataset tersebut belum memiliki header, ada baiknya kita tambahkan
dahulu header sesuai dengan informasi atribut di atas untuk tiap kolom.

import pandas as pd
import numpy as np

column_names = ['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration',


'num-of-doors', 'body-style', 'drive-wheels', 'engine-location',
'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-type',
'num-of-cylinders', 'engine-size', 'fuel-system', 'bore', 'stroke',
'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg',
'price']

df = pd.read_csv('datasets/automobile.data', names=column_names)
df.head()

ilmudatapy.com
35
Mengubah tipe data
Saat melakukan proses persiapan data sebelum dilakukan modeling dengan machine learning, salah satu proses
yang harus diperhatikan adalah tipe data dari tiap kolom atau atribut/fitur-nya.

Untuk mengecek tipe data, kita dapat menggunakan dtypes.


df.dtypes

Dari output di atas, terlihat ada beberapa fitur yang tipe datanya tidak sesuai. Misalnya normalized-losses
terdeteksi bertipe 'object' yang berarti dianggap sebagai string, padahal jika kita lihat datanya di dataframe
seharusnya kolom tersebut bertipe numerik seperti 'int' atau 'float'.

Mengapa kolom numerik bisa terdeteksi sebagai 'object'?

Jika kita lihat pada sampel dataframe di atas, ada beberapa data pada kolom numerik yang memiliki nilai '?' yang
dianggap sebagai string oleh Python. Pada dasarnya itu merupakan missing values sehingga kita harus
mengubah '?' terlebih dahulu sebagai NaN ataupun langsung menangani missing values tersebut, misalnya
dengan menggantinya dengan nilai tertentu. Pembahasan tentang missing values dapat dilihat pada bab
sebelumnya.

Disini hanya saya akan mengganti '?' dengan NaN.

df.replace('?', np.nan, inplace=True)

Parameter inplace=True berfungsi untuk langsung menimpa dataframe df dengan hasil modifikasi yang
dilakukan, dalam hal ini replace '?' dengan NaN. Jika kita tidak memberikan parameter inplace=True, maka
perubahan itu tidak akan tersimpan pada variabel dataframe df yang sedang dikerjakan.

Sekarang kita cek dataframe df untuk melihat perubahannya.

ilmudatapy.com
36
df.head()

Seluruh missing values yang tadinya berupa '?' sekarang sudah berubah menjadi NaN.

Tahap selanjutnya yaitu mengubah tipe data menggunakan method astype(). Ada beberapa kolom yang
memiliki tipe data yang tidak sesuai, di antaranya kolom normalized-losses, bore, stroke, peak-rpm dan
price.

# Mengubah tipe data object menjadi float

df[['bore', 'stroke']] = df[['bore', 'stroke']].astype('float')

df['price'] = df['price'].astype('float')
df['peak-rpm'] = df['peak-rpm'].astype('float')

Kolom normalized-losses seharusnya bertipe 'int', bukan? Namun, NaN tidak dapat langsung dikonversi
menjadi 'int'. NaN adalah 'float' sehingga untuk mengubah kolom menjadi integer nullable, tipe 'object' harus
kita konversi menjadi 'float' terlebih dahulu, baru kemudian dikonversi lagi menjadi 'Int64'.

Perhatikan bahwa yang dapat digunakan adalah 'Int64' dengan huruf kapital di depan. Jika menggunakan 'int'
atau 'int64' maka akan terjadi error.

# Mengubah tipe data pada kolom normalized-losses menjadi float kemudian Int64

df['normalized-losses'] = df['normalized-losses'].astype('float').astype('Int64')

df.head()

ilmudatapy.com
37
Sekarang mari kita cek lagi menggunakan dtypes.
df.dtypes

Untuk kasus seperti kolom normalized-losses, jika Anda mengganti missing values terlebih dahulu menjadi
bilangan tertentu sehingga tidak ada lagi data yang bernilai NaN, Anda dapat langsung mengkonversi tipe data
menjadi 'int', tidak harus dua kali konversi seperti di atas.

Standarisasi data
Data biasanya dikumpulkan dari beberapa sumber sehingga berpeluang memiliki format yang berbeda.

Standarisasi adalah transformasi data menjadi format yang lebih umum dan mudah dipahami. Data
standardization juga merupakan suatu istilah yang merujuk pada tipe tertentu dari normalisasi data, yakni
pengurangan mean yang kemudian dibagi oleh standar deviasinya.

Contoh standarisasi misalnya mengubah mpg menjadi L/100km.

Di dataset ini, kolom konsumsi bahan bakar, city-mpg dan highway-mpg menggunakan satuan mpg (miles per
gallon). Di beberapa negara tertentu, satuan tersebut mungkin tidak familiar, karena itu kita sebaiknya
mengganti kolom tersebut dengan satuan L/100km yang mungkin lebih bisa dipahami.

Rumus yang dapat kita gunakan adalah:

L/100km = 235 / mpg

Sekarang kita aplikasikan rumus tersebut di Pandas untuk mengkonversi kolom city-mpg dan highway-mpg.

# Konversi city-mpg menjadi L/100km

df['city-L/100km'] = 235 / df['city-mpg']

ilmudatapy.com
38
Sekarang kita cek dataframe df.

df.head()

Dari output di atas, pada kolom terakhir ada kolom baru yaitu L/100km yang merupakan hasil konversi dari
kolom city-mpg. Sekarang kita lakukan hal yang sama untuk mengkonversi highway-mpg.

# Konversi highway-mpg menjadi highway-L/100km

df['highway-L/100km'] = 235 / df['highway-mpg']


df.head()

Setelah kita memiliki kolom city-L/100km dan highway-L/100km, kita dapat menghapus kolom city-mpg
dan highway-mpg karena sudah tidak digunakan lagi.

# Menghapus kolom city-mpg dan highway-mpg

df.drop(['city-mpg', 'highway-mpg'], axis=1, inplace=True)


df.head()

ilmudatapy.com
39
Menambah fitur baru
Misalnya kita ingin menambahkan fitur yang menampilkan data apakah kendaraan tersebut termasuk mewah
ataukah tidak dengan melihat jenis drive-wheels dan engine-location-nya.

Untuk membuat kondisi pada dataframe Pandas, kita dapat menggunakan lambda yang diletakkan di dalam
method apply() seperti di bawah ini.

df['isLuxury'] = df.apply(lambda row: 1 if ((row['drive-wheels']=='rwd') and


(row['engine-location']=='front')) else 0,
axis=1)

df['isLuxury'] = df['isLuxury'].astype('category')

Lalu mari kita cek dataframe df.

df.head()

Kolom baru isLuxury terbentuk di paling ujung dataframe yang memiliki nilai 1 atau 0 sesuai dengan kondisi
yang telah ditetapkan pada kode di atas.

ilmudatapy.com
40
Data Binning

Data Binning adalah sebuah proses untuk mengelompokkan data ke dalam bagian-bagian yang lebih kecil yang
disebut bin berdasarkan kriteria tertentu. Binning data merupakan salah satu teknik praproses data yang
digunakan untuk meminimalisasi kesalahan dalam pengamatan serta terkadang dapat meningkatkan akurasi dari
model prediktif.

Binning biasanya digunakan untuk mengelompokkan data numerik menjadi beberapa bin agar sebaran data
lebih mudah dipahami. Misalnya kita dapat mengelompokkan fitur “usia” menjadi [0-5], [6-10], [11-15], [16-20],
[20-25], dan seterusnya.

Contoh lain misalnya sebuah data yang memiliki fitur "Harga" dengan kisaran 1000 hingga 99000. Kita bisa
membagi harga tersebut menjadi tiga bin, "Murah", "Standar", dan "Mahal" dengan batas tertentu.

Ada dua fungsi di Pandas yang dapat digunakan untuk melakukan binning data, yaitu cut() dan qcut().

Dataset
Dataset yang digunakan adalah dataset Automobile yang berasal dari UCI Machine Learning Repository.

Seperti biasa kita import Pandas terlebih dahulu kemudian load dataset ke dalam dataframe Pandas
menggunakan read_csv(). Karena dataset tersebut belum memiliki header, ada baiknya kita tambahkan
dahulu header sesuai dengan informasi atribut di atas untuk tiap kolom.

ilmudatapy.com
41
import pandas as pd
import numpy as np

column_names = ['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration',


'num-of-doors', 'body-style', 'drive-wheels', 'engine-location',
'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-type',
'num-of-cylinders', 'engine-size', 'fuel-system', 'bore', 'stroke',
'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg',
'price']

df = pd.read_csv('datasets/automobile.data', names=column_names)
df.head()

Sebelum menerapkan binning kita akan menangani missing values terlebih dahulu.

df.replace('?', np.nan, inplace=True)


df.head()

Seperti yang telah di bahas sebelumnya di bab tentang missing values, dataset ini mengandung missing values
pada beberapa kolom, seperti normalized-losses, num-of-doors, bore, stroke, horsepower, peak-
rpm, dan price. Disini kita akan menangani missing values terlebih dahulu.

Mari kita menghapus baris yang mengandung missing values pada kolom price.

# Menghapus baris yang mengandung mising values di kolom price


df.dropna(subset=['price'], axis=0, inplace=True)

# Me-reset indeks karena ada data yang terhapus


df.reset_index(drop=True, inplace=True)

ilmudatapy.com
42
Selanjutnya, untuk missing values pada kolom normalized-losses, stroke, bore, horsepower, dan peak-
rpm akan kita ganti dengan nilai mean-nya, sedangkan missing values di kolom num-of-doors diganti dengan
'four'.

df['num-of-doors'].fillna('four', inplace=True)

avg_norm = df['normalized-losses'].astype('float').mean(axis=0)
df['normalized-losses'].replace(np.nan, avg_norm, inplace=True)

avg_stroke = df['stroke'].astype('float').mean(axis=0)
df['stroke'].replace(np.nan, avg_stroke, inplace=True)

avg_bore = df['bore'].astype('float').mean(axis=0)
df['bore'].replace(np.nan, avg_bore, inplace=True)

avg_horse = df['horsepower'].astype('float').mean(axis=0)
df['horsepower'].replace(np.nan, avg_horse, inplace=True)

avg_peak = df['peak-rpm'].astype('float').mean(axis=0)
df['peak-rpm'].replace(np.nan, avg_norm, inplace=True)

df.head()

Setelah itu kita perbaiki tipe datanya.

df[['bore', 'stroke', 'peak-rpm']] = df[['bore', 'stroke', 'peak-rpm']].astype('float')


df[['normalized-losses', 'horsepower']] = df[['normalized-losses',
'horsepower']].astype('int')
df[['price']] = df[['price']].astype('float')

Fungsi cut()
Pertama kita akan mencoba menggunakan fungsi cut() untuk membagi data menjadi beberapa bin. Untuk
menentukan batas bin dapat dilakukan dengan berbagai cara. Setidaknya ada tiga cara yang dapat kita lakukan,
yaitu dengan linspace(), interval_range(), atau dengan mendefinisikan sendiri batas bin.

Sebelumnya mari kita lihat dulu distribusi data dari kolom horsepower menggunakan visualisasi histogram.

ilmudatapy.com
43
import matplotlib.pyplot as plt
%matplotlib inline

df['horsepower'].plot(kind='hist')

plt.xlabel('horsepower')
plt.ylabel('count')
plt.title('Horsepower Bins', size=16)
plt.show()

Menentukan batas bin dengan linspace()


linspace() adalah sebuah fungsi dari Numpy yang digunakan untuk membuat array yang berisi sejumlah
angka dengan jarak yang sama. Angka-angka ini yang nantinya akan digunakan sebagai batas untuk tiap kategori.

Secara umum linspace ditulis : numpy.linspace(start, end, num_of_dividers)

 start : nilai minimum atau batas bawah data


 end : nilai maksimum atau batas atas data
 num_of_dividers : jumlah pembagi atau jumlah bin yang ingin dihasilkan plus 1

Pada contoh kali ini, misalnya kita akan melakukan binning untuk kolom horsepower yang memiliki nilai
berkisar antara 48 sampai 288. Kita akan membaginya menjadi tiga kategori yaitu 'Low', 'Medium', dan 'High'.

Karena kita akan membagi menjadi 3 bin, maka jumlah pembagi batasnya harus ada 4.
# Menentukan batas bin dengan linspace

bins = np.linspace(min(df['horsepower']), max(df['horsepower']), 4)


bins

Selanjutnya kita definisikan nama kategorinya ke dalam variabel, misalnya kategori.


# Membuat nama kategori

kategori = ['Low', 'Medium', 'High']

ilmudatapy.com
44
Lalu kita aplikasikan fungsi cut() untuk melihat setiap nilai pada kolom horsepower masuk pada kategori apa.
Kita akan membuat kolom baru dengan nama horsepower-binned untuk menampung hasil binning data.

# Menerapkan fungsi cut untuk binning data

df['horsepower-binned'] = pd.cut(df['horsepower'], bins, labels=kategori,


include_lowest=True)

df[['horsepower','horsepower-binned']].head(20)

Parameter include_lowest=True akan membuat nilai minimum pada kolom tersebut juga diikutsertakan
dalam proses binning. Default-nya adalah False. Karena itu, jika tidak di-set, nilai 48 yang merupakan nilai
minimum akan menghasilkan NaN untuk kolom horsepower-binned-nya.

Sekarang coba kita lihat jumlah data untuk masing-masing kategori.

df['horsepower-binned'].value_counts()

Menentukan batas bin dengan interval_range()


Kita juga dapat menggunakan interval_range() yang merupakan sebuah fungsi dari Pandas untuk
menentukan batasan bin.

Secara umum penggunaan interval_range adalah sebagai berikut:

pandas.interval_range(start, freq, end).

ilmudatapy.com
45
 start : nilai minimum atau batas bawah data
 freq : panjang dari tiap interval
 end : nilai maksimum atau batas atas data

Jumlah bin yang dihasilkan oleh interval_range() tergantung pada freq atau panjang dari tiap intervalnya.

Disini saya akan mendefisikan nilai minimumnya adalah 0, nilai maksimumnya adalah 300, dan panjang tiap
intervalnya adalah 100 sehingga nantinya juga akan ada 3 bin. Panjang interval akan mempengaruhi jumlah bin.
Jika misalnya kita set panjang interval dengan 50, bin yang akan dihasilkan berjumlah 6 bin.

# Menentukan bin dengan interval_range

interval = pd.interval_range(start=0, freq=100, end=300)


interval

Untuk membaca interval seperti (0, 100], (100, 200], dan seterusnya, tanda kurung () berarti tidak
diikutsertakan, sedangkan tanda kurung siku [] berarti diikutsertakan.

Jadi untuk contoh interval (100, 200] misalnya, 100 tidak masuk dalam interval, tetapi 200 masuk dalam
interval tersebut.

Selanjutnya kita gunakan fungsi cut() untuk binning data.

Harap dicatat bahwa jika menggunakan interval_range(), kita tidak dapat memberikan label ('Low',
'Medium', 'High').

# Menerapkan fungsi cut untuk binning data

df['horsepower-binned-2'] = pd.cut(df['horsepower'], bins=interval)


df[['horsepower','horsepower-binned-2']].head(20)

ilmudatapy.com
46
Sekarang kita coba hitung jumlah data yang masuk ke masing-masing interval.

df['horsepower-binned-2'].value_counts()

Mendefinisikan sendiri batasan bin


Kita juga dapat mendefinisikan batas-batas bin yang akan dibuat sesuai keinginan dan menggunakan fungsi cut()
untuk binning data.

# Menentukan batasan bin sendiri


batas_bin = [0, 80, 160, 300]

# Menentukan kategori
kategori = ['Low', 'Medium', 'High']

# Binning data dengan cut()


df['horsepower-binned-3'] = pd.cut(df['horsepower'], bins=batas_bin, labels=kategori)
df[['horsepower','horsepower-binned-3']].head(20)

Sekarang coba kita hitung jumlah data yang masuk ke dalam tiap kategori.

df['horsepower-binned-3'].value_counts()

ilmudatapy.com
47
Fungsi qcut()
Selain fungsi cut(), ada juga fungsi qcut() yang dapat digunakan untuk melakukan binning data. Menurut
dokumentasi pandas, qcut digambarkan sebagai Quantile-based discretization function. Singkatnya fungsi
qcut() ini akan membagi data ke dalam jumlah yang sama. Karena itu, jarak untuk masing-masing bin boleh
jadi berbeda satu sama lain.

# Mendefinisikan kategori
kategori = ['Low', 'Medium', 'High']

# Menerapkan fungsi qcut untuk binning data


df['horsepower-binned-4'] = pd.qcut(df['horsepower'], q=3, labels=kategori)
df[['horsepower','horsepower-binned-4']].head(20)

Sekarang mari kita lihat jumlah data pada masing-masing kategori.

df['horsepower-binned-4'].value_counts()

Dari output di atas terlihat bahwa hasil binning data menggunakan qcut() akan menghasilkan jumlah data yang
hampir sama pada tiap kategori (Jika jumlah seluruh data bisa dibagi 3, maka jumlahnya akan sama persis).

Kesimpulannya, jika kita mengharapkan jumlah item yang sama pada masing-masing bin, gunakanlah qcut().
Namun, jika lebih mengutamakan batas angka tertentu untuk tiap bin, gunakanlah cut().

ilmudatapy.com
48
Data Encoding

Data Encoding adalah salah satu tahap praproses data sebelum diproses dengan algoritma machine learning.
Dalam mengerjakan projek data science ataupun machine learning, kita akan sangat mungkin menemukan satu
atau beberapa fitur yang bertipe kategori, misalnya 'Sangat Baik', 'Baik', 'Tidak Baik'. Nah, komputer tidak dapat
memproses data bertipe kategori sehingga kita harus mengubah data tersebut menjadi berbentuk bilangan.
Proses ini disebut dengan encoding.

Dataset
Dataset yang digunakan adalah dataset Automobile yang berasal dari UCI Machine Learning Repository.

Pertama kita import pandas, kemudian load datasetnya ke dataframe. Kemudian kita tambahkan header yang
sesuai untuk menggambarkan masing-masing kolom untuk dapat memudahkan analisis data dan juga
memformat missing values '?' menjadi NaN ketika membaca file ke dataframe Pandas menggunakan
read_csv().

import pandas as pd
import numpy as np

column_names = ['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration',


'num-of-doors', 'body-style', 'drive-wheels', 'engine-location',
'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-type',
'num-of-cylinders', 'engine-size', 'fuel-system', 'bore', 'stroke',
'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg',
'price']

df = pd.read_csv('datasets/automobile.data', names=column_names)
df.head()

ilmudatapy.com
49
Coba kita cek tipe datanya.

df.dtypes

Encoding adalah proses yang diterapkan pada data yang bertipe kategori, karena itu kita akan memfilter
dataframe df dengan menyingkirkan dahulu kolom bertipe numerik, seperti float dan int, dan hanya menyisakan
kolom yang bertipe object agar tidak terlalu banyak kolom yang ditampilkan sehingga memaksimalkan
pengamatan proses encoding ini.

Anda dapat memfilter kolom berdasarkan tipe data dengan select_dtypes().


# Memfilter kolom bertipe object

df_obj = df.select_dtypes(include='object').copy()
df_obj.head()

ilmudatapy.com
50
Sebelum proses encoding, kita cek dulu apakah ada missing values pada df_obj.
# Mengecek missing values pada dataframe df_obj

df_obj[df_obj.isnull().any(axis=1)]

Ternyata ada dua missing values pada kolom num-of-doors. Kemudian kita isi missing values tersebut dengan
'four' yang merupakan nilai yang paling banyak di kolom tersebut.

df_obj['num-of-doors'].value_counts()

# Mengisi missing values dengan 'four'

df_obj['num-of-doors'].fillna('four', inplace=True)

# Mengecek lagi keberadaan missing values

df_obj.isnull().values.any()

Sekarang sudah tidak ada missing values di dalam dataframe df_obj. Mari kita berlanjut ke proses encoding.

Encoding secara manual (Replace)


Encoding berarti mengubah label kategori menjadi bilangan, bukan? Sebelum membahas teknik encoding yang
ada di Python, kita akan mencoba teknik replace. Sederhananya, kita akan melakukan replacing secara manual
pada kolom bertipe kategori.

Seperti yang kita lihat pada dataframe df_obj, kolom num-of-doors dan num-of-cylinders sejatinya
memiliki nilai angka, namun masih ditulis dengan huruf. Nah untuk dua kolom tersebut, misalnya kita ingin
mempertahankan nilai tersebut sehingga kita dapat langsung menggantinya dengan method replace(),
contohnya 'four' kita ganti menjadi 4.

Sebelumnya melakukan replace, kita harus mengetahui dahulu nilai unik yang ada pada dua kolom tersebut
dengan method unique().

df_obj['num-of-doors'].unique()

ilmudatapy.com
51
df_obj['num-of-cylinders'].unique()

Setelah kita mengetahui nilai unik pada kolom tersebut, kini saatnya kita membuat dictionary untuk
mendefinisikan pemetaan perubahannya.

# Membuat dictionary peta perubahan

dic = {'num-of-doors': {'two': 2, 'four': 4},


'num-of-cylinders': {'four': 4, 'six': 6, 'five': 5, 'three': 3, 'twelve': 12,
'two': 2, 'eight': 8}}

Lalu kita dapat langsung menggunakan method replace().

# Menerapkan method replace

df_obj = df_obj.replace(dic)
df_obj.head()

Dari output di atas, terlihat bahwa kolom num-of-doors dan num-of-cylinders sudah berubah menjadi
bilangan.

Label Encoding menggunakan .cat.codes


Pendekatan yang kedua untuk proses encoding adalah dengan Label Encoding. Label encoding akan mengubah
kolom bernilai kategori menjadi bilangan dari 0, 1, 2, dan seterusnya tergantung pada jumlah nilai unik dalam
kolom tersebut.

Misalnya dalam kolom body-style ada lima nilai unik, maka perubahannya akan seperti ini:

 convertible : 0
 hardtop : 1
 hatchback : 2
 sedan : 3
 wagon : 4

Urutan angka-angka yang dihasilkan adalah berdasarkan urutan abjad.

Untuk melakukan label encoding di Pandas kita dapat menggunakan .cat.codes.

ilmudatapy.com
52
Sebelumnya, kita harus ubah tipe data body-style menjadi category terlebih dahulu.
# Mengubah tipe data body-style menjadi category

df_obj['body-style'] = df_obj['body-style'].astype('category')

Sekarang coba kita cek tipe data dari kolom body-style.

df_obj['body-style'].dtype

Setelah mengubah tipe data menjadi 'category', kemudian kita dapat mengaplikasikan .cat.codes dan
menyimpan hasilnya ke dalam kolom baru bernama body-style-encode. Menyimpannya di kolom baru
adalah salah satu opsi. Anda juga dapat menimpanya langsung pada kolom body-style.

# Mengaplikasikan .cat.codes

df_obj['body-style-encode'] = df_obj['body-style'].cat.codes
df_obj.head()

Jika ingin melihat perubahannya, Anda dapat menampilkan hanya dua kolom tersebut secara berdampingan
seperti di bawah ini.

# Menampilkan kolom body-style dan body-style-encode

df_obj[['body-style', 'body-style-encode']].head(10)

ilmudatapy.com
53
One-Hot Encoding
One-Hot Encoding adalah teknik yang paling banyak digunakan untuk encode data kategori. Metode ini
merepresentasikan data bertipe kategori sebagai vektor biner yang bernilai integer, 0 dan 1. Setiap label
kategori akan membentuk kolom baru dengan nama label masing-masing.

Di Pandas, kita dapat mengaplikasikan one-hot encoding dengan fungsi get_dummies(). Fungsi tersebut
dinamakan seperti itu karena menghasilkan variabel indikator/dummy (0 dan 1).

Misalnya kita akan melakukan one-hot encoding untuk kolom drive-wheels yang memiliki tiga label kategori
yakni fwd, rwd dan 4wd.

# Mengaplikasikan get_dummies()

pd.get_dummies(df_obj, columns=['drive-wheels']).head()

Dari output di atas dapat kita lihat ada tiga kolom baru di ujung dataframe yaitu drive-wheels_4wd, drive-
wheels_fwd, dan drive-wheels_rwd. Untuk data paling atas misalnya, kolom 4wd dan fwd bernilai 0,
sedangkan kolom rwd bernilai 1 karena memang drive-wheels-nya rwd.

Jika dirasa nama kolom yang terbentuk terlalu panjang, Anda dapat mengatur prefix kolom tersebut dengan
parameter prefix seperti di bawah ini.
# Mengaplikasikan get_dummies() dengan pengaturan prefix

pd.get_dummies(df_obj, columns=['drive-wheels'], prefix=['drive']).head()

ilmudatapy.com
54
Anda juga dapat mengaplikasikan get_dummies() untuk lebih dari satu kolom sekaligus seperti di bawah ini.

# Mengaplikasikan get_dummies() untuk dua kolom

pd.get_dummies(df_obj, columns=['drive-wheels', 'fuel-type'],


prefix=['drive', 'fuel']).head()

Custom Binary Encoding


Untuk analisis data lebih lanjut, terkadang kita hanya perlu melihat apakah suatu data mengandung label
kategori tertentu atau tidak. Jika ini yang Anda butuhkan, Anda dapat mengaturnya dengan menggunakan
np.where dari Numpy untuk membuat kondisi.

Sebagai contoh misalnya kita ingin melihat apakah engine-type-nya 'dohc' atau bukan. Kita dapat menulis
kodenya seperti di bawah ini.

# contoh custom binary encoding

df_obj['is_dohc'] = np.where(df_obj['engine-type']=='dohc', 1, 0)

Kolom baru bernama is_dohc akan terbentuk dan mengandung nilai 1 atau 0, dimana akan bernilai 1 jika
engine-type-nya 'dohc', dan bernilai 0 jika bukan 'dohc'.

Mari kita print dataframe df_obj untuk melihat hasilnya.


df_obj.head()

ilmudatapy.com
55
Encoding menggunakan library Scikit-Learn
Teknik-teknik sebelumnya yang menggunakan library Pandas memang terlihat lebih simple. Namun jika Anda
ingiin membangun model prediktif, teknik encoding menggunakan Scikit-Learn dapat Anda gunakan untuk
mengoptimalkan model Anda.

Disini akan dibahas dua teknik yakni dengan OrdinalEncoder dan OneHotEncoder dari Scikit-Learn.

OrdinalEncoder
Untuk menggunakan OrdinalEncoder di Scikit-Learn, kita harus mengimpornya terlebih dahulu. Kita juga
membutuhkan method fit_tranform untuk memproses dan mentransformasi data.

Misalnya kita ingin melakukan encoding dengan OrdinalEncode pada kolom make.

from sklearn.preprocessing import OrdinalEncoder

ord_encode = OrdinalEncoder()
df_obj['make_encode'] = ord_encode.fit_transform(df_obj[['make']])

Sekarang mari kita lihat hasilnya.

df_obj[['make', 'make_encode']].head(20)

ilmudatapy.com
56
OneHotEncoder
Sebelumnya kita telah membahas cara encoding dengan One-Hot di Pandas. Sekarang kita akan mencoba
melakukan One-Hot encoding dengan OneHotEncoder dari Scikit-Learn.

Misalnya kita menggunakan kolom body-style untuk percobaan ini.

from sklearn.preprocessing import OrdinalEncoder

one_hot = OneHotEncoder()
encode_result = one_hot.fit_transform(df_obj[['body-style']])

# Mengubah result ke dalam dataframe dan menampilkan beberapa sample datanya


df_onehot = pd.DataFrame(encode_result.toarray(), columns=one_hot.categories_)
df_onehot.sample(10)

toarray() digunakan untuk mengkonversi encode_result menjadi format yang dapat dikonversi ke dalam
dataframe.

Selajutnya kita gabungkan dengan kolom df_obj yang lainnya menggunakan method join().
# Menggabungkan dengan df_obj dengan df_onehot

df_obj = df_obj.join(df_onehot)
df_obj.head(10)

ilmudatapy.com
57
Data Scaling

Data scaling adalah proses mentranformasi nilai dari beberapa kolom/variabel numerik ke dalam range yang
mirip. Saat mengolah data, bukan hal yang jarang terjadi jika rentang nilai antara variabel tersebut sangat jauh.
Misalnya umur yang normalnya hanya berkisar di bawah 100 dan gaji yang kebanyakan bernilai puluhan ribu,
ratusan ribu atau jutaan rupiah.

Gambar di atas menunjukkan jauhnya range variabel 'Umur' dan 'Gaji'. Perbedaan range yang jauh tersebut
dapat mempengaruhi hasil akurasi model machine learning. Karena itu, sebelum dilakukan proses modeling kita
perlu melakukan scaling data agar hasil model machine learning menjadi lebih akurat, misalnya dengan
mengubahnya ke dalam range 0 sampai 1.

Dataset
Dataset yang digunakan dalam praktek kali ini adalah dataset Iris yang sudah tersedia di library Scikit-Learn
sehingga kita dapat langsung me-load-nya.

Ada 4 fitur di dalam dataset Iris, yaitu sepal length (cm), sepal width (cm), petal length (cm), dan
petal width (cm). Kita dapat mengaksesnya dengan menggunakan .data. Sedangkan kolom target berupa
bilangan 0, 1, dan 2 yang merepresentasikan 'Iris-Setosa', 'Iris-Versicolor', dan 'Iris-Virginica' yang merupakan
jenis bunga Iris. Kita dapat mengakses target menggunakan .target.

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['class'] = pd.Series(iris.target)
df.sample(10)

ilmudatapy.com
58
Jika kita lihat dataframe di atas, semua fitur sudah bertipe numerik, jadi kita dapat langsung melakukan scaling
data.

Simple Feature Scaling


Metode yang pertama adalah dengan simple feature scaling. Metode ini terbilang yang paling sederhana karena
hanya membagi setiap data dengan nilai maksimum di kolom tersebut.

Mari kita coba terapkan pada dataframe df. Scaling dilakukan hanya pada data fitur, bukan target. Karena itu
kita harus menghapus target terlebih dahulu, baru kemudian setelah proses scaling selesai dapat disatukan lagi
untuk proses modeling.

# Menghapus kolom 'class'

df_fitur = df.drop(['class'], axis=1)


df_fitur.head()

Setelah kita menghapus kolom class dan menyimpannya di variabel baru bernama df_fitur, kita dapat
langsung menerapkan simple feature scaling seperti di bawah ini.

# Menerapkan simple feature scaling

df_fitur_scaling = df_fitur / df_fitur.max()

Mari kita lihat hasilnya.

ilmudatapy.com
59
df_fitur_scaling.head()

Terihat dari output di atas, sekarang nilai dari fitur pada dataframe sudah berubah berkisar antara 0 sampai 1.

Data Normalization
Metode selanjutnya yaitu data normalization atau normalisasi data. Di Scikit-Learn kita dapat menggunakan
method normalize untuk normalisasi data. Kita juga dapat menggunakan MinMaxScaler.

normalize
normalize ada di dalam library sklearn.preproccessing dan akan menghasilkan nilai antara 0 dan 1. Jadi jangan
lupa untuk impor dahulu library-nya.

Kita akan menggunakan df_fitur di atas untuk praktek ini. Sebelumnya, mari kita lihat dataframe df_fitur.

df_fitur.head()

Selanjutnya kita normalisasi df_fitur menggunakan normalize. Hasil dari normalize berupa array, karena
itu kita harus mentranformasinya menjadi dataframe.
from sklearn.preprocessing import normalize

# Normalisasi data
norm = normalize(df_fitur)

# Transformasi array menjadi dataframe


df_fitur_norm = pd.DataFrame(data=norm, columns=df_fitur.columns)

Sekarang kita lihat hasilnya.

ilmudatapy.com
60
df_fitur_norm.head()

MinMaxScaler
Selanjutnya untuk normalisasi data kita juga menggunakan MinMaxScaler. Cara kerjanya setiap nilai pada
sebuah fitur dikurangi dengan nilai minimum fitur tersebut, kemudian dibagi dengan rentang nilai atau nilai
maksimum dikurangi nilai minimum dari fitur tersebut.

Di Python, kita dapat dengan mudah melakukannya dengan library Scikit-Learn.

from sklearn.preprocessing import MinMaxScaler

# Normalisasi dengan min max scaler


minmax = MinMaxScaler()
minmax_scaler = minmax.fit_transform(df_fitur)

# Tranformasi array menjadi dataframe


df_fitur_minmax = pd.DataFrame(data=minmax_scaler, columns=df_fitur.columns)

Mari kita lihat hasilnya.

df_fitur_minmax.head()

Data Standardization
Data standardization mengacu pada pergeseran distribusi setiap fitur agar memiliki rata-rata 0 dan standar
deviasi 1.

Konsepnya adalah masing-masing nilai pada fitur dikurangi dengan miu (µ) yang merupakan nilai rata-rata fitur,
kemudian dibagi dengan sigma (σ) yang merupakan standar deviasi.

Di Python, kita dapat melakukan standarisasi data menggunakan scale dan StandarScaler dari Scikit-Learn.

ilmudatapy.com
61
scale
Kita masih akan menggunakan dataframe df_fitur.

from sklearn.preprocessing import scale

# Normalisasi data
scale = scale(df_fitur)

# Transformasi array menjadi dataframe


df_fitur_scale = pd.DataFrame(data=scale, columns=df_fitur.columns)

Sekarang kita lihat hasilnya.

df_fitur_scale.head()

StandarScaler
Cara lain untuk standarisasi data adalah dengan menggunakan StandardScaler dari Scikit-Learn.

from sklearn.preprocessing import StandardScaler

# Standarisasi dengan min max scaler


standard = StandardScaler()
standard_scaler = standard.fit_transform(df_fitur)

# Tranformasi array menjadi dataframe


df_fitur_standard = pd.DataFrame(data=standard_scaler, columns=df_fitur.columns)

Coba kita lihat hasilnya.

df_fitur_standard.head()

Banyak yang mengenal semua metode di atas adalah metode normalisasi data. Jadi, tidak perlu bingung jika ada
yang mengatakan normalisasi data dengan StandarScaler misalnya.

ilmudatapy.com
62
Reshaping

Terkadang kita perlu melakukan reshaping data atau mengubah bentuk data untuk memudahkan dalam proses
analisis. Disini kita akan membahas 2 teknik reshaping yaitu Pivoting dan Melting.

 Pivoting data adalah melakukan perubahan bentuk data dari bentuk memanjang ke bawah menjadi
melebar ke samping.
 Melting data adalah melakukan perubahan bentuk data dari bentuk melebar menjadi memanjang.

Dataset
Praktek pivoting dan melting ini kita akan menggunakan beberapa dataframe, baik yang kita buat sendiri
maupun dari dataset yang sudah ada. Untuk dataset yang akan digunakan adalah dataset Diamonds yang berasal
dari Kaggle.

Pertama kita impor Pandas, kemudian load data ke dataframe menggunakan read_csv().
import pandas as pd

df_diamonds = pd.read_csv('datasets/diamonds.csv')
df_diamonds = df_diamonds.drop('Unnamed: 0', axis=1) # Menghapus kolom Unnamed: 0
df_diamonds.head()

Pivoting dataframe di Python


Untuk memuat pivot table di Python, kita dapat menggunakan function pivot_table(). Setidaknya kita harus
mendefinisikan tiga parameter, yaitu:

 index : kolom yang akan dijadikan indeks


 columns : kolom yang akan dijadikan kolom
 values : kolom yang akan dijadikan values

ilmudatapy.com
63
Untuk lebih jelasnya perhatikan contoh penggunaannya pada kode berikut.

# Pivoting dataframe df_diamonds

pivot_diamonds = df_diamonds.pivot_table(index='color',
columns='cut',
values=['x', 'y', 'z'])
pivot_diamonds

Pada contoh di atas, kita menggunakan kolom color sebagai index, cut sebagai columns, dan x, y, z sebagai
values-nya.

Perlu diketahui nilai x, y, z pada hasil pivot_table di atas adalah nilai mean atau rata-rata. Ada satu
parameter yaitu aggfunc yang jika tidak didefinisikan akan menghasilkan nilai mean sebagai default-nya.
Dataframe df_diamonds memiliki banyak nilai color dan cut yang sama sehingga nilai-nilainya otomatis di-
aggregate.

Jika antara kolom yang dijadikan index dan columns tidak mengandung nilai yang sama, maka values-nya tidak
akan di-aggregate. Misalnya kita memiliki data siswa seperti di bawah ini.

# Membuat dataframe

import pandas as pd
import random

data_siswa = {
'Nama Siswa' : ['Jessica', 'Tommy', 'Alisha', 'David', 'Kevin']*2,
'Mata Pelajaran' : ['Matematika']*5 + ['Bahasa Inggris']*5,
'Nilai UTS' : [random.choice(range(40, 100)) for i in range(10)],
'Nilai UAS' : [random.choice(range(40, 100)) for i in range(10)]
}
df_siswa = pd.DataFrame(data_siswa)
df_siswa

ilmudatapy.com
64
Sekarang kita akan membuat pivot_table dari dataframe df_siswa di atas.

# Pivoting dengan values 'Nilai UTS' dan 'Nilai UAS'

pivot_siswa = df_siswa.pivot_table(index='Nama Siswa',


columns='Mata Pelajaran',
values=['Nilai UTS', 'Nilai UAS'])
pivot_siswa

Terlihat dari output yang dihasilkan tidak ada nilai yang di-aggregate. Semua nilainya ditampilkan sesuai dengan
dataframe aslinya hanya saja dalam bentuk yang berbeda.

Kita juga dapat menampilkan data hanya untuk satu values, misalnya Nilai UTS.

# Pivoting dengan values hanya 'Nilai UTS'

pivot_siswa2 = df_siswa.pivot_table(index='Nama Siswa',


columns='Mata Pelajaran',
values=['Nilai UTS'])
pivot_siswa2

ilmudatapy.com
65
Nah, lalu bagaimana jika kita ingin meng-aggregate selain menggunakan mean yang merupakan default-nya?

Misalnya kita ingin membuat pivot_table dari dataframe di bawah ini dengan aggregate penjumlahan.

# Membuat dataframe

data_kehadiran = {'Ujian': ['UTS', 'UAS']*4,


'Mata Kuliah': ['Algoritma', 'Algoritma', 'Kalkulus', 'Kalkulus',
'Kalkulus', 'Algoritma', 'Algoritma', 'Kalkulus'],
'Jumlah': [22, 19, 18, 20, 18, 16, 20, 21]}

df_kehadiran = pd.DataFrame(data_kehadiran)
df_kehadiran

Untuk menjumlahkan nilai dengan kolom Ujian dan Mata Kuliah yang sama, kita dapat memberikan
paramter aggfunc = 'sum'.

# Pivoting dengan aggregate 'sum'

pivot_kehadiran = df_kehadiran.pivot_table(index='Ujian',
columns='Mata Kuliah',
values='Jumlah',
aggfunc='sum')
pivot_kehadiran

Melting dataframe di Python


Untuk melakukan melting data, kita dapat menggunakan function melt() yang ada di Python.

Misalnya kita memiliki data dalam bentuk melebar seperti di bawah ini dan kita ingin membuatnya memanjang
ke bawah.

ilmudatapy.com
66
# Membuat dataframe

import pandas as pd

data_class = {
'Gender' : ['Male', 'Female'],
'Classroom 1' : [21, 24],
'Classroom 2' : [23, 18],
'Classroom 3' : [26, 22],
'Classroom 4' : [19, 25]
}
df_class = pd.DataFrame(data_class).set_index('Gender')
df_class

Sekarang kita terapkan function melt() seperti di bawah ini. Parameter yang dapat digunakan di antaranya:

 id_vars : kolom yang ingin dijadikan sebagai id


 value_vars : kolom yang ingin di-melting
 var_name : nama kolom untuk kolom hasil melting
 value_name : nama kolom untuk kolom values atau nilai

# Melting df_class

df_class = df_class.reset_index()
melt_class = pd.melt(df_class, id_vars=['Gender'],
value_vars=['Classroom 1', 'Classroom 2', 'Classroom 3',
'Classroom 4'],
var_name='Classroom',
value_name='Number of Students')
melt_class

Nah, sekarang bentuk dataframenya sudah berubah memanjang.

ilmudatapy.com
67
Grouping

Grouping adalah proses mengelompokkan data pada dataframe berdasarkan kolom atau fitur tertentu dengan
agregasi tertentu, misalnya mean, sum, std, dan sebagainya.

Proses yang terjadi dalam grouping secara berurutan adalah splitting, applying, dan combining.

 Splitting : Memisahkan data ke dalam suatu group berdasarkan kolom tertentu


 Applying : Melakukan suatu operasi terhadap sekumpulan data di group-group tersebut
 Combining : Menggabungkan data menjadi suatu struktur baru

Di Python, kita dapat menggunakan function groupby() untuk melakukan grouping data. Sebelumnya mari kita
load datasetnya terlebih dahulu.

Load dataset
Dataset yang akan digunakan disini adalah dataset Video Games Sales.

import pandas as pd

df = pd.read_csv("datasets/video-game-sales.csv")
df.head()

Grouping berdasarkan satu kolom tertentu


Yang pertama, mari kita coba lakukan grouping data berdasarkan satu kolom. Kita dapat menampilkan seluruh
kolom atau beberapa kolom tertentu saja.

ilmudatapy.com
68
Grouping semua kolom berdasarkan satu kolom tertentu
Misalnya kita akan melakukan grouping untuk semua kolom berdasarkan kolom Genre dengan agregasi mean.

# Grouping semua kolom berdasarkan kolom Genre dengan agregasi mean

df.groupby('Genre').mean()

Kode di atas menghasilkan output berupa dataframe yang sudah dikelompokkan berdasarkan kolom Genre
dengan nilai pada masing-masing cell adalah mean dari tiap genre untuk tiap kolom. Perhatikan bahwa hanya
kolom numerik yang ditampilkan karena agregasi mean hanya bisa diaplikasikan untuk kolom numerik.

Grouping beberapa kolom berdasarkan satu kolom tertentu


Kita juga dapat memilih kolom-kolom tertentu yang ingin ditampilkan, misalnya dalam contoh ini kita hanya
ingin menampilkan kolom NA_Sales, EU_Sales, JP_Sales, Other_Sales, Global_Sales. Perhatikan
penulisan kodenya di bawah ini.

# Grouping beberapa kolom berdasarkan Genre dengan agregasi mean

df.groupby('Genre')[['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales',


'Global_Sales']].mean()

ilmudatapy.com
69
Sekarang mari kita coba grouping berdasarkan kolom Year dengan kriteria max() atau nilai maksimum.

# Grouping beberapa kolom berdasarkan Year dengan agregasi max

df.groupby('Year')[['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales',


'Global_Sales']].max()

Note: Output yang ditampilkan di atas terpotong. Silahkan jalankan file versi IPYNB-nya untuk melihat output secara keseluruhan.

Grouping berdasarkan dua kolom tertentu


Kita juga dapat melakukan grouping berdasarkan dua kolom atau lebih seperti kode di bawah ini.

# Grouping berdasarkan kolom Year dan Genre

df.groupby(['Year', 'Genre'])[['NA_Sales', 'EU_Sales', 'JP_Sales']].mean()

ilmudatapy.com
70
Grouping dengan beberapa agregasi
Jika kita ingin mengelompokkan data dengan beberapa agregasi, misalnya mean, median, max, dan sebagainya,
kita dapat menggunakan function agg() yang diisi dengan list agregasinya sebagai parameter.

Grouping semua kolom dengan beberapa agregasi


Misalnya kita ingin melakukan grouping pada semua kolom berdasarkan kolom Genre dengan agregasi mean
dan median.

# Grouping dengan agregasi mean dan median

df.groupby('Genre').agg(['mean', 'median'])

Grouping beberapa kolom dengan beberapa agregasi


Jika hanya ingin menampilkan beberapa kolom saja dengan beberapa agregasi, kita dapat melakukannya seperti
contoh di bawah ini.

# Grouping beberapa kolom dengan kriteria max dan min

df.groupby('Genre')[['NA_Sales','EU_Sales','JP_Sales','Global_Sales']].agg(['max', 'min'])

ilmudatapy.com
71
Grouping dengan agregasi yang berbeda untuk kolom tertentu
Kita juga dapat menentukan agregasi yang berbeda untuk tiap kolom dalam proses grouping. Contoh di bawah
ini misalnya kita ingin melakukan grouping berdasarkan Genre dan agregasi untuk kolom NA_Sales adalah nilai
maksimum atau max, Global_Sales adalah nilai rata-ratanya atau mean, dan Year nilai minimumnya atau
min.
# Grouping dengan agregasi yang berbeda untuk tiap kolom

df.groupby('Genre').agg({'NA_Sales':'max', 'Global_Sales':'mean', 'Year':'min'})

Grouping dengan custom function


Selain menggunakan function yang sudah tersedia di Python, kita juga dapat membuat function sendiri untuk
menentukan kriteria pengelompokkan data menggunakan def. Perhatikan kode berikut.

# Grouping dengan custom function

def selisih_max_min(x):
return x.max() - x.min()

df.groupby('Genre').agg({'Global_Sales': selisih_max_min, 'NA_Sales': 'std'})

ilmudatapy.com
72
Joining

Joining atau menggabungkan data adalah proses menggabungkan dataframe berdasarkan kolom tertentu yang
menjadi acuan, misalnya ID. Joining data merupakan salah satu hal penting yang harus dikuasai oleh seseorang
yang bergelut dengan data karena data yang digunakan bisa jadi berasal dari beberapa sumber dan harus
digabungkan untuk menganalisisnya.

Ada beberapa logika penggabungan data, di antaranya:

1. Full Outer Join


2. Inner Join
3. Left Join
4. Right Join

Di Python, ada beberapa function yang dapat digunakan untuk joining data, di antaranya concat(), merge(),
dan join().

Dataset
Dataset yang akan digunakan kali ini adalah dataset NYC Baby Names dan NYC Most Popular Baby Names.

import pandas as pd

df_names1 = pd.read_csv('datasets/NYC-Baby-Names.csv')
df_names2 = pd.read_csv('datasets/NYC-Most-Popular-Baby-Names.csv')

df_names1.head()

ilmudatapy.com
73
df_names2.tail()

Mari kita cek dimensi dari kedua dataset tersebut menggunakan shape.

print('Dimensi data "NYC-Baby-Names.csv" :')


print(df_names1.shape)

print('Dimensi data "NYC-Most-Popular-Baby-Names.csv" :')


print(df_names2.shape)

Dari output di atas, df_names1 memiliki jumlah baris data sebanyak 22035, sedangkan df_names2 memiliki
jumlah baris data sebanyak 29464. Terlihat bahwa dataframe df_names2 memiliki jumlah yang lebih banyak
dibandingkan df_names1.

Fungsi concat()
Yang pertama akan kita praktekkan yaitu penggabungan data menggunakan concat().

Fungsi ini dapat digunakan untuk menggabungkan data berdasarkan sumbu tertentu, yaitu indeks (baris) atau
kolom, dari dua dataframe atau lebih. Kita hanya perlu memberikan parameter axis yang nilainya antara 0 dan 1.
axis = 0 untuk menggabungkan indeks/baris dan axis = 1 untuk menggabungkan kolom. Default-nya
adalah 0.

Menggabungkan baris
Mari kita praktekkan penggabungan baris dari dataframe df_names1 dan df_names2. Pada contoh ini, saya
tidak memberikan nilai untuk parameter axis karena kita akan menggabungkan baris sehingga tanpa
memberikan parameter tersebut, Python akan otomatis menggabungkan data secara vertikal karena default-nya
adalah penggabungan baris.

Perhatikan kode berikut.

ilmudatapy.com
74
# Menggabungkan df_names1 dan df_names2

df_names = pd.concat([df_names1, df_names2])


df_names.head()

Kita dapat menuliskan kode penggabungan dataframe dengan concat() dengan langsung memasukkan nama
dataframe yang akan digabungkan di dalam tanda kurung () dengan format list atau didalam kurung siku [].

Sekarang mari kita periksa dimensi setelah penggabungan baris tersebut.

# Memeriksa dimensi setelah penggabungan

print('Dimensi data setelah penggabungan :')


print(df_names.shape)

Terlihat bahwa saat ini dimensi dari dataframe baru df_names yang merupakan gabungan dari df_names1 dan
df_names2 adalah (51499, 6) yang berarti memiliki 51499 baris dan 6 kolom.

Sekarang mari kita cek data terakhir dari dataframe df_names.

df_names.tail()

Jika kita lihat dari output di atas, data terakhir dari dataframe df_names masih memiliki indeks 29463 yang
merupakan indeks terakhir dari dataframe df_names2. Penggabungan data dengan concat() akan menumpuk
dataframe berdasarkan urutan yang kita tulis. Kode penggabungan yang kita buat, pd.concat([df_names1,
df_names2]) akan menghasilkan dataframe baru dengan df_names1 berada di atas, kemudian df_names2
berada di bawahnya.

Agar indeks dari gabungan dataframe tersebut terurut, kita dapat menambahkan parameter ignore_index
yang diberikan nilai True untuk mengabaikan indeks dari dua dataframe tersebut dan otomatis membuat indeks
baru yang terurut dari awal sampai akhir.

ilmudatapy.com
75
# Menggabungkan df_names1 dan df_names2 dengan ignore_index

df_reindex = pd.concat([df_names1, df_names2], ignore_index=True)


df_reindex.tail()

Kita juga dapat memberikan parameter keys untuk menandakan dataframe. Misalnya pada contoh berikut, kita
akan menggabungkan dataframe dengan memberikan tanda x untuk df_names1 dan y untuk df_names2.

# Menggabungkan df_names1 dan df_names2 dengan keys

df_keys = pd.concat([df_names1, df_names2], keys=['x', 'y'])


df_keys

Kita dapat melihat data dari dataframe yang telah digabung berdasarkan keys-nya menggunakan loc seperti di
bawah ini.

df_keys.loc['y'].head(10) # Melihat data dengan keys=y

ilmudatapy.com
76
Menggabungkan kolom
Selanjutnya kita coba praktekkan penggabungan kolom menggunakan concat(). Untuk menggabungkan kolom,
kita harus mendefinisikan parameter axis = 1. Perhatikan kode berikut.

# Menggabungkan kolom df_names1 dan df_names2

df_names_col = pd.concat([df_names1, df_names2], axis=1)


df_names_col.head()

Seperti yang dapat kita lihat dari output di atas, penggunaan parameter axis = 1 menggabungkan dataframe
secara horizontal atau ke samping.

Sekarang mari kita cek dimensinya.


# Memeriksa dimensi setelah penggabungan

print('Dimensi data setelah penggabungan :')


print(df_names_col.shape)

Karena dataframe memiliki jumlah baris yang berbeda, maka otomatis dimensi setelah penggabungan kolom
akan mengikuti dataframe dengan jumlah baris terbanyak, dalam hal ini yaitu 29464 baris data dari df_names2.

Sekarang mari kita cek data terakhir dari df_names_col.

df_names_col.tail()

Dapat kita lihat bahwa pada 6 kolom pertama dari dataframe df_names_col berisi NaN atau missing values
karena 6 kolom tersebut merupakan df_names1 yang hanya memiliki 22035 baris data, sehingga sisanya diisi
oleh NaN.

ilmudatapy.com
77
Fungsi merge()
Function selanjutnya yang dapat digunakan untuk menggabungkan dataframe adalah merge(). Seperti yang
telah disebutkan sebelumnya, ada beberapa logika penggabungan data, di antaranya Full Outer Join, Inner Join,
Left Join, dan Right Join. Pada bagian ini, kita akan coba mempraktekkan cara penggabungan tersebut.

Agar dapat lebih mudah dipahami, saya membuat dataframe baru dengan jumlah data yang sedikit agar terlihat
perbedaannya.

# Membuat 2 dataframe

data1 = {'id': [1, 2, 3, 4, 5],


'IPA': ['Matematika', 'Statistika', 'Fisika', 'Kimia', 'Biologi']}

data2 = {'id': [1, 3, 4, 6, 7],


'IPS': ['Ekonomi', 'Sejarah', 'Sosiologi', 'Bahasa Indonesia', 'Geografi']}

df_1 = pd.DataFrame(data1)
df_2 = pd.DataFrame(data2)

Setelah itu, mari kita lihat dataframe df_1 dan df_2.

df_1

df_2

Selanjutnya mari kita praktekkan logika penggabungan data satu per satu.

Full Outer Join


Yang pertama adalah full outer join. Metode ini akan menggabungkan indeks baris dari setiap data berdasarkan
kolom tertentu. Misalnya kita akan melakukan full outer join pada kolom id menggunakan merge().

Kita dapat memberikan parameter on = 'id' untuk mendefinisikan bahwa kita ingin menggabungkan data
berdasarkan kolom id sebagai variabel identifier. Kemudian parameter how = 'outer' akan mendefinisikan
bahwa gabungan akan dilakukan dengan metode full outer join. Perhatikan kode berikut.

ilmudatapy.com
78
# Menggabungkan data dengan metode full outer join

df_outer_join = pd.merge(df_1, df_2, on='id', how='outer')


df_outer_join

Full outer join akan mengeluarkan seluruh baris data dengan indeks unik dan memberikan nilai NaN pada kolom
yang di dataframe asalnya tidak memiliki id tersebut.

Inner Join
Metode inner join akan menggabungkan data berdasarkan kolom tertentu yang memiliki nilai beririsan. Untuk
menerapkan penggabungan dengan inner join, kita dapat memberikan parameter how = 'inner'.

# Menggabungkan data dengan metode inner join

df_inner_join = pd.merge(df_1, df_2, on='id', how='inner')


df_inner_join

Dataframe df_1 dan df_2 sama-sama memiliki data dengan id 1, 3, dan 4, sehingga hanya data dengan id
tersebut sajalah yang terambil.

Left Join
Left join akan menghasilkan gabungan data berupa seluruh dari kiri atau dataframe yang pertama didefinisikan
dan data kanan yang memiliki nilai id yang sama dengan data kiri.

ilmudatapy.com
79
# Menggabungkan data dengan metode left join

df_left_join = pd.merge(df_1, df_2, on='id', how='left')


df_left_join

Perhatikan bahwa seluruh nilai id dari dataframe df_1 ditampilkan, sedangkan tidak ada data dari df_2 dengan
nilai id yang tidak sama dengan nilai id pada df_1.

Right Join
Metode right join adalah kebalikan dari left join. Right join akan menghasilkan gabungan data berupa seluruh
dari kanan atau dataframe yang terakhir didefinisikan dan data kiri yang memiliki nilai id yang sama dengan
data kanan.
# Menggabungkan data dengan metode right join

df_right_join = pd.merge(df_1, df_2, on='id', how='right')


df_right_join

Perhatikan bahwa seluruh nilai id dari dataframe df_2 ditampilkan, sedangkan tidak ada data dari df_1 dengan
nilai id yang tidak sama dengan nilai id pada df_2.

Menggabungkan data dengan nama kolom 'key' yang berbeda


Bagaimana jika nama kolom yang dijadikan referensi memiliki nama yang berbeda?

Misalnya kita buat dahulu 2 dataframe dengan nama kolom 'key' yang berbeda. Disini kolom id yang akan
digunakan sebagai 'key' saya ganti menjadi id_IPA dan id_IPS.

ilmudatapy.com
80
# Membuat 2 dataframe dengan nama kolom id yang berbeda

data1 = {'id_IPA': [1, 2, 3, 4, 5],


'IPA': ['Matematika', 'Statistika', 'Fisika', 'Kimia', 'Biologi']}

data2 = {'id_IPS': [1, 3, 4, 6, 7],


'IPS': ['Ekonomi', 'Sejarah', 'Sosiologi', 'Bahasa Indonesia', 'Geografi']}

df_1 = pd.DataFrame(data1)
df_2 = pd.DataFrame(data2)

Untuk menggabungkan data dengan nama kolom 'key' yang berbeda, dapat kita definisikan dengan parameter
left_on dan right_on. Coba perhatikan kode berikut untuk cara penggunaannya.

# Menggabungkan data yang memiliki kolom 'key' yang berbeda

df_different_label = pd.merge(df_1, df_2, how='inner',


left_on=['id_IPA'],
right_on=['id_IPS'])
df_different_label

Fungsi join()
Fungsi join() memiliki cara penulisan yang berbeda dengan concat() dan merge(). Mari kita bahas cara
menggabungkan data dengan join().

Penggabungan dataframe dengan join()


Coba perhatikan kode di bawah ini. Kita membuat dataframe dengan nama kolom 'key' yang sama, yaitu id.
Selanjutnya kita gabungkan dengan join().
# Menggabungkan data yang memiliki kolom 'key' yang berbeda

data1 = {'id': [1, 2, 3, 4, 5],


'IPA': ['Matematika', 'Statistika', 'Fisika', 'Kimia', 'Biologi']}

data2 = {'id': [1, 3, 4, 6, 7],


'IPS': ['Ekonomi', 'Sejarah', 'Sosiologi', 'Bahasa Indonesia', 'Geografi']}

df_1 = pd.DataFrame(data1)
df_2 = pd.DataFrame(data2)

# Menggabungkan data dengan join()

df_join = df_1.join(df_2, lsuffix='_1', rsuffix='_2')


df_join

ilmudatapy.com
81
Untuk nama kolom 'key' yang sama, kita diharuskan memberikan parameter lsuffix dan rsuffix. Jika tidak,
maka akan terjadi error.

Namun, jika nama kolom 'key'-nya memang sudah berbeda, kita tidak perlu menambahkannya seperti pada
contoh berikut.

# Menggabungkan data yang memiliki kolom 'key' yang berbeda

data1 = {'id_A': [1, 2, 3, 4, 5],


'IPA': ['Matematika', 'Statistika', 'Fisika', 'Kimia', 'Biologi']}

data2 = {'id_S': [1, 3, 4, 6, 7],


'IPS': ['Ekonomi', 'Sejarah', 'Sosiologi', 'Bahasa Indonesia', 'Geografi']}

df_1 = pd.DataFrame(data1)
df_2 = pd.DataFrame(data2)

# Menggabungkan data dengan join()

df_join = df_1.join(df_2)
df_join

Menggabungkan banyak dataframe


Kita dapat menggabungkan banyak dataframe dengan nama kolom 'key' yang sama dengan menjadikan kolom
'key' tersebut sebagai indeks. Misalnya kita memiliki 4 dataframe sebagai berikut.

ilmudatapy.com
82
# Menggabungkan data yang memiliki kolom 'key' yang berbeda

data1 = {'id': [1, 2, 3, 4, 5],


'fitur_1': ['Matematika', 'Statistika', 'Fisika', 'Kimia', 'Biologi']}

data2 = {'id': [1, 3, 4, 6, 7],


'fitur_2': ['Ekonomi', 'Sejarah', 'Sosiologi', 'Bahasa Indonesia', 'Geografi']}

data3 = {'id': [1, 2, 3, 4, 5],


'fitur_3': [20, 26, 31, 29, 30]}

data4 = {'id': [1, 3, 4, 6, 7],


'fitur_4': [32, 29, 23, 27, 22]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.DataFrame(data3)
df4 = pd.DataFrame(data4)

Selanjutnya kita harus menjadikan kolom id pada 4 dataframe tersebut sebagai indeks.

# Menjadikan kolom id sebagai indeks

df1 = df1.set_index('id')
df2 = df2.set_index('id')
df3 = df3.set_index('id')
df4 = df4.set_index('id')

Untuk menggabungkannya, kita dapat melakukannya seperti kode berikut.

# Menggabungkan banyak dataframe

df_join = df1.join([df2, df3, df4])


df_join

Dataframe df1 digunakan sebagai acuan, sehingga yang tertampil hanya data dengan id yang ada pada df1.

Jika ingin menampilkan seluruh data id yang ada, kita dapat menambahkan parameter how = 'outer' yang
menandakan bahwa kita ingin penggabungan data tersebut menggunakan metode full outer join.

ilmudatapy.com
83
# Menggabungkan banyak dataframe dengan metode full outer join

df_join = df2.join([df1, df3, df4], how='outer')


df_join

Begitu juga jika kita ingin menggunakan metode inner join.

# Menggabungkan banyak dataframe dengan metode inner join

df_join = df2.join([df1, df3, df4], how='inner')


df_join

ilmudatapy.com
84

Anda mungkin juga menyukai