Spaceship Titanic

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ı!

İlk önce elimizdeki data verilerini library kodunu kullanarak R yüklememiz gerekiyor.

DATALARI İNDİRMEK VE PAKETLERİ YÜKLEMEK

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

Projemizde kullandığımız dataları daha iyi okunur hale ve daha etkili kod yazabilmek için “tidyverse” paketini yükleyelim.

library(tidyverse)

Data verilerini raporlamak ve özetlemek için “explore” paketini yükleyelim.

library(explore)

Şimdi datalarımızı ilk önce kontrol edelim elimizdeki verileri öğrenelim.

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
test %>% describe_all()
## # A tibble: 13 × 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   chr      87    2        4    NA  NA       NA
##  3 CryoSleep    lgl      93    2.2      3     0   0.37     1
##  4 Cabin        chr     100    2.3   3266    NA  NA       NA
##  5 Destination  chr      92    2.2      4    NA  NA       NA
##  6 Age          dbl      91    2.1     80     0  28.7     79
##  7 VIP          lgl      93    2.2      3     0   0.02     1
##  8 RoomService  dbl      82    1.9    843     0 219.   11567
##  9 FoodCourt    dbl     106    2.5    903     0 439.   25273
## 10 ShoppingMall dbl      98    2.3    716     0 177.    8292
## 11 Spa          dbl     101    2.4    834     0 303.   19844
## 12 VRDeck       dbl      80    1.9    797     0 311.   22272
## 13 Name         chr      94    2.2   4177    NA  NA       NA

Öğrenilen bilgilere göre datalarımızda bilinmeyen verilerin çoğunluğu ve verilen bilgilerden ‘PassengerId’ ve ‘Cabin’ sütunlarının birden fazla bilginin tek bir sütunda birleştirilmiş olması verileri okumamızı zorlaştırıyor. Bunun için ‘PassengerId’ sütununu “ailenum ve ailesıra”, ‘Cabin’ sütununu ise “deck, num ve side” olmak üzere ayırıp okumayı kolaylaştıralım. Yaptığımız işlemleri her iki data içinde kullanmalıyız.

PassengerId Ayrıştırma

train[c('ailenum','ailesıra')]<- str_split_fixed(train$PassengerId, "_",2)
test[c('ailenum','ailesıra')]<- str_split_fixed(test$PassengerId, "_",2)

Cabin Ayrıştırma

train[c('deck',"num", "side")]<- str_split_fixed(train$Cabin, "/",3)
test[c('deck',"num", "side")]<- str_split_fixed(test$Cabin, "/",3)

Şimdi ‘Cabin’ sütunu fazlalık oluşturduğu için verilerden kaldıralım..

train <- train %>% select(-Cabin)
test <- test %>% select(-Cabin)

Datalarımıza eklemeler yapıldıktan sonra boş kutucuklar varsa onları “NA” değeriyle dolduralım. Bu işlem bizi daha iyi sonuca ulaştırmayı sağlayacak.

train[train == ''] <- NA
test[test == ''] <- NA

Yaptığımız işlemleri şimdi kontrol edelim.

TRAİN İÇİN DESCRİBE_ALL

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   chr     201    2.3      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 ailesıra     chr       0    0        8    NA  NA       NA
## 16 deck         chr     199    2.3      9    NA  NA       NA
## 17 num          chr     199    2.3   1818    NA  NA       NA
## 18 side         chr     199    2.3      3    NA  NA       NA

TEST İÇİN DESCRİBE_ALL

