"Bütün sanatlar, insanları birleştirmek için var olmuştur. Ama benim sanatım, beni insanlardan ayırıyor." – Franz Kafka"

Öç Yks Terci̇h Anali̇z Araci

ÖÇ YKS Tercih Analiz Aracı, üniversite adaylarının tercih sürecini kolaylaştıran Python tabanlı bir veri analiz sistemidir. Pandas, Matplotlib ve Scikit-learn kütüphaneleri kullanılarak geliştirilen bu araç, öğrencilerin sınav sonuçlarını analiz eder, istatistiksel karşılaştırmalar sunar ve tercih stratejileri oluşturur. Türkçe karakter desteğiyle yerli kullanıcılar için özel olarak tasarlanmıştır.

yazı resim

ÖÇ YKS TERCİH ANALİZ ARACI

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import warnings
warnings.filterwarnings('ignore')

Türkçe karakter desteği için matplotlib ayarları

plt.rcParams['font.family'] = ['DejaVu Sans']
plt.rcParams['font.sans-serif'] = ['DejaVu Sans'] # Ek font ayarı eklendi
plt.rcParams['axes.unicode_minus'] = False

class YKSTercihAnalizi:
def __init__(self):
"""YKS Tercih Analizi sınıfının başlatıcı fonksiyonu"""
self.veri = None
self.analiz_sonuclari = {}

def veri_yukle(self, dosya_yolu=None, manuel_veri=None):
if dosya_yolu:
self.veri = pd.read_csv(dosya_yolu)
elif manuel_veri:
self.veri = pd.DataFrame(manuel_veri)
else:
self.ornek_veri_olustur()

def ornek_veri_olustur(self):
np.random.seed(42)
bolumler = [
"Bilgisayar Mühendisliği - İTÜ",
"Endüstri Mühendisliği - ODTÜ",
"İşletme - Boğaziçi",
"Tıp - Hacettepe",
"Hukuk - İstanbul",
"Makine Mühendisliği - ODTÜ",
"Elektrik-Elektronik Müh. - İTÜ",
"Uluslararası İlişkiler - Bilkent",
"Ekonomi - Boğaziçi",
"Psikoloji - ODTÜ"
]
yillar = [2018, 2019, 2020, 2021, 2022, 2023, 2024]
veri_listesi = []

for bolum in bolumler:
base_siralama = np.random.randint(1000, 50000)
trend = np.random.choice([-1, 0, 1], p=[0.3, 0.4, 0.3])
volatilite = np.random.uniform(0.05, 0.25)
for i, yil in enumerate(yillar):
trend_etkisi = trend * i * 500
rastgele_degisim = np.random.normal(0, base_siralama * volatilite)
siralama = max(1, int(base_siralama + trend_etkisi + rastgele_degisim))
kontenjan = np.random.randint(50, 300)
veri_listesi.append({
'Yil': yil,
'Bolum': bolum,
'Universite': bolum.split(' - ')[1],
'Siralama': siralama,
'Kontenjan': kontenjan,
'Doluluk_Orani': np.random.uniform(0.85, 1.0)
})
self.veri = pd.DataFrame(veri_listesi)
print("Örnek veri seti oluşturuldu!")

def tanimlayici_istatistikler(self, bolum_adi):
if self.veri is None:
print("Önce veri yüklemelisiniz!")
return None
bolum_verisi = self.veri[self.veri['Bolum'] == bolum_adi]['Siralama']
if len(bolum_verisi) == 0:
print(f"'{bolum_adi}' bölümü bulunamadı!")
return None
sonuclar = {
'ortalama': bolum_verisi.mean(),
'medyan': bolum_verisi.median(),
'std_sapma': bolum_verisi.std(),
'min_siralama': bolum_verisi.min(),
'max_siralama': bolum_verisi.max(),
'varyasyon_katsayisi': (bolum_verisi.std() / bolum_verisi.mean()) * 100,
'carpiklik': stats.skew(bolum_verisi),
'basiklik': stats.kurtosis(bolum_verisi)
}
return sonuclar

def trend_analizi(self, bolum_adi):
"""
Trend analizi yapar - Linear Regression ve hareketli ortalama

Parameters:
bolum_adi (str): Analiz edilecek bölüm adı

Returns:
dict: Trend analizi sonuçları
"""
bolum_verisi = self.veri[self.veri['Bolum'] == bolum_adi].copy()
bolum_verisi = bolum_verisi.sort_values('Yil')

