1. Kaynaklardan Ogrenme

Üçüncü ödevimiz kapsamında ilk olarak bizlerden sunulan üç kaynaktan önemli bulduğumuz noktalara yönelik yerleri not almamız istenmiştir. Bu kapsamda ilk olarak “Hafta 3: Görselleştirme Notları” ve “Openintro” kapsamındaki belgeleri incelemiş bulunmaktayım. Bu belge kapsamında dikkatimi çeken noktaların birçoğuna haftalık “RMarkdown Öğrenme Günlüğü” bölümünde de değinmiş bulunmaktayım. Bu kaynakta yer alan distinct() fonksiyonu özellikle ilgimi çekmiştir. Bir veri setindeki değişkenleri hatırlama veya görüntüleme açısından kolaylık sağlaması nedeniyle bu fonksiyonu önemli bulmaktayım. Ayrıca, kontenjans tablosu yani grupların eşleştirildiği tablo oluşturulma sürecinde count(a,b)fonksiyonun işlevinin önemli olduğunu gözlemledim.

“Hafta 3: Görselleştirme Notları” kaynağı kapsamında ayrıca bir sette bulunan değişkenlerin türünün saptanması ve değişken türünün saptanmasına yönelik uygulamanın gelecek uygulamalarda önem arz ettiğini düşündüm. Bu doğrutluda sjlabelled ve dplyr kütüphanesinde bulunan mutate(acroos(where(değişken türü), değiştirilecek tür)) yapısıyla birlikte değişikenlerde değişiklik yapılabileceğini öğrendim. Ayrıca veri setindeki kayıp yapıların çıkartılması için derste öğrendiğimiz na.omit() dışında droplevels() fonksiyonuyla kullanılmayan faktörlerin silinmesinde kullanıldığını da öğrendim.Bunun dışında, theme(legend.position = "") ile lejant pozisyonu ayarlanmaktadır.

Bu kaynak kapsamında, grafikler açısından özellikle bazı fonksiyonların veriyi görselleştirme sürecinde önemli olduğunu düşündüm. Örneğin, geom_bar(position = "dodge") fonksiyonu çubukların yan yana gösterilmesini sağlayarak ve alpha = 0-1 yapısıyla görsel yoğunluk ayarlamasıyla verinin okunabilirliğini artırmaktadır. labs(x = "ad") fonksiyonu eksenleri isimlendirme açısından, pivot_wider(id_cols = , names_from = , values_from = ) fonksiyonu ise veri tablosunu daha kolay okunabilir hale getirme açısından önemli olduğunu düşündüğüm yapılardır. Ayrıca, geom_bar(position = "fill") fonksiyonu gruplar arasında oransal karşılaştırmalar yapma açısından, geom_bar(fill = "renk") fonksiyonu çubukların rengini ayarlama açısından ve facet_wrap(~ değişken_adı) ve facet_grid(değişken adı ~ değişken_adı, labeller = label_both) fonksiyonu gruplara göre ayrı grafikler oluşturarak farkları detaylı inceleme açısından önemli olduğunu düşündüğüm fonksiyonlardır.

Pasta grafiği ise bu kaynakta öğrendiğim yeni bilgilerdendir.Burada verilerin aktarılması sürecinde yüzdelik görünümlerin pasta grafiğine aktarılmasında label = scales::percent(prop, accuracy = 1) fonksiyonunun mutate içinde verilmesiyle birlikte sağlanabileceğini gözlemledim. Ayrıca pasta grafiği oluştulurken aes fonksiyonu içerisinde xdeğerinin boş bırakılmasının önemli bir detay olduğunu düşünmekteyim.

Pasta grafiğinin oluşturulması sürecinde ise doğrudan bir fonksiyon bulunmadığını, bu nedenle öncelikle geom_col(width = 1) fonksiyonu ile sütun grafiğinin oluşturulduğunu ve ardından coord_polar("y") ifadesiyle bu yapının pasta grafiğine dönüştürüldüğünü öğrendim. Ayrıca, bu şekilde oluşturulan bir pasta grafiğinin etkileşimli hale getirilmesinde plotly() kütüphanesinin önemli bir rol oynadığını fark ettim. Bu süreçte, grafiğin oluşturulmasında data = "veri seti adı", labels = ~başlıklandırma yapısı, values = ~kullanılacak değerler, type = "grafik türü", text = ve textinfo = gibi parametrelerin kullanılarak etkileşimli grafik üzerinde çeşitli bilgilerin sunulabildiğini anladım. Son olarak, veri türünü doğru ayarlamak ve forcats paketindeki fct_relevel() fonksiyonunu kullanarak faktör seviyelerinin sıralamasını değiştirebilmek önemliymiş.

Pasta grafiği dışında, sayısal verilerin görselleştirilmesinde nokta grafiğinin kullanışlı olduğunu öğrendim. Bu grafik histograma benzemekle birlikte yalnızca x ekseni tanımlanmakta ve geom_dotplot(dotsize = ) fonksiyonu ile oluşturulmaktadır. Ayrıca, veri sayısının fazla olduğu durumlarda, grafik oluşturulmadan önce sample_n(veri seti, belirli_sayı) fonksiyonu kullanılarak rastgele bir alt örnek alınması sağlanabilirmiş; bu sayede de veriler daha kolay incelenebilir.Bu grafik türlerine ek olarak, histogram grafiği de daha önce öğrendiğim bir yapı olarak dikkatimi çekti. Bu grafikte veri sürekliliğinin geom_histogram(binwidth = değer) ile ayarlanabildiğini ve veri dağılımının sıklığını gözlemlemek açısından önemli bir araç olduğunu fark ettim. Bindwith ve bin değeri arttıkça da daha okunaklı bir yapı oluştuğuun düşünmekteyim.

