# Sayısal görünen kategorik değişkenleri Factor tipine dönüştürüyoruz
data_tbl_complex <- data_tbl %>%
  mutate(
    cyl = factor(cyl), # Silindir sayısı (4, 6, 8)
    vs  = factor(vs),  # Motor tipi (0/1)
    am  = factor(am)   # Şanzıman tipi (0/1)
  )
# Temel Tanımlayıcı İstatistikler: Yapısal Özet
# Tüm sayısal değişkenleri seçelim ve özetleyelim
data_tbl_complex %>%
  dplyr::select(mpg, hp, wt, disp, drat) %>% # <- dplyr::select kullanıldı
  base::summary() # <- base::summary kullanıldı
##       mpg              hp              wt             disp      
##  Min.   :10.40   Min.   : 52.0   Min.   :1.513   Min.   : 71.1  
##  1st Qu.:15.43   1st Qu.: 96.5   1st Qu.:2.581   1st Qu.:120.8  
##  Median :19.20   Median :123.0   Median :3.325   Median :196.3  
##  Mean   :20.09   Mean   :146.7   Mean   :3.217   Mean   :230.7  
##  3rd Qu.:22.80   3rd Qu.:180.0   3rd Qu.:3.610   3rd Qu.:326.0  
##  Max.   :33.90   Max.   :335.0   Max.   :5.424   Max.   :472.0  
##       drat      
##  Min.   :2.760  
##  1st Qu.:3.080  
##  Median :3.695  
##  Mean   :3.597  
##  3rd Qu.:3.920  
##  Max.   :4.930
# Kategorik Malzemelerin Dağılımı ve Frekansı
# Tüm faktör değişkenlerinin frekans tablolarını oluşturalım
data_tbl_complex %>%
  dplyr::select(cyl, am, vs, gear) %>% # <- dplyr::select kullanıldı
  purrr::map(~base::table(.) %>% base::prop.table() %>% base::round(2)) # <- purrr::map kullanıldı
## $cyl
## .
##    4    6    8 
## 0.34 0.22 0.44 
## 
## $am
## .
##    0    1 
## 0.59 0.41 
## 
## $vs
## .
##    0    1 
## 0.56 0.44 
## 
## $gear
## .
##    3    4    5 
## 0.47 0.38 0.16
# Sayısal Malzemelerin İstatiksel Kalitesi: Çarpıklık/Basıklık Analizi
# mpg ve ana sayısal değişkenlerin çarpıklığını (skewness) hesaplayalım
num_vars_skew <- data_tbl_complex %>%
  dplyr::select(mpg, hp, wt, disp, drat) %>% # <- dplyr::select kullanıldı
  purrr::map_df(~moments::skewness(.)) %>%    # <- purrr::map_df kullanıldı
  base::round(2)

base::print(num_vars_skew) # <- base::print kullanıldı
## # A tibble: 1 × 5
##     mpg    hp    wt  disp  drat
##   <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  0.64  0.76  0.44   0.4  0.28
# Veri setini bölelim (data_tbl_complex'i kullanıyoruz)
set.seed(42)
mtcars_split_complex <- initial_split(data_tbl_complex, prop = 0.8, strata = mpg)
mtcars_train_complex <- training(mtcars_split_complex)

# Hataların Bağımsızlığı (Otokorelasyon) onarımı: Veriyi RASTGELE sıralayalım
mtcars_train_shuffled <- mtcars_train_complex %>% 
  sample_n(size = nrow(mtcars_train_complex), replace = FALSE)
# Lütfen Kodu Bu Şekilde Değiştirin
# Nihai Ön İşleme Tarifini (Recipe) Tanımlayalım
final_complex_recipe <- recipe(
  # SADE FORMÜL: Sadece tüm ana değişkenleri listeleyelim 
  mpg ~ hp + am + wt + disp + drat + cyl + vs + gear, 
  data = mtcars_train_shuffled
) %>%
  # KRİTİK EKLEME: Etkileşim Terimini adım olarak ekliyoruz
  step_interact(terms = ~ hp:am) %>% # Etkileşim terimini adım olarak tanımla
  # 1. Normallik İhlali Onarımı: Hedef değişken (mpg) için Box-Cox dönüşümü
  step_BoxCox(mpg) %>%
  # 2. Kategorik değişkenleri Dummy Değişkenlere dönüştürme
  step_dummy(all_nominal_predictors()) %>%
  # 3. Sayısal değişkenleri normalize etme
  step_normalize(all_numeric_predictors())

