Bu haftaki dersimizde betimleyici istatistikler ve veri görselleştirme çalışmaları yaptık. Verileri grafikle raporlaştırmak anlatımımızı zenginleştirebilir.Ayrıca anlaşırlığını da artıracağını düşünüyorum.

Betimleyici İstatistikler

İstatistik çalışabilmemiz için midiPISA veri setini yüklememiz ve dplyr paketini aktifleştirmemiz gerekiyor.

load("D:/OLC_731/Rders/import/midiPISA.rda")
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

Minimum ve Maximum Değerler

min() ve max() fonksiyonlarıyla veri setimizde yer alan maximum ve minumun değerleri bulabiliriz.

min(midiPISA$ODOKUMA1) # minimum değer hesaplama
## [1] 175.608
max(midiPISA$ODOKUMA1) # maksimum değer hesaplama
## [1] 771.508

Veri setimizdeki en küçük değer 175.608 iken en büyük değer 771.508’dir.

Bu yaptığımızı range() fonksiyonu ile de yapabiliriz. range() fonksiyonu sırasıyla en küçük ve en büyük değerleri bulmamızı sağlar. Buna veri setinden eleman seçme operatörü de ekleyerek aşağıdaki şekilde yapabiliriz.

min<-range(midiPISA$ODOKUMA1)[1] #minimum değer hesaplama
min
## [1] 175.608
max<-range(midiPISA$ODOKUMA1)[2] #maksimum değer hesaplama
max
## [1] 771.508

Ortalama

Veri setindeki ortalamayı mean() fonksiyonuyla hesaplayabiliriz.

mean(midiPISA$ODOKUMA1) # ortalama hesaplama
## [1] 464.2299

Veri setimizdeki kayıp veri NA olacağından bu değerleri ortalamaya dahil etmek istemeyiz. Bunun için na.rm_TRUE argümanını kullanabiliriz.

mean(midiPISA$ODOKUMA1,na.rm=TRUE) # kayıp değerler hariç ortalama hesaplama
## [1] 464.2299

ODOKUMA1 verilerinde kayıp veri olmadığı için her iki ortalama aynı çıkmıştır.

Medyan (Ortanca)

Veri setindeki medyanı( ortancayı) median() fonksiyonuyla hesaplayabiliriz.

median(midiPISA$ODOKUMA1) # medyan hesaplama
## [1] 463.403

Bu değeri -quantile() fonksiyonu ile de hesaplayabiliriz.

quantile(midiPISA$ODOKUMA1,0.5) # medyan hesaplama
##     50% 
## 463.403

Çeyreklikler

Birinci ve üçüncü çeyrekler de quantile() fonksiyonuyla aşağıdaki gibi hesaplanabilir.

quantile(midiPISA$ODOKUMA1,0.25) # I. çeyrekler hesaplama
##      25% 
## 402.5635
quantile(midiPISA$ODOKUMA1,0.75) # III. çeyrekler hesaplama
##      75% 
## 525.7188

Standart Sapma ve Varyans

Standart sapma ve varyansı sırasıyla sd() ve var()fonksiyonlarıyla hesaplayabiliriz.

sd(midiPISA$ODOKUMA1) # standart sapma hesaplama
## [1] 87.78006
var(midiPISA$ODOKUMA1) # varyans hesaplama
## [1] 7705.339

Eğer veri setimizdeki değerlerin bir kısmının standart sapmasını hesaplamak istersek

lapply() fonksiyonunu kullanabiliriz.

midiPISA %>% 
# "O_" başlayan ve "OD" içeren değişkenlerin seçimi
  select(starts_with("OD") & contains("MA")) %>% 
  lapply(.,sd) # her bir değişkenin standart sapmasının hesaplanması
## $ODOKUMA1
## [1] 87.78006
## 
## $ODOKUMA2
## [1] 87.696
## 
## $ODOKUMA3
## [1] 87.07692
## 
## $ODOKUMA4
## [1] 87.40305
## 
## $ODOKUMA5
## [1] 87.21323

summarise() fonksiyonuyla betimleyici istatisleri özet olarak elde edebiliriz.

summary(midiPISA$ODOKUMA1) # betimleyici istatistiklerin özeti
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   175.6   402.6   463.4   464.2   525.7   771.5

Eğer bu değerleri guruplara göre bulmak istersek by() fonksiyonunu kullanabiliriz.

by() çalıştırdığımda hata aldım. y değişkenin karakter yapısıyla ilgili problem çıkınca aşağıdaki kodu ChatGPT yardımıyla kullanınca sorun çözüldü.

library(haven)

