Proje2

Genel Bilgi

2912 yılına hoş geldiniz. Veri bilimi becerilerinize kozmik bir gizemi çözmek için ihtiyaç duyuluyor. Dört ışık yılı uzaklıktan bir iletim aldık ve işler pek de iyi görünmüyor.

Spaceship Titanic, bir ay önce fırlatılan yıldızlararası bir yolcu gemisiydi. Neredeyse 13.000 yolcuyu taşıyan gemi, göçmenleri güneş sistemimizden, yakındaki yıldızların etrafında dönen üç yeni yaşanabilir ötegezegene götürmek üzere ilk yolculuğuna çıkmıştı.

İlk durağı olan kavurucu 55 Cancri E’ye giderken, gemi Alpha Centauri yakınlarında bir toz bulutunun içinde gizlenmiş bir uzay-zaman anomalisiyle çarpıştı. Ne yazık ki, bin yıl önceki adaşıyla benzer bir kaderi paylaştı. Gemi bütünlüğünü korumuş olsa da, yolcuların neredeyse yarısı alternatif bir boyuta taşındı!

Kurtarma ekiplerine yardımcı olmak ve kaybolan yolcuları geri getirmek için, uzay gemisinin hasar görmüş bilgisayar sisteminden kurtarılan kayıtları kullanarak hangi yolcuların anomali tarafından taşındığını tahmin etmeniz isteniyor.

Onları kurtarın ve tarihi değiştirin!

Kullanilacak kutuphalener

library(readr)
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ purrr     1.1.0
✔ forcats   1.0.1     ✔ stringr   1.5.1
✔ ggplot2   4.0.0     ✔ tibble    3.3.0
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
── 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(explore)
library(dplyr)
library(tidyr)
library(VIM)
Загрузка требуемого пакета: colorspace
Загрузка требуемого пакета: grid
VIM is ready to use.

Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues

Присоединяю пакет: 'VIM'

Следующий объект скрыт от 'package:datasets':

    sleep
library(ggplot2)

Dosya ve Veri indirimi

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.

Dosya ve Veri Alanı Açıklamaları

  • train.csv - Eğitim verisi olarak kullanılacak yolcuların yaklaşık üçte ikisinin (yaklaşık 8700) kişisel kayıtları.

  • PassengerId - Her yolcu için benzersiz bir kimlik. Her kimlik, gggg_pp biçimini alır; burada gggg, yolcunun seyahat ettiği grubu, pp ise grup içindeki numarasını belirtir. Bir gruptaki kişiler genellikle aile üyeleridir, ancak her zaman değil.

  • HomePlanet - Yolcunun ayrıldığı gezegen, genellikle daimi ikamet ettiği gezegen.

  • CryoSleep - Yolcunun yolculuk süresince askıya alınmış animasyona alınmayı seçip seçmediğini belirtir. Cryosleep’teki yolcular kabinlerine kapatılır.

  • Cabin - Yolcunun kaldığı kabin numarası. deck/num/side biçimini alır; burada side, P (İskele) veya S (Sancak) olabilir.

  • Destination - Yolcunun ineceği gezegen.

  • Age - Yolcunun yaşı.

  • VIP - Yolcunun yolculuk sırasında özel VIP hizmeti için ödeme yapıp yapmadığı.

  • Room Service, FoodCourt, Shopping Mall, Spa, VRDeck - Yolcunun Titanic Uzay Gemisi’nin birçok lüks olanağından her biri için ödediği fatura tutarı.

  • Name - Yolcunun adı ve soyadı.

  • Transported - Yolcunun başka bir boyuta taşınıp taşınmadığı. Bu, tahmin etmeye çalıştığınız hedef sütundur.

  • test.csv - Test verisi olarak kullanılacak kalan üçte bir yolcunun (~4300) kişisel kayıtları.

  • PassengerId - Test kümesindeki her yolcunun kimliği.

  • Transported - Hedef. Her yolcu için Doğru veya Yanlış tahmin edin.

Bos olan veri sutunu aciklamalari

train %>% is.na() %>% colSums()
 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 

PassengerId

train <- train %>%
  separate(PassengerId, sep = "_", into = c("Aile", "KisiNo"), remove = FALSE) 

