• 19 Kasım tarihli R ile Veri Analizi dersimizde;
  1. Betimleyici İstatistikler
  2. Veri Görselleştirme başlıklarını işledik.
  • Derste kullanılan veri setlerini burada da kullanacağım için gerekli paketlerin ve veri setlerinin yüklenmesi gerekiyor.

Paketleri yükleme

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(tidyr)
library(tibble)  
library(haven)
library(haven)
library(sjlabelled)
## 
## Attaching package: 'sjlabelled'
## The following objects are masked from 'package:haven':
## 
##     as_factor, read_sas, read_spss, read_stata, write_sas, zap_labels
## The following object is masked from 'package:dplyr':
## 
##     as_label

Veri setlerini yükleme

load("C:/Users/Lenovo/Desktop/R/data/PISA_COG_2018.rda")
load("C:/Users/Lenovo/Desktop/R/data/PISA_OGR_2018.rda")
load("C:/Users/Lenovo/Desktop/R/data/PISA_SCH_2018.rda")

miniPISA veri setini yükleme

# Veri setini yükleme
load("C:/Users/Lenovo/Desktop/R/data/miniPISA.rda")

BETİMLEYİCİ İSTATİSTİKLER

Bu bölümde, betimleyici istatistiklerin önemini ve veri analiz sürecindeki rollerine dair bilgiler öğrendim. Ayrıca, R dilinde bu istatistiklerin nasıl hesaplandığını örneklerle gördüm.

Min ve Max Değerler

  • Minimum ve maksimum değerlerin, bir veri setindeki en uç değerleri gösterdiğini ve veri dağılımını anlamak için önemli olduğunu gördüm.
  • R’da bu değerleri hesaplamak oldukça basittir. Aşağıdaki örnekte miniPISA$ODOKUMA1 değişkeni için minimum ve maksimum değerler hesaplanmıştır.

Minimum ve maksimum değer hesaplama

min_value <- min(miniPISA$ODOKUMA1)
max_value <- max(miniPISA$ODOKUMA1)

min_value
## [1] 175.608
max_value
## [1] 771.508

Alternatif olarak range() fonksiyonu da doğrudan minimum ve maksimum değerleri verir.

miniPISA$ODOKUMA1 <- as.numeric(miniPISA$ODOKUMA1) 
min <- range(miniPISA$ODOKUMA1, na.rm = TRUE)[1]  
min
## [1] 175.608
max <- range(miniPISA$ODOKUMA1, na.rm = TRUE)[2]
max
## [1] 771.508

Bu değerler, veri setinin en düşük ve en yüksek okuma performansını temsil eder ve aşırı uçların belirlenmesinde kullanılır. Aşırı uçlar varsa, bu durum analiz sonuçlarını etkileyebilir.

Ortalama

Ortalama, bir veri setindeki merkezi eğilimi ölçmenin yaygın bir yoludur. Ancak, aşırı uç değerler ortalamayı etkileyebilir.

Örnek:

mean_value <- mean(miniPISA$ODOKUMA1, na.rm = TRUE)
mean_value
## [1] 464.2299

Bu sonuç, örneklemin okuma performansına dair genel bir bakış sunar. Ayrıca, eksik veriler bulunduğunda na.rm = TRUE kullanılarak analizden hariç tutulabilir.

Medyan

Medyan, verilerin sıralanması sonucu ortadaki değeri temsil eder ve aşırı uçlardan etkilenmez.

Medyan hesaplama örneği:

median_value <- median(miniPISA$ODOKUMA1)
median_value
## [1] 463.403

Bu yöntem, veri setinin gerçek merkezi eğilimini anlamak için faydalıdır, özellikle de dağılım simetrik değilse.

I. ve III. Çeyrekler

  • Çeyrekler, veriyi dört eşit parçaya böler ve dağılımın daha ayrıntılı incelenmesine olanak tanır.
  • Aşağıda I. ve III. çeyrekler için bir örnek verilmiştir.