if len(bolum_verisi) < 3:
print("Trend analizi için en az 3 yıllık veri gerekli!")
return None

Linear Regression

X = bolum_verisi['Yil'].values.reshape(-1, 1)
y = bolum_verisi['Siralama'].values

model = LinearRegression()
model.fit(X, y)

Tahmin

y_pred = model.predict(X)
r2 = r2_score(y, y_pred)

Hareketli ortalama (3 yıllık) - DÜZELTME: center=True parametresi kaldırıldı

bolum_verisi['Hareketli_Ortalama'] = bolum_verisi['Siralama'].rolling(window=3).mean()

Gelecek tahmini (2025-2026)

gelecek_yillar = np.array([[2025], [2026]])
gelecek_tahmin = model.predict(gelecek_yillar)

sonuclar = {
'egim': model.coef_[0],
'kesim': model.intercept_,
'r2_score': r2,
'trend_yonu': 'Artan' if model.coef_[0] > 0 else 'Azalan' if model.coef_[0] < 0 else 'Sabit',
'yillik_degisim': abs(model.coef_[0]),
'gelecek_tahmin_2025': gelecek_tahmin[0],
'gelecek_tahmin_2026': gelecek_tahmin[1],
'hareketli_ortalama': bolum_verisi['Hareketli_Ortalama'].tolist(),
'yillar': bolum_verisi['Yil'].tolist(),
'siralamalar': bolum_verisi['Siralama'].tolist()
}

return sonuclar

def volatilite_analizi(self, bolum_adi):
"""
Volatilite ve risk analizi

Parameters:
bolum_adi (str): Analiz edilecek bölüm adı

Returns:
dict: Volatilite analizi sonuçları
"""
bolum_verisi = self.veri[self.veri['Bolum'] == bolum_adi]['Siralama']
if len(bolum_verisi) < 2:
print("Volatilite analizi için en az 2 yıllık veri gerekli!")
return None

Yıllık değişim oranları

yillik_degisim = bolum_verisi.pct_change().dropna()

Volatilite metrikleri

volatilite = yillik_degisim.std()
ortalama_degisim = yillik_degisim.mean()

Risk kategorisi

if volatilite < 0.1:
risk_kategorisi = "Düşük Risk"
elif volatilite < 0.2:
risk_kategorisi = "Orta Risk"
else:
risk_kategorisi = "Yüksek Risk"

Güven aralığı (%95)

ortalama = bolum_verisi.mean()
std_hata = bolum_verisi.std() / np.sqrt(len(bolum_verisi))

DÜZELTME: Parametre sırası düzeltildi

guven_araligi = stats.t.interval(0.95, len(bolum_verisi)-1, loc=ortalama, scale=std_hata)

sonuclar = {
'volatilite': volatilite,
'ortalama_degisim': ortalama_degisim,
'risk_kategorisi': risk_kategorisi,
'guven_araligi_alt': guven_araligi[0],
'guven_araligi_ust': guven_araligi[1],
'maksimum_dalgalanma': bolum_verisi.max() - bolum_verisi.min()
}

return sonuclar

def kontenjan_analizi(self, bolum_adi):
"""
Kontenjan etkisi analizi

Parameters:
bolum_adi (str): Analiz edilecek bölüm adı

Returns:
dict: Kontenjan analizi sonuçları
"""
bolum_verisi = self.veri[self.veri['Bolum'] == bolum_adi].copy()

Kontenjan-Sıralama korelasyonu

korelasyon = bolum_verisi['Kontenjan'].corr(bolum_verisi['Siralama'])

Kontenjan değişim analizi

bolum_verisi = bolum_verisi.sort_values('Yil')
kontenjan_degisim = bolum_verisi['Kontenjan'].pct_change().dropna()

sonuclar = {
'kontenjan_siralama_korelasyon': korelasyon,
'ortalama_kontenjan': bolum_verisi['Kontenjan'].mean(),
'kontenjan_volatilite': kontenjan_degisim.std(),
'son_yil_kontenjan': bolum_verisi['Kontenjan'].iloc[-1],
'kontenjan_trend': 'Artan' if kontenjan_degisim.mean() > 0 else 'Azalan'
}

return sonuclar

