1 Simpson Paradoksunu Keşfetmek: Palmer Penguins Örneği

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.2
## ✔ 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(palmerpenguins)
## 
## Attaching package: 'palmerpenguins'
## 
## The following objects are masked from 'package:datasets':
## 
##     penguins, penguins_raw

2 Verilerin Hazırlanması ve Veri İsimlerinin Değiştirilmesi

Orjinal veriyi korumak ve kodlama kolaylığı sağlamak için “veri” adını vererek mevcut veri setini kopyaladım.

veri <- penguins

Değişken isimlerini Türkçe yaptım ve “turkce_veri" yeni bir veri seti oluşturdum.

turkce_veri <- veri %>% 
  rename(
    tur=species,
    ada=island,
    gaga_uzunlugu=bill_length_mm,
    gaga_derinligi=bill_depth_mm,
    yuzgec_uzunlugu=flipper_length_mm,
    vucut_kutlesi=body_mass_g,
    cinsiyet=sex,
    yil=year
  )

Verilerin temizlenmeden önceki halini kontrol ettim.

dim(turkce_veri)
## [1] 344   8

Verileri temzleyip “temiz_veri" adında yeni bir veri oluşturdum.

temiz_veri <- turkce_veri %>% 
  na.omit()

Temizlenmiş verileri kontrol ettim.

dim(temiz_veri)
## [1] 333   8

bmi" adında yeni bir değişken tanımlayıp "veri_bmi" adında yeni bir veri oluşturdum. Daha sonra”tanimlayici_tablo” diye bir veri oluşturarak tanımlayıcı istatistikleri hesapladım ve tabloyu ekranda göstedim.

veri_bmi <- temiz_veri %>% 
  mutate(bmi=(vucut_kutlesi/yuzgec_uzunlugu))
tanimlayici_tablo <- veri_bmi %>% 
group_by(tur) %>%
  summarise(
    Ortalama = mean(bmi),
    Standart_Sapma = sd(bmi),
    Minimum_Deger = min(bmi),
    Maksimum_Deger = max(bmi)
  )
print(tanimlayici_tablo)
## # A tibble: 3 × 5
##   tur       Ortalama Standart_Sapma Minimum_Deger Maksimum_Deger
##   <fct>        <dbl>          <dbl>         <dbl>          <dbl>
## 1 Adelie        19.5           2.18          15.2           25.3
## 2 Chinstrap     19.0           1.60          14.1           22.9
## 3 Gentoo        23.4           1.88          19.0           28.5

Kutu grafiği oluşturdum.

ggplot(data = veri_bmi, aes(x = tur, y = bmi, fill = tur)) +
  geom_boxplot() +
  labs(
    title = "Penguen Turlerine Gore BMI Dagilimi",
    x = "Penguen Turu",
    y = "Vucut Kutle Indeksi (BMI)"
  ) +
  theme_minimal()

Yorum: Tablo ve grafik incelendiğinde penguen türleri arasında Vücut Kütle İndeksi (BMI) açısından farklılık olduğu söylenebilir. Gentoo türünün ortalama BMI değeri diğer iki türe nazaran oldukça yüksek iken Adelie ve Chinstrap türlerinin ortalama BMI değerleri birbirine oldukça yakındır.

3 Görev 1: Toplam Düzeyde Analiz

Gaga uzunluğu ve gaga derinliği arasındaki ilişkiyi gösteren dağılım grafiği oluşturdum. Grafiğe regresyon doğrusu ekledim.