q1 <- quantile(miniPISA$ODOKUMA1, 0.25)
q3 <- quantile(miniPISA$ODOKUMA1, 0.75)

q1
##      25% 
## 402.5635
q3
##      75% 
## 525.7188

Bu istatistikler, veri setindeki dağılımın yayılımını anlamak için kritik öneme sahiptir.

Standart Sapma ve Varyans

Standart sapma ve varyans, veri setindeki değişkenliği ölçmek için kullanılır.

Örneğin

std_dev <- sd(miniPISA$ODOKUMA1)
variance <- var(miniPISA$ODOKUMA1)

std_dev
## [1] 87.78006
variance
## [1] 7705.339

Bu değerler, veri setinin ne kadar geniş bir aralıkta dağıldığını gösterir.

Tüm Özet İstatistikler

summary() fonksiyonu, betimleyici istatistikleri özetler.

Örneğin;

summary_stats <- summary(miniPISA$ODOKUMA1)
summary_stats
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   175.6   402.6   463.4   464.2   525.7   771.5

Bu sonuç, hızlı bir şekilde temel betimleyici istatistiklere erişim sağlar.

Değişkenlik Katsayısı

Değişkenlik katsayısı, standart sapmanın ortalamaya oranıdır ve farklı birimler veya ölçeklerdeki veri setlerini karşılaştırmak için kullanılır.
Örneğin;

cv <- sd(miniPISA$ODOKUMA1) / mean(miniPISA$ODOKUMA1)
cv
## [1] 0.1890875

Bu değer, veri setinin ne kadar tutarlı olduğunu anlamaya yardımcı olur.

Mod

Mod, bir veri setindeki en sık rastlanan değeri ifade eder.
Örneğin:

mod_table <- table(miniPISA$Anne_Egitim)
mod_value <- names(sort(mod_table, decreasing = TRUE)[1])

mod_value
## [1] "1"

Bu örnekte, anne eğitim değişkenindeki en sık rastlanan değer 1’dir.

Frekans Tablosu Oluşturma

Frekans tablosu, kategorik verilerin dağılımını gösterir.

Örneğin;

freq_table <- miniPISA %>%
  group_by(Anne_Egitim) %>%
  count() %>%
  ungroup()

Bu tablo, örneklemin demografik özelliklerini hızlı bir şekilde anlamayı sağlar.

NOT: Bu bölümde ele alınan yöntemler, bir veri setindeki merkezi eğilim ve yayılımın farklı yönlerini anlamada kritik rol oynar. R dilinin sunduğu işlevler, bu analizlerin hızlı ve etkili bir şekilde gerçekleştirilmesini sağlar. Analitik süreçlerin temel taşları olan betimleyici istatistikler, veriyi anlamlandırma yolunda ilk adımdır.

VERİ GÖRSELLEŞTİRME

Bu bölümde veriyi daha kolay anlaşılır hale getirmek için görselleştirmenin gücünü fark ettim. Grafikler, karmaşık veri setlerindeki örüntüleri hızlıca anlamamızı sağlıyor ve görsel destekle sonuçların daha etkili bir şekilde aktarılmasına yardımcı oluyor. Özellikle ggplot2 gibi güçlü bir paketin veri görselleştirme sürecinde sunduğu esnekliğin önemini kavradım.

ggplot2

  • ggplot2’nin “grafiklerin grameri” olarak adlandırılmasının ne kadar anlamlı olduğunu fark ettim.
  • Grafikler katmanlar halinde oluşturulduğunda her bir katmanın eklenmesiyle görsel bir hikaye yaratılabiliyor.
  • Aşağıdaki örnek bu katman mantığını göstermektedir.
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:sjlabelled':
## 
##     as_label
ggplot(miniPISA, aes(x = ODOKUMA1, y = OKUMA_ZEVK)) +
  geom_point() +
  labs(title = "Okuma Puanı ve Zevk İlişkisi", 
       x = "Okuma Puanları", 
       y = "Okuma Zevki") +
  theme_minimal()

