Proyek Machine Learning dari Hulu ke Hilir (End-to-End) – Part 4: Eksplorasi dan Visualisasi Data untuk Mendapatkan Insights

Blog Banner End To End Machine Learning With Python

“Visualization gives you answers to questions you didn’t know you had.”

~ Ben Schneiderman

“The greatest value of a picture is when it forces us to notice what we never expected to see.”

~ John Tukey

1. Kali ini, Kita Hanya Mengeksplor Training Dataset Saja

hakim-azizul.comSampai sejauh ini kita telah melakukan penelaahan sekilas pada data kita, untuk mendapatkan pengertian umum mengenai jenis data yang kita hadapi dan akan kita manipulasi atau analisis. Pada sesi kali ini, kita akan menelaah sedikit lebih dalam lagi.

Pertama, kita pastikan bahwa kali ini kita hanya bekerja menggunakan data training saja, dan kita kesampingkan set data test yang telah kita bahas panjang lebar di Part 3.

Pada kesempatan lain, apabila kita ingin menganalisis data dengan ukuran yang jauh lebih besar (alhamdulillah kali ini kita berhadapan dengan data set yang relatif kecil untuk kasus Machine Learning), kita kemungkinan perlu untuk memecah data set menjadi exploration set, untuk mempercepat proses manipulasi data.

Mari kita copy training set kita, untuk memastikan training set yang sebenarnya tidak terganggu:

housing = strat_train_set.copy()

 

2. Visualisasi Data

2.1. Visualisasikan Data Geografis

Pada dataset housing, terdapat atribut geografis berupa latitude dan longitude, sehingga merupakan ide yang bagus jika kita memulai visualisasi data berupa scatterplot untuk setiap koordinat distrik yang ada. Berikut ini kodenya:

housing.plot(kind="scatter", x="longitude", y="latitude")
#Kualitas visualisasi data masih buruk

Tampilan di Jupyter Notebook:

visualisasi data geografis

Visualisasi Data Geografis dalam Bentuk Scatterplot 1: Kita Lihat Bahwa Kualitas Visualisasi Data Masih Kurang Baik, Karena Kita Belum dapat Mengidentifikasikan Suatu Pola Tertentu. Sumber Gambar: Dokumentasi Pribadi.

Gambar di atas sudah terlihat menyerupai California, namun kita masih belum melihat pola selain itu. Selanjutnya kita tambahkan parameter alpha=0.1, untuk memudahkan kita melihat distrik dengan densitas data point yang tinggi, sebagai berikut:

housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)
#Better Visualization Plot
visualisasi data geografis 2

Visualisasi Data Geografis dalam Bentuk Scatterplot 2: Visualisasi Data Sudah Membaik, Sehingga Kita dapat Membandingkan Daerah dengan Densitas Titik Data yang Lebih Tinggi dengan yang Lebih Rendah.

Hasil visualisasi data kita sekarang jauh membaik, kita bisa melihat daerah dengan kerapatan tinggi di California, yang dikenal sebagai Bay Area dan sekitar Los Angeles dan San Diego, dan juga garis panjang dengan kerapatan tinggi di Central Valley, khususnya sekitar Sacramento dan Fresno.

Selanjutnya kita tambahkan beberapa parameter lagi, sehingga visualisasi data kita dapat memberikan lebih banyak informasi. Selain memplotkan “latitude” dan “longitude”, kita juga akan membandingkan “population” dan juga “median_house_value” di setiap titik.

Berikut kodenya:

housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,
            s=housing["population"]/100, label="population", figsize=(10,7),
            c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True,
            sharex=False)
plt.legend()

Hasil di Jupyter Notebook:

visualisasi data geografis 3 plotting lokasi populasi dan median house value

Visualisasi Data Geografis dalam Bentuk Scatterplot 3: Plotting Lokasi, Populasi dan Median House Value di Setiap Titik.

Mari kita amati kode dan gambar di atas. Ukuran radius dari setiap titik atau lingkaran pada gambar merepresentasikan populasi distrik (parameter “s”), dan warna titik menunjukkan harga (parameter “c”). Kita akan menggunakan predefined color map; lihat sisi kanan gambar (parameter “cmap”) yang disebut “jet”, yang memiliki rentang dari warna biru (harga rendah) hingga warna merah (harga tinggi).

