Basit Doğrusal Regresyon

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(ggplot2)
library(palmerpenguins)
## 
## Attaching package: 'palmerpenguins'
## The following objects are masked from 'package:datasets':
## 
##     penguins, penguins_raw
data(penguins)
# Bu satır, palmerpenguins paketinde yer alan penguins veri setini aktif hâle getirir. Artık R bu veri setini tanır.
names (penguins)
## [1] "species"           "island"            "bill_length_mm"   
## [4] "bill_depth_mm"     "flipper_length_mm" "body_mass_g"      
## [7] "sex"               "year"
# veri setindeki değişken isimlerine bakalım
glimpse(penguins)
## Rows: 344
## Columns: 8
## $ species           <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…
## $ island            <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…
## $ bill_length_mm    <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …
## $ bill_depth_mm     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …
## $ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…
## $ body_mass_g       <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …
## $ sex               <fct> male, female, female, NA, female, male, female, male…
## $ year              <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…
# veri setini inceleyelim
penguins_tr <- penguins %>% 
  rename(
    tür = species,
    ada = island,
    gaga_uzunluk = bill_length_mm,
    gaga_derinlik = bill_depth_mm,
    yüzgec_uzunluk = flipper_length_mm,
    kilo = body_mass_g,
    cinsiyet = sex,
    yil = year
  )
# rename() fonksiyonu değişken isimlerini değiştirir; eşitliğin solu yeni isimdir, sağı eski isimdir.
names(penguins_tr)
## [1] "tür"            "ada"            "gaga_uzunluk"   "gaga_derinlik" 
## [5] "yüzgec_uzunluk" "kilo"           "cinsiyet"       "yil"
# değişkenlerin isimlerini değiştirdiğimiz veri setini "penguins_tr" olarak isimlendirdik ve şimdi de Türkçe isimlere bakalım

Analizde kullanacağımız iki değişkeni seçme

penguins_tr <- penguins_tr |> 
  select(kilo, yüzgec_uzunluk) |> 
  na.omit()

Bu satırlar şunları yapar:

• select(kilo, yüzgec_uzunluk) bu kod kilo ve yüzgeç uzunluğu değişkenlerini seçer.

• na.omit() Eksik veri içeren satırları çıkarır çünkü regresyon analizi eksik veri ile çalışamaz.

ggplot(penguins_tr, aes(x = yüzgec_uzunluk, y = kilo)) +
  geom_point() +
  labs(x = "Yüzgeç Uzunluğu (mm)",
       y = "Vücut Ağırlığı (gram)",
       title = "Yüzgeç Uzunluğu ile Vücut Ağırlığı İlişkisi")

Bu grafikte;

• her bir nokta bir pengueni temsil eder

• yatay eksen: yüzgeç uzunluğu

• dikey eksen: kilo

Yüzgeç uzunluğu arttıkça, penguenlerin kilosu da artıyor mu?

Bu grafik doğrusal bir ilişki olup olmadığını görmemizi sağlar.

Regresyon modeli kurma

peng_mod <- lm(kilo ~ yüzgec_uzunluk, data = penguins_tr)
summary(peng_mod)
## 
## Call:
## lm(formula = kilo ~ yüzgec_uzunluk, data = penguins_tr)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1058.80  -259.27   -26.88   247.33  1288.69 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -5780.831    305.815  -18.90   <2e-16 ***
## yüzgec_uzunluk    49.686      1.518   32.72   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 394.3 on 340 degrees of freedom
## Multiple R-squared:  0.759,  Adjusted R-squared:  0.7583 
## F-statistic:  1071 on 1 and 340 DF,  p-value: < 2.2e-16

🔹 Eğim (slope): yüzgec_uzunluk katsayısı

Bu değer:

Yüzgeç uzunluğu 1 mm arttığında, penguenin beklenen kilosu kaç gram artar?

Pozitif ise ilişki pozitif demektir.

🔹 Kesişim (intercept)

Bu değer:

Yüzgeç uzunluğu 0 mm olsaydı beklenen kilo ne olurdu?

Gerçekte 0 mm yüzgeç olmaz ama bu matematiksel bir başlangıç noktasıdır.

