1 Spaceship Titanic ve Kaggle

Bu derste, veri bilimi ve makine öğrenmesi adımlarını baştan sona uygulayacağımız bir proje üzerinde çalışacağız. Uygulama için Kaggle platformundaki “Spaceship Titanic” adlı sınıflandırma yarışmasını kullanacağız. Amaç, gerçek hayata benzer bir veri bilimi sürecini, baştan sona, mümkün olduğunca sistematik ve şeffaf bir şekilde deneyimlemek ve R programlama dilinde uygulama becerisi kazanmaktır.

Spaceship Titanic yarışmasında elimizde, kurgusal bir uzay gemisindeki yolculara ait bilgiler (yaş, kabin konumu, harcama kalemleri, aile yapısı vb.) ve bu yolcuların “anomali sonucunda taşınıp taşınmadığını” gösteren bir hedef değişken bulunmaktadır. Görevimiz, bu kayıtları kullanarak hangi yolcuların alternatif bir boyuta taşındığını tahmin eden bir makine öğrenmesi modeli kurmaktır.

Bu proje, veri ve senaryo kurgusal olsa da, karşılaşacağımız problemler (eksik veri, veri temizleme, değişken seçimi, model karşılaştırma, değerlendirme ölçütleri, vb.) gerçek veri bilimi projelerine oldukça benzemektedir.

1.1 Kaggle Nedir?

Kaggle, veri bilimi ve makine öğrenmesi alanında kullanılan, yarışmaların, veri setlerinin ve örnek kodların paylaşıldığı bir çevrimiçi platformdur.

Kullanıcılar:

  • Farklı zorluk seviyelerinde yarışmalara katılabilir,
  • Açık veri setlerini inceleyip analiz edebilir,
  • Diğer katılımcıların paylaştığı not defterlerini (notebooks) ve çözümleri inceleyebilir,
  • Öğrenme materyallerine ve tartışma forumlarına erişebilir.

Kaggle, veri bilimi becerilerini geliştirmek, yeni teknikler öğrenmek ve gerçek dünya problemlerini çözmek için harika bir kaynaktır.

1.2 Spaceship Titanic Yarışması

Spaceship Titanic yarışması, Kaggle platformunda bulunan ve katılımcıların bir uzay gemisindeki yolcuların alternatif bir boyuta taşınıp taşınmadığını tahmin etmeye çalıştığı bir sınıflandırma problemidir. Yarışmada verilen veri seti, yolcuların demografik bilgileri, seyahat detayları ve harcama alışkanlıkları gibi çeşitli özellikleri içermektedir.

Yarışmanın amacı, bu özellikleri kullanarak hangi yolcuların taşındığını doğru bir şekilde tahmin eden bir makine öğrenmesi modeli geliştirmektir. Katılımcılar, modellerini eğitmek ve değerlendirmek için sağlanan eğitim train veri setini kullanabilir ve ardından test test veri seti üzerinde tahminler yaparak performanslarını ölçebilirler.

Yarışma, veri bilimi ve makine öğrenmesi becerilerini geliştirmek isteyenler için harika bir fırsat sunmaktadır. Katılımcılar, veri ön işleme, özellik mühendisliği, model seçimi ve değerlendirme gibi önemli adımları deneyimleyebilirler.

Daha fazla bilgi için yarışma sayfası:

Kaggle Spaceship Titanic:

https://www.kaggle.com/competitions/spaceship-titanic

1.3 Proje Adımları

Bu projede aşağıdaki adımları takip edeceğiz:

  1. Veri Setini Anlama: Veri setindeki değişkenleri ve hedef değişkeni inceleyerek, problemin doğasını anlayacağız.
  2. Veri Ön İşleme: Eksik verileri ele alacak, kategorik değişkenleri dönüştürecek ve gerekli veri temizleme işlemlerini yapacağız.
  3. Keşifsel Veri Analizi (EDA): Veriyi görselleştirerek ve istatistiksel özetler çıkararak, veri setindeki önemli desenleri ve ilişkileri keşfedeceğiz.
  4. Modelleme: Farklı makine öğrenmesi algoritmalarını kullanarak modeller oluşturacak ve performanslarını karşılaştıracağız.
  5. Model Değerlendirme: Modellerin doğruluk, hassasiyet, geri çağırma ve F1 skoru gibi değerlendirme metriklerini kullanarak performanslarını ölçeceğiz.
  6. Sonuçların Yorumlanması: Elde edilen sonuçları yorumlayacak ve modelin gerçek dünya uygulamalarındaki potansiyelini tartışacağız.

Bu adımları takip ederek, veri bilimi sürecini baştan sona deneyimlemiş olacağız ve R programlama dilinde uygulama becerilerimizi geliştireceğiz.

2 Veri Setini Anlama

Veri setini anlamak için öncelikle gerekli kütüphaneleri yükleyelim ve veri setini R ortamına alalım. Ardından, veri setindeki değişkenleri ve hedef değişkeni inceleyerek, problemin doğasını anlayacağız.

# Gerekli kütüphaneleri yükleyelim
library(tidyverse)
library(readr)
library(rmarkdown)
# Veri setini R ortamına alalım
train <- read_csv("train.csv")
test <- read_csv("test.csv")
# Veri setini inceleyelim
paged_table(train)
paged_table(test)

Yukarıdaki tablolar, eğitim ve test veri setlerindeki değişkenleri ve örnek kayıtları göstermektedir. Eğitim veri setinde, yolcuların çeşitli özellikleri ve hedef değişken (Transported) bulunmaktadır. Test veri setinde ise hedef değişken bulunmamaktadır.

# Veri yapısını inceleme
glimpse(train)
## Rows: 8,693
## Columns: 14
## $ PassengerId  <chr> "0001_01", "0002_01", "0003_01", "0003_02", "0004_01", "0…
## $ HomePlanet   <chr> "Europa", "Earth", "Europa", "Europa", "Earth", "Earth", …
## $ CryoSleep    <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FA…
## $ Cabin        <chr> "B/0/P", "F/0/S", "A/0/S", "A/0/S", "F/1/S", "F/0/P", "F/…
## $ Destination  <chr> "TRAPPIST-1e", "TRAPPIST-1e", "TRAPPIST-1e", "TRAPPIST-1e…
## $ Age          <dbl> 39, 24, 58, 33, 16, 44, 26, 28, 35, 14, 34, 45, 32, 48, 2…
## $ VIP          <lgl> FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FA…
## $ RoomService  <dbl> 0, 109, 43, 0, 303, 0, 42, 0, 0, 0, 0, 39, 73, 719, 8, 32…
## $ FoodCourt    <dbl> 0, 9, 3576, 1283, 70, 483, 1539, 0, 785, 0, 0, 7295, 0, 1…
## $ ShoppingMall <dbl> 0, 25, 0, 371, 151, 0, 3, 0, 17, 0, NA, 589, 1123, 65, 12…
## $ Spa          <dbl> 0, 549, 6715, 3329, 565, 291, 0, 0, 216, 0, 0, 110, 0, 0,…
## $ VRDeck       <dbl> 0, 44, 49, 193, 2, 0, 0, NA, 0, 0, 0, 124, 113, 24, 7, 0,…
## $ Name         <chr> "Maham Ofracculy", "Juanna Vines", "Altark Susent", "Sola…
## $ Transported  <lgl> FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, …

