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
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.
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
geom_jitter, kategorik değişkenlere ait üst üste binen noktaları birbirinden ayırmak için kullanılır. Noktaları çok küçük miktarda rastgele etrafa kaydırarak gözlemlerin görünür olmasını sağlar. Böylece veri yoğunluğu ve dağılımı daha net görünür, analiz daha kuvvetli olur.
Bu fonksiyon, ggplot2 kütüphanesinde grafiklerin görünümünü değiştirmek için birçok tema bulunur. theme_classic() yerine kullanılan bazı alternatifler şunlardır:
theme_minimal() ; Modern veri görselleştirmede en popüler olandır.
theme_bw() ; Akademik dergilerin standartlarına en yakın temalardan biridir.
theme_light() ; Diğerlerine kıyasla daha ince ve açık renkli detayları olan temadır.
theme_dark() ; Diğerlerine kıyasla daha koyu renkli bir arka plan sunar, veriyi vurgulamak için kullanılır.
ggplot(penguins_tr, aes(x = yüzgec_uzunluk, y = kilo)) +
geom_jitter(width = 0.3, height = 0.3, alpha = 0.5, color = "pink") +
geom_point(alpha = 0.5, size = 3, color = "pink") +
geom_smooth(method = "lm", se = FALSE, color = "purple") +
labs(
x = "Yüzgeç Uzunluğu (mm)",
y = "Vücut Ağırlığı (gram)",
title = "Basit Doğrusal Regresyon"
) +
theme_light() +
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'
# Veriyi yükleme
data(cars)
# Değişken isimlerini türkçeye çevirme
library(dplyr)
arabalar <- cars %>%
rename(hiz = speed, mesafe = dist)
# Fonksiyonlara bağlı grafik
library(ggplot2)
ggplot(arabalar, aes(x = hiz, y = mesafe)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "pink") +
labs(title = "Hız ve Durma Mesafesi İlişkisi",
x = "Hız (mph)",
y = "Durma Mesafesi (ft)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
# Regresyon modeli
araba_modeli <- lm(mesafe ~ hiz, data = arabalar)
# Model özeti
summary(araba_modeli)
##
## Call:
## lm(formula = mesafe ~ hiz, data = arabalar)
##
## Residuals:
## Min 1Q Median 3Q Max
## -29.069 -9.525 -2.272 9.215 43.201
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -17.5791 6.7584 -2.601 0.0123 *
## hiz 3.9324 0.4155 9.464 1.49e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438
## F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12
# Öncelikle veri setindeki değişken isimlerini türkçeleştirdim. Bağımsız değişkenim hız, bağımlı değişkenim hıza bağlı olarak değişen durma mesafesidir.
library(dplyr)
arabalar <- cars %>%
rename(hiz = speed, mesafe = dist)
# Veriler arasındaki ilişkiyi grafikleştirmek için ggplot2 kütüphanesini kullandım. geom_point() ile noktaları, geom_smooth(method = "lm") ile noktalara uygun regresyon çizgisini ekledim.
library(ggplot2)
ggplot(arabalar, aes(x = hiz, y = mesafe)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "pink") +
labs(title = "Hız ve Durma Mesafesi İlişkisi",
x = "Hız (mph)",
y = "Durma Mesafesi (ft)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
# Grafikte noktaların eğiminin yukarı doğru olması, hız arttıkça durma mesafesinin de arttığını, yani aralarında pozitif bir ilişki olduğunu kanıtlar.
# lm() fonksiyonu ile matematiksel modelimizi kurup katsayıları inceledim.
araba_modeli <- lm(mesafe ~ hiz, data = arabalar)
summary(araba_modeli)
##
## Call:
## lm(formula = mesafe ~ hiz, data = arabalar)
##
## Residuals:
## Min 1Q Median 3Q Max
## -29.069 -9.525 -2.272 9.215 43.201
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -17.5791 6.7584 -2.601 0.0123 *
## hiz 3.9324 0.4155 9.464 1.49e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438
## F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12
Eğim: Model çıktısındaki hız katsayısı, aracın hızı 1 birim arttığında durma mesafesinin ortalama 3.93 birim artacağını ifade eder.Bu artma birimine summary(araba_modeli) komutunu çalıştırdığımızda, karşımıza çıkan tablodan ulaştım.
Kesişim: Hızın sıfır olduğu noktadaki başlangıç değeridir. Matematiksel bir başlangıç noktası sunar.
R-Squared: Bu değer (yaklaşık 0.65), durma mesafesindeki değişimlerin %65’inin hız ile açıklanabildiğini gösterir. %35’lik kısım ise yol durumu veya fren kalitesi gibi diğer değişkenlere bağlıdır.
Hata Payı: Modelin tahminleri ile gerçek veriler arasında ortalama ne kadar fark olduğunu gösterir.
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'