HomePlanet

unique(train$HomePlanet)
[1] "Europa" "Earth"  "Mars"   NA      
table(train$HomePlanet)

 Earth Europa   Mars 
  4602   2131   1759 

Gruplar icindeki insanlar ayni yerden geldigini yada farkli yerden geldini ogrenmeliyiz

inceleme <- train %>% group_by(Aile) %>%
  summarise(
    uye_s = n(),
    bos_sayisi = sum(is.na(HomePlanet)),
    bosolamyan_sayisi = sum(!is.na(HomePlanet)),
    farkli_gezegen = n_distinct(HomePlanet,na.rm = TRUE),
    gezegen_adi = unique(HomePlanet[!is.na(HomePlanet)])
  ) 
Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in
dplyr 1.1.0.
ℹ Please use `reframe()` instead.
ℹ When switching from `summarise()` to `reframe()`, remember that `reframe()`
  always returns an ungrouped data frame and adjust accordingly.
`summarise()` has grouped output by 'Aile'. You can override using the
`.groups` argument.
train <- left_join(train,inceleme)
Joining with `by = join_by(Aile)`

Goruldugu uzeren ayni gruptan olan insanlar ayni yerden cikmislar ve buna gore Homeplanet sutunundeki bosluklari dolduralim

train <- train %>% group_by(Aile) %>% mutate(
  HomePlanet = ifelse(
    bos_sayisi != 0 & uye_s > 1,
    gezegen_adi,
    HomePlanet
  )
)

train <- train %>% group_by(Destination,CryoSleep,VIP) %>% mutate(
  HomePlanet = ifelse(
   is.na(HomePlanet),                     
      sample(HomePlanet[!is.na(HomePlanet)], 1), 
      HomePlanet
  )
)
sum(train$uye_s == 1,na.rm = T)
[1] 4696

CryoSleep

Eğer bir yolcunun tüm harcamaları (RoomService, FoodCourt, ShoppingMall, Spa, VRDeck) sıfırsa, bu kişi muhtemelen “uykudaydı” → CryoSleep = TRUE.

train <- train %>% mutate(
  CryoSleep = ifelse( is.na(CryoSleep) & RoomService == 0 & FoodCourt == 0 & ShoppingMall == 0 & Spa == 0 & VRDeck == 0, TRUE, CryoSleep)
)

Eğer bir yolcunun tüm harcamaları (RoomService, FoodCourt, ShoppingMall, Spa, VRDeck) sıfır degilse, bu kişi muhtemelen “uykuda degildi” → CryoSleep = FALSE.

train <- train %>% mutate(
  CryoSleep = ifelse( is.na(CryoSleep) & (RoomService > 0 | FoodCourt > 0 | ShoppingMall > 0 | Spa > 0 | VRDeck > 0), FALSE, CryoSleep)
)
train <- train %>% group_by(HomePlanet) %>% mutate(
   CryoSleep = ifelse(
     is.na(CryoSleep),                     
      sample(CryoSleep[!is.na(CryoSleep)], 1),  
      CryoSleep                             
   )
) %>%
  ungroup()

Cabin

Ayni grup icindeki insanlar ayni Cabinda kaliyor

train <- train %>% group_by(Aile) %>% mutate(
   Cabin = ifelse(is.na(Cabin),
                 if(length(Cabin[!is.na(Cabin)]) > 0) sample(Cabin[!is.na(Cabin)], 1) else NA,
                 Cabin)
)

train <- train %>% group_by(HomePlanet,Destination) %>% mutate(
   Cabin = ifelse(
     is.na(Cabin),                     # Cabin boşsa
      sample(Cabin[!is.na(Cabin)], 1),  # Aynı HomePlanet içindeki dolu Cabin’lerden rastgele seç
      Cabin                             # Cabin doluysa olduğu gibi bırak
   )
) %>% ungroup()

Destination

train <- train %>% group_by(uye_s) %>%          
  mutate(Destination = ifelse(is.na(Destination) & uye_s > 1, 
                      first(na.omit(Destination)),  
                      Destination),
         ) 