glimpse(), dplyr/tidyverse paketinin sağladığı, bir veri çerçevesinin (data frame veya tibble) yapısını hızlı ve okunabilir bir şekilde görüntülemek için kullanılan bir fonksiyondur. Bu fonksiyon, veri setindeki her bir sütunun (değişkenin) adını, veri tipini ve ilk birkaç değerini gösterir. Böylece, veri setinin genel yapısını ve içeriğini hızlıca anlayabiliriz.

2.1 Değişken Türleri

Veriyi doğru işlemek ve uygun makine öğrenmesi modellerini kullanmak için değişken türlerini anlamak kritik öneme sahiptir. glimpse() çıktısında göreceğimiz temel veri türleri şunlardır:

  • dbl Numeric (Sayısal): Gerçek sayıları temsil eder (ör. 23.7, 0.45, 117.0). Spaceship Titanic Örnekleri, yaş (Age), harcama miktarları (RoomService, FoodCourt vb.) gibi.
  • chr Character (Karakter): Metin veya kategorik veriler içeren değişkenlerdir. Çoğu zaman kategorik değişkenler başlangıçta chr olarak gelir ve modelleme aşamasında faktöre dönüştürülmesi gerekebilir. Spaceship Titanic Örnekleri: PassengerId, HomePlanet, Cabin vb.
  • lgl Logical (Mantıksal): TRUE veya FALSE değerlerini alabilen değişkenlerdir. Örneğin, hedef değişkenimiz Transported bu türdedir.
  • int Integer (Tam Sayı): Tam sayıları temsil eder (ör. 1, 42, -7). Örneğin, Age değişkeni tam sayılar içerebilir.
  • fct Factor (Kategori): Kategorik verilerin R’daki özel veri türüdür. chr türündeki değişkenler modelleme aşamasında as.factor() ile faktöre dönüştürülerek daha etkin şekilde kullanılabilir.

3 Veri Ön İşleme

# Eksik değer analizi
colSums(is.na(train))
##  PassengerId   HomePlanet    CryoSleep        Cabin  Destination          Age 
##            0          201          217          199          182          179 
##          VIP  RoomService    FoodCourt ShoppingMall          Spa       VRDeck 
##          203          181          183          208          183          188 
##         Name  Transported 
##          200            0

Yukarıdaki kod, eğitim veri setindeki her bir sütunda (değişkende) eksik (NA) değerlerin sayısını hesaplar ve görüntüler. Bu analiz, veri setindeki eksik verilerin hangi değişkenlerde yoğunlaştığını ve ne kadar eksik veri olduğunu anlamamıza yardımcı olur. Eksik veriler, veri ön işleme aşamasında ele alınması gereken önemli bir konudur, çünkü eksik veriler model performansını olumsuz etkileyebilir.

3.1 Veri Setindeki Değişkenlerin Türlerine Göre Değerlendirilmesi

Veri setindeki değişkenlerin türlerine göre değerlendirilmesi, veri ön işleme sürecinde önemli bir adımdır. Farklı türdeki değişkenler için farklı işlemler ve dönüşümler gerekebilir. Aşağıda, veri setindeki değişkenleri türlerine göre nasıl değerlendirebileceğimiz ve işleyebileceğimiz hakkında genel bir rehber bulunmaktadır:

  1. Sayısal Değişkenler (Numeric - dbl, int):

    • Eksik Değerler: Eksik sayısal değerler için ortalama, medyan veya mod gibi istatistiksel yöntemlerle doldurma (imputation) yapılabilir. Alternatif olarak, eksik değerler içeren kayıtlar çıkarılabilir.
    • Ölçeklendirme: Bazı makine öğrenmesi algoritmaları için sayısal değişkenlerin ölçeklendirilmesi (normalizasyon veya standardizasyon) gerekebilir.
    • Aykırı Değerler: Aykırı değerlerin tespiti ve gerektiğinde düzeltilmesi veya çıkarılması önemlidir.
  2. Kategorik Değişkenler (Character - chr, Factor - fct):

    • Eksik Değerler: Eksik kategorik değerler için en sık görülen kategori ile doldurma veya “Bilinmiyor” gibi yeni bir kategori ekleme yöntemleri kullanılabilir.
    • Dönüştürme: Kategorik değişkenler, modelleme aşamasında faktör (factor) türüne dönüştürülmelidir. Bu, R’da as.factor() fonksiyonu ile yapılabilir.
    • One-Hot Encoding: Bazı durumlarda, kategorik değişkenler için one-hot encoding (dummy değişkenler oluşturma) gerekebilir.
  3. Mantıksal Değişkenler (Logical - lgl):

    • Eksik Değerler: Eksik mantıksal değerler için TRUE veya FALSE ile doldurma yapılabilir.
    • Dönüştürme: Mantıksal değişkenler, modelleme aşamasında sayısal (0 ve 1) türüne dönüştürülebilir.
  4. Tarih ve Zaman Değişkenleri:

    • Dönüştürme: Tarih ve zaman değişkenleri, yıl, ay, gün, saat gibi bileşenlere ayrılabilir veya zaman serisi analizleri için uygun formatlara dönüştürülebilir.
    • Eksik Değerler: Eksik tarih ve zaman değerleri için uygun doldurma yöntemleri kullanılabilir.
  5. Hedef Değişken (Dependent Variable):

    • Hedef değişkenin türüne göre (sınıflandırma için kategorik, regresyon için sayısal) uygun dönüşümler ve işlemler yapılmalıdır. Veri setindeki değişkenlerin türlerine göre bu değerlendirmeleri yaparak, veri ön işleme sürecini daha etkili ve verimli hale getirebiliriz. Bu adımlar, modelleme aşamasında daha iyi performans elde etmek için kritik öneme sahiptir.
# Her değişken için unique değer sayısını gösterelim
train %>%
  summarise(across(everything(), ~ n_distinct(.)))
## # A tibble: 1 × 14
##   PassengerId HomePlanet CryoSleep Cabin Destination   Age   VIP RoomService
##         <int>      <int>     <int> <int>       <int> <int> <int>       <int>
## 1        8693          4         3  6561           4    81     3        1274
## # ℹ 6 more variables: FoodCourt <int>, ShoppingMall <int>, Spa <int>,
## #   VRDeck <int>, Name <int>, Transported <int>

Yukarıdaki kod, eğitim veri setindeki her bir sütun (değişken) için benzersiz (unique) değerlerin sayısını hesaplar ve görüntüler. Bu analiz, her değişkenin kaç farklı kategori veya değer içerdiğini anlamamıza yardımcı olur. Özellikle kategorik değişkenler için bu bilgi, modelleme aşamasında hangi değişkenlerin kullanılabileceği ve nasıl işleneceği konusunda önemli ipuçları sağlar. Örneğin, çok fazla benzersiz değere sahip kategorik değişkenler, modelin karmaşıklığını artırabilir ve overfitting riskini yükseltebilir. Bu nedenle, bu tür analizler veri ön işleme sürecinde kritik bir rol oynar.

