Bölüm10 Keşifsel Veri Analizi

10.1 Giriş

Bu bölümde ilk olarak bir veritabanını R içerisine aktarılması ve veritabanının incelenmesi konularını işleyeceğiz. Bölüm boyunca kullanacağımız veritabanları openintro paketinde bulunduğundan öncelikle bu paketin bilgisayarınızda bulunduğundan ve R oturumuna eklendiğinden emin olunuz. İhtiyacımız olan diğer paket ise dplyr paketi olacak. Her iki paketi de öncelikle yükleyerek işe başlayalım

library(openintro)
library(dplyr)

Şimdi openintro paketinde bulunan email50 isimli veritabanını çalışma ortamımıza getirelim ve yapısına glimpse() fonksiyonu ile bakalım

data(email50)
glimpse(email50)
## Observations: 50
## Variables: 21
## $ spam         <dbl> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0...
## $ to_multiple  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0...
## $ from         <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ cc           <int> 0, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0...
## $ sent_email   <dbl> 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1...
## $ time         <dttm> 2012-01-04 15:19:16, 2012-02-16 22:10:06, 2012-0...
## $ image        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ attach       <dbl> 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0...
## $ dollar       <dbl> 0, 0, 0, 0, 9, 0, 0, 0, 0, 23, 4, 0, 3, 2, 0, 0, ...
## $ winner       <fct> no, no, no, no, no, no, no, no, no, no, no, no, y...
## $ inherit      <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ viagra       <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ password     <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0...
## $ num_char     <dbl> 21.705, 7.011, 0.631, 2.454, 41.623, 0.057, 0.809...
## $ line_breaks  <int> 551, 183, 28, 61, 1088, 5, 17, 88, 242, 578, 1167...
## $ format       <dbl> 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1...
## $ re_subj      <dbl> 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1...
## $ exclaim_subj <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0...
## $ urgent_subj  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ exclaim_mess <dbl> 8, 1, 2, 1, 43, 0, 0, 2, 22, 3, 13, 1, 2, 2, 21, ...
## $ number       <fct> small, big, none, small, small, small, small, sma...

10.2 Değişken Tipleri

İkinci aşamada veritabanındaki değişkenlerin tiplerini, ölçüm seviyelerini dikkate alarak saptamamız gerekir. Veri kullanarak yapılan tüm niceliksel sosyal bilimler analizlerinde ilk yapılması gereken işlemlerden biri olan bu saptama, ölçümler için daha sonra kullanacağımız istatistiki araçların belirlenmesi için hayati önem taşır. Temel olarak iki ölçüm seviyesi bulunur: Nümerik/niceliksel ve Kategorik/Niteliksel. Nümerik/Niceliksel ölçüm seviyesi iki alt tipe ayrılır: Sürekli değişkenler ve kesikli değişkenler. Sürekli değişkenler bir aralık içinde sınırsız değer alabilirken, kesikli değişkenler ise ancak sayılabilir durumda olan belli değerler alabilirler. Sürekli değişkenlere uzunluk, kilo gibi ölçümler örnek verilebilir. Kesikli değişkenlere ise bir evdeki televizyon sayısı, geçtiğimiz hafta tüketilen ekmek sayısı gibi örnekler verilebilir. Kategorik/Niteliksel değişkenler de ikiye ayrılır: Bir aralıkta tanımlanmış belli değer alabilen ve sıralanabilen değişkenler ve sıralanamayan belli bir aralıkta değer alabilen değişkenler. Birinci tipe örnek olarak anket tipi soru kağıtlarında sıklıkla kullanılan Likert ölçeği verilebilir. Bu ölçeklerde cevaplayıcıya çoğunlukla bir fikre veya ifadeye ne derece katıldığı sorulur ve cevap kategorileri kendi içinde, -genellikle “kesinlikle katılmıyorum”dan “kesinlikle katılıyorum”a doğru giden bir dizge içerisinde- sıralıdır. İkinci tip Kategorik/Niteliksel değişkenlerde ise bir sıralama yapmak mümkün olmaz, cevap kategorileri sadece birbirinden ayrılabilir durumdadır. Cinsiyet, oy verilen parti gibi örnekler bu tipe girer. Şimdi dplyr paketindeki glimpse() fonksiyonunu kullanarak yukarıda özetlediğimiz veri tabanına bir de bu gözle bakarak değişkenlerin tiplerini anlamaya çalışınız.