Gambar ini memberi kita informasi bahwa ada harga tempat tinggal (housing prices) berkaitan dengan lokasi (misal: dekat dengan laut) dan densitas populasi. Dari insight tersebut, memungkinkan kita untuk mencoba menerapkan algoritma clustering untuk mendeteksi clusters (gugus-gugus) utama, dan menambah feature baru, yang mengukur jarak (proximity) terhadap pusat cluster. Attribute proximity terhadap laut juga akan menarik untuk dieksplor, meskipun di California Utara harga hunian di area pesisir (coastal districts) tidak terlalu tinggi, sehingga bukan penelitian yang mudah (Geron 2017).

Kita dapat memvisualisasikan data dengan lebih realistis, dengan stacking (menumpukkan) scatterplot di atas, dengan gambar peta California, sebagai berikut:

import matplotlib.image as mpimg

#Direktori Citra Peta California
PROJECT_ROOT_DIR = "."
california_img=mpimg.imread(PROJECT_ROOT_DIR + '/images/end_to_end_project/california.png')
ax = housing.plot(kind="scatter", x="longitude", y="latitude", figsize=(10,7), 
                  s=housing["population"]/100, label="Population", 
                  c="median_house_value", cmap=plt.get_cmap("jet"), 
                  colorbar=False, alpha=0.4,
                 )
plt.imshow(california_img, extent=[-124.55, -113.80, 32.45, 42.05], alpha=0.5, 
           cmap=plt.get_cmap("jet"))
plt.ylabel("Latitude", fontsize=14)
plt.xlabel("Longitude", fontsize=14)

prices = housing["median_house_value"]
tick_values = np.linspace(prices.min(), prices.max(), 11)
cbar = plt.colorbar()
cbar.ax.set_yticklabels(["$%dk"%(round(v/1000)) for v in tick_values], fontsize=14)
cbar.set_label("Median House Value", fontsize=16)

plt.legend(fontsize=16)
plt.show()

Hasilnya:

Visualisasi Data Geografis Stacking Median House Values Lokasi Populasi Dan Peta California

Visualisasi Data Geografis dalam Bentuk Scatterplot 4: Stacking Plot Lokasi, Populasi dan Median House Value di Setiap Titik dengan Citra Peta California. Sumber Gambar: Dokumentasi Pribadi

 

2.2. Mencari Korelasi

Karena dataset yang kita gunakan tidak terlalu besar, maka kita dapat menghitung korelasi antar setiap atribut dengan mudah menggunakan metode Standard Correlation Coefficient (atau Pearson’s r), sebagai berikut:

corr_matrix = housing.corr()

Selanjutnya, kita lihat bagaimana eratnya korelasi setiap atribut terhadap variabel target kita, yaitu median house value:

corr_matrix["median_house_value"].sort_values(ascending=False)

Hasilnya, diurutkan dari relasi positif terkuat hingga relasi negatif terkuat:

correlation Matrix Median House Value

Sumber Gambar: Dokumentasi Pribadi.

Koefisien korelasi memiliki rentang nilai dari -1 hingga 1. Ketika nilainya mendekati 1, artinya terdapat korelasi positif yang sangat kuat; -1 terdapat korelasi negatif yang sangat kuat, sedangkan 0 berarti tidak ada korelasi linier sama sekali. Sebagai contoh, variabel median house value memiliki kecenderungan meningkat apabila median income juga naik.

Contoh korelasi negatif terdapat pada relasi latitude dengan median house value (harga akan sedikit menurun ketika posisi hunian cenderung ke arah utara).

Berikut ini ilustrasi macam-macam plot beserta nilai koefisien korelasi antara sumbu horizontal dan sumbu vertikalnya:

contoh beragam plot beserta koefisien korelasinya

Sumber Gambar: Wikipedia, Geron 2017.

Mari kita pelajari gambar di atas sejenak. Koefisien korelasi hanya mengukur korelasi linier, misalnya: jika x naik, maka y (secara umumnya) akan naik/turun. Sehingga, tidak bisa mengidentifikasi relasi nonlinier (misalnya: jika x mendekati nol maka y (pada umumnya) akan naik).

