Uzay Gemisi Titanik

Kozmik bir gizemi çözmek için veri bilimi becerilerinize ihtiyaç duyulan 2912 yılına hoş geldiniz. Dört ışık yılı öteden bir sinyal aldık ve işler pek iyi görünmüyor.

Uzay Gemisi Titanik, bir ay önce fırlatılan yıldızlararası bir yolcu gemisiydi. Gemide neredeyse 13.000 yolcu bulunan gemi, güneş sistemimizden göçmenleri yakın yıldızların yörüngesinde bulunan üç yeni yaşanabilir dış gezegene taşımak üzere ilk yolculuğuna çıktı.

Dikkatsiz Uzay Gemisi Titanic, ilk varış noktası olan kavurucu 55 Cancri E’ye giderken Alpha Centauri’yi dönerken, bir toz bulutunun içine gizlenmiş bir uzay-zaman anormalliğiyle çarpıştı. Ne yazık ki 1000 yıl öncesindeki adaşı ile benzer bir kaderle karşılaştı. Gemi sağlam kalmasına rağmen yolcuların neredeyse yarısı alternatif bir boyuta taşındı!

Katagorilerin Anlamları:

PassengerId: kimlik= gggg_pp ;gggg: seyahat grubunu ifade ederken, pp:gruptaki sırayı genellikle aile üyesini belirtir.

HomePlanet: yolcunun ayrıldığı, ikamet ettiği gezegendir.

CyroSleep: kabindeki yolcuları ifade eder.

Cabin: yolcuların kaldığı kabini güverte numara ve hangi numarada olduklarını ‘deck/num/side’ ile belirtir.

Destination: yolcunun ineceği gezegeni bildirir.

Age: yolcuların yaşlarını gösterir.

VIP: yolcunun özel hizmet için ödeme yapıp yapmadığını gösterir.

RoomService, FoodCourt, ShoppingMall, Spa, VRDeck: yolcunun lüksolanaklar faturasını gösterir.

Transpoted: yollcunun başka boyuta taşınıp taşınmadığını tahmin etmeye çalıştığımız hedef sütunu ifade eder.

test.csv: geride kalan 3/1 lik (4300) yolcu için kişisel kayıtlar, test verisi olarak kullanılacaktır. Görev: bu setteki yolcuların transported değerini tahmin etmek.

sample_submission.csv: doğru formatta bir gönderim dosyasıdır.

PassengerId: test setindeki her yolcu için kimlik.

Transported: hedef. her yolcuiçin true veya false tahmini yapılacak.

İlk olarak train ve test datalarını yüklüyoruz. Dataya başlamak için eksikleri temizliyoruz. str ile veri hakkında bilgi alıyoruz. Daha sonra DataExplorer paketi yardımıyla datayı araştırıp bilgileri gözden geçirerek işe yarayabileceğini düşündüğümüz bilgileri ayıklıyoruz. train için yaptığımız her aşamayı test için de kullanıyoruz. create_report() yaptığımızda bize birçok bilgi verir. Grafikleri de report yardımı ile inceleye biliriz.

library(readr)
train <- read_csv("train.csv")
library(rmarkdown)
paged_table(train)
library(readr)
test <- read_csv("test.csv")
library(DataExplorer)

Temel İstatistikler

Ham Sayımlar

Ad: Değer

Satırlar: 8.693

Sütunlar: 14

Ayrık sütunlar: 8

Sürekli sütunlar: 6

Tüm eksik sütunlar. 0

Eksik gözlemler: 2.324

Satırları Tamamla: 6.606

Toplam gözlem: 121.702

Data Hakkında Veri Grafikleri ve Yorumları

Yüzdelerin gösterildiği alttaki grafikte özelliklere göre değerlendirilmiştir. bu tabloda en yüksek oran yüzde 76 ile complate rows yani satırları tamamlanmış sütunlar iken en düşük oran 1.9 ile missing observation dur.

Eksik veri grafiği bize verilerde hangi oranda eksik olduğunu göstermektedir. Grafiği özet ile yorumladığımızda Transported ve PassengerId de 0.0 oranıyla hiç eksik data bulunmadığını gösterirken en yüksek oranın 2.5 ile CyroSleep te olduğu kanaatine varırız. Diğer katagoriler de 2 nin üzerinde eksik bilgi bulundurarak CyroSleep e yakın oranlardadır.

Histogram grafiğinde de data hakkında farklı bilgiler edinebiliriz. Tek tek incelediğimizde Age grafiğinde 20’li yaşlarda olan kişi sayısı neredeyse 800 e yaklaşmakta, aynı zamanda 80 li yaşlarda neredeyse 0 kişi bulunmakta. Yoğunluk 20-40 arasında yaşanırken, diğer yaşlarda bu oran oldukça düşmektedir. FoodCourt histogram grafiğinde yemeğe harcanan ücret oranları görülmektedir. Çoğu kişi yemeğe neredeyse hiç para harcamamıştır. Ayrıca RoomService, ShoppingMall, Spa ve VRDeck’ te de FoodCourt’a benzer biçimde para harcama oranının oldukça düşük olduğunu görülmektedir.