Bölümde yoğunluk grafiği yapısı da ele alınmıştır. Bu yapının büyük örneklemlerde işlevli olacağını öğrenmekle birlikte geom_density(bw= bant değeri ata) fonksiyonuyla oluşturulduğunu öğrendim (Bu değer azaldıkça daha küçük değerler açık veriliyor diye düşündüm.). Ayrıca ggridges paketindeki geom_density_ridges() birlikte de verilerin üst üste binmesini engelleyecek bir grafik yapısı elde edilebilirmiş. Ayrıca ggridges kapsamında ele alınacak değişkenlerin as.factor tanımlamasının yapılmasına dikkat edilmelmesi gerekiyormuş. Bunun yanı sıra, uç değer, medyan gibi çeşitli yapıları rahatça saptayabileceğimiz kutu grafiğinin ise geom_boxplot() fonksiyonuyla y temelli oluşturulduğunu öğrendim (Çeyreklere göre değerlendirme de önemlidir.). Bu yapıda saptanan uç değerleri çıkartmak için ise filtreleme işlemi kullanılması uygunmuş. Son olarak geom_text() ve ylab() fonksiyonunun kullanımı anlamadığımı söyleyebilirim.

Yukarıda ele aldığım yapılar yanı sıra “Openintro” belgesinde ek olarak çeşitli fonksiyonlara değinilmiştir. round() fonksiyonu ile elde edilen sayıların yuvarlama işleminin gerçekleştiğini,mean(),median(),mod(),var(),sd(),quantile(ele alınacak yapı, çeyrek değeri), IQR() ile temel istatistiklerin saptanabileceği ve if_else(değerler,"","") ile çeşitli kararlar ele alınmıştır.Ayrıca, ranjın ise elle kendi formullendirmemiz ile olacağını öğrendim.log() fonksiyonunun ise tam olarak nasıl çevirme işlemi yaptığını anlamadım.! ile de istenmeyen veri belirtilir. Bunun yanı sıra, “mutate(has_image = image == 1)” fonksiyonunda birden çok yapının olması durumunun temel mantığını anlayamadım.

Üçüncü kaynağımız olan EPODDER kütüphanesindeki kitapla birlikte ise normalde bildiğim fonksiyonların alt dallarını da öğrenmiş bulunmaktayım. Öncelikle devtool yapısıyla birlikte tuev paketini bulamadım. Bununla birlikte install kısmında da bu pakete erişemediğimden dolayı setleri kendim indirip aktardım. Kitap kapsamında ilk olarak pipe operatörünün magittr paketi içerisinde bulunduğunu öğrendim ve paket içeriğinden pipe operatörünün farklı bir kullanımı olup olmadığını inceledim. Bunun yanı sıra kitap kapsamıda head(),filter() <-,pipe(), ==,<=, ! gibi operatörlere yönelik denemeler yaptım.İstenmesi halinde hazırladığım dosyayıda yükleyebilirim.

Kitap kapsamında | işaretinin veya anlamına geldiğini öğrendim. Bu yapının özellikle ikili seçimlerde önemli olduğunu düşünmekteyim. Bunun yanı sıra select() fonksiyonu içerisindeki starts_with(), num_range() gibi fonksiyonlar üzerinde çalıştım. Ancak contain() ve matches() arasındaki farkı tam olarak anlayamadım. Her ikiside belirli yapıları aradığımızda önemli bir işleve sahiptir. arrange() ve desc() fonksiyonlarında ise tekrardan bir hatırlama süreci gerçekleştirdim. select() fonksiyonunda ise rename() benzerinde isim değişikliği işlevinin yapıldığını bilmiyordum. Bu yapıyla birlikte kod açısından tasarruf sağlanacağını düşünmekteyim. Bu duruma benzer olarak da mutate() fonksiyonu içerisinde .before= ve .after= yapılarının eklenmesiyle birlikte relocate() benzeri işlevin gerçekleştirildiğini öğrendim. Bu durumunda kod açısından tasarruf sağlayacağını düşünmekteyim.

Dikkatimi en çok çeken fonksiyonlardan biri ise transmute() fonksiyonu oldu. Karmaşık veri setlerinde yeni oluşturduğumuz sütunlar ile bir daha ele almayacaklarımız arsındaki ilişkinin saptanması açısından önemli bir değeri olduğunu düşünmekteyim. Bununla birlikte mutate fonskiyonu kapsamında if_else,case_when denemeleri de yapmış bulunmaktayım. count() fonksiyonu kapsamında ise sort=TRUE kullanımını öğrendim. Bu yapıyla birlikte gruplar arası karşılaştırma yapmada veri sayısını saptama açısından önemli bir işlevi olduğunu düşündüm.

summarise() kapsamında ise min,max,var,diff(range()) gibi fonksiyonları denedim, buna karşın n_distinct() fonksiyonunun işlevini tam olarak anlamadım. Ayrıca summarise() kapsamında summarise(across(c(değişkenler), yapılacak işlem, .names=)) ve summarise_at(vars(değişkenler),list(~işlem)) ile de birden çok değişkene yönelik işlemleri gerçekleştirebileceğimiz anladım. İşlem yapma açısından tek kodla çalışmayı sağladığından dolayı önemli olduğunu düşündüm. Tüm değişkenler için ise everything() ile yapılmaktadır.