Perhatikan semua plot di bagian paling bawah, semuanya memiliki koefisien korelasi nol, sekalipun secara jelas bisa kita lihat bahwa relasi antar sumbu mereka tidak independen. Mereka adalah contoh-contoh relasi nonlinier.

Perhatikan juga semua plot di baris ke-2, yang merupakan contoh-contoh plot dengan koefisien korelasi 1 atau -1; terlepas dari bagaimanapun kemiringan (slope) mereka (sebagai contoh, suatu data dengan besaran panjang, katakanlah tinggi badan kita; semuanya akan memiliki koefisien korelasi 1 apabila diukur dengan cm, kaki (ft), maupun nanometer).

 

2.3. Visualisasikan Korelasi Menggunakan Heatmap

Sebagai tambahan, kita dapat memvisualisasikan koefisien-koefisien korelasi yang telah kita dapat sebelumnya, menggunakan plot heatmap, untuk memberikan sense yang lebih kuat untuk korelasi setiap variabel:

import seaborn as sns

#Plotkan heatmap
plt.subplots(figsize=(14,10))
sns.heatmap(corr_matrix, 
        xticklabels=corr_matrix.columns,
        yticklabels=corr_matrix.columns,
        square = True,cbar=True, annot=True, annot_kws={'size': 13})

Hasil di Jupyter Notebook:

heatmap housing dataset

Heatmap Housing Dataset. Sumber Gambar: Dokumentasi Pribadi.

 

2.4. Scatterplot Matrix

Metode lain untuk memeriksa korelasi antar atribut adalah dengan menggunakan function Pandas’ scatter_matrix, yang akan membuat scatterplot antar setiap atribut numerik pada dataset. Kita memiliki 9 atribut numerik pada dataset kita, sehingga kita akan memperoleh 9 x 9 = 81 plot. Berikut ini script untuk membuatnya:

from pandas.plotting import scatter_matrix

scatter_matrix(housing, figsize=(16,12))

Hasilnya:

scatterplot Matrix

Scatterplot Matrix 1: Scatterplot untuk Menunjukkan Korelasi antar Semua Variabel Numerik pada Dataset Housing. Sumber Gambar: Dokumentasi Pribadi.

Plot diagonal (dari puncak kiri hingga kanan terbawah) akan berbentuk garis lurus apabila diplotkan (karena plot antar variabel yang sama), sehingga akan menjadi informasi yang tidak berguna. Sehingga, Pandas menunjukkan display berupa histogram dari setiap atribut (terdapat opsi display lain yang disediakan oleh Pandas, dan untuk detailnya dapat dilihat di dokumentasinya).

81 plot sekaligus mungkin akan membuat kita kesulitan dalam mengamati pola yang ada, sehingga saatnya kita kombinasikan scatterplot matrix dengan metode koefisien korelasi yang sebelumnya; dengan membuat scatterplot matrix hanya untuk variabel-variabel dengan korelasi paling erat dengan median_house_value saja, yaitu: median_income, total_rooms, dan housing_median_age.

from pandas.plotting import scatter_matrix

attributes = ["median_house_value", "median_income", "total_rooms",
             "housing_median_age"]
scatter_matrix(housing[attributes], figsize=(12,8))

Hasilnya:

scatterplot Matrix 2

Scatterplot Matrix 2: Scatterplot yang Menunjukkan Korelasi Paling Erat Antara 3 Variabel Numerik dengan median_house_value. Sumber Gambar: Dokumentasi Pribadi.

Setelah kita “zoom in” scatterplot matrix-nya seperti di atas, semakin terbukti dan terlihat jelas relasi erat Median Income vs Median House Value seperti yang ditunjukkan oleh koefisien korelasi.

Mari kita zoom in kembali hingga hanya median_income vs median_house_value saja:

#Dari correlation matrix dan scatterplot matrix di atas, kita ketahui bahwa median income yang berkorelasi paling erat dengan median house values
#So, mari kita "zoom in" plotnya:
housing.plot(kind="scatter", x="median_income", y="median_house_value",
            alpha=0.1)

Hasilnya sebagai berikut:

scatterplot Matrix 3

Scatterplot Matrix 3: Median Income vs Median House Value. Sumber Gambar: Dokumentasi Pribadi.