10.3 Filtreleme

Kategorik/Niteliksel değişkenler R içerisinde çoğunlukla factor olarak bulunurlar. Bu değişkenlerin istatistiki ölçümlerde kullanımı özel bir dizi işlem gerektirdiğinden bu değişkenlere ait isim, ölçüm kategorileri gibi niteliklerinin bilinmesi yapılacak işlemler için çok önemlidir. Kategorik/Niteliksel değişkenler ayrıca alt-grup analizleri için oldukça kullanışlıdır. Bu değişkenlerin bir kategorisi kullanılarak, (örneğin cinsiyet değişkeninin sadece erkek kategorisi gibi) alt-grup analizleri gerçekleştirilebilir.

Şimdi email50 veritabanında bulunan number değişkeni üzerinde birkaç uygulama yapalım. Bu değişkenin bir e-pota içerisinde bulunan sayıları none (hiç yok), small (küçük) ve big (büyük) kategorileri halinde kodlanmış olduğunu biliyoruz. dplyr paketinde bulunan filter() fonksiyonunu kullanarak bu değişkenden istediğimiz bir kesiti almak için aşağıdaki kodu kullanabiliriz.

email50_buyuk <- email50 %>% 
  filter(number == "big")
glimpse(email50_buyuk)
## Observations: 7
## Variables: 21
## $ spam         <dbl> 0, 0, 1, 0, 0, 0, 0
## $ to_multiple  <dbl> 0, 0, 0, 0, 0, 0, 0
## $ from         <dbl> 1, 1, 1, 1, 1, 1, 1
## $ cc           <int> 0, 0, 0, 0, 0, 0, 0
## $ sent_email   <dbl> 0, 0, 0, 0, 0, 1, 0
## $ time         <dttm> 2012-02-16 22:10:06, 2012-02-05 01:26:09, 2012-0...
## $ image        <dbl> 0, 0, 0, 0, 0, 0, 0
## $ attach       <dbl> 0, 0, 0, 0, 0, 0, 0
## $ dollar       <dbl> 0, 0, 3, 2, 0, 0, 0
## $ winner       <fct> no, no, yes, no, no, no, no
## $ inherit      <dbl> 0, 0, 0, 0, 0, 0, 0
## $ viagra       <dbl> 0, 0, 0, 0, 0, 0, 0
## $ password     <dbl> 0, 2, 0, 0, 0, 0, 8
## $ num_char     <dbl> 7.01, 10.37, 42.79, 26.52, 6.56, 11.22, 10.61
## $ line_breaks  <int> 183, 198, 712, 692, 140, 512, 225
## $ format       <dbl> 1, 1, 1, 1, 1, 1, 1
## $ re_subj      <dbl> 0, 0, 0, 0, 0, 0, 0
## $ exclaim_subj <dbl> 0, 0, 0, 1, 0, 0, 0
## $ urgent_subj  <dbl> 0, 0, 0, 0, 0, 0, 0
## $ exclaim_mess <dbl> 1, 1, 2, 7, 2, 9, 9
## $ number       <fct> big, big, big, big, big, big, big

Yukarıdaki örnek email50 veritabanında bulunan number değişkeninin sadece big kategorisini filtreledi ve bunu email50_buyuk isimli başka bir veritabanı olarak sakladı. Şimdi bu yeni veritabanındaki number değişkenine ait bir tablo oluşturalım ve big kategorisinde kaç tane e-posta olduğuna bakalım.

table(email50_buyuk$number)
## 
##  none small   big 
##     0     0     7

