Ödevin Amacı ve Kurulumu

Amaç

Bu ödevin amacı, Simpson Paradoksu keşfetmektir. Bu bağlamda, Palmer Penguins veri setini kullanarak veriyi hem toplam düzeyde hem de alt gruplar (tür bazında) incelemeye çalıştım; bu iki analiz düzeyi arasındaki farkın neden oluştuğunu tartıştım.

Kullanılacak Veri Seti - Değişken Ekleme

palmerpenguins paketinde penguins verisetini getirdim ve veri setini ön incelemelerle tanıdım.

library(openintro)
## Loading required package: airports
## Loading required package: cherryblossom
## Loading required package: usdata
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(openintro)
library(ggplot2)
library(palmerpenguins)
## 
## Attaching package: 'palmerpenguins'
## The following objects are masked from 'package:datasets':
## 
##     penguins, penguins_raw
data(penguins)
head(penguins, 3)
## # A tibble: 3 × 8
##   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
## 1 Adelie  Torgersen           39.1          18.7               181        3750
## 2 Adelie  Torgersen           39.5          17.4               186        3800
## 3 Adelie  Torgersen           40.3          18                 195        3250
## # ℹ 2 more variables: sex <fct>, year <int>
tail(penguins, 3)
## # A tibble: 3 × 8
##   species   island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##   <fct>     <fct>           <dbl>         <dbl>             <int>       <int>
## 1 Chinstrap Dream            49.6          18.2               193        3775
## 2 Chinstrap Dream            50.8          19                 210        4100
## 3 Chinstrap Dream            50.2          18.7               198        3775
## # ℹ 2 more variables: sex <fct>, year <int>

Bu veri setin Antarktika’daki üç penguen türüne ait (Adelie, Chinstrap, Gentoo) morfolojik ölçümleri içermektedir: Gaga uzunluğu (bill_length_mm), Gaga derinliği (bill_depth_mm), Yüzgeç uzunluğu (flipper_length_mm), Vücut kütlesi (body_mass_g), Tür (species), Cinsiyet (sex)

  • İşlemlere başlamadan önce değişken adlarını Türkçe yaptım.
penguenler <- 
  penguins %>%
    rename(gaga_uzunlugu = bill_length_mm,
         gaga_derinligi = bill_depth_mm,
         yuzgec_uzunlugu = flipper_length_mm,
         vucut_kutlesi = body_mass_g,
         tur = species,
         cinsiyet = sex,
         ada_adı = island,
         yıl = year)