Plot di atas menunjukkan beberapa hal, diantaranya:

  1. Korelasi antara kedua variabel sangat kuat; kita dapat melihat kecenderungan (trend) naik, dan titik-titik data tidak terlalu menyebar (dispersi atau penyebaran data relatif rendah).
  2. Price cap atau batas atas harga housing yang sudah kita bahas sebelumnya terlihat sangat jelas di sini, berupa garis horizontal pada harga $500,000. Namun, plot di atas menunjukkan beberapa garis serupa, yaitu di sekitar $450,000 dan $350,000, juga kemungkinan di sekitar $280,000 dan $220,000, dan beberapa harga di bawahnya. Kemungkinan diperlukan tahap pembersihan data pada distrik-distrik yang bersangkutan dengan harga-harga tersebut, untuk mencegah algoritma kita belajar mereproduksi data-data tersebut (data quirks) (Geron 2017).

 

3. Bereksperimen dengan Kombinasi-Kombinasi Atribut.

Dari proses visualisasi data serta identifikasi korelasi di atas, kita jadi mengetahui beberapa cara untuk mengeksplorasi dataset untuk mendapatkan insights. Insights tersebut diantaranya (seperti sudah dijelaskan sebelumnya, tapi tidak apa-apa kita review kembali):

  1. Kita berhasil mengidentifikasi korelasi antar atribut numerik terhadap variabel target.
  2. Terdapat “data quirks” yang perlu kita bersihkan dahulu sebelum menerapkan algoritma Machine Learning.
  3. Terdapat beberapa atribut yang memiliki bentuk distribusi “heavy-tail”, sehingga mungkin kita perlu melakukan transformasi data (contoh: mengubahnya menjadi logaritma).

Insights dan pengalaman yang kita peroleh tentu saja akan berbeda untuk setiap dataset, namun ide utamanya tetap sama. Dengan melakukan visualisasi data terlebih dahulu, kita akan mendapatkan gambaran lebih dalam mengenai data kita, dan step-step lanjutan yang perlu kita lakukan.

Satu tahapan lagi yang perlu kita lakukan sebelum menyiapkan data (data preparation) kita untuk menerapkan algoritma Machine Learning; adalah mencoba berbagai kombinasi atribut.

Sebagai contoh, total_rooms atau jumlah ruangan pada suatu distrik akan menjadi variabel yang tidak terlalu berguna apabila kita tidak mengetahui jumlah households atau jumlah hunian yang ada. Sehingga, variabel yang lebih kita butuhkan adalah jumlah ruangan pada setiap hunian atau “total_rooms/households”.

Begitu pula dengan jumlah kamar tidur (total_bedrooms) juga tidak terlalu berguna; variabel yang lebih kita butuhkan adalah perbandingan jumlah kamar tidur terhadap total ruangan pada suatu rumah atau hunian (“total_bedrooms/total_rooms”).

Populasi per hunian (“population/households”) juga akan menjadi variabel yang menarik untuk ditinjau.

Buat atribut-atribut baru tersebut, dengan code block berikut:

#Buat atribut atau features baru untuk membandingkan besaran-besaran berikut:
#"total_rooms" terhadap "households":
housing["rooms_per_household"] = housing["total_rooms"]/housing["households"]
#"total_bedroom" terhadap "total_rooms":
housing["bedroom_per_room"] = housing["total_bedrooms"]/housing["total_rooms"]
#"population" terhadap "households"
housing["population_per_household"] = housing["population"]/housing["households"]

Dengan summary statistics sebagai berikut:

attributes3 = ["rooms_per_household", "bedroom_per_room", "population_per_household"]

#Summary statistics dari 3 atribut baru:
housing[attributes3].describe()

Dengan hasil sebagai berikut:

summary statistics 3 Variabel Baru

Sumber Gambar: Dokumentasi Pribadi.

Lalu kita tinjau kembali correlation matrixnya:

#Lihat kembali correlation matrixnya:
corr_matrix = housing.corr()
corr_matrix["median_house_value"].sort_values(ascending=False)

Hasilnya:

correlation Matrix Median House Value 2

Sumber Gambar: Dokumentasi Pribadi.