Çubuk grafiğinde ilk şemada gemideki yolcuların hangi gezegenden oldukları görülmektedir. “ Dünya”, “Europa”, “Mars” ve bilinmeyenlerin olduğu “NA” ile dört katagoride oluşmaktadır. Yolcuların birçoğu dünya gezegeninden olup çok az kısmı da NA’da dır. Dünyalı yolcular 5000 e yakın kişiden oluşurken en az oranla NA’lılar tahmini 200 civarındadır. Destination da ise nerede inecekleri gösterilmektedir. TRAPPİST-le 6000 e yakın kişi ile en fazla orana sahip iken NA tahmini 100-200 kişi ile en düşük orana sahiptir. Yolcuların birçoğunun VIP yolcu olmadığı görülüyor. NA ve VIP yolcu sayısı ise neredeyse birbirine eşittir. Yolcuların Transported oranı ise hem true hem false seçenekleri ile birbirine eşittir.

QQ grafiği, normal olasılık dağılımı ile veri setinin dağılımını karşılaştıran bir grafiktir. Eksenlerde teorik normal dağılımın kuantil değerleri ve veri setinin kuantil değerleri yer alır. Eğer veri seti normal dağılıma yakınsa, QQ grafiği genellikle bir doğru üzerinde olacaktır. grafikte Age değişkeninin duğru üzerinde oldukça düzenli gitmesinden veri setinin normal dağılımda olduğunu söyleyebiliriz. Diğer kategorilerde ise ters L biçiminde bir hareket söz konusudur. Normal dağılıma sahip olmadığı yorumunu yapabiliriz burada.

Korelasyon katsayısının işareti, ilişkinin yönünü; Korelasyon katsayısının büyüklüğü ise ilişkinin derecesini gösterir. ≤ 1 ✓ r =‐1 veya r =1 çıkması, iki değişken arasında tam bir doğrusal ilişkiye işaret eder. ✓ r=0 ise iki değişken arasında (doğrusal) bir ilişki yoktur. Sonucun +1 çıkması iki değişken arasında kuvvetli olumlu ilişkinin bulunduğunu, -1 ise kuvvetli olumsuz ilişkinin bulunduğunu gösterir. Korelasyon katsayısı 0 ‘a yaklaştıkça ilişkinin kuvveti zayıflar, sıfır ise iki değişken arasında doğrusal bir ilişkinin olmadığını gösterir. Grafikten örnek verirsek Cyrosleep ile Age’nin kesiştiği nokta 0.9 değerindedir. Yani neredeyse 1 e yaklaştığı için iki değişken arasında güçlü bir bağın olduğunu söyleyebiliriz. ShoppingMall ile VRDeck’ in kesiştiği noktada de sonuç 0 çıkmıştır yani bu değişkenler arasında bir bağ bulunmamaktadır. CyroSleep true ile CyroSleep false nin kesiştiği noktada -1 değeri bulunmaktadır. Yani bu iki değişken arasında kuvvetli olumsuz ilişki olduğunu söyleyebiliriz.

Temel bileşenler tarafından açıklanan varyans yüzdesi grafiği, veri setinin değişkenliğinin ana kaynaklarını gösterir. Her bir bileşen, veri setindeki farklı varyansın bir ölçüsünü temsil eder. Bu grafik, hangi bileşenlerin toplam varyansın büyük bir kısmını açıkladığını anlamamıza yardımcı olur ve temel bileşenler analizinde hangi bileşenlerin veri setinin toplam varyansının büyük bir kısmını açıkladığını gösterir. Dikey eksen üzerindeki açıklanan varyans oranları, her bir temel bileşenin toplam varyansın ne kadarını kapsadığını belirtir. Yatay eksendeki temel bileşenler, veri setindeki farklı özelliklerin kombinasyonlarını temsil eder. Ayrıca, veri setindeki bazı özelliklerin (örneğin, PassengerId, Cabin ve Name) çok sayıda kategori içerdiği ve bu nedenle analizden çıkarıldığı belirtilmiş.

Aşağıdaki temel bileşenler analizi grafiğinde özelliklerin görece önemlilikleri değerlendirilmiştir. Bazı özellikler negatif yönlü iken bazıları da pozitif yönlüdür.

library(tidyverse)
library(explore)
train %>% describe_all()
## # A tibble: 14 × 8
##    variable     type     na na_pct unique   min   mean   max
##    <chr>        <chr> <int>  <dbl>  <int> <dbl>  <dbl> <dbl>
##  1 PassengerId  chr       0    0     8693    NA  NA       NA
##  2 HomePlanet   chr     201    2.3      4    NA  NA       NA
##  3 CryoSleep    lgl     217    2.5      3     0   0.36     1
##  4 Cabin        chr     199    2.3   6561    NA  NA       NA
##  5 Destination  chr     182    2.1      4    NA  NA       NA
##  6 Age          dbl     179    2.1     81     0  28.8     79
##  7 VIP          lgl     203    2.3      3     0   0.02     1
##  8 RoomService  dbl     181    2.1   1274     0 225.   14327
##  9 FoodCourt    dbl     183    2.1   1508     0 458.   29813
## 10 ShoppingMall dbl     208    2.4   1116     0 174.   23492
## 11 Spa          dbl     183    2.1   1328     0 311.   22408
## 12 VRDeck       dbl     188    2.2   1307     0 305.   24133
## 13 Name         chr     200    2.3   8474    NA  NA       NA
## 14 Transported  lgl       0    0        2     0   0.5      1

Train

Verileri Düzenleme

Burada verileri düzenlerken birkaç aşamadan geçiyoruz. Bazı özellikleri ayırırken,bazı işimize yaramayacağını düşündüğümüz verilerden kurtuluyoruz. datanın içinde boşluklara NA yazıp sonrada ya sıfır veriyoruz değerlere yada Age gibi özelliklerin ortalamasını alıyoruz. İşimize yaramayan bilgileri ‘select’ komutu ile siliyoruz. Tabi bu işlemleri hem train hem test için uyguluyoruz. En son bütün işlemleri yaptığımızda test ve train dataları için NA’ larda temizlenmeyen kategori var mı diye kontrol edip tahminler için bazı algoritmaları kullanıyoruz.

