sophia Krankenhaus-Markt & Reform · öffentliche Daten
Über sophia

Transparent gebaut, aus amtlichen Daten gerechnet.

sophia analysiert den deutschen Krankenhausmarkt aus rein öffentlichen Quellen — mit einem eigenen schlanken PHP-MVC, einer read-only SQLite und nachvollziehbaren Formeln statt Blackbox-ML.

Eigenes PHP-MVC read-only SQLite 5 amtliche Quellen Eigene „DRG/LG-Grouper" Huff-Modell
01

Daten :: Woher sie kommen

Ausschließlich öffentliche und amtliche Daten, nichts gekauft. Fünf Quellen werden zusammengeführt, im Vorlauf (sophia_machine) gruppiert und gegen amtliche Zahlen validiert.

Qualitätsberichte · G-BA
Pflicht-XML aller Krankenhäuser (2022–2024): Betten, Fälle, Diagnosen, Prozeduren, Fachabteilungen, Personal. 2.439 Standorte, 1:1 eingelesen.
InEK · aG-DRG
Report-Browser, Kostenmatrix, Fallpauschalenkatalog & LG-Handbuch — DRG-Verteilungen, Kosten je Leistung, Vorhalte-Bewertung, offizielle Leistungsgruppen. Freie Downloads (g-drg.de).
Destatis · GENESIS
Amtliche Statistik nach Wohnort (Diagnosen/Prozeduren × Alter × Geschlecht) + Bevölkerung — die Nachfrageseite. Über die GENESIS-API (Token, Cube-Abrufe).
Zensus 2022
Amtliche Gitterzellen (100 m–10 km) mit Bevölkerung + Altersstruktur — der Nenner für Erreichbarkeit & Einzugsgebiete. Σ 82,7 Mio = amtlich. Destatis-Open-Data.
PLZ & Geografie
PLZ-Verzeichnis mit Polygonen + über den Zensus verrechnete echte 2022-Bevölkerung je PLZ (8.173). Haus-Koordinaten adressgenau via OSM/Nominatim. Open Data.
Geprüft, nicht geglaubt
≤ 1,6 %Fallzahl-Abweichung ggü. Destatis
82,7 MioEinwohner = amtlicher Zensus
98,5 / 100Datenqualität nach Bereinigung
r = .97DRG-Treue · Spearman vs. InEK
02

sophia_machine :: Von der Rohquelle zur fertigen Datenbank

Bevor die Website etwas zeigt, hat eine Python-Pipeline (sophia_machine) die Rohquellen offline eingelesen, geprüft, bereinigt, gruppiert und vorgerechnet — bis eine fertige, read-only SQLite bereitsteht. Nichts davon läuft zur Laufzeit.

1 · Einlesen
QB-XML (alle Jahre) · InEK-Report-Browser · GENESIS-Exporte + Cube-API · Zensus-Gitter · PLZ-Open-Data → Roh-DB je Quelle (1:1, nichts verändert)
2 · Prüfen & Validieren
Normalzustand je §301-Gruppe lernen (Tukey-Biweight, log-Skala), Ausreißer flaggen, Schleife bis stabil; extern gegen Destatis (≤ 1,6 %)
3 · Bereinigen & Imputieren
datenschutz-unterdrückte Fallzahlen (< 4) massenerhaltend ergänzen, fehlerhafte 2024-Diagnoselisten reparieren → Datenqualität 98,5/100
4 · Gruppieren
eigener „DRG-Grouper" P(DRG|HD) + „LG-Grouper" direkt nach InEK-Handbuch — gegen Report-Browser & IQTIG-DeQS validiert
5 · Modelle vorrechnen
Huff/MPI · Kapazität & Engpass · Versorgungskonflikt · Vorhaltefinanzierung · Cluster · Erreichbarkeit · Feincode- & PLZ-Nachfrage → materialisierte Tabellen
6 · Materialisieren
alles read-only in die schlanke SQLite der Web-App gebaut — die Seite liest nur noch, rechnet zur Laufzeit nichts Teures
Schichten der Datenbasis
Roh — 1:1
Jede Quelle unverändert abgelegt (qb_roh · drg_roh · genesis_roh · zensus_roh · plz_roh) — jederzeit gegen das Original nachprüfbar.
Modelliert
Bereinigt, gruppiert, kalibriert (qb_clean · *_grouped) — mit Selbst-Validierung und Fixpunkt-Schleife bis zum stabilen Ergebnis.
Feinaufgelöst
Grobe amtliche Nachfrage auf feine Codes & PLZ heruntergebrochen (*_detail) — massenerhaltend, alters- und geschlechts-konditioniert.
03