🔹 Residual Standard Error (Artık Standart Hatası)

Bu değer:

Modelin tahmin ettiği değer ile penguenin gerçek kilosu arasında, ortalama kaç gram fark var? Yani tahmin hatasının büyüklüğünü ölçer.

🔹 R-squared

Bu değer:

Kilodaki değişimin yüzde kaçı yüzgeç uzunluğu ile açıklanıyor?

Örneğin:

• R² = 0.50 → değişimin %50’si açıklanıyor • R² = 0.10 → değişimin %10’u açıklanıyor

coef(peng_mod)
##    (Intercept) yüzgec_uzunluk 
##    -5780.83136       49.68557

Bu kod:

• b0 (kesişim)

• b1 (eğim)

değerlerini verir.

Bunlar regresyon denklemine yerleşir.

ggplot(penguins_tr, aes(x = yüzgec_uzunluk, y = kilo)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(x = "Yüzgeç Uzunluğu (mm)",
       y = "Vücut Ağırlığı (gram)",
       title = "Basit Doğrusal Regresyon Çizgisi")
## `geom_smooth()` using formula = 'y ~ x'

new_peng <- data.frame(yüzgec_uzunluk = 200)
predict(peng_mod, newdata = new_peng)
##        1 
## 4156.282

Modelimizi, orijinal veri setinde olmayan (“örneklem dışı”) yeni gözlemler için tahminler yapmak amacıyla kullanabiliriz. Bunun için predict() fonksiyonuna tahmin yapılacak yeni veriyi newdata argümanıyla bir veri seti olarak iletmeliyiz. Bu yeni veri seti, modelde kullanılan bağımsız değişkenle aynı isme sahip bir sütun içermelidir.

Yukarıdaki satır yüzgeç uzunluğu 200 mm olan bir penguenin beklenen kilosunu hesaplar.

Bu bir ortalama tahmindir tek tek bireyleri değil, beklenen değeri verir.

Ödevler

  1. aşağıdaki geom_jitter fonksiyonunun kullanım amacını araştırın.
  2. theme_classic fonksiyonunun alternatiflerini bulun ve deneyin.
  3. bu ders notlarında yer alan palmerpenguins’teki penguins veri seti gibi bir veri üzerinde (örn. midiPISA) regresyon denklemi kurun ve tüm kodları kendi veri setinize uygulayarak çalıştırın.
  4. Kendi seçtiğiniz veri seti üzerinde regresyon modeli kurma, saçılım diyagramı oluşturma, grafiğe regresyon çizgisi ekleme, eğim, kesişim ve R-squared katsayılarını yorumlama gibi tüm adımları yapın ve açıklamalarını yazın.
ggplot(penguins_tr, aes(x = yüzgec_uzunluk, y = kilo)) +
  geom_jitter(width = 0.3, height = 0.3, alpha = 0.5, color = "steelblue") +
  geom_point(alpha = 0.5, size = 3, color = "steelblue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(
    x = "Yüzgeç Uzunluğu (mm)",
    y = "Vücut Ağırlığı (gram)",
    title = "Basit Doğrusal Regresyon"
  ) +
  theme_classic() +
  theme(
    plot.title = element_text(size = 20, face = "bold"),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 12)
  )
## `geom_smooth()` using formula = 'y ~ x'

1.geom jitter Fonksiyonunun Kullanım Amacı geom_jitter, verilerin çakışmasını (overplotting) önlemek için her bir veri noktasına çok küçük miktarda rastgele “gürültü” ekleyen bir fonksiyondur. Neden Kullanılır? Özellikle veri noktaları çok sıkışık olduğunda veya değişkenler ayrık (discrete) değerler aldığında, noktalar üst üste binerek tek bir noktaymış gibi görünebilir. geom_jitter bu noktaları hafifçe dağıtarak yoğunluğun nerede olduğunu görmemizi sağlar. 2.2. theme_classic Alternatifleri theme_classic() grafiğe temiz, eksen çizgileri olan beyaz bir arka plan sağlar. Deneyebileceğiniz diğer popüler temalar: theme_minimal(): Çok sade, eksen çizgileri olmayan bir arka plan. theme_bw(): Siyah beyaz bir çerçeve içine alır. theme_light(): İnce gri ızgara çizgileri kullanır. theme_dark(): Koyu renkli bir arka plan sağlar.