train[c('ailenum' , 'ailesira  ')] <- str_split_fixed(train$PassengerId, "_", 2)
test[c('ailenum' , 'ailesira  ')] <- str_split_fixed(test$PassengerId, "_", 2)
train[c('deck','num','side')] <- str_split_fixed(train$Cabin,'/', 3)
test[c('deck','num','side')] <- str_split_fixed(test$Cabin,'/', 3)
train[train == ' '] <- NA
test[test == ' '] <- NA
train %>% describe_all()
## # A tibble: 19 × 8
##    variable       type     na na_pct unique   min   mean   max
##    <chr>          <chr> <int>  <dbl>  <int> <dbl>  <dbl> <dbl>
##  1 "PassengerId"  chr       0    0     8693    NA  NA       NA
##  2 "HomePlanet"   chr     201    2.3      4    NA  NA       NA
##  3 "CryoSleep"    lgl     217    2.5      3     0   0.36     1
##  4 "Cabin"        chr     199    2.3   6561    NA  NA       NA
##  5 "Destination"  chr     182    2.1      4    NA  NA       NA
##  6 "Age"          dbl     179    2.1     81     0  28.8     79
##  7 "VIP"          lgl     203    2.3      3     0   0.02     1
##  8 "RoomService"  dbl     181    2.1   1274     0 225.   14327
##  9 "FoodCourt"    dbl     183    2.1   1508     0 458.   29813
## 10 "ShoppingMall" dbl     208    2.4   1116     0 174.   23492
## 11 "Spa"          dbl     183    2.1   1328     0 311.   22408
## 12 "VRDeck"       dbl     188    2.2   1307     0 305.   24133
## 13 "Name"         chr     200    2.3   8474    NA  NA       NA
## 14 "Transported"  lgl       0    0        2     0   0.5      1
## 15 "ailenum"      chr       0    0     6217    NA  NA       NA
## 16 "ailesira  "   chr       0    0        8    NA  NA       NA
## 17 "deck"         chr     199    2.3      9    NA  NA       NA
## 18 "num"          chr       0    0     1818    NA  NA       NA
## 19 "side"         chr       0    0        3    NA  NA       NA
train <- train %>% select(-Cabin)
test <- test %>% select(-Cabin)
unique(train$HomePlanet)
## [1] "Europa" "Earth"  "Mars"   NA
levels(train$HomePlanet)
## NULL
train$HomePlanet <- addNA(train$HomePlanet)
test$HomePlanet <- addNA(test$HomePlanet)
levels(train$HomePlanet)
## [1] "Earth"  "Europa" "Mars"   NA
levels(train$HomePlanet)[is.na(levels(train$HomePlanet))] <- "NA"
levels(test$HomePlanet)[is.na(levels(test$HomePlanet))] <- "NA"
levels(train$HomePlanet)
## [1] "Earth"  "Europa" "Mars"   "NA"
train %>% describe_all()
## # A tibble: 18 × 8
##    variable       type     na na_pct unique   min   mean   max
##    <chr>          <chr> <int>  <dbl>  <int> <dbl>  <dbl> <dbl>
##  1 "PassengerId"  chr       0    0     8693    NA  NA       NA
##  2 "HomePlanet"   fct       0    0        4    NA  NA       NA
##  3 "CryoSleep"    lgl     217    2.5      3     0   0.36     1
##  4 "Destination"  chr     182    2.1      4    NA  NA       NA
##  5 "Age"          dbl     179    2.1     81     0  28.8     79
##  6 "VIP"          lgl     203    2.3      3     0   0.02     1
##  7 "RoomService"  dbl     181    2.1   1274     0 225.   14327
##  8 "FoodCourt"    dbl     183    2.1   1508     0 458.   29813
##  9 "ShoppingMall" dbl     208    2.4   1116     0 174.   23492
## 10 "Spa"          dbl     183    2.1   1328     0 311.   22408
## 11 "VRDeck"       dbl     188    2.2   1307     0 305.   24133
## 12 "Name"         chr     200    2.3   8474    NA  NA       NA
## 13 "Transported"  lgl       0    0        2     0   0.5      1
## 14 "ailenum"      chr       0    0     6217    NA  NA       NA
## 15 "ailesira  "   chr       0    0        8    NA  NA       NA
## 16 "deck"         chr     199    2.3      9    NA  NA       NA
## 17 "num"          chr       0    0     1818    NA  NA       NA
## 18 "side"         chr       0    0        3    NA  NA       NA
train <- train %>% 
  group_by(HomePlanet, Destination) %>% 
  mutate(Age = ifelse(is.na(Age), mean(Age, na.rm = TRUE), Age))
test <- test %>% 
  group_by(HomePlanet, Destination) %>% 
  mutate(Age = ifelse(is.na(Age), mean(Age, na.rm = TRUE), Age))