train <- train %>% group_by(HomePlanet) %>% mutate(
   Destination = ifelse(
     is.na(Destination),                     
      sample(Destination[!is.na(Destination)], 1),  
      Destination                             
   )
) %>%
  ungroup()

Age

mean(train$Age,na.rm = T)
[1] 28.82793
# train <- train %>% mutate(
#   Age = ifelse(
#     is.na(Age),
#     mean(train$Age,na.rm = T),
#     Age
#   )
# )

train <- train %>%
  group_by(Aile) %>%
  mutate(
    Age = ifelse(
      is.na(Age), 
      round(mean(Age, na.rm = TRUE)),  # Ortalama ile doldur
      Age
    )
  ) %>%
  ungroup()
train <- train %>%
  group_by(HomePlanet, Destination) %>%  # isteğe bağlı grup sütunları
  mutate(Age = ifelse(uye_s == 1 & is.na(Age), median(Age, na.rm = TRUE), Age)) %>%
  ungroup()

VIP

train <- train %>% group_by(uye_s) %>%          # aynı gruptaki üyeleri birlikte ele al
  mutate(VIP = ifelse(is.na(VIP) & uye_s > 1, 
                      first(na.omit(VIP)),      # gruptaki boş olmayan ilk değeri al
                      VIP),
         ) 
train <- train %>% group_by(HomePlanet) %>% mutate(
   VIP = ifelse(
     is.na(VIP),                    
      sample(VIP[!is.na(VIP)], 1),  
      VIP                             
   )
) %>%
  ungroup()

Room Service, FoodCourt, Shopping Mall, Spa, VRDeck

##RoomService
library(ggplot2)

ggplot(train,aes(RoomService)) + 
  geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value `binwidth`.
Warning: Removed 181 rows containing non-finite outside the scale range
(`stat_bin()`).

train <- train %>%
  mutate(
    across(
      c(RoomService, FoodCourt, ShoppingMall, Spa, VRDeck),
      ~ ifelse((Age <= 12 | CryoSleep == TRUE) & is.na(.x), 0, .x)
    )
  )

train <- train %>%
  group_by(HomePlanet, Destination) %>%
  mutate(
    RoomService = ifelse(uye_s == 1 & is.na(RoomService), mean(RoomService, na.rm = TRUE), RoomService),
    FoodCourt   = ifelse(uye_s == 1 & is.na(FoodCourt), mean(FoodCourt, na.rm = TRUE), FoodCourt),
    ShoppingMall= ifelse(uye_s == 1 & is.na(ShoppingMall), mean(ShoppingMall, na.rm = TRUE), ShoppingMall),
    Spa         = ifelse(uye_s == 1 & is.na(Spa), mean(Spa, na.rm = TRUE), Spa),
    VRDeck      = ifelse(uye_s == 1 & is.na(VRDeck), mean(VRDeck, na.rm = TRUE), VRDeck)
  ) %>%
  ungroup()



train <- train %>%
  mutate(
    RoomService  = ifelse(is.na(RoomService), 0, RoomService),
    FoodCourt    = ifelse(is.na(FoodCourt), 0, FoodCourt),
    ShoppingMall = ifelse(is.na(ShoppingMall), 0, ShoppingMall),
    Spa          = ifelse(is.na(Spa), 0, Spa),
    VRDeck       = ifelse(is.na(VRDeck), 0, VRDeck)
  )

Name

# soyisimdatasi <- train2 %>% filter(!is.na(HomePlanet)) %>% group_by(Soyad) %>% 
#   summarise(n = n(),
#             en_cok_gezegen = names(which.max(table(HomePlanet))),
#             pay = max(table(HomePlanet))/n
#             
#             )


# Tekrarlayan isimleri al
names_pool <- unique(train$Name[!is.na(train$Name)])

# Boşları doldur
train <- train %>%
  mutate(Name = ifelse(is.na(Name),
                       sample(names_pool, sum(is.na(Name)), replace = TRUE),
                       Name))

Transported

Traspoted icin Regresyon Modelleri olustur

Oncelikle train setinde olusturdugumuz fazla ve model icin gerek olmayan sutunleri cikaracagiz