test%>%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     4277    NA  NA       NA
##  2 HomePlanet   chr      87    2        4    NA  NA       NA
##  3 CryoSleep    lgl      93    2.2      3     0   0.37     1
##  4 Destination  chr      92    2.2      4    NA  NA       NA
##  5 Age          dbl      91    2.1     80     0  28.7     79
##  6 VIP          lgl      93    2.2      3     0   0.02     1
##  7 RoomService  dbl      82    1.9    843     0 219.   11567
##  8 FoodCourt    dbl     106    2.5    903     0 439.   25273
##  9 ShoppingMall dbl      98    2.3    716     0 177.    8292
## 10 Spa          dbl     101    2.4    834     0 303.   19844
## 11 VRDeck       dbl      80    1.9    797     0 311.   22272
## 12 Name         chr      94    2.2   4177    NA  NA       NA
## 13 ailenum      chr       0    0     3063    NA  NA       NA
## 14 ailesıra     chr       0    0        8    NA  NA       NA
## 15 deck         chr     100    2.3      9    NA  NA       NA
## 16 num          chr     100    2.3   1506    NA  NA       NA
## 17 side         chr     100    2.3      3    NA  NA       NA

Yaptığımız kontrolde görüldüğü üzere ‘PassengerId’ ve ‘Cabin’ sütunlarını doğru bi şekilde ayırmışız. Ancak eksik verileri “NA” değerleriyle değiştirme işleminde eksiklikler mevcut. Bu eksiklikleri her bir verilen veri için her iki datada da aşağıdaki kodları kullanarak eksik bilgileri dolduralım.

EKSİK DEĞERLERİ DOLDURMA

HomePlanet

train $HomePlanet<-addNA(train$HomePlanet)
test $HomePlanet<-addNA(test$HomePlanet)

CryoSleep

train $CryoSleep<-addNA(train$CryoSleep)
test $CryoSleep<-addNA(test$CryoSleep)

Destination

train $Destination<-addNA(train$Destination)
test $Destination<-addNA(test$Destination)

VIP

train $VIP<-addNA(train$VIP)
test $VIP<-addNA(test$VIP)

deck

train $deck<-addNA(train$deck)
test $deck<-addNA(test$deck)

num

train $num<-addNA(train$num)
test $num<-addNA(test$num)

side

train $side<-addNA(train$side)
test $side<-addNA(test$side)

Burada kullandığımız kod chr(karakter) değerine sahip veri bilgileri için kullandık. Bu veri bilgileri sözel ifadeler belirttiği için ‘NA’ değeri kullanıldı.

Verilen verilerin kaç tür bilgiye sahip olduğunu öğrenmek için ‘levels’ kodu kullanılır. Örnek olarak HomePlanet bilgisini kullanalım.

levels(train$HomePlanet)
## [1] "Earth"  "Europa" "Mars"   NA

Görüldüğü üzere eksik verileri NA değerleriyle değiştirdiğimizde bu NA değeri bize bir bilgiymiş gibi göstermiyor ve tahmin yapma işleminde doğru tahmine ulaştırmada sıkıntı yaratacaktır. Bu NA eksik bilgi değerini “NA” etiketi atamak için aşağıdaki kodu kullanabiliriz. Her iki data içinde bulunan chr(karakter) verileri için kullanmalıyız.

HomePlanet

levels(train$HomePlanet)[is.na(levels(train$HomePlanet))] <- "NA"
levels(test$HomePlanet)[is.na(levels(test$HomePlanet))] <- "NA"

CryoSleep

levels(train$CryoSleep)[is.na(levels(train$CryoSleep))] <- "NA"
levels(test$CryoSleep)[is.na(levels(test$CryoSleep))] <- "NA"

Destination

levels(train$Destination)[is.na(levels(train$Destination))] <- "NA"
levels(test$Destination)[is.na(levels(test$Destination))] <- "NA"

VIP

levels(train$VIP)[is.na(levels(train$VIP))] <- "NA"
levels(test$VIP)[is.na(levels(test$VIP))] <- "NA"

deck

levels(train$deck)[is.na(levels(train$deck))] <- "NA"
levels(test$deck)[is.na(levels(test$deck))] <- "NA"

side

levels(train$side)[is.na(levels(train$side))] <- "NA"
levels(test$side)[is.na(levels(test$side))] <- "NA"

Şimdi yaptığımız işlemi ‘levels’ kodunu kullanarak kontrol edelim. Örnek olarak side verisini alalım.

levels(train$side)
## [1] "P"  "S"  "NA"
levels(test$side)
## [1] "P"  "S"  "NA"

Görüldüğü üzere NA bilgisini “NA” etiketiyle değiştirmiş olduk.