train$CryoSleep <- addNA(train$CryoSleep)
test$CryoSleep <- addNA(test$CryoSleep)
levels(train$CryoSleep)[is.na(levels(train$CryoSleep))] <- "NA"
levels(test$CryoSleep)[is.na(levels(test$CryoSleep))] <- "NA"
unique(train$Destination)
## [1] "TRAPPIST-1e"   "PSO J318.5-22" "55 Cancri e"   NA
train$Destination <- addNA(train$Destination)
test$Destination <- addNA(test$Destination)
train$side <- addNA(train$side)
test$side <- addNA(test$side)
levels(train$side)[is.na(levels(train$side))] <- "NA"
levels(test$side)[is.na(levels(test$side))] <- "NA"
train$VIP <- addNA(train$VIP)
test$VIP <- addNA(test$VIP)
levels(train$VIP)[is.na(levels(train$VIP))] <- "NA"
levels(test$VIP)[is.na(levels(test$VIP))] <- "NA"
train <- train %>% 
  group_by(HomePlanet, Destination) %>% 
  mutate_at(vars(RoomService), ~replace_na(., mean(., na.rm = TRUE)))
test <- test %>% 
  group_by(HomePlanet, Destination) %>% 
  mutate_at(vars(RoomService), ~replace_na(., mean(., na.rm = TRUE)))
train %>% describe_all()
## # A tibble: 18 × 8
##    variable       type     na na_pct unique   min  mean   max
##    <chr>          <chr> <int>  <dbl>  <int> <dbl> <dbl> <dbl>
##  1 "PassengerId"  chr       0    0     8693    NA  NA      NA
##  2 "HomePlanet"   fct       0    0        4    NA  NA      NA
##  3 "CryoSleep"    fct       0    0        3    NA  NA      NA
##  4 "Destination"  fct       0    0        4    NA  NA      NA
##  5 "Age"          dbl       0    0       91     0  28.8    79
##  6 "VIP"          fct       0    0        3    NA  NA      NA
##  7 "RoomService"  dbl       0    0     1287     0 225.  14327
##  8 "FoodCourt"    dbl     183    2.1   1508     0 458.  29813
##  9 "ShoppingMall" dbl     208    2.4   1116     0 174.  23492
## 10 "Spa"          dbl     183    2.1   1328     0 311.  22408
## 11 "VRDeck"       dbl     188    2.2   1307     0 305.  24133
## 12 "Name"         chr     200    2.3   8474    NA  NA      NA
## 13 "Transported"  lgl       0    0        2     0   0.5     1
## 14 "ailenum"      chr       0    0     6217    NA  NA      NA
## 15 "ailesira  "   chr       0    0        8    NA  NA      NA
## 16 "deck"         chr     199    2.3      9    NA  NA      NA
## 17 "num"          chr       0    0     1818    NA  NA      NA
## 18 "side"         fct       0    0        3    NA  NA      NA
hist(train$FoodCourt)

train <- train %>% mutate(FoodCourt =  coalesce(FoodCourt, 0))
test<- test %>% mutate(FoodCourt =  coalesce(FoodCourt, 0))
train <- train %>% mutate(ShoppingMall = coalesce(ShoppingMall, 0),
                             Spa = coalesce(Spa, 0),
                             VRDeck = coalesce(VRDeck, 0))
test <- test %>% mutate(ShoppingMall = coalesce(ShoppingMall, 0),
                             Spa = coalesce(Spa, 0),
                             VRDeck = coalesce(VRDeck, 0))
train <- train %>% select(-Name)
test <- test %>% select(-Name)
train$deck <- addNA(train$deck)
test$deck <- addNA(test$deck)
levels(train$deck)[is.na(levels(train$deck))] <- "NA"
levels(test$deck)[is.na(levels(test$deck))] <- "NA"
train %>% describe_all()
## # A tibble: 17 × 8
##    variable       type     na na_pct unique   min  mean   max
##    <chr>          <chr> <int>  <dbl>  <int> <dbl> <dbl> <dbl>
##  1 "PassengerId"  chr       0      0   8693    NA  NA      NA
##  2 "HomePlanet"   fct       0      0      4    NA  NA      NA
##  3 "CryoSleep"    fct       0      0      3    NA  NA      NA
##  4 "Destination"  fct       0      0      4    NA  NA      NA
##  5 "Age"          dbl       0      0     91     0  28.8    79
##  6 "VIP"          fct       0      0      3    NA  NA      NA
##  7 "RoomService"  dbl       0      0   1287     0 225.  14327
##  8 "FoodCourt"    dbl       0      0   1507     0 448.  29813
##  9 "ShoppingMall" dbl       0      0   1115     0 170.  23492
## 10 "Spa"          dbl       0      0   1327     0 305.  22408
## 11 "VRDeck"       dbl       0      0   1306     0 298.  24133
## 12 "Transported"  lgl       0      0      2     0   0.5     1
## 13 "ailenum"      chr       0      0   6217    NA  NA      NA
## 14 "ailesira  "   chr       0      0      8    NA  NA      NA
## 15 "deck"         fct       0      0      9    NA  NA      NA
## 16 "num"          chr       0      0   1818    NA  NA      NA
## 17 "side"         fct       0      0      3    NA  NA      NA
test %>% describe_all()
## # A tibble: 16 × 8
##    variable       type     na na_pct unique   min  mean   max
##    <chr>          <chr> <int>  <dbl>  <int> <dbl> <dbl> <dbl>
##  1 "PassengerId"  chr       0      0   4277    NA  NA      NA
##  2 "HomePlanet"   fct       0      0      4    NA  NA      NA
##  3 "CryoSleep"    fct       0      0      3    NA  NA      NA
##  4 "Destination"  fct       0      0      4    NA  NA      NA
##  5 "Age"          dbl       0      0     91     0  28.7    79
##  6 "VIP"          fct       0      0      3    NA  NA      NA
##  7 "RoomService"  dbl       0      0    848     0 219.  11567
##  8 "FoodCourt"    dbl       0      0    902     0 429.  25273
##  9 "ShoppingMall" dbl       0      0    715     0 173.   8292
## 10 "Spa"          dbl       0      0    833     0 296.  19844
## 11 "VRDeck"       dbl       0      0    796     0 305.  22272
## 12 "ailenum"      chr       0      0   3063    NA  NA      NA
## 13 "ailesira  "   chr       0      0      8    NA  NA      NA
## 14 "deck"         fct       0      0      9    NA  NA      NA
## 15 "num"          chr       0      0   1506    NA  NA      NA
## 16 "side"         fct       0      0      3    NA  NA      NA
train$aile <- ifelse(duplicated(train$ailenum) | duplicated(train$ailenum, fromLast = TRUE), 1, 0)
test$aile <- ifelse(duplicated(test$ailenum) | duplicated(test$ailenum, fromLast = TRUE), 1, 0)
train <- train %>% select(-c(ailenum, "ailesira  ", num))
test <- test %>% select(-c(ailenum, "ailesira  ", num))