Bu süreçte, grafiklerin anlamlı ve estetik hale gelmesinde doğru etiketleme ve düzenlemelerin ne kadar önemli olduğunu anladım.

Yoğunluk Grafikleri

  • Yoğunluk grafiklerinin veri dağılımını analiz etmek için güçlü bir araç olduğunu öğrendim.
  • Özellikle yoğunluk grafiklerinin tepe noktalarının verinin hangi değerlerde yoğunlaştığını göstermesi, veri setini anlamada bana çok yardımcı oldu.

Örneğin;

ggplot(miniPISA, aes(x = ODOKUMA1)) +
  geom_density(fill = "lightblue", alpha = 0.5) +
  labs(title = "Okuma Puanlarının Yoğunluğu", x = "Okuma Puanları", y = "Yoğunluk")

Bu grafiklerin, özellikle zamana dayalı olmayan sürekli verilerde kullanılmasının etkili bir yaklaşım olduğunu fark ettim.

Histogram

  • Histogramların, veri dağılımını görselleştirmek için en etkili araçlardan biri olduğunu öğrendim.
  • Özellikle veri setindeki frekansların görselleştirilmesinde kullanışlıdır.
  • Histogramlarda eksenlerin ve renklerin özelleştirilmesi, veriyi daha anlamlı kılıyor.

Örneğin:

ggplot(miniPISA, aes(x = ODOKUMA1)) +
  geom_histogram(binwidth = 50, fill = "orange", color = "black") +
  labs(title = "Okuma Puanlarının Histogramı", x = "Okuma Puanları", y = "Frekans")

Bu tür grafiklerin, özellikle büyük veri setlerinde dağılımı görmek için ilk adım olduğunu fark ettim.

Gruplama Değişkenleri

  • Veri görselleştirirken kategorik değişkenlere göre gruplandırmanın görsel anlamı artırdığını öğrendim.
  • Örneğin, color argümanı ile cinsiyete göre okuma puanlarını karşılaştırmak veriyi daha anlamlı hale getiriyor.
  • x ve y eksenlerile xlab ve ylab ile isim de verebileceğimizi öğrendim.

Örnek;

p1 <- ggplot(
      miniPISA %>% 
      group_by(SINIF,CINSIYET) %>% 
      mutate(ort=mean(ODOKUMA1)) %>%  
        ungroup(), 
     aes(x=SINIF, y=ort, color=CINSIYET )) + 
  geom_point() +  
  xlab("Sınıf Düzeyi")+ 
  ylab("Ortalama Puan") 

Grafik nesnesi

  • Grafikler daha sonradan kullanılmak üzere kaydedilmek istendiğinde herhangi bir isim ile bir nesneye atanır.
  • Örnekte oluşturulan saçılım grafiği “p” nesnesine atanmıştır.

Örnek;

p2 <- ggplot(miniPISA, aes(x=SINIF, y=ODOKUMA1)) + 
  geom_point()
p2

Bu tür grafiklerin, özellikle bir veri setinde gruplar arasındaki farklılıkları analiz etmek için etkili bir araç olduğunu fark ettim.

Aesthetics

  • ggplot2 paketinde estetik özelliklerin (color, size, shape, alpha) grafiklerin anlamını ne kadar değiştirdiğini gördüm.
  • Örneğin, şeffaflık (alpha) kullanarak grafiklerdeki yoğunluğu daha iyi ifade edebileceğimizi fark ettim.
library(haven)
library(scales)

