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:
Veri Setini Anlama: Veri setindeki değişkenleri ve hedef değişkeni inceleyerek, problemin doğasını anlayacağız.
Veri Ön İşleme: Eksik verileri ele alacak, kategorik değişkenleri dönüştürecek ve gerekli veri temizleme işlemlerini yapacağız.
Keşifsel Veri Analizi (EDA): Veriyi görselleştirerek ve istatistiksel özetler çıkararak, veri setindeki önemli desenleri ve ilişkileri keşfedeceğiz.
Modelleme: Farklı makine öğrenmesi algoritmalarını kullanarak modeller oluşturacak ve performanslarını karşılaştıracağız.
Model Değerlendirme: Modellerin doğruluk, hassasiyet, geri çağırma ve F1 skoru gibi değerlendirme metriklerini kullanarak performanslarını ölçeceğiz.
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)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.5.1
## ✔ ggplot2 4.0.0 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readr)
library(rmarkdown)
# Veri setini R ortamına alalım
train <- read_csv("train.csv")
## Rows: 8693 Columns: 14
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): PassengerId, HomePlanet, Cabin, Destination, Name
## dbl (6): Age, RoomService, FoodCourt, ShoppingMall, Spa, VRDeck
## lgl (3): CryoSleep, VIP, Transported
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
test <- read_csv("test.csv")
## Rows: 4277 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): PassengerId, HomePlanet, Cabin, Destination, Name
## dbl (6): Age, RoomService, FoodCourt, ShoppingMall, Spa, VRDeck
## lgl (2): CryoSleep, VIP
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 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:
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.
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.
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.
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.
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.
# 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.
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.
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
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
)
rpart.plot(
dt_model
)
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.
# 1) Sadece Destination NA olanları tahmin edelim
train$Destination_tree_pred <- predict(
dt_model,
newdata = train,
type = "class"
)
Yukarıdaki kod, oluşturulan karar ağacı modelini kullanarak train veri setindeki yolcular için Destination tahminleri yapar. predict() fonksiyonu ile dt_model kullanılarak, train veri setindeki her yolcu için tahmin edilen Destination değerleri hesaplanır. type = “class” parametresi, sınıflandırma problemlerinde sınıf etiketlerinin döndürülmesini sağlar. Elde edilen tahminler, Destination_tree_pred adlı yeni bir sütun olarak train veri setine eklenir. Bu tahminler, eksik Destination değerlerini doldurmak için kullanılabilir.
test$Destination_tree_pred <- predict(
dt_model,
newdata = test,
type = "class"
)
Yukarıdaki kod, oluşturulan karar ağacı modelini kullanarak test veri setindeki yolcular için Destination tahminleri yapar. predict() fonksiyonu ile dt_model kullanılarak, test veri setindeki her yolcu için tahmin edilen Destination değerleri hesaplanır. type = “class” parametresi, sınıflandırma problemlerinde sınıf etiketlerinin döndürülmesini sağlar. Elde edilen tahminler, Destination_tree_pred adlı yeni bir sütun olarak test veri setine eklenir. Bu tahminler, eksik Destination değerlerini doldurmak için kullanılabilir.
rpart.rules(
dt_model,
style = "tall", # her kural alt alta, daha okunaklı
cover = TRUE, # her kuralın kaç gözlemi kapsadığını gösterir
nn = TRUE # node numaralarını gösterir
)
## 55 C PSO TRAP
## [128] Destination is 55 Cancri e [ .55 .02 .43] with cover 3% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 15 to 62
## Deck is C
## Grup_Buyuklugu_Kat is 1 or 2 or 4+
##
## [260] Destination is 55 Cancri e [ .61 .00 .39] with cover 1% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 36 to 47
## Deck is Diğer or B or E
##
## [4184] Destination is 55 Cancri e [ .62 .00 .38] with cover 1% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 15 to 27
## Deck is Diğer or B
## VIP is FALSE
## Grup_Buyuklugu_Kat is 1 or 3 or 4+
##
## [84] Destination is 55 Cancri e [ .62 .11 .28] with cover 1% when
## HomePlanet is Europa
## CryoSleep is FALSE
## VIP is TRUE
## FoodCourt is 16 to 9637
## VRDeck >= 1110
##
## [170] Destination is 55 Cancri e [ .64 .00 .36] with cover 1% when
## HomePlanet is Europa
## CryoSleep is FALSE
## VIP is FALSE
## FoodCourt is 16 to 9637
## VRDeck >= 1110
## RoomService >= 70
##
## [342] Destination is 55 Cancri e [ .68 .00 .32] with cover 0% when
## HomePlanet is Europa
## CryoSleep is FALSE
## VIP is FALSE
## FoodCourt is 16 to 9637
## VRDeck is 1110 to 1373
## RoomService < 70
##
## [20] Destination is 55 Cancri e [ .71 .00 .29] with cover 1% when
## HomePlanet is Europa
## CryoSleep is FALSE
## FoodCourt >= 9637
##
## [522] Destination is 55 Cancri e [ .78 .00 .22] with cover 0% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 15 to 36
## Deck is Diğer or B or E
## VIP is TRUE
##
## [2093] Destination is TRAPPIST-1e [ .43 .01 .57] with cover 1% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 27 to 36
## Deck is Diğer or B or E
## VIP is FALSE
## Grup_Buyuklugu_Kat is 1 or 3 or 4+
##
## [1047] Destination is TRAPPIST-1e [ .42 .01 .57] with cover 2% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 15 to 36
## Deck is Diğer or B or E
## VIP is FALSE
## Grup_Buyuklugu_Kat is 2
##
## [129] Destination is TRAPPIST-1e [ .36 .06 .58] with cover 0% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 15 to 62
## Deck is C
## Grup_Buyuklugu_Kat is 3
##
## [131] Destination is TRAPPIST-1e [ .39 .00 .61] with cover 1% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 47 to 62
## Deck is Diğer or B or E
##
## [343] Destination is TRAPPIST-1e [ .36 .00 .64] with cover 3% when
## HomePlanet is Europa
## CryoSleep is FALSE
## VIP is FALSE
## FoodCourt is 16 to 9637
## VRDeck >= 1373
## RoomService < 70
##
## [33] Destination is TRAPPIST-1e [ .36 .00 .64] with cover 0% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 5 to 15
##
## [43] Destination is TRAPPIST-1e [ .33 .01 .66] with cover 7% when
## HomePlanet is Europa
## CryoSleep is FALSE
## FoodCourt is 16 to 9637
## VRDeck < 1110
##
## [3] Destination is TRAPPIST-1e [ .14 .12 .74] with cover 75% when
## HomePlanet is Earth or Mars
##
## [4185] Destination is TRAPPIST-1e [ .25 .00 .75] with cover 0% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age is 15 to 27
## Deck is E
## VIP is FALSE
## Grup_Buyuklugu_Kat is 1 or 3 or 4+
##
## [17] Destination is TRAPPIST-1e [ .23 .00 .77] with cover 0% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age >= 62
##
## [11] Destination is TRAPPIST-1e [ .16 .00 .84] with cover 2% when
## HomePlanet is Europa
## CryoSleep is FALSE
## FoodCourt < 16
##
## [9] Destination is TRAPPIST-1e [ .00 .00 1.00] with cover 0% when
## HomePlanet is Europa
## CryoSleep is TRUE
## Age < 5
train <- train %>%
mutate(
Destination_tree_pred2 = case_when(
# [128] 55 Cancri e, cover 3%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 15 & Age <= 62 &
Deck == "C" &
Grup_Buyuklugu_Kat %in% c("1", "2", "4+") ~ "55 Cancri e",
# [260] 55 Cancri e, cover 1%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 36 & Age <= 47 &
Deck %in% c("Diğer", "B", "E") ~ "55 Cancri e",
# [4184] 55 Cancri e, cover 1%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 15 & Age <= 27 &
Deck %in% c("Diğer", "B") &
VIP == FALSE &
Grup_Buyuklugu_Kat %in% c("1", "3", "4+") ~ "55 Cancri e",
# [84] 55 Cancri e, cover 1%
HomePlanet == "Europa" &
CryoSleep == FALSE &
VIP == TRUE &
FoodCourt >= 16 & FoodCourt <= 9637 &
VRDeck >= 1110 ~ "55 Cancri e",
# [170] 55 Cancri e, cover 1%
HomePlanet == "Europa" &
CryoSleep == FALSE &
VIP == FALSE &
FoodCourt >= 16 & FoodCourt <= 9637 &
VRDeck >= 1110 &
RoomService >= 70 ~ "55 Cancri e",
# [342] 55 Cancri e, cover 0%
HomePlanet == "Europa" &
CryoSleep == FALSE &
VIP == FALSE &
FoodCourt >= 16 & FoodCourt <= 9637 &
VRDeck >= 1110 & VRDeck <= 1373 &
RoomService < 70 ~ "55 Cancri e",
# [20] 55 Cancri e, cover 1%
HomePlanet == "Europa" &
CryoSleep == FALSE &
FoodCourt >= 9637 ~ "55 Cancri e",
# [522] 55 Cancri e, cover 0%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 15 & Age <= 36 &
Deck %in% c("Diğer", "B", "E") &
VIP == TRUE ~ "55 Cancri e",
# [2093] TRAPPIST-1e, cover 1%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 27 & Age <= 36 &
Deck %in% c("Diğer", "B", "E") &
VIP == FALSE &
Grup_Buyuklugu_Kat %in% c("1", "3", "4+") ~ "TRAPPIST-1e",
# [1047] TRAPPIST-1e, cover 2%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 15 & Age <= 36 &
Deck %in% c("Diğer", "B", "E") &
VIP == FALSE &
Grup_Buyuklugu_Kat %in% c("2") ~ "TRAPPIST-1e",
# [129] TRAPPIST-1e, cover 0%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 15 & Age <= 62 &
Deck == "C" &
Grup_Buyuklugu_Kat %in% c("3") ~ "TRAPPIST-1e",
# [131] TRAPPIST-1e, cover 1%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 47 & Age <= 62 &
Deck %in% c("Diğer", "B", "E") ~ "TRAPPIST-1e",
# [343] TRAPPIST-1e, cover 3%
HomePlanet == "Europa" &
CryoSleep == FALSE &
VIP == FALSE &
FoodCourt >= 16 & FoodCourt <= 9637 &
VRDeck >= 1373 &
RoomService < 70 ~ "TRAPPIST-1e",
# [33] TRAPPIST-1e, cover 0%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 5 & Age <= 15 ~ "TRAPPIST-1e",
# [43] TRAPPIST-1e, cover 7%
HomePlanet == "Europa" &
CryoSleep == FALSE &
FoodCourt >= 16 & FoodCourt <= 9637 &
VRDeck < 1110 ~ "TRAPPIST-1e",
# [3] TRAPPIST-1e, cover 75% (Earth & Mars)
HomePlanet %in% c("Earth", "Mars") ~ "TRAPPIST-1e",
# [4185] TRAPPIST-1e, cover 0%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 15 & Age <= 27 &
Deck == "E" &
VIP == FALSE &
Grup_Buyuklugu_Kat %in% c("1", "3", "4+") ~ "TRAPPIST-1e",
# [17] TRAPPIST-1e, cover 0%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age >= 62 ~ "TRAPPIST-1e",
# [11] TRAPPIST-1e, cover 2%
HomePlanet == "Europa" &
CryoSleep == FALSE &
FoodCourt < 16 ~ "TRAPPIST-1e",
# [9] TRAPPIST-1e, cover 0%
HomePlanet == "Europa" &
CryoSleep == TRUE &
Age < 5 ~ "TRAPPIST-1e",
# Hiçbir kurala girmeyen varsa (teorik olarak kalmamalı)
TRUE ~ "TRAPPIST-1e"
)
)
train$Destination_tree_pred2 <- factor(
train$Destination_tree_pred2,
levels = levels(train$Destination)
)
mean(train$Destination_tree_pred == train$Destination_tree_pred2)
## [1] 0.990222
Yukarıdaki kod, train veri setindeki yolcular için Destination_tree_pred2 adlı yeni bir sütun oluşturur. mutate() fonksiyonu kullanılarak, case_when() ile belirli kurallara dayalı olarak her yolcunun tahmin edilen varış noktası (Destination) atanır. Kurallar, yolcuların özelliklerine (örneğin, HomePlanet, CryoSleep, Age, Deck, VIP, FoodCourt, VRDeck, RoomService, Grup_Buyuklugu_Kat) dayanır ve her kural belirli bir varış noktasını temsil eder. Eğer bir yolcu hiçbir kurala uymuyorsa, varsayılan olarak “TRAPPIST-1e” atanır. Bu işlem sonucunda, her yolcunun tahmin edilen varış noktası belirlenmiş olur.
# 2) Destination NA olan yerleri tree tahminiyle dolduralım
train <- train %>%
mutate(
Destination = ifelse(
is.na(Destination),
as.character(Destination_tree_pred),
as.character(Destination)
),
Destination = factor(Destination)
)
test <- test %>%
mutate(
Destination = ifelse(
is.na(Destination),
as.character(Destination_tree_pred),
as.character(Destination)
),
Destination = factor(Destination)
)
Yukarıdaki kod, train ve test veri setlerindeki eksik (NA) Destination değerlerini doldurur. mutate() fonksiyonu kullanılarak, ifelse() ile Destination değeri eksik olan yolcular için Destination_tree_pred (karar ağacı modeli tarafından tahmin edilen değer) atanır; eğer Destination değeri dolu ise mevcut değeri korunur. Ardından, factor() fonksiyonu ile Destination değişkeni faktör (categorical) veri tipine dönüştürülür ve orijinal seviyeleri korunur. Bu işlem sonucunda, Destination değişkenindeki tüm eksik değerler uygun şekilde doldurulmuş olur.
# Tahmin sütunlarını silelim
train <- train %>%
select(-Destination_tree_pred, -Destination_tree_pred2)
test <- test %>%
select(-Destination_tree_pred)
library(explore)
describe_all(train)
## # A tibble: 24 × 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 Grup_No fct 0 0 6217 NA NA NA
## 3 Kisi_No int 0 0 8 1 1.52 8
## 4 HomePlanet fct 0 0 3 NA NA NA
## 5 CryoSleep fct 217 2.5 3 NA NA NA
## 6 Cabin chr 199 2.3 6561 NA NA NA
## 7 Deck fct 199 2.3 7 NA NA NA
## 8 Numara int 199 2.3 1818 0 600. 1894
## 9 Side fct 199 2.3 3 NA NA NA
## 10 Destination fct 0 0 3 NA NA NA
## # ℹ 14 more rows
3.3.3 CryoSleep Değişkeni
CryoSleep değişkeni, yolcuların kriyosit (dondurulmuş
uyku) durumunu temsil eder ve bazı eksik değerlere sahiptir. Bu eksik
değerleri doldurmak için, yolcuların diğer özelliklerine (örneğin,
HomePlanet, Destination, Cabin) dayanarak en olası kriyosit durumunu
atayabiliriz.
summary(train$CryoSleep)
## FALSE TRUE NA's
## 5439 3037 217
train %>%
mutate(RS = ifelse(RoomService>0, "BZ", "Z")) %>%
group_by(RS) %>%
summarize(
grup_kac_kisi = n(),
kacinin_CS_bilgisi_bos = sum(is.na(CryoSleep)),
kacinin_CS_bilgisi_dolu = sum(!is.na(CryoSleep)),
Grup_kac_farkli_CS = n_distinct(CryoSleep, na.rm = TRUE)
) %>%
ungroup()
## # A tibble: 3 × 5
## RS grup_kac_kisi kacinin_CS_bilgisi_bos kacinin_CS_bilgisi_dolu
## <chr> <int> <int> <int>
## 1 BZ 2935 71 2864
## 2 Z 5577 144 5433
## 3 <NA> 181 2 179
## # ℹ 1 more variable: Grup_kac_farkli_CS <int>
train <- train %>%
mutate(CryoSleep = case_when(
is.na(CryoSleep) & RoomService > 0 ~ "FALSE",
TRUE ~ CryoSleep
))
test <- test %>%
mutate(CryoSleep = case_when(
is.na(CryoSleep) & RoomService > 0 ~ "FALSE",
TRUE ~ CryoSleep
))
train %>%
mutate(FC = ifelse(FoodCourt>0, "BZ", "Z")) %>%
group_by(FC) %>%
summarize(
grup_kac_kisi = n(),
kacinin_CS_bilgisi_bos = sum(is.na(CryoSleep)),
kacinin_CS_bilgisi_dolu = sum(!is.na(CryoSleep)),
Grup_kac_farkli_CS = n_distinct(CryoSleep, na.rm = TRUE)
) %>%
ungroup()
## # A tibble: 3 × 5
## FC grup_kac_kisi kacinin_CS_bilgisi_bos kacinin_CS_bilgisi_dolu
## <chr> <int> <int> <int>
## 1 BZ 3054 37 3017
## 2 Z 5456 108 5348
## 3 <NA> 183 1 182
## # ℹ 1 more variable: Grup_kac_farkli_CS <int>
train <- train %>%
mutate(CryoSleep = case_when(
is.na(CryoSleep) & FoodCourt > 0 ~ "FALSE",
TRUE ~ CryoSleep
))
test <- test %>%
mutate(CryoSleep = case_when(
is.na(CryoSleep) & FoodCourt > 0 ~ "FALSE",
TRUE ~ CryoSleep
))
train %>%
mutate(SM = ifelse(ShoppingMall>0, "BZ", "Z")) %>%
group_by(SM) %>%
summarize(
grup_kac_kisi = n(),
kacinin_CS_bilgisi_bos = sum(is.na(CryoSleep)),
kacinin_CS_bilgisi_dolu = sum(!is.na(CryoSleep)),
Grup_kac_farkli_CS = n_distinct(CryoSleep, na.rm = TRUE)
) %>%
ungroup()
## # A tibble: 3 × 5
## SM grup_kac_kisi kacinin_CS_bilgisi_bos kacinin_CS_bilgisi_dolu
## <chr> <int> <int> <int>
## 1 BZ 2898 7 2891
## 2 Z 5587 98 5489
## 3 <NA> 208 4 204
## # ℹ 1 more variable: Grup_kac_farkli_CS <int>
train <- train %>%
mutate(CryoSleep = case_when(
is.na(CryoSleep) & ShoppingMall > 0 ~ "FALSE",
TRUE ~ CryoSleep
))
test <- test %>%
mutate(CryoSleep = case_when(
is.na(CryoSleep) & ShoppingMall > 0 ~ "FALSE",
TRUE ~ CryoSleep
))
train %>%
mutate(SP = ifelse(Spa>0, "BZ", "Z")) %>%
group_by(SP) %>%
summarize(
grup_kac_kisi = n(),
kacinin_CS_bilgisi_bos = sum(is.na(CryoSleep)),
kacinin_CS_bilgisi_dolu = sum(!is.na(CryoSleep)),
Grup_kac_farkli_CS = n_distinct(CryoSleep, na.rm = TRUE)
) %>%
ungroup()
## # A tibble: 3 × 5
## SP grup_kac_kisi kacinin_CS_bilgisi_bos kacinin_CS_bilgisi_dolu
## <chr> <int> <int> <int>
## 1 BZ 3186 4 3182
## 2 Z 5324 96 5228
## 3 <NA> 183 2 181
## # ℹ 1 more variable: Grup_kac_farkli_CS <int>
train <- train %>%
mutate(CryoSleep = case_when(
is.na(CryoSleep) & Spa > 0 ~ "FALSE",
TRUE ~ CryoSleep
))
test <- test %>%
mutate(CryoSleep = case_when(
is.na(CryoSleep) & Spa > 0 ~ "FALSE",
TRUE ~ CryoSleep
))
train %>%
mutate(VD = ifelse(VRDeck>0, "BZ", "Z")) %>%
group_by(VD) %>%
summarize(
grup_kac_kisi = n(),
kacinin_CS_bilgisi_bos = sum(is.na(CryoSleep)),
kacinin_CS_bilgisi_dolu = sum(!is.na(CryoSleep)),
Grup_kac_farkli_CS = n_distinct(CryoSleep, na.rm = TRUE)
) %>%
ungroup()
## # A tibble: 3 × 5
## VD grup_kac_kisi kacinin_CS_bilgisi_bos kacinin_CS_bilgisi_dolu
## <chr> <int> <int> <int>
## 1 BZ 3010 0 3010
## 2 Z 5495 93 5402
## 3 <NA> 188 5 183
## # ℹ 1 more variable: Grup_kac_farkli_CS <int>
train <- train %>%
mutate(CryoSleep = factor(CryoSleep))
test <- test %>%
mutate(CryoSleep = factor(CryoSleep))
cs_model <- rpart(
CryoSleep ~ HomePlanet + Deck + Side + Age + Destination + VIP + RoomService +
FoodCourt + ShoppingMall + Spa + VRDeck + Grup_Buyuklugu_Kat+ Yalniz_Seyahat,
data = train %>% filter(!is.na(Destination)),
method = "class"
)
rpart.plot(
cs_model
)
train$CryoSleep_tree_pred <- predict(
cs_model,
newdata = train,
type = "class"
)
test$CryoSleep_tree_pred <- predict(
cs_model,
newdata = test,
type = "class"
)
train <- train %>%
mutate(
CryoSleep = ifelse(
is.na(CryoSleep),
as.character(CryoSleep_tree_pred),
as.character(CryoSleep)
),
CryoSleep = factor(CryoSleep)
)
test <- test %>%
mutate(
CryoSleep = ifelse(
is.na(CryoSleep),
as.character(CryoSleep_tree_pred),
as.character(CryoSleep)
),
CryoSleep = factor(CryoSleep)
)
train <- train %>%
select(-CryoSleep_tree_pred)
test <- test %>%
select(-CryoSleep_tree_pred)
describe_all(train)
## # A tibble: 24 × 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 Grup_No fct 0 0 6217 NA NA NA
## 3 Kisi_No int 0 0 8 1 1.52 8
## 4 HomePlanet fct 0 0 3 NA NA NA
## 5 CryoSleep fct 0 0 2 NA NA NA
## 6 Cabin chr 199 2.3 6561 NA NA NA
## 7 Deck fct 199 2.3 7 NA NA NA
## 8 Numara int 199 2.3 1818 0 600. 1894
## 9 Side fct 199 2.3 3 NA NA NA
## 10 Destination fct 0 0 3 NA NA NA
## # ℹ 14 more rows
3.3.4 Deck Değişkeni
Deck değişkeni, yolcuların gemideki güvertesini temsil
eder ve bazı eksik değerlere sahiptir. Bu eksik değerleri doldurmak
için, yolcuların diğer özelliklerine (örneğin, HomePlanet, Aile)
dayanarak en olası güverteyi atayabiliriz.
summary(train$Deck)
## Diğer B C E F G NA's
## 739 779 747 876 2794 2559 199
deck_model <- rpart(
Deck ~ HomePlanet + CryoSleep + Side + Age + Destination + VIP + RoomService +
FoodCourt + ShoppingMall + Spa + VRDeck + Grup_Buyuklugu_Kat+ Yalniz_Seyahat,
data = train %>% filter(!is.na(Deck)),
method = "class"
)
rpart.plot(
deck_model
)
train$deck_tree_pred <- predict(
deck_model,
newdata = train,
type = "class"
)
test$deck_tree_pred <- predict(
deck_model,
newdata = test,
type = "class"
)
train <- train %>%
mutate(
Deck = ifelse(
is.na(Deck),
as.character(deck_tree_pred),
as.character(Deck)
),
Deck = factor(Deck)
)
test <- test %>%
mutate(
Deck = ifelse(
is.na(Deck),
as.character(deck_tree_pred),
as.character(Deck)
),
Deck = factor(Deck)
)
train <- train %>%
select(-deck_tree_pred)
test <- test %>%
select(-deck_tree_pred)
train <- train %>%
select(-c(Cabin,Numara ))
test <- test %>%
select(-c(Cabin,Numara ))
train <- train %>%
select(-c(Name,Ad, Soyad, Grup_Buyuklugu ))
test <- test %>%
select(-c(Name,Ad, Soyad, Grup_Buyuklugu ))
describe_all(train)
## # 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 Grup_No fct 0 0 6217 NA NA NA
## 3 Kisi_No int 0 0 8 1 1.52 8
## 4 HomePlanet fct 0 0 3 NA NA NA
## 5 CryoSleep fct 0 0 2 NA NA NA
## 6 Deck fct 0 0 6 NA NA NA
## 7 Side fct 199 2.3 3 NA NA NA
## 8 Destination fct 0 0 3 NA NA NA
## 9 Age dbl 179 2.1 81 0 28.8 79
## 10 VIP fct 203 2.3 3 NA NA NA
## 11 RoomService dbl 181 2.1 1274 0 225. 14327
## 12 FoodCourt dbl 183 2.1 1508 0 458. 29813
## 13 ShoppingMall dbl 208 2.4 1116 0 174. 23492
## 14 Spa dbl 183 2.1 1328 0 311. 22408
## 15 VRDeck dbl 188 2.2 1307 0 305. 24133
## 16 Transported fct 0 0 2 NA NA NA
## 17 Yalniz_Seyahat dbl 0 0 2 0 0.55 1
## 18 Grup_Buyuklugu_Kat fct 0 0 4 NA NA NA
3.3.5 Side Değişkeni
Side değişkeni, yolcuların gemideki tarafını (Port veya
Starboard) temsil eder ve bazı eksik değerlere sahiptir. Bu eksik
değerleri doldurmak için, yolcuların diğer özelliklerine dayanarak en
olası tarafı atayabiliriz.
side_model <- rpart(
Side ~ HomePlanet + CryoSleep + Deck + Age + Destination + VIP + RoomService +
FoodCourt + ShoppingMall + Spa + VRDeck + Grup_Buyuklugu_Kat+ Yalniz_Seyahat,
data = train %>% filter(!is.na(Side)),
method = "class",
cp = 0.002
)
rpart.plot(
side_model
)
train$side_tree_pred <- predict(
side_model,
newdata = train,
type = "class"
)
test$side_tree_pred <- predict(
side_model,
newdata = test,
type = "class"
)
train <- train %>%
mutate(
Side = ifelse(
is.na(Side),
as.character(side_tree_pred),
as.character(Side)
),
Side = factor(Side)
)
test <- test %>%
mutate(
Side = ifelse(
is.na(Side),
as.character(side_tree_pred),
as.character(Side)
),
Side = factor(Side)
)
train <- train %>%
select(-side_tree_pred)
test <- test %>%
select(-side_tree_pred)
describe_all(train)
## # 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 Grup_No fct 0 0 6217 NA NA NA
## 3 Kisi_No int 0 0 8 1 1.52 8
## 4 HomePlanet fct 0 0 3 NA NA NA
## 5 CryoSleep fct 0 0 2 NA NA NA
## 6 Deck fct 0 0 6 NA NA NA
## 7 Side fct 0 0 2 NA NA NA
## 8 Destination fct 0 0 3 NA NA NA
## 9 Age dbl 179 2.1 81 0 28.8 79
## 10 VIP fct 203 2.3 3 NA NA NA
## 11 RoomService dbl 181 2.1 1274 0 225. 14327
## 12 FoodCourt dbl 183 2.1 1508 0 458. 29813
## 13 ShoppingMall dbl 208 2.4 1116 0 174. 23492
## 14 Spa dbl 183 2.1 1328 0 311. 22408
## 15 VRDeck dbl 188 2.2 1307 0 305. 24133
## 16 Transported fct 0 0 2 NA NA NA
## 17 Yalniz_Seyahat dbl 0 0 2 0 0.55 1
## 18 Grup_Buyuklugu_Kat fct 0 0 4 NA NA NA
vip_model <- rpart(
VIP ~ HomePlanet + CryoSleep + Deck + Age + Destination + Side + RoomService +
FoodCourt + ShoppingMall + Spa + VRDeck + Grup_Buyuklugu_Kat+ Yalniz_Seyahat,
data = train %>% filter(!is.na(VIP)),
method = "class",
cp = 0.002
)
rpart.plot(
vip_model
)
train$vip_tree_pred <- predict(
vip_model,
newdata = train,
type = "class"
)
test$vip_tree_pred <- predict(
vip_model,
newdata = test,
type = "class"
)
train <- train %>%
mutate(
VIP = ifelse(
is.na(VIP),
as.character(vip_tree_pred),
as.character(VIP)
),
VIP = factor(VIP)
)
test <- test %>%
mutate(
VIP = ifelse(
is.na(VIP),
as.character(vip_tree_pred),
as.character(VIP)
),
VIP = factor(VIP)
)
train <- train %>%
select(-vip_tree_pred)
test <- test %>%
select(-vip_tree_pred)
describe_all(train)
## # 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 Grup_No fct 0 0 6217 NA NA NA
## 3 Kisi_No int 0 0 8 1 1.52 8
## 4 HomePlanet fct 0 0 3 NA NA NA
## 5 CryoSleep fct 0 0 2 NA NA NA
## 6 Deck fct 0 0 6 NA NA NA
## 7 Side fct 0 0 2 NA NA NA
## 8 Destination fct 0 0 3 NA NA NA
## 9 Age dbl 179 2.1 81 0 28.8 79
## 10 VIP fct 0 0 2 NA NA NA
## 11 RoomService dbl 181 2.1 1274 0 225. 14327
## 12 FoodCourt dbl 183 2.1 1508 0 458. 29813
## 13 ShoppingMall dbl 208 2.4 1116 0 174. 23492
## 14 Spa dbl 183 2.1 1328 0 311. 22408
## 15 VRDeck dbl 188 2.2 1307 0 305. 24133
## 16 Transported fct 0 0 2 NA NA NA
## 17 Yalniz_Seyahat dbl 0 0 2 0 0.55 1
## 18 Grup_Buyuklugu_Kat fct 0 0 4 NA NA NA
3.3.6 Age Değişkeni
Age değişkeni, yolcuların yaşını temsil eder.
age_model <- lm(
Age ~ HomePlanet + CryoSleep + Deck + VIP + Destination + Side + RoomService +
FoodCourt + ShoppingMall + Spa + VRDeck + Grup_Buyuklugu_Kat+ Yalniz_Seyahat,
data = train)
train$age_tree_pred <- predict(
age_model,
newdata = train
)
test$age_tree_pred <- predict(
age_model,
newdata = test
)
train <- train %>%
mutate(
Age = ifelse(
is.na(Age),
round(age_tree_pred), Age))
test <- test %>%
mutate(
Age = ifelse(
is.na(Age),
round(age_tree_pred), Age))
train <- train %>%
select(-age_tree_pred)
test <- test %>%
select(-age_tree_pred)
describe_all(train)
## # 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 Grup_No fct 0 0 6217 NA NA NA
## 3 Kisi_No int 0 0 8 1 1.52 8
## 4 HomePlanet fct 0 0 3 NA NA NA
## 5 CryoSleep fct 0 0 2 NA NA NA
## 6 Deck fct 0 0 6 NA NA NA
## 7 Side fct 0 0 2 NA NA NA
## 8 Destination fct 0 0 3 NA NA NA
## 9 Age dbl 14 0.2 81 0 28.8 79
## 10 VIP fct 0 0 2 NA NA NA
## 11 RoomService dbl 181 2.1 1274 0 225. 14327
## 12 FoodCourt dbl 183 2.1 1508 0 458. 29813
## 13 ShoppingMall dbl 208 2.4 1116 0 174. 23492
## 14 Spa dbl 183 2.1 1328 0 311. 22408
## 15 VRDeck dbl 188 2.2 1307 0 305. 24133
## 16 Transported fct 0 0 2 NA NA NA
## 17 Yalniz_Seyahat dbl 0 0 2 0 0.55 1
## 18 Grup_Buyuklugu_Kat fct 0 0 4 NA NA NA
mean_age <- train %>%
summarize(mean_age = mean(Age, na.rm=TRUE)) %>%
pull(mean_age)
mean_age
## [1] 28.82844
train <- train %>%
mutate(
Age = ifelse(
is.na(Age),
round(mean_age), Age))
test <- test %>%
mutate(
Age = ifelse(
is.na(Age),
round(mean_age), Age))
describe_all(train)
## # 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 Grup_No fct 0 0 6217 NA NA NA
## 3 Kisi_No int 0 0 8 1 1.52 8
## 4 HomePlanet fct 0 0 3 NA NA NA
## 5 CryoSleep fct 0 0 2 NA NA NA
## 6 Deck fct 0 0 6 NA NA NA
## 7 Side fct 0 0 2 NA NA NA
## 8 Destination fct 0 0 3 NA NA NA
## 9 Age dbl 0 0 80 0 28.8 79
## 10 VIP fct 0 0 2 NA NA NA
## 11 RoomService dbl 181 2.1 1274 0 225. 14327
## 12 FoodCourt dbl 183 2.1 1508 0 458. 29813
## 13 ShoppingMall dbl 208 2.4 1116 0 174. 23492
## 14 Spa dbl 183 2.1 1328 0 311. 22408
## 15 VRDeck dbl 188 2.2 1307 0 305. 24133
## 16 Transported fct 0 0 2 NA NA NA
## 17 Yalniz_Seyahat dbl 0 0 2 0 0.55 1
## 18 Grup_Buyuklugu_Kat fct 0 0 4 NA NA NA
3.3.7 RoomService, FoodCourt, ShoppingMall, Spa, VRDeck Değişkenleri
median_table <- train %>%
mutate(Age_Group = cut(Age,
breaks = c(0, 12, 18, 30, 45, 60, Inf),
labels = c("Child", "Teen", "YoungAdult", "Adult", "MidAge", "Senior"),
right = FALSE)) %>%
group_by(HomePlanet, Deck, CryoSleep, Destination, VIP, Grup_Buyuklugu_Kat, Side, Age_Group) %>%
summarize(med = median(RoomService, na.rm = TRUE))
## `summarise()` has grouped output by 'HomePlanet', 'Deck', 'CryoSleep',
## 'Destination', 'VIP', 'Grup_Buyuklugu_Kat', 'Side'. You can override using the
## `.groups` argument.
train <- train %>%
mutate(Age_Group = cut(Age,
breaks = c(0, 12, 18, 30, 45, 60, Inf),
labels = c("Child", "Teen", "YoungAdult", "Adult", "MidAge", "Senior"),
right = FALSE)) %>%
left_join(median_table, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
train <- train %>%
mutate(RoomService = ifelse(is.na(RoomService), med, RoomService)) %>%
select(-med)
median_table_fc <- train %>%
group_by(HomePlanet, Deck, CryoSleep, Destination, VIP, Grup_Buyuklugu_Kat, Side, Age_Group) %>%
summarize(med = median(FoodCourt, na.rm = TRUE))
## `summarise()` has grouped output by 'HomePlanet', 'Deck', 'CryoSleep',
## 'Destination', 'VIP', 'Grup_Buyuklugu_Kat', 'Side'. You can override using the
## `.groups` argument.
train <- train %>%
left_join(median_table_fc, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
train <- train %>%
mutate(FoodCourt = ifelse(is.na(FoodCourt), med, FoodCourt)) %>%
select(-med)
median_table_sm <- train %>%
group_by(HomePlanet, Deck, CryoSleep, Destination, VIP, Grup_Buyuklugu_Kat, Side, Age_Group) %>%
summarize(med = median(ShoppingMall, na.rm = TRUE))
## `summarise()` has grouped output by 'HomePlanet', 'Deck', 'CryoSleep',
## 'Destination', 'VIP', 'Grup_Buyuklugu_Kat', 'Side'. You can override using the
## `.groups` argument.
train <- train %>%
left_join(median_table_sm, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
train <- train %>%
mutate(ShoppingMall = ifelse(is.na(ShoppingMall), med, ShoppingMall)) %>%
select(-med)
median_table_spa <- train %>%
group_by(HomePlanet, Deck, CryoSleep, Destination, VIP, Grup_Buyuklugu_Kat, Side, Age_Group) %>%
summarize(med = median(Spa, na.rm = TRUE))
## `summarise()` has grouped output by 'HomePlanet', 'Deck', 'CryoSleep',
## 'Destination', 'VIP', 'Grup_Buyuklugu_Kat', 'Side'. You can override using the
## `.groups` argument.
train <- train %>%
left_join(median_table_spa, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
train <- train %>%
mutate(Spa = ifelse(is.na(Spa), med, Spa)) %>%
select(-med)
median_table_vrd <- train %>%
group_by(HomePlanet, Deck, CryoSleep, Destination, VIP, Grup_Buyuklugu_Kat, Side, Age_Group) %>%
summarize(med = median(VRDeck, na.rm = TRUE))
## `summarise()` has grouped output by 'HomePlanet', 'Deck', 'CryoSleep',
## 'Destination', 'VIP', 'Grup_Buyuklugu_Kat', 'Side'. You can override using the
## `.groups` argument.
train <- train %>%
left_join(median_table_vrd, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
train <- train %>%
mutate(VRDeck = ifelse(is.na(VRDeck), med, VRDeck)) %>%
select(-med)
describe_all(train)
## # 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 Grup_No fct 0 0 6217 NA NA NA
## 3 Kisi_No int 0 0 8 1 1.52 8
## 4 HomePlanet fct 0 0 3 NA NA NA
## 5 CryoSleep fct 0 0 2 NA NA NA
## 6 Deck fct 0 0 6 NA NA NA
## 7 Side fct 0 0 2 NA NA NA
## 8 Destination fct 0 0 3 NA NA NA
## 9 Age dbl 0 0 80 0 28.8 79
## 10 VIP fct 0 0 2 NA NA NA
## 11 RoomService dbl 14 0.2 1285 0 222. 14327
## 12 FoodCourt dbl 14 0.2 1522 0 454. 29813
## 13 ShoppingMall dbl 13 0.1 1126 0 171. 23492
## 14 Spa dbl 5 0.1 1342 0 307. 22408
## 15 VRDeck dbl 13 0.1 1316 0 300. 24133
## 16 Transported fct 0 0 2 NA NA NA
## 17 Yalniz_Seyahat dbl 0 0 2 0 0.55 1
## 18 Grup_Buyuklugu_Kat fct 0 0 4 NA NA NA
## 19 Age_Group fct 0 0 6 NA NA NA
test <- test %>%
mutate(Age_Group = cut(Age,
breaks = c(0, 12, 18, 30, 45, 60, Inf),
labels = c("Child", "Teen", "YoungAdult", "Adult", "MidAge", "Senior"),
right = FALSE)) %>%
left_join(median_table, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
test <- test %>%
mutate(RoomService = ifelse(is.na(RoomService), med, RoomService)) %>%
select(-med)
test <- test %>%
left_join(median_table_fc, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
test <- test %>%
mutate(FoodCourt = ifelse(is.na(FoodCourt), med, FoodCourt)) %>%
select(-med)
test <- test %>%
left_join(median_table_sm, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
test <- test %>%
mutate(ShoppingMall = ifelse(is.na(ShoppingMall), med, ShoppingMall)) %>%
select(-med)
test <- test %>%
left_join(median_table_spa, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
test <- test %>%
mutate(Spa = ifelse(is.na(Spa), med, Spa)) %>%
select(-med)
test <- test %>%
left_join(median_table_vrd, by = c("HomePlanet", "Deck", "CryoSleep", "Destination", "VIP", "Grup_Buyuklugu_Kat", "Side", "Age_Group"))
test <- test %>%
mutate(VRDeck = ifelse(is.na(VRDeck), med, VRDeck)) %>%
select(-med)
describe_all(test)
## # 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 4277 NA NA NA
## 2 Grup_No fct 0 0 3063 NA NA NA
## 3 Kisi_No int 0 0 8 1 1.5 8
## 4 HomePlanet fct 0 0 3 NA NA NA
## 5 CryoSleep fct 0 0 2 NA NA NA
## 6 Deck fct 0 0 6 NA NA NA
## 7 Side fct 0 0 2 NA NA NA
## 8 Destination fct 0 0 3 NA NA NA
## 9 Age dbl 0 0 79 0 28.7 79
## 10 VIP fct 0 0 2 NA NA NA
## 11 RoomService dbl 0 0 850 0 217. 11567
## 12 FoodCourt dbl 3 0.1 916 0 435. 25273
## 13 ShoppingMall dbl 8 0.2 728 0 175. 8292
## 14 Spa dbl 10 0.2 840 0 298. 19844
## 15 VRDeck dbl 4 0.1 807 0 308. 22272
## 16 Yalniz_Seyahat dbl 0 0 2 0 0.55 1
## 17 Grup_Buyuklugu_Kat fct 0 0 4 NA NA NA
## 18 Age_Group fct 0 0 6 NA NA NA
train <- train %>%
mutate(RoomService = coalesce(RoomService, 0),
FoodCourt = coalesce(FoodCourt, 0),
ShoppingMall= coalesce(ShoppingMall, 0),
Spa = coalesce(Spa, 0),
VRDeck = coalesce(VRDeck, 0)
)
test <- test %>%
mutate(RoomService = coalesce(RoomService, 0),
FoodCourt = coalesce(FoodCourt, 0),
ShoppingMall= coalesce(ShoppingMall, 0),
Spa = coalesce(Spa, 0),
VRDeck = coalesce(VRDeck, 0)
)
train <- train %>%
select(-c(Grup_No, Kisi_No, Yalniz_Seyahat))
test <- test %>%
select(-c(Grup_No, Kisi_No, Yalniz_Seyahat))
3.4 Modelleme İçin Hazırlık
library(tidymodels)
## ── Attaching packages ────────────────────────────────────── tidymodels 1.4.1 ──
## ✔ broom 1.0.10 ✔ rsample 1.3.1
## ✔ dials 1.4.2 ✔ tailor 0.1.0
## ✔ infer 1.1.0 ✔ tune 2.0.1
## ✔ modeldata 1.5.1 ✔ workflows 1.3.0
## ✔ parsnip 1.3.3 ✔ workflowsets 1.1.1
## ✔ recipes 1.3.1 ✔ yardstick 1.3.2
## ── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──
## ✖ scales::discard() masks purrr::discard()
## ✖ dplyr::filter() masks stats::filter()
## ✖ recipes::fixed() masks stringr::fixed()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dials::prune() masks rpart::prune()
## ✖ yardstick::spec() masks readr::spec()
## ✖ recipes::step() masks stats::step()
set.seed(123)
data_split <- initial_split(train, prop = 0.8, strata = Transported)
train_data <- training(data_split)
test_data <- testing(data_split)
rs_recipe <- recipe(Transported ~ ., data = train_data) %>%
update_role(PassengerId, Age, new_role = "ID") %>%
step_dummy(all_nominal_predictors(), one_hot = TRUE) %>%
step_normalize(all_numeric_predictors())
log_spec <- logistic_reg() %>%
set_engine("glm")
log_workflow <- workflow() %>%
add_recipe(rs_recipe) %>%
add_model(log_spec)
log_fit <- log_workflow %>%
fit(data = train_data)
## Warning: glm.fit: возникли подогнанные вероятности 0 или 1
log_preds <- predict(log_fit, test_data, type = "prob")
head(log_preds)
## # A tibble: 6 × 2
## .pred_FALSE .pred_TRUE
## <dbl> <dbl>
## 1 0.780 0.220
## 2 0.207 0.793
## 3 0.845 0.155
## 4 0.302 0.698
## 5 0.993 0.00705
## 6 0.222 0.778
log_class <- predict(log_fit, test_data)
results <- test_data %>%
select(Transported) %>%
bind_cols(log_class)
log_acc <- accuracy(data = results,
truth = Transported,
estimate = .pred_class)
log_acc
## # A tibble: 1 × 3
## .metric .estimator .estimate
## <chr> <chr> <dbl>
## 1 accuracy binary 0.795
conf_mat_log <- conf_mat(data = results,
truth = Transported,
estimate = .pred_class)
conf_mat_log
## Truth
## Prediction FALSE TRUE
## FALSE 664 157
## TRUE 199 719
pred_prob <- predict(log_fit, test_data, type = "prob")
results <- results %>%
bind_cols(pred_prob)
autoplot(conf_mat_log, type = "heatmap") +
scale_fill_gradient(low = "white", high = "steelblue") +
labs(title = "Confusion Matrix - Isı Haritası")
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
results <- results %>%
mutate(Transported = relevel(Transported, ref = "TRUE"))
roc_data <- roc_curve(
data = results,
truth = Transported,
.pred_TRUE
)
autoplot(roc_data) +
labs(title = "ROC Eğrisi", subtitle = "Lojistik Regresyon Modeli")
logistic_recipe <- recipe(Transported ~ ., data = train) %>%
update_role(PassengerId, Age, new_role = "ID") %>%
step_dummy(all_nominal_predictors(), one_hot = TRUE) %>%
step_normalize(all_numeric_predictors())
log_spec <- logistic_reg() %>%
set_engine("glm")
log_workflow <- workflow() %>%
add_recipe(logistic_recipe) %>%
add_model(log_spec)
log_fit <- log_workflow %>%
fit(data = train)
## Warning: glm.fit: возникли подогнанные вероятности 0 или 1
tahminler <- log_fit %>%
predict(new_data = test) %>%
bind_cols(test)
submission <- tahminler %>%
select(PassengerId = PassengerId, .pred_class = .pred_class) %>%
rename(Transported = .pred_class)
submission <- as.data.frame(submission)
submission$Transported <- str_to_title(submission$Transported)
write.csv(submission, "logistic.csv", row.names = FALSE, quote = FALSE)