Yukarıda yaptığımız işlemlerin hepsi chr(karakter) sözel veri bilgisine sahip veriler içindi. Sayısal ve logical (dbl ve lgl) değerler için ‘NA’ değeri girilmez. Bu eksik değerler için ‘NA’ değeri yerine ortalamalarını girebiliriz. Train datası için ‘Transported’ verisine göre test datası için ise ‘HomePlanet’ verisine göre değişkenleri gruplandıralım.

FoodCourt

train <- train %>% mutate(FoodCourt = coalesce(FoodCourt, 0))
test <- test %>% mutate(FoodCourt = coalesce(FoodCourt, 0))

Age

train <- train %>% mutate(Age = coalesce(Age, 0))
test <- test %>% mutate(Age = coalesce(Age, 0))

RoomService

train <- train %>% mutate(RoomService = coalesce(RoomService, 0))
test <- test %>% mutate(RoomService = coalesce(RoomService, 0))

ShoppingMall

train <- train %>% mutate(ShoppingMall = coalesce(ShoppingMall, 0))
test <- test %>% mutate(ShoppingMall = coalesce(ShoppingMall, 0))

Spa

train <- train %>% mutate(Spa = coalesce(Spa, 0))
test <- test %>% mutate(Spa = coalesce(Spa, 0))

VRDeck

train <- train %>% mutate(VRDeck = coalesce(VRDeck, 0))
test <- test %>% mutate(VRDeck = coalesce(VRDeck, 0))
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       80     0  28.2    79
##  6 VIP          fct       0    0        3    NA  NA      NA
##  7 RoomService  dbl       0    0     1273     0 220.  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 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 ailesıra     chr       0    0        8    NA  NA      NA
## 16 deck         fct       0    0        9    NA  NA      NA
## 17 num          fct       0    0     1818    NA  NA      NA
## 18 side         fct       0    0        3    NA  NA      NA
test%>%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     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       79     0  28.0    79
##  6 VIP          fct       0    0        3    NA  NA      NA
##  7 RoomService  dbl       0    0      842     0 215.  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 Name         chr      94    2.2   4177    NA  NA      NA
## 13 ailenum      chr       0    0     3063    NA  NA      NA
## 14 ailesıra     chr       0    0        8    NA  NA      NA
## 15 deck         fct       0    0        9    NA  NA      NA
## 16 num          fct       0    0     1506    NA  NA      NA
## 17 side         fct       0    0        3    NA  NA      NA

Göründüğü üzere bütün boş olan verileri NA veya ortalamalar ile doldurduk ama name verisine herhangi bir işlem yapmadık çünkü name verisi bize tahmin yapmada herhangi bir kolaylık sağlamayacaktır. Bunun yerine PassengerID verisi bize yardımcı olabilecektir. name verisi bir işimize yaramayacağı için her iki datada da silebiliriz. Bunun için aşağıdaki kodu kullanabiliriz.

train <- train %>% select(-Name)
test <- test %>% select(-Name)

‘ailenum ve ailesıra’ verilerini de silelim.

train <- train %>% select(-ailenum)
test <- test %>% select(-ailenum)
train <- train %>% select(-ailesıra)
test <- test %>% select(-ailesıra)
train <- train %>% select(-num)
test <- test %>% select(-num)

Böylelikle datalarımızı temizlemiş olup daha iyi tahminlerde bulunabiliriz.

RAPORLAMA

Şimdi temizlediğimiz data verilerinin raporlarını oluşturalım. Bunun için ilk önce ‘DataExplorer’ paketi indirilir ve daha sonra library kodu kullanılarak dataya yüklenir. Bu işlem yapıldıktan sonra ‘create_report’ kodu kullanılarak verilerin raporu oluşturulur.

TRAİN

