Machine Learning from Disaster with Titanic (1)
Sat 20 February 2016Data Analytics တွေနဲ့ ပတ်သက်ပြီးတော့ ဒီနှစ်အနည်းငယ်အတွင်းမှာ အတော်လေးတော့ လူပြောများလာတယ် အချိန်ကျလာတယ်လို့ပဲ ပြောရမှာပါ Machine Learning, Data Mining, Text Mining တွေအတွက် သုံးကြရတဲ့ Method တွေက အသစ်အဆန်းတွေ မဟုတ်ပါဘူး Applied Statistics အတွက် Better Method or More Data ဆိုပြီးတော့ အရေးကြီးတဲ့ အချက် ၂ ချက်ရှိတယ် Better Method အတွက်လည်း တိုးတက်သင့်သလောက် တိုးတက်လာတယ် More Data ဘက်က ကြည့်ရင်တော့ လွန်ခဲ့သော နှစ်ပေါင်း ၂၀-၃၀ လောက်က Data Collect လုပ်တယ်ဆိုတာက ဘယ်လောက်ပမာဏ Collect လို့ရနိုင်မလဲ အကန့်အသတ်ရှိတယ် အခုအချိန်မှာတော့ Data ပမာဏက အကန့်အသတ် မရှိဘူးပြောရအောင်ကို ကြီးထွားနေတဲ့ အခြေအနေအထိ ဖြစ်လာနေတော့ Data Analytics တွေ ရေပန်းစားလာတာ အထူးအဆန်းတော့ မဟုတ်ဘူးပေါ့။
အရင်လည်း Analytics တွေက သုံးကြပါတယ် Data ပမာဏအပေါ် မူတည်တော့ Corporation အကြီးကြီးတွေမှာပဲ အဲလိုလူတွေရှိတယ် နောက်တော့ Dataset တွေကို Public ကိုချပေးလိုက်ပြီးတော့ ပြိုင်ခိုင်းတာမျိုးတွေ ရှိလာတယ် မှတ်မှတ်ရရဆိုရင် ၂၀၀၆ မှာ Netflix ဟာ သူရဲ့ Customer တွေကို Movie Recommendation လုပ်ဖို့အတွက် လက်ရှိသူတို့သုံးနေတဲ့ Score ကို ရာခိုင်နှုံး ဘယ်လောက်အထိ Improve လုပ်နိုင်တဲ့လူကို Grand Prize အတွက် $1 million ဆုပေးမယ်ဆိုပြီး ပြိုင်ပွဲလုပ်တယ် ၂၀၀၉ မှပဲ ပြိုင်ပွဲကနိုင်တဲ့အဖွဲ့ကို ဆုံးဖြတ်လို့ရပြီးတော့ တကယ်လည်း Grand Prize ရသွားပါတယ်။ အဲဒီနောက်မှာ Dataset တွေ ထုတ်ပေးပြီးတော့ ပြိုင်ခိုင်းတဲ့ ပြိုင်ပွဲတွေ ဖြစ်လာတယ် Kaggle ဟာ လူသိများတဲ့ Data Science ပြိုင်ပွဲလုပ်တဲ့နေရာတခုပဲ။
Kaggle မှာ အပျော်တမ်း စမ်းကြည့်လို့ရတဲ့ ပြိုင်ပွဲတွေထဲမှာ Titanic: Machine Learning from Disaster ဆိုတာတခုရှိတယ် Dataset ထဲမှာ Titanic သင်္ဘောပေါ်မှာ လိုက်ပါသွားကြတဲ့ ခရီးသည်တွေရဲ့ Data တွေပါပြီးတော့ ပေးထားတဲ့ Data တွေအပေါ် အခြေခံပြီး အသက်ရှင်မယ် မရှင်ဘူးဆိုတာကို ခန့်မှန်းခိုင်းတယ်။ Data တွေကိုမကြည့်ခင် Titanic အကြောင်း အနည်းဆုံးတော့ အရင်သိဖို့လိုတယ် Titanic ရေခဲတုံးနဲ့ တိုက်မိပြီးတော့ နစ်မြုပ်တဲ့အချိန်မှာ အသက်ကယ်လှေ အလုံအလောက်မရှိလို့ ခရီးသည် ၂၂၂၄ မှာ ၇၂၂ ယောက်ပဲ အသက်ရှင်ခဲ့တယ်။ အသက်ရှင်တဲ့လူတွေမှာ ပထမတန်းခရီးသည်တွေရယ် အမျိုးသမီးတွေနဲ့ ကလေးငယ်တွေက ဦးစားပေးဖြစ်လို့ အဲလိုလူတွေက အသက်ရှင်ဖို့ အခွင့်အရေး ပိုရမယ်လို့ ကနဦးအနေနဲ့ ယူဆလို့ရတယ်။
Data Science ပြိုင်ပွဲတွေရဲ့ ထုံးစံအတိုင်း ပေးထားတဲ့ Data တွေမှာ Train နဲ့ Test ဆိုပြီးတော့ ၂ ခုပေးထားတယ် Train ကိုသုံးပြီးတော့ Model လုပ် ပြီးရင်တော့ Test ကိုသုံးပြီးတော့ ထွက်လာတဲ့ Result ကို Submit လုပ်ခိုင်းပြီးတော့ ပြိုင်ပွဲဝင်ရမှာပေါ့။ Data တွေက အောက်မှာပြထားတဲ့အတိုင်း ပေးထားတယ်။
survival = Survival (0 = No; 1 = Yes)
pclass = Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd)
name = Name
sex = Sex
age = Age
sibsp = Number of Siblings/Spouses Aboard
parch = Number of Parents/Children Aboard
ticket = Ticket Number
fare = Passenger Fare
cabin = Cabin
embarked = Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton)
ကနဦး ယူဆချက်အရဆိုရင် pclass, sex, age ဟာ အရေးပါလိမ့်မယ် ဒုတိယအရေးကြီးနိုင်တာက cabin လည်းဖြစ်နိုင်တယ် ရေခဲတုံးနဲ့ တိုက်မိတဲ့အပိုင်းက cabin တွေက ခရီးသည်တွေဟာ ထွက်နိုင်ချင်မှ ထွက်နိုင်တော့မယ် sibsp, parch တွေက သက်ဆိုင်ချင်လည်း သက်ဆိုင်နိုင်တယ် လူသဘာဝအရ ကိုယ်လွတ်မရုံးနိုင်တာ ရှိကောင်းရှိနိုင်တယ် name, ticket, fare, embarked တွေကတော့ သာမန်အရကတော့ ယုတ္တိမတန်ပေမယ့် ဂဏန်းဗေဒင်အရ ဘယ်နာမည်တွေက ကံကောင်းထောက်မတယ်တို့ လက်မှတ်နံပတ်မှာ လာဘ်ကောင်းတဲ့ နံပါတ်တွေ ရတဲ့လူတွေတို့ ဘယ်ဆိပ်ကမ်းက ခရီးသည်တွေက ကံပိုကောင်းလို့တို့ ဆက်စပ်မှုများ ရှိနေမှပဲ တိုက်ရိုက်အနေနဲ့ သက်ဆိုင်လိမ့်မယ်။ မဖြစ်နိုင်ဘူးတော့ ပြောလို့မရဘူး Quantitative Analysis မှာ ယုတ္တိမတန်ပဲ မှန်နေတာလည်း တခါတရံမှာ တွေ့ရတတ်တာလည်း ရှိပါတယ် အဲဒီတော့ သုံးသင့် မသုံးသင့်က Statistically ပဲ ဆုံးဖြတ်ရလိမ့်မယ်။
Data တွေရဲ့ Relation ကို မစဉ်းစားခင်မှာ ပထမဆုံးအနေနဲ့ Data တွေရဲ့ အခြေအနေကို ကြည့်ဖို့လိုသေးတယ် ဒီမှာကတော့ Program ရေးရမှာပျင်းတာရယ် မလိုအပ်ဘူး ယူဆတာရယ်နဲ့ R ကိုသုံးထားတယ် R သုံးမှရယ် မဟုတ်ပါဘူး ဘာသုံးသုံးရပါတယ် အများအားဖြင့် Data Analysis တွေမှာတော့ R နဲ့ Python ကိုတော့ အသုံးများတယ် အဓိကအချက်ကတော့ Analytics အတွက် လိုအပ်တဲ့ Library တွေ အလွယ်တကူ ရနိုင်တာကြောင့် သုံးကြတာပါ။
> train = read.csv("train.csv")
> test = read.csv("test.csv")
> head(train)
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 S
2 1 1 Cumings, Mrs. John Bradley female 38 1 0 PC 17599 71.2833 C85 C
3 1 3 Heikkinen, Miss. Laina female 26 0 0 3101282 7.9250 S
4 1 1 Futrelle, Mrs. Jacques Heath female 35 1 0 113803 53.1000 C123 S
5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 S
6 0 3 Moran, Mr. James male NA 0 0 330877 8.4583 Q
နမူနာ Data နည်းနည်းထုတ်ကြည့်တော့ ပြဿနာရှိတဲ့နိုင်တဲ့ Data မျိုးရယ်တော့ သိပ်မတွေ့ရပါဘူး Ticket တခုမှာပဲ Data တွေရဲ့ Format ဟာ အလွယ်တကူ မှန်းလို့မရတဲ့ အခြေအနေမှာရှိတယ် နောက်တဆင့်အနေနဲ့ Data တွေရဲ့ အခြေအနေကို Overall ကြည့်ဖို့လိုဦးမယ်။
> str(train)
'data.frame': 891 obs. of 12 variables:
$ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ...
$ Survived : int 0 1 1 1 0 0 0 0 1 1 ...
$ Pclass : int 3 1 3 1 3 3 1 3 3 2 ...
$ Name : Factor w/ 891 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ...
$ Sex : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
$ Age : num 22 38 26 35 35 NA 54 2 27 14 ...
$ SibSp : int 1 1 0 1 0 0 0 3 0 1 ...
$ Parch : int 0 0 0 0 0 0 0 1 2 0 ...
$ Ticket : Factor w/ 681 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ...
$ Fare : num 7.25 71.28 7.92 53.1 8.05 ...
$ Cabin : Factor w/ 148 levels "","A10","A14",..: 1 83 1 57 1 1 131 1 1 1 ...
$ Embarked : Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...
> summary(train$Age)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.42 20.12 28.00 29.70 38.00 80.00 177
Data တွေထဲမှာ PassengerId က သုံးဖို့မလိုအပ်ဘူး Survived က အသက်ရှင်တယ် မရှင်ဘူးအတွက် 0 or 1 ဆိုပြီး integer အနေနဲ့ပြထားတယ် ဖြစ်သင့်တာက category data ဖြစ်သင့်ပေမယ့် level ၂ ခုပဲရှိတော့ datatype မပြောင်းလည်း ရတော့ရတယ် Pclass က integer ဖြစ်နေတာ နည်းနည်းပြဿနာရှိတယ် level ၃ ခုရှိတဲ့အတွက် integer ဖြစ်နေရင် 1st class နဲ့ 3rd class ရဲ့ distance ဟာ 1st class နဲ့ 2nd class အကွာအဝေးရဲ့ ၂ ဆရှိနေတယ် Pclass ကိုတော့ category data အဖြစ် ပြောင်းသုံးဖို့လိုမယ်။ Missing Data (NA’s) တွေလည်း ပါလာတယ် အသေးစိတ်ကြည့်လိုက်ရင် Age မှာ ပျောက်နေတဲ့ Data ဟာ 177 ခုရှိတယ် စုစုပေါင်း 891 မှာ 177 ဆိုတာကတော့ အတော်လေးများလွန်းတယ် Age ဟာ ကနဦးယူဆချက်မှာလည်း အရေးကြီးတဲ့ Field ဖြစ်တဲ့အတွက် ခန့်မှန်းချက်ကို အတော်လေး ထိခိုက်နိုင်တယ်။ ဖယ်ထုတ်လိုက်ရင်လည်း training data သိပ်နည်းသွားမယ် NA’s တွေပဲလည်း ထားလို့မဖြစ်တဲ့အတွက် တခုခုနဲ့တော့ အစားထိုးပေးရမယ် အလွယ်ဆုံးနည်းဖြစ်တဲ့ Mean Value နဲ့ အစားထိုးလိုက်တယ်။ Test Dataset ကို ကြည့်ရင်လည်း Age တွေမှာ NA တွေပါနေတယ် Fare မှာလည်း NA တခုပါတာတွေ့လိမ့်မယ် အဲဒါတွေကိုလည်း Mean နဲ့အစားထိုးလိုက်တယ်။
> library(zoo)
> train$Age = na.aggregate(train$Age)
> test$Age = na.aggregate(test$Age)
> test$Fare = na.aggregate(test$Fare)
အခုအချိန်မှာ Data Cleaning က ရှုပ်ရှုပ်ထွေးထွေး မဟုတ်တဲ့အတွက် လိုအပ်ရင် ပြန်လုပ်လို့ လွယ်ပေမယ့် Experiment ဟာ အကြိမ်ကြိမ်အခါခါ ထပ်လုပ်မှာဖြစ်လို့ မေ့သွားတာမျိုး မဖြစ်ရအောင် Clean လုပ်ပြီးသား Data တွေကို Clean Dataset တွေအဖြစ် သတ်သတ်ခွဲပြီး ရေးထားလိုက်ပြီး လိုအပ်တဲ့အခါ Clean Dataset ကိုပဲ ပြန်ဖတ်လိုက်တာက မူရင်း Raw Data တွေကို ပြန်ပြီးတော့ Process လုပ်တာထက် ပိုအဆင်ပြေတယ်။
> write.csv(train, file = "train_mean_na.csv", row.names = FALSE)
> write.csv(test, file = "test_mean_na.csv", row.names = FALSE)
အခုအချိန်အထိက Data Analytics အကြောင်း Introduction ရယ် Data Science ပြိုင်ပွဲတွေရဲ့ အကြောင်းတွေရယ် Titanic Dataset အကြောင်းနဲ့ Data တွေရဲ့ Overview အထိပဲရေးရသေးတယ် Analytics Process တွေအကြောင်းက ရှည်နေပြီဖြစ်လို့ နောက်တပိုင်းမှ Method တွေကို Apply လုပ်တာအတွက် ဆက်ရေးတော့မယ် သာမန်အားဖြင့် ကျူတိုရီရယ်ကို ဘယ်တော့မှမရေးပါဘူး ဆက်ရေးမယ့် အကြောင်းအရာတွေမှာ သုံးထားတဲ့ Programming Language ကို သိပြီးသားလို့ ယူဆထားပြီးဖြစ်သလို Apply လုပ်မယ့် Method and Algorithm တွေကိုလည်း ဘယ်လိုအလုပ်မှန်း နားလည်တယ်လို့ ယူဆပြီးတော့ Analytics Process တွေမှာ ထွက်လာတဲ့ Result အပေါ်မူတည်သုံးသပ်ပြီးတော့ ဘယ်လိုထပ်ပြီးတော့ Improve လုပ်မလဲစသည်ဖြင့် စဉ်းစားပြီးအလုပ်လုပ်တဲ့ အယူအဆကိုပဲ Example အနေနဲ့ ရေးပြတာဖြစ်တဲ့အတွက် ကျူတိုရီရယ်လို့ ခေါ်ချင်ရင်တောင် Abstract Concepts ပဲဖြစ်လိမ့်မယ်။