ggplot(data = temiz_veri, aes(x = gaga_uzunlugu, y = gaga_derinligi)) +
  geom_point() +
  geom_smooth(method = "lm") +  
  labs(
    title = "Gaga Uzunlugu ve Gaga Derinligi Iliskisi",
    x = "Gaga Uzunlugu (mm)",
    y = "Gaga Derinliği (mm)"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Yorum: Grafiğe eklenen regresyon doğrusu incelendiğinde penguenlerin gaga uzunluğu ile gaga derinlikleri arasında negatif bir ilişki olduğu söylenebilir. Gaga uzunluğu arttıkça gaga derinliği azalma eğilimindedir. Ancak noktaların farklı bölgelerde kümelendiği görülmektedir.

Yukarıda çizdiğim regresyon doğrusu için basit doğrusal regresyon modeli kurdum. Modelde gaga uzunluğu ile gaga derinliğini tahmin etmeye çalıştım. Daha sonra modelin sonuçlarını inceledim.

tum_model <- lm(gaga_derinligi ~ gaga_uzunlugu, data = temiz_veri)


summary(tum_model)
## 
## Call:
## lm(formula = gaga_derinligi ~ gaga_uzunlugu, data = temiz_veri)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1548 -1.4291  0.0122  1.3994  4.5004 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   20.78665    0.85417  24.335  < 2e-16 ***
## gaga_uzunlugu -0.08233    0.01927  -4.273 2.53e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.92 on 331 degrees of freedom
## Multiple R-squared:  0.05227,    Adjusted R-squared:  0.04941 
## F-statistic: 18.26 on 1 and 331 DF,  p-value: 2.528e-05

Yorum: Penguenleri gruplara ayırmadan yapılan regresyon analizine göre gaga uzunluğu ile gaga derinliği arasında istatistiksel olarak negatif ve anlamlı bir ilişki vardır [F(1, 331) = 18.26, p < .001.].Gaga uzunluğundaki bir birimlik artışın gaga derinliğinde 0.08 birim azalma ile ilişkili olduğu görülmektedir (b=0.08). Modele göre R2 değeri gaga uzunluğunun gaga derinliğindeki varyansın yaklaşık olarak %5’ini açıklamaktadır R2=0.05).

4 Görev 2: Tür Bazında Analiz

Türleri tek grafikte görmek için türleri farklı renkte göstererek grafik çizdirdim.