Tahmin Hesaplama Algoritmaları

Yaptığımız işlemler sonrasında tahminlerimizi kontrol etmek için kullanılan bazı algoritmalardan faydalanıyoruz. Benim kullandığım algoritmalar ; Logistic Regresyon, SVM Radial ve Decision Trees.

Logistic Regresyon

Bu algoritma olasılıkları hesaplar ve sınıflara ayırır. Logistic Regresyon direkt tahmin edilen veriyi değil katagorik tahmin etmek istediğimiz sınıfın olasılığını veren algoritmadır. İlk olarak bu algoritmayı kullandım. test ve train data setlerinde PassengerId i kullanmadığımız için birinci satırı almıyoruz ve 14 değişkenden yararlanıyoruz. sonra tahminimi % 70 ve 30 olarak ikiye ayırıyorum oluşturulan trainin ve testing setlerde doğru sonuçlar ile karşılaştırma yaparak ilerliyoruz. Tahmin adını vererek oluşturulan fonksiyonda logistici tahmin ediyoruz.Burada 11. sütunu kullanmayarak tahmin yapıyoruz. Sonra tahminimizi değerlendiriyoruz, eğer 0.5 ten büyük ise sonucu 1, küçük ise sonucu 0 alıyoruz. Gerçek değerler testing setinde gösteriliyor. Transported da true, false olarak gösterildiği için tahminlerimizi karşılaştırmak için bu katagoiyi de 1 veya 0 a çeviriyoruz. Sonuç true ise 1, false ise 0 çıkacak şekilde kodu girerek chunk ı çalıştırıyoruz. cm komutu ile kendi sonuçlarım ile gerçek sonuçları karşılaştırıyoruz. Ortalamayı bulmak için yanlış ve doğru larda doğru tahmin ettiklerimin toplamını bütün değerlere bölüyorum. Son olarak bütün datayı kullanarak test ediyoruz. burada karşılaştırmayı yaparken sonuç bir önceki gibi 1 ve 0 değil true ve false olarak yapıyoruz. daha sonraki aşamada kaggle ın bizden istediği formata bakıyoruz. sumble_submission ı indirerekk kontrol ediyoruz. PassengerId si olsun ve true-false diye ayırmamızı istemektedir. Gerekli kodları girerek transported ı true/false diye ayırıp dosyamızı yapıyoruz. detaylardan kurtulup işlemleri tamamlıyor ve Kaggle a yüklemeye hazır oluyoruz.

train_set <- train[2:15]
test_set <- test[2:14]
library(caTools)
set.seed(123)
split = sample.split(train_set$Transported, SplitRatio = 0.7)
training_set = subset(train_set, split == TRUE)
testing_set = subset(train_set, split == FALSE)
logistic <- glm(formula = Transported ~ .,
                family = binomial,
                data = training_set)
tahmin = predict(logistic, type = 'response', newdata = testing_set[-11])
y_pred = ifelse(tahmin > 0.5, 1, 0)
y_true <- ifelse(testing_set[11] == TRUE, 1, 0)
Cm =table(y_true, y_pred)
Cm
##       y_pred
## y_true    0    1
##      0  971  324
##      1  219 1094
(971+1094)/(971+1094+324+219)
## [1] 0.7917945
logistic_son = glm(formula = Transported ~ .,
                   family = binomial,
                   data = train_set)
tahmin = predict(logistic_son, type = 'response' , newdata = test_set)
y_pred = ifelse(tahmin > 0.5, TRUE, FALSE)
Transported <- as.character(y_pred)
PassengerId <- test$PassengerId
Transported <- as.vector(Transported)
submission <- cbind(PassengerId, Transported)
submission <- as.data.frame(submission)
library(stringr)
submission$Transported <-str_to_title(submission$Transported)
write.csv(submission, "submission_logistic.csv", row.names = FALSE,
          quote = FALSE)

SVM radial (kernel)

SUPPORT VECTOR MACHINES (SVM) uygulaması kolay, genellikle iyi genelleştirme performansı gösteren, birçok problemi çözebilen bir algoritmadır. bu algoritma hem doğrusal hem de doğrusal olmayan verilere uygulanabilir. Yüksek doğruluk oranına sahiptir. Karmaşık ssınıfmodellerini sınıflandırabilir ve çoksayıda bağımsızdeğişkenle çalışabilir. Bu algoritmayı kullanırken ilk olarak indirilmesi gereken dosyayı indirip gerekli fonksiyonları yazmaya başlıyoruz. Bir önceki tahmin denemesine benzer şekilde ilerleyip oluşturduğımuz dosyaya isim vererek işlemleri tamamlıyoruz.