miniPISA <- as.data.frame(lapply(miniPISA, function(x) {
  if (inherits(x, "haven_labelled")) {
        x <- as.character(x) 
    as.numeric(x)       
  } else if (is.character(x)) {
    as.numeric(as.factor(x)) 
  } else {
    x
  }
}))
str(miniPISA)
## 'data.frame':    6890 obs. of  11 variables:
##  $ SINIF         : num  10 10 10 9 9 10 10 10 10 10 ...
##  $ CINSIYET      : num  2 2 1 2 2 2 1 2 1 2 ...
##  $ KITAPSAYISI   : num  2 3 1 1 2 2 3 3 3 4 ...
##  $ SES           : num  -2.4521 -2.1042 -2.27 0.0324 -0.0674 ...
##   ..- attr(*, "label")= chr "Sosyo-ekonomik duzey indeksi"
##   ..- attr(*, "format.spss")= chr "F7.4"
##   ..- attr(*, "display_width")= int 7
##  $ Anne_Egitim   : num  2 2 1 6 4 4 5 5 1 0 ...
##  $ Baba_Egitim   : num  2 2 2 6 4 6 5 5 4 2 ...
##  $ OKUMA_ZEVK    : num  -0.289 0.604 0.638 -1.154 0.667 ...
##   ..- attr(*, "label")= chr "Okumaya karsi duyulan zevk"
##   ..- attr(*, "format.spss")= chr "F7.4"
##   ..- attr(*, "display_width")= int 9
##  $ OK_YETERLIK   : num  -0.671 1.237 -0.409 -0.825 1.884 ...
##   ..- attr(*, "label")= chr "Okuma oz kavrami: Yeterlilik algisi"
##   ..- attr(*, "format.spss")= chr "F7.4"
##   ..- attr(*, "display_width")= int 12
##  $ Okuloncesi_yil: num  1 1 1 1 NA NA 2 1 2 1 ...
##  $ OKUL_TUR      : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ ODOKUMA1      : num  376 512 396 393 552 ...
if ("ODOKUMA1" %in% colnames(miniPISA)) {
  miniPISA$ODOKUMA1_rescaled <- rescale(miniPISA$ODOKUMA1, na.rm = TRUE)
}

if ("ODOKUMA1" %in% colnames(miniPISA) & "OKUMA_ZEVK" %in% colnames(miniPISA)) {
  ggplot(miniPISA, aes(x = ODOKUMA1, y = OKUMA_ZEVK)) +
    geom_point() +
    labs(title = "Okuma Puanı ve Zevk İlişkisi", 
         x = "Okuma Puanları", 
         y = "Okuma Zevki") +
    theme_minimal()
} else {
  message("ODOKUMA1 veya OKUMA_ZEVK sütunları bulunamadı.")
}

NOT: Üstteki kodda hata aldım ancak sebebini çözemediğim için chat gpt desteği aldım.

Size parametresi ile büyüklük, shape parametresi ile şekil düzenlemesi yapılabilmektedir. Default değerleri sırasıyla 1 ve noktadır.

Örneğin;

ggplot(miniPISA, aes(CINSIYET, OK_YETERLIK)) +
  geom_point(color = "orange",size=3, shape="s")

Bu tür estetik özelliklerin veriyi daha açıklayıcı hale getirdiğini anladım.

Katmanlar

  • Veri görselleştirmenin temeli olan katmanların, özellikle ggplot2 paketinde büyük bir esneklik sunduğunu fark ettim.
  • Grafiklerin katman katman oluşturulması, veriyi daha anlamlı ve açıklayıcı hale getirmeye olanak tanıyor.
  • Her bir katmanın önceki katmana artı sembolüyle eklenmesi, görsel tasarımı özelleştirmek için güçlü bir yöntem olduğunu bana gösterdi.

Örneğin;

library(ggplot2)
library(dplyr)
library(sjlabelled)
#tekrar yazmaya gerek yok ama bu kısımdan sonra restart yapsam da arka arkaya hatalar aldığım için yazdım.
miniPISA <- miniPISA %>%
  mutate(across(where(~ inherits(., "haven_labelled")), ~ as_numeric(.)))