# Kategorik değişkenleri faktöre dönüştürelim
train <- train %>%
  mutate(across(c(HomePlanet, CryoSleep, Destination, VIP, Transported), as.factor))
test <- test %>%
  mutate(across(c(HomePlanet, CryoSleep, Destination, VIP), as.factor))

Yukarıdaki kod, eğitim ve test veri setlerindeki belirli kategorik değişkenleri faktör (factor) türüne dönüştürür. mutate() fonksiyonu ile across() kullanılarak belirtilen sütunlar (HomePlanet, CryoSleep, Destination, VIP, ve Transported eğitim setinde; HomePlanet, CryoSleep, Destination, ve VIP test setinde) as.factor() fonksiyonu ile faktöre dönüştürülür. Bu dönüşüm, modelleme aşamasında bu değişkenlerin doğru şekilde işlenmesini sağlar, çünkü birçok makine öğrenmesi algoritması kategorik değişkenleri faktör olarak bekler.

summary(train)
##  PassengerId         HomePlanet   CryoSleep       Cabin          
##  Length:8693        Earth :4602   FALSE:5439   Length:8693       
##  Class :character   Europa:2131   TRUE :3037   Class :character  
##  Mode  :character   Mars  :1759   NA's : 217   Mode  :character  
##                     NA's  : 201                                  
##                                                                  
##                                                                  
##                                                                  
##         Destination        Age           VIP        RoomService     
##  55 Cancri e  :1800   Min.   : 0.00   FALSE:8291   Min.   :    0.0  
##  PSO J318.5-22: 796   1st Qu.:19.00   TRUE : 199   1st Qu.:    0.0  
##  TRAPPIST-1e  :5915   Median :27.00   NA's : 203   Median :    0.0  
##  NA's         : 182   Mean   :28.83                Mean   :  224.7  
##                       3rd Qu.:38.00                3rd Qu.:   47.0  
##                       Max.   :79.00                Max.   :14327.0  
##                       NA's   :179                  NA's   :181      
##    FoodCourt        ShoppingMall          Spa              VRDeck       
##  Min.   :    0.0   Min.   :    0.0   Min.   :    0.0   Min.   :    0.0  
##  1st Qu.:    0.0   1st Qu.:    0.0   1st Qu.:    0.0   1st Qu.:    0.0  
##  Median :    0.0   Median :    0.0   Median :    0.0   Median :    0.0  
##  Mean   :  458.1   Mean   :  173.7   Mean   :  311.1   Mean   :  304.9  
##  3rd Qu.:   76.0   3rd Qu.:   27.0   3rd Qu.:   59.0   3rd Qu.:   46.0  
##  Max.   :29813.0   Max.   :23492.0   Max.   :22408.0   Max.   :24133.0  
##  NA's   :183       NA's   :208       NA's   :183       NA's   :188      
##      Name           Transported 
##  Length:8693        FALSE:4315  
##  Class :character   TRUE :4378  
##  Mode  :character               
##                                 
##                                 
##                                 
## 

Yukarıdaki kod, eğitim veri setindeki her bir değişken için özet istatistikleri görüntüler. summary() fonksiyonu, sayısal değişkenler için minimum, maksimum, ortalama, medyan ve çeyrek değerler gibi temel istatistikleri sağlar. Kategorik değişkenler için ise her bir kategoriye ait frekans dağılımını gösterir. Bu özet bilgiler, veri setinin genel yapısını ve özelliklerini anlamamıza yardımcı olur ve veri ön işleme sürecinde hangi adımların atılması gerektiği konusunda önemli ipuçları sunar. Örneğin, eksik değerlerin varlığı, aykırı değerler veya dengesiz kategorik dağılımlar gibi konular bu özetler aracılığıyla tespit edilebilir.

3.2 Faktöre Dönüştürülmeyen Kategorik Değişkenlerin İncelenmesi

3.2.1 PassengerId

Faktöre dönüştürülmesi binlerce kategori yaratacağından model tarafından öğrenilebilecek bir yapıya katkı sağlamaz.Bu nedenle doğrudan bir kategorik değişken olarak kullanılması uygun değildir.

Ancak PassengerId, yapısı gereği önemli ve çıkarımlara elverişli bilgiler taşır.

Kaggle’ın tanımına göre: PassengerId her yolcu için benzersiz bir numaradır.Bu numara gggg_pp biçimindedir. Buradaki gggg, yolcunun birlikte seyahat ettiği grubu gösterir; pp ise grubun içindeki kişi sırasıdır. Grup içindeki kişiler çoğunlukla aile üyeleridir, ancak her zaman böyle olmak zorunda değildir.

Bu yapı sayesinde PassengerId’nin kendisini kategorik olarak kullanmasak bile, içindeki alt bilgileri çıkartarak yeni açıklayıcı değişkenler (features) oluşturabiliriz.

# PassengerId'den grup numarası ve kişi sırasını çıkaralım
train <- train %>%
  separate(PassengerId, into = c("Grup_No", "Kisi_No"), sep = "_", remove = FALSE) %>%
  mutate(Grup_No = as.factor(Grup_No),
         Kisi_No = as.integer(Kisi_No))
test <- test %>%
  separate(PassengerId, into = c("Grup_No", "Kisi_No"), sep = "_", remove = FALSE) %>%
  mutate(Grup_No = as.factor(Grup_No),
         Kisi_No = as.integer(Kisi_No))

Yukarıdaki kod, PassengerId sütununu iki yeni sütuna ayırır: Grup_No ve Kisi_No. separate() fonksiyonu kullanılarak, PassengerId içindeki “gggg_pp” formatına göre ayırma işlemi gerçekleştirilir. Ardından, mutate() fonksiyonu ile Grup_No faktör (factor) türüne dönüştürülürken, Kisi_No tam sayı (integer) türüne dönüştürülür. Bu yeni değişkenler, yolcuların birlikte seyahat ettiği grupları ve grup içindeki kişi sırasını temsil eder ve modelleme aşamasında açıklayıcı değişkenler olarak kullanılabilir.

head(train %>% select(PassengerId, Grup_No, Kisi_No))
## # A tibble: 6 × 3
##   PassengerId Grup_No Kisi_No
##   <chr>       <fct>     <int>
## 1 0001_01     0001          1
## 2 0002_01     0002          1
## 3 0003_01     0003          1
## 4 0003_02     0003          2
## 5 0004_01     0004          1
## 6 0005_01     0005          1

Bu sayede iki yeni değişken elde ettik:

•   Grup_No: Yolcunun ait olduğu seyahat grubunu gösterir.
•   Kisi_No: Grubun içindeki kişi sırasını gösterir.

Bu yeni değişkenler, yolcuların birlikte seyahat edip etmediklerini ve grup içindeki konumlarını anlamamıza yardımcı olabilir. Bu bilgiler, modelin performansını artırmak için kullanılabilir. Örneğin:

• Tek başına seyahat edenlerin davranışları farklı olabilir.
•   Aile grupları benzer cabin, homeplanet ve destination bilgilerine sahiptir.
•   Grup içindeki kişi sayısı, taşınma olasılığı üzerinde etkili olabilir.
train <- train %>%
  group_by(Grup_No) %>%
  mutate(Grup_Buyuklugu = n()) %>%
  ungroup()

test <- test %>%
  group_by(Grup_No) %>%
  mutate(Grup_Buyuklugu= n()) %>%
  ungroup()

Yukarıdaki kod, Grup_No değişkenine göre gruplama yapar ve her grup içindeki yolcu sayısını hesaplayarak yeni bir sütun olan Grup_Buyuklugu oluşturur. group_by(Grup_No) ile yolcuları gruplar, ardından mutate(Grup_Buyuklugu = n()) ile her grup için yolcu sayısını belirler. Son olarak, ungroup() ile gruplamayı kaldırır. Bu yeni değişken, her yolcunun ait olduğu grubun büyüklüğünü temsil eder ve modelleme aşamasında açıklayıcı bir özellik olarak kullanılabilir. Grup büyüklüğü, taşınma olasılığı üzerinde etkili olabilir; örneğin, daha büyük gruplar birlikte hareket etme eğiliminde olabilir.

head(train %>% select(PassengerId, Grup_Buyuklugu), 10)
## # A tibble: 10 × 2
##    PassengerId Grup_Buyuklugu
##    <chr>                <int>
##  1 0001_01                  1
##  2 0002_01                  1
##  3 0003_01                  2
##  4 0003_02                  2
##  5 0004_01                  1
##  6 0005_01                  1
##  7 0006_01                  2
##  8 0006_02                  2
##  9 0007_01                  1
## 10 0008_01                  3
# Kişi yalnız mı seyahat ediyor?
train <- train %>%
  mutate(Yalniz_Seyahat = ifelse(Grup_Buyuklugu == 1, 1, 0))
test <- test %>%
  mutate(Yalniz_Seyahat = ifelse(Grup_Buyuklugu == 1, 1, 0))

Yukarıdaki kod, her yolcunun yalnız seyahat edip etmediğini belirten yeni bir sütun olan Yalniz_Seyahat oluşturur. mutate() fonksiyonu kullanılarak, Grup_Buyuklugu değişkeni kontrol edilir; eğer grup büyüklüğü 1 ise (yani yolcu tek başına seyahat ediyorsa), Yalniz_Seyahat değeri 1 olarak atanır, aksi takdirde 0 olarak atanır. Bu yeni değişken, modelleme aşamasında açıklayıcı bir özellik olarak kullanılabilir ve yalnız seyahat eden yolcuların taşınma olasılığı üzerindeki etkisini incelemek için faydalı olabilir.

table(train$Grup_Buyuklugu)
## 
##    1    2    3    4    5    6    7    8 
## 4805 1682 1020  412  265  174  231  104
train <- train %>%
  mutate(Grup_Buyuklugu_Kat = case_when(
    Grup_Buyuklugu %in% c(1, 2, 3) ~ as.character(Grup_Buyuklugu),
    Grup_Buyuklugu >= 4 ~ "4+"
  )) %>%
  mutate(Grup_Buyuklugu_Kat = factor(Grup_Buyuklugu_Kat))

table(train$Grup_Buyuklugu_Kat)
## 
##    1    2    3   4+ 
## 4805 1682 1020 1186

Yukarıdaki kod, Grup_Buyuklugu değişkenini kategorik bir değişkene dönüştürerek Grup_Buyuklugu_Kat adlı yeni bir sütun oluşturur. case_when() fonksiyonu kullanılarak, grup büyüklüğü 1, 2 veya 3 olan yolcular için bu değerler korunur; ancak grup büyüklüğü 4 veya daha fazla olan yolcular için “4+” kategorisi atanır. Ardından, mutate() ile Grup_Buyuklugu_Kat faktör (factor) türüne dönüştürülür. Bu yeni kategorik değişken, modelleme aşamasında açıklayıcı bir özellik olarak kullanılabilir ve farklı grup büyüklüklerinin taşınma olasılığı üzerindeki etkisini incelemek için faydalı olabilir. Son olarak, table() fonksiyonu ile bu yeni kategorik değişkenin frekans dağılımı görüntülenir.

test <- test %>%
  mutate(Grup_Buyuklugu_Kat = case_when(
    Grup_Buyuklugu %in% c(1, 2, 3) ~ as.character(Grup_Buyuklugu),
    Grup_Buyuklugu >= 4 ~ "4+"
  )) %>%
  mutate(Grup_Buyuklugu_Kat = factor(Grup_Buyuklugu_Kat))

3.2.2 Cabin

Cabin değişkeni, yolcuların kabin konumlarını temsil eder ve genellikle “Deck/Numara/Side” formatında kodlanmıştır. Bu değişken, yolcuların gemideki konumları hakkında önemli bilgiler içerebilir ve modelleme aşamasında açıklayıcı bir özellik olarak kullanılabilir.

# Cabin'den Deck, Numara ve Side bilgilerini çıkaralım
train <- train %>%
  separate(Cabin, into = c("Deck", "Numara", "Side"), sep = "/", remove = FALSE) %>%
  mutate(Deck = as.factor(Deck),
         Side = as.factor(Side),
         Numara = as.integer(Numara))
test <- test %>%
  separate(Cabin, into = c("Deck", "Numara", "Side"), sep = "/", remove = FALSE) %>%
  mutate(Deck = as.factor(Deck),
         Side = as.factor(Side),
         Numara = as.integer(Numara))

Yukarıdaki kod, Cabin sütununu üç yeni sütuna ayırır: Deck, Numara ve Side. separate() fonksiyonu kullanılarak, Cabin içindeki “Deck/Numara/Side” formatına göre ayırma işlemi gerçekleştirilir. Ardından, mutate() fonksiyonu ile Deck ve Side faktör (factor) türüne dönüştürülürken, Numara tam sayı (integer) türüne dönüştürülür. Bu yeni değişkenler, yolcuların gemideki konumlarını temsil eder ve modelleme aşamasında açıklayıcı değişkenler olarak kullanılabilir. Örneğin, belirli bir güvertede (deck) veya tarafta (side) seyahat eden yolcuların taşınma olasılıkları farklı olabilir.

head(train %>% select(Cabin, Deck, Numara, Side))
## # A tibble: 6 × 4
##   Cabin Deck  Numara Side 
##   <chr> <fct>  <int> <fct>
## 1 B/0/P B          0 P    
## 2 F/0/S F          0 S    
## 3 A/0/S A          0 S    
## 4 A/0/S A          0 S    
## 5 F/1/S F          1 S    
## 6 F/0/P F          0 P

Bu sayede üç yeni değişken elde ettik:

•   Deck: Yolcunun kabin güvertesini gösterir.
•   Numara: Kabin numarasını gösterir.
•   Side: Kabinin gemideki tarafını (sol/sağ) gösterir.

