Halaman

Khamis, 14 November 2024

The Missing Value Proposition

0 comments

Bismillahirrahmanirrahiim. Dengan nama Allah yang Maha Pemurah lagi Maha Penyayang.

...

(Saje nak letak cover untuk topik ni)

Beberapa minggu lepas. Ada la sorang budak Data Scientist aku ni, panggil aku mintak pendapat. Dia cakap, dia ada dapat data dari Database Administrator kitorang. Tapi ada data yang tak de. So dia tanya pendapat aku. Ni pasal nak buat forecasting/prediction.

"Nak buang ke row yang takde data ni"

Senyap sekejap. Basically projek yang kitorang tengah working tu, ada missing data.

So Missing Data is actually kinda interesting. Untuk kita yang kerja gunakan data dari data entry, memang akan jarang jumpa missing data.

Kalau data tu datangnya dari source macam sensor ke apa, ya it is possible untuk jumpa missing data. Data yang ditransmit guna UDP, of course akan ada missing data. Ataupon ada database corrupt, means there is a high possibility untuk jumpa missing data.

Basically, kalau missing data ni, biasanya disebabkan system error. Tersangatlah jarang jumpa missing data dari application yang dah go live or live in production (otherwise we call it as bad application design!).

So missing data ni dia macam ni. Tengok kat figure bawah ni.

Figure 116: Example Data with Missing Value [106]

Basically in Python, NaN tu maksudnya Not a Number. So biasanya kalau data takde dari database, atau pon data tu kat dalam database dia store sebagai NULL, so in python, dia akan treat as a None atau NaN (because null is not a number, depending on the library jugak lah). In other language, biasanya dia akan letak sebagai NULL.

There quite a lots of way to fill in the missing value.

But why tho? Kenapa nak buat fill in the missing value? Tak boleh ke guna as is sahaja.

Usually when we wanted to make an analysis of the data (like statistics or put it on some equation), kita tak boleh nak letak NULL atau NaN kat dalam data kita. Tak jalan. Kalau kira kat kertas pon sama. Kita nak kira apa kalau ada some value tu NULL?

So we need to find a way to fill in the missing value.

Banyak method. But I don't want to explain the method (I left it as an exercise to the reader hahahh). But more on the technique.

Determine the nature of the data.

Ni feveret aku. Katakanlah kita tahu (till some extent) yang data tu adalah derived dari some sort of distribution, we can use the distribution properties to fill in the value. Like for an example, data tu kita tau dia adalah Normal Distribution. So aku letak je mean value sebagai dia punya filler.

But this is more on traditional approach. Dengan best pakai kalau data tu kita ambil statistik, contoh aku ambil data ketinggian pekerja office aku tapi ada sorang ni tak nak share tinggi dia berapa...

Other approach yang aku suka pakai is actually do interpolation.

Interpolation.

Ni sangat berguna kalau kita ada data yang secara series (atau berturutan, atau dalam subjek matematik masa aku Form 5 dulu, dia panggil sebagai jujukan aritmetik.. sort of..).

Aku suka cara ni. Kita try fahamkan macam mana bentuk nature data dia dan kita boleh agak - agak kat mana kedudukan value tu. Contoh macam kita ada data ni. Sumber dua - dua figure ni dari [107].

Figure 117: Missing data kat tengah - tengah tu

Tapi sebab kita dapat gambaran dia macam mana dengan mata kasar, so kita boleh nicely fitkan dia dalam interpolation equation dia supanya jadi macam ni.

Figure 118: Interpolation untuk agak - agak value missing data tu.

Cumaaaaa... Interpolation ni memang tersangatnya cantik kalau jadi. Tapi nak buat dia.. sakit kepala jugak. Satu, katakan dia ada 10 data, so kita punya polinomial tu boleh naik sampai ke 10 degree (kalau betul - betul nak tepat), dan kemudian kene solvekan guna linear equation untuk dapatkan coefficient dia tu semua tu... Biasa orang akan limitkan ke 3 degree je (cubic polinomial untuk avoid complexity).

Dan dua, kalau data tu ada noise, dia akan follow sekali noise tu. Dan kadang - kadang dia overfitting. Dan kita kene set boundary, so kita assume data kita tu dalam boundary. Dan mungkin aku banyak sangat fikir. Haha..

Atau... Teknik ketiga adalah,

Machine Learning.

Ha ni budak - budak data scientist suke la ni. Pakai machine learning untuk fill in the blank. Ni contoh guna K-Nearest Neighbour untuk fill in missing value (source [108]).

Figure 119: Filling missing value guna KNN Imputation
 

Senang. Cumaaaa.. Satu kadang - kadang jawapan dia bukan deterministic. Maksudnya kalau aku buat second run, the point mungkin akan pergi ke tempat lain. Dan Dua, kalau nak betul - betul tepat, kena ada data yang banyak (ni standard masalah guna Machine Learning atau Deep Learning).

Tapi, jangan lupa satu lagi teknik yang aku rasa menjadi pilihan hati ramai orang.

Buang the missing value.

Senang kan? So buang je row tu. Tak payah nak pening kepala. But of course, this is my least preferred option. 

Sebabnya, katakan kita ada data kat Figure 117 tu, kalau aku buang, dia punya trend akan lari. Lagi lah pulak kalau kita buat time series punya data. Dan kalau kita guna teknik pertama tu (statistical approach), kita hilang satu N. Rugi weh.

