Visualisasi Data: Membuat Boxplot menggunakan Seaborn
Penjelasan Singkat Boxplot
Boxplot adalah diagram yang digunakan untuk memvisualisasikan distribusi data, meliputi nilai minimum, persentil ke-25 (25% data), median (50% data), persentil ke-75 (75% data), nilai maksimum serta kemungkinan keberadaan outlier. Gambar 1 menunjukkan bagaimana struktur dari suatu boxplot.
Garis yang membagi kotak menjadi dua bagian merupakan median data.Artinya, jumlah amatan pada sisi kiri median sama banyaknya dengan jumlah amatan pada sisi kanan yaitu sebanyak 50%. Ujung-ujung kotak menunjukkan persentil ke-25 atau kuartil ke-1 (Q1) dan persentil ke-75 atau kuartil ke-3 (Q3). Sebanyak 25% data memiliki nilai kurang dari Q1 dan 75% data memiliki nilai lebih kecil dari Q3. Selisih antara Q3 dan Q1 disebut jangkauan interkuartil (IQR). Garis yang berada pada sisi kiri menunjukkan amatan yang memiliki nilai antara Q1 – 1,5*IQR dan garis pada sisi kanan menunjukkan amatan yang memiliki nilai antara Q3 + 1,5*IQR. Tanda bulatan yang berada pada ujung-ujung diagram menunjukkan amatan yang kemungkinan masuk dalam kriteria outlier (pencilan).
Pembuatan Boxplot Menggunakan Seaborn
Untuk contoh pembuatan boxplot, kita akan menggunakan dataset penguins
yang tersedia pada library seaborn
. Pertama-tama kita siapkan library dan data yang diperlukan.
Dataset penguins
terdiri dari 7 kolom, dengan 3 kolom bertipe objek dan 4 kolom numerik. Pada tutorial ini kita akan menggunakan data-data bill_length_mm
, bill_depth_mm
, flipper_length_mm
dan body_mass_g
.
# install library seaborn # !pip install seaborn # Memanggil library yang diperlukan import matplotlib.pyplot as plt import seaborn as sns penguins = sns.load_dataset("penguins") penguins.info()
# Output <class 'pandas.core.frame.DataFrame'> RangeIndex: 344 entries, 0 to 343 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 species 344 non-null object 1 island 344 non-null object 2 bill_length_mm 342 non-null float64 3 bill_depth_mm 342 non-null float64 4 flipper_length_mm 342 non-null float64 5 body_mass_g 342 non-null float64 6 sex 333 non-null object dtypes: float64(4), object(3) memory usage: 18.9+ KB
Boxplot Tunggal
Misalkan kita akan membuat boxplot sebaran nilai kolom bill_length_mm
. Cara yang sama dapat diterapkan pada peubah numerik lainnya.
sns.boxplot(x=penguins['bill_length_mm'])
Dengan menentukan nilai parameter x
menggunakan data dari kolom bill_length_mm
maka sudah dapat menghasilkan boxplot seperti gambar di atas. Kita juga dapat merubah orientasi boxplot menjadi vertikal dengan menempatkan peubahnya pada parameter y
.
sns.boxplot(y=penguins['bill_length_mm'])
Boxplot dengan Beberapa Kategori
Pada contoh sebelumnya kita hanya menampilkan 1 boxplot saja, sekarang kita akan menampilkan beberapa boxplot sekaligus berdasarkan kategori tertentu. Contohnya pada data set penguins
, kolom species
merupakan peubah kategorik yang terdiri dari 3 jenis spesies penguin yaitu Adelie, Chinstrap dan Gentoo. Berikut ini boxplot yang sama seperti sebelumnya untuk kolom bill_length_mm
namun dipisahkan berdasarkan spesies penguin.
sns.boxplot(x=penguins["species"], y=penguins['bill_length_mm']) # atau sns.boxplot(data=penguins, x="species", y='bill_length_mm')
Sama seperti sebelumnya, jika ingin membentuk boxplot secara horizontal maka dapat cukup dengan menukar nilai antara parameter x
dan y
. Pada kode di atas juga dapat dilihat bahwa untuk menghasilkan boxplot yang sama kita dapat menggunakan 2 cara. Cara pertama dengan memasukkan data kolom langsung pada parameter x
dan y
. Adapun cara kedua yaitu dengan mengisi parameter data
dengan dataset yang digunakan yaitu penguins
, dan parameter x
dan y
cukup diisi dengan nama kolom yang digunakan saja.
Pengaturan Warna
Kita dapat melakukan pengaturan warna-warna pada masing-masing boxplot dengan menentukan nilai parameter color
dan palette
. Jika menentukan warna menggunakan parameter color
maka semua boxplot akan memiliki warna yang sama.
sns.boxplot(data=penguins, x="species", y='bill_length_mm', color="orange")
Untuk mengatur warna-warna yang berbeda dapat menggunakan parameter pallete
. Terdapat banyak pallete built-in yang tersedia seperti "viridis"
, "bright"
, "pastel"
, "muted"
dan lain sebagainya (lihat di sini).
sns.boxplot(data=penguins, x="species", y='bill_length_mm', palette="bright")
Jika menginginkan pengaturan yang lebih spesifik maka dapat membuat custom palette sesuai yang diinginkan. Adapun warna-warna yang dapat digunakan dapat berupa kode hex, RGB/RGBA, ataupun menggunakan nama warna built-in yang digunakan pada pada library matplotlib (di sini).
custom_pal = {"Adelie": "#9A0EEA", "Chinstrap": "beige", "Gentoo":"c"} sns.boxplot(data=penguins, x="species", y='bill_length_mm', palette=custom_pal)
Pengaturan Ukuran dan Bentuk Boxplot
Selain pengaturan warna, dapat juga diatur ketebalan dari garis pada boxplot, maupun lebar boxplot. Untuk menentukan ketebalan garis maka perlu mengatur nilai untuk parameter linewidth
. Adapun untuk lebar dari boxplot dilakukan dengan mengatur nilai parameter width
. Jika nilai kedua parameter ini lebih besar dari 1, maka ketebalan garis dan lebar boxplot akan semakin besar, begitu pula sebaliknya, jika kurang dari 1 maka akan semakin kecil dibandingkan ukuran defaultnya.
custom_pal = {"Adelie": "#9A0EEA", "Chinstrap": "beige", "Gentoo":"c"} sns.boxplot(data=penguins, x="species", y='bill_length_mm', palette=custom_pal, linewidth=0.7, width=0.4)
Selain ukuran boxplot, kita dapat pula mengatur bentuk box menjadi memiliki sudut pada area sekitar median dengan mengatur parameter notch=True
. Selanjutnya pada bagian outlier, dapat diatur ukuran dari titik outlier pada parameter fliersize
, serta bentuk markernya juga dapat disesuaikan pada parameter flierprops
. Terdapat cukup banyak jenis marker yang dapat digunakan dan dapat dilihat di sini.
custom_pal = {"Adelie": "#9A0EEA", "Chinstrap": "beige", "Gentoo":"c"} sns.boxplot(data=penguins, x="species", y='bill_length_mm', palette=custom_pal, linewidth=0.7, width=0.4, notch=True, fliersize=10, flierprops={"marker": "o"})
Boxplot dengan Subkategori
Sebelumnya kita sudah membuat boxplot berdasarkan spesies penguin, lebih lanjut, untuk setiap spesies tersebut dapat kita pecah lagi menjadi subkategori tertentu. Misalkan akan memisahkan sebaran data bill_length_mm
antara jantan dan betina untuk masing-masing spesies. Untuk dapat membuat boxplot seperti ini, perlu kita tentukan parameter hue
yang berisi kolom kategorik yang bertindak sebagai subkategori. Dalam hal ini akan digunakan kolom sex
.
# Mengatur ukuran frame plt.figure(figsize=(8, 6)) sns.boxplot(data=penguins, x="species", y='bill_length_mm', hue="sex", palette="bright", linewidth=0.8, width=0.5, fliersize=3, flierprops={"marker": "o"})
Kita juga dapat mengatur posisi dari legenda misalkan ditempatkan di sisi kanan tengah boxplot.
# Mengatur ukuran frame plt.figure(figsize=(8, 6)) sns.boxplot(data=penguins, x="species", y='bill_length_mm', hue="sex", palette="bright", linewidth=0.8, width=0.5, fliersize=3, flierprops={"marker": "o"}) plt.legend(bbox_to_anchor=(1, 0.6), loc=2, borderaxespad=1)
Menampilkan Beberapa Plot Sekaligus
Pada bagian ini kita akan mencoba menggabungkan beberapa diagram boxplot sekaligus dalam 1 figure
. Metode yang digunakan sebenarnya tidak terbatas hanya untuk boxplot saja, sehingga cara yang sama juga berlaku untuk diagaram apapun.
# menyiapkan frame 1 baris dan 2 kolom (untuk 2 diagram) fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(8, 4), sharey=False) sns.boxplot(data=penguins, x="species", y='bill_length_mm', width=0.6, ax=axes[0]) sns.boxplot(data=penguins, x="species", y='bill_depth_mm', width=0.6, ax=axes[1]) fig.tight_layout()
Langkah pertama yaitu menyiapkan objek figure
untuk menampilkan diagram sebanyak 1 baris x 2 kolom (untuk dua diagram bersebelahan secara horizontal). Dapat juga dibuat 2 baris x 1 kolom jika menginginkan diagram bertumpuk secara vertikal. parameter sharey
dapat diatur untuk menentukan apakah sumbu y untuk setiap diagram memiliki rentang nilai yang sama atau tidak. Secara default parameter ini sebenarnya bernilai False
. Penulisan secara eksplisit pada contoh di atas hanya untuk mempertegas dan pada dasarnya jika ditentukan bernilai False maka tidak perlu dituliskan.
Langkah berikutnya, buat diagram yang akan ditampilkan. Di sini kita akan membuat dua buah diagram boxplot, pertama adalah untuk data bill_length_mm
(dengan nilai ax=axes[0]
, kolom pertama) dan data bill_depth_mm
(dengan nilai ax=axes[1]
, kolom kedua).
Pada contoh di atas, diagram ditampilkan hanya pada 1 baris saja, sehingga indeks yang digunakan untuk menempatkan diagram juga hanya 1 dimensi. Jika jumlah baris dan kolom keduanya lebih dari satu maka indeks yang digunakan adalah 2 dimensi (indeks baris dan kolom).
Misal kita akan membuat 4 boxplot untuk setiap peubah numerik yang ada pada dataset. Maka indeks untuk setiap diagram harus ditentukan secara 2 dimensi. Untuk Diagram pertama ditempatkan pada baris ke-1 kolom ke-1 (ax=axes[0, 0]
), diagram kedua pada baris ke-1 kolom ke-2 (ax=axes[0, 1]
) dan seterusnya.
fig, axes = plt.subplots(2, 2, figsize=(8, 6), sharex=False) sns.boxplot(data=penguins, x="species", y='bill_length_mm', width=0.6, ax=axes[0, 0]) sns.boxplot(data=penguins, x="species", y='bill_depth_mm', width=0.6, ax=axes[0, 1]) sns.boxplot(data=penguins, x="species", y='flipper_length_mm', width=0.6, ax=axes[1, 0]) sns.boxplot(data=penguins, x="species", y='body_mass_g', width=0.6, ax=axes[1, 1]) fig.tight_layout()
Selanjutnya, dapat ditambah sedikit sentuhan dengan menambahkan judul yang sesuai serta menghilangkan label pada pada sumbu x dan y pada setiap diagram.
fig, axes = plt.subplots(2, 2, figsize=(8, 6), sharex=False) p1 = sns.boxplot(data=penguins, x="species", y='bill_length_mm', width=0.6, ax=axes[0, 0]) p2 = sns.boxplot(data=penguins, x="species", y='bill_depth_mm', width=0.6, ax=axes[0, 1]) p3 = sns.boxplot(data=penguins, x="species", y='flipper_length_mm', width=0.6, ax=axes[1, 0]) p4 = sns.boxplot(data=penguins, x="species", y='body_mass_g', width=0.6, ax=axes[1, 1]) plot = [p1, p2, p3, p4] label = ["Bill Length (mm)", "Bill Depth (mm)", "Flipper Length (mm)", "Body Mass (g)"] # untuk setiap diagram, hapus label pada sumbu x dan y # dan set judul diagram yang sesuai for i in range(0, 4): plot[i].set(ylabel=None, xlabel=None) plot[i].axes.set_title(label[i], fontsize=11) fig.tight_layout()
Ringkasan
Pada tulisan ini, kita sudah membahas konsep boxplot secara umum dan membuat boxplot menggunakan seaborn. Pustaka seaborn memungkinkan kita membuat boxplot tunggal, boxplot untuk beberapa kategori dan subkategori serta mengatur beberapa properti termasuk pewarnaan serta bentuk plot. Selain itu kita juga sudah berhasil membuat visualisasi beberapa diagram boxplot dan menyajikan dalam satu frame.
Referensi
- Seaborn Documentation : seaborn.boxplot — seaborn 0.12.1 documentation (pydata.org)
- Box Plot with Minitab – Lean Sigma Corporation
Tulisan Lainnya