library(DataExplorer)
create_report(train)
## 
  |                                           
  |                                     |   0%
  |                                           
  |.                                    |   2%                                 
  |                                           
  |..                                   |   5% [global_options]                
  |                                           
  |...                                  |   7%                                 
  |                                           
  |....                                 |  10% [introduce]                     
  |                                           
  |....                                 |  12%                                 
  |                                           
  |.....                                |  14% [plot_intro]                    
  |                                           
  |......                               |  17%                                 
  |                                           
  |.......                              |  19% [data_structure]                
  |                                           
  |........                             |  21%                                 
  |                                           
  |.........                            |  24% [missing_profile]               
  |                                           
  |..........                           |  26%                                 
  |                                           
  |...........                          |  29% [univariate_distribution_header]
  |                                           
  |...........                          |  31%                                 
  |                                           
  |............                         |  33% [plot_histogram]                
  |                                           
  |.............                        |  36%                                 
  |                                           
  |..............                       |  38% [plot_density]                  
  |                                           
  |...............                      |  40%                                 
  |                                           
  |................                     |  43% [plot_frequency_bar]            
  |                                           
  |.................                    |  45%                                 
  |                                           
  |..................                   |  48% [plot_response_bar]             
  |                                           
  |..................                   |  50%                                 
  |                                           
  |...................                  |  52% [plot_with_bar]                 
  |                                           
  |....................                 |  55%                                 
  |                                           
  |.....................                |  57% [plot_normal_qq]                
  |                                           
  |......................               |  60%                                 
  |                                           
  |.......................              |  62% [plot_response_qq]              
  |                                           
  |........................             |  64%                                 
  |                                           
  |.........................            |  67% [plot_by_qq]                    
  |                                           
  |..........................           |  69%                                 
  |                                           
  |..........................           |  71% [correlation_analysis]          
  |                                           
  |...........................          |  74%                                 
  |                                           
  |............................         |  76% [principal_component_analysis]  
  |                                           
  |.............................        |  79%                                 
  |                                           
  |..............................       |  81% [bivariate_distribution_header] 
  |                                           
  |...............................      |  83%                                 
  |                                           
  |................................     |  86% [plot_response_boxplot]         
  |                                           
  |.................................    |  88%                                 
  |                                           
  |.................................    |  90% [plot_by_boxplot]               
  |                                           
  |..................................   |  93%                                 
  |                                           
  |...................................  |  95% [plot_response_scatterplot]     
  |                                           
  |.................................... |  98%                                 
  |                                           
  |.....................................| 100% [plot_by_scatterplot]           
                                                                                                                           
## "C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/pandoc" +RTS -K512m -RTS "C:\Users\Win10\Desktop\finalproB\report.knit.md" --to html4 --from markdown+autolink_bare_uris+tex_math_single_backslash --output pandoc1a8c5dd821ce.html --lua-filter "C:\Users\Win10\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\pagebreak.lua" --lua-filter "C:\Users\Win10\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\latex-div.lua" --embed-resources --standalone --variable bs3=TRUE --section-divs --table-of-contents --toc-depth 6 --template "C:\Users\Win10\AppData\Local\R\win-library\4.3\rmarkdown\rmd\h\default.html" --no-highlight --variable highlightjs=1 --variable theme=yeti --mathjax --variable "mathjax-url=https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" --include-in-header "C:\Users\Win10\AppData\Local\Temp\RtmpcZCsZf\rmarkdown-str1a8c3c197303.html"

TEST