library(dplyr)
library(ggplot2)
library(palmerpenguins)
library(palmerpenguins)
penguins_tr<-penguins
ggplot(penguins_tr, aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_jitter(alpha = 0.5, color = "steelblue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "Tema Denemesi", x = "Yüzgeç Uzunluğu", y = "Kilo") +
  theme_light()
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

3.SORU:

data(swiss)
head(swiss)
##              Fertility Agriculture Examination Education Catholic
## Courtelary        80.2        17.0          15        12     9.96
## Delemont          83.1        45.1           6         9    84.84
## Franches-Mnt      92.5        39.7           5         5    93.40
## Moutier           85.8        36.5          12         7    33.77
## Neuveville        76.9        43.5          17        15     5.16
## Porrentruy        76.1        35.3           9         7    90.57
##              Infant.Mortality
## Courtelary               22.2
## Delemont                 22.2
## Franches-Mnt             20.2
## Moutier                  20.3
## Neuveville               20.6
## Porrentruy               26.6

Değişkenler: Fertility: Doğurganlık oranı Education: Eğitim seviyesi (%) Examination: Eğitim sınav başarısı (%) Agriculture:Tarımla uğraşan nüfus (%)

Eğitim düzeyi;başka bir toplumsal değişkeni etkiliyor. Regresyon Modelinin Kurulması Amacı; Eğitim düzeyinin (Education),doğurganlık(Fertility)üzerindeki etkisini incelemek.

model_swiss <- lm(Fertility ~ Education, data = swiss)
summary(model_swiss)
## 
## Call:
## lm(formula = Fertility ~ Education, data = swiss)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -17.036  -6.711  -1.011   9.526  19.689 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  79.6101     2.1041  37.836  < 2e-16 ***
## Education    -0.8624     0.1448  -5.954 3.66e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.446 on 45 degrees of freedom
## Multiple R-squared:  0.4406, Adjusted R-squared:  0.4282 
## F-statistic: 35.45 on 1 and 45 DF,  p-value: 3.659e-07

Kesişim(intercept):79.6101 Eğim(Education):-0.8624 Denklem: Fertility=79.6101-(0.8624*Education)

KATSAYILARIN YORUMLANMASI: Eğim (-0.8624): Eğitim seviyesindeki her 1 birimlik artış, doğurganlık oranında yaklaşık 0.86 birimlik bir azalmaya neden olmaktadır. Bu, eğitim ile doğurganlık arasında negatif (ters) bir ilişki olduğunu gösterir. Kesişim (79.6101): Eğer bir bölgede eğitim seviyesi 0 olsaydı, beklenen doğurganlık oranı yaklaşık 79.61 olurdu. MODEL BAŞARISI (R-squared): Ekranın alt kısmında Multiple R-squared: 0.4406 değerini görüyoruz. Yorum: Bu model, doğurganlıktaki değişimin yaklaşık %44’ünü eğitim seviyesi ile açıklayabilmektedir. Sosyal bilimler için bu oldukça anlamlı bir değerdir. ANLAMLILIK (p-value): Education satırının en sağındaki değer (3.66e-07) ve yanındaki üç yıldız (*), bu ilişkinin istatistiksel olarak çok anlamlı olduğunu gösterir. EĞİM:-0.86(Eğim arttıkça doğurganlık düşüyor,negatif ilişki) KESİŞİM:79.61 R-SQUARED:0.44 (Modelimiz verideki değişimin %44’ünü açıklayabilmektedir)

library(ggplot2)

ggplot(swiss, aes(x = Education, y = Fertility)) +
  geom_point(color = "steelblue", size = 2) +          
  geom_smooth(method = "lm", color = "red", se = FALSE) + 
  theme_light() +                                     
  labs(title = "Eğitim ve Doğurganlık Arasındaki Regresyon",
       x = "Eğitim Seviyesi",
       y = "Doğurganlık Oranı")
## `geom_smooth()` using formula = 'y ~ x'