Mechanik :: Wie sophia gebaut ist

Ein eigenes, schlankes PHP-MVC ohne schweres Framework — kein Laravel, kein Symfony. Jede Anfrage läuft durch klar getrennte Schichten; die schwere Rechenarbeit passiert offline in Python und wird in die Datenbank materialisiert. Ergebnis: leicht deploybar, wenig Ballast, volle Kontrolle über jede Zeile.

Präsentation
Browser · Leaflet-Karten · Vanilla-JS · PHP-Views · globales Glass-Layout
Router & Controller
der Router verteilt jede Anfrage → neun schlanke Seiten-Controller (Karte · Reform · VHF · Wettbewerb · Erreichbarkeit …)
Domäne & Modelle
Huff-Mathematik & Simulation — StandortModel · KonkurrenzModel · HuffModel · VhfModel · Szenario
Datenhaltung · SQLite
read-only (query_only) + wegwerfbare Szenario-Temp-DB je Sitzung
Warum SQLite?
Eine Datei, kein Server
Die gesamte Datenhaltung in einer .sqlite-Datei — kein Dienst, keine Zugangsdaten. Deployment = kopieren.
Read-only & sicher
query_only=ON schließt Schreibfehler und Race-Conditions aus — die Abfragen bleiben schnell und stabil.
Vorberechnet
Die schwere Pipeline läuft offline in Python; die DB ist ein kompiliertes Daten-Artefakt — zur Laufzeit nichts Teures.
Szenarien getrennt
Interaktive Schließungen schreiben in eine eigene Temp-DB (synchronous=OFF) — die Haupt-DB bleibt unberührt.
Portabel & eingebettet
In PHP eingebaut (PDO), überall gleich (WAMP wie Linux), versionierbar und verschickbar.
04

Mathematik :: Was sophia rechnet

Von den Rohcodes bis zum Erreichbarkeits-Index — jede Zahl entsteht aus einer nachvollziehbaren Formel, kein Blackbox-ML.

Von den Codes zur feinen Auflösung

ICD (Diagnosen) und OPS (Prozeduren) kommen aus den QB. Der G-BA unterdrückt kleine Fallzahlen (< 4) — sophia füllt das massenerhaltend (HD-Massenbilanz, OPS-Erwartungswert E ≈ 1,86). Die grobe amtliche Nachfrage (3-Steller) wird auf feine Codes verteilt — konditioniert auf Alter & Geschlecht:

Anzahl(c | g, A) = ΣDRG Anzahl(c, DRG) · P(g | DRG) · P(A | DRG)massenerhaltend: Σ über die Feincodes = Ausgangswert je Zelle.
Zwei eigene „Grouper"

Die offiziellen „Grouper" sind proprietär — sophia baut statistische aus öffentlichen Quellen.

P(DRG | HD) = Anzahl(HD → DRG) ∕ Σ Anzahl(HD → ·)„DRG-Grouper": jeder Fall hat genau 1 HD → Anteile. Validiert · Spearman r = .97.

„LG-Grouper": Leistungsgruppen (KHVVG/NRW) direkt nach dem InEK-Handbuch aus FAB + ICD + OPS — ohne DRG-Umweg, gegen IQTIG-DeQS geprüft.

Das Huff-Modell — das räumliche Herzstück

Marktposition, Konkurrenz und Erreichbarkeit kommen alle aus einem Gravitationsmodell: Menschen wählen eine Klinik umso eher, je größer sie ist und je näher sie liegt. Distanz = Fahrzeit, die Nähe geht als Gauß-Gewicht ein. Der volle Erreichbarkeits-Index (MH3SFCA, Subal/Paal/Krisp 2021) rechnet in drei Schritten:

WDistanzgewicht
Die Zutat: Nähe zählt fast voll, der Rand kaum — β so, dass W am Rand ≈ 0,01.
1 0 0 d_max W
Wij = e−t² ∕ β
1Wahl
Wohin fährt die Bevölkerung i? Größe × Nähe, über alle erreichbaren Häuser normiert — das nächste Haus dominiert.
i18%19%63%
Huffij = SjWij ∕ Σk SkWik
2Angebot ∕ Nachfrage
Kapazität eines Hauses j geteilt durch die von ihm erwartete Nachfrage.
jKapazität ∕ Nachfrage
Rj = Sj ∕ Σi Huffij Di
3Erreichbarkeit
Summe der erreichbaren Versorger pro Kopf am Ort i — der Index Ai.
R₁R₂R₃iΣ erreichbare Versorger
Ai = Σj Huffij Rj Wij