...

So there's quite lots of technique that can be used untuk masalah kita ni.

Berbalik ke cerita budak Data Scientist kita.

"Nak buang ke row yang takde data ni. Kalau tak, tak boleh nak buat forecast ni."

Aku senyap. Sebab that is the least favourite technique aku.

Tapi tu pendapat aku. So tak boleh la nak impose opinion aku to others kan...

So aku tanya lagi.

"Tak boleh ke guna cara lain. Pakai machine learning ke?"

Dia cakap, "Macam tak sesuai. Sebab data sikit sangat". Fair enough.

"Ada tengok tak macam mana distribution data tu? Distribution normal ke. Atau gaussian like ke"

Dia terdiam. Aku pon terdiam. "Nak pakai method mana satu?" True. Banyak sangat method yang ada.

Aku sambung. "Ok cuba u tunjuk kat I, macam mana data yang you ada tu".

I kid you not. Data dia macam lebih kurang macam ni (ni sample aku buat sendiri):

Figure 120: The real missing data

Banyak sangat missing data tu. Untuk data dari Januari 2018 sehingga ke Disember 2023, ada lebih kurang belas - belas je data dia.

Sakit kepala aku tengok.

Aku start tanya dia pasal data tu.

Aku: "Memang ni je ke data dia?"

DS: "Ya tu je data yang Database Admin kasi."

Aku: "Memang nature data ni macam ni ke?"

DS: "Yang lain tu memang takde data. Sebab ni data duit. Diorang buat belian dalam sekali dua je dalam setahun."

Senyap kejap.

"So boleh ke saya buang je yang kosong ni?"

Aku, "No. Yang kosong tu, isi je as kosong. Lepas tu you run beberapa model untuk forecasting."

DS, "Tapi nanti bukan ke error dia tinggi sangat nanti"

Aku, "Ya memang akan dapat error yang tinggi. But try to find method and parameter yang buat dia paling rendah. And of course dia punya RMSE value dia tu tinggi. Boleh jadi \( 1 x 10^{10} \). But it is what it is. Kalau kita buang row tu, basically kita tukar the nature of the data."

Kemudian aku terangkan kat dia.

That is actually not a missing value. Data dia ada. Cuma data yang kosong tu sebenarnya ada nilai. Dan nilai tu adalah kosong!

Figure 121: .. which actually a zero filled data

Missing value, is that data tu ada tapi hilang. But in our case, data dia ada. Cuma data dia kosong. Dan mungkin Database Admin aku tak letak dalam row sebab, ye lah. Orang tak masukkan dalam sistem. So database admin aku letak NULL dalam database dia.

And,

NULL is not zero and zero is not NULL. The translation between real life data and system/application data is totally different.

...

So several days ago, aku balik kampung sambil drive santai - santai lalu jalan lama. Sambil - sambil tu aku terfikirlah pasal masalah ni.

Because somewhat, aku ter-relatekan problem ni dengan real life aku.

Me. Yang sentiasa mencari - cari jawapan dalam kehidupan di sekeliling aku.

Me. Yang sentiasa rasakan ada missing value dalam life aku yang aku nak kene fill in kan.

I know the technique. In fact, bukan ke aku baru je listkan tadi.

But now I'm thinking.

Is it really a missing value? Or actually it is actually just a proposition.

You see.. In math, when we don't know whether if it is true or false, we call it as proposition.

The basic building blocks of logic are propositions. A proposition is a declarative statement, which is either true or false but not both; that is, it has a well-defined truth value. In addition, it is sometimes difficult to know if a sentence is a proposition, and if it is a proposition, it may not be known for some reason whether it is true or false. The area of logic that deals with propositions is called propositional logic. - Grami, A. (n.d.). Discrete Mathematics: Essentials and Applications. Academic Press. [109]
So, is it true that I'm just searching for a missing value? Or maybe the value is there after all. And the value is actually zero?

...

The problem is that, I think that I can find the answer.

Tapi kita ni manusia biasa beb. Pemikiran kita ni limited. We can't comprehend something that is beyond our control and beyond our understanding.

Dunia ni luas. Aku ni cuma sorang hamba Nya yang kerdil. Aku tak mampu nak articulate semuanya. Kita buat yang terbaik, dan masa yang sama, kita berserah sahaja semuanya kepada Allah Yang Maha Esa.

بِسْمِ اللَّهِ تَوَكَّلْتُ عَلَى اللَّهِ لاَ حَوْلَ وَلاَ قُوَّةَ إِلاَّ بِاللَّهِ

Aku bertawakal (berserah diri) kepada Allah, tiada daya upaya melainkan dengan izin Allah.

Wallahu a'lam bissawab..

...

[106]: Figure tu aku google "missing value" dari internet. Malas nak buat sendiri. Source: https://www.analyticsvidhya.com/blog/2021/04/beginners-guide-to-missing-value-ratio-and-its-implementation/

[107]: Figure - figure tu aku amik dari website ni: https://www.kdnuggets.com/how-to-deal-with-missing-data-using-interpolation-techniques-in-pandas

[108]: Figure tu dari sini https://www.geeksforgeeks.org/k-nearest-neighbours/