PCA: beyond a features reduction
The Article for Indonesia’s Audience or people who understand Bahasa
Menulis itu kadang melelahkan, ini bukan curhat, tapi memang butuh kemauan yang besar (mencoba menaikan niat diri sendiri untuk menulis ini). Di masa-masa PSBB seperti sekarang ini, merupakan saat yang tepat untuk memulai kembali apa yang sudah tertunda sejak awal tahun. Berbagi bahan pikiran dan menunggu feedback dari yang membacanya. Tulisan ini masih jauh dari kesempurnaan, apalagi untuk masalah kebakuannya.
Pada kesempatan kali ini, ditulisan ini akan dibahas mengenai PCA (Principle Component Analysis) yang sudah biasa digunakan oleh para praktisi Data. Mungkin sedikit berbeda dengan penjelasan yang sudah ada sebelumnya disini, disini, dan disini. Tulisan ini akan bahas sedikit lebih dalam mengenai apa yang bisa dilakukan praktisi Data dengan PCA selain mengurangi dimensi data. Di sini juga akan dibahas mengenai efek yang akan terjadi dengan hasil PCA jika tidak ada preprocessing diawal. (related github)
Data Description
Untuk mempermudah visualisasi dan penjelasan, penulis akan menggunakan data sample yang tersedia di database penulis. Data ini sepertinya sudah tersimpan lama dan penulis sudah tidak terlalu mengingat dapat dari mana data ini. Tapi untuk diingat, segala efek dan penjelasan yang akan disebutkan disini sangat tergantung dengan data yang digunakan. Sehingga mungkin masih butuh penjelasan yang lebih umum dan ilmiah untuk ditarik kesimpulan yang benar. Namun, hasil tulisan ini mungkin masih bisa digunakan untuk quick reference only.
Data yang akan digunakan adalah Data Wine, yang setiap barisnya menunjukan merk Wine yang berbeda. Kolom-kolom data ini berisi deskripsi dari Wine tersebut dengan kolom paling terakhir menunjukan bagaimana tingkatan kualitas Wine tersebut.
Data terdiri dari 1599 Wine berbeda (asumsi) dengan 11 kolom deskripsi dari Wine yang terkait. Mulai dari tingkat keasaman, kandungan gula dan kandungan sulfur (somehow). Penulis juga tidak yakin dengan satuan dari setiap kolom tersebut, namun kualitas data cukup baik sehingga bisa digunakan sebagai contoh ditulisan ini. Berikut ini deskripsi dari data diatas,
Deskripsi diatas menunjukan bahwa,
- Tidak ada Missing Value (count-nya sama semua)
- Ada beberapa kolom yang mempunyai pencilan (outlier), bisa diliat ada yang nilai maksimum-nya sangat jauh dari persentil 75 ke maksimumnya.
Plain PCA
Pertama-tama akan ditunjukan hasil PCA tanpa pre-processing dan apa saja yang bisa didapatkan dari PCA tersebut. Menggunakan data Wine Quality diatas didapatkan hasil PCA sebagai berikut (input-nya adalah semua kolom kecuali quality),
Hasil PCA adalah data dengan nilai baru dengan dimensi yang sama dengan dimensi data input, dimana nilai baru ini tidak bisa diinterpertasikan. Data baru ini juga memiliki nilai variansi informasi yang sudah diurutkan, dimana dimensi pertama (p_1) lebih “informatif” dibanding yang kedua (p_2) dan seterusnya. Sehingga, kolom yang paling terakhir atau beberapa kolom dibagian akhir bisa di hilangkan karena kurang “informatif” (disini dimension reduction terjadi). Berikut ini adalah cumulative sum dari variansi informasi yang diduga ada di setiap kolom. Bisa dilihat bahwa setelah p_2 variansi informasi tidak bertambah secara signifikan lagi (dan sudah mencapai lebih dari 0.99), maka dari itu, kolom setelah p_2 bisa diabaikan.
Di artikel ini tidak akan dijelaskan bagaimana nilai itu bisa dibuat dari input (untuk lebih detailnya bisa dilihat disini), namun artikel ini akan lebih mencoba menjelaskan output lain didapat selain data baru tersebut. Setelah menelusuri beberapa teori disini dan disini, didapat bahwa PCA bisa menghasilkan circle of correlation seperti contoh dibawah ini.
Di dalam grafik tersebut, setiap garis mewakili satu kolom dari data input. Jarak garis tersebut dari origin menunjukan seberapa besar variansi informasi dari kolom yang berhubungan dengan garis tersebut. Garis-garis yang mengarah ke arah yang sama/hampir sama menunjukan bahwa kolom-kolom dari garis-garis tersebut memiliki korelasi positif yang tinggi. Sedangkan garis-garis yang berlawanan arah artinya kolom-kolom dari garis-garis tersebut berkorelasi negatif. Sementara itu garis-garis seperti free_sulfur_dioxide dan total_sulfur_dioxide, yang memiliki sudut hampir 90 derajat, memiliki arti bahwa kolom-kolom dari garis-garis tersebut tidak saling berkorelasi.
Standardized PCA
Grafik CoC diatas terlihat begitu meyakinkan bahwa free_sulfur_dioxide dan total_sulfur_dioxide memiliki kontribusi besar dalam variansi informasi. Namun, bisa dilihat dari deskripsi data bahwa nilai kedua kolom tersebut memiliki rata2 yang tinggi dari yang lain. Ini menenjukaan bahwa kolom-kolom dari data contoh disini memiliki satuan yang berbeda. Sehingga grafik CoC diatas tidak valid dan bias. Untuk itu harus dilakukan standarisasi dengan StandardScaler di sklearn.
Grafik berikut adalah cumulative sum dari variansi informasi untuk data yang di standarisasi. Disini komponen p_7 baru bisa mencapai kontribusi lebih dari 90, sangat berbeda dari data yang tidak di standarisasi.
Hasil CoC-nya pun berbeda antara standardized dan non-standardized. Berikut adalah CoC dari top 7 kolom yang memiliki kontribusi paling besar untuk variansi informasi.
Sedikit berbeda dengan Plot CoC sebelumnya, Plot CoC ini menunjukan total_sulfur_dioxide dan free_sulfur_dioxide memiliki kontribusi tinggi namun korelasinya tinggi (karena searah). Sementara itu, Kolom citric_acid dan fixed_acidity berbanding lurus dan berkorelasi tinggi ditambah kedua kolom tersebut berbanding terbalik (karena berlawanan arah) dengan pH. Insight yang didapat itu sangat sesuai dengan nature bahwa semakin rendah pH semakin tinggi tingkat keasaman.
Karena penjelasan-penjelasan tersebut bisa langsung terlihat dari CoC, maka CoC bisa membantu dalam optimisasi banyaknya kolom untuk clustering. Berdasarkan CoC tersebut, total_sulfur_dioxide, chlorides dan fixed_acidity adalah kolom-kolom yang cukup untuk melakukan clustering. Kolom-kolom ini dipilih karena tidak saling berkorelasi dan memiliki kontribusi informasi variansi yang tinggi diantara kolom-kolom yang berkorelasi dengannya.
Remove Outliers Standardized PCA
Masalah lainnya yang belum diselesaikan adalah masalah pencilan (outliers). Berdasarkan distribusi data yang distandarisasi dibawah ini, kolom chlorides memiliki nilai yang sangat tinggi. Dipastikan akan ada pencilan yang sangat dipengaruhi oleh kolom ini.
Untuk itu pencilan ini harus di remove dari data, pembersihan pencilan ini dilakukan dengan menggunakan metode isolation forest. Setelah pembersihan data dari pencilan, ada perubahan besar dari CoC plot sebelumnya.
Perubahan signifikan yang terjadi adalah chlorides dan free_sulfur_dioxide tidak lagi masuk ke top 7 kolom yang memiliki kontribusi besar. Ditambah juga korelasi citric_acid dan fixed_acidity berkurang (karena saling menjauh). Melalui CoC ini bisa ditentukan bahwa total_sulfur_dioxide, density dan fixed_acidity adalah kolom-kolom yang optimal untuk clustering.
Conclusion
PCA secara alaminya mengumpulkan variansi informasi dan mendistribusikan variansi tersebut menjadi komponen-komponen utama. Dimana komponen pertama memiliki variansi informasi paling banyak dibanding komponen setelahnya. Hal ini yang membuat hasil PCA bisa memberikan informasi kolom mana yang memiliki variansi informasi paling banyak. Insight ini bisa di visualisasikan dengan Circle of Correlation, yang mana langsung memberikan informasi mengenai kolom mana yang matter, kolom mana yang bisa diabaikan.
Namun perlu diingat, segala transformasi yang dilakukan melalui PCA ada baiknya dilakukan setelah data cleansing dan standarisasi. Pembersihan data ini mencakup data yang hilang atau data yang terlalu berbeda dengan lainnya (pencilan). Ada baiknya dilakukan standarisasi juga sehingga satuan dari setiap kolom akan sama.