2025 yılı için henüz kontenjan sayısı belli olmadığından kontenjan sayısı açıklanınca güncelleme yapmak gereklidir. Aksi takdirde çok daha iyi bir sıralama sonucu çıkar.
import React, { useState, useEffect } from 'react';
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, BarChart, Bar, ScatterChart, Scatter } from 'recharts';
import { TrendingUp, TrendingDown, AlertTriangle, CheckCircle, Calculator, BarChart3, Target } from 'lucide-react';
const EducationChoiceAnalyzer = () => {
const [selectedProgram, setSelectedProgram] = useState('van');
const [analysisMode, setAnalysisMode] = useState('trend');
const [predictions, setPredictions] = useState({});
// Örnek veriler
const programData = {
van: {
name: "Van YYÜ - Acil Durum ve Afet Yönetimi",
data: [
{ year: 2019, ranking: 682966, quota: 31, candidates: 2390188, totalQuota: 298220 },
{ year: 2020, ranking: 629200, quota: 31, candidates: 2295890, totalQuota: 299630 },
{ year: 2021, ranking: 664789, quota: 31, candidates: 2416748, totalQuota: 310732 },
{ year: 2022, ranking: 752667, quota: 31, candidates: 3008029, totalQuota: 313941 },
{ year: 2023, ranking: 707442, quota: 30, candidates: 2995399, totalQuota: 331202 },
{ year: 2024, ranking: 684970, quota: 30, candidates: 2819075, totalQuota: 278261 }
]
},
ankara: {
name: "Ankara Ü. Beypazarı - Acil Durum ve Afet Yönetimi",
data: [
{ year: 2019, ranking: 594040, quota: 72, candidates: 2390188, totalQuota: 298220 },
{ year: 2020, ranking: 637557, quota: 72, candidates: 2295890, totalQuota: 299630 },
{ year: 2021, ranking: 729104, quota: 71, candidates: 2416748, totalQuota: 310732 },
{ year: 2022, ranking: 819193, quota: 72, candidates: 3008029, totalQuota: 313941 },
{ year: 2023, ranking: 830430, quota: 71, candidates: 2995399, totalQuota: 331202 },
{ year: 2024, ranking: 765428, quota: 71, candidates: 2819075, totalQuota: 278261 }
]
},
mugla: {
name: "Muğla SKÜ Kavaklıdere - Acil Durum ve Afet Yönetimi",
data: [
{ year: 2019, ranking: 607188, quota: 47, candidates: 2390188, totalQuota: 298220 },
{ year: 2020, ranking: 630953, quota: 47, candidates: 2295890, totalQuota: 299630 },
{ year: 2021, ranking: 725747, quota: 47, candidates: 2416748, totalQuota: 310732 },
{ year: 2022, ranking: 848232, quota: 47, candidates: 3008029, totalQuota: 313941 },
{ year: 2023, ranking: 874308, quota: 47, candidates: 2995399, totalQuota: 331202 },
{ year: 2024, ranking: 819608, quota: 46, candidates: 2819075, totalQuota: 278261 }
]
},
pamukkale: {
name: "Pamukkale Ü. Serinhisar - Acil Durum ve Afet Yönetimi",
data: [
{ year: 2019, ranking: 640530, quota: 31, candidates: 2390188, totalQuota: 298220 },
{ year: 2020, ranking: 645353, quota: 31, candidates: 2295890, totalQuota: 299630 },
{ year: 2021, ranking: 763886, quota: 31, candidates: 2416748, totalQuota: 310732 },
{ year: 2022, ranking: 870057, quota: 31, candidates: 3008029, totalQuota: 313941 },
{ year: 2023, ranking: 891256, quota: 31, candidates: 2995399, totalQuota: 331202 },
{ year: 2024, ranking: 825773, quota: 31, candidates: 2819075, totalQuota: 278261 }
]
}
};
// Hesaplama fonksiyonları
const calculateRatio = (data) => {
return data.map(item => ({
...item,
ratio: (item.ranking / item.candidates * 100).toFixed(3),
competitionIndex: (item.candidates / item.totalQuota).toFixed(2)
}));
};
const calculateStatistics = (data) => {
const rankings = data.map(item => item.ranking);
const ratios = data.map(item => item.ranking / item.candidates);
const mean = rankings.reduce((a, b) => a + b, 0) / rankings.length;
const variance = rankings.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / rankings.length;
const stdDev = Math.sqrt(variance);
const meanRatio = ratios.reduce((a, b) => a + b, 0) / ratios.length;
return {
mean: Math.round(mean),
stdDev: Math.round(stdDev),
meanRatio: meanRatio.toFixed(4),
volatility: (stdDev / mean * 100).toFixed(2)
};
};
const predict2025 = (data) => {
const recentData = data.slice(-3);
const ratios = recentData.map(item => item.ranking / item.candidates);
const avgRatio = ratios.reduce((a, b) => a + b, 0) / ratios.length;
// 2025 için tahmini aday sayısı (trend analizi)
const candidatesTrend = data.slice(-2);
const candidateChange = candidatesTrend[1].candidates - candidatesTrend[0].candidates;
const estimated2025Candidates = candidatesTrend[1].candidates + candidateChange * 0.5;
const prediction = Math.round(avgRatio * estimated2025Candidates);
const confidenceInterval = Math.round(prediction * 0.05); // %5 hata payı
return {
prediction,
lowerBound: prediction - confidenceInterval,
upperBound: prediction + confidenceInterval,
estimated2025Candidates: Math.round(estimated2025Candidates),
avgRatio: avgRatio.toFixed(4)
};
};
const currentData = programData[selectedProgram];
const enrichedData = calculateRatio(currentData.data);
const stats = calculateStatistics(currentData.data);
const prediction2025 = predict2025(currentData.data);
const getTrendIcon = (data) => {
const recent = data.slice(-2);
const trend = recent[1].ranking - recent[0].ranking;
if (trend > 0) return ;
if (trend < 0) return ;
return
;
};
const getRiskLevel = (volatility) => {
if (volatility < 10) return { level: 'Düşük', color: 'text-green-600', icon: CheckCircle };
if (volatility < 20) return { level: 'Orta', color: 'text-yellow-600', icon: AlertTriangle };
return { level: 'Yüksek', color: 'text-red-600', icon: AlertTriangle };
};
const riskInfo = getRiskLevel(parseFloat(stats.volatility));
return (
Eğitim Tercih Analiz Sistemi
===========================================
Veri odaklı tercih analizi ve 2025 tahmin modeli
{/* Program Seçimi */}
Program Seçimi
{Object.entries(programData).map(([key, program]) => (
key={key}
onClick={() => setSelectedProgram(key)}
className={p-4 rounded-lg border-2 transition-all ${ selectedProgram === key ? 'border-blue-500 bg-blue-50 text-blue-700' : 'border-gray-200 hover:border-gray-300' }
}
>
{program.name}
))}
{/* Ana İstatistikler */}
Ortalama Sıralama
{stats.mean.toLocaleString()}
{getTrendIcon(currentData.data)}
Volatilite
{stats.volatility}%
Risk: {riskInfo.level}
2025 Tahmini
{prediction2025.prediction.toLocaleString()}
±{(prediction2025.upperBound - prediction2025.prediction).toLocaleString()}
Standart Sapma
{stats.stdDev.toLocaleString()}
{/* Analiz Türü Seçimi */}
onClick={() => setAnalysisMode('trend')}
className={px-4 py-2 rounded-lg ${ analysisMode === 'trend' ? 'bg-blue-500 text-white' : 'bg-gray-200' }
}
>
Trend Analizi
onClick={() => setAnalysisMode('ratio')}
className={px-4 py-2 rounded-lg ${ analysisMode === 'ratio' ? 'bg-blue-500 text-white' : 'bg-gray-200' }
}
>
Oran Analizi
onClick={() => setAnalysisMode('competition')}
className={px-4 py-2 rounded-lg ${ analysisMode === 'competition' ? 'bg-blue-500 text-white' : 'bg-gray-200' }
}
>
Rekabet Analizi
{analysisMode === 'trend' && (
[value.toLocaleString(), name]} />
)}
{analysisMode === 'ratio' && (
[value + '%', name]} />
)}
{analysisMode === 'competition' && (
)}
{/* 2025 Tahmin Detayları */}
2025 Tahmin Analizi
Optimistik Senaryo
{prediction2025.lowerBound.toLocaleString()}
En iyi durumda beklenen sıralama
Orta Senaryo
{prediction2025.prediction.toLocaleString()}
En olası sıralama tahmini
Pesimistik Senaryo
{prediction2025.upperBound.toLocaleString()}
En kötü durumda beklenen sıralama
Tahmin Metodolojisi
-
• Son 3 yılın sıralama/aday oranı ortalaması: {prediction2025.avgRatio}
-
• Tahmini 2025 aday sayısı: {prediction2025.estimated2025Candidates.toLocaleString()}
-
• Güven aralığı: ±%5 (volatilite bazlı)
-
• Model tipi: Üstel düzeltme + Trend analizi
{/* Detaylı Veri Tablosu */}
Detaylı Veri Analizi
Yıl
Sıralama
Kontenjan
Aday Sayısı
Oran (%)
Rekabet Endeksi
{enrichedData.map((row, index) => (
{row.year}
{row.ranking.toLocaleString()}
{row.quota}
{row.candidates.toLocaleString()}
{row.ratio}
{row.competitionIndex}
))}
);
};
export default EducationChoiceAnalyzer;
Sistem şu temel özellikleri içerir:
- Çok Boyutlu Veri Analizi
- Trend analizi (zaman serisi)
- Oran analizi (normalize edilmiş karşılaştırma)
- Rekabet analizi (kontenjan-aday ilişkisi)
- İstatistiksel Göstergeler
- Ortalama, standart sapma, volatilite
- Risk seviyesi değerlendirmesi
- Güven aralıkları ile tahmin
- 2025 Tahmin Modeli
- Üstel düzeltme yöntemi
- Trend extrapolasyonu
- Senaryoya dayalı tahminler
Metodolojik Yaklaşım:
Bölüme yerleşen son kişinin sıralaması/Sınavı Geçerli Aday Sayısı oranını temel alarak normalize edilmiş karşılaştırmalar yapmaktadır. Bu, farklı yıllardaki aday sayısı değişimlerini hesaba katarak daha doğru trendler sunar.
Pratik Kullanım Önerileri
- Risk Seviyesi Değerlendirmesi: Volatilite yüzdesine göre bölümlerin risk seviyelerini kategorilendirebilirsiniz.
- Tercih Stratejisi: Tahmin aralıkları kullanılarak güvenli, orta risk ve yüksek risk tercihler belirlenebilir.
- Karşılaştırmalı Analiz: Farklı üniversitelerdeki aynı bölümlerin performansını karşılaştırarak fırsat analizi yapabilirsiniz.