sapply(miniPISA, class)
##             SINIF          CINSIYET       KITAPSAYISI               SES 
##         "numeric"         "numeric"         "numeric"         "numeric" 
##       Anne_Egitim       Baba_Egitim        OKUMA_ZEVK       OK_YETERLIK 
##         "numeric"         "numeric"         "numeric"         "numeric" 
##    Okuloncesi_yil          OKUL_TUR          ODOKUMA1 ODOKUMA1_rescaled 
##         "numeric"         "numeric"         "numeric"         "numeric"
ggplot(miniPISA, aes(x = as.numeric(ODOKUMA1), y = as.numeric(OK_YETERLIK), color = as.factor(SINIF))) +
  geom_point() +
  labs(
    title = "Okuma Puanları ve Yeterlik İlişkisi",
    x = "Okuma Puanları",
    y = "Okuma Yeterlik Puanları",
    color = "Sınıf"
  )
## Warning: Removed 199 rows containing missing values or values outside the scale range
## (`geom_point()`).

Bu yaklaşımın, grafiklerin modüler bir şekilde oluşturulmasını sağladığını ve her seferinde yeni bir grafik oluşturmak yerine mevcut bir grafiği geliştirmek için harika bir yol olduğunu öğrendim.

Alpha

  • Grafiklerde alpha parametresi ile şeffaflık düzeyini kontrol edebilmenin, özellikle yoğun veri setlerinde anlamlı bir fark yarattığını fark ettim.
  • Noktaların saydamlığı artırılarak, veri yığılmalarının görsel olarak daha iyi ifade edilebildiğini gözlemledim.
  • Bu tür bir düzenleme, verinin görsel analizini kolaylaştırıyor.
ggplot(miniPISA, aes(ODOKUMA1, OK_YETERLIK, color = SINIF)) +
  geom_point(alpha = 0.3)

Şeffaflık parametresinin, karmaşık veri kümelerinde okunabilirliği artırdığı sonucuna vardım.

Text

  • geom_text() fonksiyonuyla grafiklere açıklama veya etiket eklemenin, özellikle küçük veri setlerinde veri noktalarını anlamlandırmada etkili bir yöntem olduğunu öğrendim.
  • Bu yöntem, veriler arasında bağ kurmaya ve farklı gruplar arasındaki ilişkileri daha iyi açıklamaya olanak tanıyor.
ggplot(miniPISA[1:10,], aes(ODOKUMA1, OK_YETERLIK)) +
  geom_text(aes(label = CINSIYET))

Bu tür özelleştirmelerle, grafiklerin okuyucular için daha anlamlı hale geldiğini fark ettim.

Scale

  • Grafiklerin ölçeklerini (scale_*()) özelleştirmenin, grafiklerin görsel tutarlılığı ve estetiği için önemli olduğunu fark ettim.
  • Eksendeki etiketlerin, kesim noktalarının ve renklerin uyarlanması, daha net ve özelleştirilmiş grafikler oluşturmayı sağlıyor.

Örneğin;

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

Bu özellikler, özellikle birden fazla değişken içeren grafiklerde görsel karmaşıklığı azaltmada büyük bir avantaj sağlıyor.

Limits ve Breaks

  • Eksendeki sınırların (limits) ve kesim noktalarının (breaks) ayarlanmasının, grafiklerde odaklanmak istediğimiz aralıklara dikkat çekmek için kritik olduğunu fark ettim.
  • Bu, özellikle geniş veri aralıklarında gereksiz detayları ortadan kaldırarak veriye anlam katıyor.
library(ggplot2)

miniPISA$CINSIYET <- factor(miniPISA$CINSIYET, labels = c("KIZ", "ERKEK"))

ggplot(miniPISA, aes(x = ODOKUMA1, y = OK_YETERLIK, color = CINSIYET)) +
  geom_point(position = "jitter") +  
  scale_x_continuous("Okuma Puanları", limits = c(100, 900)) +  
  scale_color_discrete("Cinsiyet")  

ggplot(miniPISA, aes(x = ODOKUMA1,y = OK_YETERLIK,color = CINSIYET)) + 
geom_point(position = "jitter") +  
scale_x_continuous("Okuma Puanları",limits = c(100,900)) + 
scale_color_discrete("Cinsiyet",labels=c("KIZ","ERKEK"))  