Görüldüğü üzere her ne kadar filtrelemeyi yapmış olsak da, değişkene ait kullanılmayan kategoriler de (none ve small kategorileri) oluşturduğumuz tabloda yer aldı. Bu kullanılmayan kategorileri değişkenden çıkarmak için droplevels() fonksiyonunu kullanmamız gerekir.

email50_buyuk$number <- droplevels(email50_buyuk$number)
table(email50_buyuk$number)
## 
## big 
##   7

10.4 Ayrıştırma

Analizlerde çoğu zaman nümerik değerleri ayrıştırarak ek değerlendirmeler yapmak gerekir. Örneğin tekil bir gözlemin tüm seri ortalamasının üstünde veya altında olup olmadığının değerlendirilmesi (bir öğrencinin notunun sınır ortalamasının altında veya üstğnde olması gibi) sıklıkla yapılan bir işlemdir. Aşağıdaki örnekte email50 veritabanındaki bir e-posta içindeki karakter sayısını ölçen num_char değişkenini böyle bir analize tabi tutacağız. İşlem sırasında ortalama_ustu ve ortalama_alti olarak iki kategorisi olan num_char_cat ismi ile yeni bir değişken oluşturcağız. İşlem ayrıca orjinal num_char değişkenini ortalama değeri üzerinden kontrol edip sonucu numchar_cat değişkenine ortalama_ustu ve ortalama_alti olarak işleyecek.

# numchar değişkeninin ortalamasını hesaplayalım
ortalama_numchar <- mean(email50$num_char) 

# num_char_cat değişkenini oluşturalım
email50 <- email50 %>% 
  mutate(num_char_cat = ifelse(num_char < ortalama_numchar, "ortalama_alti", "ortalama_ustu" ))

# yeni değişkenin tablosuna bakalım
table(email50$num_char_cat)
## 
## ortalama_alti ortalama_ustu 
##            35            15

Yukarıdaki çıktıdan 50 e-postanın 35 tanesinin ortalama değerin üzerinde, 15 tanesinin de altında olduğunu anlıyoruz. Oluşan yeni değişkeni kontrol etmek isterseniz Global Environment penceresindeki email50 veritabanının sonuna da bakabilirsiniz.

Analizlerde sıkça gereken bir başka işlem ise Kategorik/Niteliksel değişkene ait değerlerin birleştirilmesi işidir. email50 veritabanında bulunan number değişkenini ele alalım. Bu değişken none, small ve big olarak tanımlanmış üç seviyede bir e-postanın içeriğindeki sayıları belirtiyor. Bizim ise bir e-postada sadece sayı olup olmadığını merak ettiğimizi varsayalım. Bu durumda none (hiç) seviyesini ayrı tutup small (küçük) ve big (büyük) seviyelerinin birleştirilmesi gerekir. Aşağıdaki kod hem bu işlemi gerçekleştiriyor, hem de sonucu grafikliyor.

library(ggplot2)
email50 <- email50 %>% 
  mutate (sayi_var_yok = ifelse(number == "none", "yok", "var"))
table(email50$sayi_var_yok)
## 
## var yok 
##  44   6
ggplot(email50, aes(sayi_var_yok)) +
         geom_bar()

10.5 Görselleştirme

Bu bölümde değişkenler arasındaki ilişkiler anlamak üzere kullanılan temel grafikleme yöntemlerine değineceğiz ve tüm grafikleme işlemleri için ggplot2 paketini kullanacağız.. (Daha detaylı grafikleme uygulamaları için lütfen ilgili bölümlere göz atınız)

İlk olarak email50 veritabanında bulunan iki nümerik değişkeni (num_char ve exclaim_mess), e-postanın istenmeyen bir e-posta olup olmadığını gözeterek karşılaştıralım.

# spam değişkenini factor olarak tanımlandığına dikkat ediniz!
ggplot(email50, aes(exclaim_mess, num_char, color= factor(spam)))+
  geom_point()

10.6 Gözleme Dayalı Araştırmalar ve Deneyler

