Setelah merengkuh semua teori yang ada, kini saatnya kita praktik! Pada materi ini, kita akan
belajar penerapan data wrangling dalam sebuah proyek analisis data sederhana.
Pada contoh proyek ini, kita akan menggunakan dataset DicodingCollection. Ia merupakan
hasil modifikasi dari dataset Shopping Cart Database yang dipublikasi dalam platform kaggle.
Proses modifikasi ini bertujuan untuk memastikan dataset yang digunakan cukup
merepresentasikan semua masalah yang umum dijumpai di industri.
Sebagai permulaan, mari kita simak background story dari proyek ini.
Peringatan!
Skenario dalam materi ini hanyalah fiktif belaka. Apabila terdapat kesamaan nama tokoh,
perusahaan, ataupun produk, itu adalah kebetulan semata dan tidak ada unsur kesengajaan.
Background
Dicoding Collection atau sering disingkat DiCo merupakan sebuah perusahaan yang bergerak
di bidang fashion. Ia memproduksi berbagai item fashion dan menjualnya melalui platform
online.
Sebagai perusahaan kekinian, DiCo menyadari betapa pentingnya data bagi perkembangan
sebuah bisnis. Oleh karena itu, ia menyimpan semua history penjualan beserta informasi
terkait produk dan customers dalam sebuah database. Database ini terdiri dari empat buah
tabel, antara lain customers, orders, products, dan sales.
Tabel customers: tabel ini menyimpan berbagai informasi terkait customer, seperti
customer_id, customer_name, gender, age, home_address, zip_code, city, state, dan
country.
Tabel orders: tabel ini menyimpan berbagai informasi terkait sebuah order yang
terdiri dari order_id, customer_id, order_date, dan delivery_date.
Nah, sebagai calon praktisi data profesional, Anda akan diminta untuk menganalisis seluruh
data tersebut. So, apakah Anda siap untuk menjawab tantangan ini? Tentunya siap dong!
Tujuan
First of all, kita akan mulai proyek analisis data ini dengan menjalankan proses data
wrangling terlebih dahulu. Proses ini memiliki tujuan antara lain
Alur Latihan
Berikut merupakan tahapan dalam latihan ini.
Tahap persiapan.
Tahap gathering data.
Tahap assessing data.
Tahap cleaning data.
Persiapan
Sebelum mulai mengerjakan suatu proyek, terdapat beberapa hal yang harus disiapkan
terlebih dahulu.
1. Pertama, siapkan environment untuk menjalankan proyek ini. Pada proyek latihan ini,
Anda dapat menggunakan berbagai IDE seperti Jupyter Notebook atau Google
Colaboratory (Google Colab). Jika menjalankan latihan ini melalui Jupyter Notebook,
pastikan Anda telah menginstal seluruh library yang dibutuhkan, seperti numpy,
pandas, scipy, matplotlib, dan seaborn.
Saran
Kami sangat menyarankan Anda untuk selalu membuat virtualenv baru pada setiap
proyek. Hal ini untuk meminimalisasi masalah yang berhubungan dengan
dependency pada library yang akan digunakan.
Jika menginstal python melalui official home, Anda dapat menggunakan pip sebagai
package manager dan pipenv sebagai environment management. Berikut merupakan
tahapan dalam membuat virtual environment menggunakan pipenv.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
5. Last but not least, siapkan sebuah camilan sebagai suplai energi selama mengikuti
latihan ini.
Gathering Data
Setelah tahap persiapan selesai, kita bisa masuk ke tahap gathering data. Pada tahap ini, kita
akan mengumpulkan semua data yang dibutuhkan.
Catatan:
Pada praktik yang umum dijumpai di industri, seluruh data tersebut diperoleh dari proses
query database. Proses query ini umumnya dijalankan menggunakan perintah SQL.
Seperti yang telah kita bahas sebelumnya, pada proyek latihan ini data yang akan kita
gunakan terdiri dari 4 tabel. Oleh karena itu, pada tahap ini kita akan memuat (load)
keempat tabel tersebut.
Data pertama yang harus kita muat ialah data dari tabel customers. Berikut
merupakan kode untuk memuat tabel tersebut menjadi sebuah DataFrame.
customers_df = pd.read_csv("customers.csv")
customers_df.head()
Data selanjutnya yang harus kita muat ialah data dari tabel orders. Hal ini dapat
dilakukan dengan menjalankan kode berikut.
orders_df = pd.read_csv("orders.csv")
orders_df.head()
Selain memuat tabel orders menjadi sebuah DataFrame, kode di atas juga akan
menampilkan 5 baris pertama dari Dataframe tersebut.
Tabel berikutnya yang harus kita muat ialah tabel product. Berikut merupakan kode
yang dapat digunakan untuk membuat tabel product menjadi sebuah DataFrame
bernama product_df.
product_df = pd.read_csv("products.csv")
product_df.head()
Kode di atas juga akan menampilkan lima baris pertama dari product_df.
Last but not least, tabel terakhir yang harus kita muat ialah tabel sales. Berikut
merupakan contoh kode untuk melakukannya.
sales_df = pd.read_csv("sales.csv")
sales_df.head()
Oke, sekarang kita telah berhasil memuat semua data yang dibutuhkan. Tahap selanjutnya
ialah menilai kualitas dari data tersebut.
Assessing Data
Sekarang kita masuk ke tahap kedua dalam proses data wrangling yaitu assessing data.
Seperti yang telah kita bahas sebelumnya, pada proses ini kita akan menilai kualitas dari
seluruh data yang akan digunakan. Penilaian ini bertujuan untuk melihat berbagai
permasalahan yang ada dalam data tersebut.
Data pertama yang akan kita nilai adalah customers_df. Sebagai permulaan, kita
memeriksa tipe data data dari tiap kolom yang terdapat dalam customers_df. Proses
ini dapat dilakukan menggunakan method info() seperti contoh kode berikut.
customers_df.info()
Jika Anda perhatikan, tidak ada masalah dengan tipe data dari seluruh kolom
tersebut. Akan tetapi, terdapat sedikit perbedaan pada jumlah data pada kolom
customers_df.isna().sum()
Kode di atas akan menampilkan informasi terkait jumlah missing values yang
terdapat dalam setiap kolom seperti gambar berikut.
Nah, gambar di atas menunjukkan bahwa terdapat 18 missing values pada kolom
gender. Hal ini akan kita tangani pada tahap data cleaning nanti.
Masalah selanjutnya yang harus kita periksa ialah duplikasi data. Untuk memeriksa
hal ini, kita bisa menjalankan kode berikut.
Ketika menjalankan kode di atas, Anda akan menemukan bahwa terdapat 6 data yang
terduplikat. Pada tahap data cleaning nanti, kita akan menghilangkan semua duplikasi
tersebut.
Sekarang kita memeriksa parameter statistik dari kolom numerik yang terdapat
dalam customers_df. Untuk mempermudah pemeriksaan, kita akan menggunakan
method describe(). Method tersebut akan menampilkan ringkasan parameter
statistik (mean, median, dll.) dari kolom numerik pada sebuah DataFrame. Berikut
merupakan contoh penggunaannya.
customers_df.describe()
Oke, selanjutnya kita akan menilai data pada orders_df. Seperti biasa, kita akan mulai
dengan memeriksa tipe data dari tiap kolom menggunakan method info().
orders_df.info()
Jika Anda perhatikan, jumlah data pada orders_df telah lengkap atau dengan kata
lain tidak ada missing value di dalamnya. Akan tetapi, terdapat kesalahan tipe data
untuk kolom order_date & delivery_date. Kedua kolom tersebut harusnya
direpresentasikan sebagai tipe data datetime, bukan object (ini digunakan untuk tipe
data string).
Berikutnya, kita perlu memeriksa duplikasi dan ringkasan parameter statistik dari
kolom numerik pada orders_df. Proses ini dilakukan dengan menjalankan kode
berikut.
Jika diperhatikan, tidak ada keanehan pada hasil tersebut. Ini menunjukkan tidak
terdapat duplikasi dan keanehan nilai pada orders_df.
Selanjutnya, kita akan menilai data pada product_df. Pertama, gunakan method
info() untuk memastikan tipe data tiap kolom dalam product_df telah sesuai.
product_df.info()
Hal berikutnya yang harus diperiksa ialah duplikasi dan ringkasan parameter statistik
dari product_df. Berikut merupakan kode untuk melakukannya.
product_df.describe()
Berdasarkan gambar di atas, dapat dilihat bahwa terdapat 6 data yang terduplikasi
pada product_df. Pada tahap cleaning data, kita akan menghapus duplikasi tersebut.
Data terakhir yang harus kita nilai ialah sales_df. Sebagai permulaan, gunakan
method info() untuk memeriksa tipe data dan jumlah data yang ada di dalam
sales_df.
sales_df.info()
sales_df.isna().sum()
Kode di atas akan menunjukkan jumlah missing value dari setiap kolom dalam
sales_df. Berikut merupakan hasil yang kita peroleh.
Berdasarkan hasil di atas, dapat disimpulkan bahwa terdapat 19 missing value pada
kolom total_price. Hal ini akan kita bersihkan pada tahap cleaning data.
Tahap selanjutnya ialah memeriksa duplikasi dan ringkasan parameter statistik dari
sales_df. Berikut merupakan contoh kode untuk melakukannya.
print("Jumlah duplikasi: ", sales_df.duplicated().sum())
sales_df.describe()
Hasil keluaran dari kode di atas dapat Anda lihat di bawah ini.
Oke, sampai tahap ini, kita telah berhasil mengidentifikasi berbagai masalah pada data yang
telah kita kumpulkan. Berikut merupakan rangkumannya.
Cleaning Data
Nah, sekarang kita akan memasuki proses terakhir dalam data wrangling yaitu pembersihan
atau cleaning data. Pada tahap ini, kita akan membersihkan berbagai masalah yang telah
teridentifikasi dalam proses assessing data.
Masalah pertama yang akan kita tangani ialah duplicate data. Seperti yang
telah kita pelajari sebelumnya, ketika menemukan duplikasi pada data, kita
harus menghilangkan atau menghapus duplikasi tersebut. Nah, untuk
melakukan hal ini, kita dapat memanfaatkan method drop_duplicates().
Berikut merupakan kode untuk menghapus duplikasi pada customer_df.
customers_df.drop_duplicates(inplace=True)
Masalah berikutnya yang harus kita tangani ialah missing value pada kolom
gender. Nah, secara umum terdapat tiga metode untuk mengatasi missing
value yaitu dropping, imputation, dan interpolation. Untuk menentukan
metode mana yang akan digunakan, kita perlu melihat data yang mengandung
missing value tersebut menggunakan teknik filtering seperti berikut.
customers_df[customers_df.gender.isna()]
Kode di atas hanya akan menampilkan baris data yang memenuhi kondisi
customers_df.gender.isna() atau dengan kata lain ia akan menampilkan baris
data yang mengandung missing value pada kolom gender. Berikut merupakan
tampilan baris data tersebut.
customers_df.gender.value_counts()
Berdasarkan hasil di atas, dapat diketahui bahwa nilai yang paling dominan
dalam kolom gender ialah “Prefer not to say”. Nilai inilah yang selanjutnya akan
kita gunakan sebagai pengganti missing value. Proses penggantian ini dapat
dilakukan menggunakan method fillna() seperti contoh berikut.
customers_df.isna().sum()
Oke, sekarang kita akan mengatasi masalah inaccurate value pada kolom age.
Sebagai awal, kita perlu melihat data baris data yang mengandung inaccurate
value tersebut (baris dengan nilai age maksimum). Hal ini dilakukan
menggunakan teknik filter seperti contoh kode berikut.
customers_df[customers_df.age == customers_df.age.max()]
Kode di atas akan menampilkan baris data yang memiliki nilai age maksimum.
customers_df[customers_df.age == customers_df.age.max()]
Upsi, ternyata masih ada invalid value lain yang terdapat dalam kolom age.
customers_df.describe()
Berdasarkan hasil tersebut dapat dilihat bahwa kolom age memiliki nilai
maksimum yang cukup masuk akal. Selain itu, jika Ada perhatikan, nilai mean
dan standard deviation ikut berubah setelah kita menangani inaccurate value
tersebut.
Oke, sekarang kita telah menyelesaikan semua permasalahan yang ada pada
customers_df. Selanjutnya, kita akan mengatasi permasalahan pada orders_df.
Berdasarkan proses assessing data sebelumnya, diketahui bahwa terdapat kesalahan
tipe data untuk kolom order_date & delivery_date.
Untuk mengatasi masalah ini, kita akan mengganti tipe data pada kolom order_date
& delivery_date menjadi datetime. Proses ini dapat dilakukan menggunakan function
to_datetime() yang disediakan oleh library pandas. Berikut merupakan contoh kode
untuk melakukannya.
Kode di atas akan mengubah tipe data pada kolom order_date & delivery_date
menjadi datetime. Untuk memastikan hal ini berjalan sesuai harapan, periksa kembali
tipe data tersebut menggunakan method info().
orders_df.info()
Jika semua tahapan berjalan sesuai harapan, kode di atas akan menghasilkan
keluaran seperti berikut.
Data berikutnya yang akan kita bersihkan ialah product_df. Sesuai hasil assessing
data sebelumnya, kita mengetahui bahwa terdapat 6 data yang terduplikasi pada
product_df. Untuk mengatasi hal ini, kita perlu membuang data yang sama tersebut
menggunakan method drop_duplicates() seperti contoh berikut.
product_df.drop_duplicates(inplace=True)
Kode di atas akan menghapus semua data yang duplikat. Untuk memastikan kode
tersebut berjalan sesuai harapan, jalankanlah kode berikut.
Jika proses penghapusan data yang duplikat berjalan dengan lancar, kode di atas
akan menghasilkan keluaran seperti berikut “Jumlah duplikasi: 0”.
Data selanjutnya yang perlu Anda bersihkan ialah sales_df. Berdasarkan hasil
penilaian data sebelumnya, diketahui bahwa terdapat 19 missing value pada kolom
total_price. Untuk mengetahui proses penanganan missing value yang paling sesuai,
kita perlu melihat terlebih dahulu baris data yang mengandung missing value
tersebut.
sales_df[sales_df.total_price.isna()]
Kode di atas akan menampilkan semua baris data yang memiliki missing value pada
kolom total_price seperti pada gambar berikut.
Kode di atas akan mengatasi seluruh missing value serta memastikan nilai pada
kolom total_price telah sesuai. Untuk memastikan hal ini, Anda dapat memeriksa
kembali jumlah missing value pada sales_df menggunakan kode berikut.
sales_df.isna().sum()
Jika proses sebelumnya berjalan lancar, Anda akan menemukan hasil seperti berikut.
Pada materi selanjutnya, kita akan membahas berbagai hal terkait data understanding.
Apakah Anda sudah siap untuk menghadapi tantangan baru?