Bu yeni değişkenler, yolcuların gemideki konumlarını anlamamıza yardımcı olabilir. Bu bilgiler, modelin performansını artırmak için kullanılabilir. Örneğin:

•   Bazı güverteler veya taraflar, anomaliye karşı daha savunmasız olabilir.
•   Kabin numarası, yolcunun gemideki konumunu ve dolayısıyla taşınma olasılığını etkileyebilir.
summary(train %>% select(Deck, Numara, Side))
##       Deck          Numara         Side     
##  F      :2794   Min.   :   0.0   P   :4206  
##  G      :2559   1st Qu.: 167.2   S   :4288  
##  E      : 876   Median : 427.0   NA's: 199  
##  B      : 779   Mean   : 600.4              
##  C      : 747   3rd Qu.: 999.0              
##  (Other): 739   Max.   :1894.0              
##  NA's   : 199   NA's   :199
table(train$Deck)
## 
##    A    B    C    D    E    F    G    T 
##  256  779  747  478  876 2794 2559    5
# A, D ve T güvertelerinde çok az yolcu var, bunları "Diğer" kategorisine alalım
train <- train %>%
  mutate(Deck = fct_collapse(Deck,
                             Diğer = c("A", "D", "T")))
test <- test %>%
  mutate(Deck = fct_collapse(Deck,
                             Diğer = c("A", "D", "T")))

Yukarıdaki kod, Deck değişkenindeki az sayıda gözleme sahip olan “A”, “D” ve “T” kategorilerini “Diğer” adlı yeni bir kategori altında birleştirir. fct_collapse() fonksiyonu kullanılarak, belirtilen kategoriler tek bir kategoriye dönüştürülür. Bu işlem, modelleme aşamasında nadir kategorilerin etkisini azaltmak ve modelin genelleme yeteneğini artırmak için faydalı olabilir. Özellikle, az sayıda gözleme sahip kategoriler modelin öğrenme sürecini olumsuz etkileyebilir, bu nedenle bu tür kategorilerin birleştirilmesi yaygın bir uygulamadır.

summary(train$Deck)
## Diğer     B     C     E     F     G  NA's 
##   739   779   747   876  2794  2559   199

3.2.3 Name

Name değişkeni, yolcuların isimlerini içerir ve genellikle kişisel bilgileri temsil eder. Bu değişken, doğrudan modelleme aşamasında kullanılmaktan ziyade, içindeki bilgileri çıkartarak yeni açıklayıcı değişkenler (features) oluşturmak için kullanılabilir.

# Name ad ve soyad bilgilerini çıkaralım
train <- train %>%
  separate(Name, into = c("Ad", "Soyad"), sep = " ", remove = FALSE)
test <- test %>%
  separate(Name, into = c("Ad", "Soyad"), sep = " ", remove = FALSE)

Yukarıdaki kod, Name sütununu iki yeni sütuna ayırır: Soyad ve Ad. separate() fonksiyonu kullanılarak, Name içindeki boşluk karakterine göre ayırma işlemi gerçekleştirilir. Bu yeni değişkenler, yolcuların isimlerini temsil eder ve modelleme aşamasında açıklayıcı değişkenler olarak kullanılabilir. Örneğin, belirli bir soyada sahip yolcuların taşınma olasılıkları farklı olabilir veya belirli adlara sahip yolcuların demografik özellikleri üzerinde analizler yapılabilir.

head(train %>% select(Name, Soyad, Ad))
## # A tibble: 6 × 3
##   Name              Soyad       Ad    
##   <chr>             <chr>       <chr> 
## 1 Maham Ofracculy   Ofracculy   Maham 
## 2 Juanna Vines      Vines       Juanna
## 3 Altark Susent     Susent      Altark
## 4 Solam Susent      Susent      Solam 
## 5 Willy Santantines Santantines Willy 
## 6 Sandie Hinetthews Hinetthews  Sandie

Bu sayede iki yeni değişken elde ettik:

•   Soyad: Yolcunun soyadını gösterir.
•   Ad: Yolcunun adını gösterir.

Bu yeni değişkenler, yolcuların isimlerini anlamamıza yardımcı olabilir. Bu bilgiler, modelin performansını artırmak için kullanılabilir. Örneğin: • Bazı soyadlar belirli demografik gruplarla ilişkilendirilebilir. • Adlar, kültürel veya coğrafi kökenler hakkında ipuçları verebilir.

3.3 Boş Değerlerin Doldurulması

Veri setindeki eksik (NA) değerlerin doldurulması, veri ön işleme sürecinde kritik bir adımdır. Eksik veriler, model performansını olumsuz etkileyebilir, bu nedenle uygun yöntemlerle doldurulmaları önemlidir.

3.3.1 HomePlanet Değişkeni

Yolcuların gezegen bilgisi olan HomePlanet değişkeninde eksik değerler bulunmaktadır. Bu eksik değerleri doldurmak için, yolcuların diğer özelliklerine (örneğin, Cabin, Destination) dayanarak en olası gezegeni atayabiliriz.

Home_Planet_GrupNO_bilgi <- train %>%
  group_by(Grup_No) %>%
  summarize(
    grup_kac_kisi       = n(),
    kacinin_HP_bilgisi_bos       = sum(is.na(HomePlanet)),           
    kacinin_HP_bilgisi_dolu   = sum(!is.na(HomePlanet)),         
    Grup_kac_farkli_HP  = n_distinct(HomePlanet, na.rm = TRUE)
  ) %>%
  ungroup()

head(Home_Planet_GrupNO_bilgi)
## # A tibble: 6 × 5
##   Grup_No grup_kac_kisi kacinin_HP_bilgisi_bos kacinin_HP_bilgisi_dolu
##   <fct>           <int>                  <int>                   <int>
## 1 0001                1                      0                       1
## 2 0002                1                      0                       1
## 3 0003                2                      0                       2
## 4 0004                1                      0                       1
## 5 0005                1                      0                       1
## 6 0006                2                      0                       2
## # ℹ 1 more variable: Grup_kac_farkli_HP <int>

Yukarıdaki kod, train veri setindeki yolcuları Grup_No değişkenine göre gruplar ve her grup için çeşitli istatistikleri hesaplar. summarize() fonksiyonu kullanılarak, her grup içindeki toplam yolcu sayısı (grup_kac_kisi), HomePlanet bilgisi eksik olan yolcu sayısı (kacinin_HP_bilgisi_bos), HomePlanet bilgisi dolu olan yolcu sayısı (kacinin_HP_bilgisi_dolu) ve grup içindeki farklı HomePlanet sayısı (Grup_kac_farkli_HP) hesaplanır. Son olarak, ungroup() ile gruplama kaldırılır. Bu özet bilgiler, HomePlanet değişkenindeki eksik değerleri doldurmak için kullanılabilir ve her grubun gezegen bilgisi hakkında daha iyi bir anlayış sağlar.

