class: center, top, title-slide .title[ # İLT668, Beşinci Ders ] .subtitle[ ## Ggplot2 ile Veri Görselleştirme ] .author[ ### Umut Yener Kara ] .date[ ### 2 Nisan, 2023
Güncelleme: Nis 4, 2023 ] --- ## Veri Görselleştirme Veri görselleştirme veri bilimi projelerinin kritik bir parçasıdır. Veri görselleştirme genel olarak iki ana türde grafikler üretmek için yapılır: -- * *Keşifsel (Exploratory) Grafikler*: Keşifsel grafikler çalıştığınız verileri daha iyi anlamak ve tanımak için; verilerde *örüntü* ve *fikir* keşfetmek için kullanılırlar. Grafikler yüksek miktarda enformasyonu sıkıştırıp kolay anlaşılır hale getirebildiklerden çalıştığınız verileri tablolardan ve sayılardan çok daha iyi özetleyebilirler. Bu tarz grafikler *kolay ve hızlı* şekilde üretilirler ancak *düşük kalitededirler*. Araştırmacı böyle grafikleri başkaları için değil kendisi için yaptığından genelde kaydedilip paylaşılmazlar. -- * *Açıklayıcı (Explanatory) Grafikler*: Bunlar, araştırmanızın sonuçlarını ve bulgularını başkalarına aktarmak için kullanılan grafiklerdir. Yayınlarda, raporlarda ve sunumlarda paylaşılan grafikler genelde bu türdendir. Bu tarz grafikler anlaşılır, estetik ve iyi bir görünüme sahip olmalıdırlar. Hazırlanmaları *zaman alır* ve *az sayıda* yapılırlar. **Kaynak**: https://jhudatascience.org/tidyversecourse/dataviz.html --- ## `ggplot2` paketi .pull-left[ Tidyverse paketlerinin arasında bulunan `ggplot2` R ortamında en yaygın kullanılan ve popüler veri görselleştirme paketidir. Sadece araştırmacılar tarafından değil BBC[1] gibi yayın organları tarafından da yayına hazır grafikler yaratmak için kullanılmaktadır. Paketin altında yatan temel fikir **layered grammar of graphics** şeklindedir. Bunun anlamı grafiklerin birbirlerine kurallara göre eklenen katmanlar halinde yapılandırılmış olmasıdır. ] .pull-right[ <img src="data:image/png;base64,#images/bbc.png" width="500px" height="300px" /> ] .footnote[[1]https://bbc.github.io/rcookbook/] --- ## `ggplot2` Grafiklerinin Yapısı `ggplot2` grafik nesneleri 3 temel parçanın birleşiminden oluşur. Genel formül: `grafik = veri + estetik + geometri` * **Veri**, veri setini (data frame), * **Estetik** veya **mapping** grafiğin öğeleri (örn. x ve y eksenleri) ile verilerin nasıl eşleceği (*map*) * **Geometri ise**, grafik türünü (histogram, çubuk grafiği (bar chart), kutu grafiği (boxplot), çizgi grafiği (line plot), saçılım grafiği (scatter plot) vb.) ifade eder. Her grafiğe `ggplot()` fonksiyonuyla verimizin ne olacağını söyleyerek başlarız. Sonra `ggplot()` fonksiyonun içerisinde `aes()` fonksiyonuyla verilerimizin grafikteki öğelerle (örn. `x`,`y` eksenleri) nasıl eşleşeceğini (**map**) belirtiriz. Ardından `+` işaretiyle katman ekleyerek, hangi tür grafik istediğimizi `geom` ile başlayan fonksiyonlarla belirtiriz. Sonrasında `+` işaretiyle grafiğe istediğimiz kadar opsiyonel katman ekleyebiliriz. --- ## Dünya Değerler Anketi Bu dersteki örnekler için Dünya Değerler Anketi'nin (World Value Survey) 2018 Türkiye verilerinin kısaltılarak düzenlenmiş halini veri olarak kullanacağız. Veriyi tidyverse paketlerinin içerisinde gelen `readr` paketinin `read_csv()` fonksiyonuyla okutalım. ```r dda <- read_csv("data/dda_2018_kısa.csv") ``` ``` ## Rows: 2415 Columns: 28 ## ── Column specification ────────────────────────────────────────────── ## Delimiter: "," ## chr (4): mutluluk, siyasete_ilgi, parti_tercihi, cinsiyet ## dbl (24): hayat_memnuniyeti, cami_sıklık, dua_sıklık, dindarlık, s... ## ## ℹ Use `spec()` to retrieve the full column specification for this data. ## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message. ``` --- ###.left[Histogram Grafiği Örneğiyle Ana `ggplot2` Özellikleri] .pull-left[ .small[ Sayısal bir değişkenin her bir değerinde kaç gözlem olduğunu görmek istiyorsak, bunu histogram grafiği ile yapıyoruz. Histogram grafiğinde, `x` nümerik değer değişkendir, `y` boş bırakılır, Çünkü `y`, veri setindeki bir değişkeni değil, `x` ekseninde bulunan değişkenin her bir değerinin gözlem sayısını (frequency) ifade eder. Diyelim DDA anketinde katılımcıların yaş dağılımını incelemek istiyoruz. ```r ggplot(dda, aes(x=yaş)) + geom_histogram() ``` ] ] .pull-right[ <!-- --> ] .pull.left[ .footnote[ `ggplot()` ile grafiği başlattık, argüman olarak içerisine görselleştirmek istediğimiz nesneyi/veriyi girdik. Estetik kısmında x eksenini yaş değişkeni olarak belirledik. Ardından(`+`) işaretiyle histogram katmanı ekledik.] ] --- ### Grafiği Güzelleştirmek `geom_histogram()` fonksiyonu içerisine argümanlar girerek görünümünü değiştirebiliriz: `binwidth` çubukların (bin) kaç değer genişliğinde olduğunu, `color` hangi dış renke sahip olduklarını, `fill` ise hangi dolgu rengine sahip olduğunu ayarlar. ```r ggplot(dda, aes(x=yaş)) + geom_histogram(binwidth = 5, color = "black", fill = "lightblue") ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-1-1.svg" style="display: block; margin: auto;" /> --- ###.left[Eksen Ölçekleri ve Çentikler (Ticks)] Yarattığımız histogram grafiğine `+` işaretiyle istediğimiz kadar katman ekleyebiliriz. Eksenlerin alt ve üst değerlerini (`limit`) veya çentiklerini (`break`) değiştirmek için `scale` ile başlayan fonksiyonları kullanıyoruz. ```r ggplot(dda, aes(x=yaş)) + geom_histogram(binwidth = 5, color = "black", fill = "lightblue") + scale_x_continuous(limit = c(0,100), breaks = seq(0,100, by = 5)) ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-2-1.svg" style="display: block; margin: auto;" /> --- ###.left[Eksen Ölçekleri ve Çentikler (Ticks)] Yarattığımız histogram grafiğine `+` işaretiyle istediğimiz kadar katman ekleyebiliriz. Eksenlerin alt ve üst değerlerini (`limit`) veya çentiklerini (`break`) değiştirmek için `scale` ile başlayan fonksiyonları kullanıyoruz. ```r ggplot(dda, aes(x=yaş)) + geom_histogram(binwidth = 5, color = "black", fill = "lightblue") + scale_x_continuous(limit = c(0,100), breaks = seq(0,100, by = 5)) ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-3-1.svg" style="display: block; margin: auto;" /> --- ###.left[Grafikleri Bir Nesne Olarak Kaydetme] R'da yaptığımız bütün işlemler gibi grafik çizme işlemlerinin sonuçlarını da bir nesne olarak atama işlemi yaparak kaydedebiliyoruz. Yukarıda yarattığımız grafiği `plot` isimli nesneye kaydedelim. ```r plot <- ggplot(dda, aes(x=yaş)) + geom_histogram(binwidth = 5, color = "black", fill = "lightblue") + scale_x_continuous(limit = c(0,100), breaks = seq(0,100, by = 5)) ``` Grafik nesnesini kaydettikten sonra nesneyi çalıştırdığımız zaman R grafiği çizecektir. Aynı zamanda ggplot nesnelerine `+` işaretiyle yeni katmanlar ekleyebiliyoruz. ```r plot ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-5-1.svg" style="display: block; margin: auto;" /> --- ###.left[İsimler ve Etiketler (Labels)] Grafiklerdeki öğelerin (örn. eksenler) isimlerini; grafiğin başlığı ve altyazısı gibi öğeleri `xlab()`, `ylab()`, `labs()` gibi katmanlarla değiştiriyoruz. Burada `labs()` fonksiyonunu kullanalım. ```r plot_labeled <- plot + labs(title = "Katılımcıların Yaş Dağılımı", subtitle = "DDA 2018 Türkiye Verileri", x = "Katılımcıların Yaşı", y = "Frekans") ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-7-1.svg" style="display: block; margin: auto;" /> --- ### Grafik Temaları `theme` diye başlayan katmanlarla grafiğin genel görünümünü, rengini, ızgara görünümünü vesaire değiştirebiliyoruz. Burada arkaplanı beyaz yapıp ızgarayı tamamen kaldıran `theme_classic()` fonksiyonunu kullanacağız. ```r plot_labeled + theme_classic() ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-8-1.svg" style="display: block; margin: auto;" /> --- ###.left[Grafikleri Tek Değişkene Göre Panellere Bölme] Grafikleri `facet_grid()` ve `facet_wrap()` ile değişkenlerin değerlerine göre farklı panellere göre ayırabiliyoruz. Diyelim cinsiyetlere göre katılımcıların yaş dağılımlarını karşılaştırmak istiyoruz. ```r plot_labeled + theme_classic() + facet_grid(cinsiyet ~ .) ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-9-1.svg" style="display: block; margin: auto;" /> --- ###.left[Grafikleri Birden Fazla Değişkene Göre Panellere Bölme] Aynı zamanda birden fazla değişkene göre de grafikleri panellere bölmek mümkündür. `facet_grid()` fonksiyonun içerisi öğe seçerken yaptığımız gibi satır sütun mantığına göre yapılandırılmıştır. `facet_grid(satır, sütun)` şeklinde. Örneğin grafik panellerinin satırlarında `mutluluk`, sütunlarında ise `cinsiyet` değişkeninin olmasını istiyoruz. ```r plot_labeled + theme_classic() + facet_grid(mutluluk ~ cinsiyet) ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-10-1.svg" style="display: block; margin: auto;" /> --- ###.left[Grafiklere Ek Geometrik Katmanlar Ekleme] Grafikleri çizmek için tek bir geometrik katman yeterli olsa da istenildiği takdirde birden fazla geometrik katman da eklenebilir. `geom_abline`, `geom_hline` ve `geom_vline` gibi katmanlarla grafiğe yatay, dikey veya diyagonal çizgiler ekleyebiliyoruz. Diyelim histogram grafiğimize dikey bir yaş ortalaması çizgisi çekmek istiyoruz. ```r plot_labeled + theme_classic() + geom_vline(aes(xintercept = mean(yaş)), linetype = "dashed", color = "red") ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-11-1.svg" style="display: block; margin: auto;" /> .footnote[**Dikkat!** `mean(yaş)` ile yaptığımız gibi grafik öğeleriyle veri arasında bir ilişki kurmak veya eşleşme (*mapping*) yapmak istiyorsak bunu her zaman `aes()` fonksiyonu içerisinde yapıyoruz. ] --- ###.left[Diğer Tidyverse Fonksiyonlarıyla Birlikte Kullanım] `ggplot2` Tidyverse paketlerinin arasında olduğu için pipe operatörüyle `%>%` ve diğer Tidyverse fonksiyonlarıyla uyumlu şekilde çalışır. Bunun anlamı `%>%` kullandığımız takdirde `ggplot()` fonksiyonunun içerisine veri setinin ismini girmek zorunda olmayışımız ve grafiği çizmeye başlamadan önce çeşitli veri manipülasyonu işlemleri yapabiliyor oluşumuzdur. Örneğin sadece kadınların yaş dağılımını bir histogram grafiğiyle filtreleme işlemi yaptıktan sonra görselleştirebiliriz. ```r dda %>% filter(cinsiyet == "Kadın") %>% ggplot(aes(x=yaş)) + geom_histogram() ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-12-1.svg" style="display: block; margin: auto;" /> --- class:inverse # Temel Grafik Türleri * 1.Histogram Grafikleri (`geom_histogram()`) * 2.Çubuk Grafikleri (`geom_bar()` ve `geom_col()`) * 3.Kutu Grafikleri (`geom_boxplot()`) * 4.Nokta veya Saçılım Grafikleri (`geom_point()`) * 5.Çizgi Grafikleri (`geom_line()`) --- ###.left[1-Histogram Grafikleri: `geom_histogram()`] Sayısal bir değişkenin her bir değerinde kaç gözlem olduğunu görmek istiyorsak, bunu histogram grafiği ile yapıyoruz. Histogram grafiğinde, `x` sayısal bir değişkendir, `y` boş bırakılır. Çünkü `y`, veri setindeki bir değişkeni değil, `x` ekseninde bulunan değişkenin her bir değerinin gözlem sayısını (frequency) ifade eder. Yukarıdaki üzerinde çalıştığımız grafik histogram tipi bir grafikti. ```r plot_labeled ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-13-1.svg" style="display: block; margin: auto;" /> --- ###.left[2-Çubuk Grafikleri: `geom_bar()`] Bar charts veya çubuk grafikleri kategorik bir değişkenin seviyelerini x eksenine alarak, bu seviyelerdeki gözlem sayısını (frekans) veya başka parametrelerdeki istatistiklerini görselleştirir. Histogramlarda x eksenindeki değişken sayısal iken çubuk grafiklerinde kategoriktir (karakter veya faktör). `geom-bar()` kullanılırken `geom_histogram()` için olduğu gibi `y` ekseni boş bırakılır çünkü gözlem sayıları (frekans) otomatik olarak hesaplanır. Araştırma sorusu: Katılımcıların parti tercihlerinin sayısal dağılımı nasıldır? ```r dda %>% ggplot(aes(x = parti_tercihi)) + geom_bar() ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-14-1.svg" style="display: block; margin: auto;" /> --- ###.left[2-Çubukları büyükten küçüğe sıralama: `fct_infreq()`] Bu tarz grafiklerde genelde çubuklar büyükten küçüğe sıralanır. Bunu yapmak için faktör seviyelerini gözlem sayılarına göre sıralayan `fct_infreq()` fonksiyonunu kullanıyoruz. Bunu yaparken `aes()` fonksiyonun içerisinde x eksenindeki değişkenin `fct_infreq()` ile sıralanmış hali olacağını belirtiyoruz. ```r dda %>% ggplot(aes(x = fct_infreq(parti_tercihi))) + geom_bar() ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-15-1.svg" style="display: block; margin: auto;" /> --- ###.left[2-Çubuk Grafikleri:`geom_col()`] `geom_col()` yine çubuk grafikleri çizmek için kullanılır ancak `geom_bar()`dan farklı bir işleyişe sahiptir. `geom_col()`, `y` eksenini otomatik olarak frekans hesaplayarak doldurmaz; dolayısıyla `y` ekseni boş bırakılmak yerine spesifik bir değişkenle eşleştirilir. Bu sayede örneğin `y` ekseni sıklık yerine yüzdelik oranlar gibi başka parametlerle eşleştirilebilir. Ancak bunu yapmak için önce `fct_count()`, `count()` veya `summarize` gibi fonksiyonlarla özetleme işlemleri yapılmalıdır. ```r dda %>% count(parti_tercihi, sort = T) %>% mutate(percent = n/sum(n) * 100) %>% ggplot(aes(x = fct_reorder(parti_tercihi, -n), y= percent)) + geom_col() + geom_text(aes(label= n, vjust = -0.2)) ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-16-1.svg" style="display: block; margin: auto;" /> --- ###.left[Önceki Grafikte Ne Yaptık?] İlk başta `count()` fonksiyonuyla gözlem sayısı hesaplayarak veriyi özetledik. ```r dda %>% count(parti_tercihi, sort = T) ``` Ardından (`%>%`) `mutate()` fonksiyonuyla yeni bir yüzdelik oran değişkeni yarattık. ```r mutate(percent = n/sum(n) * 100) ``` Ardından (`%>%`) `ggplot()` fonksiyonuyla grafiği başlattık. `x` eksenini `fct_reorder()` fonksiyonuyla `n` değişkenine göre sıraladığımız `parti_tercihi` değişkeniyle, `y` eksenini ise mutate ile yarattığımız `percent` değişkeniyle eşleştirdik. ```r ggplot(aes(x = fct_reorder(parti_tercihi, -n), y= percent)) ``` Son olarak (`+`) `geom_col()` ile bir çubuk grafiği istediğimizi belirttik ve sonrasında `+` ile her çubuğun üstüne gözlem sayısını (`n`) yazan `geom_text()` katmanını ekledik. ```r geom_col() + geom_text(aes(label= n, vjust = -0.2)) ``` --- ###.left[3-Kutu Grafikleri: `geom_boxplot()`] Sayısal bir değişkeni (y ekseni), kategorik veya discrete olan başka bir değişkenin seviyeleri (x ekseni) bakımından karşılaştırmalı olarak incelemek için, boxplot kullanıyoruz. Bu grafiklerde default olarak kutucuğun alt çizgisi (alt çeyrek - lower quartile), ilk %25'lik dilimin üst sınırını, ortadaki çizgisi, ilk %50'lik dilimin üst sınırını (yani ortanca-medyanı), üst çizgi (3. çeyrek, upper quartile) ise ilk %75'lik dilimin üst sınırını verir. Noktalar *outlier* diye geçer ve diğer değerlerden aşırı derecede sapan uç değerlerdir. DDA verilerinde siyasete ilgi ile yaş arasındaki ilişkiye bakalım. Grafikten siyasete çok ilgi duyanların yaşlarının orta yaş aralığında (18-65) anlaşılıyor. ```r dda %>% filter(!siyasete_ilgi %in% c("CY","FY", -5)) %>% ggplot(aes(x= siyasete_ilgi, y=yaş)) + geom_boxplot() ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-21-1.svg" style="display: block; margin: auto;" /> --- ###.left[4-Nokta veya Saçılım Grafikleri: `geom_point()`] Eğer iki sayısal değişken arasındaki ilişkileri incelemek istiyorsanız. Nokta veya saçılım grafiklerini (scatterplot) kullanıyoruz. Daha önce görmüş olduğumuz `flights` verisetinde, uçakların kalkıştaki gecikme süreleri ile inişteki gece süreleri arasında bir ilişki olup olmadığını inceleyelim. ```r library(nycflights13) flights %>% na.omit() %>% sample_n(10000) %>% ggplot(aes(x=dep_delay, y=arr_delay)) + geom_point() ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-22-1.svg" style="display: block; margin: auto;" /> Grafikten görüldüğü kadarıyla ve sağduyunun bize söylediği gibi kalkış gecikmesiyle iniş gecikmesi arasında doğru orantılı bir ilişki görüyoruz. Noktaların sol alt tarafta toplanması bize çoğu uçuşun gecikme yaşamadığını göstermektedir. --- ###.left[4-Farklı bir Örnek] DDA anketinde katılımcıların siyasi görüş çizgisi (sol-sağ) ile ülkenin ne derece demokratik yönetildiğine dair algı seviyeleri arasındaki ilişkiye bakalım. Ancak değişkenler kalkış ve iniş gecikmesi gibi tam sayısal bir değişken olmayıp 1-10 arasında değer alan sıralı (ordinal) bir değişen olduklarından, noktaları gözlem sayısına göre boyutlandıracağız. ```r dda %>% filter(siyasi_çizgi > 0 & demokratik_yönetim > 0) %>% ggplot(aes(siyasi_çizgi, demokratik_yönetim)) + geom_count(aes(size = ..n..)) ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-23-1.svg" style="display: block; margin: auto;" /> Büyük noktaların grafiğin sağ üst köşesinde toplanmış olması, kendilerini en fazla sağcı olarak tanımlayan katılımcıların Türkiye'nin demokratik olarak yönetildiğini düşündüklerine işaret etmektedir. --- ###.left[4-Alternatif bir grafik türü: Isı grafikleri (`geom_tile()`)] Bu tarz sıralı sayısal değişkenler arasındaki ilişkileri incelemek için daha iyi bir grafik türü ısı grafikleridir. Yukarıda yaptığımızın aynısını bir de ısı grafiği olarak görselleştirelim. ```r dda %>% filter(siyasi_çizgi > 0 & demokratik_yönetim > 0) %>% count(siyasi_çizgi, demokratik_yönetim) %>% ggplot(aes(siyasi_çizgi, demokratik_yönetim, fill = n)) + geom_tile() + scale_fill_gradient(low = "yellow", high = "red") ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-24-1.svg" style="display: block; margin: auto;" /> --- ###.left[5-Çizgi Grafikleri: `geom_line()`] Çizgi grafikleri, bir değişkenin ayrıksı (discrete) olan sayısal değerlerinin, y eksenindeki değerlerle olan ilişkisini görselleştirmek için kullanılır. Genelde zaman grafiklerinde kullanılır. Bu grafiklerde `x` ekseni zamansal bir değişken (yıl, tarih, saat vb.), `y` ekseni ise sayısal bir değişkendir. `dslabs` paketinin `gapminder` veri setini kullanarak 1960'lardan günümüze ülkelerin kişi başı gayri safhi milli hasılalarının (gdpc = gpd/population) değişimini tarihsel olarak karşılaştıralım. ```r library(dslabs) gapminder %>% filter(country %in% c("Turkey", "Germany", "Japan", "Greece", "Bulgaria")) %>% mutate(gdpc = gdp / population) %>% ggplot(aes(x = year, y = gdpc, color = country)) + geom_line(size = 1) ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-25-1.svg" style="display: block; margin: auto;" /> --- ###.left[Önemli bir Not: Veriyi Gruplandırmak] Yukarıdaki grafikte `ggplot()` fonksiyonunda `aes()` içerisinde `color` ile `country` değişkenini eşleştirdik (*map*). Bu sayede her ülkeye farklı bir çizgi rengi vererek veriyi gruplandırmış olduk. `color` gruplandırma yapabileceğimiz tek argüman değildir, `by` ve `group` gibi argümanlar da bazen gruplandırma için kullanılır. Bu tarz bir gruplandırma yapmasaydık aşağıda görüldüğü gibi grafik anlamsız olacaktı. ```r gapminder %>% filter(country %in% c("Turkey", "Germany", "Japan", "Greece", "Bulgaria")) %>% mutate(gdpc = gdp / population) %>% ggplot(aes(x = year, y = gdpc)) + geom_line(size = 1) ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-26-1.svg" style="display: block; margin: auto;" /> --- ###.left[Farklı Grafik Türlerini (`geom`) Kombine Etmek] Bir grafikte her zaman tek bir grafik türü (geom) kullanmak zorunda değiliz. Birden fazla grafik tipi de bazen birlikte kullanılır. Mesela aşağıda yaptığımız gibi sıkça çizgi grafikleriyle nokta grafikleri birarada kullanılır. Burada `flights` veri setinde aya göre ortalama gecikme sürelerini görselleştirdiğimiz çizgi grafiğini nokta grafiğiyle birleştirdik. ```r flights %>% na.omit() %>% group_by(month) %>% summarize(ortalama_gecikme= mean(dep_delay)) %>% ggplot(aes(month, ortalama_gecikme)) + geom_line() + geom_point() + scale_x_continuous(breaks= 1:12) ``` <img src="data:image/png;base64,#ders_5_files/figure-html/unnamed-chunk-27-1.svg" style="display: block; margin: auto;" /> --- class: inverse ## Kitap Önerisi .pull-left[  ] .pull-right[ * Teknik Alanlardan Gelmeyen Sosyal Bilimcilere Yönelik * Anlaşılır ve akıcı dil * `ggplot2`, ve `tidyverse` kullanıyor * [Bedava Online Versiyon!](https://socviz.co/) * PDF hali de internette ulaşılabilir ]