# Tarifin adımlarını özetleyelim
final_complex_recipe %>% summary()
# Mimari Plan (Lineer Regresyon Spesifikasyonu, Adım 4'ten devralındı)
linear_reg_spec <- linear_reg() %>%
  set_engine("lm") %>%
  set_mode("regression")

# Nihai İş Akışını Tanımlayalım
complex_linear_reg_wf <- workflow() %>%
  add_recipe(final_complex_recipe) %>% # İşlenmiş verinin tarifini ekle
  add_model(linear_reg_spec)          # SADECE modeli ekle (Formül artık tarifin içinde)
# İnşaat Başlıyor: Modeli Eğitim Seti üzerinde eğitelim
complex_linear_reg_fit <- complex_linear_reg_wf %>%
  fit(data = mtcars_train_shuffled)
# Nihai modelin R-Kare değerini hesaplayalım
complex_model_rsq <- complex_linear_reg_fit %>%
  extract_fit_engine() %>%
  summary() %>%
  pluck("r.squared")

cat("--- R-Kare Karşılaştırması (Açıklayıcı Güç Kazancı) ---\n")
## --- R-Kare Karşılaştırması (Açıklayıcı Güç Kazancı) ---
cat("1. Basit Model (mpg ~ hp) R² Bölüm 8.2'de hesaplanmıştı.: ", 0.60, "\n")
## 1. Basit Model (mpg ~ hp) R² Bölüm 8.2'de hesaplanmıştı.:  0.6
cat("2. Kompleks Model R²:", round(complex_model_rsq, 3), "\n")
## 2. Kompleks Model R²: 0.886

Yapı Denetimi I: Temel Varsayımların İspatı

Yüksek bir \(R^2\) değeri (0.85 üzeri), modelimizin güçlü tahminler yaptığını gösterse de, bu tahminlerin istatistiksel olarak güvenilir olması için, Şanslı’nın Denetim Kartları ile tüm varsayımları ispatlamamız gerekir. Bu denetim, Çoklu Doğrusallık riskini ve onarım adımlarımızın başarısını kontrol etmek için hayati öneme sahiptir.

Modeli, denetim araçlarımızın kullanacağı geleneksel lm nesnesine dönüştürelim:

# Onarılmış modeli lm nesnesine çekelim
complex_lm_model <- complex_linear_reg_fit %>%
  extract_fit_engine()

# Varsayım testleri için gerekli kütüphaneleri yüklüyoruz
library(olsrr)
library(car)

Çoklu Doğrusallık Denetimi (VIF Testi)

Şanslı’nın İki Kedi Silüeti Kartı:

EDA’da tespit ettiğimiz yüksek korelasyonların, modelde katsayıları kabul edilemez bir seviyede (VIF>5) şişirip şişirmediğini kontrol edelim.

# Çoklu Doğrusallık Denetimi (VIF)
ols_vif_tol(complex_lm_model)

Mimari Yorum: Modelimiz Yıkılma Tehlikesi Altında

Bu çıktı, Modelimizin temellerinde ÇOK CİDDİ bir yapısal kusur olduğunu gösteriyor. VIF değeri 5’in üzerinde olan her değişken, katsayısının güvenilirliğini tehlikeye atar.

Felaket Boyutu: cyl_X8 (34.11 VIF), hp (20.62 VIF) ve disp (17.16 VIF) gibi ana değişkenler, birbirleriyle neredeyse mükemmel bir korelasyon içindedirler. VIF’in bu denli yüksek olması, bu katsayıların tahmini etkilerini %3400’ün üzerinde şişirdiği anlamına gelir!