# `midiPISA$CINSIYET` değişkenini faktöre çevirme
midiPISA$CINSIYET <- as_factor(midiPISA$CINSIYET)
# gruplara göre betimleyici istatistiklerin özeti
by(midiPISA$ODOKUMA1, midiPISA$CINSIYET, summary) 
## midiPISA$CINSIYET: Kiz
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   236.4   418.2   477.6   478.1   536.9   771.5 
## ------------------------------------------------------------ 
## midiPISA$CINSIYET: Erkek
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   175.6   387.5   448.0   450.7   512.2   747.5

Değişkenlik Katsayısı

Standart sapmanın ortalamaya oranı olarak hesaplanabilen değişkenlik katsayısı stats() fonksiyonuyla hesaplanabilir.

library(pastecs) # paketin aktifleştirilmesi
## 
## Attaching package: 'pastecs'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
round(stat.desc(midiPISA %>% 
  select(CINSIYET,OKUMA_ZEVK)),2)  # değişkenlik katsayısının hesaplanması
##          CINSIYET OKUMA_ZEVK
## nbr.val        NA    6821.00
## nbr.null       NA       0.00
## nbr.na         NA      69.00
## min            NA      -2.73
## max            NA       2.66
## range          NA       5.39
## sum            NA    4659.70
## median         NA       0.64
## mean           NA       0.68
## SE.mean        NA       0.01
## CI.mean        NA       0.02
## var            NA       0.95
## std.dev        NA       0.98
## coef.var       NA       1.43

Bir değişkenin modunu bulmak için table() ve sort() fonksiyonları kullanılabilir.

tab <- table(midiPISA$Anne_Egitim) # her benzersiz değer için oluşum sayısı
tab
## 
##    0    1    2    3    4    5    6 
##  695 1882 1362  575  675  759  887
sort(tab, decreasing = TRUE) # en yüksekten en düşüğe doğru sıralama
## 
##    1    2    6    5    0    4    3 
## 1882 1362  887  759  695  675  575

table fonksiyonu ile her bir farklı oluşum için frekans değeri hesaplandıktan sonra sort ile değerler büyükten küçüğe hesaplanır.

group by() ve count() fonksiyonlarını kullanarak gruplara göre gözlem sayıları hesaplanabilir.

midiPISA %>%
  group_by(Anne_Egitim) %>% # Anne_Egitim e göre gruplandırma
  count() %>%  # frekans tablosu oluşturma
  ungroup() # gruplandırmanın kaldırılması
## # A tibble: 8 × 2
##   Anne_Egitim          n
##   <dbl+lbl>        <int>
## 1  0 [Okul oncesi]   695
## 2  1 [Ilkokul]      1882
## 3  2 [Ortaokul]     1362
## 4  3 [Lise]          575
## 5  4 [Onlisans]      675
## 6  5 [Lisans]        759
## 7  6 [Lisans ustu]   887
## 8 NA                  55

Örneklemin standart sapmasını hesaplamak istediğimizde summarise() fonksiyonunu kullanabiliriz.

midiPISA %>%
  summarise(ort = mean(ODOKUMA1), # ortalama
            sd = sd(ODOKUMA1),    # standart sapma 
            n = n())              # frekans hesaplama
## # A tibble: 1 × 3
##     ort    sd     n
##   <dbl> <dbl> <int>
## 1  464.  87.8  6890

Veri Görselleştirme

Veri görselleştirme için en sık kullanılan paket ggplot2 dur. Bundan önce PISA verisini R a yüklemem gerekiyor.

load("D:/OLC_731/Rders/import/PISA_OGR_2018.rda")
# install.packages("tidyverse", repos="https://cran.rstudio.com") # paketin yüklenmesi
library("tidyverse") # paketin aktifleştirilmesi
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.1     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::extract() masks pastecs::extract()
## ✖ dplyr::filter()  masks stats::filter()
## ✖ pastecs::first() masks dplyr::first()
## ✖ dplyr::lag()     masks stats::lag()
## ✖ pastecs::last()  masks dplyr::last()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)
library(magrittr)
## 
## Attaching package: 'magrittr'
## The following object is masked from 'package:purrr':
## 
##     set_names
## The following object is masked from 'package:tidyr':
## 
##     extract
## The following object is masked from 'package:pastecs':
## 
##     extract
library(haven)
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
load("D:/OLC_731/Rders/import/midiPISA.rda")
miniPISA <- PISA_OGR_2018 %>%
select(CINSIYET, SINIF,KITAPSAYISI, SES, Anne_Egitim, Baba_Egitim,Okuloncesi_yil,OKUL_TUR,OKUMA_ZEVK,
       OK_YETERLIK,ODOKUMA1) 