train2 <- train %>% select( -Aile, -KisiNo, -Name, -uye_s, -gezegen_adi, -bos_sayisi, -bosolamyan_sayisi, -farkli_gezegen)


describe_all(train2)
# A tibble: 13 × 8
   variable     type     na na_pct unique   min   mean   max
   <chr>        <chr> <int>  <dbl>  <int> <dbl>  <dbl> <dbl>
 1 PassengerId  chr       0      0   8693    NA  NA       NA
 2 HomePlanet   chr       0      0      3    NA  NA       NA
 3 CryoSleep    lgl       0      0      2     0   0.36     1
 4 Cabin        chr       0      0   6560    NA  NA       NA
 5 Destination  chr       0      0      3    NA  NA       NA
 6 Age          dbl       0      0     81     0  28.8     79
 7 VIP          lgl       0      0      2     0   0.03     1
 8 RoomService  dbl       0      0   1280     0 222.   14327
 9 FoodCourt    dbl       0      0   1515     0 451.   29813
10 ShoppingMall dbl       0      0   1122     0 171.   23492
11 Spa          dbl       0      0   1333     0 306.   22408
12 VRDeck       dbl       0      0   1313     0 300.   24133
13 Transported  lgl       0      0      2     0   0.5      1

Oncelikle biz reggresyon modelimiz ve tahminimizi bir deneme uzerinde yapacagiz

# Örnek veri seti
set.seed(123)  # Sonuçların tekrar üretilebilir olması için

# Satır sayısı
n <- nrow(train2)

# 0.75 ve 0.25 oranında rastgele satır seçimi
train2_index <- sample(1:n, size = 0.75 * n)

# Sonuçları kontrol
length(train2_index)  # ~75
[1] 6519
train2_train <- train2[train2_index, ]
train2_test  <- train2[-train2_index, ]

nrow(train2_train)  # 75% satır
[1] 6519
library(recipes)

Присоединяю пакет: 'recipes'
Следующий объект скрыт от 'package:VIM':

    prepare
Следующий объект скрыт от 'package:stringr':

    fixed
Следующий объект скрыт от 'package:stats':

    step
# 1️⃣ Recipe oluştur, tüm kategorik değişkenlerde yeni seviyeleri "other" yap
rec <- recipe(Transported ~ . , data = train2_train) %>%
       step_other(all_nominal(), threshold = 0.01)  # %1'den az görülen veya yeni seviyeler "other"

# 2️⃣ Recipe'i eğit
rec_prep <- prep(rec, training = train2_train)

# 3️⃣ Train ve Test setlerini dönüştür
train_transformed <- bake(rec_prep, new_data = train2_train)
test_transformed  <- bake(rec_prep, new_data = train2_test)

Model 1

model1 <- lm(Transported ~ . - PassengerId, train_transformed)
summary(model1)

Call:
lm(formula = Transported ~ . - PassengerId, data = train_transformed)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.30777 -0.30465  0.00294  0.29073  1.66115 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)               4.971e-01  8.198e-02   6.064 1.40e-09 ***
HomePlanetEuropa          2.515e-01  1.520e-02  16.544  < 2e-16 ***
HomePlanetMars            1.098e-01  1.398e-02   7.851 4.81e-15 ***
CryoSleepTRUE             3.746e-01  1.246e-02  30.074  < 2e-16 ***
Cabinother               -7.003e-02  8.049e-02  -0.870   0.3843    
DestinationPSO J318.5-22 -4.255e-02  2.123e-02  -2.004   0.0451 *  
DestinationTRAPPIST-1e   -5.376e-02  1.323e-02  -4.064 4.87e-05 ***
Age                      -2.079e-03  3.651e-04  -5.693 1.30e-08 ***
VIPTRUE                  -5.709e-02  3.170e-02  -1.801   0.0718 .  
RoomService              -1.173e-04  8.373e-06 -14.005  < 2e-16 ***
FoodCourt                 4.231e-05  3.544e-06  11.940  < 2e-16 ***
ShoppingMall              7.373e-05  8.359e-06   8.820  < 2e-16 ***
Spa                      -8.125e-05  4.665e-06 -17.416  < 2e-16 ***
VRDeck                   -8.167e-05  4.847e-06 -16.849  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.4083 on 6505 degrees of freedom
Multiple R-squared:  0.3345,    Adjusted R-squared:  0.3331 
F-statistic: 251.5 on 13 and 6505 DF,  p-value: < 2.2e-16