table(Home_Planet_GrupNO_bilgi$Grup_kac_farkli_HP)
## 
##    0    1 
##  110 6107
grup_0 <- Home_Planet_GrupNO_bilgi %>%
  filter(Grup_kac_farkli_HP == 0)

# Bu gruplarda kaç tane dolu HP var?
sum(grup_0$kacinin_HP_bilgisi_dolu)
## [1] 0

Yukarıdaki kod, Home_Planet_GrupNO_bilgi veri setinden Grup_kac_farkli_HP değeri 0 olan grupları filtreler ve grup_0 adlı yeni bir veri seti oluşturur.

Bu, 0 farklı HomePlanet görülen 110 grubun tamamında gerçekten hiç HP kaydı olmadığını ispatlar.

grup_1 <- Home_Planet_GrupNO_bilgi %>%
  filter(Grup_kac_farkli_HP == 1)

Yukarıdaki kod, Home_Planet_GrupNO_bilgi veri setinden Grup_kac_farkli_HP değeri 1 olan grupları filtreler ve grup_1 adlı yeni bir veri seti oluşturur. Bu gruplar, HomePlanet bilgisi eksik olan yolcuların bulunduğu ancak grup içindeki diğer yolcuların HomePlanet bilgisi dolu olduğu gruplardır. Bu bilgi, eksik HomePlanet değerlerini doldurmak için kullanılabilir, çünkü aynı gruptaki diğer yolcuların gezegen bilgisi, eksik olan yolcular için en olası değeri belirlemeye yardımcı olabilir.

# Bu grupların içindeki HomePlanet değerlerini görelim
table(grup_1$Grup_kac_farkli_HP, useNA = "ifany")
## 
##    1 
## 6107

Yukarıdaki kod, grup_1 veri setindeki Grup_kac_farkli_HP değişkeninin frekans dağılımını görüntüler. table() fonksiyonu kullanılarak, bu grupların içindeki HomePlanet değerlerinin dağılımı ve eksik (NA) değerlerin varlığı hakkında bilgi edinilir. useNA = "ifany" parametresi, eğer varsa eksik değerlerin de tabloya dahil edilmesini sağlar. Bu analiz, eksik HomePlanet değerlerini doldurmak için kullanılabilecek en olası gezegenleri belirlemeye yardımcı olabilir.

Bir grupta dolu HomePlanet varsa tüm üyelerde aynıdır. Aynı grupta iki farklı gezegen asla görülmemiştir. Bu nedenle, eksik HomePlanet değerlerini doldurmak için grup içindeki dolu HomePlanet değerini kullanabiliriz.

# Doldurmadan önce/sonra kaç NA vardı görmek istersen:
sum(is.na(train$HomePlanet))  # şu anki NA sayısı
## [1] 201
# 1) Her grup için referans HomePlanet bilgisini çıkaralım
hp_referans_train <- train %>%
  group_by(Grup_No) %>%
  summarise(
    Grup_HP = HomePlanet[!is.na(HomePlanet)][1],  # gruptaki ilk dolu HomePlanet
    .groups = "drop"
  )

hp_referans_test <- test %>%
  group_by(Grup_No) %>%
  summarise(
    Grup_HP = HomePlanet[!is.na(HomePlanet)][1],  # gruptaki ilk dolu HomePlanet
    .groups = "drop"
  )
head(hp_referans_train)
## # A tibble: 6 × 2
##   Grup_No Grup_HP
##   <fct>   <fct>  
## 1 0001    Europa 
## 2 0002    Earth  
## 3 0003    Europa 
## 4 0004    Earth  
## 5 0005    Earth  
## 6 0006    Earth

Yukarıdaki kod, train veri setindeki yolcuları Grup_No değişkenine göre gruplar ve her grup için ilk dolu HomePlanet değerini çıkararak hp_referans_train adlı yeni bir veri seti oluşturur. summarise() fonksiyonu kullanılarak, her grup içindeki HomePlanet bilgisi eksik olmayan ilk değeri (Grup_HP) belirlenir. .groups = "drop" parametresi, gruplama işleminin ardından gruplama yapısını kaldırır. Bu referans HomePlanet bilgisi, eksik HomePlanet değerlerini doldurmak için kullanılabilir.

# 2) Orijinal train veri seti ile bu referans bilgiyi birleştirelim
train <- train %>%
  left_join(hp_referans_train, by = "Grup_No")
test <- test %>%
  left_join(hp_referans_test, by = "Grup_No")
head(train %>% select(PassengerId, HomePlanet, Grup_HP))
## # A tibble: 6 × 3
##   PassengerId HomePlanet Grup_HP
##   <chr>       <fct>      <fct>  
## 1 0001_01     Europa     Europa 
## 2 0002_01     Earth      Earth  
## 3 0003_01     Europa     Europa 
## 4 0003_02     Europa     Europa 
## 5 0004_01     Earth      Earth  
## 6 0005_01     Earth      Earth

Yukarıdaki kod, train ve test veri setlerine hp_referans_train ve hp_referans_test veri setlerinden elde edilen referans HomePlanet bilgilerini ekler. left_join() fonksiyonu kullanılarak, her iki veri seti Grup_No değişkeni üzerinden birleştirilir. Bu işlem sonucunda, her yolcunun ait olduğu grubun referans HomePlanet bilgisi (Grup_HP) orijinal veri setine eklenir. Bu yeni bilgi, eksik HomePlanet değerlerini doldurmak için kullanılabilir.

# 3) Eksik HomePlanet değerlerini dolduralım
train <- train %>%
  mutate(HomePlanet = coalesce(HomePlanet, Grup_HP)) %>%
  select(-Grup_HP)
test <- test %>%
  mutate(HomePlanet = coalesce(HomePlanet, Grup_HP)) %>%
  select(-Grup_HP)  # artık gerek yok, silebiliriz

Yukarıdaki kod, train ve test veri setlerindeki eksik (NA) HomePlanet değerlerini doldurur. mutate() fonksiyonu kullanılarak, ifelse() ile HomePlanet değeri eksik olan yolcular için Grup_HP (grup referans HomePlanet) değeri atanır; eğer HomePlanet değeri dolu ise mevcut değeri korunur. Ardından, select(-Grup_HP) ile artık ihtiyaç duyulmayan Grup_HP sütunu veri setinden kaldırılır. Bu işlem sonucunda, HomePlanet değişkenindeki eksik değerler uygun şekilde doldurulmuş olur.

# Doldurduktan sonra kaç NA kaldı görmek istersen:
sum(is.na(train$HomePlanet))  # doldurduktan sonraki NA sayısı
## [1] 111
soyad_planet_analizi <- train %>%
  group_by(Soyad) %>%
  summarise(
    soyad_kac_kisi = n(),
    kac_farkli_HP = n_distinct(HomePlanet, na.rm = TRUE),
    hangi_HP = paste(unique(HomePlanet[!is.na(HomePlanet)]), collapse = ", "),
    .groups = "drop"
  )
