library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
Netflix <- read_excel("Netflix.xlsx")
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## 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)
## Warning: package 'ggplot2' was built under R version 4.4.3
#Başta regresyon eğrisi doğrusal kondu fakat LOESS çizgisi kullandığımızda sağlamadı. Veri çok dağınık, dolayısıyla polinom eğrisi işe yaradı
ggplot(data = Netflix, aes(x = Year, y = `IMDb Rating`)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", formula = y ~ poly(x, 2), color = "red", fill = "pink") +
labs(title = "Yıllara Gore IMDb Puanı Değişimi",
subtitle = "Spearman Korelasyonu: -0.59",
x = "Yapım Yılı",
y = "IMDb Puanı") +
theme_minimal()
Yorum: Yapım yılı artıkça İMBD puanlarının düştüğünü görüyoruz. Ne derler, ne varsa eskilerde var. Eski yıllarda az gözlem sayısı var fakat paunları oldukça yüksek. İki değişken arasında negatif doğrusal olmayan orta düzey bir ilişki vardır. Spearmanla hesaplayalım ilişki doğrusal olmadığı ve uç değerler için r= -.59; p < 0.01
test <- cor.test(Netflix$Year, Netflix$`IMDb Rating`, method = "spearman")
## Warning in cor.test.default(Netflix$Year, Netflix$`IMDb Rating`, method =
## "spearman"): Cannot compute exact p-value with ties
print(test)
##
## Spearman's rank correlation rho
##
## data: Netflix$Year and Netflix$`IMDb Rating`
## S = 33154, p-value = 5.946e-06
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## -0.592006
model <- lm(`IMDb Rating` ~ Year, data = Netflix)
summary(model)
##
## Call:
## lm(formula = `IMDb Rating` ~ Year, data = Netflix)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.7960 -0.3446 -0.0174 0.3530 0.8807
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 37.780219 7.903653 4.780 1.7e-05 ***
## Year -0.014725 0.003942 -3.735 0.000498 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4423 on 48 degrees of freedom
## Multiple R-squared: 0.2252, Adjusted R-squared: 0.209
## F-statistic: 13.95 on 1 and 48 DF, p-value: 0.0004985
Yorum: evet model iyi çalışmadı açıklama varsaysı düşük R-squared: 0.209 ve anlamlı.
model_poly <- lm(`IMDb Rating` ~ poly(Year, 2), data = Netflix)
summary(model_poly)
##
## Call:
## lm(formula = `IMDb Rating` ~ poly(Year, 2), data = Netflix)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.99525 -0.21813 0.01884 0.25393 0.73175
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.26200 0.05708 144.733 < 2e-16 ***
## poly(Year, 2)1 -1.65185 0.40365 -4.092 0.000166 ***
## poly(Year, 2)2 -1.31583 0.40365 -3.260 0.002076 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4036 on 47 degrees of freedom
## Multiple R-squared: 0.3681, Adjusted R-squared: 0.3412
## F-statistic: 13.69 on 2 and 47 DF, p-value: 2.07e-05
Günlüğe Yorum: Biraz arttı. Yıl değişkeni imdb puanının yüzde 37 sini açıkladı iyi gibi. R-squared: 0.3681 ve anlamlı
library(broom)
## Warning: package 'broom' was built under R version 4.4.3
augment(model, data = Netflix)
## # A tibble: 50 × 12
## Name Year `Age Rating` Duration Category `IMDb Rating` .fitted .resid
## <chr> <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 Casablanca 1942 PG 102 mins Drama/R… 8.5 9.18 -0.685
## 2 Psycho 1960 R 109 mins Horror/… 8.5 8.92 -0.420
## 3 The Godfa… 1972 R 175 mins Crime/D… 9.2 8.74 0.457
## 4 Star Wars… 1977 PG 121 mins Action/… 8.6 8.67 -0.0696
## 5 E.T. the … 1982 PG 115 mins Family/… 7.8 8.60 -0.796
## 6 Terminato… 1991 R 137 mins Action/… 8.5 8.46 0.0366
## 7 Forrest G… 1994 PG-13 142 mins Drama/R… 8.8 8.42 0.381
## 8 Titanic 1997 PG-13 195 mins Drama/R… 7.8 8.38 -0.575
## 9 The Matrix 1999 R 136 mins Action/… 8.7 8.35 0.354
## 10 Gladiator 2000 R 155 mins Action/… 8.5 8.33 0.169
## # ℹ 40 more rows
## # ℹ 4 more variables: .hat <dbl>, .sigma <dbl>, .cooksd <dbl>, .std.resid <dbl>
augment(model_poly, Netflix) %>%
ggplot(aes(x = .fitted, y = .resid)) +
geom_point() + geom_hline(yintercept = 0)
Veriler çizginin etrafında hetorejen dağılmış durumda. sağ alttakı üç değeri bulalım
Netflix %>%
mutate(tahmin = predict(model_poly),
hata = resid(model_poly)) %>%
arrange(hata) %>% # En kucuk (en negatif) hatayi en basa al
head(1)
## # A tibble: 1 × 8
## Name Year `Age Rating` Duration Category `IMDb Rating` tahmin hata
## <chr> <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 E.T. the Ext… 1982 PG 115 mins Family/… 7.8 8.80 -0.995
# Nota ekle: Modelin genel performans karnesi (R-kare ve Sigma)
glance(model_poly)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.368 0.341 0.404 13.7 0.0000207 2 -24.0 56.1 63.7
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
# Gerekli kutuphaneler
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'tidyr' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'forcats' was built under R version 4.4.3
## Warning: package 'lubridate' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.4 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ✔ readr 2.1.5
## ── 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
# Bu veri seti: High School and Beyond (HSB) anketidir. Amerika'daki liselerden toplanmış, özel okul/devlet okulu, sosyoekonomik düzey ve akademik başarı verilerini içerir.
url <- "https://stats.idre.ucla.edu/stat/data/hsb2.csv"
hsb_data <- read.csv(url)
# 2. Degisken isimlerini ve Kategorik verileri Turkceye cevirelim
egitim_verisi <- hsb_data %>%
transmute(
Ogrenci_ID = id,
Cinsiyet = factor(female, levels = c(0, 1), labels = c("Erkek", "Kadin")),
Irk = factor(race, levels = c(1, 2, 3, 4), labels = c("Hispanik", "Asyali", "Siyahi", "Beyaz")),
Sosyoekonomik_Duzey = factor(ses, levels = c(1, 2, 3), labels = c("Dusuk", "Orta", "Yuksek")),
Okul_Turu = factor(schtyp, levels = c(1, 2), labels = c("Devlet", "Ozel")),
Program_Turu = factor(prog, levels = c(1, 2, 3), labels = c("Genel", "Akademik", "Meslek")),
Okuma_Puani = read,
Yazma_Puani = write,
Matematik_Puani = math,
Bilim_Puani = science,
Sosyal_Bilgiler_Puani = socst
)
# 3. Verinin ilk 10 satirini gorelim
head(egitim_verisi, 10)
## Ogrenci_ID Cinsiyet Irk Sosyoekonomik_Duzey Okul_Turu Program_Turu
## 1 70 Erkek Beyaz Dusuk Devlet Genel
## 2 121 Kadin Beyaz Orta Devlet Meslek
## 3 86 Erkek Beyaz Yuksek Devlet Genel
## 4 141 Erkek Beyaz Yuksek Devlet Meslek
## 5 172 Erkek Beyaz Orta Devlet Akademik
## 6 113 Erkek Beyaz Orta Devlet Akademik
## 7 50 Erkek Siyahi Orta Devlet Genel
## 8 11 Erkek Hispanik Orta Devlet Akademik
## 9 84 Erkek Beyaz Orta Devlet Genel
## 10 48 Erkek Siyahi Orta Devlet Akademik
## Okuma_Puani Yazma_Puani Matematik_Puani Bilim_Puani Sosyal_Bilgiler_Puani
## 1 57 52 41 47 57
## 2 68 59 53 63 61
## 3 44 33 54 58 31
## 4 63 44 47 53 56
## 5 47 52 57 53 61
## 6 44 52 51 63 61
## 7 50 59 42 53 61
## 8 34 46 45 39 36
## 9 63 57 54 58 51
## 10 57 55 52 50 51
# 4. Veri yapisini kontrol edelim
glimpse(egitim_verisi)
## Rows: 200
## Columns: 11
## $ Ogrenci_ID <int> 70, 121, 86, 141, 172, 113, 50, 11, 84, 48, 75, …
## $ Cinsiyet <fct> Erkek, Kadin, Erkek, Erkek, Erkek, Erkek, Erkek,…
## $ Irk <fct> Beyaz, Beyaz, Beyaz, Beyaz, Beyaz, Beyaz, Siyahi…
## $ Sosyoekonomik_Duzey <fct> Dusuk, Orta, Yuksek, Yuksek, Orta, Orta, Orta, O…
## $ Okul_Turu <fct> Devlet, Devlet, Devlet, Devlet, Devlet, Devlet, …
## $ Program_Turu <fct> Genel, Meslek, Genel, Meslek, Akademik, Akademik…
## $ Okuma_Puani <int> 57, 68, 44, 63, 47, 44, 50, 34, 63, 57, 60, 57, …
## $ Yazma_Puani <int> 52, 59, 33, 44, 52, 52, 59, 46, 57, 55, 46, 65, …
## $ Matematik_Puani <int> 41, 53, 54, 47, 57, 51, 42, 45, 54, 52, 51, 51, …
## $ Bilim_Puani <int> 47, 63, 58, 53, 53, 63, 53, 39, 58, 50, 53, 63, …
## $ Sosyal_Bilgiler_Puani <int> 57, 61, 31, 56, 61, 61, 61, 36, 51, 51, 61, 61, …
# Model Kurulumu:
# Bagimli Degisken: Yazma_Puani
# Bagimsiz Degiskenler: Okuma_Puani (Surekli), Okul_Turu (Kategorik), Sosyoekonomik_Duzey (Kategorik)
model <- lm(Yazma_Puani ~ Okuma_Puani + Okul_Turu + Sosyoekonomik_Duzey, data = egitim_verisi)
# Ozet Sonuclari Goster
summary(model)
##
## Call:
## lm(formula = Yazma_Puani ~ Okuma_Puani + Okul_Turu + Sosyoekonomik_Duzey,
## data = egitim_verisi)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.6667 -5.0662 0.7082 5.9778 14.9625
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 24.64913 2.88868 8.533 3.97e-15 ***
## Okuma_Puani 0.53608 0.05528 9.698 < 2e-16 ***
## Okul_TuruOzel 2.06587 1.49689 1.380 0.169
## Sosyoekonomik_DuzeyOrta -0.78629 1.39056 -0.565 0.572
## Sosyoekonomik_DuzeyYuksek 0.58450 1.57616 0.371 0.711
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.626 on 195 degrees of freedom
## Multiple R-squared: 0.3657, Adjusted R-squared: 0.3527
## F-statistic: 28.11 on 4 and 195 DF, p-value: < 2.2e-16
(değişken sayısı arttığı için) Uyarlanmış R kare değerine bakarız. 0.35 geldi ve anlamlı. Bir öğrencinin okuma puanı 1 puan arttığında, yazma puanı ortalama 0.53 puan artıyor.
Evet, yordamaktadır. (Çünkü F testi anlamlı çıktı). Bu değişkenler seti, yazma başarısındaki varyansın %35’ünü açıklamaktadır.
ggplot(egitim_verisi, aes(x = Okuma_Puani, y = Yazma_Puani, color = Okul_Turu, fill = Okul_Turu)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", fullrange = TRUE) +
labs(title = "Okuma Becerisinin Yazma Puanına Etkisi",
subtitle = "Okul türleri arasında anlamlı bir makas farkı var mı?",
x = "Okuma Puanı",
y = "Yazma Puanı",
color = "Okul Turu",
fill = "Okul Turu") +
theme_minimal() +
scale_color_brewer(palette = "Set1")
## `geom_smooth()` using formula = 'y ~ x'
Grafik, okul türünün başarısı üzerinde bir “makas etkisi” olduğunu göstermektedir:
Okuma seviyesi düşükken özel okullar daha başarılıdır (yazma puanları daha yüksektir). Okuma seviyesi arttıkça devlet okulu öğrencilerinin yazma puanları çok daha hızlı (dik bir eğimle) artmaktadır. Yüksek okuma becerisine sahip öğrencilerde, devlet okulları özel okullarla arasındaki farkı kapatmakta, hatta yakalamaktadır.