Sosyal bilimler araştırmalarında sıkça başvurulan iki tip araştırma yöntemi bulunur: gözleme dayalı araştırmalar ve deneyler. Bu bölümde bu iki yöntemi ayrıştırmayı ve her biri için uygun hesaplama kestirim olanaklarını inceleyeceğiz.

Gözleme dayalı araştırmalarda araştırmacı verinin oluşma sürecine dahil olmadan ve bu sürece müdahale etmeden veriyi toplamaya çalışır. Gözleme dayalı çalışmalar ile toplanmış veriler ile nedensellik iddiası olmadan sadece değişkenler arası ilişkiler ortaya konabilir. Öte yandan deneylerde araştırmacı gözlemlerini deney ve kontrol gruplarına rastlantısal olarak yerleştirir ve bu durum bağımlı ve bağımsız değişkenler arasındaki ilişkiyi nedensellik temelinde açıklamayı olanaklı kılar.

Negatif siyasi kampanya reklamlarına maruz kalma ve siyasete güven arasındaki ilişkiyi merak ettiğimizi varsayalım. Bu çalışmayı hem gözleme dayalı hem de deneysel araç kullanarak tasarlayabiliriz. Gözleme dayalı yapmak istersek önce nüfustan negatif siyasi reklam seyretmiş ve seyretmemiş iki ayrı örneklem çekeriz ve devamında bu grupların siyasete güven derecelerini ölçer ve karşılaştırırız. Eğer deney yapmak istersek, nüfustan örneklemimizi çekip bu örneklemdeki denekleri rastlantısal olarak deney ve kontrol gruplarına yerleştirdikten sonra, deney grubuna negatif kampanya reklamlarını seyrettiririz. Deneyin gözleme dayalı tasarımdan farkı, deneylerde siyasi kampanyaya maruz kalma durumunun araştırmacı tarafından manipüle ediliyor olmasıdır. Deney tasarımında da her iki grubun siyasete güven dereceleri ölçülür ve karşılaştırılır.

Gözleme dayalı tasarımlarda bahsedilen gruplar arasında fark saptansa bile, bu fark tamamen kullanılan bağımsız değişkene (negatif siyasi reklama maruz kalma) bağlı değildir: İnsanların siyasete olan güveni sadece maruz kaldıkları siyasi reklam tipi tarafından belirlenmez, konunun anlaşılması için ideolojik konum, yaş, gelir gibi kontrol edilmesi gereken başka değişkenler bulunur. Ancak deneylerde yukarıda anlatılan ve sonucu etkileyen değişkenler, rastlantısal olarak seçilmiş deney ve kontrol grupları arasında eşit olarak dağılır. Dolayısıyla gruplar arasındaki farkları bağımsız değişkenin etkisi olarak değerlendirebiliriz.

10.7 Rastlantısal Örneklem ve Rastlantısal Atama

Rastlantısal örneklem deneklerin örnekleme seçilmesi sırasında kullanılan ve örneklem ölçümlerinin nüfusa genellenmesi için gereken öncelikli bir prosedürdür. Rastlantısal örneklemde birimlerin örnekleme çıkma şansının eşit ve hesaplanabilir olması gerekir. Rastlantısal atama ise deneyler sırasında deneklerin gruplara rastlantısal olarak yerleştirilmesine verilen isimdir. Böylece denekler farklı manüpülasyonlara tabi tutulabilir ve bağımsız değişkenin etkisi bağımlı değişken üzerindeki etkisi ölçülebilir. Aşağıdaki şekil farklı tasarımların çıkarım sınırlarını belirtmektedir.

Şüphesiz beyaz zeminli seçeneklerden sol üst köşede bulunan nedensellik ve genellenebilirlik niteliklerini içeren tasarım en kuvvetli sonuçları üretir. Hem deneklerin rastlantısal olarak nüfustan seçildiği, hem de rastlatısal olarak deney gruplarına atandığı bu tasarım hayli masraflı ve uygulaması zor olan bir seçimdir. Bu nedenle deneyler çoğunlukla sol alt köşede bulunan nedensellik içeren ama genellenemeyen tasarımlarda gönüllüler üzerinden gerçekleştirilir.

