Bu günlükte, ggplot2 paketindeki diamonds veri seti kullanılarak çoklu regresyon, dummy kodlama ve etkileşim etkisi analiz edilecektir. Bağımlı değişken olarak price (pırlanta fiyatı) alınmıştır.
data("diamonds")
glimpse(diamonds)
## Rows: 53,940
## Columns: 10
## $ carat <dbl> 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0.23, 0.…
## $ cut <ord> Ideal, Premium, Good, Premium, Good, Very Good, Very Good, Ver…
## $ color <ord> E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J, J, J, I,…
## $ clarity <ord> SI2, SI1, VS1, VS2, SI2, VVS2, VVS1, SI1, VS2, VS1, SI1, VS1, …
## $ depth <dbl> 61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4, 64…
## $ table <dbl> 55, 61, 65, 58, 58, 57, 57, 55, 61, 61, 55, 56, 61, 54, 62, 58…
## $ price <int> 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339, 340, 34…
## $ x <dbl> 3.95, 3.89, 4.05, 4.20, 4.34, 3.94, 3.95, 4.07, 3.87, 4.00, 4.…
## $ y <dbl> 3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, 4.05, 4.…
## $ z <dbl> 2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, 2.39, 2.…
summary(diamonds[, c("price", "carat", "depth", "table")])
## price carat depth table
## Min. : 326 Min. :0.2000 Min. :43.00 Min. :43.00
## 1st Qu.: 950 1st Qu.:0.4000 1st Qu.:61.00 1st Qu.:56.00
## Median : 2401 Median :0.7000 Median :61.80 Median :57.00
## Mean : 3933 Mean :0.7979 Mean :61.75 Mean :57.46
## 3rd Qu.: 5324 3rd Qu.:1.0400 3rd Qu.:62.50 3rd Qu.:59.00
## Max. :18823 Max. :5.0100 Max. :79.00 Max. :95.00
GGally::ggpairs(diamonds %>% select(price, carat, depth, table) %>% sample_n(1000))
-
carat ile price arasında çok güçlü ve
pozitif bir ilişki vardır (r = 0.931). - depth ve
table değişkenlerinin korelasyonları daha düşüktür. -
depth ~ table ilişkisinde negatif yönlü bir ilişki
görülmektedir (r = -0.210). - Fiyat değişkeni sağa çarpık dağılıma
sahiptir — uç gözlemler içerebilir.
model1 <- lm(price ~ carat + depth + table, data = diamonds)
tab_model(model1,
title = "Model 1: Ağırlık, Derinlik ve Tabla Oranının Fiyata Etkisi")
| price | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | 13003.44 | 12237.24 – 13769.64 | <0.001 |
| carat | 7858.77 | 7831.03 – 7886.51 | <0.001 |
| depth | -151.24 | -160.68 – -141.79 | <0.001 |
| table | -104.47 | -110.63 – -98.32 | <0.001 |
| Observations | 53940 | ||
| R2 / R2 adjusted | 0.854 / 0.854 | ||
Model 1’de bağımlı değişken olarak pırlanta fiyatı
(price), bağımsız değişkenler olarak ağırlık
(carat), derinlik (depth) ve tabla oranı
(table) kullanılmıştır.
Ağırlık (carat), pırlanta fiyatı
üzerinde en güçlü ve pozitif etkiye sahiptir. carat
değişkeninin katsayısı 7858.77 olup, bu değişken 1 birim arttığında
(diğer değişkenler sabitken) fiyatın ortalama 7859 dolar
arttığı görülmektedir. Etki çok büyüktür ve istatistiksel
olarak anlamlıdır (p < 0.001).
Derinlik (depth) değişkeni, fiyat
üzerinde negatif bir etki göstermektedir. Katsayısı -151.24 olup, bu
değişken bir birim arttığında fiyat ortalama 151 dolar
azalmaktadır (p < 0.001).
Tabla oranı (table) da benzer
şekilde negatif etkilidir. Katsayısı -104.47 olup, bu da bir birimlik
artışın fiyatı ortalama 104 dolar düşürdüğünü gösterir
(p < 0.001).
Bu model sonuçları, pırlantanın ağırlığının fiyat üzerindeki en
önemli belirleyici olduğunu net bir şekilde ortaya koymaktadır. Derinlik
ve tabla oranı değişkenleri istatistiksel olarak anlamlı olmakla
birlikte, etkileri carat kadar güçlü değildir. Modelin
açıklayıcılığı oldukça yüksek olduğu için bu üç değişken birlikte
pırlanta fiyatlarını başarılı şekilde tahmin edebilmektedir.
5.1 Artıkların Dağılımı
par(mfrow = c(2,2))
plot(model1)
par(mfrow = c(1,1))
Regresyon modeli için oluşturulan tanılayıcı grafikler aşağıdaki gözlemleri ortaya koymuştur:
Sonuç olarak, modelin bazı varsayımlarında kısmi ihlaller mevcuttur. Bu nedenle varsayımları iyileştirmek için dönüşüm, etkileşim terimi ekleme veya etkili gözlemleri dışlama gibi stratejiler değerlendirilebilir.
5.2 Normallik
qqnorm(resid(model1))
qqline(resid(model1))
shapiro.test(sample(resid(model1), 5000))
##
## Shapiro-Wilk normality test
##
## data: sample(resid(model1), 5000)
## W = 0.87926, p-value < 2.2e-16
Modelin artıklarının normal dağılıma uygunluğu hem grafiksel hem de istatistiksel olarak değerlendirilmiştir.
Ancak örneklem büyüklüğü (n ≈ 54,000) çok yüksek olduğu için bu test fazla hassas çalışmakta, küçük sapmaları bile istatistiksel olarak anlamlı gösterebilmektedir. Bu nedenle grafiksel değerlendirme ile birlikte yorumlanmalıdır.
Sonuç olarak, normallik varsayımı özellikle uç değerlerde tam olarak sağlanmamaktadır. Gerekirse artıklar üzerinde dönüşüm (örneğin Box-Cox) ya da robust regresyon gibi yöntemler tercih edilebilir.
5.3 Multicollinearity (VIF)
car::vif(model1)
## carat depth table
## 1.042039 1.104275 1.141032
Modeldeki değişkenler arası doğrusal bağlantıyı kontrol etmek amacıyla VIF (Variance Inflation Factor) değerleri hesaplanmıştır:
| Değişken | VIF |
|---|---|
| carat | 1.042 |
| depth | 1.104 |
| table | 1.141 |
Tüm VIF değerleri 2’nin altındadır. Bu, bağımsız değişkenler arasında anlamlı bir çoklu bağlantı olmadığını ve model katsayılarının güvenle yorumlanabileceğini göstermektedir. Dolayısıyla bu modelde multicollinearity sorunu bulunmamaktadır.
diamonds$cooks_d <- cooks.distance(model1)
threshold <- 4 / nrow(diamonds)
diamonds %>%
filter(cooks_d > threshold) %>%
select(price, carat, depth, table, cooks_d) %>%
arrange(desc(cooks_d)) %>%
head()
## # A tibble: 6 × 5
## price carat depth table cooks_d
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 18018 5.01 65.5 59 0.0572
## 2 18531 4.5 65.8 58 0.0263
## 3 11668 3.65 67.1 53 0.0224
## 4 15223 4.01 61 61 0.0177
## 5 15223 4.01 62.5 62 0.0171
## 6 15984 4 63.3 58 0.0157
Cook’s Distance değerleri, her bir gözlemin regresyon modeline olan etkisini ölçer. “4/n” kuralına göre (n = 53940, 4/n ≈ 0.000074), bu sınırın üzerinde olan gözlemler etkili gözlemler olarak değerlendirilir.
İlk 6 gözlemin Cook’s Distance değeri 0.015 – 0.057 arasında değişmektedir; bu değerler eşik değeri büyük ölçüde aşmıştır. Bu gözlemler, büyük karat değerine (carat > 4.0) ve yüksek fiyata sahip olup model üzerinde belirgin etkiler oluşturabilir.
Bu tür etkili gözlemler, modelin tahmin gücünü ve doğruluğunu bozabileceği için incelenmeli ve gerekiyorsa analiz dışında bırakılarak modeller yeniden kurulmalıdır.
diamonds$cut <- factor(diamonds$cut,
levels = c("Fair", "Good", "Very Good", "Premium", "Ideal"))
model2 <- lm(price ~ carat + depth + table + cut, data = diamonds)
tab_model(model2,
title = "Model 2: Kesim Kalitesinin (cut) Eklenmesi")
| price | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | 4296.95 | 3378.77 – 5215.13 | <0.001 |
| carat | 7890.77 | 7863.24 – 7918.30 | <0.001 |
| depth | -73.69 | -84.08 – -63.30 | <0.001 |
| table | -41.82 | -49.42 – -34.21 | <0.001 |
| cut [linear] | 1028.09 | 969.94 – 1086.24 | <0.001 |
| cut [quadratic] | -483.30 | -529.85 – -436.75 | <0.001 |
| cut [cubic] | 325.17 | 284.94 – 365.41 | <0.001 |
| cut [4th degree] | 59.23 | 26.96 – 91.50 | <0.001 |
| Observations | 53940 | ||
| R2 / R2 adjusted | 0.857 / 0.857 | ||
Model 2’de, cut değişkeni faktör olarak modele dahil
edilmiş ve R tarafından otomatik olarak dummy (yapay) değişkenlere
dönüştürülmüştür. Bu değişken, pırlantanın kesim kalitesini belirtmekte
olup 5 kategoriden oluşmaktadır (Fair, Good, Very Good, Premium,
Ideal).
Referans kategori: “Fair” kesim.
Sonuçlara göre:
cut[linear], cut[cubic] gibi katsayılar
istatistiksel olarak anlamlı çıkmıştır (p < 0.001).Bu sonuçlar, kesim kalitesinin fiyat üzerinde anlamlı bir rol
oynadığını göstermektedir. Bu nedenle cut gibi kategorik
değişkenlerin dummy kodlama ile modele dahil edilmesi önemlidir.
model3 <- lm(price ~ carat * cut + depth + table, data = diamonds)
tab_model(model3,
title = "Model 3: Ağırlık ile Kesim Kalitesi Etkileşimi")
| price | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | 4580.35 | 3669.00 – 5491.70 | <0.001 |
| carat | 7494.57 | 7456.27 – 7532.86 | <0.001 |
| cut [linear] | -466.63 | -581.31 – -351.95 | <0.001 |
| cut [quadratic] | 393.63 | 294.68 – 492.58 | <0.001 |
| cut [cubic] | -231.09 | -315.90 – -146.28 | <0.001 |
| cut [4th degree] | 38.90 | -26.61 – 104.41 | 0.245 |
| depth | -69.12 | -79.43 – -58.80 | <0.001 |
| table | -44.31 | -51.88 – -36.74 | <0.001 |
| carat × cut [linear] | 1518.29 | 1418.51 – 1618.06 | <0.001 |
| carat × cut [quadratic] | -775.56 | -865.53 – -685.59 | <0.001 |
| carat × cut [cubic] | 526.10 | 444.85 – 607.36 | <0.001 |
| carat × cut [4th degree] | 81.08 | 13.76 – 148.39 | 0.018 |
| Observations | 53940 | ||
| R2 / R2 adjusted | 0.860 / 0.860 | ||
Model 3’te, carat (pırlanta ağırlığı) ile
cut (kesim kalitesi) değişkeni arasında etkileşim terimleri
dahil edilmiştir. Bu sayede ağırlığın fiyat üzerindeki etkisinin kesim
kalitesine göre değişip değişmediği test edilmiştir.
Sonuçlara göre:
cut[4th degree] etkileşimi daha sınırlı
anlamlıdır (p = 0.018).carat × cut[linear] etkileşimi (+1518) yüksek
ve anlamlıdır. Bu, daha iyi kesim kalitesine sahip pırlantalarda,
ağırlığın fiyat üzerindeki etkisinin daha da
güçlendiğini gösterir.Bu sonuçlar, pırlanta fiyatlarının yalnızca ağırlık ve kesim kalitesine bağlı olmadığını; bu iki değişkenin birbirleriyle olan ilişkilerinin de önemli rol oynadığını göstermektedir.
library(performance)
compare_performance(model1, model2, model3, rank = TRUE)
## # Comparison of Model Performance Indices
##
## Name | Model | R2 | R2 (adj.) | RMSE | Sigma | AIC weights
## ----------------------------------------------------------------------
## model3 | lm | 0.860 | 0.860 | 1494.663 | 1494.829 | 1.00
## model2 | lm | 0.857 | 0.857 | 1508.238 | 1508.350 | 8.71e-211
## model1 | lm | 0.854 | 0.854 | 1526.038 | 1526.094 | 0.00e+00
##
## Name | AICc weights | BIC weights | Performance-Score
## -------------------------------------------------------
## model3 | 1.00 | 1.00 | 100.00%
## model2 | 8.72e-211 | 4.64e-203 | 32.50%
## model1 | 0.00e+00 | 0.00e+00 | 0.00%
Üç modelin karşılaştırılmasında şu performans metrikleri kullanılmıştır: R², RMSE, AIC, BIC ve Performance Score.
| Model | R² | RMSE | AIC Weight | Performance Score |
|---|---|---|---|---|
| Model 3 | 0.860 | 1494.66 | 1.00 | 100% |
| Model 2 | 0.857 | 1508.24 | 8.7e-211 | 32.5% |
| Model 1 | 0.854 | 1526.04 | 0.00 | 0.0% |
Sonuçlara göre:
Bu sonuçlar, çoklu regresyon analizlerinde dummy değişkenlerin ve özellikle etkileşim terimlerinin modele dahil edilmesinin önemini net biçimde göstermektedir.
Model 3, etkileşim içeren en kapsamlı modeldir. Kesim kalitesi ile ağırlık arasında anlamlı bir etkileşim olduğu görülmektedir. Ağırlık arttıkça fiyat tahmini kesim kalitesine göre farklılık göstermektedir. Ayrıca, dummy değişken olarak cut dahil edildiğinde modelin açıklayıcılığı artmıştır. Model varsayımları büyük ölçüde sağlanmaktadır.