So nutzt sophia das: Wir verwenden Schritt 1 als Vorwärts-Modell — jede PLZ-Bevölkerung verteilt sich auf die erreichbaren Kliniken (Linienbreite = Huff-Anteil, Kreisgröße = Fallzahl).

Helios Schwerin 88 % · 7 km Sana Wismar 5 % · 33 km LUP Hagenow · 6 % · 23 km PLZ 19061 · Schwerin 19.361 Einwohner Klinik ·Kapazität = Fallzahl PLZ · Einwohner D
Reales Beispiel: PLZ 19061 (Schwerin) — das nächste große Haus (Helios) bindet 88 %, die Huff-Anteile summieren auf 100 %.

Drei Anwendungen desselben Modells:

Marktposition · MPI
MPI = berichtete ∕ modellierte Fälle. Mehr berichtet als nach Größe & Lage erwartbar = Sog (> 1), weniger = Abfluss (< 1).
Konkurrenz · Überlappung
Gerichtete Einzugs-Überlappung: ΣPLZ Einwohner · Wahl(Zentrum) · Wahl(Wettbewerber), relativ zum Einzug des Zentrums.
Erreichbarkeit · MH3SFCA
Voller Drei-Schritt-Index: Versorger pro Kopf je Ort. Absolutwerte nur relativ vergleichbar — Färbung nach Median-Abweichung.
Mindestmengen — die Schwelle im Reform-Simulator

Der Reform-Simulator schließt Leistungsgruppen (und Häuser), deren Fallzahl unter der Mindestmenge liegt — die Fälle wandern dann zu den nächstgelegenen Erbringern. Diese Schwelle ist aber keine amtliche Zahl: verbindliche, je Leistungsgruppe festgelegte Mindestvorhaltezahlen stehen bundesweit noch aus (sie kommen erst per Rechtsverordnung, frühestens ~2027). Verbindlich sind bisher nur die G-BA-Mindestmengen für einzelne Leistungen, nicht je Leistungsgruppe. sophia nutzt deshalb eine Modell-Schätzung — das k-te Perzentil der Fallzahl-Verteilung aller Erbringer einer Leistungsgruppe:

MindestmengeLG = Pk( Fallzahlen aller Erbringer der LG )k = 5 % (Grund-/Geburts-/Pädiatrie-/Geriatrie-Versorgung) · 12 % (Grund-/Regelversorgung) · 20 % (spezialisierte LG). Die kleinsten k % der Erbringer fallen unter die Schwelle.

So bildet die Schwelle näherungsweise nach, was eine künftige Verordnung bringen dürfte (dieselbe Perzentil-Methodik nutzen auch Beratungshäuser). Ehrlich bleibt: es ist eine begründete Annahme, kein geltendes Recht — im gesamten Tool ist die Mindestmenge als „Modell" gekennzeichnet.

Und was sonst noch gerechnet wird
Cluster-Typologie
k-means über Größe × Markt/Erreichbarkeit × Profil → drei Sichten je Haus: Versorgungsstufe · Reform-Typ · Portfolio.
Kapazität & Engpass
Freie Bettentage + Personal-Deckelung (Pflege-/Ärzte-VK) → der bindende Engpass. Auf amtliche Bettenauslastung kalibriert (71 %).
Versorgungskonflikt
Anbieter unter Mindestmenge × räumliche Isolation (50-km-RMIG) → wo eine Schließung echte Unterversorgung auslöst.
Vorhaltefinanzierung
Vorhalteanteil je DRG nach der KHVVG-Vorhalteformel (InEK-Kostenmatrix) → national Ø 33,9 %, Σ 22,5 Mrd €.
Umverteilungs-Simulation
Schließt man ein Haus/eine LG, verteilt ein erweitertes sequentielles Huff die Fälle auf die nächsten Erbringer.
Wie genau ist die Leistungsgruppen-Schätzung?

Weil die Qualitätsberichte nur Aggregate liefern (keine fallgenaue Zuordnung), sind die Leistungsgruppen eine Schätzung. Gemessen gegen amtliche Referenzen (IQTIG-Qualitätssicherung) und die Modelle professioneller Anbieter ergibt sich:

0,99LG-Summen bundesweit · log-Pearson (Spearman 0,99)
0,81pro Haus · log-Pearson (Pearson 0,72)
0,94Einzelhaus-Vergleich (Schwerin) · Pearson

Auf Aggregat- und Rangebene (Summe je Leistungsgruppe, Reihenfolge der Häuser) ist die Schätzung sehr belastbar; pro einzelnem Haus ist sie richtungsweisend, aber verrauscht — das ist die fundamentale Grenze aus den QB-Aggregaten, kein Fehler. Absolutwerte je Haus daher als Größenordnung lesen, nicht als amtliche Zahl.