10.8 Kategorik Verilerin Analizi

10.9 Çapraz tablolar

Bu bölümde 1000 gözlemden oluşan ve cevaplayıcıların siyasi ve sosyal değerlerini içeren ve tamamen kurgusal olan dt isimli veri tabanını kullanacağız. Bu kurgusal veri tabanı cevaplayıcıların parti tercihleri, kürtaj hakkındaki düşünceleri, yaşları gibi bilgileri içermektedir ve https://tinyurl.com/yabhoe56 adresinden indirilebilir.

Öncelikle veri tabanımızı çalışma ortamımıza getirelim, character olarak kodlanmış tüm sütunları factor değişken haline getirelim ve üzerinde daha kolay çalışmak için veri tabanımızı tibble formatına çevirelim.

library(readr)
library(tibble)
dt <- read.csv("C:/Users/emretoros/OneDrive/Makale/R/toros/dt.csv")


dt <- as.data.frame(unclass(dt))
as.tibble(dt)
## # A tibble: 1,000 x 23
##    idnum cinsiyet bolge gelir egitim muhafazakar liberal milliyetci    p1
##    <int> <fct>    <fct> <int>  <int>       <int>   <int>      <int> <int>
##  1   517 Erkek    Guney 22559      1           2       4          2     1
##  2   297 Kadin    Guney 12072      5           2       3          1     1
##  3   811 Kadin    Kuzey 40815      1           2       5          1     0
##  4   461 Erkek    Kuzey 44135      1           3       5          3     0
##  5   607 Kadin    Dogu  48246      1           2       3          1     0
##  6   186 Erkek    Kuzey 15263      2           2       5          3     0
##  7   879 Erkek    Dogu   4122      1           1       5          1     0
##  8   887 Erkek    Guney  6345      2           3       4          1     0
##  9   622 Kadin    Dogu  35840      2           1       5          1     1
## 10   423 Kadin    Dogu  46321      1           3       5          1     0
## # ... with 990 more rows, and 14 more variables: p2 <int>, p3 <int>,
## #   siyasete_guven <int>, yas <int>, gocmenler <int>, oy <fct>,
## #   kurtaj <fct>, sendikalasma <int>, gelenek <int>, bagis <int>,
## #   askere_guven <dbl>, adalete_guven <dbl>, burokrasiye_guven <dbl>,
## #   meclise_guven <dbl>

Özetten de anlaşılacağı üzere veri tabanımızda 1000 gözlem ve 22 değişken bulunuyor

Aşağıdaki kodlar verimiz ile ilgili bazı temel işlemleri gerçekleştiriyor.

# Cinsiyet değişkeninin aldığı değerlere bakalım
levels(dt$cinsiyet)
## [1] "Erkek" "Kadin"
# Bölge değişkeninin aldığı değerlere bakalım
levels(dt$bolge)
## [1] "Bati"  "Dogu"  "Guney" "Kuzey"
# Bu değişkenler ile bir çapraz tablo oluşturalım
table(dt$cinsiyet, dt$bolge)
##        
##         Bati Dogu Guney Kuzey
##   Erkek  136  115   138   120
##   Kadin  130  141   120   100

10.10 Değişken seviyelerinin ayıklanması

Yukarıdaki tablo bölgelere göre dağılmış erkek ve kadın cevaplayıcıların sayılarını raporladı. Çalışmamızı sadece kadınlar üzerinden yapmak istediğimizi varsayalım. Bu durumda erkek cevaplayıcıları veri tabanından ayıklamamız gerekiyor. R içinde bu işlem için iki adım gerekir. Önce ayıklamak istediğimiz değişkenin seviyesini dplyr paketinde bulunan filter() fonksiyonu ile tanımlarız (bu durumda “Erkek” seviyesi), daha sonra ise bu seviyeyi ilgili değişkenden droplevels() fonksiyonu ile ayıklarız. Aşağıdaki kod bu işlemi gerçekleştirmektedir.