library(DataExplorer)
create_report(test)
## 
  |                                           
  |                                     |   0%
  |                                           
  |.                                    |   2%                                 
  |                                           
  |..                                   |   5% [global_options]                
  |                                           
  |...                                  |   7%                                 
  |                                           
  |....                                 |  10% [introduce]                     
  |                                           
  |....                                 |  12%                                 
  |                                           
  |.....                                |  14% [plot_intro]                    
  |                                           
  |......                               |  17%                                 
  |                                           
  |.......                              |  19% [data_structure]                
  |                                           
  |........                             |  21%                                 
  |                                           
  |.........                            |  24% [missing_profile]               
  |                                           
  |..........                           |  26%                                 
  |                                           
  |...........                          |  29% [univariate_distribution_header]
  |                                           
  |...........                          |  31%                                 
  |                                           
  |............                         |  33% [plot_histogram]                
  |                                           
  |.............                        |  36%                                 
  |                                           
  |..............                       |  38% [plot_density]                  
  |                                           
  |...............                      |  40%                                 
  |                                           
  |................                     |  43% [plot_frequency_bar]            
  |                                           
  |.................                    |  45%                                 
  |                                           
  |..................                   |  48% [plot_response_bar]             
  |                                           
  |..................                   |  50%                                 
  |                                           
  |...................                  |  52% [plot_with_bar]                 
  |                                           
  |....................                 |  55%                                 
  |                                           
  |.....................                |  57% [plot_normal_qq]                
  |                                           
  |......................               |  60%                                 
  |                                           
  |.......................              |  62% [plot_response_qq]              
  |                                           
  |........................             |  64%                                 
  |                                           
  |.........................            |  67% [plot_by_qq]                    
  |                                           
  |..........................           |  69%                                 
  |                                           
  |..........................           |  71% [correlation_analysis]          
  |                                           
  |...........................          |  74%                                 
  |                                           
  |............................         |  76% [principal_component_analysis]  
  |                                           
  |.............................        |  79%                                 
  |                                           
  |..............................       |  81% [bivariate_distribution_header] 
  |                                           
  |...............................      |  83%                                 
  |                                           
  |................................     |  86% [plot_response_boxplot]         
  |                                           
  |.................................    |  88%                                 
  |                                           
  |.................................    |  90% [plot_by_boxplot]               
  |                                           
  |..................................   |  93%                                 
  |                                           
  |...................................  |  95% [plot_response_scatterplot]     
  |                                           
  |.................................... |  98%                                 
  |                                           
  |.....................................| 100% [plot_by_scatterplot]           
                                                                                                                           
## "C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/pandoc" +RTS -K512m -RTS "C:\Users\Win10\Desktop\finalproB\report.knit.md" --to html4 --from markdown+autolink_bare_uris+tex_math_single_backslash --output pandoc1a8c7e0b3688.html --lua-filter "C:\Users\Win10\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\pagebreak.lua" --lua-filter "C:\Users\Win10\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\latex-div.lua" --embed-resources --standalone --variable bs3=TRUE --section-divs --table-of-contents --toc-depth 6 --template "C:\Users\Win10\AppData\Local\R\win-library\4.3\rmarkdown\rmd\h\default.html" --no-highlight --variable highlightjs=1 --variable theme=yeti --mathjax --variable "mathjax-url=https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" --include-in-header "C:\Users\Win10\AppData\Local\Temp\RtmpcZCsZf\rmarkdown-str1a8c3c2216e1.html"

ÇUBUK GRAFİĞİ YORUMLAMA

Bu raporlara baktığımızda train datasındaki Çubuk Grafiğini incelediğimizde;

Bu çubuk grafiğinde ‘Destination’(varılacak gezegen) grafiğini incelediğimizde en çok gitmek istenilen gezegen TRAPPIST-1e’iken en az gitmek istenilen gezegen ise PSOJ318.5-22 gezegenidir. Nereye gideceği bilinmeyen yolcuların sayısı ise 0-200 arasında bi değerdir.

Şimdi bir histogram grafiği çizip yorum yapalım. Train datasından HomePlanet ve Age verilerini alalım. Bunun için aşağıdaki kodları kullanabiliriz.

HİSTOGRAM GRAFİĞİ YORUMLAMA

ÖRNEK1

ggplot(train, aes(x = Age)) + 
  geom_histogram(fill = "white", color = "black") +
  facet_grid(HomePlanet ~ .)

Bu grafiği incelediğimizde hangi gezegenden (HomePlanet) hangi yaş (Age) grupları ne kadar kişi gitmiştir onu görebiliriz. Grafikteki bilgiler “Earth, Europa, Mars ve NA(yani bilinmeyen)” gezegenlerimiz ve “Age” yani yaş bilgileri bulunuyor. Bu grafiği yorumlamak istediğimizde yaş gruplarının çoğunluğu Earth gezegeninden gittiği görülüyor. Earth gezegeninden giden çoğunluk yaş grubu 20-40 yaş grupları arasıdır.