# kategorik değişkenlerin faktör olarak kaydı
miniPISA<- miniPISA %>% mutate_if(is.labelled, sjlabelled::as_factor)
# Faktör değiskenlere düzey atama amacıyla yazılan fonksiyon
levelsnames <- function(x){
  levels(x) <- names(attr(x,"labels"))
  x
}
# yazılan fonksiyonun faktör değişkenlere uygulanması
miniPISA <-mutate_if(miniPISA,is.factor, levelsnames)
head(miniPISA)
## # A tibble: 6 × 11
##   CINSIYET SINIF    KITAPSAYISI      SES Anne_Egitim Baba_Egitim Okuloncesi_yil
##   <fct>    <fct>    <fct>          <dbl> <fct>       <fct>       <fct>         
## 1 Erkek    SINIF 10 11-25 kitap  -2.45   Ortaokul    Ortaokul    2 yildan az   
## 2 Erkek    SINIF 10 26-100 kitap -2.10   Ortaokul    Ortaokul    2 yildan az   
## 3 Kiz      SINIF 10 0-10 kitap   -2.27   Ilkokul     Ortaokul    2 yildan az   
## 4 Erkek    SINIF 9  0-10 kitap    0.0324 Lisans ustu Lisans ustu 2 yildan az   
## 5 Erkek    SINIF 9  11-25 kitap  -0.0674 Onlisans    Onlisans    <NA>          
## 6 Erkek    SINIF 10 11-25 kitap   0.398  Onlisans    Lisans ustu <NA>          
## # ℹ 4 more variables: OKUL_TUR <fct>, OKUMA_ZEVK <dbl>, OK_YETERLIK <dbl>,
## #   ODOKUMA1 <dbl>

Bu veri setindeki sınıf düzeyi, okul türü, cinsiyet, anne eğitim düzeyi, baba eğitim düzeyi birer kategorik değişkendir.

Birden çok değişkeni aynı grafik üzerinde göstermek ve aralarındaki çok düzeyli ilişkileri belirlemek için ggplot2 paketinden yararlanabiliriz. Bu paketi yükleyelim.

install.packages("ggplot2")  # ggplot2 paketini yükle
## Warning: package 'ggplot2' is in use and will not be installed
library(ggplot2)             # ggplot2 paketini aktifleştir

Yoğunluk Grafiği

Şimdi veri setimizdeki okuma puanlarını geom_densityfonksiyonu yardımıyla yoğunluk grafiğini çizelim.

ggplot(miniPISA, aes(x=ODOKUMA1))+
  geom_density(linetype="dashed", fill="blue")

Burada linetypeiçin 7 farklı seçeneğimiz var. İstediğimiz şekilde etrafındaki çizgileri değiştirebiliriz. Aynı şekilde renk argümanını değiştirerek farklı renkte grafikler elde edebilriiz.

Histogram

Sürekli değişkenlerin frekans dağılımlarını belirlemek için histogram kullanırız.

grafik_1 <- ggplot(miniPISA, aes(x=ODOKUMA1)) #ilk katmanın oluşturulması
grafik_1 # oluşturulan nesnenin kaydedilmesi

grafik_1 + geom_histogram() # histogram çizilmesi
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

x ekseninde okuma puanları, y ekseninde ise frekans değerleri yer alıyor.

Cinsiyete göre okuma puanlarının histogramı facet_wrap() fonksiyonu kullanılarak aşağıdaki gibi çizilebilir.

grafik_1 +
  geom_histogram()  +       
  facet_wrap(~CINSIYET, ncol=2) # cinsiyet değişkenindeki faktörlerin sütunda yer alması
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Yüzeyde kategorik değişkenlerin düzeylerini görebilmek için faktör değişken olarak tanımlamak gerekir.

library(haven)
miniPISA <- 
  miniPISA %>% 
  mutate_if(is.labelled, funs(as_factor(.)))
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
## 
## # Simple named list: list(mean = mean, median = median)
## 
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
## 
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Tek bir değişkenin her bir düzeyinin yüzeyleri sütunda oluşturmak istersek aşağıdaki kodu kullanabiliriz.

ggplot(miniPISA,aes(x=ODOKUMA1))+
  geom_histogram()+ #histogram çizilmesi
  facet_grid(.~CINSIYET) # yüzeylerin sütunda oluşturulması
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Gruplama Değişkenleri

Eğer cinsiyet değişkenini grup olarak belirlersek color() argümanıyla grafikler çizilebilir.

p1 <- ggplot(
      miniPISA %>% 
      group_by(SINIF,CINSIYET) %>% 
      mutate(ort=mean(ODOKUMA1)) %>%  # ortalama puanların sütun olarak ekleme
        ungroup(), # gruplamanın iptal edilmesi
     aes(x=SINIF, y=ort, color=CINSIYET )) + # cinsiyete göre sınıf düzeyinde ortalamaların verilmesi
  geom_point() +  #saçılım grafiği oluşturma
  xlab("Sınıf Duzeyı")+ # x eksenine etiket verilmesi
  ylab("Ortalama Puan") #y eksenine etiket verilmesi