library(e1071)
svm_ker_son = svm(Transported ~ ., data = train_set,
                  type = 'C-classification',
                  kernel ='radial')
preds <- predict(svm_ker_son, newdata = test_set, type = "raw") %>%
  data.frame()
y_pred = preds$.
Transported <- as.character(y_pred)
PassengerId <- test$PassengerId
Transported <- as.vector(Transported)
submission <- cbind(PassengerId, Transported)
submission <- as.data.frame(submission)
submission$Transported <- str_to_title(submission$Transported)
write.csv(submission, "sub_karnelsvm.csv", row.names = FALSE,
          quote = FALSE)

Decision Trees

Burada veri kümemizden bir karar ağacı çıkarıyoruz. Oluşan grafiğin hem özetini almak hemde ağacın grafiğini almak için gerekli kodları kullanıyoruz. burada bize bir ağaç verecek. bu ağaca göre Transported olacak kişi CyroSleep aldıysa (CyroSleep = true) Transport olmuştur. eğer CyroSleep almayıp RoomSevice ye daha fazla para ödüyor ise Transported olmadıklarını gösteriyor. RandomForest bu ağacın binlercesini ifade etmektedir. Daha sonra bir dosya haline getirip Kaggle a yüklemeye hazırlanmış oluyoruz.

library(rpart)
library(rpart.plot)
library(randomForest)
library(caret)
training_set$Transported <- as.factor(training_set$Transported)
testing_set$Transported <- as.factor(testing_set$Transported)
train_set$Transported <- as.factor(train_set$Transported)
fit_tree <- rpart(Transported ~ ., data = training_set)
summary(fit_tree)
## Call:
## rpart(formula = Transported ~ ., data = training_set)
##   n= 6085 
## 
##           CP nsplit rel error    xerror       xstd
## 1 0.43145695      0 1.0000000 1.0000000 0.01291462
## 2 0.03697572      1 0.5685430 0.5685430 0.01162490
## 3 0.01357616      4 0.4576159 0.4698675 0.01092261
## 4 0.01000000      5 0.4440397 0.4599338 0.01084121
## 
## Variable importance
##    CryoSleep          Spa       VRDeck  RoomService    FoodCourt ShoppingMall 
##           42           16           15           12            9            4 
##   HomePlanet         deck 
##            2            1 
## 
## Node number 1: 6085 observations,    complexity param=0.431457
##   predicted class=TRUE   expected loss=0.4963024  P(node) =1
##     class counts:  3020  3065
##    probabilities: 0.496 0.504 
##   left son=2 (3957 obs) right son=3 (2128 obs)
##   Primary splits:
##       CryoSleep    splits as  LRL, improve=641.3171, (0 missing)
##       RoomService  < 0.5972222 to the right, improve=387.2327, (0 missing)
##       Spa          < 0.5       to the right, improve=349.1110, (0 missing)
##       VRDeck       < 0.5       to the right, improve=336.6729, (0 missing)
##       ShoppingMall < 0.5       to the right, improve=207.4920, (0 missing)
##   Surrogate splits:
##       Spa          < 0.5       to the right, agree=0.715, adj=0.185, (0 split)
##       VRDeck       < 0.5       to the right, agree=0.702, adj=0.148, (0 split)
##       FoodCourt    < 0.5       to the right, agree=0.700, adj=0.142, (0 split)
##       RoomService  < 0.5972222 to the right, agree=0.699, adj=0.138, (0 split)
##       ShoppingMall < 0.5       to the right, agree=0.685, adj=0.099, (0 split)
## 
## Node number 2: 3957 observations,    complexity param=0.03697572
##   predicted class=FALSE  expected loss=0.3353551  P(node) =0.6502876
##     class counts:  2630  1327
##    probabilities: 0.665 0.335 
##   left son=4 (1008 obs) right son=5 (2949 obs)
##   Primary splits:
##       RoomService < 365.5     to the right, improve=94.13509, (0 missing)
##       Age         < 12.5      to the right, improve=88.06518, (0 missing)
##       Spa         < 241.5     to the right, improve=78.42037, (0 missing)
##       FoodCourt   < 2168      to the left,  improve=62.77526, (0 missing)
##       VRDeck      < 420.5     to the right, improve=56.53137, (0 missing)
##   Surrogate splits:
##       HomePlanet splits as  RRLR, agree=0.794, adj=0.191, (0 split)
##       deck       splits as  RRRLRRRLR, agree=0.751, adj=0.023, (0 split)
##       Age        < 78.5      to the right, agree=0.746, adj=0.002, (0 split)
## 
## Node number 3: 2128 observations
##   predicted class=TRUE   expected loss=0.1832707  P(node) =0.3497124
##     class counts:   390  1738
##    probabilities: 0.183 0.817 
## 
## Node number 4: 1008 observations
##   predicted class=FALSE  expected loss=0.1488095  P(node) =0.1656532
##     class counts:   858   150
##    probabilities: 0.851 0.149 
## 
## Node number 5: 2949 observations,    complexity param=0.03697572
##   predicted class=FALSE  expected loss=0.3991183  P(node) =0.4846343
##     class counts:  1772  1177
##    probabilities: 0.601 0.399 
##   left son=10 (965 obs) right son=11 (1984 obs)
##   Primary splits:
##       Spa          < 205       to the right, improve=122.17800, (0 missing)
##       VRDeck       < 135.5     to the right, improve= 97.03283, (0 missing)
##       Age          < 12.5      to the right, improve= 61.88060, (0 missing)
##       ShoppingMall < 691.5     to the left,  improve= 44.12198, (0 missing)
##       FoodCourt    < 2200.5    to the left,  improve= 41.30443, (0 missing)
##   Surrogate splits:
##       HomePlanet splits as  RLRR, agree=0.700, adj=0.083, (0 split)
##       deck       splits as  LRLRRRRRR, agree=0.686, adj=0.040, (0 split)
##       VRDeck     < 4035.5    to the right, agree=0.677, adj=0.012, (0 split)
##       FoodCourt  < 3197.5    to the right, agree=0.676, adj=0.009, (0 split)
##       Age        < 65.5      to the right, agree=0.675, adj=0.006, (0 split)
## 
## Node number 10: 965 observations
##   predicted class=FALSE  expected loss=0.1927461  P(node) =0.1585867
##     class counts:   779   186
##    probabilities: 0.807 0.193 
## 
## Node number 11: 1984 observations,    complexity param=0.03697572
##   predicted class=FALSE  expected loss=0.499496  P(node) =0.3260477
##     class counts:   993   991
##    probabilities: 0.501 0.499 
##   left son=22 (645 obs) right son=23 (1339 obs)
##   Primary splits:
##       VRDeck       < 233.5     to the right, improve=129.94320, (0 missing)
##       FoodCourt    < 2071      to the left,  improve= 47.58535, (0 missing)
##       HomePlanet   splits as  LRRL, improve= 38.86559, (0 missing)
##       Age          < 12.5      to the right, improve= 30.13728, (0 missing)
##       ShoppingMall < 1248.5    to the left,  improve= 28.16548, (0 missing)
##   Surrogate splits:
##       FoodCourt   < 6836      to the right, agree=0.681, adj=0.020, (0 split)
##       deck        splits as  RRLRRRRRL, agree=0.681, adj=0.019, (0 split)
##       VIP         splits as  RLR, agree=0.677, adj=0.006, (0 split)
##       RoomService < 361       to the right, agree=0.676, adj=0.005, (0 split)
##       side        splits as  LRR-, agree=0.676, adj=0.003, (0 split)
## 
## Node number 22: 645 observations,    complexity param=0.01357616
##   predicted class=FALSE  expected loss=0.2387597  P(node) =0.1059984
##     class counts:   491   154
##    probabilities: 0.761 0.239 
##   left son=44 (578 obs) right son=45 (67 obs)
##   Primary splits:
##       FoodCourt  < 2860.5    to the left,  improve=48.108870, (0 missing)
##       deck       splits as  LRRLLLL-R, improve=17.464090, (0 missing)
##       HomePlanet splits as  LRLL, improve=15.574760, (0 missing)
##       VRDeck     < 563       to the right, improve= 5.113637, (0 missing)
##       side       splits as  RLR-, improve= 4.693095, (0 missing)
##   Surrogate splits:
##       Spa < 193       to the left,  agree=0.899, adj=0.03, (0 split)
## 
## Node number 23: 1339 observations
##   predicted class=TRUE   expected loss=0.3749066  P(node) =0.2200493
##     class counts:   502   837
##    probabilities: 0.375 0.625 
## 
## Node number 44: 578 observations
##   predicted class=FALSE  expected loss=0.1730104  P(node) =0.09498767
##     class counts:   478   100
##    probabilities: 0.827 0.173 
## 
## Node number 45: 67 observations
##   predicted class=TRUE   expected loss=0.1940299  P(node) =0.01101068
##     class counts:    13    54
##    probabilities: 0.194 0.806
rpart.plot(fit_tree)

