Data Visualization with Python Matplotlib — Part 1
Halo guys!!! Kali ini aku akan berbagi materi tentang data visualization dengan Python menggunakan Matplotlib . Yuk simak materinya!!!
Pengenalan Matplotlib dan Persiapan Dataset
Dalam menganalisa data, sering kali menggunakan visualisasi data untuk memahami karakteristik maupun trend di dalam data yang dimiliki. Salah satu library di python yang biasa digunakan untuk keperluan visualisasi data adalah matplotlib. Dalam modul ini, akan dijelaskan beberapa hal yang dapat dilakukan dengan matplotlib. Di antaranya:
- Pengolahan dataset (menggunakan library NumPy & Pandas).
- Membuat grafik dasar menggunakan matplotlib.
- Melakukan modifikasi komponen visualisasi, seperti axis, labels, title, dan legend.
- Menyimpan plot visualisasi yang sudah dibuat.
Pengenalan Dataset
Data yang akan kita pakai untuk praktek ini adalah data transaksi sebuah supermarket sepanjang tahun 2019. Sekarang kita mulai dengan mengimport datanya terlebih dahulu (https://storage.googleapis.com/dqlab-dataset/retail_raw_reduced.csv).
dengan output
Di sini terlihat bahwa kita punya 5000 barisdata, dan terdiri dari 9 kolom dengan penjelasan tiap kolom-nya adalah sebagai berikut:
- order_id : ID dari order/transaksi, 1 transaksi bisa terdiri dari beberapa produk, tetapi hanya dilakukan oleh 1 customer
- order_date : tanggal terjadinya transaksi
- customer_id : ID dari pembeli, bisa jadi dalam satu hari, 1 customer melakukan transaksi beberapa kali
- city : kota tempat toko terjadinya transaksi
- province : provinsi (berdasarkan city)
- product_id : ID dari suatu product yang dibeli
- brand : brand/merk dari product. Suatu product yang sama pasti memiliki brand yang sama
- quantity : Kuantitas / banyaknya product yang dibeli
- item_price : Harga dari 1 product (dalam Rupiah). Suatu product yang sama, bisa jadi memiliki harga yang berbeda saat dibeli
Jika penjelasan data barusan sudah dapat dicerna, saya akan menampilkan Gross Merchandise Value atau total uang yang dibayarkan customer.
Penambahan Kolom Order Month pada Dataset
Emangnya di data kita tadi ada info GMV ya? Gimana mau bikin grafik kalau kolomnya tidak ada?
Makanya, sebelum membuat grafiknya, kita pastikan dulu bahwa datanya sudah siap. Kita bisa memanfaatkan library pandas dan numpy untuk mengolah data.
Untuk membuat grafik GMV bulanan, bayangan kita tentu adalah sebuah line chart dengan sumbu-x berupa bulan, dan sumbu-y adalah total GMV di bulan tersebut.
Didalam dataset yang sudah disediakan tadi, belum terdapat kolom bulan, yang ada hanyalah kolom order_date. Maka dari itu saya akan menambahkan kolom baru yang diberi nama order_month.
Ada beberapa function yang berperan di sini:
- apply & lambda biasa digunakan untuk membuat kolom baru, berdasarkan suatu kolom lain yang sudah ada (misal
.apply(lambda x: x*2)
berarti setiap input x di dalam kolom, akan diubah menjadi x*2). Dalam hal ini kolom yang sudah ada adalahdataset[‘order_date’]
, lalu tiap nilai di dalamnya kita proses agar menjadi month-nya saja - Function
datetime.datetime.strptime
digunakan untuk mengubah date/time dalam bentuk string menjadi tipe data datetime - Function
strftime
digunakan untuk mengubah format suatu data bertime datetime, dalam hal ini diubah menjadi ‘%Y-%m’, yang berarti outputnya adalah waktu dengan bentuk YYYY-MM atau tahun dan bulan saja, tanggalnya sudah tidak ada
Jika dijalankan akan menghasilkan output
Penambahan Kolom GMV pada Dataset
Selanjutnya, bagaimana dengan GMV? Definisikan GMV adalah perkalian setiap entri di kolom item_price dan kolom quantity. Bisa saja menggunakan fungsi apply & lambda seperti tadi, tetapi ada cara yang lebih mudah yaitu dengan mengalikan kedua kolom yang disebutkan secara langsung.
dengan output
Sekarang isi dataframe menjadi seperti ini, sudah ada kolom order_month dan gmv.
Plot Pertama dengan Matplotlib
Membuat Data Agregat
Kita akan mencoba menampilkan plot grafik data agar lebih nyaman dilihat secara visual. Sebelumnya kita akan membuat data agregat terlebih dahulu, perhatikan code berikut.
dengan output
Plot Pertama: Membuat Line Chart Trend Pertumbuhan GMV
Selanjutnya mari menggunakan matplotlib. Untuk menggunakan matplotlib, bisa memanggil library-nya seperti ini:
Cara standar untuk menggunakan matplotlib yaitu dengan memanggil function plt.plot
lalu definisikan nilai di sumbu-x dan sumbu-y. Dalam hal ini, definisikan kolom order_month di sumbu-x (parameter pertama), dan kolom gmv di sumbu-y (parameter kedua). Setelah selesai mendefinisikan komponen chart-nya, lalu panggil plt.show()
untuk menampilkan grafiknya.
Jika dijalankan akan menghasilkan output
Cara Alternatif: Fungsi .plot() pada pandas Dataframe
Dengan pendekatan lain, dimungkinkan juga melakukan visualisasi dengan matplotlib tanpa membuat variabel baru. Misalnya dengan code seperti ini:
Jika dijalankan akan menghasilkan output
Grafik yang dihasilkan pun serupa kan? Dengan begini, sudah bisa lihat GMV dari bulan ke bulan. Selesai deh line chart nya :)
Note:
Kita dapat menggunakan fungsiplt.plot()
dari librarymatplotlib.pyplot as plt
. Atau dengan menggunakan fungsi.plot()
langsung dari variabel dataframe, yaitu dataset pada kasus kita sebelumnya.
Dengan grafik yang sudah kita buat ini saja, sudah bisa melihat trend dan insight-nya. Untuk analisis cepat, grafik seperti ini terkadang sudah cukup.
Kustomisasi Grafik
Anatomi dari Figure
Sebelum mulai kustomisasi, ada baiknya kita pahami dulu anatomi dari sebuah Figure di maplotlib. Bisa dilihat sesuai di gambar berikut!
Ada beberapa istilah dan komponen di sebuah plot, nanti akan mempermudah mengingat function apa yang digunakan untuk memodifikasinya.
- Figure adalah keseluruhan visualisasi yang kita plot dalam 1 kali menjalankan code.
- Sedangkan satu plot (yang dibuat saat memanggil
.plot()
atau.scatter()
) disebut Axes. Sebuah Figure bisa terdiri dari beberapa Axes. - Setiap Axes biasanya memiliki sumbu-X (X-axis) dan sumbu-Y (Y-axis). Masing-masing sumbu memiliki komponen sebagai berikut:
- Axis Label: Nama dari sumbu yang ditampilkan.
- Tick: Penanda berupa titik/garis kecil yang berjajar di sumbu, sebagai referensi skala nilai.
- Tick Label: Tulisan di tiap tick yang menyatakan nilainya. - Untuk isi grafiknya sendiri, bisa berupa line (untuk line plot), atau marker (untuk scatter plot), bisa juga bentuk lain seperti bar (untuk bar plot / histogram).
- Aksesoris lain yang bisa ditambahkan, di antaranya Grid untuk mempermudah melihat tick yang sejajar, dan Text untuk memberikan informasi tambahan berbentuk teks di grafik.
Memahami komponen-komponen di atas sudah cukup untuk melakukan berbagai visualisasi dengan matplotlib. Untuk anatomi yang lebih lengkap, bisa dilihat di link berikut: https://matplotlib.org/3.1.3/gallery/showcase/anatomy.html.
Mengubah Figure Size
Kita coba dengan mengubah ukuran Figure-nya. Caranya, sebelum mulai membuat plot, kita tambahkan kode berikut sebelum melakukan plotting grafik.
Jika dijalankan akan menghasilkan output
Dalam contoh ini, ukuran Figure telah diubah agar memiliki panjang 15 inch, dan lebar 5 inch. Sehingga line chart-nya bisa memanjang ke kanan dan lebih mudah dilihat trend-nya.
Menambahkan Title and Axis Labels
Beberapa hal yang lazim dimodifikasi pada sebuah grafik adalah judul (title) dan label di sumbu-x & sumbu-y (axis labels). Untuk menambahkannya, tinggal menambah plt.title
, plt.xlabel
, dan plt.ylabel
di code sebelum plt.show()
, misalnya seperti ini:
Jika dijalankan akan menghasilkan output
Sekarang terlihat bahwa chart ini sudah memiliki judul, dan label teks di kedua sumbunya.
Kustomisasi Title and Axis Labels
Kita bisa melakukan berbagai modifikasi dengan menambahkan parameter ke dalam function-nya. Misalnya, untuk judul/title, parameter yang bisa ditambahkan:
- loc: digunakan untuk menentukan posisi title, misalnya ‘left’ untuk membuat rata kiri, ‘right’ untuk rata kanan, dan ‘center’ untuk meletakkannya di tengah. Jika tidak didefinisikan, maka defaultnya title ada di tengah.
- pad: digunakan untuk menambahkan jarak antara judul ke grafik (dalam satuan px), misalnya kita tidak ingin judulnya terlalu menempel dengan grafiknya, jadi kita beri jarak.
- fontsize: digunakan untuk mengganti ukuran font/huruf (dalam satuan px).
- color: digunakan untuk mengganti warna huruf judul. Kita bisa menggunakan warna dasar dengan kata seperti ‘blue’, ‘red’, ‘orange’, dsb. Bisa juga dengan hex string, misalnya ‘#42DDF5’ untuk warna biru muda.
Untuk xlabel dan ylabel, kita bisa mengganti fontsize dan color, tetapi tidak bisa mengganti loc. Mari modifikasi judul, xlabel, dan ylabel dengan parameter-parameter di atas, misalnya seperti ini:
Jika dijalankan akan menghasilkan output
Bisa dilihat bahwa judulnya sekarang menjadi lebih besar, agak berjarak ke atas, dan berwarna biru. Label di sumbu x maupun y juga menjadi lebih besar dari sebelumnya.
Kustomisasi Line dan Point
Untuk mengubah style dari garis maupun titik di chart, cukup dengan menambahkan parameter di function .plot()
. Beberapa parameter yang bisa dikustomisasi:
- color: mengubah warnanya (sama seperti di title)
- linewidth: mengubah ketebalan line/garisnya (dalam satuan px)
- linestyle: mengubah jenis dari garis. Misalnya ‘-’ atau ‘solid’ untuk garis tak terputus (seperti pada default), ‘ — ‘ atau ‘dashed’ untuk garis putus-putus, ‘:’ atau ‘dotted’ untuk garis berupa titik-titik, bisa juga ‘-.’ atau ‘dashdot’ untuk garis dan titik bergantian
- marker: mengubah tipe points/titik data di chart. Ada banyak sekali kemungkinan nilai untuk marker ini, yang biasanya digunakan yaitu ‘.’ untuk bulatan kecil/titik, ‘o’ untuk bulatan agak besar, ‘s’ untuk persegi, ‘D’ untuk diamond/wajik, dan bentuk-bentuk lain seperti ‘+’, ‘x’, ‘|’, ‘*’
Misalnya ingin ubah grafiknya menjadi seperti ini:
Jika dijalankan akan menghasilkan output
Kustomisasi Grid
Kustomisasi grid juga berguna agar nilai di masing-masing titik bisa mudah dipetakan ke sumbu-y. Caranya dengan menambahkan plt.grid()
dengan parameter yang mirip dengan line. Contohnya di sini:
Jika dijalankan akan menghasilkan output
Kustomisasi Axis Ticks
Sepertinya ada yang belum tepat. Titik-titik di sumbu y, nilainya masih aneh. 2.0, 2.5, 3.0 dsb lalu di atasnya 1e11. Kayaknya bisa dibuat lebih jelas lagi. Kita buat saja dalam bentuk miliar agar lebih mudah dipahami.
Nilai-nilai di sumbu x dan y bisa diakses melalui function
plt.xticks()
danplt.yticks()
Untuk mengubah ticks di sumbu-y menjadi milyar, bisa menambahkan code sebagai berikut:
Jika dijalankan akan menghasilkan output
Dapat dilihat bahwa plt.ticks()
yang sebelumnya, digantikan dengan nilai baru yaitu nilai awal dibagi dengan 1 milyar (1000000000).
Menentukan Batas Minimum dan Maksimum Axis Ticks
Di sini dapat dilihat bahwa nilai terkecil di sumbu-y adalah 150. Ini kadang bisa membuat orang tertipu sih, seakan-akan GMV di bulan Oktober naik menjadi hampir 3 kali lipat dari September. Untuk itu sebaiknya diset agar sumbu-y nya dimulai dari 0, cukup tambahkan plt.ylim(ymin=0)
seperti ini:
Jika dijalankan akan menghasilkan output
Untuk mengatur batas maksimum, kita tambahkan juga parameter ymax, tetapi sepertinya di sini tidak perlu. Kita juga bisa mengatur batas minimum dan maksimum sumbu-x dengan function plt.xlim
.
Menambahkan Informasi pada Plot
Ada baiknya kita menambahkan beberapa informasi di dalamnya agar pembaca mendapatkan insight dari grafik tersebut. Dilihat dari trend-nya, mulai bulan Oktober 2019, GMV kita naik drastis setelah sebelumnya stagnan di angka 200–300 milyar per bulan. Kita bisa mulai dengan menambahkan info ini di grafik. Caranya dengan menambahkan plt.text
seperti potongan kode program berikut ini:
Jika dijalankan akan menghasilkan output
Perhatikan bahwa ada beberapa parameter yang diset saat menggunakan plt.text
. Dua angka pertama itu adalah koordinat, x dan y. Saat set transform=fig.transFigure
, maka koordinatnya berkisar 0 sampai 1 (untuk x dari kanan ke kiri, dan untuk y, dari bawah ke atas).
Jika parameter transform tidak diisi, maka koordinatnya dalam satuan inch (Dalam contoh ini, dari 0–15 dari kiri ke kanan, dan 0–5 dari bawah ke atas). Seperti halnya title atau label, dimungkinkan juga untuk set warna dan ukuran huruf-nya.
Menyimpan Hasil Plot Menjadi File Image
Untuk menyimpan sebagai file gambar, kalau mau cepat, bisa tinggal di-screenshoot saja. Tapi kalau ingin hasil yang bagus, ada trik tersendiri. Kita bisa menyimpan sebagai file gambar dengan function plt.savefig()
sebelum plt.show()
, seperti ini:
Kita bisa menyimpannya ke berbagai tipe file, seringnya sih jpg, png, atau kadang pdf juga bisa. Untuk mengetahui format lengkapnya, kita bisa menggunakan code berikut:
plt.gcf().canvas.get_supported_filetypes()
dengan outputnya menunjukkan ke dalam tipe file apa saja dapat disimpan
Pengaturan Parameter untuk Menyimpan Gambar
Kita juga bisa mengatur resolusi file-nya agar hasil gambarnya lebih berkualitas. Ada berbagai parameter yang bisa diatur saat menyimpan gambar, antara lain:
- dpi: Resolusi gambar (dots per inch)
- quality: Kualitas gambar (hanya berlaku jika formatnya jpg atau jpeg), bisa diisi nilai 1 (paling buruk) hingga 95 (paling bagus)
- facecolor: Memberikan warna bagian depan figure, di luar area plot
- edgecolor: Memberikan warna pinggiran gambar
- transparent: Jika nilainya True, maka gambarnya jadi transparan (jika filenya png)
Tapi biasanya, parameter-parameter ini tidak digunakan karena grafik di file gambar bisa jadi berbeda dengan yang muncul saat menjalankan code di python. Jadi, coba disimpan dengan settingan seperti ini ya:
atau secara lengkapnya untuk kasus bahasan ini :
Yang akan menghasilkan kualitas gambar yang tersimpan sebesar 95% dari awal.
Mini Project
Buatlah sebuah line chart dengan menggunakan matplotlib yang menunjukkan jumlah pembeli harian (daily number of customers) selama bulan Desember dengan menggunakan dataset yang sama yaitu ‘https://storage.googleapis.com/dqlab-dataset/retail_raw_reduced.csv'. Beberapa spesifikasi yang harus diperhatikan:
- Ukuran figure adalah 10x5
- Sumbu-x adalah tanggal pembelian, dari tanggal 1–31 Desember 2019
- Sumbu-y adalah jumlah unique customers di tiap tanggal
- Title dan axis label harus ada, tulisan dan style-nya silakan disesuaikan sendiri
Jika dijalankan akan menghasilkan output
Script-nya adalah:
Reference:
Module DQLab : Data Visualization with Python Matplotlib — Part 1