head(penguenler, 3)
## # A tibble: 3 × 8
##   tur    ada_adı   gaga_uzunlugu gaga_derinligi yuzgec_uzunlugu vucut_kutlesi
##   <fct>  <fct>             <dbl>          <dbl>           <int>         <int>
## 1 Adelie Torgersen          39.1           18.7             181          3750
## 2 Adelie Torgersen          39.5           17.4             186          3800
## 3 Adelie Torgersen          40.3           18               195          3250
## # ℹ 2 more variables: cinsiyet <fct>, yıl <int>
  • Eksik veri sayısını değişken bazında not ettim. (colSums(is.na(penguenler))

  • Eksik verileri çıkarmadan önce (dim(penguenler) ve sonra (dim(penguenler_tam) veri seti boyutlarını ekledim.

  • Eksik verileri sildim (na.omit()) ve yeni bir veri seti olarak tanımladım. penguenler_tam <-

  • Eksik verilerin kalmadığını görmek için (colSums(is.na(penguenler_tam) şeklinde kontrol sağladım. Bu sayede fonskiyonun işlevini gerçekleştiridğini fark ederek pekiştirdim.

colSums(is.na(penguenler))
##             tur         ada_adı   gaga_uzunlugu  gaga_derinligi yuzgec_uzunlugu 
##               0               0               2               2               2 
##   vucut_kutlesi        cinsiyet             yıl 
##               2              11               0
dim(penguenler)
## [1] 344   8
penguenler_tam <-penguenler %>% 
  na.omit()

colSums(is.na(penguenler_tam))
##             tur         ada_adı   gaga_uzunlugu  gaga_derinligi yuzgec_uzunlugu 
##               0               0               0               0               0 
##   vucut_kutlesi        cinsiyet             yıl 
##               0               0               0
dim(penguenler_tam)
## [1] 333   8
  • Yeni bir değişken oluşturdum: bmi =Vücut kütlesi /Yüzgeç uzunluğu
  • bmi = Beden Kütle İndeksi
penguenler_tam <- penguenler_tam %>% 
  mutate(bmi = vucut_kutlesi / yuzgec_uzunlugu)

head(penguenler_tam, 3)
## # A tibble: 3 × 9
##   tur    ada_adı   gaga_uzunlugu gaga_derinligi yuzgec_uzunlugu vucut_kutlesi
##   <fct>  <fct>             <dbl>          <dbl>           <int>         <int>
## 1 Adelie Torgersen          39.1           18.7             181          3750
## 2 Adelie Torgersen          39.5           17.4             186          3800
## 3 Adelie Torgersen          40.3           18               195          3250
## # ℹ 3 more variables: cinsiyet <fct>, yıl <int>, bmi <dbl>
  1. Türlere göre (species) bu değişkenin:

  2. ortalamasını, standart sapmasını, minimum ve maksimum değerlerini hesaplayınız. Sonuçları bir tablo halinde gösteriniz (summarise() + group_by()). Tabloya ek olarak bir de kutu grafiği hazırlayınız. Türler arasında anlamlı fark var mı yorumlayınız.

penguenler_tam %>%
  group_by(tur) %>%
  summarise(ort_bmi = mean(bmi),
            ss_bmi = sd(bmi),
            min_bmi = min(bmi),
            max_bmi = max(bmi))
## # A tibble: 3 × 5
##   tur       ort_bmi ss_bmi min_bmi max_bmi
##   <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
penguenler_hesaplanmıs <- penguenler_tam %>%
  group_by(tur) %>%
  mutate(ort_bmi = mean(bmi),
            ss_bmi = sd(bmi),
            min_bmi = min(bmi),
            max_bmi = max(bmi))

ggplot(penguenler_tam, aes(x = tur, y = bmi, fill = tur)) +
  geom_boxplot() +
  theme_minimal() +
  labs(
    title = "Penguen Türlerine Göre BMI Dağılımı",
    x = "Tür",
    y = "Beden Kitle İndeksi (BMI)") +
  theme(legend.position = "none")

NOT: Kutucukların farklı renk olması için fill eklendi ama bu seferde sağa sanki farklı bir değişkenmiş gibi legend geldi yine bu tür bir tekrarı gidermek adına theme(legend.position = "none") kullanıldı.

Bu kutu grafiğine göre penguen türleri arasında BMI (Beden Kitle İndeksi) bakımından belirgin farklar görülmektedir. Özellikle Gentoo türünün ortalama BMI değeri diğer türlere göre daha yüksek, Chinstrap türünün ise daha düşüktür. Kutu aralıkları ve medyan çizgileri türler arasında çakışmadığından, bu farkın istatistiksel olarak da anlamlı olma olasılığı yüksektir. Kısacası, türler arasında BMI açısından anlamlı bir farklılık olduğu söylenebilir.

Görevler

Görev 1: Toplam Düzeyde Analiz

  1. Gaga uzunluğu (bill_length_mm) ile gaga derinliği (bill_depth_mm) arasındaki ilişkiyi inceledim.

  2. geom_point() kullanarak scatter plot oluşturdum.

  3. Grafiğe bir regresyon doğrusu ekleyin (geom_smooth(method="lm")).

  4. Gözlem yorumu yazdım: İlişki pozitif mi, negatif mi gördüm.

  5. Bu ilişkiyi doğrulamak için basit bir doğrusal regresyon modeli kurun: Eğim pozitif mi, negatif mi? İlişki anlamlı mı?

ggplot(penguenler_tam, aes(x = gaga_uzunlugu, y = gaga_derinligi)) +
  geom_point() +
  theme_minimal() +
  geom_smooth(method = "lm") +
  labs(
    title = "Penguenlerin gaga uzunlukları ve gaga derinlikleri arasındaki ilişki",
    x = "Gaga Uzunlukları",
    y = "Gaga Derinlikleri")
## `geom_smooth()` using formula = 'y ~ x'

Grafiğe göre penguenlerin gaga uzunluğu arttıkça gaga derinliği azalma eğilimi gösteriyor. İlişki negatif görünüyor. Kurulan basit doğrusal regresyon modeli sonucuna göre, gaga uzunluğu değişkeninin eğimi negatiftir, bu da gaga uzunluğu arttıkça gaga derinliğinin azaldığını göstermektedir.

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

  1. Veriyi türlere göre ayırdım (group_by(tur) kullandım çünkü dataCamp’ta sıklıkla kullanmıştım.

  2. Her tür için aynı scatter plot’u oluşturdum ve noktaları farklı renklerle belirledim.

  3. Tür bazında regresyon modelleri kurdum.

  4. Elde ettiğiniz sonuçları karşılaştırdım. Her bir türde eğim pozitif mi? Bu tür düzeyinde elde edilen ilişki, toplam düzeydeki ilişkiyle çelişiyor mu?

penguenler_tam %>%
  group_by(tur)
## # A tibble: 333 × 9
## # Groups:   tur [3]
##    tur    ada_adı   gaga_uzunlugu gaga_derinligi yuzgec_uzunlugu vucut_kutlesi
##    <fct>  <fct>             <dbl>          <dbl>           <int>         <int>
##  1 Adelie Torgersen          39.1           18.7             181          3750
##  2 Adelie Torgersen          39.5           17.4             186          3800
##  3 Adelie Torgersen          40.3           18               195          3250
##  4 Adelie Torgersen          36.7           19.3             193          3450
##  5 Adelie Torgersen          39.3           20.6             190          3650
##  6 Adelie Torgersen          38.9           17.8             181          3625
##  7 Adelie Torgersen          39.2           19.6             195          4675
##  8 Adelie Torgersen          41.1           17.6             182          3200
##  9 Adelie Torgersen          38.6           21.2             191          3800
## 10 Adelie Torgersen          34.6           21.1             198          4400
## # ℹ 323 more rows
## # ℹ 3 more variables: cinsiyet <fct>, yıl <int>, bmi <dbl>
ggplot(penguenler_tam, aes(x = gaga_uzunlugu, y = gaga_derinligi, color = tur)) +
  geom_point() +
  theme_minimal() +
  geom_smooth(method = "lm") +
  labs(
    title = "Penguenlerin gaga uzunlukları ve gaga derinlikleri arasındaki ilişki",
    x = "Gaga Uzunlukları",
    y = "Gaga Derinlikleri",
    color = "Tür")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(penguenler_tam, aes(x = gaga_uzunlugu, y = gaga_derinligi, color = tur, fill = cinsiyet)) +
  geom_point() +
  theme_minimal() +
  geom_smooth(method = "lm") +
  labs(
    title = "Penguenlerin gaga uzunlukları ve gaga derinlikleri arasındaki ilişki",
    x = "Gaga Uzunlukları",
    y = "Gaga Derinlikleri",
    color = "Tür",
    fill = "Cinsiyet") +
  scale_fill_discrete(labels = c("female" = "Dişi", "male" = "Erkek"))
## `geom_smooth()` using formula = 'y ~ x'

ggplot(penguenler_tam, aes(x = gaga_uzunlugu, y = bmi, color = tur)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  theme_minimal() +
  labs(title = "Türlere Göre Gaga Uzunluğu ve Beden Kütle İndeksi İlişkisi",
       x = "Gaga Uzunluğu",
       y = "Beden Kütle İnceksi",
       color = "Tür")
## `geom_smooth()` using formula = 'y ~ x'

Her bir tür (Adelie, Chinstrap, Gentoo) için ayrı ayrı oluşturulan scatter plot’larda gaga uzunluğu ile gaga derinliği arasındaki ilişkinin tür düzeyinde pozitif olduğu görülmektedir. Yani her türün kendi içinde, gaga uzunluğu arttıkça gaga derinliği de artmaktadır. Bu durum, toplam veri setinde gözlemlenen negatif ilişkiyle çelişmektedir. Tür düzeyinde analiz yapıldığında, her bir türde ilişki pozitif yönlüdür.

Cinsiyet değişkeni de modele eklendiğinde, ilişkinin yönü genellikle korunmakta, ancak eğimin büyüklüğü tür ve cinsiyete göre bir miktar değişebilmektedir. Özellikle bazı türlerde erkek penguenlerin gagalarının genel olarak daha uzun ve derin olması, modelde cinsiyetin ek açıklayıcı bir değişken olarak etkili olduğunu göstermektedir.

Bu bulgular hem tür hem de cinsiyet gibi alt grupların dikkate alınmasının veriyi doğru yorumlamak açısından kritik olduğunu ortaya koymaktadır. Aksi halde, toplam düzeyde yapılan analizler yanıltıcı veya ters yönlü sonuçlar verebilir.

Görev 3: Yorum ve Tartışma

  • Toplam veri setinde neden negatif ilişki gözlemlediniz?

  • Tür bilgisi eklendiğinde neden ilişki yön değiştirdi?

  • Bu durumu Simpson Paradoksu çerçevesinde nasıl açıklarsınız?

  • Bu örnek, verileri alt gruplara göre incelemenin neden önemli olduğunu nasıl göstermektedir?

Toplam veri setine bakıldığında gaga uzunluğu ile gaga derinliği arasında negatif bir ilişki görülmektedir; yani genel olarak gaga uzunluğu arttıkça derinlik azalıyormuş gibi görünür. Ancak tür bilgisi eklendiğinde, her bir tür kendi içinde incelendiğinde bu ilişkinin pozitif olduğu, yani gaga uzunluğu arttıkça gaga derinliğinin de arttığı gözlenir. Bu durum, Simpson Paradoksu olarak adlandırılır. Bir veri kümesinde genel düzeyde gözlemlenen ilişki yönü, alt gruplar (örneğin türler) dikkate alındığında tam tersine dönebilir. Bunun nedeni, türlerin yapısal olarak farklı ortalama değerleri (örneğin Gentoo türünün hem daha uzun hem daha sığ gagalara sahip olması) nedeniyle, türler arası farkların toplam korelasyonu yanıltıcı hale getirmesidir. Bu örnek, verileri alt gruplara göre incelemenin önemini açık biçimde gösterir. Eğer tür bilgisi dikkate alınmadan analiz yapılırsa, türler arasındaki yapısal farklar yanlış bir genel sonuca yol açabilir. Dolayısıyla, verilerde gruplar arası farklılıkları hesaba katmak, doğru yorum ve kararlar için kritik öneme sahiptir.

Öz Değerlendirme

4.Hafta Ev Çalışması: Penguins

Regresyon doğrusu eklemeyi öğrendim. Bu yüzden ilk kez R’ı ileride işime yarayacak kadar kullanabileceğime ilişkin motivasyonum arttı. DataCamp üzerinden ggplot2 ile görselleştirmeye yönelik yeni bir kursa başlamıştım orada öğrendiklerim ve derste öğrendiklerim ile görece geçen haftaya göre daha rahat ödevi tamamladım. scale_x_log10 ile x eksenindeki dereceli aralığı değiştirebildiğimi öğrendim. Ama bu ödevde kodlamadan ziyade Simpson Paradoksunun yarattığı ilizyonu fark etmek ve istatistiğin ne kadar kompleks katmanları olduğunu görmüş oldum.