library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.5.2
## ✔ ggplot2 4.0.0 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── 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
library(openintro)
## Zorunlu paket yükleniyor: airports
## Zorunlu paket yükleniyor: cherryblossom
## Zorunlu paket yükleniyor: usdata
library(ggExtra)
library(corrplot)
## corrplot 0.95 loaded
library(pairsD3)
library(ggcorrplot)
library(ggpubr)
data("mtcars")
str(mtcars)
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
glimpse(mtcars)
## Rows: 32
## Columns: 11
## $ mpg <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8,…
## $ cyl <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8,…
## $ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 16…
## $ hp <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180…
## $ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92,…
## $ wt <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.…
## $ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18…
## $ vs <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,…
## $ am <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0,…
## $ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3,…
## $ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2,…
Bu ödev için "mtcars" veri setini kullandım. Bu veri
seti 32 farklı otomobilin 11 özelliğini barındırıyor. Bu 11 özellikten 5
tanesi kategorik iken 6 tanesi sürekli değişken. Veri setindeki her bir
değişkenin ne anlama geldiği ve hangi değişken tipinde olduğu aşağıdaki
tabloda sunulmuştur.
| Değişken | Açıklama | Değişken Tipi |
|---|---|---|
mpg |
Mil/Galon (Yakıt Verimliliği) | Nümerik / Sürekli |
cyl |
Silindir Sayısı | Kategorik / Faktör |
disp |
Motor Hacmi | Nümerik / Sürekli |
hp |
Beygir Gücü | Nümerik / Sürekli |
drat |
Arka Aks Oranı | Nümerik / Sürekli |
wt |
Ağırlık | Nümerik / Sürekli |
qsec |
Hızlanma (sn) | Nümerik / Sürekli |
vs |
Motor Şekli | Kategorik / Faktör |
am |
Vites Tipi | Kategorik / Faktör |
gear |
İleri Vites Sayısı | Kategorik / Faktör |
carb |
Karbüratör Sayısı | Kategorik / Faktör |
Sys.setlocale("LC_ALL", "Turkish")
## Warning in Sys.setlocale("LC_ALL", "Turkish"): using locale code page other
## than 65001 ("UTF-8") may cause problems
## [1] "LC_COLLATE=Turkish_Türkiye.1254;LC_CTYPE=Turkish_Türkiye.1254;LC_MONETARY=Turkish_Türkiye.1254;LC_NUMERIC=C;LC_TIME=Turkish_Türkiye.1254"
Bu kısımda Türkçe karakter konusunda sık sık problem yaşadığım için(örneğin gönderdiğiniz ödevi ilk başta düzgün görüntüleyemedim) çözüm aradım. Önce Tool>Global Options>Code>Saving>Deafult Test Encoding kısmını UTF-8 yaptım. Dah sonre ilerleyen adımlarda yine benzer problemler çıkınca bunu çözmenin yolarını aradım ve yukarıdaki kod ile Türkçe karakter desteğini aktif hale getirdim.
Veri setindeki nümerik değişkebleri seçerek isimlerini Türkçe yaptım. Daha sonra korelasyon hesaplayıp görsel ayarlarını yaptım ve korelasyon matrisini yazdırdım.
numerik_degiskenler <- mtcars %>%
select(mpg, disp, hp, drat, wt, qsec)
colnames(numerik_degiskenler) <- c("Yakıt Verimliliği",
"Motor Hacmi",
"Beygir G",
"Arka Aks Oranı",
"Ağırlık",
"Hızlanma")
kor_numerik <- cor(numerik_degiskenler)
corrplot(kor_numerik,
method = "circle",
type = "upper",
order = "hclust",
tl.col = "black",
tl.srt = 45,
addCoef.col = "black",
diag = FALSE,
cl.pos = "b",
title = "Değişkenler Arası Korelasyon",
mar = c(0, 0, 1, 0)
)
print(round(kor_numerik, 2))
## Yakıt Verimliliği Motor Hacmi Beygir G Arka Aks Oranı Ağırlık
## Yakıt Verimliliği 1.00 -0.85 -0.78 0.68 -0.87
## Motor Hacmi -0.85 1.00 0.79 -0.71 0.89
## Beygir G -0.78 0.79 1.00 -0.45 0.66
## Arka Aks Oranı 0.68 -0.71 -0.45 1.00 -0.71
## Ağırlık -0.87 0.89 0.66 -0.71 1.00
## Hızlanma 0.42 -0.43 -0.71 0.09 -0.17
## Hızlanma
## Yakıt Verimliliği 0.42
## Motor Hacmi -0.43
## Beygir G -0.71
## Arka Aks Oranı 0.09
## Ağırlık -0.17
## Hızlanma 1.00
Yukarıdaki tabloda beygir gücü ile motor hacmi arasında 0.79 gibi yüksek bir korelasyon çıktı. Ben bunun çok daha yüksek olacağını düşünmüştüm o yüzden incelemek istedim. Burada bu ilişikiyi bir saçılım grafiği ile incelemek istedim.
p_hp_tr <- ggplot(numerik_degiskenler, aes(x = `Motor Hacmi`, y = `Beygir G`)) +
geom_point(size = 3, alpha = 0.8, color = "darkgreen") +
geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed") +
labs(
title = "Motor Hacmi ve Beygir Gücü İlişkisi",
x = "Motor Hacmi",
y = "Beygir Gücü (hp)"
) +
theme_minimal(base_size = 14)
ggMarginal(p_hp_tr, type = "boxplot", fill = "lightgray")
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
Beygir gücü ile motor hacmi arasındaki ilişkinin otomatik ve düz vitesli araçlarda aynı oup olmadığını incelemek için “am (vites tipi)” faktör olarak eklendi.
kor_degerler <- mtcars %>%
group_by(am) %>%
summarise(
kor = cor(disp, hp),
vites_tipi = ifelse(am[1] == 0, "Otomatik Vites", "Manuel Vites"),
x_pos = max(disp) * 0.7,
y_pos = max(hp) * 0.95
)
mtcars %>%
mutate(
vites_tipi = as.factor(
ifelse(am == 0, "Otomatik Vites", "Manuel Vites")
)
) %>%
ggplot(aes(x = disp, y = hp)) +
geom_point(aes(color = vites_tipi), size = 4, alpha = 0.7) +
geom_smooth(method = "lm", se = TRUE, color = "gray30",
linetype = "solid", linewidth = 1.2, alpha = 0.2) +
geom_text(data = kor_degerler,
aes(x = x_pos, y = y_pos,
label = paste0("r = ", round(kor, 3))),
size = 5, fontface = "bold", color = "gray20") +
facet_wrap(~ vites_tipi) +
scale_color_manual(values = c("Otomatik Vites" = "#00BFC4",
"Manuel Vites" = "#F8766D")) +
labs(
title = "Motor Hacmi ve Beygir Gücü İlişkisi",
subtitle = "Vites tipine göre karşılaştırmalı analiz",
x = "Motor Hacmi (cu.in.)",
y = "Beygir Gücü (hp)",
caption = "Veri: mtcars veri seti"
) +
theme_minimal(base_size = 13) +
theme(
legend.position = "none",
plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
plot.caption = element_text(color = "gray50", size = 9),
strip.text = element_text(face = "bold", size = 12),
strip.background = element_rect(fill = "gray90", color = NA),
panel.grid.minor = element_blank(),
panel.border = element_rect(color = "gray80", fill = NA, linewidth = 0.5)
)
## `geom_smooth()` using formula = 'y ~ x'
Pasta grafiğin nasıl yapılabileceğini merak ettğim için bir pasta grafiği örneği eklemek istiyorum. Sildir sayısına göre araçları gruplandırıp pasta grafiği ile gösterdim.
mtcars_tr <- mtcars %>%
mutate(Silindir = factor(cyl,
levels = c(4, 6, 8),
labels = c("4 Silindir", "6 Silindir", "8 Silindir")))
silindir_dagilim <- mtcars_tr %>%
group_by(Silindir) %>%
summarise(adet = n()) %>%
mutate(
yuzde = round(adet / sum(adet) * 100, 1),
etiket = paste0(Silindir, "\n", adet, " araba\n(", yuzde, "%)")
)
ggplot(silindir_dagilim, aes(x = "", y = adet, fill = Silindir)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y", start = 0) +
geom_text(aes(label = etiket),
position = position_stack(vjust = 0.5),
size = 4,
fontface = "bold") +
scale_fill_manual(values = c("4 Silindir" = "#FF6B6B",
"6 Silindir" = "#4ECDC4",
"8 Silindir" = "#45B7D1")) +
labs(title = "mtcars Veri Setinde Silindir Sayısına Göre Dağılım",
subtitle = "Toplam 32 araba",
caption = "Kaynak: mtcars Veri Seti") +
theme_void() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
plot.subtitle = element_text(hjust = 0.5, size = 10),
plot.caption = element_text(hjust = 1, size = 8, color = "gray50"),
legend.position = "none"
)
Motor hacmi ile yakıt verimliliği arasındaki ilişkiyi saçılım grafiği ile inceledim.
kor_test <- cor.test(numerik_degiskenler$`Motor Hacmi`,
numerik_degiskenler$`Yakıt Verimliliği`)
r_degeri <- round(kor_test$estimate, 3)
p_degeri <- kor_test$p.value
if (p_degeri < 0.001) {
p_text <- "p < 0.001"
} else {
p_text <- paste0("p = ", round(p_degeri, 3))
}
p_disp_mpg <- ggplot(numerik_degiskenler, aes(x = `Motor Hacmi`, y = `Yakıt Verimliliği`)) +
geom_point(
shape = 21,
size = 3,
color = "black",
fill = "darkorange",
alpha = 0.8
) +
geom_smooth(
method = "lm",
se = TRUE,
color = "red",
linetype = "dashed"
) +
annotate("text",
x = 300, y = 33,
label = paste0("r = ", r_degeri, ", ", p_text),
size = 5, fontface = "bold") +
labs(
title = "Motor Hacmi ve Yakıt Verimliliği",
x = "Motor Hacmi",
y = "Yakıt Verimliliği"
) +
theme_minimal(base_size = 14)
ggMarginal(
p_disp_mpg,
type = "boxplot",
fill = "lightgray",
color = "black"
)
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
Silindir sayısını (4, 6, 8) motor hacmi ve yakıt verimliliği arasındaki ilişkiye faktör olarak ekeyip ek düzenlemeler yaptım.
numerik_degiskenler_cyl <- numerik_degiskenler %>%
mutate(Silindir = paste0(mtcars$cyl, " Silindir"))
kor_silindir <- numerik_degiskenler_cyl %>%
group_by(Silindir) %>%
summarise(
r = cor(`Motor Hacmi`, `Yakıt Verimliliği`),
p = cor.test(`Motor Hacmi`, `Yakıt Verimliliği`)$p.value,
n = n()
) %>%
mutate(
etiket = ifelse(p < 0.001,
paste0("r = ", round(r, 2), " (p < 0.001)\nn = ", n),
paste0("r = ", round(r, 2), " (p = ", round(p, 3), ")\nn = ", n))
)
p_disp_mpg_cyl <- ggplot(numerik_degiskenler_cyl,
aes(x = `Motor Hacmi`, y = `Yakıt Verimliliği`)) +
geom_point(
aes(fill = Silindir),
shape = 21,
size = 2.5,
color = "black",
alpha = 0.7,
stroke = 0.5
) +
geom_smooth(
aes(color = Silindir),
method = "lm",
se = TRUE,
linewidth = 1,
alpha = 0.15
) +
geom_label(data = kor_silindir,
aes(x = Inf, y = Inf, label = etiket),
hjust = 1.05, vjust = 1.2,
size = 3.5,
fontface = "bold",
label.padding = unit(0.3, "lines"),
label.size = 0.3) +
facet_wrap(~ Silindir, scales = "free_x") +
scale_fill_manual(values = c("4 Silindir" = "#E74C3C",
"6 Silindir" = "#27AE60",
"8 Silindir" = "#3498DB")) +
scale_color_manual(values = c("4 Silindir" = "#E74C3C",
"6 Silindir" = "#27AE60",
"8 Silindir" = "#3498DB")) +
labs(
title = "Motor Hacmi ve Yakıt Verimliliği İlişkisi",
subtitle = "Silindir sayısına göre karşılaştırmalı analiz",
x = "Motor Hacmi",
y = "Yakıt Verimliliği"
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "none",
plot.title = element_text(face = "bold", size = 15, hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "gray40", size = 11),
strip.text = element_text(face = "bold", size = 11, color = "white"),
strip.background = element_rect(fill = "gray30", color = NA),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "gray90", linewidth = 0.3),
panel.border = element_rect(color = "gray70", fill = NA, linewidth = 0.5),
plot.margin = margin(10, 10, 10, 10)
)
## Warning: The `label.size` argument of `geom_label()` is deprecated as of ggplot2 3.5.0.
## i Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
print(p_disp_mpg_cyl)
## `geom_smooth()` using formula = 'y ~ x'
Burada son iki ödevden öğrendiklerimi birlikte ve olabildiğince kısa açıklamaya çalışacağım. Çünkü son iki ödevin birbiri ile çok ilişkili olduğunu düşünüyorum. Ayrıca bir önceki öğrenme günlüğümde bilgiye yer vermemiş, duygu ve düşüncelerimi özetlemiş ve bundan sonraki günlüklerimde öğrendiklerimi aktarmaya çalışacağımı belirtmiştim.
İlk olarak daha önce biraz farkında olsam da bu iki ödev ile hangi grafik türünün hangi amaç için daha uygun olduğu konusunda farkındalığım gelişti. Bu hem daha iyi analiz yapmama hem de grafikleri daha iyi okumama destek olacak bir öğrenme oldu. İkincisi ise grafiklere neler ekleyebilirim sorusuna cevap ararken pek çok deneme imkânı buldum. Muhtemelen çok daha fazlası var, onları da öğrendikçe kullanacağım. Günlüğümde öncelikle grafiklerin ne işe yaradığından bahsedeceğim daha sonra ise R’da kullandığım fonsiyonlarla ilgili kısa bir özet vereceğim.
Farklı karegorilerin aldığı değerleri karşılaştırmak için
kullanabiliriz. Örneğin üniveriste öğrencilerinden oluşan bir
örneklemede hangi üniversiteden kaç katlımcı var sorusuna cevap vermek
için uygun bir grafik türü olabilir. R’da geom_bar() veya
geom_col() fonksiyonları ile bu grafiği
oluşturabiliriz.
Muhtemelen bu derse kadar bu grafik türünü sütun grafiği ile
karıştırıyormuşum. Sütun grafiğinden farkı kategoriler değil, sayısal
aralıklar üzerinde çalışması. Örneğin üniversite öğrencilerinin
yaşlarına baktığımızda “18-20 yaş arası kaç öğrenci var, 21-23 yaş arası
kaç öğrenci var” gibi sorulara cevap verebiliyoruz. R’da
geom_histogram() ile yaparız.
Bu grafik benim için çok bilgilendiriciydi. Tek grafikte hem ortanca
değeri, hem verinin %25-%75 arasındaki kısmını, hem de aykırı değerleri
gösteriyor. Örneğin farklı bölümlerdeki öğrencilerin sınav notlarını
karşılaştırmak için kullanabiliriz. R’da geom_boxplot()
fonksiyonu ile bu grafiği oluşturabiliriz.
İki sayısal değişken arasında ilişki var mı yok mu, varsa ne yönde
diye bakmak için kullanıyoruz. Örneğin öğrencilerin çalışma saatleri ile
sınav notları arasındaki ilişkiyi görmek için ideal. R’da
geom_point() fonksiyonu ile bu grafiği oluşturabiliriz.
Bir değişkenin zaman içinde nasıl değiştiğini göstermek için
kullanılıyor. Örneğin bir öğrencinin dönem boyunca aldığı haftalık quiz
notlarının değişimini görmek için kullanabiliriz. R’da
geom_line() fonksiyonu ile bu grafiği oluşturabiliriz.
Birden fazla değişken arasındaki ilişkileri tek seferde görmek için
kullanılıyor. Örneğin yaş, çalışma saati, devamsızlık ve sınav notu gibi
değişkenlerin birbiriyle ilişkisini hızlıca görebiliriz. R’da
corrplot paketi ile bu grafiği oluşturabiliriz.
Bir bütünün parçalara nasıl bölündüğünü ve her parçanın yüzdesel
oranını göstermek için kullanılıyor. Örneğin üniversite öğrencilerinin
fakültelere göre dağılımını görmek için kullanabiliriz. R’da
geom_bar() ile coord_polar() fonksiyonlarını
birlikte kullanarak bu grafiği oluşturabiliriz.
ggplot ve aes : Her grafik bunlarla
başlıyor. ggplot() garfik için alt yapıyı oluşturuyor,
aes() ise hangi değişkenin nereye gideceğini
söylüyor:
geom_ smooth: Grafiğe regresyon çizgisi
eklemek için kullandım. method = “lm”: doğrusal
regresyon olduğunu iafde etmek için kullanılıyor. se =
TRUE: Regresyon çizgisinin etrafındaki gölgelendirme için
kullandım. Değeri FALSE yapınca gölge olmuyor.
facet_wrap: En fazla beğendiğim ve
eğlendiğim özellik oldu. Grafiği kategorilere göre bölerek ayrı paneller
oluşturuyor.
labs: Grafiklere başlık, alt başlık ve
eksen isimleri koymak için kullanıyorum.
theme: Grafiğin görsel unsurlarını
ayarlamak için kullanıyoruz.
legend.position = Lejantı eklemek veya kaldırmak için.
plot.title = element_text: Grafik başlığının ayarları için.
geom_label : Grafiğe kutulu metin
etiketleri eklemek için kullanılıyor.
geom_text: Grafiğe belirli noktalara
düz metin yazmak için kullanıyoruz.
annotate: Grafiğe elle belirli
koordinatlara metin, şekil veya çizgi eklemek için kullanıyoruz.