def kapsamli_analiz(self, bolum_adi):
"""
Kapsamlı analiz - tüm analizleri birleştirir

Parameters:
bolum_adi (str): Analiz edilecek bölüm adı

Returns:
dict: Kapsamlı analiz sonuçları
"""
print(f"\n=== {bolum_adi} - KAPSAMLI ANALİZ ===")

Tüm analizleri çalıştır

tanimlayici = self.tanimlayici_istatistikler(bolum_adi)
trend = self.trend_analizi(bolum_adi)
volatilite = self.volatilite_analizi(bolum_adi)
kontenjan = self.kontenjan_analizi(bolum_adi)

if any(x is None for x in [tanimlayici, trend, volatilite, kontenjan]):
return None

Sonuçları birleştir

kapsamli_sonuc = {
'bolum': bolum_adi,
'tanimlayici': tanimlayici,
'trend': trend,
'volatilite': volatilite,
'kontenjan': kontenjan
}

Analiz özeti yazdır

self.analiz_ozeti_yazdir(kapsamli_sonuc)

return kapsamli_sonuc

def analiz_ozeti_yazdir(self, sonuc):
"""Analiz sonuçlarının özetini yazdırır"""
t = sonuc['tanimlayici']
tr = sonuc['trend']
v = sonuc['volatilite']
k = sonuc['kontenjan']

print(f"\n📊 TANIMLAYICI İSTATİSTİKLER")
print(f" Ortalama Sıralama: {t['ortalama']:.0f}")
print(f" Medyan Sıralama: {t['medyan']:.0f}")
print(f" Standart Sapma: {t['std_sapma']:.0f}")
print(f" Min-Max: {t['min_siralama']:.0f} - {t['max_siralama']:.0f}")
print(f" Varyasyon Katsayısı: %{t['varyasyon_katsayisi']:.1f}")

print(f"\n📈 TREND ANALİZİ")
print(f" Trend Yönü: {tr['trend_yonu']}")
print(f" Yıllık Değişim: {tr['yillik_degisim']:.2f}")
print(f" R² Skoru: {tr['r2_score']:.3f}")
print(f" 2025 Tahmini: {tr['gelecek_tahmin_2025']:.0f}")
print(f" 2026 Tahmini: {tr['gelecek_tahmin_2026']:.0f}")

print(f"\n⚠️ VOLATİLİTE ANALİZİ")
print(f" Risk Kategorisi: {v['risk_kategorisi']}")
print(f" Volatilite: {v['volatilite']:.3f}")
print(f" %95 Güven Aralığı: {v['guven_araligi_alt']:.0f} - {v['guven_araligi_ust']:.0f}")
print(f" Max Dalgalanma: {v['maksimum_dalgalanma']:.0f}")

print(f"\n👥 KONTENJAN ANALİZİ")
print(f" Kontenjan-Sıralama Korelasyon: {k['kontenjan_siralama_korelasyon']:.3f}")
print(f" Ortalama Kontenjan: {k['ortalama_kontenjan']:.0f}")
print(f" Son Yıl Kontenjan: {k['son_yil_kontenjan']}")
print(f" Kontenjan Trendi: {k['kontenjan_trend']}")

def gorsellik_olustur(self, bolum_adi):
"""
Bölüm için görselleştirmeler oluşturur

Parameters:
bolum_adi (str): Görselleştirme yapılacak bölüm adı
"""
bolum_verisi = self.veri[self.veri['Bolum'] == bolum_adi].copy()
bolum_verisi = bolum_verisi.sort_values('Yil')

2x2 subplot oluştur

fig, axes = plt.subplots(2, 2, figsize=(15, 12))
fig.suptitle(f'{bolum_adi} - Detaylı Analiz', fontsize=16, fontweight='bold')

1. Sıralama Trendi

axes[0,0].plot(bolum_verisi['Yil'], bolum_verisi['Siralama'],
marker='o', linewidth=2, markersize=8)
axes[0,0].set_title('Sıralama Trendi')
axes[0,0].set_xlabel('Yıl')
axes[0,0].set_ylabel('Sıralama')
axes[0,0].grid(True, alpha=0.3)

Trend çizgisi ekle

x = bolum_verisi['Yil'].values.reshape(-1, 1)
y = bolum_verisi['Siralama'].values
model = LinearRegression()
model.fit(x, y)
y_pred = model.predict(x)
axes[0,0].plot(bolum_verisi['Yil'], y_pred, '--', color='red', alpha=0.7)

