1 Lojistik Regresyon Analizi

Bağımlı değişkenin ikili (0/1) olduğu durumlarda kullanılan bir regresyon yöntemidir. Doğrusal regresyondan temel farkı, sürekli bir değer değil olasılık tahmin etmesidir.

Varsayımları: Bağımlı değişken ikili olmalı Gözlemler birbirinden bağımsız olmalı Bağımsız değişkenler ile log-odds arasında doğrusallık olmalı Çoklu doğrusallık olmamalı (birden fazla bağımsız değişken varsa)

1.1 Pass veri seti ile yapılan uygulama:

library(haven)
library(car)
library(DescTools)
library(pROC)
library(caret)
library(ResourceSelection)

1.1.1 1.Verinin Yüklenmesi

PASS <- read_sav("Pass.sav")
PASS <- zap_labels(PASS)

1.1.2 2.Değişkenlerin Hazırlanması

table(PASS$pass)
## 
## 0 1 
## 7 4
PASS$pass <- factor(PASS$pass, levels = c(0, 1), labels = c("Kaldı", "Geçti"))
table(PASS$pass)
## 
## Kaldı Geçti 
##     7     4

1.1.3 Dağılım

table(PASS$pass)
## 
## Kaldı Geçti 
##     7     4
prop.table(table(PASS$pass))
## 
##     Kaldı     Geçti 
## 0.6363636 0.3636364

1.1.4 3.Model

model <- glm(pass ~ X, data = PASS, family = binomial(link = "logit"))
summary(model)
## 
## Call:
## glm(formula = pass ~ X, family = binomial(link = "logit"), data = PASS)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)  
## (Intercept)  -6.3475     3.6336  -1.747   0.0807 .
## X             0.9843     0.5547   1.774   0.0760 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 14.4206  on 10  degrees of freedom
## Residual deviance:  7.6638  on  9  degrees of freedom
## AIC: 11.664
## 
## Number of Fisher Scoring iterations: 6

X arttıkça geçme olasılığı artıyor yönünde bir ilişki var ancak örneklem çok küçük (n = 11) olduğu için anlamlılık eşiğine ulaşılamıyor.

X değişkeni tek tek p değerine göre anlamlı görünmese de modeli genel olarak iyileştiriyor. n = 11 çok küçük.

1.1.5 4.ODDS Ratio

round(cbind(OR = exp(coef(model)), exp(confint(model))), 3)
##                OR 2.5 % 97.5 %
## (Intercept) 0.002 0.000  0.262
## X           2.676 1.207 13.515

X bir birim arttığında geçme olasılığının kalmama olasılığına oranı 2.676 kat artıyor.

1.1.6 5.Model Uyum İyiliği

PseudoR2(model, which = c("McFadden", "CoxSnell", "Nagelkerke"))
##   McFadden   CoxSnell Nagelkerke 
##  0.4685529  0.4589566  0.6283291

1.1.7 Hosmer-Lemeshow testi

hl <- hoslem.test(as.numeric(PASS$pass) - 1, fitted(model), g = 10)
print(hl)
## 
##  Hosmer and Lemeshow goodness of fit (GOF) test
## 
## data:  as.numeric(PASS$pass) - 1, fitted(model)
## X-squared = 4.099, df = 6, p-value = 0.6633

Model uyumu oldukça iyi. X değişkeni pass’i açıklamada güçlü bir katkı yapıyor. Ancak n = 11 olduğu için bu değerleri temkinli yorumlamak gerekir.Küçük örneklemlerde psödo R² değerleri şişmeye eğilimlidir.

1.1.8 6.Sınıflandırma Performansı

PASS$prob <- predict(model, type = "response")
PASS$pred <- factor(ifelse(PASS$prob >= 0.5, "Geçti", "Kaldı"),
                    levels = c("Kaldı", "Geçti"))

