Temmuz ayında Akademik Link Youtube kanalından tamamı organik veriler olan 16.811 kişinin katıldığı… Temmuz ayında Akademik Link Youtube kanalından tamamı organik veriler olan 16.811 kişinin katıldığı içerisinde önce ki dönemlerde Cumhur Başkanlığı seçimlerinde,Millet vekili seçimlerinde ve kuralan Yeni Parti hakkında kullanıcalara hem yüzdesel hemde açık uçlu sorular sorularak geniş bir analiz imkan yeteneği bırakılmıştır. Biz bu çalışmamızda konuyu yüzeysel inceleyecek açık uçlu sorular ile şimdilik çok ilgilenmeyecek ve anket sonuçlarının tamımı ile değil öznel olarak kendi merak ettiğim irdelemek istedğim kısımları inceleyeceğiz. bu sebep ile Veri ön işlememizi(Manipule) yöntemlerimizi sadece ilgilendiğimiz veri grubuyla yapacağız,geriye kalan ilgilenmediğimiz soruların tamamı daha sonra ben veya GitHub’da halka açık paylaşılacak bu kodları devam ettirmek isteyen kullanıcın özgürlüğünü bırakılacaktır. Önce R studioda daha önce kullanmış olduğum çalışmalarımın tamamının sildim ve gerekli paketlerin yüklenmesini sağladım veriyi analiz etmek tahmin etmek (forcasting) için öncelikle veriyle ilgilenmemiz lazım doğrudan analizlere geçtiğimiz veriler piyasada genellikle temizlenmiş veriler olmadığı için hatalı sonuçlar verir bu yüzden önce veriyi ön incelemeye almalıyız.
library(readxl) # exel dosyamızı R studioya tanıtıyoruz.
veri <- read_excel("C:\\Users\\kaano\\OneDrive\\Desktop\\Temmuz_Anket_Temiz.xlsx") # Exelden aldığımız veri setini R Studio ortamına yüklüyoruz
Burada bu kod ile veriye ön inceleme sağlıyoruz ve bir sütunda hata tespit ediyoruz
colnames(veri) # veride 5.sutununda Soru1 isminde hata tespit ettim
## [1] "Zaman" "Yas" "Cinsiyet" "Dogum_yeri" "Soru1\r\n"
## [6] "Soru2" "Soru3" "Soru4" "Soru5" "Soru6"
## [11] "Soru7" "Soru8" "Soru9" "Soru10" "Soru11"
## [16] "Soru12" "Soru13" "Soru14" "Soru15" "Soru16"
## [21] "Soru17" "Soru18" "Soru19" "Soru20" "Soru21"
## [26] "Soru22" "Soru23" "Soru24"
burada bu düzeltme için janitor paketini kullandık ve paket sayesinde veri standartlaştırıldı yanlışlar düzeltidi
library(janitor) # paket R studio ortamına tanıdıldı
veri <- clean_names(veri)
colnames(veri) # 5.sütünda <mark>Soru1</mark> kısmı düzeltildi
## [1] "zaman" "yas" "cinsiyet" "dogum_yeri" "soru1"
## [6] "soru2" "soru3" "soru4" "soru5" "soru6"
## [11] "soru7" "soru8" "soru9" "soru10" "soru11"
## [16] "soru12" "soru13" "soru14" "soru15" "soru16"
## [21] "soru17" "soru18" "soru19" "soru20" "soru21"
## [26] "soru22" "soru23" "soru24"
sırada verilerin formatlarına bakmak vardı bazı veriler chracterde yanlışıkla kalmış olabilirdi veya numericler miydi belki exele veri giren kişi sayıları num formda değilde karakter formunda girdi bunların tespitleri yapılmalıyıdı bunun içinde str(veri) kodunu kullandım ve tüm verilerin uygun formatta olduğunu gördüm.
str(veri)
## tibble [16,811 × 28] (S3: tbl_df/tbl/data.frame)
## $ zaman : POSIXct[1:16811], format: "2026-07-22 20:36:53" "2026-07-22 20:37:30" ...
## $ yas : chr [1:16811] "18-24" "18 altı" "18-24" "18 altı" ...
## $ cinsiyet : chr [1:16811] "Erkek" "Erkek" "Erkek" "Erkek" ...
## $ dogum_yeri: chr [1:16811] "İstanbul" "Konya Sarayönü" "Konya" "Kartal" ...
## $ soru1 : chr [1:16811] "Kişisel bir gelirim yok / Çalışmıyorum" "Kişisel bir gelirim yok / Çalışmıyorum" "Kişisel bir gelirim yok / Çalışmıyorum" "Kişisel bir gelirim yok / Çalışmıyorum" ...
## $ soru2 : chr [1:16811] "Oy kullanmadım" "Oy kullanmadım" "Kemal Kılıçdaroğlu" "Oy kullanmadım" ...
## $ soru3 : chr [1:16811] "Oy kullanmadım" "Oy kullanmadım" "Zafer Partisi" "Oy kullanmadım" ...
## $ soru4 : chr [1:16811] "Zafer Partisi" "Cumhuriyet Halk Partisi (CHP)" "Oy kullanmam" "Cumhuriyet Halk Partisi (CHP)" ...
## $ soru5 : num [1:16811] 1 1 1 1 1 1 1 1 1 1 ...
## $ soru6 : num [1:16811] 1 4 1 1 1 1 1 1 2 1 ...
## $ soru7 : num [1:16811] 4 3 1 1 1 4 1 1 5 1 ...
## $ soru8 : chr [1:16811] "Cumhuriyet Partisi" "Doğuş Partisi" NA "Olmaması Gereken Parti" ...
## $ soru9 : chr [1:16811] "Komik" "Hiçbir şey" "AKP" "Muhalefet" ...
## $ soru10 : chr [1:16811] "Yeni" "Ayırım" "Erdoğan" "Gereksizlik" ...
## $ soru11 : chr [1:16811] "Ali Koç" "Seda Sayan" NA "Fırat Albayram" ...
## $ soru12 : chr [1:16811] "30" "20" "0.05" "8" ...
## $ soru13 : chr [1:16811] "%0 (İmkânsız)" "%20 (Düşük İhtimal)" NA "%0 (İmkânsız)" ...
## $ soru14 : chr [1:16811] "%40 (Zayıf İhtimal)" NA NA "%20 (Düşük İhtimal)" ...
## $ soru15 : chr [1:16811] "%60 (Mümkün)" NA NA "%80 (Yüksek İhtimal)" ...
## $ soru16 : chr [1:16811] NA NA NA NA ...
## $ soru17 : num [1:16811] 7 1 1 NA 7 1 1 NA 4 7 ...
## $ soru18 : num [1:16811] 1 1 1 1 1 1 7 5 2 1 ...
## $ soru19 : num [1:16811] 1 1 1 1 1 7 1 4 2 1 ...
## $ soru20 : num [1:16811] 1 2 1 4 1 2 1 1 2 1 ...
## $ soru21 : num [1:16811] 5 1 1 3 2 1 7 7 3 1 ...
## $ soru22 : num [1:16811] 5 5 7 3 7 3 7 7 6 3 ...
## $ soru23 : num [1:16811] 1 2 1 2 1 4 3 7 1 1 ...
## $ soru24 : num [1:16811] 1 4 1 4 1 4 1 1 5 2 ...
Veriyi analiz etmeden önce ön incelemeye almamız geretiğinin öneminden bahsetmiştim.Veriyi tanımadan yapacağımız ön işlemeler(manipule) veya analizler yanlış sonuçları doğurur veriyi bozmamıza neden olur bu yüzden aşağıdaki kodlar ile verinin ön incelemesine devam ediyoruz.dim (veri) fonksiyonu ile anket verimizde toplam 16811 kişi olduğunu tespit ettim.Frekans Değerleriniinceleme kararı aldım. table() fonksiyonu ile saydırdım ve aşağıda ki sonuçları elde ettim siz de fark etmişsinizdir ki toplam anket verisine katılan 16.811 kişiler ile Belirmek istemiyorum,Erkek ve Kadınları topladığımızda 16778 çıkan kişiler birbirine uyuşmuyor yani toplamlar aynı değil bu da demek oluyor ki 33 tane kayıp (NA) verimiz mevcut. Bu bizim önsezimizle tespit ettiğimiz bir durumdu bunu gerekli R kodları ile Yaş kaç tane eksik veri var colSums(is.na(veri)) kodu ile de kontol edebilir ve sağlamasını yapabiriz.
table(veri$cinsiyet)# Frekans değerlerine baktık
##
## Belirtmek istemiyorum Erkek Kadın
## 94 11380 5304
dim(veri) # Veride ki toplam satır ve sütun değerlerini tespiti yaptık
## [1] 16811 28
colSums(is.na(veri)) # Eksik verileri NA tespit ettik
## zaman yas cinsiyet dogum_yeri soru1 soru2 soru3
## 0 22 33 495 145 123 120
## soru4 soru5 soru6 soru7 soru8 soru9 soru10
## 128 51 60 127 5117 1639 2050
## soru11 soru12 soru13 soru14 soru15 soru16 soru17
## 2150 946 467 794 1412 1331 2220
## soru18 soru19 soru20 soru21 soru22 soru23 soru24
## 196 274 151 148 117 117 143
sort(colSums(is.na(veri)),decreasing = TRUE) # Daha iyi görmek için NA'ları sırladık
## soru8 soru17 soru11 soru10 soru9 soru15 soru16
## 5117 2220 2150 2050 1639 1412 1331
## soru12 soru14 dogum_yeri soru13 soru19 soru18 soru20
## 946 794 495 467 274 196 151
## soru21 soru1 soru24 soru4 soru7 soru2 soru3
## 148 145 143 128 127 123 120
## soru22 soru23 soru6 soru5 cinsiyet yas zaman
## 117 117 60 51 33 22 0
Veriyi incelemeye devam etmeden önce sizde benimle aynı anda kodları teker teker çalıştırıyorsanız fark edeceksiniz ki veri isimli datamızıda Soru 1 ,Soru 2, Soru 10 gibi sütun isimlerinin ham exel verisinde ki karşılıkları ne acaba hangi soru soruluyor şuan hangi soruyu analiz ediyorum acaba diye bakmak için sürekli exel verisine açıp sorunun karşılığı neydi diye bakmak vakit kaybından başka bir şey değil ve tespit edebilinmesi de oldukça güç.Bu sebeple R Studioda üstte doğrudan sekme olarak açabileceğimiz bir Sözlük isimli bir veri ataması yapıyoruz ki üst sekmeden rahatlıkla açıp bakabilelim diye.
library(readxl) # Paket R studio ortmanına tanıdıldı
sozluk <- read_excel("C:/Users/kaano/OneDrive/Desktop/Temmuz_Anket_Temiz.xlsx", sheet="Sozluk") # Exel dosyası çağırıldı bu kodu çalışma setwd(çalışma ortamanıza göre güncellemelisiniz.
Öncelikli amacımız ne olmalı, hangi soruları sormalıyız diye düşünmemiz gerekir. Bu sayede veriye ne yapacağımızı, kimleri neye göre kıyaslayacağımızı ve neyi neye göre analiz edeceğimizi belirlemiş oluruz. Şimdilik 18-24 yaş arasındaki genç nüfus ile yaşlı nüfus arasında kıyaslamalar yapmak istedim.
Genç ve yaşlı kuşağı ayırmadan önce table(veri$yas, useNA = “always”) fonksiyonu ile yaş kategorimizdeki frekans değerlerini ve eksik verileri inceleyelim:
table(veri$yas, useNA = "always")
##
## 18-24 18 altı 25-34 35-44 45-54
## 3570 880 4414 4528 2376
## 55-64 65 yaş ve üzeri <NA>
## 822 199 22
Görülen şu ki; oy kullanma yaşı tutmayan 18 yaş altı 880 kişilik bir grup var, bu kişiler analizin dışında tutulmalı. 18-24 yaş arası oldukça kalabalık bir genç kuşak var. 45-54, 55-64 ve 65 yaş ve üzeri grupları topladığımızda ise 3397 kişiyle neredeyse 18-24 yaş grubuna denk bir kitle elde ediyoruz.
Kuşaklarımızı kategorileştirmeden önce yaş sütunumuzda ne gibi problemler var, eksik (NA) gözlem var mı veya kategori isimlerimizde yanlışlık var mı tespit ettik. Eksik 22 tane verimiz olduğu ve 65 yaş kategorisinde bozuk Türkçe karakterlerin yer aldığı kanısına vardık.
grepl() yani tut-yakala fonksiyonu ile “65” yazan her şeyi yakalayıp karakter sorunlarından arındırılmış hale getiriyor ve eksik (NA) verileri temizliyoruz:
# 65 yaş ve üzeri bozuk karakterleri düzeltme
veri$yas[grepl("65", veri$yas)] <- "65 yas ve uzeri"
# Yaş verisi eksik (NA) olanları silme
veri <- veri[!is.na(veri$yas), ]
Temizlik işlemlerimiz bittiğine göre verimizin son halini tekrar kontrol edelim:
table(veri$yas, useNA = "always")
##
## 18-24 18 altı 25-34 35-44 45-54
## 3570 880 4414 4528 2376
## 55-64 65 yas ve uzeri <NA>
## 822 199 0
Artık 45 yaş üstü herkesi bir araya getirip “eski kuşak”, 18-24 yaş arasını da “genç kuşak” olarak kategorize edebiliriz:
library(dplyr)
genc_kusak <- veri %>% filter(yas == "18-24")
eski_kusak <- veri %>% filter(yas %in% c("45-54", "55-64", "65 yas ve uzeri"))
Son olarak, oluşturduğumuz bu yeni kuşak veri setlerinde durum nedir, hiç NA kalmış mı diye sağlamasını yapalım:
addmargins(table(genc_kusak$yas, useNA = "always"))
##
## 18-24 <NA> Sum
## 3570 0 3570
addmargins(table(eski_kusak$yas, useNA = "always"))
##
## 45-54 55-64 65 yas ve uzeri <NA> Sum
## 2376 822 199 0 3397
Soru 1: Aylık Gelir Bilgileri
Tabloyu incelediğimizde gelir aralıklarının formatlarında ve “geliri olmayan” katılımcıların ifadelerinde standart dışı metinler bulunduğunu görüyoruz. Bu dağınıklığın giderilmesi gerekiyor. Bu sebeple aşağıdaki kodlar ile beraber düzeltmeleri yapıyoruz ve veriyi analiz için çok daha kullanılabilir hale getiriyoruz.
summary(veri$soru1) # Veri özeti istedik
## Length Class Mode
## 16789 character character
table(veri$soru1, useNA = "always")
##
## 110.001 TL ve üzeri 28.000 TL ve altı
## 3641 1186
## 28.001 TL – 45.000 TL 45.001 TL – 70.000 TL
## 1547 2049
## 70.001 TL – 110.000 TL Kişisel bir gelirim yok / Çalışmıyorum
## 3881 4353
## <NA>
## 132
# Temiz sütunumuzu oluşturuyoruz
veri$soru1_temiz <- veri$soru1
# İçerisinde hedef sayılar ve kelimeler geçenleri bul ve temiz sütunda standartlaştır
veri$soru1_temiz[grepl("28.001", veri$soru1)] <- "28.001 - 45.000 TL"
veri$soru1_temiz[grepl("45.001", veri$soru1)] <- "45.001 - 70.000 TL"
veri$soru1_temiz[grepl("70.001", veri$soru1)] <- "70.001 - 110.000 TL"
veri$soru1_temiz[grepl("bir gelirim yok", veri$soru1)] <- "geliri yok / calismiyor"
table(veri$soru1_temiz, useNA = "always") # Temizlenmiş sütunun frekans saydırması
##
## 110.001 TL ve üzeri 28.000 TL ve altı 28.001 - 45.000 TL
## 3641 1186 1547
## 45.001 - 70.000 TL 70.001 - 110.000 TL geliri yok / calismiyor
## 2049 3881 4353
## <NA>
## 132
Algoritmik mantığa göre doğru ilerledik mi, verileri doğru sınıflandırdık mı tek tek bakalım. (Kontrolü yeni temiz sütun üzerinden yapıp, orijinal ham sütundaki metinlere bakıyoruz)
# "Geliri yok / calismiyor" sepetine atılan orijinal cevaplar nelermiş?
# (İçinde "gel" geçmeyen garip bir cevap yanlışlıkla bu sepete düşmüş mü?)
unique(veri$soru1[veri$soru1_temiz == "geliri yok / calismiyor" & !grepl("gel" , veri$soru1, ignore.case = TRUE)])
## [1] NA
unique(veri$soru1[veri$soru1_temiz == "28.001 - 45.000 TL" & !grepl("28", veri$soru1, ignore.case = TRUE)])
## [1] NA
unique(veri$soru1[veri$soru1_temiz == "45.001 - 70.000 TL" & !grepl("45", veri$soru1, ignore.case = TRUE)])
## [1] NA
unique(veri$soru1[veri$soru1_temiz == "70.001 - 110.000 TL" & !grepl("70", veri$soru1, ignore.case = TRUE)])
## [1] NA
Soru 2 : Cumhurbaşkanı Adayı Tercihleri
Açık uçlu cevaplardaki yazım farklılıklarını standartlaştırmak için ignore.case = TRUE (büyük/küçük harf duyarsızlığı) kullanılmıştır. Farklı varyasyonlarda yazılan cevaplar tek bir isim altında toplanıp analizi kolaylaştırmak amaçlanmıştır.
veri$soru2_temiz <- veri$soru2
# Önce oy kullanmayanları tespit edip yeni sütunumuza atıyoruz
veri$soru2_temiz[grepl("reşit|resit|yaşım|yasim|kullanmadım|kullanmadim|vermedim|Geçersiz oy verdim|Oy Kullanmadi", veri$soru2, ignore.case = TRUE)] <- "Oy Kullanmadi"
# İçerisinde kemal olan kelimeleri yakala, ancak olumsuzluk (vermem, asla vb.) içermediğinden emin ol.
# Büyük küçük harfe dikkat etmeden (ignore.case = TRUE) Kemal Kilicdaroglu'na çevir.
veri$soru2_temiz[grepl("kemal", veri$soru2, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru2, ignore.case = TRUE)] <- "Kemal Kilicdaroglu"
# İçerisinde tayyip olan kelimeleri yakala büyük küçük harflere dikkat etmeden Recep Tayyip Erdogan'a çevir.
veri$soru2_temiz[grepl("tayyip", veri$soru2, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru2, ignore.case = TRUE)] <- "Recep Tayyip Erdogan"
# İçerisinde sinan olan kelimeleri yakala büyük küçük harflere dikkat etmeden Sinan Ogan'a çevir.
veri$soru2_temiz[grepl("sinan", veri$soru2, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru2, ignore.case = TRUE)] <- "Sinan Ogan"
ana_adaylar <- c("Kemal Kilicdaroglu", "Recep Tayyip Erdogan", "Sinan Ogan", "Oy Kullanmadi") # Ana adayları belirledik
# Belirlenen bu ana adaylar dışındaki tüm yanıtlar Diger Adaylar kategorisine aktarılmıştır
veri$soru2_temiz[!(veri$soru2_temiz %in% ana_adaylar) & !is.na(veri$soru2_temiz)] <- "Diger Adaylar"
sort(table(veri$soru2_temiz), decreasing = FALSE) # Yeni temiz sütunun frekans değerlerini saydırma
##
## Diger Adaylar Sinan Ogan Recep Tayyip Erdogan
## 573 1092 1581
## Oy Kullanmadi Kemal Kilicdaroglu
## 3219 10213
Algoritmik mantığa göre doğru ilerledik mi verileri doğru sınıflandırdık mı tek tek bakalım. (Kontrolü yeni temiz sütun üzerinden yapıp, orijinal ham sütundaki metinlere bakıyoruz)
# Kemal Kılıçdaroğlu sepeti için stres testi (Yanlışlıkla olumsuz bir yorum içeri sızmış mı?)
unique(veri$soru2[veri$soru2_temiz == "Kemal Kilicdaroglu" & grepl("vermem|asla|değil|oy yok", veri$soru2, ignore.case = TRUE)])
## character(0)
# Recep Tayyip Erdoğan sepeti için stres testi
unique(veri$soru2[veri$soru2_temiz == "Recep Tayyip Erdogan" & grepl("vermem|asla|değil|oy yok", veri$soru2, ignore.case = TRUE)])
## character(0)
# Sinan Oğan sepeti için stres testi
unique(veri$soru2[veri$soru2_temiz == "Sinan Ogan" & grepl("vermem|asla|değil|oy yok", veri$soru2, ignore.case = TRUE)])
## character(0)
# Diger Adaylar kategorisine atılmış ama içinde ana adayların köklerinden biri
# yanlışlıkla sızmış mı diye bakmak için ters köşe bir test:
unique(veri$soru2[veri$soru2_temiz == "Diger Adaylar" & grepl("kemal|tayyip|sinan", veri$soru2, ignore.case = TRUE)])
## character(0)
Soru 3 : Siyasi Parti Tercihleri Açık uçlu cevaplardaki
Katılımcıların parti tercihlerindeki farklı kısaltmalar ve hatalı
yazımlar yine önce ki sorularda kullandığımız grepl fonksiyonu ile
yakalanmıştır fakat bu sefer kullanıcalara daha özgür cevaplar yazma
hakkı verildiği için parti isimlerini farklı varyasyonlarda yazma
imkanları bulmuşlardır biz de veya operatörü ile birden farklı
varyasyonla yazılmış ama hedefte belli bir partiyi yazma amacında olan
kullanıcıların işini kolaylaştırdık ve ana partiler altında
birleştirdik.Belirlenen bu 6 ana parti dışındaki tüm yanıtlar Diger
Partiler kategorisine aktarılmıştır.➔ Analist Notu: Bu kodlamada verilen cevapların tamamı kullanıcı cevapların orijinalliğini görebilmesi ve kaos durumu sezinleyebilmesi için özellikle uzunca verilmiştir.
cat("\n--- Verinin Ham Hali (Kaos Durum) ---\n")
##
## --- Verinin Ham Hali (Kaos Durum) ---
sort(table(veri$soru3), decreasing = FALSE)
##
## 18 e yeni girdim
## 1
## 18 yaş aktı vatandaşım.
## 1
## Adalet partisi
## 1
## Adını hatırlamıyorum muhtemelen kazanmadı
## 1
## Alman vatandasi oldum oy kullanamiyorum
## 1
## Anadolu Partisi
## 1
## Askerdeydim, kullanamadım
## 1
## Bagimsiz
## 1
## Bagımsız
## 1
## bagimsiz turkiye partisi
## 1
## Bağımsız aday
## 1
## Bağımsız Aday
## 1
## Bağımsız adaya
## 1
## Bağımsız adaya oy verdim
## 1
## Bağımsız işçi partili
## 1
## Bağımsız Türkiye Partisi
## 1
## Bağımsızlık Turkiye partisi
## 1
## bbp
## 1
## Belirtmek istemiyorum.
## 1
## Beşeri sistemlere oy vermiyorum.
## 1
## Beyaz oy
## 1
## Boş oy
## 1
## Boş oy kullandım
## 1
## Btp
## 1
## BTP
## 1
## Büyük Birlik
## 1
## büyük birlik partisi
## 1
## Büyük Birlik partisi
## 1
## Büyük Birlik partisi BBP
## 1
## Can Atalay
## 1
## Chp
## 1
## Daha yeni 18 oldum seçime katılma hakkı daha yeni geldi
## 1
## Dem
## 1
## Demokrat parti
## 1
## Doğum Günü Partisi
## 1
## Dp
## 1
## EMEP
## 1
## Erbakan
## 1
## G
## 1
## Geçersiz oy kullandım.
## 1
## Gelecek
## 1
## Gelecek p
## 1
## Genç parti
## 1
## Genç Parti
## 1
## Gerçek yok dıye pay ettim, iyi partı ve büyük birlik partisine
## 1
## Grubu olmayan bir parti
## 1
## Halkın Kurtuluş Partisi (HKP)
## 1
## hatirlamiyorum
## 1
## Hatırlamıyorum.
## 1
## Hatırlayamadım BBP falan miydi acaba, akpartiyi de desteklemek istemiyorum eleştirdiğim yönleri var ama alternatif de yok...
## 1
## hepsinin amk
## 1
## Hocam daha oy veremiyorum ama serbest seçim vermekte kararlıyım saygılar.
## 1
## Hüda
## 1
## Hüda par
## 1
## Hür dava partisi
## 1
## Hür Dava Partisi
## 1
## Hüseyin baş
## 1
## İ p
## 1
## İnce reis çekildiği için :(
## 1
## ip
## 1
## isci partisi
## 1
## Isci partisi TIP
## 1
## İsçi Partisi
## 1
## İşçi
## 1
## İşçi P.
## 1
## işçi partisi
## 1
## Işçi partisi
## 1
## İşçi Partisi (Mısra Öz'ün sesini daha iyi duyurabilmesi için)
## 1
## İşçi partisi (TKP)
## 1
## İşçi partisi ya da komünist parti
## 1
## İşçi patisi
## 1
## İttifak
## 1
## Kemal yuzunden Chp ye vermek istemedigim icin Iyi partiye verdim
## 1
## Kullanabilseydim CHP
## 1
## Kullanmadım ama kullansaydım CHP'ye oy verirdim
## 1
## kullansam zafere verirdim ve muharrem inceye verirdim
## 1
## LDP (liberal demokrat parti)
## 1
## Libarel Muhafazakar Komünist Patrisi
## 1
## MEMLEKET
## 1
## Memleket partyyyy
## 1
## Memleketim
## 1
## Millet ittifakı
## 1
## Millet Partisi
## 1
## Milli Yol Partisi
## 1
## Mp
## 1
## Muharrem ince
## 1
## O zmn kimin kazanma şansı varsa (akp dışı)
## 1
## Oy kullanacak yaşta değildim.
## 1
## Oy kullanamadım deprem nedeniyle yurt dışındaydım
## 1
## Oyu hepsine bastım
## 1
## REFAH
## 1
## Refah partisine
## 1
## Reşit degildim
## 1
## Reşit Değildim
## 1
## RP
## 1
## Saadet Partisi(Adil Bir Düzen ve İnsanca Yaşam)
## 1
## Siyasetçilerin hepsi aynı şeye itat ediyor
## 1
## Sol parti
## 1
## Son seçim yaşım tutmadıhından oy kullanamadım
## 1
## Sosyal demokrat parti
## 1
## sosyalist güç birliği
## 1
## T
## 1
## T.İ.P
## 1
## Teoman Yılmaz - Bağımsız
## 1
## TİP(aşk olsun ama hocam:)
## 1
## Tip.
## 1
## tkh
## 1
## turkiye isci partisi
## 1
## Turkiye isci partisi
## 1
## Turkiye Isci Partisi
## 1
## Turkiye İsci Partisi
## 1
## Tüekiye komünist partisi
## 1
## Türk vatandasi degilim
## 1
## Türkiye İşci partisi
## 1
## türkiye işçi partisi
## 1
## Türkiye Işçi Partisi
## 1
## TÜRKİYE İŞÇİ PARTİSİ
## 1
## Türkiye İşçi Partisi ( Sera Kadıgıl iyiki !)
## 1
## Türkiye işçi Partisi (TİP)
## 1
## Türkiye İşçi Partisi TIP
## 1
## Türkiye kominist partisi
## 1
## Türkiye Komunist Partisi
## 1
## Türkiye komünist partisi
## 1
## Vatan
## 1
## vesayet altındayım oy kullanamıyorum
## 1
## W
## 1
## Y. Refah
## 1
## Y. Refah Partisi
## 1
## yasim yetmiyordu
## 1
## Yaş gereği oy kunlanamadım
## 1
## Yaş tutmuyordu.
## 1
## yaşım 18'in altındaydı
## 1
## Yaşım oy vermeye yetmiyor
## 1
## yaşım tutmadığı için oy kullanmadım
## 1
## Yaşım Tutmuyordu
## 1
## Yaşım yetmediği için oy kullanmadım
## 1
## Yaşım yetmemişti oy veremedim
## 1
## Yaşım yetmiyordu
## 1
## Yeni 18 oldum
## 1
## Yeni parti
## 1
## yeniden refah (pişmanım)
## 1
## Yeniden refah Partisi
## 1
## YENİDEN REFAH PARTİSİ
## 1
## Yeniden refah partisi ( türkiyenin 3. Büyük partisi listede olmalı)
## 1
## Zafer partisine versem Artvin’den ona millet vekili çıkmayacaktı.
## 1
## Büyük birlik
## 2
## Demokrat Parti
## 2
## Geçersiz oy verdim
## 2
## HKP
## 2
## Hüdapar
## 2
## Isci partisi
## 2
## İşçi parti
## 2
## memleket
## 2
## TiP
## 2
## tkp
## 2
## Türkiye komünist hareketi
## 2
## yeniden refah
## 2
## yeniden refah partisi
## 2
## Yeniden Refah partisi
## 2
## Deva partisi
## 3
## HÜDA-PAR
## 3
## İp
## 3
## Refah Partisi
## 3
## Sol Parti
## 3
## Türkiye İşçi partisi
## 3
## Vatan partisi
## 3
## Vatan Partisi
## 3
## Büyük Birlik Partisi
## 4
## Bağımsız
## 5
## BBP
## 5
## memleket partisi
## 5
## Türkiye Komünist Partisi
## 5
## YRP
## 5
## Refah partisi
## 6
## İşçi Partisi
## 7
## Türkiye İşçi Partisi (TİP)
## 7
## Hatırlamıyorum
## 9
## Refah
## 9
## Saadet Partisi
## 9
## Bbp
## 10
## Saadet partisi
## 10
## TIP
## 10
## Yrp
## 10
## Saadet
## 12
## Tkp
## 16
## Memleket
## 19
## tip
## 20
## Türkiye işçi partisi
## 20
## Deva
## 25
## TKP
## 25
## Yeniden refah partisi
## 25
## Memleket partisi
## 27
## Yeniden refah
## 28
## Yeniden Refah Partisi
## 29
## Yeniden Refah
## 33
## İşçi partisi
## 36
## Türkiye İşçi Partisi
## 46
## Memleket Partisi
## 47
## TİP
## 198
## Tip
## 261
## Milliyetçi Hareket Partisi (MHP)
## 309
## Halkların Eşitlik ve Demokrasi Partisi (DEM Parti)
## 400
## İYİ Parti
## 853
## Adalet ve Kalkınma Partisi (AK Parti)
## 1067
## Zafer Partisi
## 1646
## Oy kullanmadım
## 3018
## Cumhuriyet Halk Partisi (CHP)
## 8208
Önceki soruda olduğu gibi verinin orijinalini korumak için temiz sütunumuzu oluşturuyoruz.
veri$soru3_temiz <- veri$soru3
# Oy kullanmayanları tespit edip yeni sütuna atıyoruz
veri$soru3_temiz[grepl("reşit|resit|yaşım|yasim|kullanmadım|kullanmadim|vermedim|Geçersiz oy verdim", veri$soru3, ignore.case = TRUE)] <- "Oy Kullanmadi"
# Parti isimlerini farklı varyasyonlarda yazanları | (veya) operatörü ile yakalayıp,
# içinde olumsuzluk (vermem, oy yok vb.) geçmeyenleri ilgili partiye çeviriyoruz.
veri$soru3_temiz[grepl("akp|ak part|akpart", veri$soru3, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)] <- "AKP"
veri$soru3_temiz[grepl("chp|cumhuriyet|cumhur??yet|halk|cumhur", veri$soru3, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)] <- "CHP"
veri$soru3_temiz[grepl("mhp|milliyeci|milliyet", veri$soru3, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)] <- "MHP"
veri$soru3_temiz[grepl("iyi|İYİ|İyi|ıyi|Iyi|ip|İP", veri$soru3) & !grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)] <- "IYI Parti"
veri$soru3_temiz[grepl("zafer partisi|zafer", veri$soru3, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)] <- "Zafer Partisi"
veri$soru3_temiz[grepl("yeni|yenı", veri$soru3, ignore.case = TRUE) & !grepl("refah|yeniden|vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)] <- "Yeni Parti"
ana_partiler <- c("AKP", "CHP", "MHP", "IYI Parti", "Zafer Partisi", "Yeni Parti", "Oy Kullanmadi") # Ana partileri belirledik
# Ana partiler dışındaki tüm yanıtları Diger Partiler kategorisine aktarıyoruz
veri$soru3_temiz[!(veri$soru3_temiz %in% ana_partiler) & !is.na(veri$soru3_temiz)] <- "Diger Partiler"
cat("\n--- Veri Ön İşlemleri(Manipule) Sonrası Veriyi Rahatlatma ---\n")
##
## --- Veri Ön İşlemleri(Manipule) Sonrası Veriyi Rahatlatma ---
sort(table(veri$soru3_temiz), decreasing = FALSE) # büyükten küçüğe en çok tekrar edenleri saydırma
##
## Yeni Parti MHP Diger Partiler AKP IYI Parti
## 4 309 661 1068 1348
## Zafer Partisi Oy Kullanmadi CHP
## 1648 3031 8612
Algoritmik mantığa göre doğru ilerledik mi verileri doğru sınıflandırdık mı tek tek bakalım.
# --- PARTİ TERCİHLERİ İÇİN ÇİFT YÖNLÜ STRES TESTİ (KONTROL) ---
# Temiz sütunda o parti yazmasına rağmen, orijinal cevapta olumsuzluk belirtenler var mı kontrolü:
unique(veri$soru3[veri$soru3_temiz == "AKP" & grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)])
## character(0)
unique(veri$soru3[veri$soru3_temiz == "CHP" & grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)])
## character(0)
unique(veri$soru3[veri$soru3_temiz == "MHP" & grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)])
## character(0)
unique(veri$soru3[veri$soru3_temiz == "IYI Parti" & grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)])
## character(0)
unique(veri$soru3[veri$soru3_temiz == "Zafer Partisi" & grepl("vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)])
## character(0)
unique(veri$soru3[veri$soru3_temiz == "Yeni Parti" & grepl("refah|yeniden|vermem|asla|değil|oy yok", veri$soru3, ignore.case = TRUE)])
## character(0)
# Diger Partiler kategorisine atılmış ama içinde ana partilerin köklerinden biri
# yanlışlıkla sızmış mı diye bakmak için ters köşe bir test:
unique(veri$soru3[veri$soru3_temiz == "Diger Partiler" & grepl("akp|chp|mhp|iyi|zafer", veri$soru3, ignore.case = TRUE)])
## character(0)
Soru 4: Güncelde Siyasi Parti Tercihleri
Önceki sorularda olduğu gibi, katılımcıların bu sorudaki parti tercihleri önceki soruyla uyumsuzluk yaratılmaması için aynı tipte ve orijinali bozulmadan standartlaştırılma işlemi yapılmıştır.
# Orijinal veriyi yeni sütuna kopyalıyoruz
veri$soru4_temiz <- veri$soru4
# Oy kullanmayacakları ayırıyoruz
veri$soru4_temiz[grepl("reşit|resit|yaşım|yasim|kullanmadım|kullanmadim|vermedim|Geçersiz oy verdim", veri$soru4, ignore.case = TRUE)] <- "Oy Kullanmadi"
# Parti yakalama ve atama (İçinde parti geçip, olumsuzluk geçmeyenleri çeviriyoruz)
veri$soru4_temiz[grepl("akp|ak part|akpart", veri$soru4, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)] <- "AKP"
veri$soru4_temiz[grepl("chp|cumhuriyet|halk|cumhur", veri$soru4, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)] <- "CHP"
veri$soru4_temiz[grepl("mhp|milliyeci|milliyet", veri$soru4, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)] <- "MHP"
veri$soru4_temiz[grepl("iyi|İYİ|İyi|ıyi|Iyi|ip|İP", veri$soru4) & !grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)] <- "IYI Parti"
veri$soru4_temiz[grepl("zafer partisi|zafer", veri$soru4, ignore.case = TRUE) & !grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)] <- "Zafer Partisi"
veri$soru4_temiz[grepl("yeni|yenı", veri$soru4, ignore.case = TRUE) & !grepl("refah|yeniden|vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)] <- "Yeni Parti"
ana_partiler <- c("AKP","CHP","MHP","IYI Parti","Zafer Partisi","Yeni Parti", "Oy Kullanmadi") # Ana partileri belirledik
# Diğer Partileri ayırdık
veri$soru4_temiz[!(veri$soru4_temiz %in% ana_partiler) & !is.na(veri$soru4_temiz)] <- "Diger Partiler"
cat("\n--- Veri Ön İşlemimiz Sonrası (Temizlik Sonrası) ---\n")
##
## --- Veri Ön İşlemimiz Sonrası (Temizlik Sonrası) ---
sort(table(veri$soru4_temiz), decreasing = FALSE)
##
## Oy Kullanmadi MHP IYI Parti CHP AKP
## 7 114 458 523 1348
## Zafer Partisi Diger Partiler Yeni Parti
## 2417 2789 9017
Algoritmik mantığa göre doğru ilerledik mi verileri doğru sınıflandırdık mı tek tek bakalım.
# --- GÜNCEL PARTİ TERCİHLERİ İÇİN ÇİFT YÖNLÜ STRES TESTİ (KONTROL) ---
# Temiz sütunda o parti yazmasına rağmen, orijinal cevapta olumsuzluk belirtenler var mı kontrolü:
unique(veri$soru4[veri$soru4_temiz == "AKP" & grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)])
## character(0)
unique(veri$soru4[veri$soru4_temiz == "CHP" & grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)])
## character(0)
unique(veri$soru4[veri$soru4_temiz == "MHP" & grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)])
## character(0)
unique(veri$soru4[veri$soru4_temiz == "IYI Parti" & grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)])
## character(0)
unique(veri$soru4[veri$soru4_temiz == "Zafer Partisi" & grepl("vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)])
## character(0)
unique(veri$soru4[veri$soru4_temiz == "Yeni Parti" & grepl("refah|yeniden|vermem|asla|değil|oy yok", veri$soru4, ignore.case = TRUE)])
## character(0)
# Diger Partiler sepetine yanlışlıkla ana parti ismi sızmış mı kontrolü:
unique(veri$soru4[veri$soru4_temiz == "Diger Partiler" & grepl("akp|chp|mhp|iyi|zafer", veri$soru4, ignore.case = TRUE)])
## [1] "Ülkenin dış işlerinde ve savunmasında iyi oldugu gibi ekonomi, alım gücü, eğitim ve liyakate dikkat edecek bir ADAM çıkana kadar kimseye oy yok."
## [2] "Ak partinin kaybetmesi gerekiyor olsa da karşıda oy verecek kimsenin olmaması yine ak partiye yönelmek zorunda bırakıyor, fakat ne olursa olsun akp'ye vermeyi düşünmüyorum. muhtemelen o anki en güçlü rakip ya da boş oy. çünkü özgür özelin ülke yönetecek kapasiteye sahip olduğunu göremiyorum, e kemal desen zaten boş, ne yapalım şimdi? maksat akp kaybetsin diyerek ondan daha kötüsünü mü kabul edeceğiz? zafer ve kayıp aynı anda gelecek ama sürekli kayıp anlık zaferden daha kötü değil midir?"
## [3] "Akp ve dem’e kesinlikle vermem.bi de mhp. Kime vereceğim kararsızım."
## [4] "Chp ye veririm muhtemelen ama zoraki belki hiç vermem"
## [5] "Yeni partinin pozisyonlanmasını zafer partisi ve iyi parti ittifakı ile karşılaştırarak karar veririm. Yeni partinin sosyal demokrat olması lazım, kürt milliyetçisi değil."
## [6] "Hepsi iktidarı destekliyor yeni prtiyi bilmiyorum ama iktidar yanlısı değilse desteklerim"
## [7] "Hiçbirine güvenmiyorum. Zafer’e vermiştim ama o da değilmiş. İktidar değişsin diye inanmadan oy kullanabilirim. Biraz da başkaları sk… pardon öpsün."
## [8] "CHP yıllardır zorbalik seviyesine ulaşan bir mejburiyetle kendin belirlediği kişilere oy vermemizi sagladi. Haluk Levent konusu son. Unutulmamaliki bugün yeni parti kuracak olanlar eskileriyle ayni artik aptal yerine konmak istemiyorum Atatürk’ün partisine sizin gibi halktan ve Aydin bir kişinin kişilerin oluşumlarin gelmesini istiyorum"
## [9] "Yeni partiyi önce görelim, beleş oy yok artık"
library(dplyr)
genc_kusak <- veri %>% filter(yas == "18-24") ## Güncel veriden genç kuşağı tekrar ayırdık
eski_kusak <- veri %>% filter(yas %in% c("45-54", "55-64", "65 yas ve uzeri")) ## Güncel veriden eski kuşağı tekrar ayırdık
cat("\n--- Gelir Dağılımı-Parti Tercihi Ön Sezi Analizi ---\n")
##
## --- Gelir Dağılımı-Parti Tercihi Ön Sezi Analizi ---
tablo_gelir_parti_ham <- table(veri$soru1_temiz, veri$soru3_temiz)
saglamali_tablo_gelir_ham <- addmargins(tablo_gelir_parti_ham , margin = 1)
cat("\n--- Gelir ve Parti Dağılımı Ham Sayıları ---\n")
##
## --- Gelir ve Parti Dağılımı Ham Sayıları ---
print(saglamali_tablo_gelir_ham)
##
## AKP CHP Diger Partiler IYI Parti MHP Oy Kullanmadi
## 110.001 TL ve üzeri 247 2323 143 344 72 195
## 28.000 TL ve altı 52 505 58 78 21 354
## 28.001 - 45.000 TL 91 876 58 128 26 189
## 45.001 - 70.000 TL 150 1223 101 175 28 141
## 70.001 - 110.000 TL 316 2238 176 339 117 252
## geliri yok / calismiyor 204 1378 119 279 44 1874
## Sum 1060 8543 655 1343 308 3005
##
## Yeni Parti Zafer Partisi
## 110.001 TL ve üzeri 0 297
## 28.000 TL ve altı 1 113
## 28.001 - 45.000 TL 0 169
## 45.001 - 70.000 TL 0 218
## 70.001 - 110.000 TL 0 420
## geliri yok / calismiyor 2 423
## Sum 3 1640
Yukarıdaki tabloda amacımız, gelir dağılımlarına göre seçmenlerin son milletvekili seçimlerinde nasıl oy dağılımı yaptığını incelemektir. Tabloya baktığımızda göze çarpan garip bir durum var: Yeni Parti henüz yeni kurulan bir parti olduğu için 2023’teki milletvekili seçimlerinde yoktu. Her ne kadar kodlarımızda Yeniden Refah ile karışmasın diye önlem alsak da, anketteki “18 yaşıma yeni girdim” gibi cevaplarda geçen “yeni” kelimesini kodumuz yakaladığı için tabloda 3 kişilik bir Yeni Parti oyu çıkıyor.
Ama 17.000 kişilik dev bir veri setinde bu 3 kişinin Yeni Parti’de görünmesi bizim analizimizi etkilemeyecek kadar küçük bir Data Noise (Gürültü) olduğu için burayı hiç ellemeyip olduğu gibi bıraktık.
cat(“— Gelir Dağılımı-Parti Tercihi Ön Sezi Analizi SONUÇLARI —”)
➔ Analist Notu: Bu analizde yer alan “Oy Kullanmadi” sütunundaki yoğunluğun önemli bir kısmının 18 yaş altı kitle kaynaklı olduğu görülmektedir. Nitekim daha önce çalıştırdığımız table(veri$yas, useNA = “always”) kodlamasında da net bir şekilde gördüğümüz üzere veri setimizde 18 yaş altı 880 kişi bulunmaktadır. Ancak bu kişileri “nasıl olsa oy kullanamıyorlar” diyerek veriden tamamen silmek doğru bir yaklaşım değildir; çünkü özellikle Soru 4 gibi geleceğe dönük sorularda bu gençler ileride oy kullanacak birer seçmen olacaklardır ve onları analizden koparmak çalışmanın kapsamını ve vizyonunu daraltacaktır. Bu yüzden 18 yaş altı seçmen verisini çöpe atmak yerine, daha önce oluşturduğumuz filtrelemelerle (genç kuşak: 18-24 ve eski kuşak: 45-54, 55-64, 65 yaş ve üzeri) gruplar halinde yola devam etmek çok daha sağlıklı ve doğru bir yöntem olacaktır.