2. Kontenjan vs Sıralama

axes[0,1].scatter(bolum_verisi['Kontenjan'], bolum_verisi['Siralama'],
s=100, alpha=0.7, c=bolum_verisi['Yil'], cmap='viridis')
axes[0,1].set_title('Kontenjan vs Sıralama')
axes[0,1].set_xlabel('Kontenjan')
axes[0,1].set_ylabel('Sıralama')
axes[0,1].grid(True, alpha=0.3)

3. Yıllık Değişim Oranları

yillik_degisim = bolum_verisi['Siralama'].pct_change().dropna() * 100
axes[1,0].bar(bolum_verisi['Yil'].iloc[1:], yillik_degisim, alpha=0.7)
axes[1,0].set_title('Yıllık Değişim Oranları (%)')
axes[1,0].set_xlabel('Yıl')
axes[1,0].set_ylabel('Değişim (%)')
axes[1,0].axhline(y=0, color='red', linestyle='--', alpha=0.5)
axes[1,0].grid(True, alpha=0.3)

4. Box Plot

axes[1,1].boxplot([bolum_verisi['Siralama']], labels=[bolum_adi.split(' - ')[0]])
axes[1,1].set_title('Sıralama Dağılımı')
axes[1,1].set_ylabel('Sıralama')
axes[1,1].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

def tercih_oneris_hesapla(self, ogrenci_siralama, hedef_bolumler):
"""
Öğrenci sıralamasına göre tercih önerisi hesaplar

Parameters:
ogrenci_siralama (int): Öğrencinin sıralaması
hedef_bolumler (list): Hedef bölümler listesi

Returns:
dict: Tercih önerileri
"""
oneriler = {
'guvenli': [],
'orta_riskli': [],
'riskli': []
}

for bolum in hedef_bolumler:
if bolum not in self.veri['Bolum'].values:
continue

Son 3 yılın ortalaması ve volatilitesi

bolum_verisi = self.veri[self.veri['Bolum'] == bolum]
son_3_yil = bolum_verisi.nlargest(3, 'Yil')['Siralama']

ortalama_siralama = son_3_yil.mean()
std_sapma = son_3_yil.std()

Güven aralığı hesapla

alt_sinir = ortalama_siralama - (1.5 * std_sapma)
ust_sinir = ortalama_siralama + (1.5 * std_sapma)

Kategori belirleme

if ogrenci_siralama < alt_sinir:
kategori = 'guvenli'
elif ogrenci_siralama > ust_sinir:
kategori = 'riskli'
else:
kategori = 'orta_riskli'

oneriler[kategori].append({
'bolum': bolum,
'ortalama_siralama': ortalama_siralama,
'yerlesme_ihtimali': self.yerlesme_ihtimali_hesapla(ogrenci_siralama, son_3_yil),
'risk_skoru': abs(ogrenci_siralama - ortalama_siralama) / std_sapma if std_sapma > 0 else 0
})

Her kategoriyi risk skoruna göre sırala

for kategori in oneriler:
oneriler[kategori] = sorted(oneriler[kategori], key=lambda x: x['risk_skoru'])

return oneriler

def yerlesme_ihtimali_hesapla(self, ogrenci_siralama, gecmis_sirlamalar):
"""Yerleşme ihtimalini hesaplar"""
daha_iyi_yil_sayisi = sum(1 for s in gecmis_sirlamalar if ogrenci_siralama <= s)
return (daha_iyi_yil_sayisi / len(gecmis_sirlamalar)) * 100

def rapor_olustur(self, bolum_listesi, dosya_adi="yks_analiz_raporu.txt"):
"""
Çoklu bölüm için analiz raporu oluşturur

Parameters:
bolum_listesi (list): Analiz edilecek bölümler
dosya_adi (str): Rapor dosya adı
"""
with open(dosya_adi, 'w', encoding='utf-8') as f:
f.write("YKS TERCİH ANALİZ RAPORU\n")
f.write("=" * 50 + "\n\n")

for bolum in bolum_listesi:
if bolum not in self.veri['Bolum'].values:
continue

f.write(f"\n📋 {bolum}\n")
f.write("-" * 40 + "\n")

Temel istatistikler