library(dplyr)
dt_k <- dt %>% 
  filter (cinsiyet != "Erkek") %>% 
  droplevels()

Yukarıdaki kod sadece bu ayıklamayı yapmak ile kalmadı aynı zamanda yaptığı işlemi dt_k ismi ile yeni bir veri tabanına kaydetti. ÇApraz tabloyu bu yeni veri tabanında oluşturalım

table(dt_k$cinsiyet, dt_k$bolge)
##        
##         Bati Dogu Guney Kuzey
##   Kadin  130  141   120   100

Her ne kadar çapraz tablolar değişkenlere ait frekansları sayı olarak raporlasa da, bu frekansları görsel olarak sunmak çoğu zaman daha anlamlıdır.

Aynı verinin birden fazla şekilde görselleştirilebileceğini anlatmak adına aşağıdaki kod yanyana iki sütun grafik oluşturuyor. Kod içindeki geom_bar() fonksiyonundaki dodge argümanının kullanımı grafikleri üstüste değil yan yana getirir.

#  Grafik için ggplot2 paketini yükleyelim
library(ggplot2)

# Yanyana olacak şekilde cinsiyet bazında bölgelerin grafiğini çizelim 
ggplot(dt, aes(x = cinsiyet, fill = bolge)) + 
  geom_bar(position = "dodge")

# Yanyana olacak şekilde bölgeler bazında göre cinsiyetin grafiğini çizelim 
ggplot(dt, aes(x = bolge, fill = cinsiyet)) + 
  geom_bar(position = "dodge") +
  theme(axis.text.x = element_text(angle = 90))

Lütfen oluşan grafikleri yorumlamaya çalışın. Hangi bölgede kadın gözlem sayısı erkek gözlem sayısından fazladır? En fazla erkek gözlemi hangi bölgede gerçekleşmiş? Güneyde erkekler mi kadınlar mı daha fazladır?

10.11 Frekanslar, Oranlar ve Durumsal Oranlar

Çoğu zaman gözlemlere ait frekanslar önemli bilgiler içerse de, bu frekansların başka gözlemler ile birleştirilmiş oransal ifadeleri içerik açısından daha zengindir. Elimizdeki dt veri tabanı ile bölgelere göre parti dağılımını gösteren basit bir tablo ile işe başlayalım

options(scipen = 999, digits = 3) # Tablo çıktısını basitleştirmek için
tab_frekans <- table(dt$oy, dt$bolge)
tab_frekans
##         
##          Bati Dogu Guney Kuzey
##   PartiA   15   24    15    13
##   PartiB  133  119   130   110
##   PartiC   78   74    73    69
##   PartiD   40   39    40    28

ikinci kod satırında table() fonksiyonu kullanarak yarattığımız ve tab_frekans ismi ile kaydettiğimiz yukarıdaki tablo partilerin bölgelere göre aldığı oy miktarını gösteriyor. Şimdi aynı tabloyu parti oylarının oranlarını gösterecek şekilde prop.table() fonksiyonunu kullanarak tekrar oluşturalım.

prop.table(tab_frekans)
##         
##           Bati  Dogu Guney Kuzey
##   PartiA 0.015 0.024 0.015 0.013
##   PartiB 0.133 0.119 0.130 0.110
##   PartiC 0.078 0.074 0.073 0.069
##   PartiD 0.040 0.039 0.040 0.028

Yukarıdaki tabloda PartiB ile Batı değişkenlerinin kesiştiği hücrenin en yüksek orana sahip olduğunu görüyoruz. Buradan tüm seçim bölgelerindeki en yüksek yüzdeyi PartiB’nin Batı bölgesinde gerçekleştirdiğini anlıyoruz. Yukarıdaki tablodaki değerler oran temsil ettiğinden tüm hücre değerleri toplandığında “1” değeri bulunur.

