Files
kolaytercih/docs/ekip-raporlari/2026-09-21/06-uni-veri.md
bilalgursen 0ab4dbe88c
All checks were successful
Deploy / deploy (push) Successful in 7m18s
Enhance Traefik configuration for www.kolaytercih.com
Added a new router and middleware for handling www to apex domain redirection, ensuring that Let's Encrypt certificates are obtained for both domains. Updated the docker-compose.yml file to include necessary rules and middleware for proper redirection and TLS handling.

Also, updated the CEO agent description to remove redundant details and clarified the QA engineer's responsibilities regarding testing critical flows and error reporting. Adjusted the CTO agent's section for consistency in expert guidance and clarified the designer's tools to include 'Skill' for better design resource management.
2026-09-21 20:37:12 +03:00

24 KiB
Raw Blame History

06 · Üniversite sayfaları için veri zenginleştirme — keşif raporu

Rol: veri-muhendisi · Tarih: 21 Eylül 2026 · Kapsam: /universite/[slug] (229 sayfa)

Özet

  1. Bugün üniversite sayfası yalnızca programs tablosundan türetilen 6 sayıyı gösteriyor (program, fakülte, tür, il, en iyi sıra, kontenjan); üniversiteye ait ayrı bir tablo ne yokatlas.db'de ne app.db'de var.
  2. OpenAlex prototipi (scripts/kesif-openalex.ts) sitedeki 229 üniversitenin 201'ini (%87,8) eşledi; yayın/atıf/h-index yıllık seriyle geliyor, CC0 lisanslı, anahtarsız. Kalan 28'in 10'u ad değişikliği (Adnan Menderes → Aydın Adnan Menderes vb.), küçük bir takma ad tablosuyla ~%92'ye çıkar; geri kalanı yurt dışı/KKTC küçük kurumlar.
  3. Öğrenciye en çok işe yarayan üç kaynak açık ve yıllık yayımlanıyor: YÖK İstatistik (öğrenci + öğretim elemanı sayısı, Excel), TÜBİTAK ARDEB üniversite tablosu (2021–2025, PDF, 199 üniversite) ve URAP Türkiye 2025-2026 (tam sıralama tablosu basın PDF'inde). Üçü de yılda bir el ile indirilip repoya konur; kod tarafı ayrıştırıcı.
  4. THE/QS (telifli, kazıma yasak), Scimago (403), Webometrics (bu ağdan erişilemedi, CC BY-NC-SA) ve Üni-Veri (üniversite düzeyi yalnız rehber öğretmen sistemi DABİS'te) ilk sürüme girmemeli; yurt kapasitesi ve şehir yaşam maliyeti için üniversite bazlı açık veri yok.
  5. Önerilen ilk sürüm: 8 alan, tek yeni tablo (uni_kimlik + uni_gosterge, uzun biçim, kaynak/yıl damgalı), yıllık güncelleme, toplam ~22 saat iş.
  6. Yan bulgu (veri kalitesi): 3 yurt dışı/KKTC üniversitesi unitur='DEVLET' etiketli ve Uluslararası Balkan Üniversitesi'nin 26 satırında il "SARAYBOSNA - BOSNA - HERSEK" (üniversite Üsküp'te). /universiteler hub'ında bu üniversiteler "Devlet" listesinde görünüyor.

1. Mevcut durum

1.1 yokatlas.db — üniversiteye ait alanlar

Üniversite ayrı bir varlık değil; programs satırlarındaki dört kolonun GROUP BY ile toplanmasından oluşuyor (sqlite3 -readonly data/yokatlas.db ".schema programs"):

Kolon Tip Not
universite TEXT Ham ad, iki yazım: "X ÜNİVERSİTESİ" ve "X ÜNİVERSİTESİ (İL)"; 322 ham ad → 229 slug (93 üniversite çift yazımlı)
unitur TEXT DEVLET 170 · VAKIF 117 · KKTC 23 · VAKIF MYO 4 · YURTDISI KAMU 6 · YURTDISI VAKIF 2 (ham ad bazında)
il TEXT NULL olabilir; yurt dışı için serbest metin ("SARAYBOSNA - BOSNA - HERSEK")
fakulte TEXT Birim adı

Örnek satır (SELECT universite, unitur, il, fakulte, isim, sira2026, kontenjan2026 FROM programs WHERE universite LIKE 'BOĞAZİÇİ%' LIMIT 1): BOĞAZİÇİ ÜNİVERSİTESİ | DEVLET | İSTANBUL | Eğitim Fakültesi | .... Üniversite düzeyinde hiçbir gösterge (öğrenci sayısı, akademisyen, yayın, sıralama, kuruluş yılı, web sitesi) yok. netler, programs_arsiv, veri_meta tablolarında da üniversite alanı yok.

Dış anahtar durumu: YÖK Atlas API tercih-kilavuz/universiteler ucu 228 üniversite için universiteId (YÖKSİS kodu, ör. Abdullah Gül = 173499) veriyor; scripts/logo-indir.ts bunu logo için kullanıyor ama DB'ye yazmıyor. Bu kod, YÖK'ün tüm sistemlerinde (İstatistik, İzleme raporu) ortak anahtar — ilk sürümde saklanmalı.

1.2 app.db

Tablolar: user, session, account, verification, orders, credit_ledger, reports, saved_lists, chat_messages, tadimlik_havuzu. Üniversite verisi yok; olması da gerekmiyor (katalog verisi salt okunur yokatlas.db'de).

1.3 /universite/[slug] bugün ne gösteriyor

Kaynak: src/features/katalog/components/universite-icerik.tsx, veri: src/lib/katalog.ts:getUniversiteBySlug.

  • Başlık + logo (public/uni-logo/<slug>.png, 229 dosya, YÖK Atlas'tan)
  • Özet paragraf: program sayısı, fakülte sayısı, en iyi taban sırası, toplam kontenjan
  • 4 istatistik kutusu: Program · Fakülte/Birim · Tür · En iyi sıralama
  • Türkiye haritasında konum (universite-konum-haritasi.tsx, uni-koordinatlar.ts)
  • Fakülteye göre program tablosu (50'lik sayfalar) + CTA
  • JSON-LD CollegeOrUniversity (name, url, logo, address) — foundingDate, sameAs, numberOfStudents gibi alanlar boş

Yani sayfa, öğrencinin "bu üniversite nasıl bir yer" sorusuna değil, "hangi programı kaçla alıyor" sorusuna cevap veriyor. Bilal'in istediği alanların hiçbiri yok.

2. Kaynak araştırması

Erişim testleri bu oturumda curl/WebFetch ile yapıldı (21 Eyl 2026). "Eşleşme" sütunu sitedeki 229 slug'a karşı tahmini oran; OpenAlex ve TÜBİTAK için ölçüldü, diğerleri koddan çıkarım.

Kaynak URL Ne veriyor Güncellik Erişim Lisans / izin Eşleşme zorluğu
OpenAlex api.openalex.org/institutions Toplam yayın, toplam atıf, yıllık yayın/atıf/açık erişim (2010→2026), h-index, i10, 2 yıllık ort. atıf, ROR, web sitesi, konum, konu dağılımı Sürekli (kayıt updated_date'li; 2026 yılı kısmi) JSON API, anahtarsız, 100k istek/gün, 10/sn; mailto ile polite pool CC0 — ticari kullanım ve atıfsız kullanım serbest Ölçüldü: 201/229. Türkçe alternatif adlar var; 2018 sonrası kurulanların çoğunda country_code=null → TR filtresi kaçırır, ad aramasıyla bulunur
ROR api.ror.org/v2/organizations?filter=country.country_code:TR,types:education Kanonik kurum kimliği, TR/EN adlar, web sitesi, kuruluş yılı, Wikidata/ISNI/GRID kodları; 239 TR eğitim kurumu Aylık sürüm JSON API, anahtarsız CC0 OpenAlex ile aynı kimlik; eşleme bir kez yapılır, ROR id saklanır
YÖK Atlas API yokatlas.yok.gov.tr/api/tercih-kilavuz/universiteler Yalnız universiteAdi + universiteId (YÖKSİS). SPA paketi program düzeyinde "Öğretim Elemanları (kadro/unvan)" paneli içeriyor; üniversite düzeyi uç yok (denenen 5 kalıp 403) Yıllık JSON, Referer zorunlu Kamu verisi; resmî kullanım şartı yok, mevcut hat zaten kullanıyor Ad ham adla birebir; 228/229
YÖK İstatistik istatistik.yok.gov.tr Üniversite bazında öğrenci sayısı (ön lisans/lisans/YL/doktora, cinsiyet, uluslararası), öğretim elemanı sayısı (unvan bazında) → öğrenci/öğretim üyesi oranı hesaplanır 2025-2026 yılı 27 Mart 2026'da yayımlandı; yıllık (Mart) ZK (Java) web uygulaması, API yok; arayüzden Excel indirme YÖK verisi, açık; metaveri PDF'i var (veriyonetim.yok.gov.tr/documentFiles/1776871774464...pdf) Ad YÖK yazımı (ham adla neredeyse aynı); ~%98. Bilal indirir, betik ayrıştırır
YÖK Üniversite İzleme ve Değerlendirme Genel Raporu 2025 veriyonetim.yok.gov.tr/tr/document/2494 (251 s., 17 MB) 71 gösterge başlığı (A.1–E.5): doktora mezun, mezunların ilk 6 ayda işe girme oranı, akredite program, WoS yayın/öğretim üyesi, CNCI, patent, TÜBİTAK proje/bütçe, uluslararası öğrenci, değişim öğrencisi, dünya sıralamaları, kişi başı enerji, WCAG… 19 Aralık 2025 (2023-2024/2024 verisi) PDF; her göstergede yalnız ilk 10–20 üniversite listeleniyor. Üniversite bazlı "karne"ler ayrı PDF'ler (Faaliyetler → Yayınlarımız), toplu Excel yok YÖK, açık Tam liste yok → ilk sürüme uygun değil; 201 karne PDF'ini tek tek ayrıştırmak ayrı proje (~2 gün)
TÜBİTAK ARDEB üniversite tablosu tubitak.gov.tr/sites/default/files/2025-05/9_universite_bazinda_ardeb_verileri_2020_2024_0.pdf Üniversite başına: başvuru sayısı, destek kararı verilen proje sayısı, bütçe (2025 sabit fiyat), yürürlükteki proje, ortalama bütçe; 199 üniversite, dosya içeriği 2021–2025 Yıllık (Mayıs) PDF, 11 sayfa; pypdf ile satırlar okunuyor, çok satırlı adlar birleştirilmeli Kamu istatistiği Adlar kısaltmalı ("ZONGULDAK BÜLENT ECEVİT Ü."); naif eşleme 187/199, satır birleştirmeyle ~195
URAP Türkiye 2025-2026 newtr.urapcenter.org (Meteor SPA) + basın PDF …/cdn/storage/PDFs/mezDn2uAd4mx2mZzW/original/…pdf (31 s.) 15 gösterge, 9 puan sütunu (makale, atıf, doküman, doktora, öğretim üyesi/öğrenci, uluslararası/yurt içi iş birliği, TÜBİTAK proje) + toplam puan; Tablo 8–10 tüm üniversitelerin tam sıralaması, Tablo 11 geçen yıla göre değişim Ekim 2025; yıllık (Ekim) PDF (SPA kazınmaz); pypdf ile tablo satırları okunuyor, üniversite adı iki satıra bölünebiliyor Kâr amaçsız (ODTÜ), "herkesin erişebileceği veri" ilkesi; sitede lisans metni yok → atıf + link ile kullanım, [BİLAL] kısa e-posta ile izin teyidi önerilir Adlar YÖK yazımıyla aynı büyük harf; ~%95
URAP Dünya 2025-2026 aynı site, PDF …/amdSDGMGFJkWCgFG6/…pdf (19 Haz 2026) ~90 TR üniversitesinin dünya sırası Yıllık (Haziran) PDF aynı aynı
Times Higher Education WUR 2026 timeshighereducation.com/…/best-universities-turkey 109 TR üniversitesi, bant (301–350 …) Yıllık (Ekim) HTML "All rights reserved", kullanım şartları kazımayı yasaklıyor → [BİLAL] hukuk İngilizce adlar
QS WUR 2027 topuniversities.com 25 TR üniversitesi Yıllık (Haziran) HTML Telifli, aynı durum İngilizce adlar
Scimago Institutions scimagoir.com/rankings.php?country=TUR Araştırma/inovasyon/toplumsal etki sırası Yıllık curl → 403; tarayıcıdan CSV düğmesi var Kullanım şartı sitede; ticari yeniden yayın belirsiz İngilizce adlar
Webometrics webometrics.info/en/Europe/Turkey Dünya sırası, etki/açıklık/mükemmellik Yılda 2 (Oca/Tem) Bu ağdan DNS çözülmedi (ENOTFOUND) CC BY-NC-SA → ticari sitede kullanılamaz —
Üni-Veri (CBİKO) cbiko.gov.tr (univeri.cbiko.gov.tr bu ağdan çözülmedi) Mezun istihdam oranı, ilk iş bulma süresi, ücret, nitelik uyuşmazlığı (15 gösterge; 2010–2022 mezunları) 2024 genişletme Arayüz; üniversite düzeyi yalnız DABİS'te (rehber öğretmen girişi), kamuya bölüm düzeyi ülke geneli Kamu Üniversite düzeyi kamuya kapalı → ilk sürüm dışı
Erasmus+ ham hareketlilik verisi data.europa.eu/…/erasmus-mobility-raw-data; erasmus-plus.ec.europa.eu/…/for-researchers 2014–2024, hareketlilik başına satır (gönderen/alan kurum) → üniversite başına giden/gelen öğrenci sayısı toplanabilir Yıllık; 2023–2024 geçici Excel, yıl başına yüz binlerce satır EU açık veri (yeniden kullanım serbest, atıf) Kurum adları İngilizce/serbest; ECHE kodu eşlemesi gerekir → orta zorluk, ~6 saat
KYK / GSB yurt kapasitesi kygm.gsb.gov.tr Toplam 867 yurt / 1 milyon+ yatak (ülke geneli); il bazlı kapasite sayfası bulunamadı — Açık veri yok — Üniversite bazlı değil, il bazlı bile yok → ilk sürüm dışı
TÜİK data.tuik.gov.tr Kira endeksi İBBS-2 (26 bölge), TÜFE bölgesel; il bazlı yaşam maliyeti yok Aylık Veri portalı (Excel) Açık İl→bölge eşlemesi; "şehir yaşam maliyeti" iddiası için zayıf → ilk sürüm dışı
Kendi verimiz yokatlas.db Vakıf üniversitelerinde burslu/indirimli/ücretli kontenjan dağılımı program adından türetilebilir Yıllık (zaten var) SQL — Program adında (Burslu)/(%50 İndirimli) kalıbı; doğrulanmalı: SQLite LIKE Türkçe İ'ye duyarsız değil, 70 vakıf üniversitesinde kalıp var ama sayım düşük çıktı — turkishSlugify ile TS tarafında sayılmalı

3. Prototip: OpenAlex × KolayTercih

Betik: /Users/bilalgursen/Desktop/kolaytercih/scripts/kesif-openalex.ts (salt okunur; src/'ye ve şemaya dokunmaz; lint + proje tsc temiz). Çalıştırma: OPENALEX_MAILTO=<e-posta> pnpm tsx scripts/kesif-openalex.ts --cikti <dosya.json> (~40 sn, 2 liste + 28 arama isteği). Çıktı: /private/tmp/claude-501/-Users-bilalgursen-Desktop-kolaytercih/a9337d4b-f90c-4aee-a4e5-cac37b02c64c/scratchpad/kesif-openalex.json (229 kayıt; eşleşme yöntemi, OpenAlex/ROR id, web, yıllık 2021–2026 serisi).

3.1 Eşleşme

Aşama Yöntem Eşleşen
1 TR+CY type:education listesi (219+39 kurum), ad slug'ı birebir (Türkçe alternatif adlar dahil) 179
2 Gevşek anahtar (üniversitesi/university/vakıf atılmış, sıralı parçalar) 6
3 İngilizce→Türkçe kalıp çevirisi 0
4 Ülke filtresiz search= ile ad araması, aday yalnız slug/gevşek anahtar tutuyorsa 16
Toplam 201 / 229 (%87,8) — DEVLET 122/132 · VAKIF 68/78 · KKTC 11/15 · YURTDIŞI 0/4

Slug dışı 22 eşleşmenin tamamı göz kontrolünden geçti (web sitesi alanı doğruluyor; ör. "İSTANBUL ATLAS ÜNİVERSİTESİ → Atlas Üniversitesi (atlas.edu.tr)").

3.2 Neden %100 değil, nasıl çözülür

Neden Etkilenen Çözüm
Ad değişikliği — OpenAlex eski adı taşıyor: Adnan Menderes (17.965 yayın), Mustafa Kemal (13.202), Bezmiâlem, Acıbadem, Okan, Beykent, Gedik, Adana BTÜ, İstanbul Bilim (→ Demiroğlu), Ankara Medipol vb. 10 10 satırlık takma ad tablosu (data/uni-eslesme.json: slug → openalex_id/ror). Bir kez yapılır; id saklanınca ad bir daha kullanılmaz
country_code=null — 2018 sonrası kurulanların çoğu 16 (çözüldü) 4. aşama zaten çözüyor; kalıcı çözüm id saklamak
Şehir adı çakışması riski — "Ankara Medipol" ↔ "İstanbul Medipol" ilk sürümde 1 yanlış pozitif çıktı, düzeltildi Gevşek anahtardan şehir adlarını atmamak (betikte düzeltildi); gevşek eşleşmeleri her koşuda listeye yazmak
Kurum gerçekten yok/çok küçük: Kıbrıs Aydın, Kıbrıs Sağlık ve Toplum, Rauf Denktaş, Bahçeşehir Kıbrıs, Kocaeli Sağlık ve Teknoloji, İstanbul Sağlık ve Teknoloji, Türk-Japon BTÜ, MYO'lar ~10 Eksik olarak gösterilir ("Yayın verisi yok"); komşu üniversiteden kopyalanmaz
Yurt dışı kampüsler (Manas, Hoca Ahmet Yesevi, Tiran New York, Azerbaycan Pedagoji) 4 Ülke kodu KG/KZ/AL/AZ ile aranabilir; öğrenci için düşük öncelik
Sağlık Bilimleri Ü. (İçişleri/MSB adına) 1 Zaten "SAĞLIK BİLİMLERİ ÜNİVERSİTESİ" ile aynı kurum; slug'a takma ad

Takma ad tablosu sonrası beklenen: ~211/229 (%92); eksik kalanların toplam programı 229 üniversitenin program sayısının %2'sinden az.

3.3 Örnek 10 üniversite (OpenAlex, 21 Eyl 2026 çekimi)

Üniversite OpenAlex adı Toplam yayın Toplam atıf Yayın 2024 Yayın 2025 Atıf 2025 h-index 2y ort. atıf
Boğaziçi Boğaziçi University 25.402 2.069.758 1.352 1.327 3.260 416 3,89
ODTÜ Middle East Technical University 48.900 2.621.914 2.331 2.101 4.688 433 2,90
Hacettepe Hacettepe University 82.851 3.204.640 5.917 5.830 12.068 387 1,91
İTÜ Istanbul Technical University 58.913 2.395.731 4.127 4.537 11.508 375 3,11
Koç Koç University 24.966 853.255 2.487 2.355 6.275 272 3,22
Ege Ege University 54.395 1.931.127 4.004 4.102 6.917 309 1,82
Atatürk Atatürk University 42.571 1.449.438 3.650 3.957 10.393 273 2,80
Bahçeşehir Bahçeşehir University 11.986 251.976 1.293 1.330 3.368 175 2,47
Muş Alparslan Muş Alparslan University 6.390 54.625 625 853 1.589 79 1,89
Doğu Akdeniz (KKTC) Eastern Mediterranean University 10.513 399.227 655 712 3.107 219 4,34

Yorum: "Atıf 2025" o yıl alınan atıf; yeni yayınlar az atıf aldığı için düşüktür — sayfada gösterilecekse "son 5 yıl yayın" ve "toplam atıf" daha dürüst. 2yr_mean_citedness (yayın başına ortalama atıf) küçük-büyük üniversiteyi karşılaştırmak için tek adil gösterge; "Koç 25 bin yayınla Hacettepe'nin üçte biri" gibi ham sayı karşılaştırması öğrenciyi yanıltır — ham sayı yanında öğretim üyesi başına değer verilmeli (YÖK İstatistik ile birleşince mümkün).

4. Öneri

4.1 İlk sürüm: 8 alan

Sıralama = öğrenciye fayda × erişilebilirlik × güncellik. Her satırda kaynak, tazelenme ve tahmini iş (ayrıştırıcı + test + UI kutusu hariç).

# Alan Kaynak Güncelleme Eşleşme İş (saat) Öğrenciye ne söyler
1 Öğrenci sayısı (toplam, lisans/ön lisans, uluslararası oranı) YÖK İstatistik Excel Yıllık (Nisan) ~%98 3 Kampüs büyüklüğü, "kalabalık mı butik mi"
2 Öğretim elemanı sayısı ve öğrenci/öğretim üyesi oranı YÖK İstatistik Excel (aynı dosya) Yıllık ~%98 1 (1 ile birlikte) Ders/danışman erişimi; URAP da aynı oranı puanlıyor
3 Son 5 yıl yayın sayısı + öğretim üyesi başına yayın OpenAlex (counts_by_year) ÷ #2 6 ayda bir (API) %88→%92 4 (mevcut betik → üretim betiği + takma ad tablosu) Araştırma canlılığı; adil karşılaştırma
4 Toplam atıf, h-index, yayın başına ortalama atıf OpenAlex 6 ayda bir aynı 0,5 Araştırmanın etkisi
5 TÜBİTAK ARDEB desteklenen proje sayısı (2021–2025) ve başvuru→destek oranı TÜBİTAK PDF Yıllık (Mayıs) ~%97 4 (PDF ayrıştırıcı, çok satırlı adlar) Proje/burs fırsatı, laboratuvar canlılığı
6 URAP Türkiye sırası + toplam puan + geçen yıla göre değişim URAP basın PDF (Tablo 10–11) Yıllık (Ekim) ~%95 4 Tek, yerli, açık, 15 göstergeli akademik sıralama; THE/QS'e hukuki risksiz alternatif
7 Kuruluş yılı, resmî web sitesi, ROR/Wikidata kimliği ROR / OpenAlex Yıllık %92 1 "Yeni üniversite" bağlamı; JSON-LD foundingDate/sameAs → SEO
8 Vakıf üniversitelerinde burslu / indirimli / ücretli kontenjan dağılımı yokatlas.db (program adı) Otomatik (refresh ile) %100 2 (Türkçe harf duyarlı sayım + doğrulama) Vakıf tercihinde en somut soru: "kaç kişi bursla giriyor"

Toplam ayrıştırma/veri işi ~19,5 saat; katalog okuma katmanı (katalog.ts → UniDetay.gostergeler) + universite-icerik.tsx kutuları + kaynak dipnotu ~6 saat (yazılımcı). Eşleme tablosunun ilk el kontrolü (28 üniversite) ~1 saat (Bilal veya veri-muhendisi).

İlk sürüme girmemesi önerilenler ve nedeni: THE/QS (telif, [BİLAL] hukuk görüşü olmadan hayır); Webometrics (NC lisans); Scimago (erişim + şart belirsiz); Üni-Veri mezun istihdamı (üniversite düzeyi kamuya kapalı; YÖK raporunda yalnız ilk 20); Erasmus (yapılabilir ama 6 saat, ikinci sürüm); yurt kapasitesi / şehir yaşam maliyeti / kütüphane / ulaşım (üniversite bazlı açık veri yok — uydurma ya da il ortalaması gösterilmesin).

4.2 Şema taslağı

yokatlas.db içinde, ingest.ts DB'yi sildiği için (rmSync(dbPath), satır 26) üniversite tabloları ayrı bir dosyada tutulmalı: data/universiteler.db (salt okunur açılır; src/lib/db.ts'teki getDb kalıbının ikizi). Alternatif: ingest.ts'e "koru" listesi eklemek — daha kırılgan.

-- Kimlik: bir kez kurulur, el ile denetlenir, yıllık güncellemede değişmez
CREATE TABLE uni_kimlik (
  slug         TEXT PRIMARY KEY,          -- katalog.ts slug'ı (uniAdiNormalize + turkishSlugify)
  yoksis_id    INTEGER,                   -- YÖK Atlas universiteId
  ror_id       TEXT,                      -- https://ror.org/xxxx
  openalex_id  TEXT,                      -- https://openalex.org/Ixxxx
  wikidata_id  TEXT,
  kurulus_yili INTEGER,
  web          TEXT,
  tubitak_ad   TEXT,                      -- PDF'teki kısaltmalı yazım ("… Ü.")
  urap_ad      TEXT,
  eslesme_notu TEXT                       -- "el ile" / "slug" / "arama"; denetim izi
);

-- Göstergeler: uzun biçim; her değer kaynak + dönem + çekim damgası taşır
CREATE TABLE uni_gosterge (
  slug     TEXT NOT NULL REFERENCES uni_kimlik(slug),
  anahtar  TEXT NOT NULL,   -- 'ogrenci_toplam' | 'ogretim_elemani' | 'yayin_5y' | 'atif_toplam' | 'h_index' | 'tubitak_destek_2021_2025' | 'urap_tr_sira' | ...
  donem    TEXT NOT NULL,   -- '2025-2026' | '2021-2025' | '2025' ; karşılaştırma bu alanla yapılır
  deger    REAL,            -- NULL = kaynakta yok (eksik eksik görünür)
  kaynak   TEXT NOT NULL,   -- 'yok-istatistik' | 'openalex' | 'tubitak-ardeb' | 'urap' | 'ror' | 'yokatlas'
  kaynak_url TEXT,
  alindi   TEXT NOT NULL,   -- ISO tarih
  PRIMARY KEY (slug, anahtar, donem)
);
CREATE INDEX idx_uni_gosterge_anahtar ON uni_gosterge (anahtar, donem);

Okuma tarafı: getUniversiteBySlug → gostergeler: Record<anahtar, {deger, donem, kaynak}>; UI her kutunun altına "Kaynak: YÖK İstatistik 2025-2026" dipnotu koyar (VeriKaynagi bileşeni zaten var). Ham sayı yanında oran (öğretim üyesi başına) gösterilir; eksik değer "—" ve "bu kaynakta yok" metni.

Göç: yeni dosya olduğu için app.db göçüne dokunulmaz; yokatlas.db şeması değişmez; geri alma = dosyayı silmek + katalog.ts'te opsiyonel okuma (dosya yoksa gostergeler = {}).

4.3 Güncelleme takvimi

Ay İş Kim
Mart–Nisan YÖK İstatistik Excel'i indir → pnpm uni-gosterge --kaynak yok-istatistik --dosya … Bilal indirir, betik
Mayıs TÜBİTAK ARDEB PDF → ayrıştırıcı Bilal indirir, betik
Haziran, Aralık OpenAlex API çekimi (pnpm uni-gosterge --kaynak openalex) Betik (otomatik, ağ)
Ekim URAP Türkiye PDF → ayrıştırıcı Bilal indirir, betik
Her yıl kılavuz sonrası Yeni üniversite slug'ları için uni_kimlik satırı + eşleme kontrolü (pnpm uni-gosterge --denetim eşleşmeyenleri listeler) veri-muhendisi

Doğrulama sorguları (her koşu sonrası): (a) SELECT COUNT(*) FROM uni_kimlik WHERE openalex_id IS NULL ≤ 20; (b) her anahtar, donem için dolu satır ≥ önceki dönemin %95'i; (c) deger < 0 yok; (d) ogrenci_toplam / ogretim_elemani 2–80 aralığı dışında kalanlar listelenir.

5. Yan bulgu: veri kalitesi (üniversite alanları)

Kontrol Sorgu Sonuç Önem
Yurt dışı/KKTC üniversitesi DEVLET etiketli SELECT universite, il, unitur, COUNT(*) FROM programs WHERE unitur='DEVLET' AND (universite LIKE '%KIBRIS%' OR universite LIKE '%ULUSLARARASI%') GROUP BY 1,2,3 KIBRIS AMERİKAN (42 satır, il LEFKOŞA/KIBRIS/NULL), ULUSLARARASI BALKAN (34), ULUSLARARASI SARAYBOSNA (24) — aynı üniversitelerin (…) ekli eski yazımı YURTDISI KAMU/KKTC; parantezsiz 2026 yazımı DEVLET Yüksek: /universiteler hub'ı bu 3'ünü "Devlet" listesinde gösterir (universite-listesi.tsx:45), üniversite sayfası "Tür: Devlet" yazar, sihirbazın devlet/vakıf filtresi de etkilenir. Kaynak muhtemelen unitur-onar.ts/2026 refresh eşlemesi — doğrulanmalı
Yanlış il SELECT DISTINCT il FROM programs WHERE universite LIKE 'ULUSLARARASI BALKAN%' 26 satırda "SARAYBOSNA - BOSNA - HERSEK"; üniversite Üsküp'te (eski yazım (ÜSKÜP-MAKEDONYA) bunu doğruluyor) Orta: harita/adres JSON-LD yanlış ülke
Çift yazım slug bazlı gruplama (bkz. 1.1) 93 üniversite iki ham adla Düşük: katalog.ts slug'da birleştiriyor; ama GROUP BY universite kullanan her yeni sorgu çift sayar — üniversite tabloları slug anahtarlı olmalı
Sağlık Bilimleri Ü. özel kontenjanı SELECT COUNT(*) FROM programs WHERE universite LIKE 'İÇİŞLERİ BAKANLIĞI%' 15 satır, ayrı "üniversite" gibi görünüyor, /universite/icisleri-bakanligi-ve-milli-savunma-bakanligi-adina-... diye sayfa üretiliyor Düşük–orta: SEO'da anlamsız sayfa; slug'ı Sağlık Bilimleri'ne bağlamak ya da hub'dan gizlemek

Bilal'den istenen

  1. istatistik.yok.gov.tr'den 2025-2026 "Üniversite bazında öğrenci sayıları" ve "öğretim elemanı sayıları" Excel'lerini indirip data/ham/yok-istatistik-2025-2026/ altına koymak (~10 dk; API yok, tarayıcı gerekiyor).
  2. URAP'a tek cümlelik e-posta: Türkiye sıralaması tablolarını kaynak ve link göstererek KolayTercih üniversite sayfalarında yayımlamak için izin teyidi (~5 dk; kâr amaçsız kurum, "herkese açık veri" ilkesi — düşük risk ama ticari site).
  3. [BİLAL] karar: THE/QS bantları hiç gösterilmesin mi, yoksa hukuk görüşü alınsın mı (kararın kendisi ~2 dk; alınmazsa varsayılan "gösterme").