Data Visualization with Python Matplotlib for Beginner — Part 2
Hello Friend ! Kembali lagi di medium ku, kali ini aku akan melanjutkan series sebelumnya yaitu Data Visualization with Python Matplotlib for Beginner — Part 1. Tanpa kita sadari otak kita lebih menyukai gambar dan warna dari pada tulisan. Ngga percaya? Coba inget-inget lagi , waktu kecil kalo baca buku pasti kita selalu cari yang ada gambarnya. Itu merupakan salah satu bukti alami bahwa manusia adalah makhluk visual. Oleh karena itu, penting untuk mempelajari data visualization terutama untuk kamu yang ingin berkarir di dunia Data Science dan sekitarnya. Selain itu juga, jika membahas mengenai Data Visualization tidak akan ada habisnya karena materi ini memang sangat seru dan menarik untuk dibahas, makanya aku sampai membuat artikel untuk part 2 nya.
Sebenarnya ada banyak jenis visualisasi data mulai dari yang sederhana hingga rumit, dan masing-masing memiliki tujuan sesuai dengan kebutuhan. Penasaran ? Artikel kali ini akan membahas satu persatu. Untuk itu simak artikel ini sampai habis !
Mengenal Jenis-jenis Visualisasi Data dan Tujuannya
Berdasarkan gambar tersebut kita bisa melihat 4 point utama jenis visualisasi yaitu:
- Perbandingan/Komparasi
Visualisasi bisa digunkaan untuk membandingkan suatu sekumpulan nilai dengan nilai lainnya, ingin melihat mana yang lebih besar, mana yang lebih tinggi, mana yang naik, dsb. Untuk data yang terkait dengan waktu, visualisasi yang digunakan biasanya berupa line-chart. Sedangkan, untuk jenis visualisasi data yang dibandingkan adalah kategorikal, maka lebih cocok menggunakan bar-chart.
2. Distribusi
Bila ingin melihat distribusi/persebaran data di suatu variabel, jenis visualisasi distribusi dirasa paling cocok untuk diterapkan . Untuk jenis Visualisasi ini yang lazim digunakan adalah histogram. Bisa melihat apakah datanya banyak terkumpul di nilai-nilai kecil, berat di kanan, atau simetris, ataupun berdistribusi normal. Untuk melihat distribusi di dua variabel, scatterplot juga bisa digunakan.
3. Komposisi
Visualisasi juga seirng Digunakan untuk melihat komposisi dari suatu variabel, jika di-breakdown terhadap suatu dimensi data. Visualisasi yang biasa digunakan adalah stacked bar-chart untuk data kategorikal, atau stacked line-chart untuk data terkait waktu.
4. Keterhubungan/Relasi
Ketika ingin melihat keterhubungan antara suatu variabel dengan variabel lain. Misalnya ingin cek, jika variabel A semakin tinggi, apakah variabel B juga semakin tinggi, atau justru lebih rendah, atau tidak ada keterhubungannya. Visualisasi yang biasa digunakan untuk tujuan ini adalah scatter-plot.
Membuat Multi-line Chart dan Kustomisasi
Membuat Multi-Line Chart
Contoh kasus, suatu ketika Surti diminta membuat visualisasi untuk melihat peningkatan GMV agar bisa memanfaatkan data tersebut ke divisi Business Development untuk membuat strategi bisnis ke depannya. Datanya berdasarkan dimensi yah, misalnya berdasarkan brand atau province. Nanti akan terlihat bagian mana yang paling berperan dalam kenaikan GMV ini. Untuk memenuhi tugas tersebut Surti membuat source code berikut :
# Import library
import datetime
import pandas as pd
import matplotlib.pyplot as plt
# Baca dataset
dataset = pd.read_csv('https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/retail_raw_reduced.csv')
# Buat kolom baru yang bertipe datetime dalam format '%Y-%m'
dataset['order_month'] = dataset['order_date'].apply(lambda x: datetime.datetime.strptime(x, "%Y-%m-%d").strftime('%Y-%m'))
# Buat Kolom GMV
dataset['gmv'] = dataset['item_price']*dataset['quantity']# Buat Multi-Line Chart
dataset.groupby(['order_month','brand'])['gmv'].sum().unstack().plot()
plt.title('Monthly GMV Year 2019-Breakdown by Brand',loc='center',pad=30, fontsize=20, color='blue')
plt.xlabel('Order Month', fontsize=15)
plt.ylabel('Total Amount (in Billions)', fontsize=15)
plt.grid(color='darkgray',linestyle=':',linewidth=0.5)
plt.ylim(ymin=0)
labels, locations =plt.yticks()
plt.yticks(labels, (labels/1000000000).astype(int))
plt.gcf().set_size_inches(10, 5)
plt.tight_layout()
plt.show()
Kustomasi Legend dan Colormap
Dalam visualisasi data perlu menyertakan legend dan colormap yang fungsinya untuk memberikan keterangan tambahan yang menjelaskan unsur-unsur dalam grafik. Untuk itu dalam python terdapat function legend ( ) perhatikan code berikut untuk menambahkan legend pada grafik yang kamu miliki.
import matplotlib.pyplot as plt
plt.clf()
dataset.groupby(['order_month','province'])['gmv'].sum().unstack().plot(cmap='Set1')
plt.title('Monthly GMV Year 2019 - Breakdown by Province', loc='center', pad=30, fontsize=20, color='blue')
plt.xlabel('Order Month',fontsize = 15)
plt.ylabel('Total Amount (in Billions)', fontsize=15)
plt.grid(color='darkgray',linestyle=':', linewidth=0.5)
plt.ylim(ymin=0)
labels, locations =plt.yticks()
plt.yticks(labels, (labels/1000000000).astype(int))
plt.legend(loc='lower center', bbox_to_anchor=(0.5, -0.5), shadow=True, ncol=3,title='Province', fontsize=9, title_fontsize=11)
plt.gcf().set_size_inches(10,5)
plt.tight_layout()
plt.show()
Beberapa parameter yang bisa ditambahkan untuk legend:
- loc: untuk menentukan posisi legend, berikut beberapa lokasi legend yang bisa didefinisikan:
- ‘upper left’, ‘upper right’, ‘lower left’, ‘lower right’:legend diletakkan di pojok dari axes (atas kiri, atas kanan, bawah kiri, atas kiri)
- ‘upper center’, ‘lower center’, ‘center left’, ‘center right’: legend diletakkan di tepi axes (atas tengah, bawah tengah, tengah kiri, tengah kanan)
- ‘center’: legend diletakkan di tengah-tengah axes
- ‘best’: matplotlib akan memilih satu dari sekian kemungkinan lokasi legend di atas yang paling tidak overlap dengan isi grafik
- bbox_to_anchor: biasanya digunakan untuk adjust lokasi dari legend. Bisa berisi 2 angka yang menunjukkan koordinat x dan y (misal (1.6,0.5) berarti geser 1.6 ke kanan dan 0.5 ke atas). Bisa juga berisi 4 angka, angka ketiga dan keempat menyatakan width (lebar) dan height (tinggi) dari legend.
- shadow: jika diisi True, maka kotak legend akan memiliki bayangan.
- ncol: jumlah kolom dari isi legend, defaultnya adalah 1
- fontsize: ukuran huruf pada legend
- title: memberikan judul pada legend
- title_fontsize: ukuran huruf pada judul legend
Selain itu, perhatikan juga bahwa pada grafik tersebut, list warnanya berbeda, tidak default seperti pada brand. Itu karena di function plot() ditambahkan parameter cmap (yakni, color map) yang mendefinisikan sekelompok warna yang akan diberikan untuk tiap line. Di sini yang digunakan adalah ‘Set1’, yakni satu set warna yang biasa digunakan untuk warna yang diskrit.
Membuat Line Chart GMV Breakdown by Top Provinces
Berdasarkan hasil visualisasi sebelumnya terlihat bahwa kenaikan GMV disebabkan oleh provinsinya, oleh karena itu kita fokuskan pada provinsi-provinsi yang memiliki GMV besar dengan cara menghighlight top 5 provinsi saja. Untuk itu simak potongan code dibawah beserta penjelasannya.
Langkah Pertama: Kita harus membuah wadah/variabel untuk menampung 5 provinsi yang memiliki GMV tertinggi dengan code berikut
# Buat variabel untuk 5 propinsi dengan GMV tertinggi
top_provinces = (dataset.groupby('province')['gmv']
.sum()
.reset_index()
.sort_values(by='gmv', ascending=False)
.head(5))
print(top_provinces)
Langkah Kedua : Kemudian setelah kita mengetahui top 5 GMV , kita buat kolom baru semisal aku mau membuat kolom dengan nama ‘province_top’. Dengan menggunakan function apply dan lambda sebagai berikut:
# Buat satu kolom lagi di dataset dengan nama province_top
dataset['province_top'] = dataset['province'].apply(lambda x: x if(x in top_provinces['province'].to_list()) else 'other')
Langkah Ketiga: Jika sudah, kita bisa mengupdate grafik. Caranya dengna menggunakan function plt.gcf().set_size_inches yang diletakkan di akhir code, sebelum plt.show( ) sebagai berikut :
# Plot multi-line chartnya
import matplotlib.pyplot as plt
dataset.groupby(['order_month','province_top'])['gmv'].sum().unstack().plot(marker='.', cmap='plasma')
plt.title('Monthly GMV Year 2019 - Breakdown by Province', loc='center', pad=30, fontsize=20, color='blue')
plt.xlabel('Order Month',fontsize = 15)
plt.ylabel('Total Amount (in Billions)', fontsize=15)
plt.grid(color='darkgray',linestyle=':', linewidth=0.5)
plt.ylim(ymin=0)
labels, locations =plt.yticks()
plt.yticks(labels, (labels/1000000000).astype(int))
plt.legend(loc='upper center', bbox_to_anchor=(1.1, 1), shadow=True, ncol=1)
plt.gcf().set_size_inches(12,5)
plt.tight_layout()
plt.show()
Membuat Anotasi
Kita dapat membuat anotasi dengan menggunakan function plt.annotate. Dimana untuk parameter pertama adalah isi teksnya, dilanjut parameter kedua adalah koordinat dari point dianotasi.
# Anotasi pertama
plt.annotate('GMV other meningkat pesat', xy=(5, 900000000),
xytext=(4, 1700000000), weight='bold', color='red',
arrowprops=dict(arrowstyle='fancy',
connectionstyle="arc3",
color='red'))# Anotasi kedua
plt.annotate('DKI Jakarta mendominasi', xy=(3, 3350000000),
xytext=(0, 3700000000), weight='bold', color='red',
arrowprops=dict(arrowstyle='->',
connectionstyle="angle",
color='red'))
Potongan code diatas digunakan untuk menganotasi multi-line chart dari 5 provinsi dengan GMV tertinggi. dimana masing-masing memiliki fungsi sebagai berikut :
- xytext: Koordinat dari teks. Jika tidak diisi,maka teks akan diletakkan di koordinat point yang dianotasi (parameter kedua)
- arrowprops:Konfigurasi dari panah yang ditambahkan di anotasi, berupa dictionary. Beberapa hal yang bisa diset:
- arrowstyle: menentukan bentuk dari panah penunjuk. Isinya bisa berupa bentuk seperti ‘->’, ‘-|>’, ‘<->’, ‘-[‘, dsb. Bisa juga berupa tulisan seperti ‘fancy’, ‘simple’, ‘wedge’, etc.
- connectionstyle: menentukan bentuk dari garis panahnya. Ada beberapa nilai yang bisa digunakan, misalnya ‘arc’ dan ‘arc3’ yang berupa garis lurus, ‘angle’ untuk garis berbelok siku, ‘angle3’ untuk garis berbelok lengkung, atau ‘bar’ untuk berbelok siku dua kali.
- color: menentukan warna dari panah
Membuat Pie-Chart dan Bar-Chart
Selanjutnya adalah membuat pie chart. Nah, sebelum itu kita perlu membuat dataframe agregat terlebih dahulu. Perhatikan code berikut:
import matplotlib.pyplot as plt
gmv_per_city_dki_q4 = dataset_dki_q4.groupby('city')['gmv'].sum().reset_index()
plt.figure(figsize=(6,6))
plt.pie(gmv_per_city_dki_q4['gmv'], labels= gmv_per_city_dki_q4['city'],autopct='%1.2f%%')
plt.title('GMV Contribution Per City - DKI Jakarta in Q4 2019',loc='center', pad=30, fontsize=15, color='blue')
plt.show()
Berdasarkan code diatas aku membuat variabel gmv_per_city_dki_q4 sebagai wadah data apa saja yang ingin aku tampilkan. Kemudian melakukan plotting dengan fungsi plt.pie(). Adapun beberapa parameter yang bisa digunakan yaitu :
- labels: array yang berisikan label/tulisan yang ditunjukkan untuk masing-masing bagian pie.
- colors: array yang berisikan warna untuk masing-masing bagian pie.
- autopct: format untuk nilai persentasi yang ditampilkan, bisa berupa string atau function.
- shadow: jika diisi True, maka ada bayangan untuk pie chart-nya. Defaultnya adalah False.
- radius: jari-jari dari pie-chart
Setelah berhasil menciptakan sebuah pie chart, kayaknya seru deh kalo kita eksperimen membuat grafik lain, Bar Chart misalnya. Syntax untuk membuat bar chart sebenarnya mirip-mirip dengan line chart, kita perlu menentukan nilai sumbu x dan sumbu y terlebih dahulu, lalu kita tinggal menambahkan parameter kind=’bar’. Untuk lebih jelasnya silahkan kamu praktikkan code berikut di IDE atau text editor kesayangan mu.
import matplotlib.pyplot as plt
plt.clf()
dataset_dki_q4.groupby('city')['gmv'].sum().sort_values(ascending=False).plot(kind='bar', color='green')
plt.title('GMV Per City - DKI Jakarta in Q4 2019', loc='center', pad=30, fontsize=15, color='blue')
plt.xlabel('City', fontsize=15)
plt.ylabel('Total Amount (in Billions)', fontsize = 15)
plt.ylim(ymin=0)
labels, locations = plt.yticks()
plt.yticks(labels, (labels/1000000000).astype(int))
plt.xticks(rotation=0)
plt.show()
Membuat Multi-Bar Chart dan Stacked Chart
Gimana temen-temen masih semangat belajar kan ? Harus semangat dong, kalo baca doang emang bosen temen-temen. Makanya sambil baca artikel ini langsung dipraktikkan dan bisa coba eksperimen sekalian hehe, percaya deh materi visualisasi tuh seru banget. Nah, sekarang kita akan sama-sama coba membuat milti-bar chart. Perhatikan cide berikut.
import matplotlib.pyplot as plt
dataset_dki_q4.groupby(['city','order_month'])['gmv'].sum().unstack().plot(kind='bar')
plt.title('GMV Per CIty, Breakdown by Month\nDKI Jakarta in Q4 2019', loc='center', pad=30, fontsize=15, color ='blue')
plt.xlabel('Province', fontsize=12)
plt.ylabel('Total Amount (in Billions)',fontsize=12)
plt.legend(bbox_to_anchor=(1,1), shadow=True, title='Month')
plt.ylim(ymin=0)
labels, locations = plt.yticks()
plt.yticks(labels, (labels/1000000000).astype(int))
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
Oh iya, biar makin seru kita buat eksperimen lagi yuk. Untuk perbandingan dengan grafik sebelumnya, sekarang kita coba membuat Stacked Chart. Untuk codenya perhatikan dibawah ini ya.
import matplotlib.pyplot as plt
dataset_dki_q4.groupby(['order_month','city'])['gmv'].sum().sort_values(ascending=False).unstack().plot(kind='bar', stacked=True)
plt.title('GMV Per Month, Breakdown by City\nDKI Jakarta in Q4 2019', loc='center', pad=30, fontsize=15, color ='blue')
plt.xlabel('Order Month', fontsize=12)
plt.ylabel('Total Amount (in Billions)',fontsize=12)
plt.legend(bbox_to_anchor=(1,1), shadow=True, ncol=1, title='City')
plt.ylim(ymin=0)
labels, locations = plt.yticks()
plt.yticks(labels, (labels/1000000000).astype(int))
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
Membuat Histogram dan Scatterplot
Membuat Agregat Data Cusotmer
Pertama-tama kita perlu membuat agregate data customer terlebih dahulu untuk melihat pola menarik dari data. Dalam hal ini data customer di DKI Jakarta Q4 2019.
data_per_customer = (dataset_dki_q4.groupby('customer_id')
.agg({'order_id':'nunique',
'quantity': 'sum',
'gmv':'sum'})
.reset_index()
.rename(columns={'order_id':'orders'}))
print(data_per_customer.sort_values(by='orders',ascending=False))
Membuat Histogram
Dalam membuat histogram dapun function plt.hist yang dimasukkan ke variabel, lalu ada beberapa parameter yang dapat kita tambahkan untuk itu perhatikan code berikut untuk membuat histogram yang pertama:
import matplotlib.pyplot as plt
plt.clf()
# Histogram pertama
plt.figure()
plt.hist(data_per_customer['orders'])
plt.show()
- bins: jumlah bin (kelompok nilai) yang diinginkan
- range: nilai minimum dan maksimum yang ditampilkan
- orientation: ‘horizontal’ atau ‘vertikal’
- color: warna bar di histogram
Mari kita coba membuat histogram yang kedua. Untuk code nya sebagai berikut:
# Histogram kedua
plt.figure()
plt.hist(data_per_customer['orders'], range=(1,5))
plt.title('Distribution of Number of Orders per Customer\nDKI Jakarta in Q4 2019',fontsize=15, color='blue')
plt.xlabel('Number of Orders', fontsize = 12)
plt.ylabel('Number of Customers', fontsize = 12)
plt.show()
Nah, kita juga bisa membuat histogram untuk quantity juga.
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.hist(data_per_customer['quantity'], bins=100, range=(1,200), color='brown')
plt.title('Distribution of Total Quantity per Customer\nDKI Jakarta in Q4 2019', fontsize=15, color='blue')
plt.xlabel('Quantity', fontsize=12)
plt.ylabel('Number of Customers', fontsize=12)
plt.xlim(xmin=0, xmax=200)
plt.show()
Akan tetapi, untuk membuat grafik GMV berbeda. Kita perlu melakukan normalisasi ticks label di sumbu-x karena angka yang menunjukkan GMV bisa jadi terlalu panjang. Untuk lebih jelasnya berikut code nya:
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.hist(data_per_customer['gmv'], bins=100, range=(1,200000000), color='green')
plt.title('Distribution of Total GMV per Customer\nDKI Jakarta in Q4 2019', fontsize=15, color='blue')
plt.xlabel('GMV (in Millions)', fontsize = 12)
plt.ylabel('Number of Customers', fontsize =12)
plt.xlim(xmin=0, xmax=200000000)
labels, locations = plt.xticks()
plt.xticks(labels, (labels/1000000).astype(int))
plt.show()
Membuat Scatter Plot
Untuk membuat scatter plot kita perlu menggunakan function plt.scatter dengan membuat variabel-variabel yang akan dibuat sctter plot. Sebagai contoh perhatikan code berikut:
import matplotlib.pyplot as plt
plt.clf()
# Scatterplot pertama
plt.figure()
plt.scatter(data_per_customer['quantity'], data_per_customer['gmv'])
plt.show()
# Scatterplot kedua: perbaikan scatterplot pertama
plt.figure(figsize=(10,8))
plt.scatter(data_per_customer['quantity'], data_per_customer['gmv'], marker='+',color='red')
plt.title('Correlation of Quantity and GMV per Customer\nDKI Jakarta in Q4 2019', fontsize=15, color='blue')
plt.xlabel('Quantity',fontsize=12)
plt.ylabel('GMV (in Millions)', fontsize=12)
plt.xlim(xmin=0, xmax=300)
plt.ylim(ymin=0, ymax=150000000)
labels, locations =plt.yticks()
plt.yticks(labels,(labels/1000000).astype(int))
plt.show()
Kesimpulan
Yeay. Akhirnya kita berhasil menyelesaikan modul Data Visualization with Pyhton Matplotlib for Beginner — Part 2. Tanpa kita sadari, kita sudah mempelajari dan mempraktikkan beberapa hal berikut :
- Mengetahui jenis-jenis visualisasi data beserta tujuannya
- Membuat multi line-chart
- Membuat pie chart atau multi bar chart
- Membuat grafik distribusi suatu data dengan menggunakan histogram
- Membuat scatter plot yang dikustomisasi secara langsung untuk menampilkan hasil visualisasi yang menarik dan memberikan insight kepada pembaca.
Terima kasih telah membaca artikel ini sampai selesai, semoga sedikitnya dapat bermanfaat. Kalian juga dapat bereksperimen sendiri dengan mencoba berbagai macam grafik yang disediakan di library matplotlib. Atau kalian bisa belajar melalui DQLab, karena disana banyak tersedia mini project di setiap materi pembelajaran. Jangan lupa pantengin terus akun medium ku, karena aku bakal update materi selanjutnya yang semakin menarik.