Şimdide HomePlanet gezegenlerinden gidenlerin hangi gezegene gittiklerini yani Destination gezegenlerinden hangisine gittiklerini inceleyelim.

ÖRNEK2

ggplot(train, aes(x = HomePlanet)) + 
  geom_histogram(stat = "count", fill = "white", color = "black") +
  facet_grid(Destination ~ .)

Bu grafik verilerini incelediğimizde Earth gezegeninden giden kişilerin 3000’den fazlasının TRAPPIST-1e gezegenine, en azının bilinmeyen bir gezegene gittiği görülüyor. Europa gezegeninden giden kişilerin en azı PSO J318.5-22 gezegenine gitmiştir.

Şimdi tahminlerde bulunabiliriz.

TAHMİN OLUŞTURMA

Tahmin oluşturmak için ilk önce veri setleri oluşturmamız gerekiyor. Oluşturacağımız veri setleri bize tahmin yapmada yardımcı olacaktır. Oluşturacağımız veri setlerinin isimlerini “trainseti ve testseti” olacak şekilde oluşturalım.

trainseti <- train [2:14]
testseti <- test [2:13]

Bu oluşturduğumuz veri setleri train setindeki son 16 gözlemi test setindeki son 15 gözlemi içerir.

Data setlerini oluşturduktan sonra tahminde bulunmak için ilk önce kullanacağımız paketi yükleyelim daha sonra her seferinde aynı rastgelelikte tahminlerde bulunmak için veya analizlerde tekrarlığı arttırmak için ‘set.seed’ kodunu kullanalım.

library(caTools)
set.seed(13371)

Daha sonra oluşturduğumuz veri setlerini belirtilen oranda iki ayrı alt küme oluşturmak için aşağıdaki kodları kullanırız. Yeni oluşturacağımız iki alt kümenin isimleri sırasıyla ‘trainaltküme’ ve ‘testaltküme’ olsun.

split = sample.split(trainseti$Transported, SplitRatio = 0.80)
trainaltküme = subset(trainseti, split == TRUE)
testaltküme= subset(trainseti, split == FALSE)

Şimdi “NAİVE BAYES” modelini kullanarak bir tahmin işleminde bulunalım. İlk önce ‘e1071’ paketini yükleyelim.

NAİVE BAYES MODELİ

library(e1071)
fit_nb <- naiveBayes(Transported ~., data = trainaltküme)

preds <- predict(fit_nb, newdata = testaltküme, type = "raw") %>%
  data.frame()

Burada kullanılan kodlardan ‘fit_nb’ isimli olan NAİVE BAYES modeli üzerinden sınıflandırma oluşturur. ‘preds’ isimli kod ise bu model ve sınıflandırma üzerinden tahminde bulunur.

y_pred = ifelse(preds$TRUE. > 0.5, 1, 0)
y_true <- ifelse(testaltküme[11] == TRUE, 1,0)

Daha sonra yaptığımız sınıflandırmalarda tahmin edilen olasılık 0.5 den büyük ise y_pred değeri ‘1’ olacak aksi takdirde ‘0’ olacaktır.

Şimdi bir karşıtlık matrisi kuralım ve yaptığımız sınıflandırmaların tahmin performansına bakalım.

cm = table(y_true, y_pred)
cm
##       y_pred
## y_true   0   1
##      0 444 419
##      1  70 806
(444+806) / (444+806+419+70)
## [1] 0.7188039
nb_son = naiveBayes(Transported ~ ., data = trainseti)
preds <- predict(nb_son, newdata = testseti, type = "raw") %>%
  data.frame()
y_pred = ifelse(preds$TRUE. > 0.5, TRUE, FALSE)
Transported <- as.character(y_pred)
PassengerId <- test$PassengerId
Transported <- as.vector(Transported)

Yaptığımız bu işlemlerden sonra ‘naivebayes_sonucu’ adı verdiğimiz matrisini oluşturalım.

naivebayes_sonucu <- cbind(PassengerId, Transported)

Daha sonra bu matrisi bir veri setine dönüştürelim.