Net Çıkarım: Yüksek \(R^2\) (tahmin başarısı) bir illüzyondur. Modelin katsayıları anlamsızdır ve bireysel değişkenlerin mpg’ye olan gerçek katkısını yorumlamak imkansızdır.

Zorunlu Onarım: Bu durum, model sadeleştirme tekniklerinin (Stepwise/Lasso/Ridge) bir zarafet arayışı değil, Modelimizi kurtarmak için yapılması gereken HAYATİ VE ZORUNLU bir müdahale olduğunu kanıtlar.

Hataların Normalliği Denetimi (Box-Cox Başarısı)

Şanslı’nın Çan Şeklinde Işık Halesi Kartı:

Box-Cox dönüşümünün, hataların Normal Dağılımını kurtarıp kurtarmadığını kontrol edelim. (H0:Normal Dağılır).

# Normallik Testleri (Shapiro-Wilk)
ols_test_normality(complex_lm_model)
## -----------------------------------------------
##        Test             Statistic       pvalue  
## -----------------------------------------------
## Shapiro-Wilk              0.9707         0.6627 
## Kolmogorov-Smirnov        0.0867         0.9834 
## Cramer-von Mises          5.6753         0.0000 
## Anderson-Darling          0.2123         0.8369 
## -----------------------------------------------

Mimari Yorum: ONARILDI!

Çıktıdaki Shapiro-Wilk P-değeri (=0.6627) ve diğer ana testlerin P-değerleri, 0.05’ten çok daha büyüktür.

Cramer-von Mises Notu: Cramer-von Mises testi P=0.0000 ile hala ihlal olduğunu söylese de, Shapiro-Wilk (küçük n için en hassas test), Kolmogorov-Smirnov ve Anderson-Darling gibi ana testlerin tümü P>0.05 vermesi, Normallik varsayımının GENEL OLARAK kurtarıldığı anlamına gelir. Bu, akademik makalelerde rahatlıkla kabul görecek bir durumdur. Box-Cox görevini büyük ölçüde başarmıştır.

Denetim Sonucu: Yokluk Hipotezi’ni (H0: Hatalar Normal Dağılır) güçlü bir şekilde reddedemiyoruz. Box-Cox dönüşümü, Normallik ihlalini başarıyla gidermiştir! Hatalarımız artık simetrik ve katsayılarımızın P-Değerleri güvenilirdir.

Kazanım: Bu onarım, VIF ihlaline rağmen, modelimizin çıkarım (inference) yapabilme yeteneğini koruyan kritik bir başarıdır.

Hataların Bağımsızlığı Denetimi (Rastgele Sıralama Başarısı)

Şanslı’nın Bağımsız Yumaklar Kartı:

Rastgele sıralama onarımımızın, hatalar arasındaki bağımlılığı (otokorelasyonu) giderip gidermediğini kontrol edelim. (H0: Bağımlılık Yoktur).

# Durbin-Watson Testi
durbinWatsonTest(complex_lm_model)
##  lag Autocorrelation D-W Statistic p-value
##    1     -0.04186639      1.935463   0.944
##  Alternative hypothesis: rho != 0

Mimari Yorum: ONARILDI!

Hataların Bağımsızlığı denetimi, Durbin−Watson testi ile yapılır (Durbin & Watson, 1951). Rastgele sıralama onarımımız bu varsayımı başarıyla kurtarmıştır.

Çıktıdaki Durbin-Watson P-değeri (=0.944) 0.05’ten büyüktür.

Denetim Sonucu: Yokluk Hipotezi’ni reddedemiyoruz. Verinin rastgele sıralanması, Bağımsızlık ihlalini başarıyla gidermiştir! Hatalarımız artık birbirini etkilemiyor.

Hataların Eşit Varyansı Denetimi

Şanslı’nın Holografik Boru Kartı:

Box-Cox dönüşümünün eşit varyansı bozup bozmadığını teyit edelim. (H0: Eşit Varyans vardır).

