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.
İ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
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
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.
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
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ı 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
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 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
Şimdi veri setimizdeki okuma puanlarını
geom_density
fonksiyonu yardımıyla yoğunluk grafiğini
çizelim.
ggplot(miniPISA, aes(x=ODOKUMA1))+
geom_density(linetype="dashed", fill="blue")
Burada linetype
iç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.
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`.
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
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
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()
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"))
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.