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) 0 else 'Azalan' if model.coef_[0] 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 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 hesaplamaları
Tercih Önerileri:
- Öğrenci sıralamasına göre kategorize edilmiş öneriler:
- Güvenli: Yerleşme ihtimali yüksek
- Orta riskli: Dengeli seçenekler
- Riskli: Şansa bağlı tercihler
Görselleştirmeler:
- Sıralama trend grafikleri
- Kontenjan vs sıralama scatter plotları
- Yıllık değişim oranları
- Box plot dağılımları
Raporlama:
- Detaylı analiz raporları
- Çoklu bölüm karşılaştırmaları
- Dosya çıktısı (.txt formatında)
Nasıl Çalışır?
1. YKSTercihAnalizi sınıfı tüm fonksiyonları içerir.
2. demo_calistir() fonksiyonu örnek bir akış sunar:
- Örnek veri oluşturur (10 bölüm, 2018-2024 yılları).
- "Bilgisayar Mühendisliği - İTÜ" için analiz yapar.
- 50.000 sıralamalı bir öğrenci için tercih önerisi üretir.
- Rapor oluşturur ve görselleştirme gösterir.
Neden Kullanılır?
- Öğrenciler için veriye dayalı tercih stratejisi geliştirme.
- Bölümlerin tarihsel sıralama dalgalanmalarını anlama.
- Kontenjan değişimlerinin sıralamaya etkisini ölçme.
Çalıştırma
- Kod doğrudan çalıştırılabilir (if __name__ == "__main__" bloğu demo başlatır).
- Gerçek veri için veri_yukle(dosya_yolu="gercek_veri.csv") kullanılabilir.
Kimler Kullanabilir?
- YKS'ye girecek öğrenciler ve aileleri
- Rehber öğretmenler
- Etüt merkezi uzmanları
- Eğitim danışmanları
- Veri analizi öğrenmek isteyenler
Matplotlib ve Seaborn ile profesyonel görselleştirmeler oluşturur ve Türkçe karakter desteği sağlar.
Öç YKS Tercih Analiz Aracı öğrencilerin YKS tercih sürecinde bilinçli karar vermesini sağlamak için istatistiksel araçları ve makine öğrenmesi temellerini kullanan Türkiye'de ve dünyada ilk ve tek kapsamlı programdır.
Kayıt Tarihi : 4.7.2025 20:04:00





© Bu şiirin her türlü telif hakkı şairin kendisine ve / veya temsilcilerine aittir.
Bu şiire henüz hiç kimse yorum yapmadı. İlk yorum yapan sen ol!