Bu yöntem, analiz edilen veri aralığını özelleştirme imkanı sunarak grafiklerin netliğini artırıyor.

Bar Grafikleri

  • Bar grafiklerinin, frekans veya dağılım analizini anlamak için en etkili yöntemlerden biri olduğunu fark ettim.
  • Özellikle kategorik değişkenler için bar grafiklerinin, gruplar arasındaki farklılıkları anlamamıza yardımcı olduğunu gördüm.
ggplot(miniPISA, aes(CINSIYET, fill = SINIF)) +
  geom_bar() +
  labs(x = "Cinsiyet", y = "Frekans") 

ggplot(data = miniPISA, mapping = aes(x = CINSIYET)) +
  geom_bar(aes(y = (..count..)/sum(..count..))) +
  scale_y_continuous(name = "Yüzde", labels = scales::percent)

Bar grafiklerinde, y ekseninde yüzde değerlerini kullanarak veriyi daha anlaşılır hale getirme fikrinin çok etkili olduğunu öğrendim. Bu grafikler, veriyi sade bir şekilde özetlemek için ideal bir araçtır.

Çizgi Grafikleri

  • Çizgi grafiklerinin, özellikle zamana bağlı değişimlerin analizinde en uygun grafik türü olduğunu fark ettim.
  • Çizgi grafiklerinin yıllara göre değişimleri anlamada ne kadar güçlü bir araç olduğunu aşağıdaki örnekten görebiliriz.
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)

dat <-rbind(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 = "blue") +
  theme_minimal()

dat2 <- dat %>% mutate(ESCS_kategorik = 
                            case_when(
                              ESCS > -4 & ESCS <=  -2 ~ "Dusuk",
                              ESCS > -2 & ESCS <=  0 ~ "Orta",
                              ESCS > 0    ~ "Yuksek")) 
                            
dat3 <- dat2 %>% group_by(YIL, ESCS_kategorik)   %>%  
  summarise(ortalamaSES= mean(ESCS,na.rm=TRUE),
            ortalamaPV1= mean(PV1READ,na.rm=TRUE))   %>% 
  arrange(desc(ortalamaSES)) %>% ungroup()
## `summarise()` has grouped output by 'YIL'. You can override using the `.groups`
## argument.
head(dat3)  
## # A tibble: 6 × 4
##     YIL ESCS_kategorik ortalamaSES ortalamaPV1
##   <dbl> <chr>                <dbl>       <dbl>
## 1  2009 Yuksek               0.697        521.
## 2  2018 Yuksek               0.620        520.
## 3  2012 Yuksek               0.560        547.
## 4  2015 Yuksek               0.543        474.
## 5  2009 Orta                -1.10         468.
## 6  2015 Orta                -1.10         428.
library(ggpubr)
ggplot(dat3, aes(x=ortalamaSES , y=ortalamaPV1)) + 
  geom_line() +
  facet_wrap(vars(YIL)) +
  geom_smooth(method='lm', formula= y~x)+
  stat_regline_equation() +
    xlab("Ortalama ESCS") + ylab("Ortalama PV1") +
theme_bw()

Zamana bağlı eğilimleri belirlemek için çizgi grafiklerinin etkili bir yöntem olduğunu ve theme_*() fonksiyonlarıyla görselliğin sadeleştirilebileceğini fark ettim.

  • Bu derste, ggplot2 paketinin sunduğu geniş görselleştirme olanaklarını ve her bir katmanın nasıl işlevsellik kattığını derinlemesine anladım.
  • Katmanlı yapı sayesinde veriyi anlamlı, etkili ve estetik bir şekilde görselleştirmenin mümkün olduğunu gördüm.
  • Özellikle alpha, scale_*(), limits ve breaks gibi estetik düzenleme parametrelerinin grafiklere derinlik kattığını fark ettim.
  • Artık daha karmaşık veri setlerini daha etkili bir şekilde analiz edebilmek için grafiklerin gücünü kullanabilirim.