join() fonksiyonunun ise iki farklı veri setini bir araya getirmekte işlevli olduğunu öğrendim. Bu kapsamda her birinin görevi farklı olmak üzere left_join(), right_join(), full_join(), inner_join(), semi_join(), anti_join() fonksiyonlarının kullanıldığını öğrendim. Bu fonksiyonu kullanırken merak duygumun arttığını düşünmekteyim. Özellikle neden genel olarak A seti temelli bir yapı olduğunu merak ettim. Bu fonksiyon yanı sıra min,max gibi temel istatistik değerlerine yönelikte denemeler yaptım. Bu kısımda özellikle summary()ve describe() fonksiyonları ilgimi çekti. Değerleri tek tek saptamak yerine toplu bir şekilde incelemeye imkan tanıyormuş.

Veri inceleme açısından son olarak birden çok sütunu tekte birleştiren gather() ve bu birleştirmeyi dağıtan spread() fonksiyonlarını denedim. Ayrıca seperate(değişken, bölünecek adlar, "MA") fonksiyonun bir sütunu birden çok sutuna ayirdığını, unite(değişken, alt dğeikenler, setp ="_") fonksiyonunu ise tam tersi şekilde bölünmüşleri birleştirdiğini öğrendim.

Veri görselleştirme sürecinde genel olarak önceden bildiğim yapı ve fonksiyonlarla karşılaştım. Bununla birlikte, çeşitli alt fonksiyonlar hakkında yeni bilgiler de edindim. Örneğin, facet_grid() ve facet_wrap() fonksiyonlarının çoklu grafik oluşturmak için kullanıldığını, geom_point() ve diğer geom_ türlerinin ise color = "renk", size =, shape = "", position = "", alpha = gibi parametrelerle özelleştirilebildiğini yeniden hatırladım. Ayrıca geom_text(aes(label = "değişken")) fonksiyonu ile veri noktalarına etiket eklenebildiğini öğrendim.Bunun yanı sıra, scale_x_continuous() ve scale_y_continuous() fonksiyonlarının limits = c(), breaks = seq(),by =, expand = gibi argümanlar aracılığıyla eksen aralıklarını, eksen üzerindeki artış değerlerini ve boşluk ayarlarını düzenlemeye olanak sağladığını gördüm. Son olarak, scale_color(), scale_fill("değişken",values(c("renk"))) ve scale_shape() fonksiyonları ile grafiğin renk, dolgu ve şekil özelliklerinin ayarlanabildiğini öğrendim. Bu yapılarla birlikte bir grafiğin daha okunaklı hale geleceğini düşünmekteyim.Ayrıca, regresoyn eğrisi bazında da stat_regline_equation() ile eğrinin şekillendirilebieceğini ve daha detaylı bir görünüm elde edeceğimizi düşündüm.

Son olarak, plotly paketi kapsamında etkileşimli grafik ve tablolar oluşturma sürecini öğrendim. Bu süreçte, analiz edeceğimiz değişkenleri group_split fonksiyonu ile gruplara ayırmanın ve her grubun türüne göre anlamlı biçimde adlandırmanın önemli olduğunu fark ettim. Örneğin, OD_1 <- density(data[1][[1]]$ODOKUMA1, na.rm = TRUE) kodu üzerinden, verilerin yoğunluk dağılımını elde etme sürecini deneyimledim. Bu aşamadan sonra, add_lines fonksiyonu kullanılarak yoğunluk grafiği üzerinde x ve y eksenlerine uygun değişken atamaları yapılmakta, grafik başlıkları ve dolgu (fill) özellikleri belirlenmektedir. Son olarak, layout(xaxis=, yaxis=) yapısı aracılığıyla eksen adlandırmalarının düzenlenebildiğini ve bu sayede grafiğin okunabilirliğinin artırıldığını öğrendim. Bu uygulama, veri görselleştirmede hem teknik becerimi geliştirmeme hem de etkileşimli grafiklerin dinamik yapısını daha iyi kavramama katkı sağladı. Ayrıca yoğunluk grafiğinde olduğu gibi, diğer grafik türlerinde de plot_ly(x=, y=, color=) ile temel yapı kurulduğunu, add_grafikturu() (örneğin add_bars, add_lines) ile grafik türünün belirlendiğini ve layout(xaxis= list(title=), yaxis= list(title=)) ile eksen adlarının düzenlendiğini öğrendim. Bu sayede farklı grafik türlerinin ortak bir mantıkla oluşturulabildiğini fark ettim.

2. Uygulama Görevi: Kendi Grafiklerinizi Oluşturun

2.1.Veri seçimi

2.1.1. Veri Paketi

Ödev kapsamında 2013 yılında New York City(NYC) çıkışlı uçuşlara yönelik detaylı bilgileri içeren nycflights13 veri seti tercih edilmiştir. Bu veri setinin uçuş gecikmeleri, havaalanı performansı, zaman serisi gibi yapıların analizlerinde kullanılabileceği söylenebilir. Bu veri seti nycflights13 paketi içerisindeki flights yapısıyla birlikte RMarkdown’a aktarılmıştır.

2.1.2.Paketleri Aktif Etme

