import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
Week 02 (Data Visualization)
Pada modul ini kita akan mempelajari beberapa cara untuk membuat visualisasi data menggunakan package Matplotlib dan Seaborn. Seaborn merupakan salah satu package visualisasi data yang sangat sering digunakan karena fleksibilitas dan banyaknya jenis plot yang disediakan.
Prerequisites
Import Module
Sebelum memulai, mari kita import terlebih dahulu module - module yang diperlukan.
Import Data
Pada module kali ini, akan digunakan tiga data csv yang berbeda untuk mempermudah kebutuhan visualisasi.
Ketiga data tersebut dapat kalian unduh pada tautan berikut: https://bit.ly/DataWeek2
= pd.read_csv('data/week 2/spotify.csv', index_col='Date', parse_dates=['Date'])
spotify_df = pd.read_csv('data/week 2/flight_delays.csv')
flight_df = pd.read_csv('data/week 2/insurance.csv') insurance_df
Review Matplotlib
Seperti yang sudah dipelajari pada Algoritma dan Pemrograman, visualisasi data dapat dilakukan dengan module matplotlib, antara lain untuk membuat line plot dan scatter plot.
Pertama, kita akan menggunakan data Spotify, yaitu data total daily streams 5 lagu hits pada masanya.
spotify_df
Shape of You | Despacito | Something Just Like This | HUMBLE. | Unforgettable | |
---|---|---|---|---|---|
Date | |||||
2017-01-06 | 12287078 | NaN | NaN | NaN | NaN |
2017-01-07 | 13190270 | NaN | NaN | NaN | NaN |
2017-01-08 | 13099919 | NaN | NaN | NaN | NaN |
2017-01-09 | 14506351 | NaN | NaN | NaN | NaN |
2017-01-10 | 14275628 | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... |
2018-01-05 | 4492978 | 3450315.0 | 2408365.0 | 2685857.0 | 2869783.0 |
2018-01-06 | 4416476 | 3394284.0 | 2188035.0 | 2559044.0 | 2743748.0 |
2018-01-07 | 4009104 | 3020789.0 | 1908129.0 | 2350985.0 | 2441045.0 |
2018-01-08 | 4135505 | 2755266.0 | 2023251.0 | 2523265.0 | 2622693.0 |
2018-01-09 | 4168506 | 2791601.0 | 2058016.0 | 2727678.0 | 2627334.0 |
366 rows × 5 columns
Berikut adalah cara untuk membuat line plot pada satu fitur di dataframe menggunakan matplotlib
"""
Membuat line plot untuk lagu Shape of You menggunakan matplotlib
"""
# Mengatur besar figur plot
=(8,6))
plt.subplots(figsize
# Membuat line plot
'Shape of You'], 'b')
plt.plot(spotify_df[# Membuat label sumbu-x dan sumbu-y
'Date')
plt.xlabel('Shape of You Total Daily Streams')
plt.ylabel(# Menampilkan plot
plt.show()
Apabila kita ingin menampilkan fitur-fitur lain dalam figur yang sama, kita dapat memanfaatkan loop
"""
Membuat line plot untuk semua lagu dalam spotify_df menggunakan loop
"""
=(8,6))
plt.subplots(figsize
# Loop setiap nama kolom pada dataframe, lalu plot
for column in spotify_df.columns:
plt.plot(spotify_df[column])
plt.legend(spotify_df.columns) plt.show()
Namun, terdapat cara yang lebih mudah selain menggunakan looping. pandas dataframe memiliki method yang dapat secara langsung memvisualisasikan keseluruhan fiturnya, yaitu .plot()
.
Pada .plot()
kita memiliki beberapa parameter yang dapat diatur, antara lain kind
dan figsize
. kind
berfungsi untuk mengatur jenis plot yang ingin kita buat, sedangkan figsize
berfungsi untuk mengatur besar figur yang dihasilkan.
Parameter lainnya dapat dilihat pada: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html
"""
Membuat line plot untuk semua lagu dalam spotify_df menggunakan pandas .plot()
"""
='line', figsize=(8,6))
spotify_df.plot(kind'Date')
plt.xlabel('Total Daily Streams')
plt.ylabel( plt.show()
Selain line plot, terdapat banyak macam kind
yang bisa digunakan. Pada code cell dibawah terlihat bahwa pandas .plot()
dapat menghasilkan histogram (perlu diperhatikan bahwa jenis plot perlu menyesuaikan tipe data yang dimiliki, terlihat bahwa menggunakan data spotify, histogram tidak menghasilkan insight yang cukup berguna).
='hist', figsize=(8,6), alpha=.7)
spotify_df.plot(kind
plt.show()
Pada praktikum Algoritma dan Pemrograman kita juga telah mempelajari cara untuk membuat scatter plot. Berikut code untuk membuat scatter plot menggunakan matplotlib, untuk melihat korelasi antara daily streams lagu Shape of You dengan Something Just Like This.
"""
Membuat scatter plot untuk melihat korelasi antara lagu
Shape of You dengan Something Just Like This menggunakan
matplotlib
"""
=(8,6))
plt.subplots(figsize
=spotify_df['Shape of You'],
plt.scatter(x=spotify_df['Something Just Like This'],
y=.5)
alpha'"Shape of You" Total Daily Streams')
plt.xlabel('"Something Just Like This" Total Daily Streams')
plt.ylabel( plt.show()
Pengenalan Seaborn
Walaupun matplotlib cukup fleksibel dalam menghasilkan plot, tetapi tipe plot yang disediakan cenderung terbatas. Oleh karena itu, kita dapat menggunakan Seaborn karena tipe plot yang disediakan sangat banyak sesuai kebutuhan kita, antara lain line, bar, heatmap, scatter, box, swarm, histogram, density, dan masih banyak lagi.
Line Plot
Line plot biasa digunakan untuk melihat trend data dalam jangka waktu tertentu.
Untuk membuat line plot pada seaborn, kita dapat menggunakan sns.lineplot()
. Jika data yang ingin kita visualisasikan adalah dataframe, kita dapat memasukkan variabel dataframe tersebut pada parameter data
, seperti code di bawah ini.
"""
Membuat line plot dengan module seaborn
"""
=(8,6))
plt.subplots(figsize=spotify_df)
sns.lineplot(data plt.show()
Fleksibilitas Seaborn membuat kita dapat memilih color palette yang sesuai dengan keinginan kita. Kita dapat memilih palette yang sudah disediakan oleh seaborn (antara lain: bright, deep, pastel, dan masih banyak lagi) atau kita dapat mengatur sendiri palette yang ingin kita gunakan.
Untuk memilih palette yang akan digunakan untuk plot selanjutnya pada seaborn, kita dapat menggunakan sns.set_palette()
.
Jenis palette yang disediakan seaborn serta cara membuat color palette secara mandiri dapat dilihat pada: https://seaborn.pydata.org/tutorial/color_palettes.html#tools-for-choosing-color-palettes
# Mengganti color palette menjadi "bright"
'bright') sns.set_palette(
"""
Membuat line plot setelah color palette diubah menjadi "bright"
"""
# Mengatur besar figur yang ingin ditampilkan
=(14,6))
plt.figure(figsize
# Membuat line plot
=spotify_df)
sns.lineplot(data# Membuat judul figur
"Daily Global Streams of Popular Songs in 2017-2018")
plt.title(# Menampilkan plot
plt.show()
Apabila tidak semua fitur pada data ingin kita visualisasikan, kita dapat menggunakan sns.lineplot()
beberapa kali, sesuai dengan banyaknya fitur yang ingin kita tampilkan, seperti pada code di bawah.
=(14,6))
plt.figure(figsize
# Membuat line plot hanya dengan lagu Shape of You
=spotify_df['Shape of You'], label="Shape of You")
sns.lineplot(data# Menambahkan line plot pada figur dengan lagu Despacito
=spotify_df['Despacito'], label="Despacito")
sns.lineplot(data
"Daily Global Streams of Popular Songs in 2017-2018")
plt.title("Date")
plt.xlabel('')
plt.ylabel( plt.show()
Bar Plot
Bar plot biasa digunakan untuk membandingkan kuantitas/nilai pada data bertipe kategori.
Selanjutnya, kita akan menggunakan data flight_delays.csv, yaitu data rata-rata keterlambatan beberapa maskapai pesawat pada setiap bulannya.
flight_df
Month | AA | AS | B6 | DL | EV | F9 | HA | MQ | NK | OO | UA | US | VX | WN | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 6.955843 | -0.320888 | 7.347281 | -2.043847 | 8.537497 | 18.357238 | 3.512640 | 18.164974 | 11.398054 | 10.889894 | 6.352729 | 3.107457 | 1.420702 | 3.389466 |
1 | 2 | 7.530204 | -0.782923 | 18.657673 | 5.614745 | 10.417236 | 27.424179 | 6.029967 | 21.301627 | 16.474466 | 9.588895 | 7.260662 | 7.114455 | 7.784410 | 3.501363 |
2 | 3 | 6.693587 | -0.544731 | 10.741317 | 2.077965 | 6.730101 | 20.074855 | 3.468383 | 11.018418 | 10.039118 | 3.181693 | 4.892212 | 3.330787 | 5.348207 | 3.263341 |
3 | 4 | 4.931778 | -3.009003 | 2.780105 | 0.083343 | 4.821253 | 12.640440 | 0.011022 | 5.131228 | 8.766224 | 3.223796 | 4.376092 | 2.660290 | 0.995507 | 2.996399 |
4 | 5 | 5.173878 | -1.716398 | -0.709019 | 0.149333 | 7.724290 | 13.007554 | 0.826426 | 5.466790 | 22.397347 | 4.141162 | 6.827695 | 0.681605 | 7.102021 | 5.680777 |
5 | 6 | 8.191017 | -0.220621 | 5.047155 | 4.419594 | 13.952793 | 19.712951 | 0.882786 | 9.639323 | 35.561501 | 8.338477 | 16.932663 | 5.766296 | 5.779415 | 10.743462 |
6 | 7 | 3.870440 | 0.377408 | 5.841454 | 1.204862 | 6.926421 | 14.464543 | 2.001586 | 3.980289 | 14.352382 | 6.790333 | 10.262551 | NaN | 7.135773 | 10.504942 |
7 | 8 | 3.193907 | 2.503899 | 9.280950 | 0.653114 | 5.154422 | 9.175737 | 7.448029 | 1.896565 | 20.519018 | 5.606689 | 5.014041 | NaN | 5.106221 | 5.532108 |
8 | 9 | -1.432732 | -1.813800 | 3.539154 | -3.703377 | 0.851062 | 0.978460 | 3.696915 | -2.167268 | 8.000101 | 1.530896 | -1.794265 | NaN | 0.070998 | -1.336260 |
9 | 10 | -0.580930 | -2.993617 | 3.676787 | -5.011516 | 2.303760 | 0.082127 | 0.467074 | -3.735054 | 6.810736 | 1.750897 | -2.456542 | NaN | 2.254278 | -0.688851 |
10 | 11 | 0.772630 | -1.916516 | 1.418299 | -3.175414 | 4.415930 | 11.164527 | -2.719894 | 0.220061 | 7.543881 | 4.925548 | 0.281064 | NaN | 0.116370 | 0.995684 |
11 | 12 | 4.149684 | -1.846681 | 13.839290 | 2.504595 | 6.685176 | 9.346221 | -1.706475 | 0.662486 | 12.733123 | 10.947612 | 7.012079 | NaN | 13.498720 | 6.720893 |
Untuk membuat bar plot pada seaborn dengan dataframe, kita dapat menggunakan sns.barplot()
dengan tiga parameter yang wajib kita set, yaitu:
- data: dataframe yang ingin kita visualisasikan
- x: nama fitur pada dataframe yang ingin kita jadikan sumbu-x
- y: nama fitur pada dataframe yang ingin kita jadikan sumbu-y
Pada kode di bawah, juga digunakan satu parameter opsional, yaitu palette
yang merupakan cara lain untuk mengatur color palette yang ingin kita gunakan
"""
Membuat bar plot keterlambatan maskapai EV setiap
bulannya menggunakan seaborn
"""
=(14,6))
plt.figure(figsize
=flight_df, x='Month', y='EV',
sns.barplot(data=sns.color_palette('deep'))
palette'EV Flight Delays (minute)')
plt.ylabel('Average EV Flight Delays per Month')
plt.title( plt.show()
Berdasarkan hasil plot di atas, terlihat bahwa maskapai EV memiliki rata-rata keterlambatan terlama pada bulan Juni, serta tercepat pada bulan September.
Selanjutnya, mari kita coba lihat urutan rata-rata keterlambatan semua maskapai dalam satu tahun (maskapai mana yang memiliki rata-rata keterlambatan terlama, serta maskapai mana yang tercepat).
Hal pertama yang perlu kita lakukan adalah, jadikan fitur Month
sebagai index dataframe.
# Set fitur "Month" menjadi index dataframe
= flight_df.set_index('Month')
flight_df 2) flight_df.head(
AA | AS | B6 | DL | EV | F9 | HA | MQ | NK | OO | UA | US | VX | WN | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Month | ||||||||||||||
1 | 6.955843 | -0.320888 | 7.347281 | -2.043847 | 8.537497 | 18.357238 | 3.512640 | 18.164974 | 11.398054 | 10.889894 | 6.352729 | 3.107457 | 1.420702 | 3.389466 |
2 | 7.530204 | -0.782923 | 18.657673 | 5.614745 | 10.417236 | 27.424179 | 6.029967 | 21.301627 | 16.474466 | 9.588895 | 7.260662 | 7.114455 | 7.784410 | 3.501363 |
Selanjutnya, kita perlu hitung rata-rata keterlambatan tiap maskapai dalam satu tahun, yaitu hitung rata-rata tiap kolom pada dataframe menggunakan .mean()
(Tambahan: apabila kita ingin menghitung rata-rata tiap barisnya, kita dapat menggunakan parameter axis=1
pada .mean()
). .mean()
akan menghasilkan pandas Series.
Lalu, agar mempermudah kita dalam melihat visualisasi bar plotnya, kita dapat menggunakan .sort_values()
.
# Simpan rata-rata keterlambatan semua maskapai dalam satu tahun pada variabel flight_mean_inyear
= flight_df.mean()
flight_mean_inyear # Urutkan flight_mean_inyear secara ascending
= flight_mean_inyear.sort_values()
flight_mean_inyear
flight_mean_inyear
AS -1.023656
DL 0.231116
HA 1.993205
US 3.776815
AA 4.120776
WN 4.275277
VX 4.717718
UA 5.413415
OO 5.909658
MQ 5.964953
EV 6.543328
B6 6.788370
F9 13.035736
NK 14.549663
dtype: float64
Terakhir, visualisasikan bar plot menggunakan cara seperti sebelumnya.
Kita dapat lihat pada code dibawah bahwa tidak digunakan parameter data
, karena flight_mean_inyear merupakan pandas Series (bukan dataframe) sehingga lebih mudah jika kita langsung menggunakan parameter x
dan y
saja.
=(14,6))
plt.subplots(figsize=flight_mean_inyear.index,
sns.barplot(x=flight_mean_inyear.values,
y=sns.color_palette('deep'))
palette'Average Delay per Flight in a Year')
plt.title( plt.show()
Berdasarkan plot diatas, NK merupakan maskapai dengan rata-rata keterlambatan terlama dalam satu tahun, sedangkan AS adalah yang tercepat (AS bernilai negatif yang berarti rata-rata kedatangan pesawat lebih cepat dari yang dijadwalkan dalam satu tahun.
Heatmap
Heatmap biasa digunakan untuk mempermudah melihat pola pada data berdasarkan warna yang dihasilkan.
Pada seaborn, kita dapat menggunakan heatmap dengan sns.heatmap()
seperti pada kode dibawah. Parameter annot
berfungsi untuk menampilkan nilai data (jika True) atau tidak (jika False).
Bar sebelah kanan heatmap menunjukkan bahwa, semakin lama keterlambatan pesawat, maka warna yang dihasilkan semakin terang. Sebaliknya, semakin gelap warna yang dihasilkan berarti semakin cepat pesawat datang tersebut.
"""
Membuat heatmap menggunakan Seaborn
"""
=(14,10))
plt.figure(figsize
=flight_df, annot=True)
sns.heatmap(data"Average Arrival Delay for Each Airline, by Month")
plt.title("Airline")
plt.xlabel( plt.show()
Berdasarkan heatmap di atas, kita dapat melihat dengan mudah pada bulan apa suatu maskapai sangat terlambat (contoh: maskapai NK pada bulan Juni).
Heatmap sangat sering digunakan untuk melihat korelasi antarfitur pada dataset agar kita dapat mengerti lebih jauh tentang fitur-fitur pada data, atau juga dapat dimanfaatkan untuk melakukan feature selection sebelum membuat sebuat model Machine Learning.
Untuk melakukan hal tersebut, kita perlu menghitung dahulu korelasi antar fitur menggunakan pandas .corr()
, yaitu fungsi yang akan menghitung korelasi antar dua fitur menggunakan korelasi Pearson.
Notes: Metode korelasi dapat diubah dengan menggunakan parameter method
pada .corr()
, contoh: .corr(method='spearman')
. Metode lainnya dapat dilihat pada: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.corr.html
# Hitung korelasi antar dua fitur pada flight_df
= flight_df.corr()
flight_corr
flight_corr
AA | AS | B6 | DL | EV | F9 | HA | MQ | NK | OO | UA | US | VX | WN | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AA | 1.000000 | 0.334980 | 0.429854 | 0.805229 | 0.896523 | 0.903986 | 0.220065 | 0.842701 | 0.573716 | 0.620477 | 0.809874 | 0.823713 | 0.425237 | 0.615664 |
AS | 0.334980 | 1.000000 | 0.340359 | 0.394359 | 0.356608 | 0.336791 | 0.684979 | 0.283977 | 0.480863 | 0.350657 | 0.457414 | 0.489025 | 0.229571 | 0.519228 |
B6 | 0.429854 | 0.340359 | 1.000000 | 0.643313 | 0.342627 | 0.510718 | 0.467905 | 0.529724 | 0.032038 | 0.591115 | 0.233021 | 0.788345 | 0.579750 | 0.151750 |
DL | 0.805229 | 0.394359 | 0.643313 | 1.000000 | 0.796951 | 0.783265 | 0.262251 | 0.598765 | 0.625277 | 0.569073 | 0.797339 | 0.821757 | 0.700605 | 0.691805 |
EV | 0.896523 | 0.356608 | 0.342627 | 0.796951 | 1.000000 | 0.828515 | 0.099369 | 0.721468 | 0.784026 | 0.692697 | 0.911499 | 0.669736 | 0.462638 | 0.730115 |
F9 | 0.903986 | 0.336791 | 0.510718 | 0.783265 | 0.828515 | 1.000000 | 0.273878 | 0.912984 | 0.414064 | 0.582509 | 0.671986 | 0.878874 | 0.308397 | 0.465765 |
HA | 0.220065 | 0.684979 | 0.467905 | 0.262251 | 0.099369 | 0.273878 | 1.000000 | 0.436015 | 0.176485 | 0.056941 | 0.066821 | 0.586160 | -0.008439 | -0.007296 |
MQ | 0.842701 | 0.283977 | 0.529724 | 0.598765 | 0.721468 | 0.912984 | 0.436015 | 1.000000 | 0.281890 | 0.586963 | 0.503575 | 0.660181 | 0.150111 | 0.239744 |
NK | 0.573716 | 0.480863 | 0.032038 | 0.625277 | 0.784026 | 0.414064 | 0.176485 | 0.281890 | 1.000000 | 0.365273 | 0.827455 | 0.293515 | 0.395419 | 0.742869 |
OO | 0.620477 | 0.350657 | 0.591115 | 0.569073 | 0.692697 | 0.582509 | 0.056941 | 0.586963 | 0.365273 | 1.000000 | 0.626051 | 0.590313 | 0.561515 | 0.548304 |
UA | 0.809874 | 0.457414 | 0.233021 | 0.797339 | 0.911499 | 0.671986 | 0.066821 | 0.503575 | 0.827455 | 0.626051 | 1.000000 | 0.477816 | 0.536968 | 0.926800 |
US | 0.823713 | 0.489025 | 0.788345 | 0.821757 | 0.669736 | 0.878874 | 0.586160 | 0.660181 | 0.293515 | 0.590313 | 0.477816 | 1.000000 | 0.333396 | 0.242344 |
VX | 0.425237 | 0.229571 | 0.579750 | 0.700605 | 0.462638 | 0.308397 | -0.008439 | 0.150111 | 0.395419 | 0.561515 | 0.536968 | 0.333396 | 1.000000 | 0.630278 |
WN | 0.615664 | 0.519228 | 0.151750 | 0.691805 | 0.730115 | 0.465765 | -0.007296 | 0.239744 | 0.742869 | 0.548304 | 0.926800 | 0.242344 | 0.630278 | 1.000000 |
Pandas .corr()
menghasilkan dataframe dengan nama baris dan kolom yang sama, serta berisi nilai korelasi antara baris dan kolom yang ditinjau (contoh: korelasi antara maskapai AA dan AS adalah 0,334980). Serta, dataframe yang dihasilkan adalah sebuat matriks simetris.
Tentu dengan hanya melihat dataframe di atas, tidak terlihat begitu jelas mana fitur yang memiliki korelasi tinggi dan mana yang yang memiliki korelasi rendah. Oleh karena itu, kita dapat memanfaatkan heatmap.
Pada code di bawah, untuk mempermudah pembacaan heatmap, kita menggunakan parameter vmin
, vmax
, dan center
pada sns.heatmap()
. vmin
berfungsi untuk mengatur nilai terendah, vmax
berfungsi untuk mengatur nilai tertinggi, dan center
berfungsi untuk mengatur nilai tengah pada heatmap. Korelasi Pearson menghasilkan nilai antara -1 hingga 1, sehingga kita dapat set ketiga parameter tersebut seperti pada code di bawah.
=(14,10))
plt.figure(figsize
=flight_corr, vmin=-1, vmax=1, center=0, annot=True)
sns.heatmap(data"Pearson Correlation of Each Airline Flight Delays")
plt.title("Airline")
plt.xlabel( plt.show()
Dengan menggunakan heatmap, sekarang terlihat bahwa mana maskapai yang keterlambatannya berkorelasi tinggi dan mana yang rendah. Misal, AA dan EV menghasilkan korelasi yang cukup tinggi positif, yaitu 0.9, yang artinya jika keterlambatan maskapai AA tinggi, begitu juga maskapai EV, dan sebaliknya jika keterlambatan maskapai AA rendah, begitu juga maskapai EV.
Untuk meyakinkan kita dengan hal tersebut, kita dapat lihat pada materi selanjutnya, yaitu Scatter Plot.
Scatter Plot
Scatter plot biasa digunakan untuk melihat korelasi antara dua fitur bertipe numerik.
Untuk menggunakan scatter plot pada seaborn, kita dapat menggunakan sns.scatterplot()
, dengan parameter yang sama seperti kita membuat bar plot.
"""
Membuat scatter plot untuk melihat
keterkaitan pada keterlambatan pesawat
maskapai EV dan AA
"""
=flight_df, x='EV', y='AA')
sns.scatterplot(data plt.show()
Melalui scatter plot di atas, kita dapat semakin yakin bahwa kesimpulan yang kita ambil dengan melihat heatmap sebelumnya benar.
"""
Tambahan scatter plot pada maskapai lain yang
memiliki korelasi tinggi
"""
=flight_df, x='EV', y='UA')
sns.scatterplot(data plt.show()
"""
Scatter plot pada maskapai yang memiliki
korelasi rendah (mendekati 0)
"""
=flight_df, x='UA', y='HA')
sns.scatterplot(data plt.show()
Pada heatmap, terlihat bahwa maskapai UA dan HA memiliki korelasi yang rendah, yaitu 0.067. Sehingga, jika kita buat scatter plotnya, menghasilkan plot seperti di atas.
Untuk memahami scatter plot lebih baik, kita akan menggunakan dataset lainnya, yaitu insurance.csv yang merupakan data berisi biaya asuransi (charges) beberapa orang.
insurance_df.head()
age | sex | bmi | children | smoker | region | charges | |
---|---|---|---|---|---|---|---|
0 | 19 | female | 27.900 | 0 | yes | southwest | 16884.92400 |
1 | 18 | male | 33.770 | 1 | no | southeast | 1725.55230 |
2 | 28 | male | 33.000 | 3 | no | southeast | 4449.46200 |
3 | 33 | male | 22.705 | 0 | no | northwest | 21984.47061 |
4 | 32 | male | 28.880 | 0 | no | northwest | 3866.85520 |
Misal, kita ingin melihat keterkaitan indeks massa tubuh (bmi
) seseorang dengan biaya asuransi (charges
) orang tersebut. Sama seperti sebelumnya, kita dapat melakukannya seperti pada code di bawah.
# Mengubah palette menjadi default
'tab10')
sns.set_palette(# Membuat scatter plot antara fitur bmi dan charges
=insurance_df, x='bmi', y='charges')
sns.scatterplot(data
plt.show()
Scatter plot di atas menunjukkan bahwa korelasi antara bmi
dan charges
adalah cenderung positif, tetapi tidak terlalu tinggi. Yang artinya, orang dengan BMI tinggi, cenderung akan membayar biaya asuransi lebih tinggi.
Agar kita semakin yakin dengan kesimpulan tersebut, kita dapat menambahakn garis regresi pada scatter plot tersebut dengan menggunakan sns.regplot()
.
=insurance_df, x='bmi', y='charges')
sns.regplot(data plt.show()
Berdasarkan scatter plot dan garis regresi dihasilkan, terlihat bahwa kesimpulan yang kita ambil benar. Agar semakin yakin lagi, kita juga dapat menghitung langsung korelasi Pearsonnya menggunakan cara sebelumnya, yaitu pandas .corr()
.
'bmi', 'charges']].corr() insurance_df[[
bmi | charges | |
---|---|---|
bmi | 1.000000 | 0.198341 |
charges | 0.198341 | 1.000000 |
Dengan menggunakan seaborn, kita juga dapat memvisualisasikan scatter plot berdasarkan dengan pewarnaan yang berbeda berdasarkan fitur lainnya yang bertipe kategorik.
Misal, kita ingin membuat scatter plot antara fitur bmi
dan charges
dengan pewarnaannya berdasarkan nilai dari fitur smoker
, yaitu yes atau no. Kita dapat set parameter hue='smoker'
pada sns.scatterplot()
seperti pada code di bawah.
=insurance_df, x='bmi', y='charges', hue='smoker')
sns.scatterplot(data plt.show()
Sehingga dihasilkan pewarnaan yang berbeda untuk seseorang yang merupakan perokok (biru) dan yang tidak (orange). Berdasarkan scatter plot di atas, terlihat bahwa korelasi antara bmi
dan charges
untuk perokok cendering tinggi positif (semakin besar bmi
, semakin besar juga charges
). Sedangkan, untuk bukan perokok, korelasinya cenderung rendah (semakin besar bmi
, tidak terlalu berpengaruh terhadap charges
).
Seperti cara sebelumnya, kita dapat menambahkan garis regresi. Namun, karena kita disini menggunakan hue
, terdapat dua cara untuk menambahkan garis regresi, yaitu yang pertama adalah menggunakan sns.regplot()
seperti di bawah ini.
=insurance_df.query('smoker == "yes"'), x='bmi', y='charges') # axes 1
sns.regplot(data=insurance_df.query('smoker == "no"'), x='bmi', y='charges') # axes 2
sns.regplot(data plt.show()
Perhatikan bahwa sns.regplot()
dipanggil dua kali karena fungsi tersebut tidak memiliki parameter hue
.
Untuk mempermudah, kita dapat menggunakan cara kedua, yaitu menggunakan sns.lmplot()
. Cara kerja sns.lmplot()
yaitu menggabungkan dua (atau lebih) sns.regplot()
dalam satu figur.
=insurance_df, x='bmi', y='charges', hue='smoker')
sns.lmplot(data plt.show()
Box Plot dan Swarm Plot
Box plot dan swarm plot biasa digunakan untuk melihat keterkaitan antara data kategorik dan data numerik. Swarm plot biasa disebut sebagai “categorical scatter plot”, karena plot yang dihasilkan mirip seperti scatter plot, tetapi untuk data kategorik.
Untuk menggunakan box plot pada seaborn kita dapat menggunakan sns.boxplot()
.
Untuk menggunakan swarm plot pada seaborn kita dapat menggunakan sns.swarmplot()
.
Misal, kita ingin melihat keterkaitan antara fitur smoker
dan charges
menggunakan swarm plot. Maka, kita dapat menggunakan code seperti di bawah ini.
=(10,6))
plt.subplots(figsize
=insurance_df, x='smoker', y='charges', size=3)
sns.swarmplot(data plt.show()
Berdasarkan swarm plot di atas, terlihat bahwa perokok cenderung memiliki biaya asuransi yang lebih tinggi dibandingkan yang bukan perokok. Selain itu, semakin lebar “swarm” pada suatu kategori berarti semakin banyak seseorang dengan nilai charges
tersebut.
Apabila kita ingin menggunakan box plot, maka dapat digunakan code seperti di bawah ini.
=insurance_df, x='smoker', y='charges')
sns.boxplot(data plt.show()
Pada box plot, terdapat dua istilah yang umum digunakan, yaitu “box” dan “whiskers”. Pada box plot di atas, “box” merupakan persegi panjang berwarna biru dan orange. Garis di tengah box merupakan nilai mediannya, serta garis bawah dan garis atas box merupakan kuartil bawah (Q1) dan kuartil atas (Q3) secara berurutan. “Whiskers” adalah garis yang merupakan perpanjangan dari box. Ujung dari whiskers atas adalah Q3 + (1.5 x IQR) data, sedangkan ujung whiskers bawah adalah Q1 - (1.5 x IQR) data.
Titik di luar box dan whiskers tersebut adalah titik yang biasa dijadikan sebagai outlier (penentuan outlier diserahkan ke diri masing-masing, apakah hanya dengan melihat box plot atau dengan menggunakan metode lain, tetapi untuk mempermudah dapat menggunakan box plot).
Histogram dan Density Plot
Selain box plot dan swarm plot, kita juga dapat melihat persebaran data menggunakan histogram dan density plot. Histogram biasa digunakan untuk melihat persebaran data secara diskrit, sedangkan density plot untuk melihat persebaran data secara kontinu.
Untuk membuat histogram pada seaborn, kita dapat menggunakan sns.histplot()
.
Untuk membuat density plot pada seaborn, kita dapat menggunakan sns.kdeplot()
.
Misal, kita ingin melihat persebaran dari fitur charges
pada insurance_df. Maka dapat digunakan code seperti di bawah.
=(12,6))
plt.subplots(figsize
=insurance_df, x='charges')
sns.histplot(data plt.show()
Berdasarkan histogram di atas, terlihat bahwa distribusi charges
cenderung “skew” atau miring ke kanan. “Skewness” atau tingkat kecondongan merupakan aspek yang penting untuk diperhatikan ketika kita ingin membuat model Machine Learning.
Seperti scatter plot, kita juga dapat menentukan pewarnaan histogram berdasarkan fitur lainnya dengan menggunakan parameter hue
seperti di bawah ini/
=(12,6))
plt.subplots(figsize=insurance_df, x='charges', hue='smoker')
sns.histplot(data plt.show()
Jika ingin membuat density plot dari fitur charges
, kita dapat menggunakan kode seperti di bawah ini. Parameter shade
berfungsi untuk memberikan warna di bawah kurva.
=(12,6))
plt.subplots(figsize=insurance_df, x='charges', shade=True)
sns.kdeplot(data plt.show()
sns.kdeplot()
juga dapat menggunakan parameter hue
.
=(12,6))
plt.subplots(figsize=insurance_df, x='charges',
sns.kdeplot(data='smoker', shade=True)
hue plt.show()
Apabila kita ingin menggabungkan histogram dan density plot dalam satu figur, kita dapat menggunakan sns.histplot()
dengan parameter kde=True
.
=(12,6))
plt.subplots(figsize=insurance_df, x='charges', hue='smoker', kde=True)
sns.histplot(data plt.show()
Joint Plot
Pada seaborn, kita juga dapat membuat dua plot yang berbeda dari dua fitur dalam satu figur yang sama menggunakan sns.jointplot()
.
Jenis plot yang dihasilkan dapat diatur pada parameter kind
. Pilihan jenis kind
yang disediakan dapat dilihat pada: https://seaborn.pydata.org/generated/seaborn.jointplot.html
=insurance_df, x='charges', y='bmi', hue='smoker', kind="scatter")
sns.jointplot(data
plt.show()
=insurance_df, x='charges', y='bmi', hue='smoker', kind="hist")
sns.jointplot(data
plt.show()
=insurance_df, x='charges', y='bmi', hue='smoker', kind="kde")
sns.jointplot(data
plt.show()
Supplementary: Panduan Pemilihan Plot
source: https://www.kaggle.com/code/alexisbcook/choosing-plot-types-and-custom-styles