preds = predict(fit_tree, newdata = testing_set[-11], type = "class")
y_pred = ifelse(preds == TRUE, TRUE, FALSE)
cm = table(y_true, y_pred)
cm
##       y_pred
## y_true FALSE TRUE
##      0   879  416
##      1   195 1118
(879+1118)/(879+1118+195+416)
## [1] 0.7657209
fit_tree <- rpart(Transported ~ ., data = train_set)
summary(fit_tree)
## Call:
## rpart(formula = Transported ~ ., data = train_set)
##   n= 8693 
## 
##           CP nsplit rel error    xerror        xstd
## 1 0.43244496      0 1.0000000 1.0000000 0.010803454
## 2 0.03437621      1 0.5675550 0.5675550 0.009719864
## 3 0.01000000      4 0.4644264 0.4743917 0.009167976
## 
## Variable importance
##    CryoSleep          Spa       VRDeck  RoomService    FoodCourt ShoppingMall 
##           45           17           15           11            7            4 
##   HomePlanet 
##            2 
## 
## Node number 1: 8693 observations,    complexity param=0.432445
##   predicted class=TRUE   expected loss=0.4963764  P(node) =1
##     class counts:  4315  4378
##    probabilities: 0.496 0.504 
##   left son=2 (5656 obs) right son=3 (3037 obs)
##   Primary splits:
##       CryoSleep    splits as  LRL, improve=920.2004, (0 missing)
##       RoomService  < 0.5972222 to the right, improve=524.1859, (0 missing)
##       Spa          < 0.5       to the right, improve=514.4709, (0 missing)
##       VRDeck       < 0.5       to the right, improve=479.5694, (0 missing)
##       ShoppingMall < 0.5       to the right, improve=302.4414, (0 missing)
##   Surrogate splits:
##       Spa          < 0.5       to the right, agree=0.716, adj=0.187, (0 split)
##       FoodCourt    < 0.5       to the right, agree=0.701, adj=0.143, (0 split)
##       VRDeck       < 0.5       to the right, agree=0.696, adj=0.129, (0 split)
##       RoomService  < 0.5972222 to the right, agree=0.692, adj=0.119, (0 split)
##       ShoppingMall < 0.5       to the right, agree=0.683, adj=0.092, (0 split)
## 
## Node number 2: 5656 observations,    complexity param=0.03437621
##   predicted class=FALSE  expected loss=0.3350424  P(node) =0.6506384
##     class counts:  3761  1895
##    probabilities: 0.665 0.335 
##   left son=4 (1453 obs) right son=5 (4203 obs)
##   Primary splits:
##       RoomService < 346.5     to the right, improve=120.27350, (0 missing)
##       Spa         < 266.5     to the right, improve=113.99320, (0 missing)
##       Age         < 12.5      to the right, improve=109.40550, (0 missing)
##       FoodCourt   < 1331      to the left,  improve= 98.11980, (0 missing)
##       VRDeck      < 417.5     to the right, improve= 75.47684, (0 missing)
##   Surrogate splits:
##       HomePlanet splits as  RRLR, agree=0.789, adj=0.178, (0 split)
##       deck       splits as  RRRLRRRRR, agree=0.747, adj=0.015, (0 split)
##       Age        < 78.5      to the right, agree=0.743, adj=0.001, (0 split)
## 
## Node number 3: 3037 observations
##   predicted class=TRUE   expected loss=0.1824169  P(node) =0.3493616
##     class counts:   554  2483
##    probabilities: 0.182 0.818 
## 
## Node number 4: 1453 observations
##   predicted class=FALSE  expected loss=0.1596696  P(node) =0.167146
##     class counts:  1221   232
##    probabilities: 0.840 0.160 
## 
## Node number 5: 4203 observations,    complexity param=0.03437621
##   predicted class=FALSE  expected loss=0.3956698  P(node) =0.4834925
##     class counts:  2540  1663
##    probabilities: 0.604 0.396 
##   left son=10 (1385 obs) right son=11 (2818 obs)
##   Primary splits:
##       Spa          < 205       to the right, improve=168.85850, (0 missing)
##       VRDeck       < 87.5      to the right, improve=129.93470, (0 missing)
##       Age          < 12.5      to the right, improve= 75.13576, (0 missing)
##       FoodCourt    < 2507.5    to the left,  improve= 63.21254, (0 missing)
##       ShoppingMall < 627       to the left,  improve= 59.06597, (0 missing)
##   Surrogate splits:
##       HomePlanet splits as  RLRR, agree=0.695, adj=0.074, (0 split)
##       deck       splits as  LRLRRRRLR, agree=0.684, adj=0.042, (0 split)
##       FoodCourt  < 3197.5    to the right, agree=0.676, adj=0.017, (0 split)
##       VRDeck     < 2052      to the right, agree=0.672, adj=0.006, (0 split)
##       Age        < 75.5      to the right, agree=0.671, adj=0.003, (0 split)
## 
## Node number 10: 1385 observations
##   predicted class=FALSE  expected loss=0.1935018  P(node) =0.1593236
##     class counts:  1117   268
##    probabilities: 0.806 0.194 
## 
## Node number 11: 2818 observations,    complexity param=0.03437621
##   predicted class=FALSE  expected loss=0.4950319  P(node) =0.3241689
##     class counts:  1423  1395
##    probabilities: 0.505 0.495 
##   left son=22 (813 obs) right son=23 (2005 obs)
##   Primary splits:
##       VRDeck       < 355       to the right, improve=186.83840, (0 missing)
##       FoodCourt    < 2069.5    to the left,  improve= 64.16646, (0 missing)
##       HomePlanet   splits as  LRRL, improve= 48.55098, (0 missing)
##       ShoppingMall < 1248.5    to the left,  improve= 38.41273, (0 missing)
##       Age          < 7.5       to the right, improve= 35.38317, (0 missing)
##   Surrogate splits:
##       FoodCourt   < 10134.5   to the right, agree=0.714, adj=0.007, (0 split)
##       Age         < 68.5      to the right, agree=0.713, adj=0.004, (0 split)
##       deck        splits as  RRLRRRRRR, agree=0.713, adj=0.004, (0 split)
##       RoomService < 343       to the right, agree=0.712, adj=0.001, (0 split)
## 
## Node number 22: 813 observations
##   predicted class=FALSE  expected loss=0.2091021  P(node) =0.09352352
##     class counts:   643   170
##    probabilities: 0.791 0.209 
## 
## Node number 23: 2005 observations
##   predicted class=TRUE   expected loss=0.3890274  P(node) =0.2306453
##     class counts:   780  1225
##    probabilities: 0.389 0.611
rpart.plot(fit_tree)

preds = predict(fit_tree, newdata = test_set, type = "class")
y_pred = ifelse(preds == TRUE, TRUE, FALSE)
Transported <- as.character(y_pred)
PassengerId <- test$PassengerId
Transported <- as.vector(Transported)
submission <- cbind(PassengerId, Transported)
submission <- as.data.frame(submission)
submission$Transported <- str_to_title(submission$Transported)
write.csv(submission, file = "submsn_dt.cvs", row.names = FALSE, quote=FALSE)