Dan hasilnya cukup baik! Terbukti seperti asumsi kita sebelumnya, kita akan mendapatkan variabel baru yang lebih berguna; yaitu rooms_per_household, yang menjadi peringkat ke-2 variabel dengan korelasi tererat dengan median_house_value.

Variabel rooms_per_household atau jumlah ruangan per hunian ini terbukti lebih informatif dari sekedar total_rooms (jumlah ruangan di suatu distrik); karena sudah jelas semakin banyak jumlah ruangan atau dengan kata lain semakin besar suatu rumah, tentu saja harganya semakin mahal.

Sebagai tambahan, berikut ini heatmap dari dataset yang telah ditambah 3 variabel baru, serta scatterplot dari 3 variabel terbaik:

import seaborn as sns

#Plotkan heatmap
plt.subplots(figsize=(16,12))
sns.heatmap(corr_matrix, 
        xticklabels=corr_matrix.columns,
        yticklabels=corr_matrix.columns,
        square = True,cbar=True, annot=True, annot_kws={'size': 13})

Hasilnya:

Heatmap Housing Dataset 2: Setelah Ditambahkan 3 Variabel Baru. Sumber Gambar: Dokumentasi Pribadi.

from pandas.plotting import scatter_matrix

attributes2 = ["median_house_value", "median_income", "rooms_per_household", "total_rooms"]
scatter_matrix(housing[attributes2], figsize=(12,8))
scatterplot Matrix 4

Scatterplot Matrix 4: Scatterplot yang Menunjukkan Korelasi Paling Erat Antara 3 Variabel Numerik dengan median_house_value, Setelah Ditambahkan 3 Variabel Baru. Sumber Gambar: Dokumentasi Pribadi.

Untuk lebih mencermati relasi antara rooms_per_household vs median_house_value, kita gunakan script berikut:

housing.plot(kind="scatter", x="rooms_per_household", y="median_house_value",
            alpha=0.2)
plt.axis([0,5,0,520000])
plt.show()

Hasilnya:

scatterplot Matrix 5

Scatterplot Matrix 5: Rooms Per Household vs Median House Value. Terlihat bahwa Spread (Persebaran Data Jauh Lebih Lebar Dibandingkan dengan Scatterplot Matrix 3, dan di Sini Juga Masih Kita Jumpai Data Quirks yang Memang Bersumber dari Median House Value. Sumber Gambar: Dokumentasi Pribadi.

Tahap eksplorasi dan analisis data (exploratory data analysis (EDA)) dan visualisasi data ini tidak diharuskan untuk benar-benar runtut, cermat, apalagi sempurna; karena tujuan utama dari tahap ini adalah agar kita mengenal lebih dalam mengenai dataset yang kita hadapi, sehingga kita dapat mengambil langkah yang tepat, serta untuk mendapatkan insights dengan cepat, yang akan membantu kita membuat prototype Machine Learning dengan penalaran yang tepat.

EDA dan visualisasi data adalah proses iteratif, sehingga sekalipun nanti prototype kita telah jadi, kita tetap bisa terus melakukan analisis dari outputnya; untuk memperoleh lebih insights yang lebih kaya, lalu kita bisa mengulangi dan memperkaya tahap eksplorasi data ini.

Stay tuned! Enjoy Machine Learning! 🙂

 

4. Bonus (Penampakan Penuh dari Hasil Analisis dengan Jupyter Notebook)

 

References & Further Reading

Annotated Heatmaps, diakses pada 1 Juni 2019, 10:29 WIB.

Best Data Visualization Quotes from Thought Leaders, diakses pada 1 Juni 2019, 10:24 WIB.

Correlation Heatmap, diakses pada 1 Juni 2019, 10:28 WIB.

Geron A. (2017), Hands-On Machine Learning with Scikit-Learn and Tensorflow, O’Reilly Media.

Hauck T. (2014): scikit-learn Cookbook, Packt Publishing.

Make Seaborn Heatmap Bigger, diakses pada 1 Juni 2019, 10:31 WIB.

seaborn.heatmap, diakses pada 1 Juni 2019, 10:26 WIB.

 

Sumber Gambar

https://pixabay.com/en/money-home-coin-investment-2724235/ oleh nattanan23.

Follow and like us:

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *