Data Visualization with Python Matplotlib for Beginner — Part 2
Halo, semuanya. Kali ini saya membahas modul Data Visualization with Python Matplotlib for Beginner — Part 2 yang saya pelajari di DQLab. Data bagian kedua ini menggunakan data pada bagian pertama dan berkaitan dengan bagian pertama. Bagian pertama dari modul tersebut dapat dibaca di sini.
Jenis-Jenis Visualisasi Data dan Tujuannya
1. Perbandingan/Komparasi
Jika ingin membandingkan suatu sekumpulan nilai dengan nilai lainnya, ingin melihat mana yang lebih besar, mana yang lebih tinggi, mana yang naik, dan sebagainya. Untuk data yang terkait dengan waktu, visualisasi yang digunakan biasanya berupa line-chart. Sedangkan, jika yang dibandingkan adalah kategorikal, maka lebih cocok menggunakan bar-chart.
2. Distribusi
Bila ingin melihat distribusi/persebaran data di suatu variabel. Visualisasi 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
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 Kustomasi Lanjutan
Membuat Multi-Line Chart
# Import libraryimport datetimeimport pandas as pdimport matplotlib.pyplot as plt# Baca datasetdataset = 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 GMVdataset['gmv'] = dataset['item_price']*dataset['quantity']# Buat Multi-Line Chartdataset.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()
Untuk dapat membuat multi-line chart dapat menggunakan unstack() untuk pengelompokan yang kemudian di-plot.
Kustomisasi Legend
Mengkustom legend dapat dilakukan dengan menggunakan function plt.legend(). 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
2. 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.
3. shadow: jika diisi True, maka kotak legend akan memiliki bayangan.
4. ncol: jumlah kolom dari isi legend, default-nya adalah 1
5. fontsize: ukuran huruf pada legend
6. title: memberikan judul pada legend
7. title_fontsize: ukuran huruf pada judul legend
import matplotlib.pyplot as pltdataset.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.legend(loc='right', bbox_to_anchor=(1.6, 0.5), shadow=True, ncol=2)plt.gcf().set_size_inches(12, 5)plt.tight_layout()plt.show()
Kustomisasi Colormap
import matplotlib.pyplot as pltplt.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()
Pada grafik tersebut, list warnanya berbeda, tidak default seperti pada brand. Itu karena di function plot() ditambahkan parameter cmap 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
# Buat variabel untuk 5 propinsi dengan GMV tertinggitop_provinces = (dataset.groupby('province')['gmv'].sum().reset_index().sort_values(by='gmv',ascending=False).head(5))print(top_provinces)# Buat satu kolom lagi di dataset dengan nama province_topdataset['province_top'] = dataset['province'].apply(lambda x: x if(x in top_provinces['province'].to_list()) else 'other')# Plot multi-line chartnyaimport matplotlib.pyplot as pltdataset.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()
Top provinsi dapat dibuat dengan mengurutkan nilai GMV dari yang tertinggi kemudian ditambahkan ke dalam dataset memanfaatkan fungsi apply dan lambda.
Membuat Anotasi
Untuk membuat annotasi, dapat menggunakan function plt.annotate(). Parameter pertama adalah isi teksnya, dan parameter kedua adalah koordinat dari point yang dianotasi.
Selain itu ada beberapa parameter untuk anotasi yang bisa ditambahkan:
- 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’, dan lain-lain.
- 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
import matplotlib.pyplot as pltdataset.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)# Anotasi pertamaplt.annotate('GMV other meningkat pesat', xy=(5, 900000000),xytext=(4, 1700000000), weight='bold', color='red',arrowprops=dict(arrowstyle='fancy',connectionstyle='arc3',color='red'))# Anotasi keduaplt.annotate('DKI Jakarta mendominasi', xy=(3, 3350000000),xytext=(0, 3700000000), weight='bold', color='red',arrowprops=dict(arrowstyle='->',connectionstyle='angle',color='red'))plt.gcf().set_size_inches(12, 5)plt.tight_layout()plt.show()
Membuat Pie-Chart dan Bar-Chart
Membuat Subset Data
dataset_dki_q4 = dataset[(dataset['province']=='DKI Jakarta') & (dataset['order_month'] >= '2019-10')]print(dataset_dki_q4.head())
Subset data di atas menggunakan data Provinsi DKI Jakarta pada quartile 4 atau bulan September sampai Desember.
Membuat Pie Chart
Pie chart dapat dibuat dengan menggunakan fungsi plt.pie(). Beberapa parameter yang bisa dimodifikasi:
- 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. Default-nya adalah False.
- radius: jari-jari dari pie-chart
import matplotlib.pyplot as pltgmv_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()
Membuat Bar Chart
Syntax dalam praktik membuat bar chart mirip dengan line chart, hanya dengan menambahkan parameter kind=’bar’ pada fungsi .plot().
import matplotlib.pyplot as pltplt.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
import matplotlib.pyplot as pltdataset_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()
Multi-bar chart dapat dibuat dengan menambah pengelompokan. Syntax di atas yang ditambahkan adalah pengelompokan untuk kolom order_month.
Membuat Stacked Chart
Stacked Chart dapat dibuat dengan menambahkan parameter stacked=True pada fungsi .plot().
import matplotlib.pyplot as pltdataset_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 Customer
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))
Di atas menggunakan fungsi .agg() untuk melakukan agregasi data. Data agregat per customer yang diambil yaitu jumlah orders (banyaknya unique order_id), total quantity, dan total GMV.
Membuat Histogram
Histogram dapat dibuat menggunakan fungsi plt.hist() dan memasukkan variabel yang ingin dicek. Parameter lain yang bisa ditambahkan yaitu:
- bins: jumlah bin (kelompok nilai) yang diinginkan
- range: nilai minimum dan maksimum yang ditampilkan
- orientation: ‘horizontal’ atau ‘vertikal’
- color: warna bar di histogram
import matplotlib.pyplot as pltplt.clf()# Histogram pertamaplt.figure()plt.hist(data_per_customer['orders'])plt.show()# Histogram keduaplt.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()
import matplotlib.pyplot as pltplt.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()
import matplotlib.pyplot as pltplt.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 Scatterplot
Untuk membuat scatterplot, dapat menggunakan fungsi plt.scatter() dengan memasukkan variabel-variabel yang akan dibuat scatterplot.
import matplotlib.pyplot as pltplt.clf()# Scatterplot pertamaplt.figure()plt.scatter(data_per_customer['quantity'], data_per_customer['gmv'])plt.show()# Scatterplot kedua: perbaikan scatterplot pertamaplt.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()
Dari grafik tersebut, quantity dan GMV itu berkorelasi positif. Jadi jika suatu customer telah membeli dengan banyak quantity, maka kemungkinan GMV dari dia juga semakin besar.
Demikian hasil belajar saya pada modul Data Visualization with Python Matplotlib for Beginner — Part 2 yang saya pelajari di DQLab.
Terima kasih telah membaca.