İstanbul toplu taşıma ağının hangi durak/istasyonlarının devre dışı kalması şehir ağını orantısız şekilde bozduğunu, nörobilimdeki "lezyon simülasyonu" yöntemiyle ölçen ve fruit-fly connectome'dan elde edilen bir "biyolojik referans dayanıklılık skoru" ile karşılaştıran bir hackathon V1 demosu.
Tek sayfa, kenar çubuğunda filtreler (mod/hat/kritiklik eşiği), ve herhangi bir durağı seçip "kapansa ne olur" sorusuna canlı cevap veren interaktif bir sorgu içerir.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtHiçbir API anahtarı/token gerekmiyor. src/fetch_fly.py, FlyEM'in Google
Cloud Storage'da yayınladığı halka açık "flat connectome" toplu export
dosyalarını kullanır (bkz. "Fly connectome veri kaynağı" bölümü) — ilk
çalıştırmada ~500MB indirilir, mushroom body devresine filtrelenir, küçük
sonuç (data/fly_raw/neurons.csv, connectivity.csv) önbelleklenir ve
büyük ham dosyalar silinir.
streamlit run src/app.pyTek sayfalık bir uygulama — ilk açılışta sırasıyla İBB verisi indirilir/
işlenir, birleşik ağ (raylı sistem + otobüs) için lezyon simülasyonu
çalıştırılır, ardından fly connectome verisi (~500MB) indirilip mushroom
body devresi (4503 nöron) üzerinde lezyon simülasyonu çalışır. İlk açılış
toplamda ~5-7 dakika sürebilir (st.cache_data ile önbelleklenir) —
sayfayı açık bırakıp sekme değiştirmeden/yenilemeden bekleyin. Sonraki
etkileşimlerde hiçbiri tekrar hesaplanmaz.
- İBB verisi: "Raylı Sistemler İstasyon Bazlı Yolcu ve Yolculuk Sayıları" (2025 tam yılı — data.ibb.gov.tr'de her yıl ayrı bir kaynak olarak yayınlanıyor, en güncel tamamlanmış yıl kullanıldı — CKAN CSV). Gerçek istasyon adı, koordinat, ilçe ve günlük yolcu sayısı içerir. 19 hat, 302 istasyon-hat kombinasyonu (2023'e göre M8, M9 ve iki yeni TCDD hattı eklenmiş durumda).
- Varsayım — hat sırası: Kaynak veride istasyonların hat üzerindeki
sırası (güzergah bilgisi) yok. Bu yüzden her hattaki istasyonlar coğrafi
en-yakın-komşu zinciriyle sıralanarak yaklaşık bir güzergah kenar kümesi
oluşturuldu (
src/build_graph.py::_order_line_nearest_neighbor). Aktarma istasyonları, farklı hatlarda 250m'den yakın koordinatlı istasyonları birbirine bağlayarak modellendi. - İETT otobüs verisi:
https://api.ibb.gov.tr/iett/ibb/ibb.asmxSOAP servisinden (DurakDetay_GYY,HatServisi_GYYmetotları) çekiliyor. WSDL'i standart araçlarla (zeep) parse etmek birAuthHeadertanım hatasına takılıyordu; bunun yerinerequestsile elle hazırlanmış ham SOAP 1.1 POST zarfı kullanıldı — kimlik doğrulama gerekmiyor, token gerekmiyor. 782 hat, ~13.200 benzersiz durak, gerçek güzergah sırası (SIRANO alanı — raylı sistemdeki gibi coğrafi yaklaşıklığa gerek yok) ~34 saniyede eşzamanlı (ThreadPoolExecutor) çekildi (src/fetch_iett_bus.py). Durak bazlı yolcu sayısı verisi bu serviste yok — bu yüzden otobüs durakları için "etkilenen yolcu sayısı" cümlesi gösterilemiyor (dürüstçe belirtiliyor, sıfır ile doldurulmuyor). - Birleşik ağ: raylı sistem + otobüs,
build_unified_graph()ile tek bir grafta birleştiriliyor (13.420 düğüm, 17.850 kenar). Farklı modlardaki (bus/rail) 250m'den yakın duraklar ızgara-tabanlı (spatial hash) bir aramayla aktarma kenarıyla bağlanıyor — O(n²) yerine O(n), 13.400+ düğümde bu fark saniyeler ile saatler arasındaki farka denk geliyor. - Fly connectome veri kaynağı:
male-cns:v1.0veri setinden mushroom body devresi (öğrenme/hafıza ile ilişkili, iyi tanımlanmış bir alt-devre: Kenyon Cell + MBON + PAM + PPL + APL tipleri, ~4503 nöron / 77.741 kenar, min. 5 sinapslık ağırlık eşiği) çekiliyor — tüm 166.000+ nöron değil. Not: neuPrint'in Cypher sorgu API'si (neuprint.janelia.org) test sırasında kalıcı 504/timeout hatası veriyordu (basitRETURN 1sorgusu bile 60sn+ timeout alıyordu — sunucu tarafı genel bir kesinti, token/sorgu tasarımıyla ilgisizdi). Bunun yerine FlyEM'in GCS'de yayınladığı halka açık "flat connectome" toplu export dosyaları kullanıldı (storage.googleapis.com/flyem-male-cns/v1.0/connectome-data/ flat-connectome/) — bu yaklaşım [cobanov/fly-connectome-template] (https://github.com/cobanov/fly-connectome-template) referans alınarak benimsendi (onlar da aynı bulk-export deseniyle soma pozisyon atlası oluşturmuş).
data/ klasörünün hiçbir dosyası commit edilmiyor — hepsi fetch_*.py
betikleri ile her klonda yeniden üretilebilir (bkz. Kurulum). Tek istisna
assets/brain_atlas/: küçük, yeniden dağıtılabilir, üçüncü taraf lisanslı
bir veri seti olduğu için repoya gömülü.
-
Baseline metrikler: ortalama en kısa yol, en büyük bağlı bileşen boyutu, global efficiency (
networkx.global_efficiency). -
Lezyon: her düğüm tek tek graftan çıkarılır, metrikler yeniden hesaplanır; efficiency ve bağlı-bileşen düşüşünün ortalaması "kritiklik skoru" olarak alınır.
-
R_city / R_bio: tüm düğümlerin ortalama kritiklik skoru, tek bir "dayanıklılık bozulma" özet sayısı olarak kullanılır. Performans notu (büyük graflar): fly connectome grafı (4503 düğüm, 77.741 kenar) için tüm düğümleri tek tek lezyon edip her seferinde tam
global_efficiency(tüm düğüm çiftleri arası en kısa yol, O(n²)) hesaplamak pratik değil — bu yüzden (a)global_efficiencyrastgele bir kaynak-düğüm örneklemi üzerinden tahmin edilir (istatistiksel olarak sapmasız Monte Carlo yaklaşımı), (b) lezyon edilecek adaylar ağırlıklı dereceye göre en yüksek ~300 düğüm + tarafsız rastgele ~150 düğümün birleşiminden seçilir (gerçek kritik düğümler neredeyse hep yüksek bağlantılı hub'lardır; R_bio gibi popülasyon ortalaması sadece tarafsız rastgele alt kümeden hesaplanır ki taraflı çıkmasın), (c) düğüm başına lezyon işlemleri birbirinden bağımsız olduğundanmultiprocessingile CPU çekirdeklerine paralel dağıtılır. Bu üç optimizasyon olmadan tam analiz tahminen 10+ saat sürerdi; optimize haliyle ~3 dakikaya iniyor. Doğrulama: algoritma en kritik nöron olarak APL'yi buldu — mushroom body'deki tüm Kenyon Cell'lere global GABAerjik inhibisyon sağlayan, kaybı devre çapında dizregülasyona yol açtığı bilinen nöron türü; bu, sonucun biyolojik olarak anlamlı olduğunun bağımsız bir doğrulaması.Ağ büyüklüğü / seyrelme notu (önemli düzeltme): otobüs ağı eklenip birleşik ağ 215'ten 13.400+ düğüme çıkınca, R_city sıfıra çok yakın (anlamsız) çıkmaya başladı. Sebep bir hata değil, metriğin matematiksel doğası:
global_efficiency, TÜM düğüm çiftlerinin ortalaması olduğundan, tek bir düğümün (ne kadar önemli olursa olsun) çıkarılması devasa bir ağda istatistiksel olarak "seyreliyor" — aynı formül 215 düğümde anlamlı sayılar (ör. en kritik istasyon ~15) verirken, ~63 kat büyük ağda aynı oranda küçülüyor (kanıt: en yüksek dereceli durak — İstanbul Havalimanı, 170 bağlantı — çıkarıldığında bile skor sadece 0.28 çıkıyor). Bu yüzden: R_city/R_bio karşılaştırması artık sadece raylı sistem ağı (270 düğüm — fly'ın 4503 düğümüyle çok daha karşılaştırılabilir bir ölçek) üzerinden hesaplanıyor; harita/Top-10/interaktif "durak seçin" aracı ise 13.400+ düğümlü birleşik ağın HAM skorlarını kullanmaya devam ediyor ama mutlak sayı yerine sıralama (rank) ile sunuluyor — sıralama, mutlak değer seyrelse bile her zaman doğru kalır.macOS
multiprocessingnotu: geliştirme sırasındastreamlit'inAppTesttest aracıyla çalıştırırken worker'lar sonsuz döngüde çöküp-yeniden-başlıyordu (RuntimeError: ...bootstrapping phase...). Sebep macOS'ta varsayılanspawnbaşlatma yönteminin, script gerçek bir__main__modülü olarak çalışmadığı bağlamlarda (ör.AppTestveyapython -c)__main__'i yeniden import etmeye çalışıp başarısız olması. Çözüm:lesion_analysis.py'damultiprocessing.get_context("fork")kullanmak — fork, child process'i mevcut bellekten kopyaladığı için bu yeniden-import adımına hiç ihtiyaç duymuyor. -
Öneri: en kritik 5 istasyonun coğrafi en yakın komşularından adaylar çıkarılır, her biri eklenip dayanıklılık iyileşmesi ölçülür (greedy), en iyi 3 öneri gösterilir.
-
Yapısal imza karşılaştırması (
structural_metrics.py) — R_bio/R_city tek bir sayı, neden farklı olduğunu açıklamaz. Üç ucuz, literatürde köklü metrikle (degree_gini,average_clustering,bridge_fraction) fly ve raylı sistem ağının yapısal imzasını karşılaştırdık. Gerçek sonuç (uydurulmadı, veriden çıktı): fly'ın hub-bağımlılığı (Gini) İstanbul'dan daha düşük değil, hatta biraz daha yüksek — yani dayanıklılığı az sayıda süper-bağlantılı hub'dan gelmiyor. Asıl fark: fly'ın kümelenme katsayısı İstanbul'dan ~26 kat yüksek, ve İstanbul'da kenarların %50'si köprü (tek arıza noktası) iken fly'da bu oran %0.01. Yani fly'ın dayanıklılığı yerel yedeklilikten geliyor.Bu bulgu
recommend.py'daki öneri sıralamasını değiştirmiyor (hâlâ gerçekresilience_improvement_pctesas alınıyor — doğrulanmamış bir biyolojik proxy'nin gerçek en iyi öneriyi gölgelememesi için bilinçli bir karar) — her önerinin yerel kümelenmeye katkısını (local_clustering_gain,bio_aligned) ek, açıklayıcı bir sütun olarak ekliyor. Dürüst bulgu: mevcut coğrafi-yakınlık sezgiseli, üç öneriden hiçbirinde bu biyolojik ilkeyi doğal olarak yakalamıyor — bu, gelecekte fly-ilhamlı bir aday-arama stratejisi (üçgen kapayan bağlantıları önceliklendirme) için net bir gerekçe oluşturuyor.
Kendi kümelenme bulgumuzu, yayınlanmış bir çalışmanın metodolojisiyle
bağımsız olarak test ettik: derece dizisini koruyan rastgele (null-model)
bir ağa göre gerçek kümelenme katsayısının kaç kat yüksek olduğunu ölçtük
(structural_metrics.py::clustering_vs_random).
| Ağ | Kümelenme / rastgele-ağ oranı |
|---|---|
| Tüm FlyWire beyni (Lin, Yang ve ark. 2023, yayınlanmış) | 9.18× |
| Bizim mushroom body alt-devremiz | ~1.9× |
| İstanbul raylı sistem ağımız | ~2.5× |
Dürüst bulgu: MB alt-devremizin oranı beklenenin aksine hem yayınlanmış tüm-beyin değerinden hem de kendi raylı sistem ağımızınkinden düşük çıktı — muhtemelen MB'nin zaten çok yoğun olması (ort. derece ~34.5) rastgele yeniden bağlansa bile tesadüfi kümelenme üretiyor. Mutlak kümelenme (0.54 vs 0.02) hâlâ İstanbul'dan çok daha yüksek ve dayanıklılık için belirleyici olan bu mutlak değer — ama bu nüansı gizlemedik.
Kaynaklar:
- Lin A., Yang R., et al. (2023). Network Statistics of the Whole-Brain Connectome of Drosophila. bioRxiv 2023.07.29.551086. Kod: murthylab/flywire-network-analysis.
- Berg S., Beckett I.R., et al. (2025). Sexual dimorphism in the complete connectome of the Drosophila male central nervous system. bioRxiv 2025.10.09.680999. (Kullandığımız MaleCNS v1.0 veri setinin birincil kaynak yayını.) Veri: flyconnectome/2025malecns.
- Hat güzergahları gerçek sıra bilgisi yerine coğrafi yaklaşıklıkla kuruldu (raylı sistem; otobüs tarafında İETT gerçek sıra numarası veriyor).
- Öneri algoritması hız için kritik istasyonların bir örneklemi üzerinden dayanıklılık iyileşmesini hesaplar (tüm ağ yerine), ve sadece raylı sistem ağında çalışır (otobüs dahil ~13.400 düğümlük ağda performans nedeniyle V1 kapsamı dışında).
- Yapısal imza karşılaştırması sadece 3 ucuz metrikle sınırlı; daha kesin bir "redundancy" ölçümü (ör. k-bağlantılılık, edge-disjoint path sayısı) büyük graflarda hesaplama açısından pahalı, V1'e dahil edilmedi.