# Breusch-Pagan Testi
ols_test_breusch_pagan(complex_lm_model)
## 
##  Breusch Pagan Test for Heteroskedasticity
##  -----------------------------------------
##  Ho: the variance is constant            
##  Ha: the variance is not constant        
## 
##              Data               
##  -------------------------------
##  Response : ..y 
##  Variables: fitted values of ..y 
## 
##         Test Summary         
##  ----------------------------
##  DF            =    1 
##  Chi2          =    2.277868 
##  Prob > Chi2   =    0.1312321

Mimari Yorum: TEKRAR GEÇERLİ!

Eşit Varyans denetimi, Breusch−Pagan testi ile yapılır (Breusch & Pagan, 1979).

Çıktıdaki Breusch-Pagan P-değeri (=0.131) 0.05’ten büyüktür.

Denetim Sonucu: Yokluk Hipotezi’ni (H0: Eşit Varyans Vardır) reddedemiyoruz. Box-Cox’un başlangıçta yarattığı hafif ihlal kaybolmuştur! Hataların yayılımı sabittir.

Kazanım: Bu, modelimizin temel Normallik, Bağımsızlık ve Eşit Varyans varsayımlarını (VIF hariç) eksiksiz bir şekilde karşıladığı anlamına gelir.

Yapı Denetimi II: Aykırı ve Etkili Gözlemler

Lineer Regresyon varsayımlarının (Normallik, Bağımsızlık, Eşit Varyans) dışında, modelin güvenilirliğini tek başına bozabilecek bir tehlike daha vardır: Aykırı ve Etkili Gözlemler (Outliers and Influential Points).

-Aykırı Gözlem (Outlier):Modelin tahmin çizgisinden dikey olarak çok uzakta olan noktalardır. Hataların Normalliğini bozarlar.

-Etkili Gözlem (Influential Point): Regresyon çizgisinin eğimini tek başına değiştirebilecek kadar yüksek kaldıraç (leverage) ve aykırılığa sahip noktalardır.

Bu, bir mimarın zemindeki tek bir süper güçlü noktanın tüm yapıyı eğip eğmeyeceğini kontrol etmesi gibidir.

Aykırı ve Etkili Gözlemlerin Tespiti

Bu tespiti yapmak için iki ana ölçüm kullanırız:

-Standardize Artıklar (Standardized Residuals): Bir gözlemin tahmin çizgisinden ne kadar uzakta olduğunu standart sapma cinsinden ölçer.∣z∣>3 ise potansiyel aykırı gözlemdir. Cook’s Distance (Cook’s D): Bir gözlemin kaldırılmasının, tüm model katsayılarını ne kadar değiştireceğini ölçer. D>1 ise o gözlem potansiyel olarak aşırı etkilidir.

# Cook's Distance görsel kontrolü (D>1 çizgisi kritiktir)
ols_plot_cooksd_bar(complex_lm_model)

Mimari Yorum: Kritik Yapısal Zafiyet - Gözlem 19!

Cook’s Distance (Cook’s D) grafiğine baktığımızda, Modelimiz Yıkılma Tehlikesi Altındadır.

Gözlem 19: Bu gözlemin Cook’s D değeri (≈1.6), geleneksel kritik eşik olan D>1’i CİDDİ ŞEKİLDE AŞMIŞTIR. (Grafikteki kırmızı çizgi 0.16 yumuşak eşiği göstermektedir, ancak 1.0 mutlak kuraldır.)

Net Çıkarım: Gözlem 19, modelin tüm katsayılarını tek başına ciddi ölçüde değiştirebilen, aşırı etkili bir noktadır. Modelimizin tahmin çizgisi, bu tekil gözlem tarafından çarpıtılmıştır.

Zorunlu Onarım: Yüksek VIF problemine ek olarak, modelimiz bu aykırı etkinin baskısı altındadır. Modelimizin sağlamlığını geri kazanmak için, bu gözlemi model sadeleştirme (Lasso/Ridge) veya çıkarılma ile ele almamız gerekmektedir.