cm <- confusionMatrix(PASS$pred, PASS$pass, positive = "Geçti")
print(cm)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Kaldı Geçti
##      Kaldı     6     1
##      Geçti     1     3
##                                           
##                Accuracy : 0.8182          
##                  95% CI : (0.4822, 0.9772)
##     No Information Rate : 0.6364          
##     P-Value [Acc > NIR] : 0.175           
##                                           
##                   Kappa : 0.6071          
##                                           
##  Mcnemar's Test P-Value : 1.000           
##                                           
##             Sensitivity : 0.7500          
##             Specificity : 0.8571          
##          Pos Pred Value : 0.7500          
##          Neg Pred Value : 0.8571          
##              Prevalence : 0.3636          
##          Detection Rate : 0.2727          
##    Detection Prevalence : 0.3636          
##       Balanced Accuracy : 0.8036          
##                                           
##        'Positive' Class : Geçti           
## 

11 gözlemden 9’u doğru sınıflandırılmış, 2’si yanlış.

Model makul bir performans gösteriyor, ancak n = 11 ile bu metriklerin güvenilirliği sınırlı.

1.1.9 7.ROC/AUC

roc_obj <- roc(PASS$pass, PASS$prob, levels = c("Kaldı", "Geçti"), direction = "<")
plot(roc_obj, col = "steelblue", lwd = 2, main = "ROC Eğrisi", print.auc = TRUE)

cat("AUC:", auc(roc_obj), "\n")
## AUC: 0.9107143

AUC değerine göre model mükemmel ayırt edicilik göstermektedir.

Eğrinin sol üst köşeye yakın olması iyi ayırt edicilik gücünün göstergesidir.

1.2 Pass(x2) veri seti ile:

gecme_durumu2 <- read_sav("Pass(x2).sav")
library(ggplot2)
ggplot(data = gecme_durumu2, aes(x = X, y = pass)) + 
  geom_jitter(width = 0, height = 0.05, alpha = 0.5)

Elde edilen grafikten anlaşıldığı üzere lojistik regresyona uygun bir yapı mevcuttur. X arttıkça geçme olasılığı belirgin şekilde artıyor, iki grup arasında makul bir ayrışma var.

library(dplyr)
gecme_durumu2 <- gecme_durumu2 |>
  mutate(is_gecti = ifelse(pass == "gecti", 1, 0))