Model2

# 1️⃣ GLM modeli oluştur (binomial family çünkü Transported binary)
glm_model <- glm(Transported ~ ., 
                 data = train_transformed, 
                 family = binomial)
Warning: glm.fit: возникли подогнанные вероятности 0 или 1
# 2️⃣ Model özetini görüntüle
summary(glm_model)

Call:
glm(formula = Transported ~ ., family = binomial, data = train_transformed)

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)    
(Intercept)              -1.259e+01  1.970e+02  -0.064  0.94902    
PassengerIdother          1.322e+01  1.970e+02   0.067  0.94649    
HomePlanetEuropa          2.136e+00  1.318e-01  16.206  < 2e-16 ***
HomePlanetMars            6.839e-01  8.638e-02   7.918 2.41e-15 ***
CryoSleepTRUE             1.166e+00  8.220e-02  14.189  < 2e-16 ***
Cabinother               -3.723e-01  4.593e-01  -0.810  0.41768    
DestinationPSO J318.5-22 -3.793e-01  1.279e-01  -2.965  0.00303 ** 
DestinationTRAPPIST-1e   -4.463e-01  9.013e-02  -4.951 7.37e-07 ***
Age                      -7.459e-03  2.283e-03  -3.268  0.00108 ** 
VIPTRUE                  -4.548e-01  2.414e-01  -1.884  0.05956 .  
RoomService              -1.457e-03  1.030e-04 -14.137  < 2e-16 ***
FoodCourt                 4.922e-04  4.180e-05  11.775  < 2e-16 ***
ShoppingMall              5.125e-04  7.406e-05   6.921 4.48e-12 ***
Spa                      -1.949e-03  1.196e-04 -16.297  < 2e-16 ***
VRDeck                   -1.858e-03  1.131e-04 -16.428  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 9037.3  on 6518  degrees of freedom
Residual deviance: 5881.3  on 6504  degrees of freedom
AIC: 5911.3

Number of Fisher Scoring iterations: 10

Tahmin olusturma ve sonuclari

# Tahmin (probability)
train2_test$beta_pred <- predict(glm_model, newdata = test_transformed)


# 0.5 eşik ile TRUE/FALSE tahmini
beta_pred_class <- ifelse(train2_test$beta_pred > 0.5, TRUE, FALSE)


# Doğruluk
accuracy <- mean(beta_pred_class == train2_test$Transported)
accuracy_wrong = mean(beta_pred_class != train2_test$Transported)

sum(accuracy_wrong * 100)
[1] 21.38914
sum(accuracy * 100)
[1] 78.61086

Degistirmeler sonunda Grup bosluklari dolduruldu

train %>% is.na() %>% colSums()
      PassengerId              Aile            KisiNo        HomePlanet 
                0                 0                 0                 0 
        CryoSleep             Cabin       Destination               Age 
                0                 0                 0                 0 
              VIP       RoomService         FoodCourt      ShoppingMall 
                0                 0                 0                 0 
              Spa            VRDeck              Name       Transported 
                0                 0                 0                 0 
            uye_s        bos_sayisi bosolamyan_sayisi    farkli_gezegen 
              111               111               111               111 
      gezegen_adi 
              111 
describe_all(train)
# A tibble: 21 × 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 Aile        chr       0      0   6217    NA  NA       NA
 3 KisiNo      chr       0      0      8    NA  NA       NA
 4 HomePlanet  chr       0      0      3    NA  NA       NA
 5 CryoSleep   lgl       0      0      2     0   0.36     1
 6 Cabin       chr       0      0   6560    NA  NA       NA
 7 Destination chr       0      0      3    NA  NA       NA
 8 Age         dbl       0      0     81     0  28.8     79
 9 VIP         lgl       0      0      2     0   0.03     1
10 RoomService dbl       0      0   1280     0 222.   14327
# ℹ 11 more rows