Oy verme ile bölgeler arasındaki bağlantıyı daha net ortaya çıkartmak için durumsal oranlara bakılması gerekir. Hesaplamak istediğimiz oranlarını “durum”u (condition) kodda yapacağımız bir değişiklikle tanımlanır. Eğer oranları satır bazında istersek koda “1” değeri, sütun bazında istersek koda “2” değeri eklenir. Aşağıdaki kodları inceleyiniz.

prop.table(tab_frekans, 1) # (satır bazlı durum tanımı, partiye göre durum)
##         
##           Bati  Dogu Guney Kuzey
##   PartiA 0.224 0.358 0.224 0.194
##   PartiB 0.270 0.242 0.264 0.224
##   PartiC 0.265 0.252 0.248 0.235
##   PartiD 0.272 0.265 0.272 0.190
prop.table(tab_frekans, 2) # (sütun bazlı durum tanımı, bölgeye göre durum)
##         
##            Bati   Dogu  Guney  Kuzey
##   PartiA 0.0564 0.0938 0.0581 0.0591
##   PartiB 0.5000 0.4648 0.5039 0.5000
##   PartiC 0.2932 0.2891 0.2829 0.3136
##   PartiD 0.1504 0.1523 0.1550 0.1273

Yukarıdaki tabloları yorumlamaya çalışalım. Üstteki tablodan PartiC’nin aldığı toplam oyun yüzde 23’ünü Kuzey bölgesinden aldığını görüyoruz. PartiA’ya baktığımızda ise PartiA oylarının üçte birinden fazlasının (%35) Doğu bölgesinden geldiğini görüyoruz. İkinci tablo ise oranları sütunlara göre hesapladı. Buna göre PartiB Doğu bölgesi hariç diğer bölgelerde oyların yarısını almış görünüyor.

Yukarıdaki tablolar her ne kadar önemli bilgiler içeriyor olsa da verinin daha kolay anlaşılması için grafikler yoluyla ifade edilmesi uygun olur. Bu tip karşılaştırmalar için yukarıda kullandığımız sütun grakileri bazı ek modifikasyonlar ile tekrar kullanabiliriz. Şİmdi aşağıdaki kodu inceleyiniz

ggplot(dt, aes(x=oy, fill=bolge)) +
  geom_bar(position="fill")+
  ylab("oran")

ggplot(dt, aes(x=bolge, fill=oy)) +
  geom_bar(position="fill")+
  ylab("oran")

Yukarıdaki grafiklerden ilki birinci tabloya, ikincisi ise ikinci tabloya ait. Kodda yaptığımız değişiklik ise geom_bar() fonksiyonuna position="fill" argümanını eklemek oldu. Bu argüman ile frekanslar yerine oranları istediğimizi ifade etmiş olduk. İkinci grafikte PartiB’nin diğer partilere karşı olan üstünlüğü açıkça farkediliyor. İlk grafikte ise PartiA’nın diğer bölgelere kıyasla Doğu bölgesinde başarılı olduğunu görebiliyoruz.

10.12 Tek Değişkene Ait Dağılımlar

Farkedeceğiniz üzere yukarıdaki örneklerde iki ayrı değişkenin birbiri ile olan ilişkisini ortaya koyan analizler yaptık. Kimi zaman tek değişkenlere ait dağılımlar da araştırma sorumuza yanıt vermek için gerekli olabilir. Bu bölümde tek değişkene ait dağılımların nasıl oluşturulacağına bakacağız.

Aşağıdaki kodu tüm partilere ait frekansları sütun grafik halinde göstermek için kullanabiliriz

ggplot(dt, aes(oy))+
  geom_bar()

Yukarıdaki basit grafiğe bölge değişkenini ekleyerek ayrı grafikler haline getirmek istediğimizde facet_wrap() fonksiyonunu kullanılır. Bu fonksiyon ~ işareti ile kullanılır ve grafiği ayrıştırmak istediğimiz değişken ~ işaretinden sonra tanımlanır.

ggplot(dt, aes(oy))+
  geom_bar()+
  facet_wrap(~ bolge)