cor.test(gecme_durumu2$X, gecme_durumu2$pass, method = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  gecme_durumu2$X and gecme_durumu2$pass
## t = 4.3406, df = 20, p-value = 0.0003173
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3891341 0.8642937
## sample estimates:
##      cor 
## 0.696477

X arttıkça geçme olasılığı artıyor, bu lojistik regresyon bulgusunu destekliyor.

data_space2 <- ggplot(data = gecme_durumu2, aes(x = X, y = pass)) + 
  geom_jitter(width = 0, height = 0.05, alpha = 0.5)
data_space2

data_space2 +
  geom_smooth(method = "lm", se = FALSE)

Doğru pozitif eğimli (X arttıkça pass artıyor) Korelasyon değeri ile tutarlı bir görünüm mevcut.

1.3 Farklı Bir Veri Seti ile Lojistik Regresyonun Uygulanması

1.3.1 Veri Seti:

mlbench paketindeki BreastCancer veri setini kullanarak lojistik regresyon analizi yapılmıştır.

Belirli bir örneğin diğer 9 hücre özelliğine dayanarak iyi veya kötü huylu olma durumu modellenmiştir.

library(mlbench)
library(tidyverse)
library(DescTools)
library(ResourceSelection)
library(pROC)
library(caret)

1.3.2 Veri Yükleme:

data(BreastCancer)
BC <- BreastCancer

str(BC)
## 'data.frame':    699 obs. of  11 variables:
##  $ Id             : chr  "1000025" "1002945" "1015425" "1016277" ...
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
summary(BC)
##       Id             Cl.thickness   Cell.size     Cell.shape  Marg.adhesion
##  Length:699         1      :145   1      :384   1      :353   1      :407  
##  Class :character   5      :130   10     : 67   2      : 59   2      : 58  
##  Mode  :character   3      :108   3      : 52   10     : 58   3      : 58  
##                     4      : 80   2      : 45   3      : 56   10     : 55  
##                     10     : 69   4      : 40   4      : 44   4      : 33  
##                     2      : 50   5      : 30   5      : 34   8      : 25  
##                     (Other):117   (Other): 81   (Other): 95   (Other): 63  
##   Epith.c.size  Bare.nuclei   Bl.cromatin  Normal.nucleoli    Mitoses   
##  2      :386   1      :402   2      :166   1      :443     1      :579  
##  3      : 72   10     :132   3      :165   10     : 61     2      : 35  
##  4      : 48   2      : 30   1      :152   3      : 44     3      : 33  
##  1      : 47   5      : 30   7      : 73   2      : 36     10     : 14  
##  6      : 41   3      : 28   4      : 40   8      : 24     4      : 12  
##  5      : 39   (Other): 61   5      : 34   6      : 22     7      :  9  
##  (Other): 66   NA's   : 16   (Other): 69   (Other): 69     (Other): 17  
##        Class    
##  benign   :458  
##  malignant:241  
##                 
##                 
##                 
##                 
## 

1.3.3 Veri Hazırlama:

# Id sütununu kaldır (analitik değeri yok)
BC <- BC %>% select(-Id)
# Tüm bağımsız değişkenler factor olarak geliyor. numeric'e çevir.
BC <- BC %>%
  mutate(across(-Class, ~ as.numeric(as.character(.))))
# Eksik değerleri kaldır (Bare.nuclei'de 16 NA var)
BC <- na.omit(BC)
# Bağımlı değişkeni kontrol et
table(BC$Class)
## 
##    benign malignant 
##       444       239
# benign = iyi huylu, malignant = kötü huylu

1.3.4 Model:

model <- glm(Class ~ ., data = BC, family = binomial(link = "logit"))
summary(model)
## 
## Call:
## glm(formula = Class ~ ., family = binomial(link = "logit"), data = BC)
## 
## Coefficients:
##                  Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     -10.10394    1.17488  -8.600  < 2e-16 ***
## Cl.thickness      0.53501    0.14202   3.767 0.000165 ***
## Cell.size        -0.00628    0.20908  -0.030 0.976039    
## Cell.shape        0.32271    0.23060   1.399 0.161688    
## Marg.adhesion     0.33064    0.12345   2.678 0.007400 ** 
## Epith.c.size      0.09663    0.15659   0.617 0.537159    
## Bare.nuclei       0.38303    0.09384   4.082 4.47e-05 ***
## Bl.cromatin       0.44719    0.17138   2.609 0.009073 ** 
## Normal.nucleoli   0.21303    0.11287   1.887 0.059115 .  
## Mitoses           0.53484    0.32877   1.627 0.103788    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 884.35  on 682  degrees of freedom
## Residual deviance: 102.89  on 673  degrees of freedom
## AIC: 122.89
## 
## Number of Fisher Scoring iterations: 8

Tüm anlamlı değişkenlerin katsayısı pozitiftir. Bu beklenen yöndedir ve hücresel anormallik arttıkça malignant olasılığı artmaktadır. Cell.size anlamlı değil. Cell.shape ile yüksek korelasyonu olduğu için birinin etkisi diğerini baskılıyor olabilir (çoklu doğrusallık şüphesi).

1.3.5 ODDS Ratio ve %95 GA

round(cbind(OR = exp(coef(model)), exp(confint(model))), 3)
##                    OR 2.5 % 97.5 %
## (Intercept)     0.000 0.000  0.000
## Cl.thickness    1.707 1.315  2.311
## Cell.size       0.994 0.674  1.549
## Cell.shape      1.381 0.862  2.156
## Marg.adhesion   1.392 1.097  1.798
## Epith.c.size    1.101 0.805  1.499
## Bare.nuclei     1.467 1.230  1.784
## Bl.cromatin     1.564 1.131  2.225
## Normal.nucleoli 1.237 0.998  1.561
## Mitoses         1.707 0.993  3.024

Cl.thickness: Bir birim artışta malignant olasılığı 1.707 kat artıyor. Bare.nuclei: Bir birim artışta 1.467 kat artıyor. Bl.cromatin: Bir birim artışta 1.564 kat artıyor. Marg.adhesion: Bir birim artışta 1.392 kat artıyor.

Cell.size OR = 0.994 neredeyse 1, yani hiç etkisi yok. Modelden çıkarılabilir.

1.3.6 Model Uyum İyiliği:

PseudoR2(model, which = c("McFadden", "CoxSnell", "Nagelkerke"))
##   McFadden   CoxSnell Nagelkerke 
##  0.8836567  0.6815090  0.9386555

Nagelkerke R² = 0.939 9 bağımsız değişken, malignant/benign ayrımındaki varyansın %93.9’unu açıklıyor. Gerçek klinik veri için son derece güçlü bir model.

# Hosmer-Lemeshow testi
hl <- hoslem.test(as.numeric(BC$Class) - 1, fitted(model), g = 10)
print(hl)
## 
##  Hosmer and Lemeshow goodness of fit (GOF) test
## 
## data:  as.numeric(BC$Class) - 1, fitted(model)
## X-squared = 13.941, df = 8, p-value = 0.08331

Gözlenen ve tahmin edilen değerler arasında anlamlı bir fark yok. Model veriye iyi uyuyor.

Her iki uyum iyiliği göstergesi de modelin çok güçlü olduğuna işaret ediyor.

1.3.7 Sınıflandırma Performansı

BC$prob <- predict(model, type = "response")
BC$pred <- factor(ifelse(BC$prob >= 0.5, "malignant", "benign"),
                  levels = c("benign", "malignant"))

cm <- confusionMatrix(BC$pred, BC$Class, positive = "malignant")
print(cm)
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       434        11
##   malignant     10       228
##                                           
##                Accuracy : 0.9693          
##                  95% CI : (0.9534, 0.9809)
##     No Information Rate : 0.6501          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9324          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9540          
##             Specificity : 0.9775          
##          Pos Pred Value : 0.9580          
##          Neg Pred Value : 0.9753          
##              Prevalence : 0.3499          
##          Detection Rate : 0.3338          
##    Detection Prevalence : 0.3485          
##       Balanced Accuracy : 0.9657          
##                                           
##        'Positive' Class : malignant       
## 

683 gözlemden 662’si doğru sınıflandırıldı, yalnızca 21 hata var. Tüm metrikler son derece yüksek, model klinik açıdan da güvenilir bir performans sergiliyor.

1.3.8 ROC/AUC

roc_obj <- roc(BC$Class, BC$prob,
               levels = c("benign", "malignant"),
               direction = "<")

plot(roc_obj, col = "steelblue", lwd = 2,
     main = "ROC Eğrisi — BreastCancer",
     print.auc = TRUE)

cat("AUC:", auc(roc_obj), "\n")
## AUC: 0.9963248

AUC değeri mükemmele çok yakın ayırt edicilik gücünü göstermektedir. Eğrinin şekli ideale yakındır.

Tüm göstergeler tutarlı biçimde çok yüksek. BreastCancer veri seti lojistik regresyon için oldukça uygun bir yapıya sahip. Değişkenler malignant/benign ayrımını güçlü biçimde açıklıyor.

2 Genel Değerlendirme ve Öğrenme Yansıması

Lojistik regresyon öğrenme sürecinde hem kavramsal hem teknik hem de uygulamalı boyutlarda önemli kazanımlar elde ettim.

Kavramsal açıdan, bağımlı değişkenin ikili olduğu durumlarda doğrusal regresyonun neden yetersiz kaldığını anladım. Doğrusal modelin olasılık tahminlerini 0-1 aralığı dışına taşıyabildiğini, bunun da yorumlanamaz sonuçlar doğurduğunu gördüm. Logit dönüşümü ve sigmoid eğrisinin bu sorunu nasıl çözdüğünü kavradım. Odds ve Odds Ratio kavramlarını yorumlamayı öğrendim; OR’ın 1’den büyük olmasının ilgili değişken arttıkça olayın gerçekleşme şansının arttığını, 1’den küçük olmasının ise azaldığını gösterdiğini anladım.