head(soyad_planet_analizi)
## # A tibble: 6 × 4
##   Soyad      soyad_kac_kisi kac_farkli_HP hangi_HP
##   <chr>               <int>         <int> <chr>   
## 1 Acobson                 4             1 "Earth" 
## 2 Acobsond                3             1 "Earth" 
## 3 Adavisons               9             1 "Earth" 
## 4 Adkinson                3             1 "Earth" 
## 5 Admingried              4             1 "Europa"
## 6 Ageurante               1             0 ""

Yukarıdaki kod, train veri setindeki yolcuları Soyad değişkenine göre gruplar ve her soyad için çeşitli istatistikleri hesaplar. summarise() fonksiyonu kullanılarak, her soyad içindeki toplam yolcu sayısı (soyad_kac_kisi), farklı HomePlanet sayısı (kac_farkli_HP) ve dolu HomePlanet değerlerinin birleşik bir listesini (hangi_HP) oluşturur. na.rm = TRUE parametresi, eksik (NA) değerlerin hesaplamalara dahil edilmemesini sağlar. Son olarak, .groups = "drop" ile gruplama kaldırılır. Bu özet bilgiler, soyad bazında HomePlanet dağılımını anlamamıza yardımcı olur ve eksik HomePlanet değerlerini doldurmak için kullanılabilir.

table(soyad_planet_analizi$kac_farkli_HP)
## 
##    0    1    3 
##    7 2210    1

Soyad bazında HomePlanet tutarlılığını incelediğimizde 2210 farklı soyadın tamamının yalnızca tek bir gezegenden geldiği görülmüştür. Bu, soyadın aile yapısını doğru şekilde temsil ettiğini ve eksik HomePlanet değerlerini soyad bazında doldurmanın mantıklı olduğunu destekler.

Ancak analizde yalnızca bir özel durum ortaya çıkmaktadır: Soyad = NA olan yolcuların bulunduğu tek grup, üç farklı gezegenden gelen kişiler içermektedir. Bu durum soyad bilgisi tamamen eksik olan bu kişilerin aslında bir soyadı paylaşmadıklarını, sadece soyadları bulunmadığı için aynı kategoriye düştüklerini göstermektedir. Bu nedenle bu grup, bir aileyi temsil etmez ve HomePlanet açısından tutarsız görünmesi tamamen beklenen bir durumdur.

Bu bulgu, gerçek soyadı olan yolcular arasında herhangi bir tutarsızlık olmadığını ve soyadının aile ilişkilerini temsil etmek için güvenilir bir değişken olduğunu doğrulamaktadır.

hp_referans_soyad <- soyad_planet_analizi %>%
filter(kac_farkli_HP == 1) %>%
  select(Soyad, Soyad_HP = hangi_HP)
head(hp_referans_soyad)
## # A tibble: 6 × 2
##   Soyad      Soyad_HP
##   <chr>      <chr>   
## 1 Acobson    Earth   
## 2 Acobsond   Earth   
## 3 Adavisons  Earth   
## 4 Adkinson   Earth   
## 5 Admingried Europa  
## 6 Aginge     Europa
# Orijinal train veri seti ile bu referans bilgiyi birleştirelim
train <- train %>%
  left_join(hp_referans_soyad, by = "Soyad")
test <- test %>%
  left_join(hp_referans_soyad, by = "Soyad")
# Dolduralım
train <- train %>%
  mutate(HomePlanet = coalesce(HomePlanet, Soyad_HP)) %>%
  select(-Soyad_HP)
test <- test %>%
  mutate(HomePlanet = coalesce(HomePlanet, Soyad_HP)) %>%
  select(-Soyad_HP)  # Soyad_HP gerek yok, silebiliriz

Yukarıdaki kod, train ve test veri setlerine hp_referans_soyad veri setinden elde edilen referans HomePlanet bilgilerini ekler. left_join() fonksiyonu kullanılarak, her iki veri seti Soyad değişkeni üzerinden birleştirilir. Bu işlem sonucunda, her yolcunun soyadına karşılık gelen referans HomePlanet bilgisi (Soyad_HP) orijinal veri setine eklenir. Ardından, mutate() fonksiyonu ile ifelse() kullanılarak HomePlanet değeri eksik olan yolcular için Soyad_HP değeri atanır; eğer HomePlanet değeri dolu ise mevcut değeri korunur. Son olarak, select(-Soyad_HP) ile artık ihtiyaç duyulmayan Soyad_HP sütunu veri setinden kaldırılır. Bu işlem sonucunda, HomePlanet değişkenindeki eksik değerler uygun şekilde doldurulmuş olur.

# Doldurduktan sonra kaç NA kaldı görmek istersen:
sum(is.na(train$HomePlanet)) 
## [1] 12
sum(is.na(test$HomePlanet)) 
## [1] 7
Home_Planet_Deck_bilgi <- train %>%
  group_by(Deck) %>%
  summarize(
    grup_kac_kisi       = n(),
    kacinin_HP_bilgisi_bos       = sum(is.na(HomePlanet)),           
    kacinin_HP_bilgisi_dolu   = sum(!is.na(HomePlanet)),         
    Grup_kac_farkli_HP  = n_distinct(HomePlanet, na.rm = TRUE),
    hangi_HP = paste(unique(HomePlanet[!is.na(HomePlanet)]), collapse = ", "),
  ) %>%
  ungroup()

Home_Planet_Deck_bilgi
## # A tibble: 7 × 6
##   Deck  grup_kac_kisi kacinin_HP_bilgisi_bos kacinin_HP_bilgisi_dolu
##   <fct>         <int>                  <int>                   <int>
## 1 Diğer           739                      2                     737
## 2 B               779                      0                     779
## 3 C               747                      1                     746
## 4 E               876                      1                     875
## 5 F              2794                      6                    2788
## 6 G              2559                      2                    2557
## 7 <NA>            199                      0                     199
## # ℹ 2 more variables: Grup_kac_farkli_HP <int>, hangi_HP <chr>

Yukarıdaki kod, train veri setindeki yolcuları Deck değişkenine göre gruplar ve her güverte için çeşitli istatistikleri hesaplar. summarize() fonksiyonu kullanılarak, her güverte içindeki toplam yolcu sayısı (grup_kac_kisi), HomePlanet bilgisi eksik olan yolcu sayısı (kacinin_HP_bilgisi_bos), HomePlanet bilgisi dolu olan yolcu sayısı (kacinin_HP_bilgisi_dolu), farklı HomePlanet sayısı (Grup_kac_farkli_HP) ve dolu HomePlanet değerlerinin birleşik bir listesini (hangi_HP) oluşturur. na.rm = TRUE parametresi, eksik (NA) değerlerin hesaplamalara dahil edilmemesini sağlar. Son olarak, ungroup() ile gruplama kaldırılır. Bu özet bilgiler, Deck değişkeni bazında HomePlanet dağılımını anlamamıza yardımcı olur ve eksik HomePlanet değerlerini doldurmak için kullanılabilir. B ve C, Europa gezegeninden yolcuların, G ise Earth yolcularının konakladığı Deckler.