stats = self.tanimlayici_istatistikler(bolum)
trend = self.trend_analizi(bolum)

if stats and trend:
f.write(f"Ortalama Sıralama: {stats['ortalama']:.0f}\n")
f.write(f"Son 5 Yıl Trendi: {trend['trend_yonu']}\n")
f.write(f"2025 Tahmini: {trend['gelecek_tahmin_2025']:.0f}\n")
f.write(f"Risk Kategorisi: {self.volatilite_analizi(bolum)['risk_kategorisi']}\n")
f.write("\n")

print(f"Rapor '{dosya_adi}' dosyasına kaydedildi!")

def grafik_ciz(self, bolum_adi):
veriler = self.veri[self.veri['Bolum'] == bolum_adi].sort_values('Yil')
plt.figure(figsize=(10,5))
sns.lineplot(data=veriler, x='Yil', y='Siralama', marker='o', label='Sıralama')
plt.title(f"{bolum_adi} - Yıllara Göre Sıralama")
plt.ylabel("Sıralama (Düşük daha iyi)")
plt.xlabel("Yıl")
plt.gca().invert_yaxis()
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()

def demo_calistir():
"""Demo fonksiyonu - programın nasıl kullanılacağını gösterir"""
print("🎯 YKS TERCİH VERİ ANALİZ PROGRAMI")
print("=" * 50)

Analiz nesnesini oluştur

analiz = YKSTercihAnalizi()

Örnek veri yükle

analiz.veri_yukle()

print("\n📋 Mevcut Bölümler:")
for i, bolum in enumerate(analiz.veri['Bolum'].unique(), 1):
print(f"{i}. {bolum}")

Örnek analizler

ornek_bolum = "Bilgisayar Mühendisliği - İTÜ"

print(f"\n🔍 Örnek Analiz: {ornek_bolum}")
kapsamli_sonuc = analiz.kapsamli_analiz(ornek_bolum)

Görselleştirme

print("\n📊 Görselleştirme oluşturuluyor...")
analiz.gorsellik_olustur(ornek_bolum)

Tercih önerisi örneği

print("\n💡 Tercih Önerisi Örneği (50,000 sıralama için):")
hedef_bolumler = list(analiz.veri['Bolum'].unique()[:5])
oneriler = analiz.tercih_oneris_hesapla(50000, hedef_bolumler)

for kategori, bolumler in oneriler.items():
if bolumler:
print(f"\n{kategori.upper()} KATEGORİSİ:")
for bolum_info in bolumler[:2]: # İlk 2 öneriyi göster
** print(f" • {bolum_info['bolum']}")
print(f" Yerleşme İhtimali: %{bolum_info['yerlesme_ihtimali']:.1f}")

Rapor oluştur

analiz.rapor_olustur(list(analiz.veri['Bolum'].unique()[:3]))

return analiz

Programı çalıştır

if __name__ == "__main__":
analiz_sistemi = demo_calistir()
Bu kod, YKS (Yükseköğretim Kurumları Sınavı) tercih analizi yapan kapsamlı bir Python programıdır. Türkiye'de üniversite tercihi yapacak öğrenciler için geliştirilmiş bir veri analiz aracıdır. Öğrencilerin üniversite bölümlerine yerleşme şansını istatistiksel yöntemlerle değerlendirmek için tasarlanmıştır.
Ana Özellikler:
İstatistiksel Analizler:
CSV dosyalarından veri yükleme veya otomatik örnek veri üretme.
- Bölümlerin geçmiş yıllardaki taban puanları/sıralamalarının analizi
- Tanımlayıcı istatistikler (ortalama, medyan, standart sapma)
- Trend analizi ve gelecek tahminleri
Gelişmiş Analiz Yöntemleri:
- Linear regression ile trend tahmini: Lineer regresyonla sıralama trendi ve gelecek tahmini (2025-2026). Ancak burada güncelleme yapılması gerekir. Zira Sınavı Geçerli Kişi Sayısı/Önlisans veya Lisansa Ait Toplam Kontenjan Sayısına göre analiz yapılması gerekir.
- Volatilite ve risk analizi: Risk kategorizasyonu (%95 güven aralığı, dalgalanma ölçümü).
- Kontenjan etkisi analizi: Kontenjan-sıralama korelasyonu ve kontenjan değişim trendi.
- Hareketli ortalama hesaplama

Yorumlar

Başa Dön