İlk olarak install.packpages() fonksiyonu ile veri setinin içerisinde bulunduğu nycflight13 paketi yüklenmiştir. Ardından süreçte kullanılması planlanan dplyr, ggplot2, tidyverse ve nycflights13 paketleri library() komutu ile aktif edilmiştir.

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(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.1     ✔ readr     2.1.5
## ✔ ggplot2   4.0.0     ✔ stringr   1.5.2
## ✔ lubridate 1.9.4     ✔ tibble    3.3.0
## ✔ purrr     1.1.0     ✔ tidyr     1.3.1
## ── 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(tidyr)
library(ggplot2)
library(nycflights13)

2.1.3. Veri Paketlerini Aktarma

Paketlerin aktif edilmesinin ardından nycflights13 içerisindeki flights seti data() fonksiyonuyla birlikte ucus veri seti olarak aktarılmıştır.

data(flights)
ucus <- flights

2.1.4. Veri Setinin Genel Yapısı

Veri setinin yüklenmesinin ardından veri setinde kaç değişken ve kaç gözlem olduğunun saptanması amacıyla dim() fonksiyonu, veri setindeki değişkenlere genel bir bakış için ise glimpse() fonksiyonları kullanılmıştır. Gerçekleştirilen bu süreç doğrultusunda veri setinin 336776 gözlem ve 19 değişkenle birlikte oluşturulduğu gözlemlenmiştir. Bu değişkenlere year, month, day, dep_time, flight, arr_time gibi yapılar örnek verilebilmekle birlikte bu değişkenler bazıları kategorik yapıda iken bazıları sayısal bir yapıdadır. Sayısal yapılara distance air_time, kategorik değişkenlere ise carrier, origin değişkenleri örnek verilebilir.

dim(ucus)
## [1] 336776     19
glimpse(ucus)
## Rows: 336,776
## Columns: 19
## $ year           <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2…
## $ month          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ day            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ dep_time       <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558, 558, …
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600, 600, …
## $ dep_delay      <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2, -2, -1…
## $ arr_time       <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 753, 849,…
## $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 745, 851,…
## $ arr_delay      <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3, 7, -1…
## $ carrier        <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", "B6", "…
## $ flight         <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79, 301, 4…
## $ tailnum        <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN", "N394…
## $ origin         <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR", "LGA",…
## $ dest           <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL", "IAD",…
## $ air_time       <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138, 149, 1…
## $ distance       <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944, 733, …
## $ hour           <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6…
## $ minute         <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0…
## $ time_hour      <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-01 0…

2.1.5. Veri Setinin Degisken Adlarini Guncelleme

Değişken yapılarının saptanmasının ardından veri setinin daha rahat kullanımı amacıyla rename() fonksiyonuyla birikte değişkenler Türkçeleştirilmiştir. Setteki değişkenlerin Türkçeleştirilmesinin ardından colnames() fonksiyonu ile düzenlemeler kontrol edilmiştir.

Bu veri setinde, yil, gun, ay değişkenleri 2013 yılında New York City’den kalkışlı uçuşların gün/ay/yıl cinsinden ifadesini bizlere sunmaktadır.Bunun yanı sıra, kalkis_saati ve planlanan_kalkis degiskenleri ucagin gerçek ve plananan kalkış saatlerini dakika cinsinden ifade ederken, kalkis_gecikmesi kalkışın planlanan zamana göre gecikme süresini dakikalar cinsinden vermektedir. varis_saati, varis_gecikmesi ve planlanan_varis degiskenleri ise uçusun gecikme verilerini bizlere sunmaktadır. Ayrıca hava_yolu değişkeni havayolu firmasını, ucak_no ucagin tescil numarasını, kalkis_havaalani ve varis_havaalani ise kalkış varış havalimanlarını temsil etmektedir. Uçağın havada geçirdiği süre havada_sure, uçuş mesafesi ise mesafe değişkeninde mil cinsinden yer almaktadır. Ayrıca, saat ve dakika değişkenleri kalkış saatinin saat ve dakika kısmını gösterirken, saat_tarih değişkeni uçuşun tam tarih ve saat bilgisini sunmaktadır. Tüm bu değişkenlerin adlarının düzenlenmesi aşamasında değişkenlerin işlevleri göz önünde bulundurulmuştur.

ucus_v1 <- ucus %>%
 rename(
    yil = year,
    ay = month,
    gun = day,
    kalkis_saati = dep_time,
    planlanan_kalkis = sched_dep_time,
    kalkis_gecikmesi = dep_delay,
    varis_saati = arr_time,
    planlanan_varis = sched_arr_time,
    varis_gecikmesi = arr_delay,
    hava_yolu = carrier,
    ucus_no = flight,
    ucak_no = tailnum,
    kalkis_havaalani = origin,
    varis_havaalani = dest,
    havada_sure = air_time,
    mesafe = distance,
    saat = hour,
    dakika = minute,
    saat_tarih = time_hour
  )
colnames(ucus_v1)
##  [1] "yil"              "ay"               "gun"              "kalkis_saati"    
##  [5] "planlanan_kalkis" "kalkis_gecikmesi" "varis_saati"      "planlanan_varis" 
##  [9] "varis_gecikmesi"  "hava_yolu"        "ucus_no"          "ucak_no"         
## [13] "kalkis_havaalani" "varis_havaalani"  "havada_sure"      "mesafe"          
## [17] "saat"             "dakika"           "saat_tarih"

2.1.6. Kayıp Verileri Saptama ve Kayıp Verileri Temizleme

ucus_v1 kapsamındaki kayıp verileri saptamak amacıyla colSums(is.na()) fonksiyonu kullanılmıştır. Bu eksik verilerin yanı sıra setin boyutunun yeniden ele alınması için dim() fonksiyonu kullanılmıştır ve satır, sütun saptanmıştır. Bu doğrultuda kalkis_saati ve kalkis_gecikmesi için 8255, varis_gecikmesi ve havada_sure için 9430, ucak_no için 2512, varis_saati için 8713 veri eksik bulunmuştur.

colSums(is.na(ucus_v1))
##              yil               ay              gun     kalkis_saati 
##                0                0                0             8255 
## planlanan_kalkis kalkis_gecikmesi      varis_saati  planlanan_varis 
##                0             8255             8713                0 
##  varis_gecikmesi        hava_yolu          ucus_no          ucak_no 
##             9430                0                0             2512 
## kalkis_havaalani  varis_havaalani      havada_sure           mesafe 
##                0                0             9430                0 
##             saat           dakika       saat_tarih 
##                0                0                0

Eksik verilerin saptanmasının ardından veri setinde bulunan eksik verilerin silinmesi amacıyla na.omit() fonksiyonu kullanılmıştır. Bu silinme işlemi sonrasında boyutların saptanması amacıyla dim() fonksiyonu kullanılarak satır, sütun saptanmıştır. Son olarak ucus_v1, ucus_v2 olarak tanımlanmıştır. Bu doğrultuda 327346 veri ve 19 değişken kalmıştır.

ucus_v2 <- na.omit(ucus_v1)
dim(ucus_v2)
## [1] 327346     19

2.2. Bes farklı grafik oluşturun

Ödev kapsamında dersler kapsamında öğrendiğimiz grafik türlerinden yola çıkarak beş farklı grafik oluşturulacaktır.

2.2.1. Dağılım Grafigi

Dağılım grafiği kapsamında kalkıs_gecikmesi ve varis_gecikmesi değişkenleri arasındaki ilişkiye bakılması amaçlanmaştır. Bu kapsamda veri sayısının fazla olmasından dolayı sample_n() fonksiyonu ile 100 gözlemlik bir örneklem oluşturulmuştur. Bu örneklerim oluştıurulması sürecinde AA ve UA havayollarından örneklem seçilmesi amacıyla filter() fonksiyonu kullanılmış olmakla birlikte set.seed() ile tekrar üretilebilirliğin sağlanması amaçlanmıştır.

Grafiğin oluşturulması sürecinde x eksenine kalkis_gecikmesi, y eksenine varis_gecikmesi atanmış olup, oluşan noktaların renklendirmesinin ise color fonksiyonuyla hava yolu olması sağlanmıştır. Ardından dağılım grafiğinin oluşturulması için geom_point() fonksiyonu kullanılmış olup, grafikteki noktların şeffaflığı alpha= ile 0.7 olarak ayarlanmıştır. Ayrıca geom_smooth() ile eğim saptanması amaçlanmıştır. Grafiğin temel yapısının hazırlanmasının ardından eksenlerin ve başlığın ayarlanması için labs() fonksiyonu kullanılmış olup, theme_minimal() ile grafiği teması minimal olarak seçilmiştir. Lejant konumu ise theme(legend.position = ile yapılmıştır. Son olarak geom_vline() fonksiyonuyla deneme amaçlı bir dikey çizgi oluşturulmuştur.Çizginin türü linetype ile kesikli, kalınlığı size ile 3 birim ve rengi color ile kırmızı olarak belirlenmiştir.

set.seed(1000)
ucus_ornekgrup <- ucus_v2 %>%
  filter(hava_yolu %in% c( "AA","UA")) %>%  
  sample_n(100)

ggplot(ucus_ornekgrup, aes(x = kalkis_gecikmesi, y = varis_gecikmesi, color= hava_yolu)) +
  geom_point(alpha = 0.7) +
   geom_smooth(method = "lm", se= TRUE)+
  labs(title = "Kalkış ve Varış Gecikmeleri Dağılımı",
       x = "Kalkış Gecikmesi (DK)",
       y = "Varış Gecikmesi (DK)")+
  theme_minimal()+
  geom_vline(xintercept = 0, linetype = "dashed", color = "red", size = 3)+
  theme(legend.position = "left")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'

2.2.2. Sütun Grafigi

Sütun grafiği kapsamında, veri sayısının fazla olmasına bağlı olarak dört farklı havayolu firması uçuş sayılarına yönelik sütun grafiği oluşturulmuştur. Bu grafiğin oluşturulması sürecinde filter() fonksiyonuyla birlikte AA, UA, B6 ve 9E firmaları seçilmiştir. Ardından n sayısının hesaplanması için count() fonksiyonu kullanılmıştır. Bu yapıların her biri ise yine ggplot içerisinde yapılmıştır. Bunun yanı sıra sütun grafiği oluşturmak için geom_col() fonksiyonu tercih edilmiş olup, fill= ile renk ayarlaması gerçekleştirilmiştir. Grafiğin genel teması için ise theme_dark() tercih edilmiş olup, labs() ile başlıklandırmalar gerçekleştirilmiştir.

ggplot(ucus_v2 %>%
         filter(hava_yolu %in% c("AA","UA","B6","9E")) %>% 
         count(hava_yolu),
       aes(x = hava_yolu, y = n, fill = hava_yolu)) +
  geom_col(fill ="pink") +
  theme_dark() +
  labs(title = "Dort Havayolu Firmasına Gore Ucus Sayısı",
       x = "Havayolu Firması",
       y = "Ucus Sayısı")

2.2.3. Kutu Grafigi

Kutu grafiği oluşturulması amacıyla dört farklı havayolu firmasına ait uçuşların mesafeleri, havalimanı bazında görselleştirilmiştir. Veri seçimi için filter() fonksiyonu kullanılarak belirli havalimanları ve havayolları süzülmüştür. Grafiğin oluşturulmasında ggplot() fonksiyonu kullanılmış ve aes() fonksiyonu ile x eksenine hava_yolu, y eksenine mesafe atanmıştır. Renklendirme, fill= argümanı ile havayolu değişkenine göre gerçekleştirilmiştir. Havalimanlarına göre sınıflandırma, facet_wrap(~) fonksiyonu aracılığıyla yapılmıştır. Grafiğin anlaşılabilirliğini artırmak amacıyla başlıklandırma için labs(), tema seçimi için theme_minimal(), lejant pozisyonunun düzenlenmesi için ise legend.position() fonksiyonları kullanılmıştır.

ggplot(ucus_v2 %>% filter(kalkis_havaalani %in% c("LGA","EWR"), hava_yolu %in% c("DL", "EV", "YV","UA")), 
       aes(x = hava_yolu, y = mesafe, fill = hava_yolu)) +
  geom_boxplot(alpha = 0.4) +
  facet_wrap(~kalkis_havaalani) +
  labs(title = "Havaalanına Gore Ucus Mesafeleri",
       x = "Hava Yolu",
       y = "Mesafe (mil)") +
  theme_minimal()+
  theme(legend.position = "right")

2.2.4. Yogunluk veya Histogram Grafigi

Bu çalışmada, histogram grafiği oluşturulmasına karar verdim. Histogramda, AA, UA ve B6 havayolu firmalarının yılın ilk iki ayında gerçekleştirdiği seferlerde, varış gecikmesi 10 dakikanın altında olan gözlemler görselleştirilmiştir. Görselleştirme sürecinde, ilgili yapıları seçmek amacıyla filter() fonksiyonu kullanılmış ve seçilen gözlemleri ucus_kucuk adı altında topladım. Grafiğin oluşturulmasında ise x eksenine varis_gecikmesini, renklendirme için ise fill argümanı aracılığıyla hava_yolu firmaları değişkenini atadım. Histogramın görselleştirilmesini geom_histogram() fonksiyonu ile gerçekleştirdim. Ayrıca çubuk genişliğin binwidth=, rengi color=, şeffaflığı alpha= yapılarıyla ayarladım. Aylara göre sınıflandırmayı ise facet_wrap() fonksiyonu ile, eksen ve başlıklandırmayı labs() ile, temayı theme_minimal() gerçekleştirdim. `

ucus_kucuk <- ucus_v2 %>%
  filter(hava_yolu %in% c("AA","UA","B6"), ay %in% 1:2, varis_gecikmesi < 10)

ggplot(ucus_kucuk, aes(x = varis_gecikmesi, fill = hava_yolu)) +
  geom_histogram(binwidth = 10, color = "black", alpha = 0.5) +
  facet_wrap(~ay) +
  labs(title = "İlk 2 Ayda 3 Havayolu Firmasının Kalkış Gecikmeleri",
       x = "Kalkış Gecikmesi (dakika)",
       y = "Ucus Sayısı",
       fill = "Hava Yolu") +
  theme_minimal()

2.2.5. Cizgi Grafigi

Bu çizgi grafiği kapsamında AA ve B6 firmalarının ocak ayındaki günlük sefer sayısının ele alınması amaçlanmıştır. Bu kapsamda veri sayısının fazla olmasından dolayı sample_n() fonksiyonu ile 100 gözlemlik bir örneklem oluşturulmuştur. Bu örneklerim oluştıurulması sürecinde AA ve B6 havayollarından örneklem seçilmesi ve Ocak ayının seçilmesi amacıyla filter() fonksiyonu kullanılmış olmakla birlikte set.seed() ile tekrar üretilebilirliğin sağlanması amaçlanmıştır. Örnek grubun oluşturulmasının ardından günlük olarak kaç verinin olduğunu saptamaya yönelik olarak ilk group_by() fonksiyonuyla birlitke firma ve gün sınıflaması, summarise() ile de toplam uçuş sayısı hesaplanmıştır. Grafiğin oluşturulması sürecinde x eksenine gün değişkeni, y eksenine ise sayi değişkeni atanmıştır. Renklendirme amacıyla ise hava_yolu değişkeni atanmıştır. Ardından çizgi grafiğine yönelik olarak geom_line() ve geom_point() fonksiyonlarının ataması sağlanmıştır. Son olarak grafiklerin iki farklı şekilde verilmesi için ise facet_wrap() ile hava yolu ataması gerçekleştirilmiştir.

set.seed(1001)
ucus_ornekgrup2 <- ucus_v2 %>%
  filter(hava_yolu %in% c( "AA", "B6"), ay %in% 1) %>%  
  sample_n(100)

ucus_gunluk <- ucus_ornekgrup2 %>% 
  group_by(hava_yolu, gun) %>% 
  summarise(sayi = n())
## `summarise()` has grouped output by 'hava_yolu'. You can override using the
## `.groups` argument.
ggplot(ucus_gunluk, aes(x=gun, y=sayi, color= hava_yolu))+
  geom_line()+
  geom_point()+
  facet_wrap(~hava_yolu)+
  labs(title = "İki Firmaya Yönelik Aylik Ucus",
       x="Gun",
       y="Ucus Sayisi")+
  theme_dark()

3.Yorum Ekleme

3.1. Birinci Grafige Yonelik Yorumlar

Bu grafik kapsamında uçuşlardaki kalkış gecikmesi ve varış gecikmesi arasındaki ilişkiyi ele almaya çalıştım. Genel bazda inceleme gerçekleştirildiğinde uçakların geç kalkma süresi arttıkça, varış süreleride o kadar geciktiği gözlenmektedir. Dağılım çizgisi incelendiğinde sol alttan sağ üste doğru gidilmesine bağlı olarak belirttiğim ilişki kapsamında pozitif bir ilişki gözlenmektedir.Havayolu firması bazında bakıldığında ise UA firmasının AA’ya göre daha fazla varış gecikmesi olduğu gözlenmektedir.

Belirttiğim ilişkinin gözlenmesinde dağılım grafiğinin önemli bir katkı sağladığını düşünmekteyim. Buna karşın sol alt köşede veri sayısının fazla olmasına bağlı olarak verilerin okunmasının kısmen zorladığını ifade edebilirim. Bu doğrultuda density plot kullanılabileceğini düşündüm.

3.2. İkinci Grafige Yonelik Yorumlar

Bu grafik kapsamında 9E, AA, B6 ile UA firmalarının yıllık uçuşlarının sayılarının saptanması ve bu firmaların uçuş sayılarının karşılaştırılması hedeflemiş bulunmaktayım. Elde ettiğim çizgi grafiği doğrultusunda, yıllık bazda en fazla uçuşu yaklaşık 58–59 bin sefer ile UA havayolu firmasının gerçekleştirdiği görülmektedir. Bunu 50–55 bin aralığındaki uçuş sayısıyla B6 firması, 32–33 bin civarındaki uçuş sayısıyla AA firması ve son olarak 17–18 bin civarındaki uçuş sayısıyla 9E firması takip etmektedir.

Grafiğin uçuş sayılarını karşılaştırmak için uygun olduğunu düşünmekle birlikte sütun grafiği yanı sıra uçuşların yüzdelik olarak ele alınması açısından pasta grafiğininde uygun olabileceğini düşünmekteyim.

3.3. Üçüncü Grafige Yonelik Yorumlar

Bu grafik kapsamında EWR ve LGA havalimanlarından kalkışı olan dört havayolu firmasının uçuş mesafelerini karşılaştırmayı amaçladım. Kutu grafiklerini incelediğimizde EWR havalimanından kalkan uçakların LGA’dan kalkan uçaklara göre daha uzun mesafelere gittiği gözlenmektedir. Bunu özel bazda incelediğimizde EWR havalimanından UA firmasına ait uçakların en uzak mesafelere gittiği gözlenmektedir.LGA havalimanında da UA firmasının daha uzun bir mesafe gittiğini ifade edebilirim. Ayrıca UA firmasının mesafe açısından en büyük çeşitliliğe sahip olduğunu da söyleyebiliriz.

Oluşturduğum bu grafiğin genel olarak medyan, çeyreklik gibi değerlerin görülmesi açısından önemli olduğunu düşünüyorum. Bunun yanı sıra, önceki haftalardaki ödevlerde denediğim keman grafiğinin bu yapıyı ele almak açısından daha açık bilgiler sunacağını düşünmekteyim.

3.4. Dördüncü Grafige Yonelik Yorumlar

Oluşturduğum bu histogram grafiği, Ocak ve Şubat aylarında gerçekleşen uçuşlar arasından, varışta en fazla 10 dakika geciken seferlerin kalkış gecikmelerini üç farklı havayolu firması (AA, B6 ve UA) için göstermektedir. Grafik, bu firmaların kısa gecikmeli uçuş performanslarını karşılaştırmalı olarak inceleme olanağı sunmaktadır. Histogram grafiğine göre uçakların çoğu belirtilen saatten erken kalkış gerçekleştirmiş. Özel bazda bakıldığında Ocak ve Şubat aylarında UA firmasının diğer iki firmaya göre daha erken kalkan yapıda olduğu gözlenmektedir.

Grafiğin genel olarak anlaşılır olduğunu düşünmekle birlikte yığılma duruma yönelik olarak çeşitli değişikliklerin uygulanabileceğini de düşünmekteyim. Bunun için yoğunluk grafiği tercih edilebilir.Bunun yanı sıra, oluşturduğum formu başka bir zamanda position= "dodge" ile de denemiş bulunmaktayım. Ancak, bana daha karışık bir şekilde gözüktü.

3.5. Besinci Grafige Yonelik Yorumlar

Bu çizgi grafiği, AA ve B6 havayolu firmalarının Ocak ayı boyunca gerçekleştirdikleri günlük uçuş sayılarını göstermektedir (100 veri üzerinden). Ay içerisinde değişimin gözlenmesi açısından bu yöntemin uygun olacağını düşündüm. Elde edilen buglular doğrultusunda B6 firmasının 6 uçuşla maksimum günlük uçuşu gösterdiği söylenebilir. Bunun yanı sıra, B6 firmasının uçuşlarının günlük bazda daha dalganan bir yapıda olduğu gözlenmektedir. Buna karşın, AA firmasında ise daha istikrarlı bir yapı gözlenmektedir.

Bu grafik türünün ele aldığım yapı için uygun olduğunu düşünmekteyim. İlk olarak üst üste çizgiler halinde bir yapı oluşturmuştum, ancak verileri okumakta zorlandığımı fark ettiğim de iki farklı grafik halinde sunmaya karar verdim. Ele aldığım bu yapının, çizgi grafiği yanı sıra, histogram ya da bar grafiğiyle de ele alınabileceğini düşünmekteyim.

4. RMarkdown Ögrenme Günlügüm (21.10.25)

Bu hafta gerçekleştirdiğimiz ders kapsamında öncelikle function(argüman_adı){işlem} yapısını kullanarak fonksiyon oluşturmayı öğrendim. Bu süreçte, fonksiyon içerisinde işlem yapılabilmesi için değer atamalarının genel olarak a <- c() biçiminde gerçekleştirildiğini fark ettim. Ayrıca, fonksiyon oluştururken function(x, argüman_adı = varsayılan_değer (örneğin, 2)) biçimiyle varsayılan default değer ataması yapılabileceğini öğrendim.

Fonksiyon oluşturmanın yanı sıra, rnorm(n) yapısını kullanarak ortalaması 0 ve standart sapması 1 olacak şekilde rastgele değerler üretilebileceğini öğrendim. Bu fonksiyonun rnorm(n = , mean = , sd = ) biçiminde kullanılması durumunda ise istenen ortalama ve standart sapma değerlerine sahip verilerin üretilebildiğini gözlemledim. Ayrıca, üretilen bu verilerin herkes için aynı şekilde elde edilebilmesi amacıyla set.seed(değer) fonksiyonunun kullanılması gerektiğini fark ettim. Bununla birlikte, dışarıdan bir veri seti yüklemek gerektiğinde load("dosya kısayolu") komutuyla R ortamına veri aktarılabileceğini yeniden hatırladım.

Veri setleri üzerinde yapılan işlemler sırasında, özellikle etiketli labelled değişkenlerin analiz sürecinde bazı sorunlara yol açabildiğini gözlemledim. Bu nedenle, söz konusu etiketli değişkenlerin düzenlenmesinde haven ve sjlabelled paketlerinin kullanılması gerektiğini öğrendim. Bu paketlerin kullanımında, is_labelled() fonksiyonu değişkenlerin etiketli olup olmadığını kontrol ederken etiketli olan sütunlar as.factor() fonksiyonu aracılığıyla faktör değişkenlere dönüştürülür. Bu dönüşüm sürecinde, mutate_if() yerine mutate(across(where(is_labelled), as.factor)) yapısının kullanılmasının daha doğru sonuçlar verdiğini öğrendim. Ayrıca is.factor() fonksiyonuyla birlikte de faktör yapılarının saptandığını öğrendim.

Yukarıda belirtilen fonksiyonlar yanı sıra geçen hafta yaptığımız ödevlerde kullandığımız kayıp verilerin saptanmasında kullanılan is.na() ve kayıp verilerin silinmesinde kullanılan na.omit() fonksiyonlarına yönelik deneme süreci gerçekleştirdik.Ayrıca distinct() fonsikyonu ilede bir değişkenin kaç farklı değer aldığını saptayabileceğimizi öğrendim.

Oluşturduğumuz grafikler kapsamında, ggplot fonksiyonunun oldukça kapsamlı ve esnek bir yapıya sahip olduğunu öğrenmiş bulunmaktayım. Özellikle çubuk grafikleri oluştururken, çubukların yan yana gösterilmesi gerektiğinde geom_bar(position = "dodge") ifadesinin kullanıldığını öğrendim. Bunun yanı sıra, facet_wrap() fonksiyonu aracılığıyla belirli değişkenlere göre ayrı grafikler oluşturulabileceğini, geom_vline() fonksiyonuyla grafiğe dikey çizgiler eklenebileceğini ve bu çizgilerin konumunun geom_vline(xintercept = değer) biçiminde belirtilebileceğini anladım. Ayrıca, çizgilerin renklerinin color =, türlerinin linetype = "", kalınlıklarının ise size = sayı değeri parametreleriyle düzenlenebileceğini öğrendim. Histogram türü grafiklerde ise çubuk sayısının bins = veya binwidth = argümanları aracılığıyla değiştirilebileceğini gözlemledim. Tüm bu denemeleri uygulamalı olarak gerçekleştirdim ve ayrı bir dosyamda saklamaktayım.

Bu hafta öğrendiklerim doğrultusunda özellikle grafikler üzerinde yapılan işlemler dikkatimi çekti ve bu konuda karmaşık kodlar yazmayı denerken zorlandığımı da fark ettim. Bu konuda nasıl bir sırayla kodları yazmam gerektiğini daha iyi anlamam için daha çok antreman yapmam gerekiyormuş. Ayrıca, fonksiyon oluşturma sürecinde de matematiksel formüllere yönelik bilgi eksiğimi fark ettim. Bu konuda da kendi eksiğimi kapatmak için daha çok deneme yapmam gerektiğini hissettim. Bunlar yanı sıra, dersin genel olarak verimli geçtiğini ve aklıma yeni fikirler gelmesinde yol gösterici olduğunu ifade edebilirim.