Yayın: 1 Mayıs 2024
Bazılarınızın bildiği gibi, Türkiye'de 31 Mart 2024'te yerel seçimler yapıldı. Bu seçimler, 22 yıllık AKP rejiminin bir seçimde ilk yenilgisini almasıyla dünya çapında yankı uyandırdı. Seçimlerin sürpriz galibi CHP oldu ve şimdi ülkenin nüfusunun %60'ını ve ekonomik çıktısının %80'ini oluşturan şehirleri yönetiyorlar.
Peki, bunlar nasıl oldu?
Türk televizyonlarını izlerseniz, analistler bu yenilgiyi ülkenin ekonomik nedenlerle tatmin olmayan emekli nüfusuna bağlarlar.
Türkiye'de başka yaygın bir algı da ülkenin gençlerinin (%70 seviyelerinde!) CHP politikalarını desteklediği, AKP'nin ise gençlerden destek almadığıdır. Bu nedenle, CHP'nin desteğinin ileriye dönük olarak artacağı söylenmektedir.
Analizcilerin yanlış tahminlerde bulunduğu ve yanlış bilgiler verdiği bilinmektedir. Bir veri bilimcisi olarak, bu iddiaların doğru olup olmadığını veri kullanarak kontrol etmek benim keyif ve görevimdir.
Bu tür bir analiz yapabilmek için, seçmenlerin yaş profiline ve nasıl oy kullandıklarına ihtiyacımız var. İnsanlar genellikle bu amaçla maliyetli anketler yaparlar. Ancak, kullanabileceğimiz güzel bir halka açık verimiz var.
Türkiye İstatistik Kurumu (TÜİK), seçim sonuçları verilerini ve seçmen yaş/cinsiyet/eğitim profilini ilçe düzeyinde yayınlamaktadır. Türkiye'nin 81 ili 973 ilçeye bölünmüştür.
Bizim amacımız için sadece yaş verilerine bakmamız gerekiyor, çünkü gençleri ~30 yaşın altında ve emeklileri 65 yaşın üzerinde temsil edebiliriz, çünkü Türkiye'de emeklilik yaşı 65'tir.
Bu verilere TÜİK'in seçim veritabanından bakabiliriz. Ne yazık ki, mevcut en son veri 2018 veritabanıdır. 2018'den bu yana birçok şey değişmiş olsa da, bu veriler bize makro seçmen eğilimlerinin bir bakışını verebilir.
Bu veritabanının sorunu, her ilçe için ayrı bir rapor oluşturmamız gerektiğidir. İlçe düzeyindeki rapor aşağıdaki gibi görünmektedir:
973 ilçe olduğunu düşünürsek, bu hem sıkıcı hem de yorucu bir iş, işte burada kazıma devreye giriyor.
973 ilçe olduğunu düşünürsek, bu hem sıkıcı hem de yorucu bir iş, işte burada kazıma devreye giriyor.
Verileri kazmak, bunları bir veri çerçevesine toplamak ve sonuç olarak bir CSV dosyasına dönüştürmek için gereken tüm kodlar için bu GitHub deposuna göz atın.
Genel olarak, fikir tüm ilçeler arasında dolaşarak şehirler ve ilçeler arasında geçiş yapmak ve "Raporu İndir"e tıklamaktır. Rapor indirildiğinde, bir sonraki ilçeye geçeriz. Bir şehrin tüm ilçeleri tükenene kadar, bir sonraki şehre geçeriz. Bu şekilde, Türkiye'nin 81 ilini ve 937 ilçesini dolaşır ve her ilçe için bir rapor indiririz.
from selenium import webdriver
import chromedriver_autoinstaller
from selenium.webdriver.common.by import By
import time
chromedriver_autoinstaller.install()
###### Web sürücüsünü başlat
driver = webdriver.Chrome()
time.sleep(1)
###### Ana siteye git
driver.get("https://biruni.tuik.gov.tr/secimdagitimapp/secimsecmen.zul")
time.sleep(1)
###### İstenen alanlar için radyo düğmelerini seç
for span in driver.find_elements(By.CSS_SELECTOR, ".grid-od span"):
if span.text == "2018":
span.find_element(By.CSS_SELECTOR, "input").click()
time.sleep(1)
for span in driver.find_elements(By.CSS_SELECTOR, ".grid-od span"):
if span.text == "Yurt içi seçmen":
span.find_element(By.CSS_SELECTOR, "input").click()
time.sleep(1)
for span in driver.find_elements(By.CSS_SELECTOR, ".grid-od span"):
if span.text == "Yaş grubu":
span.find_element(By.CSS_SELECTOR, "input").click()
time.sleep(1)
for span in driver.find_elements(By.CSS_SELECTOR, ".grid .gc span"):
if span.text == "İBBS-Düzey4 (İlçe)":
span.find_element(By.CSS_SELECTOR, "input").click()
time.sleep(1)
###### Şehirlerdeki şehirleri tanımlayın (81 tane olmalı)
tables = driver.find_elements(By.CSS_SELECTOR, ".listbox-btable")
for table in tables:
if "Adana" in table.text:
cities = table.find_elements(By.CSS_SELECTOR, "td")
break
city_names = [city.text for city in cities]
###### Bölge başına verileri kaydet
for city in cities:
city.click()
time.sleep(2)
tables = driver.find_elements(By.CSS_SELECTOR, ".listbox-btable")
for table in tables:
if "Tüm İlçeler" in table.text:
districts = table.find_elements(By.CSS_SELECTOR, "td")
break
district_names = [district.text for district in districts]
districts = [district for district in districts if "Tüm İlçeler" not in district.text]
for district in districts:
district.click()
time.sleep(1)
# Excel'i ayarla
excel = driver.find_element(By.CSS_SELECTOR, 'span[title="EXCEL"]').find_element(By.CSS_SELECTOR, 'input').click()
time.sleep(1)
## Verileri kaydet
save = driver.find_element(By.CSS_SELECTOR, 'input[value="Raporu Oluştur"]').click()
## Kayıt, Uyku
print(city.text, district.text)
time.sleep(1)
Veriler toplandığında, işlenecek 937 HTML dosyamız olacak. Aşağıdaki kodu kullanarak verileri temizler ve tek bir büyük CSV dosyasına birleştiririz:
import pandas as pd
import os
from bs4 import BeautifulSoup
import warnings
warnings.simplefilter(action='ignore')
folder = "<TUIKten/indirilen/dosyalarin_klasoru>"
paths = [f for f in os.listdir(folder) if f.endswith("xls")]
dfs = []
for path in paths:
with open(f"{folder}/{path}", "r", encoding="iso-8859-9") as f:
text = f.read()
soup = BeautifulSoup(text, "html")
tables = pd.read_html(str(soup.findAll("table")[1]))
city = tables[0].iloc[0, 0]
df = tables[2]
df.drop(1, axis=1, inplace=True)
district = df.iloc[0, 0]
df.columns = ["age", "male", "female", "all"]
df["city"] = city
df["district"] = district
df = df[1:]
for col in df.columns:
df[col] = df[col].str.replace(".", "", regex=False)
df = df[df["age"] != "Toplam"]
df["male"] = pd.to_numeric(df["male"])
df["female"] = pd.to_numeric(df["female"])
df["all"] = pd.to_numeric(df["all"])
dfs.append(df)
df = pd.concat(dfs, axis=0, ignore_index=True)
df.to_csv("data.csv", index=False)
Bu veriyle artık regresyon gibi modelleri çalıştırabilir ve oy veren yaş profili'nin oy sonuçlarını nasıl etkilediğini görebiliriz. Her ilçe bir veri noktası olarak ele alınacak ve 937 veri noktası ile istatistiksel olarak anlamlı sonuçlar elde etmeliyiz. Ancak bu başka bir makaleye aittir.
Umarım bu veri, Türkiye seçimleri için kullanışlı modeller geliştirmek için birçok kişi tarafından kullanılır.
Kod ve veri için bu GitHub deposunu kontrol edin.
İyi kodlamalar!
Bu blog İngilizce'den ChatGPT ile çevrilmiştir. Herhangi bir belirsizlik durumunda İletişim sayfasından bana ulaşabilirsiniz.
Yorum bırak
Yorumlar
Diğer bloglara bak
2024/06/19
Svelte ve JavaScript ile Basit ve Dinamik Bir Tooltip Yaratma Yöntemi
2024/06/17
JavaScript ile Tokyo'nun İnteraktif Haritasını Oluşturun
2024/06/14
Matplotlib'de Japonca Karakter Sorununu Çözme Yöntemi
2024/06/13
Kitap İncelemesi | Ötekiyle Konuşmak by Malcolm Gladwell
2024/06/07
Japonca'da En Sık Kullanılan 3.000 Kanji
2024/06/07
VSCode'da Regex Kullanarak Replace Yapma Yöntemi
2024/06/06
Svelte'de Readable Store Kullanmayın
2024/06/05
Dosyaları Gzip ve Pako ile Sıkıştırarak Web Sitesinin Yükleme Hızını Artırın
2024/05/31
Web Sayfasında Farenin Uzerinde Oldugu Kelimeyi JavaScript ile Bulun
2024/05/29
Svelte ve SVG ile Interaktif Harita Oluşturun
2024/05/28
Kitap İncelemesi | Geleneklere Uymayanlar Dünyayı Nasıl İleri Taşıyor? by Adam Grant & Sheryl Sandberg
2024/05/27
Javascript Kullanarak Sudoku Nasıl Çözülür?
2024/05/26
Web Siteme Gelen Trafiği Bir Ayda Nasıl 10 Kat Artırdım?
2024/05/24
Hayat Bisiklet Sürmek Gibidir
2024/05/19
JavaScript'te Backtracking Algoritması ile Tamamlanmış Sudoku Oluşturun
2024/05/16
Tailwind Neden Harikadır ve Web Geliştirmeyi Nasıl Kolay Hale Getirir?
2024/05/15
Python ve Git Hooks ile Otomatik Olarak Site Haritası Oluşturma
2024/05/14
Kitap İncelemesi | Çok Yönlü - Başarı İçin Neden Çok Şeyle İlgilenmeliyiz? by David Epstein
2024/05/13
Svelte ve SvelteKit nedir?
2024/05/12
SvelteKit ile Internationalization (Çoklu Dil Desteği)
2024/05/11
Svelte'de Caching ile Deploy Süresini Azaltın
2024/05/10
Svelte ve Intersection Oberver ile Lazy-Load
2024/05/10
Genetik Algoritma İle Hisse Senedi Portföyü Optimizasyonu
2024/05/09
ShapeFile Formatini SVG Formatina Degistirme Yontemi
2024/05/08
Svelte'de Reaktivite: Variables, Binding, ve Key Fonksiyonu
2024/05/07
Kitap İncelemesi | Savaş Sanatı - Sun Tzu
2024/05/06
Specialistlik Bitti. Yaşasın Generalistlik!
2024/05/03
2018 Milletvekili Seçimlerinde Yaşa Göre Parti Eğilimi
2024/04/30
Svelte ve Tailwind Ile Infinite Scroll Yapma Yontemi
2024/04/29
1 Yıl İçerisinde Japonca Konuşabilmek
2024/04/25
Svelte ve Tailwind ile Kullanıma Hazır Web Sitesi Şablonu
2024/01/29
Tembel Muhendisler Kotu Urunler Yapar
2024/01/28
Mukemmellik Uzerine
2024/01/28
MacBook'ta PDF'i PNG'ye Cevirme Yontemi
2023/12/31
2023'u Kapatiyoruz: Bu Yil Okunan 24 Kitap
2023/12/30
Python PIL Kullarak Foto Kolaji Yapma Yontemi
2024/01/09
Site Ziyaretcilerinin Alet ve Tarayicilarini Tespit Etme Yontemi
2024/01/19
ChatGPT Cevap Anatomisi