ggplot(data = temiz_veri, aes(x = gaga_uzunlugu, y = gaga_derinligi, color = tur)) +
  geom_point() +
  geom_smooth(method = "lm") + 
  labs(
    title = "Turlere Gore Gaga Uzunlugu-Gaga Derinligi",
    x = "Gaga Uzunlugu (mm)",
    y = "Gaga Derinligi (mm)",
    color = "Penguen Turu" 
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Yorum: Farklı türlerde gaga uzunluğu ve gaga derinliği ilişkisinin incelendiği bu grafiğe göre tüm türler için gaga derinliği ile gaga uzunluğu arasın pozitif bir ilişki vardır.

Fraklı türlerde gaga uzunluğu, agaga derinliği ilişkisini incelemek için regresyon denklemi kurdum.

model_adelie <- lm(gaga_derinligi ~ gaga_uzunlugu, 
                   data = temiz_veri %>% filter(tur == "Adelie"))


model_chinstrap <- lm(gaga_derinligi ~ gaga_uzunlugu, 
                      data = temiz_veri %>% filter(tur == "Chinstrap"))


model_gentoo <- lm(gaga_derinligi ~ gaga_uzunlugu, 
                   data = temiz_veri %>% filter(tur == "Gentoo"))

summary(model_adelie)
## 
## Call:
## lm(formula = gaga_derinligi ~ gaga_uzunlugu, data = temiz_veri %>% 
##     filter(tur == "Adelie"))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.1487 -0.7926 -0.0842  0.5550  3.4990 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   11.48771    1.37010   8.385 4.23e-14 ***
## gaga_uzunlugu  0.17668    0.03521   5.018 1.51e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.129 on 144 degrees of freedom
## Multiple R-squared:  0.1489, Adjusted R-squared:  0.1429 
## F-statistic: 25.18 on 1 and 144 DF,  p-value: 1.515e-06
summary(model_chinstrap)
## 
## Call:
## lm(formula = gaga_derinligi ~ gaga_uzunlugu, data = temiz_veri %>% 
##     filter(tur == "Chinstrap"))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.65742 -0.46033 -0.01862  0.61473  1.69801 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    7.56914    1.55053   4.882 6.99e-06 ***
## gaga_uzunlugu  0.22221    0.03168   7.015 1.53e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8659 on 66 degrees of freedom
## Multiple R-squared:  0.4271, Adjusted R-squared:  0.4184 
## F-statistic: 49.21 on 1 and 66 DF,  p-value: 1.526e-09
summary(model_gentoo)
## 
## Call:
## lm(formula = gaga_derinligi ~ gaga_uzunlugu, data = temiz_veri %>% 
##     filter(tur == "Gentoo"))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.57143 -0.52974 -0.04479  0.45417  2.96109 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     5.1210     1.0583   4.839 4.02e-06 ***
## gaga_uzunlugu   0.2076     0.0222   9.352 7.34e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7491 on 117 degrees of freedom
## Multiple R-squared:  0.4277, Adjusted R-squared:  0.4229 
## F-statistic: 87.45 on 1 and 117 DF,  p-value: 7.337e-16

Yorum:Gaga uzunluğu ve gaga derinliği arasındaki ilişkiyi her penguen türü için ayrı ayrı test etmek amacıyla üç farklı basit doğrusal regresyon analizi gerçekleştirilmiştir. Analiz sonuçları, her üç tür için de gaga uzunluğu ile gaga derinliği arasında istatistiksel olarak anlamlı ve pozitif bir ilişki olduğunu ortaya koymuştur. Adelie türü için gaga uzunluğu, gaga derinliğindeki varyansın yaklaşık %15’ini açıklamıştır, F(1, 144) = 25.18, p < .001, R² = .15. Chinstrap (F(1, 66) = 49.21, p < .001, R² = .43) ve Gentoo (F(1, 117) = 87.45, p < .001, R² = .43) türleri için ise bu ilişki çok daha güçlü olup, gaga uzunluğu her iki türde de gaga derinliğindeki varyansın yaklaşık %43’ünü açıklamaktadır.

5 Görev 3: Yorumlama

Verileri gruplara bölmeden yapılan analizde gaga uzunluğu ile gaga derinliği arasında negatif ilişki bulunmasının nedeni olarak ilk önce tek bir türde bu ilişkinin gerçekten negatif olabileceğini ve bu türden analize dâhil edilen penguen sayısının çok fazla olabileceğini düşündüm. Yani yanlı örneklem hatası olabilir diye yorumladım. Daha sonra grafiği dikkatli inceleyince noktaların orta kısımda seyrek, her iki köşede ise sık dağıldığını gördüm. Bu durumda penguenlerin belli bir veya daha fazla özellik bakımından gruplar olabileceğini düşündürdü. Çizilen regresyon doğrusu grupların merkezlerini birleştirdiği için negatif bir ilişki ortaya çıkmaktadır.

Daha sonra grupları dikkate alarak yapılan regresyon analizinde her bir grup için ilişkinin pozitif olduğunu gördüm. Bu durum veri analizinde hem alt grupları dikkate alarak analiz yapmanın neden önemli olduğunu çok net bir bakış açısıyla görmemi sağladı.

Simpson paradoksunu “ veri setinin alt gruplarında gözlenen bir eğilimin gruplar birleştirildiğine zıt yönde görülmesi” şeklinde ifade edebilirim. Ele aldığımz penguen örnekleminde de bu durum net bir şekilde ortaya çıkmıştır. Buradan farklı özelliklere sahip alt gruplardan topladığım verilerde analiz yaparken çok dikkatli davranmam gerektiğini öğrenmemi sağladı. Verileri ilgili alt gruplara göre incelemek, değişkenleri net bir şekilde anlamak, yanlış korelasyonlardan kaçınmak ve gerçeklikleri görmek için oldukça önemliymiş.