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

206 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.
```sql
-- 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").