# Deck bazında dolduralım
hp_referans_deck <- Home_Planet_Deck_bilgi %>%
  filter(Grup_kac_farkli_HP == 1) %>%
  select(Deck, Deck_HP = hangi_HP)
head(hp_referans_deck)
## # A tibble: 3 × 2
##   Deck  Deck_HP
##   <fct> <chr>  
## 1 B     Europa 
## 2 C     Europa 
## 3 G     Earth
# Orijinal train veri seti ile bu referans bilgiyi birleştirelim
train <- train %>%
  left_join(hp_referans_deck, by = "Deck")
test <- test %>%
  left_join(hp_referans_deck, by = "Deck")
# Dolduralım
train <- train %>%
  mutate(HomePlanet = coalesce(HomePlanet, Deck_HP)) %>%
  select(-Deck_HP)
test <- test %>%
  mutate(HomePlanet = coalesce(HomePlanet, Deck_HP)) %>%
  select(-Deck_HP)  # artık gerek yok, silebiliriz
# Doldurduktan sonra kaç NA kaldı görmek istersen:
sum(is.na(train$HomePlanet)) 
## [1] 9
sum(is.na(test$HomePlanet))
## [1] 5
table(train$HomePlanet)
## 
##  Earth Europa   Mars 
##   4707   2173   1804
train <- train %>%
  mutate(HomePlanet = coalesce(HomePlanet, "Earth"))
test <- test %>%
  mutate(HomePlanet = coalesce(HomePlanet, "Earth"))

Yukarıdaki kod, train ve test veri setlerindeki eksik (NA) HomePlanet değerlerini “Earth” olarak doldurur. mutate() fonksiyonu kullanılarak, coalesce() ile HomePlanet değeri eksik olan yolcular için “Earth” değeri atanır; eğer HomePlanet değeri dolu ise mevcut değeri korunur. Bu işlem sonucunda, HomePlanet değişkenindeki tüm eksik değerler uygun şekilde doldurulmuş olur.

sum(is.na(train$HomePlanet))
## [1] 0
sum(is.na(test$HomePlanet))
## [1] 0
train$HomePlanet <- as.factor(train$HomePlanet)
test$HomePlanet <- as.factor(test$HomePlanet)

3.3.2 Destination Değişkeni

Destination değişkeni, yolcuların varış noktalarını temsil eder ve bazı eksik değerlere sahiptir. Bu eksik değerleri doldurmak için, yolcuların diğer özelliklerine (örneğin, HomePlanet, Cabin) dayanarak en olası varış noktasını atayabiliriz.

Dest_deck_bilgi <- train %>%
  group_by(Deck) %>%
  summarize(
    grup_kac_kisi       = n(),
    kacinin_D_bilgisi_bos       = sum(is.na(Destination)),           
    kacinin_D_bilgisi_dolu   = sum(!is.na(Destination)),         
    Grup_kac_farkli_D = n_distinct(Destination, na.rm = TRUE),
    hangi_D = paste(unique(Destination[!is.na(Destination)]), collapse = ", "),
  ) %>%
  ungroup() 

table(Dest_deck_bilgi$Grup_kac_farkli_D)
## 
## 3 
## 7

Yukarıdaki kod, train veri setindeki yolcuları Grup_No değişkenine göre gruplar ve her grup için çeşitli istatistikleri hesaplar. summarize() fonksiyonu kullanılarak, her grup içindeki toplam yolcu sayısı (grup_kac_kisi), Destination bilgisi eksik olan yolcu sayısı (kacinin_D_bilgisi_bos), Destination bilgisi dolu olan yolcu sayısı (kacinin_D_bilgisi_dolu), farklı Destination sayısı (Grup_kac_farkli_D) ve dolu Destination değerlerinin birleşik bir listesini (hangi_D) oluşturur. na.rm = TRUE parametresi, eksik (NA) değerlerin hesaplamalara dahil edilmemesini sağlar. Son olarak, ungroup() ile gruplama kaldırılır. Bu özet bilgiler, Destination değişkenindeki eksik değerleri doldurmak için yeterli değil.

Dest_Ad_bilgi <- train %>%
  group_by(Ad) %>%
  summarize(
    grup_kac_kisi       = n(),
    kacinin_D_bilgisi_bos       = sum(is.na(Destination)),           
    kacinin_D_bilgisi_dolu   = sum(!is.na(Destination)),         
    Grup_kac_farkli_D = n_distinct(Destination, na.rm = TRUE),
    hangi_D = paste(unique(Destination[!is.na(Destination)]), collapse = ", "),
  ) %>%
  ungroup() %>%
  filter(grup_kac_kisi > 1) 

table(Dest_Ad_bilgi$Grup_kac_farkli_D)
## 
##    1    2    3 
##  770 1054  270
Dest_Soyad_bilgi <- train %>%
  group_by(Soyad) %>%
  summarize(
    grup_kac_kisi       = n(),
    kacinin_D_bilgisi_bos       = sum(is.na(Destination)),           
    kacinin_D_bilgisi_dolu   = sum(!is.na(Destination)),         
    Grup_kac_farkli_D = n_distinct(Destination, na.rm = TRUE),
    hangi_D = paste(unique(Destination[!is.na(Destination)]), collapse = ", "),
  ) %>%
  ungroup() %>%
  filter(grup_kac_kisi > 1) 

table(Dest_Soyad_bilgi$Grup_kac_farkli_D)
## 
##   1   2   3 
## 620 948 268

Belirli bir ada veya soyada sahip yolcuların varış noktaları genellikle tutarlı değil.

library(rpart)
library(rpart.plot)
dt_model <- rpart(
  Destination ~ HomePlanet + Deck + Side + Age + CryoSleep + VIP + RoomService + 
    FoodCourt + ShoppingMall + Spa + VRDeck + Grup_Buyuklugu_Kat+ Yalniz_Seyahat,
  data = train %>% filter(!is.na(Destination)),
  method = "class",
  cp = 0.00221
)
dt_small <- rpart(
  Destination ~ HomePlanet + Deck + Side + Age + CryoSleep + VIP + RoomService + 
    FoodCourt + ShoppingMall + Spa + VRDeck + Grup_Buyuklugu_Kat+ Yalniz_Seyahat,
  data = train %>% filter(!is.na(Destination)),
  method = "class",
  cp = 0.002,        
)
rpart.plot(
  dt_small
)

Yukarıdaki kod, karar ağacı (decision tree) modeli oluşturmak için rpart paketini kullanır. rpart() fonksiyonu ile Destination değişkenini tahmin etmek için bir model kurulur. Modelde açıklayıcı değişkenler olarak HomePlanet, Deck, Side, Age, CryoSleep, VIP, RoomService, FoodCourt, ShoppingMall, Spa, VRDeck, Grup_Buyuklugu_Kat ve Yalniz_Seyahat kullanılır. Model, yalnızca Destination değeri eksik olmayan yolcular üzerinde eğitilir (filter(!is.na(Destination))). method = "class" parametresi, sınıflandırma problemi olduğunu belirtir ve cp = 0.00221 parametresi, modelin karmaşıklığını kontrol eden bir kesme parametresidir.