p1 # nesnenin kaydedilmesi

Grup Nesnesi

Grafikleri daha sonra kullanmak istediğimizde bir nesneye atayabiliriz.

p2 <- ggplot(miniPISA, aes(x=SINIF, y=ODOKUMA1)) + # x ve y eksenlerini belirleme
  geom_point() # saçılım grafiği çizme
p2

AESTHETICS

Grafiklerdeki görselleri zenginleştirmekte kullanılır. color parametrisiyle renk ayarları yapabiliriz.

ggplot(miniPISA, aes(CINSIYET, OK_YETERLIK)) +
  geom_point(color = "yellow") # saçılım grafiğinin rengini seçme
## Warning: Removed 199 rows containing missing values or values outside the scale range
## (`geom_point()`).

size ve shape parametresiyle büyüklük ve şekil ayarları yapabiliriz.

ggplot(miniPISA, aes(CINSIYET, OK_YETERLIK)) +
  geom_point(color = "black",size=5, shape="n") # saçılım grafiğinin rengini, 
## Warning: Removed 199 rows containing missing values or values outside the scale range
## (`geom_point()`).

alpha parametresiyle şeffaflık ayarı yapılabilir. Değer 1’e yaklaştıkça saydamlık artar.

ggplot(miniPISA, aes(ODOKUMA1, OK_YETERLIK, color = SINIF)) +
  geom_point(alpha = 0.8)
## Warning: Removed 199 rows containing missing values or values outside the scale range
## (`geom_point()`).

geom_text() paramtresiyle metinler veri sembolü olarak eklenebilir.

ggplot(miniPISA[1:10,], aes(ODOKUMA1, OK_YETERLIK))+
         geom_text(aes(label = CINSIYET))

scale() paramtresiyle şekiller kullanılabilir.

 sekiller <- data.frame(sekil = 0:24)
ggplot(sekiller, aes(0, 0, shape = sekil)) +
  geom_point(aes(shape = sekil), size = 5, fill = 'orange') +
  scale_shape_identity() +
  facet_wrap(~sekil) +
  theme_void()

Bar Grafiği

En sık kullanılan grafik türlerinden bir diğeri bar grafiğidir. Bu grafiklerde yatay eksende değişkenler, dikey eksende frekans değerleri yer alır.

ggplot(miniPISA, aes(CINSIYET, fill = SINIF)) + geom_bar() + # sütun grafiği
  labs(x = "Cinsiyet",
       y = "Frekans") #etiketleme yapılması

Cinsiyet değişkeni bağlamında yüzde hesabı yapmak istersek aşağıdaki kodu kullanabiliriz.

ggplot(data = miniPISA, mapping = aes(x = CINSIYET)) + 
  geom_bar(aes(y = (..count..)/sum(..count..))) + 
  scale_y_continuous(name = "Yuzde", labels = scales::percent) + 
  labs(x = "Cinsiyet")  # x eksenine etiket ekleyebilirsiniz
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

fill argümanıyla farklı değişkenler için şekil içi renklendirme yapılabilir.

ggplot(miniPISA, aes(CINSIYET, fill = SINIF)) +
  geom_bar() +
   labs(x = "Cinsiyet",
       y = "Frekans") +
  scale_fill_manual("CINSIYET", values = c("red","blue","orange","green",
                                           "darkblue","purple"))

Çizgi Grafiği

x ekseninde genellikle zamanın yer aldığı bu grafiklerde verilerin zaman içindeki değişimi hakkında bilgi verir.

library(tuev)
PISA2009 <-PISA_STU_2009 %>% 
  select(PV1READ,ESCS) %>% 
  mutate(YIL=2009)

PISA2012 <-PISA_STU_2012 %>% 
  select(PV1READ,ESCS) %>% 
  mutate(YIL=2012)

PISA2015 <-PISA_STU_2015 %>% 
  select(PV1READ,ESCS) %>% 
  mutate(YIL=2015)

PISA2018 <-PISA_STU_2018 %>% 
  select(PV1READ,ESCS) %>% 
  mutate(YIL=2018)

Bunlar rbind ile birleştirilebilir.

library(dplyr)

# bind_rows ile verileri birleştirme
dat <- bind_rows(PISA2009, PISA2012, PISA2015, PISA2018)
dat1 <- dat %>% 
  group_by(YIL )  %>%  
 summarise( ortalama = mean(PV1READ,na.rm=TRUE))  %>% 
  ungroup()

ggplot(dat1 , aes(x=YIL,y= ortalama)) + 
  geom_line(linetype = 2 , color = "red") +
  theme_minimal()

Bunların ardından *DATACAMP çalışmalarını tamamladım.