Visualisasi Data: Membuat Boxplot menggunakan Seaborn

Visualisasi Data Boxbplot Seaborn Python

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).

struktur diagram boxplot
Gambar 1. Struktur Boxplot (inspired from here)

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"})
visualisasi boxplot menurut kategori seaborn python

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)
visualisasi boxplot menurut kategori dengan seaborn python

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()
visualisasi boxplot dalam grid seaborn python

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()
visualisasi boxplot dalam grid  seaborn python

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

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Isi