naivebayes_sonucu <- as.data.frame(naivebayes_sonucu)

Bu veri setini düzenliyelim Transported sütununda ki bilgilerin baş harfini büyük geri kalanını küçük yazmak için aşağıdaki kodu kullanalım.

naivebayes_sonucu$Transported <- str_to_title(naivebayes_sonucu$Transported)

Bu veri setini şimdi bir CSV dosyasına yazmak için aşağıdaki kodu kullanalım.

write.csv(naivebayes_sonucu, "naivebayes_sonucu.csv", row.names = FALSE, quote = FALSE)

Böylelikle NAİVEBAYES modelinde tahmine ulaşmış bulunuyoruz. Tahmin sonucumuzu öğrenmek için kaggle.com sitesine girip dataları aldığımız SPACESHİP TİTANİC bölümünde submissions SUBMİT PREDİCTİON işlemi yaparak sonucumuzu öğrenebiliriz.

NAİVEBAYES SONUÇ

Görüldüğü üzere sonucumuz 0.71662 yani yaklaşık %72’lik bir sonuca ulaştığımızı görüyoruz. Bu da yeterli bir düzeyde tahmin yaptığımızı gösterir.

SVM MODELİ

SVM modeli nedir?

SVM (Support Vector Machine), bir makine öğrenimi algoritmasıdır ve hem sınıflandırma (classification) hem de regresyon (regression) problemlerini çözmek için kullanılabilir. SVM, özellikle sınıflandırma problemlerinde etkili bir şekilde çalışan ve yüksek boyutlu veri setleriyle başa çıkabilen bir algoritmadır.

SVM’in temel amacı, veri noktalarını iki veya daha fazla sınıf arasında bir hiper düzlemle en iyi şekilde ayırmaktır. Sınıflar arasındaki bu hiper düzlem, veri noktalarını en iyi şekilde ayıran ve sınıflandırma hatasını minimize eden bir düzlemdir. SVM, bu hiper düzlemi belirlerken destek vektörleri kullanır. Destek vektörler, sınıflar arasındaki hiper düzleme en yakın olan veri noktalarını ifade eder.

SVM modeliyle tahminde bulunalım. İlk önce gereken paketleri yükleyelim.

library(e1071)
fit_svm <- svm(Transported ~ ., data = trainaltküme,
               type = 'C-classification',
               kernel = 'linear')

preds <- predict(fit_svm, newdata = testaltküme, type = "raw") %>%
  data.frame()
y_pred = ifelse(preds$. == TRUE, 1, 0)
cm = table(y_true, y_pred)
cm
##       y_pred
## y_true   0   1
##      0 683 180
##      1 191 685
(683+685) / (683+685+180+191)
## [1] 0.786659
svm_son = svm(Transported ~ ., data = trainseti,
              type = 'C-classification',
              kernel = 'linear')
preds <- predict(svm_son, newdata = testseti, type = "raw") %>%
  data.frame()
y_pred = preds$.
Transported <- as.character(y_pred)
PassengerId <- test$PassengerId
Transported <- as.vector(Transported)
SVM_sonucu <- cbind(PassengerId, Transported)
SVM_sonucu <- as.data.frame(SVM_sonucu)
SVM_sonucu$Transported <- str_to_title(SVM_sonucu$Transported)
write.csv(SVM_sonucu, "SVM_sonucu.csv", row.names = FALSE, quote = FALSE)

SVM MODELİ SONUCU

SVM modelinden aldığımız sonuca göre yaklaşık %80’lik doğru tahminde bulmuşuz. NaiveBayes modeline göre oldukça iyi bir sonuç aldık.

Şimdi SVM RADİAL yani KERNEL adı verdiğimiz modeli kullanarak tahminde bulunalım.

SVM RADİAL(KERNEL) MODELİ

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

KERNEL SONUÇ

KERNEL sonucumuzu da aldık. Sonuca göre şuan da kullandığımız 3 modelden en iyi sonucu KERNEL modeli vermiş oldu. Tahminlerde bulunduğumuz da KERNEL modeli en iyi şekilde bize yardımcı olacaktır.