Gefälschte ID > Artikel > Der Bug, der jeden Italiener einundzwanzig machte

Der Bug, der jeden Italiener einundzwanzig machte

Schlagen Sie irgendeinen italienischen Vornamen nach, und das zurückgelieferte Alter lag zwischen 19 und 25. Nicht meistens. Immer. Median 21, Minimum 19, Maximum 25, über alle 3.189 Namen der italienischen Kohortendaten hinweg — Giuseppe, Giovanni, Mario, Maria, jeden einzelnen von ihnen.

Giuseppe ist kein Name für einen jungen Mann. Es ist der archetypische Name der italienischen Großvätergeneration. Das System meldete ihn mit vollständiger Zuversicht als einundzwanzig, und es tat das aus einem Grund, der nichts mit italienischer Demografie zu tun hat und alles mit einer einzigen arithmetischen Annahme: dass eine Null in den Daten bedeutet, es gab keine.

Manchmal tut sie das. Manchmal bedeutet sie, die Quelle reicht nicht so weit. Das sind zwei völlig verschiedene Aussagen, sie werden identisch geschrieben, und sie zu verwechseln ist eine eigene Klasse von Bug, die kein struktureller Validator sehen kann.

Was das Modell tun soll

Vornamen tragen Altersinformation. Das ist keine Feinheit, es ist das stärkste Signal im gesamten Datensatz: Namensmoden erneuern sich in einem Generationszyklus, und ein Name verrät Ihnen weit zuverlässiger, in welchem Jahrzehnt jemand wahrscheinlich geboren wurde, als er Ihnen irgendetwas anderes verrät.

Ein Name-zu-Alter-Modell ist also eine wirklich gute Idee, und wenn die zugrunde liegenden Daten vollständig sind, funktioniert es. Gemessen an 10.000 Ziehungen pro Name gegen ein Altersfenster von 19 bis 57:

SprachregionNameAlter 19–2526–3536–4546–57Median
no_NOBjørn1,6 %4,3 %8,6 %85,5 %57
no_NOEmma60,3 %29,4 %6,2 %4,1 %24
en_USRobert3,1 %6,2 %11,0 %79,7 %57
en_USEmily28,4 %37,1 %21,6 %12,9 %31

Das ist genau richtig, und es ist richtig, weil Norwegen und die Vereinigten Staaten Vornamenzählungen nach Jahren veröffentlichen, die weit genug zurückreichen, um jedes vom Modell verwendete Jahrzehnt zu füllen. Das Modell hält sieben Dekaden-Spalten pro Name, von den 1940ern bis zu den 2000ern, gewichtet die Dekaden nach ihren Zählungen, wählt eine aus, wählt ein Jahr darin und rechnet in ein Alter um.

Wie die Daten tatsächlich aussahen

Die Abdeckung ist nicht über alle Länder hinweg einheitlich, denn die nationalen Statistikämter begannen nicht zur selben Zeit, Namenszählungen zu veröffentlichen. Direkt aus den Dateien gemessen — eine Dekade gilt als abgedeckt, wenn irgendein Name in der Sprachregion in dieser Spalte einen Wert ungleich null hat — decken die meisten Sprachregionen, die Kohortendaten führen, alle sieben Dekaden ab.

Zwei tun es nicht. Die österreichische Reihe beginnt 1984, sodass ihre vier ältesten Dekaden-Spalten über jede Zeile der Datei hinweg leer sind; die italienische Reihe deckt ab 1999 ab, sodass sechs ihrer sieben es sind. Diese Spalten halten Nullen — nicht weil in den 1960ern niemand in Italien geboren wurde, sondern weil die veröffentlichten Zählungen nicht so weit zurückreichen.

Der Bug ist eine Zeile Arithmetik

Die Auswahl ist eine gewöhnliche gewichtete Ziehung über die sieben Dekaden:

total = sum(decades)
r     = random(1, total)
acc   = 0
for i in 0..6:
    acc = acc + decades[i]
    if r <= acc:
        chosen = decade[i]
        break

An diesem Code ist nichts falsch. Er ist die korrekte Umsetzung von „gewichte die Dekaden nach ihren Zählungen". Das Problem liegt ganz und gar darin, was die Zählungen bedeuten.

Wenn nur die letzte Spalte ungleich null ist, bleibt der Akkumulator über sechs Iterationen bei null. Die Bedingung r <= acc kann nicht erfüllt werden, bis die Schleife die eine Spalte mit Masse erreicht. Es ist nicht so, dass die siebte Dekade sehr wahrscheinlich ist; es ist so, dass die anderen sechs unerreichbar sind, strukturell, für jeden möglichen Wert von r. Das Ergebnis ist 100 % und es ist 100 % per Konstruktion, nicht per Zufall.

Beide Varianten neu simuliert über je 10.000 Ziehungen, unabhängig von der ausgelieferten Implementierung:

SprachregionNameAbgedeckte DekadenVersion19–2526–3536–4546–57MedianSpanne
it_ITGiuseppe1vorher100,0 %0,0 %0,0 %0,0 %2119–25
it_ITGiuseppe1nachher30,3 %22,2 %21,6 %25,9 %3419–57
it_ITGiulia1vorher100,0 %0,0 %0,0 %0,0 %2119–25
it_ITGiulia1nachher29,2 %21,6 %22,8 %26,4 %3519–57
de_ATJohann3vorher12,4 %31,1 %56,4 %0,0 %3719–45
de_ATJohann3nachher15,4 %28,6 %39,0 %17,0 %3719–57
de_ATEmma3vorher92,7 %7,1 %0,2 %0,0 %2119–45
de_ATEmma3nachher50,5 %17,6 %14,6 %17,2 %2519–57
no_NOBjørn7vorher1,6 %4,3 %8,6 %85,5 %5719–57
no_NOBjørn7nachher1,6 %4,3 %8,6 %85,5 %5719–57

Zwei Dinge lohnt es, aus dieser Tabelle abzulesen.

Die österreichische Spalte ist derselbe Bug bei geringerer Amplitude. Niemand namens Johann, Lukas, Maria oder Emma konnte älter als 45 sein — eine harte Obergrenze, erzeugt vom selben Mechanismus, seit dem Bau der österreichischen Zeilen in den Daten sitzend. Es sah plausibel genug aus, dass niemand es hinterfragte. Erst als der italienische Fall zu 100 % degenerierte, wurde die Gestalt sichtbar, und dann war der österreichische Fall offensichtlich dasselbe.

Der Defekt skaliert umgekehrt zur Qualität der Quelle. Sieben Dekaden abgedeckt: korrekt. Drei abgedeckt: keine Karte älter als 45. Eine abgedeckt: alle sind 21. Je weniger die Quelle weiß, desto zuversichtlicher behauptet das Modell. Das ist genau verkehrt herum, und es ist die Signatur fehlender Daten, die als Evidenz gelesen werden.

Null hat zwei Bedeutungen, und die Datei kann Ihnen nicht sagen, welche

Die allgemeine Form davon lohnt eine Benennung, denn sie taucht weit jenseits von Namensdaten auf.

Eine Null in einer Zählspalte kann bedeuten:

  1. Eine beobachtete Null. Wir haben nachgesehen, und es gab keine. Das ist Information, und danach zu gewichten ist korrekt.
  2. Eine unbeobachtete Zelle. Wir haben hier nicht nachgesehen, oder das Messinstrument reicht nicht so weit. Das ist die Abwesenheit von Information, und danach zu gewichten behauptet etwas, das die Daten nie gesagt haben.

Statistiker unterscheiden eine strukturelle Null (eine Zelle, die logisch nicht ungleich null sein kann) von einer Stichproben-Null (eine Zelle, die ungleich null sein könnte, aber nicht beobachtet wurde), und der gesamte Apparat der Methoden für fehlende Daten existiert, weil die zweite wie die erste zu behandeln alles Nachgelagerte verzerrt. Unser Fall ist die zweite Art, in ihrer reinsten Form: die Zellen sind nicht bloß unbeobachtet, sie sind systematisch unbeobachtet, alle an einem Ende des Bereichs, für jede Zeile zugleich.

Der Grund, warum das die Prüfung übersteht, ist, dass die meisten Tabellenformate keine Möglichkeit haben, den Unterschied auszudrücken. Eine tab-getrennte Datei aus Ganzzahlen hat kein NULL. Eine Festbreiten-Binärspalte auch nicht, ebenso wenig ein protobuf uint32 oder ein NumPy-Ganzzahl-Array. In dem Moment, in dem Sie „wir wissen es nicht" in eine Ganzzahl-Spalte serialisieren, wird es zu null, und null ist eine vollkommen gute Zahl, die die Arithmetik bereitwillig verschluckt.

Sie können dieselbe Kollision überall sehen, sobald Sie danach suchen:

DomäneNull, die „keine" bedeutetNull, die „keine Daten" bedeutet
HandelsanalytikDieser Laden verkaufte heute keineDieser Laden hatte noch nicht eröffnet
Sensor-TelemetrieDer Tank ist leerDer Sensor war offline
Web-AnalytikKeine Besuche aus diesem LandDer Tracker war in diesem Land blockiert
EpidemiologieKeine Fälle in diesem BezirkDieser Bezirk meldete nicht
FinanzberichterstattungDieses Segment hatte keinen UmsatzDieses Segment wurde in der Bilanz jenes Jahres nicht ausgewiesen
NamenshäufigkeitNiemand erhielt diesen NamenDas Register veröffentlicht nicht so weit zurück

In jeder Zeile ist ein über die linke Bedeutung berechnetes Aggregat korrekt, und dasselbe Aggregat über die rechte Bedeutung ist mit Zuversicht in eine bestimmte Richtung falsch: es konzentriert das Ergebnis auf das, was beobachtet wurde.

Warum kein Validator es fing

Die Kohortendateien bestehen jede strukturelle Prüfung, die es gibt. Korrekte Spaltenzahl, korrekte Sortierreihenfolge, UTF-8 ohne Byte-Order-Mark, keine doppelten Zeilen, Summen im Bereich, jeder Wert eine nicht-negative Ganzzahl. An einer Zeile aus Nullen ist nichts fehlerhaft — eine Zeile aus Nullen ist genau das, was eine ehrliche Zähldatei für einen seltenen Namen in einer Dekade enthält, in der er selten war.

Der Defekt existiert nur in der Verteilung der Ausgabe, und nur im Vergleich mit einer Erwartung, die in jemandes Kopf lebt statt in einer Datei. „Niemand älter als 45" ist keine Eigenschaft der Eingabe; es ist eine Eigenschaft dessen, was das Modell mit der Eingabe tut, und Sie können es nur sehen, indem Sie das Modell laufen lassen und ansehen, was herauskommt.

Das ist dieselbe Gestalt wie eine Prüfung, die Erfolg meldet, ohne ihre Eingabe zu lesen — das Versagen ist unsichtbar, weil das Artefakt wohlgeformt ist und der Prozess bis zum Abschluss lief. Wir haben ausführlich über dieses Muster geschrieben in Die Prüfung, die genau dort blind wird, wo Sie sie brauchen; dies ist ihr datenseitiger Zwilling. Die Lehre überträgt sich direkt: validiere die Ausgabeverteilung, nicht das Eingabeschema. Eine Schemaprüfung sagt Ihnen, dass die Datei lesbar ist. Sie kann Ihnen nicht sagen, dass die Datei so gelesen wird, wie Sie denken.

Es gibt eine Prüfung, die es sofort gefangen hätte, und sie kostet etwa fünf Zeilen:

for each column c in the reference table:
    if sum(c over all rows) == 0:
        warn("column c is empty across the entire dataset")

Eine Null für eine einzelne Zeile ist normal. Eine Null für eine ganze Spalte, über jede Zeile hinweg, ist niemals eine Tatsache über die Welt — es ist eine Tatsache über Ihre Quelle. Diese Unterscheidung ist die gesamte Korrektur.

Die Unterscheidung, die die Korrektur schwer macht

Die naive Reparatur — „behandle Nullen als unbekannt" — zerstört genau das, wofür das Modell existiert.

In einer Sprachregion mit voller Abdeckung sind einzelne Nullen echt und tragend. Chloe in Großbritannien hat vier nicht-leere Dekaden von sieben; die drei leeren sind echt, denn im Grunde wurde in den 1940ern niemand in Großbritannien Chloe genannt. Diese Null ist genau das Signal, das das Modell sagen lässt „Chloe ist jung", und sie abzumildern würde jeden Namen in jeder vollständigen Sprachregion zurück in Richtung Gleichverteilung glätten.

Die beiden Nullen werden also nicht durch ihren Wert unterschieden, nicht durch ihre Zeile, sondern durch ihren Geltungsbereich:

  • Eine Null in einer Zeile, in einer Spalte, die andere Zeilen füllen → echt. Der Name war in dieser Dekade selten.
  • Eine Null in einer Zeile, in einer Spalte, die für jede Zeile leer ist → keine Messung. Die Quelle hört dort auf.

Die zweite Bedingung kann nur auf der Ebene des gesamten Datensatzes bewertet werden. Keine noch so genaue Inspektion einer einzelnen Zeile kann Ihnen sagen, welche Art von Null Sie vor sich haben, weshalb die Prüfung ein spaltenweites Aggregat sein muss und weshalb sie aus keiner zeilenweisen Validierung herausfällt.

Die Korrektur, in allgemeiner Form

Berechnen Sie, wie viele der Spalten die Quelle tatsächlich abdeckt, und teilen Sie dann die Wahrscheinlichkeitsmasse zwischen „was die Daten wissen" und „was sie nicht wissen" auf, im Verhältnis zu dieser Abdeckung:

Die Regel braucht eine Zahl, die die Zeile selbst nicht liefern kann: wie viele der Dekaden-Spalten die Quelle überhaupt abdeckt, gezählt über die gesamte Sprachregion statt über die Zeile. Teilen Sie die Wahrscheinlichkeitsmasse im Verhältnis zu dieser Abdeckung auf. Die abgedeckten Spalten behalten ihren Anteil davon; der Rest geht in einen einzigen Unbekannt-Eimer, der für die Dekaden steht, die die Quelle nicht sehen kann. Ziehen Sie einmal gegen beide zusammen. Landen Sie im Unbekannt-Eimer, ist die Antwort genau die, die das System ohnehin für eine Sprachregion ganz ohne Kohortendaten gibt — ein gleichverteiltes Alter über das gesamte Fenster. Landen Sie in den Daten, ist es die gewöhnliche gewichtete Ziehung über die Dekaden, unangetastet.

Vier Eigenschaften machen dies zu der Version, die wir behalten haben:

Sie ist in Ganzzahlen exakt. Die Aufteilung ist ganze Spalten gegen ganze Spalten, sodass die abgedeckte Masse und die unbekannte Masse immer wieder zur selben Summe addieren, wie auch immer die Zählungen des Namens aussehen. Kein Runden, keine Fließkommazahlen, kein „einfach eine 1 in die leeren Zellen setzen".

Sie geht bei voller Abdeckung ins alte Verhalten über. Wenn jede Spalte abgedeckt ist, ist der Unbekannt-Eimer leer und die Arithmetik ist nicht bloß äquivalent, sie ist buchstäblich derselbe Ausdruck. Wir haben das an 640.000 Vergleichen gegen eine wortwörtliche Kopie der vorherigen Implementierung verifiziert: acht vollständige Sprachregionen, null Abweichungen. Das ist wichtiger, als es klingt — eine Korrektur für zwei Sprachregionen, die die anderen acht still stört, ist keine Korrektur.

Sie fällt auf die ehrliche Basislinie zurück. Der Unbekannt-Eimer erfindet keine Verteilung; er erzeugt genau das Verhalten, das das System ohnehin für eine Sprachregion ganz ohne Kohortendaten hat. Der Rückfall ist kein neues Modell, es ist die Abwesenheit eines Modells, was die korrekte Aussage über Jahre ist, die die Quelle nicht sehen kann.

Sie skaliert mit dem, was bekannt ist. Die erwarteten Ausgaben folgen allein aus dem Abdeckungsverhältnis. Italien deckt eine Dekade von sieben ab, also landen sechs Siebtel der Masse im Gleichverteilungs-Eimer und ein Siebtel in den Daten; gegen ein Altersfenster von 19–57 und eine abgedeckte Dekade, die nur Alter von 19 bis 25 erzeugen kann, sagt das 29,7 % der Karten im Band 19–25 voraus, und der gemessene Wert ist 29,1–30,3 %. Dieselbe Arithmetik sagt 26,4 % im Band 46–57 gegen gemessene 25,9–26,6 % voraus, und für Österreich — drei Dekaden von sieben — 17,6 % gegen gemessene 17,0–17,5 %.

Drei Alternativen, und warum sie verlieren

Eine 1 in jede leere Zelle schreiben. Der offensichtliche Einzeiler. Er bewirkt nichts: die echten Kohortenmassen sind Hunderttausende, also ist eine 1 unter ihnen keine kleine Korrektur, sondern gar keine Korrektur. Erwähnenswert, weil es das Erste ist, was jeder vorschlägt.

Die fehlende Masse über die leeren Dekaden verteilen. Das ist die intuitiv „korrekte" Imputation, und sie wurde als aktiv schädlich gemessen. Italiens leere Dekaden sind die 1940er bis 1980er, und gegen ein Altersfenster von 19–57 fallen fast alle jener Geburtsjahre außerhalb des Fensters. Nach dem Kappen wären rund 40 % der Karten bei genau dem Höchstalter herausgekommen. Ein auffälliges Artefakt gegen ein anderes eingetauscht. Der Gleichverteilungs-Eimer hat per Konstruktion kein solches Randverhalten.

Die Liste der leeren Dekaden aus der Konfiguration des Validators lesen. Verlockend, weil der Validator ohnehin eine kuratierte Liste von „bekannt-leer, hier ist warum" führt. Aber diese Datei ist ein Build-Zeit-Artefakt und wird nicht ausgeliefert, und eine Konfiguration in die Laufzeit zu duplizieren bedeutet, dass jemand für immer zwei Kopien im Gleichschritt halten muss. Die Abdeckung aus den Daten selbst zu zählen bedeutet, dass die Daten sich selbst beschreiben und es nichts zu synchronisieren gibt.

Diese letzte Wahl hat einen ehrlichen Preis, und er sollte aufgeschrieben statt entdeckt werden: weil die Laufzeit die Abdeckung nun aus den Daten ableitet, wird ein künftiger Pipeline-Bug, der still eine ganze Dekade fallenlässt, zur Laufzeit geglättet, statt als fehlerhafte Ausgabe aufzutauchen. Die Verantwortung, das zu fangen, ist nicht verschwunden — sie sitzt beim Build-Zeit-Validator, der weiterhin bei jeder unerklärten leeren Spalte warnt. Ein Versagen von einem Ort an einen anderen zu verschieben ist in Ordnung. Aus den Augen zu verlieren, welcher Ort es ist, nicht.

Was die Korrektur nicht tut

Sie erschafft keine Information. Das ist der Teil, bei dem man deutlich sein sollte.

Vor der Änderung erzeugten alle acht Testnamen in der italienischen Sprachregion byte-identische Folgen von Altern. Mit einer abgedeckten Dekade können die Kohortendaten Namen überhaupt nicht nach Alter unterscheiden — es gibt kein Signal zu bergen. Die Wahl bestand nie zwischen Signal und Rauschen. Sie bestand zwischen „jeder Italiener ist 21" und „eine plausible Streuung ohne Alterssignal darin", und die zweite ist nur besser, weil die erste auffällig falsch ist.

Das wirklich nützliche Signal in einer Ein-Dekaden-Kohorte ist überhaupt nicht das Alter — es ist das Geschlecht. Ein Name, der überwältigend in der Frauen-Spalte auftaucht, ist weiblich, ganz gleich, aus welcher Dekade die Zählungen stammen, und diese Schlussfolgerung bleibt vollständig erhalten. Bevor die Kohortendaten existierten, war das Geschlecht für einen gesuchten Namen ein Münzwurf, was ein weit sichtbarerer Fehler ist als ein unplausibles Alter: „Giulia, männlich" springt einem in einer Weise ins Auge, wie es „Giuseppe, 23" nicht tut.

Die ehrliche Bilanz lautet also: die Geschlechtsschlussfolgerung gewann alles, die Altersschlussfolgerung gewann nichts, hörte aber auf zu lügen, und die acht Sprachregionen mit vollständigen Daten änderten sich um kein einziges Bit.

Die Checkliste

  1. Prüfen Sie für jede Spalte einer Referenztabelle, ob sie über den gesamten Datensatz hinweg leer ist. Eine Null auf Zeilenebene ist Daten. Eine Null auf Spaltenebene ist eine Tatsache über Ihre Quelle.
  2. Lassen Sie niemals „unbeobachtet" in denselben Wert wie „beobachtete Null" serialisieren, ohne den Unterschied irgendwo festzuhalten. Ganzzahl-Spalten haben kein NULL; wenn das Format es nicht tragen kann, muss die Abdeckungskarte neben der Datei leben.
  3. Testen Sie die Invariante, dass eine ärmere Quelle eine breitere Ausgabe erzeugt, nicht eine engere. Wenn Ihr Modell zuversichtlicher wird, wenn Sie es mit weniger Daten füttern, werden fehlende Daten als Evidenz gelesen. Das ist ein einzeiliger Eigenschaftstest, und er fängt die ganze Klasse.
  4. Validieren Sie die Verteilung der Ausgabe, nicht das Schema der Eingabe. Jede strukturelle Prüfung bestand an Dateien, die für 3.189 Namen eine degenerierte Antwort erzeugten.
  5. Halten Sie nach degenerierten Bereichen Ausschau. Minimum gleich Maximum, oder eine harte Obergrenze, die zu keiner realen Grenze passt, ist der sichtbare Fingerabdruck. „Keine Karte ist je älter als 45" war so lange auf dem Bildschirm, wie die österreichischen Daten existierten.
  6. Unterscheiden Sie den Geltungsbereich, wenn Sie entscheiden, ob eine Null echt ist. Derselbe Wert ist in einer Sprachregion eine Messung und in einer anderen ein Artefakt; nur das spaltenweite Aggregat kann Ihnen sagen, welches.
  7. Ziehen Sie den Rückfall auf die ehrliche Basislinie dem Imputieren einer Gestalt vor. Die Masse über die leeren Zellen zu verteilen sah prinzipientreu aus und legte 40 % der Ergebnisse auf einen einzigen Grenzwert.
  8. Beweisen Sie, dass die Korrektur inert ist, wo sie inert sein soll. Zwei Sprachregionen mussten geändert werden und acht nicht; „acht unverändert" wurde durch direkten Vergleich gegen die alte Implementierung festgestellt, nicht angenommen.
  9. Wenn die Laufzeit beginnt, etwas abzuleiten, das die Pipeline früher garantierte, schreiben Sie auf, wer nun den Pipeline-Bug fängt. Glättung ist ein Feature für schlechte Quellen und eine Maske für schlechte Builds.

Der Bug hatte eine einzeilige Ursache und ein sichtbares, absurdes Symptom, und er überlebte trotzdem, weil alles um ihn herum wohlgeformt war. Die Dateien waren gültig, die Schleife war korrekt, die Tests waren grün, und die Antwort war, dass jeder Italiener in der Datenbank einundzwanzig Jahre alt war.

Zum begleitenden Defekt — bei dem eine formal gewichtete Liste sich als zur Hälfte gleichverteilt herausstellte und jede aggregierte Metrik bestätigte, sie sei in Ordnung — siehe Die Hälfte Ihrer gewichteten Liste ist nicht gewichtet. Dazu, was das Altersmodell tut, wenn die Daten dahinter vollständig sind, siehe Namen nach Generation. Zu Prüfungen, die Erfolg melden, ohne je hinzusehen, siehe Die Prüfung, die genau dort blind wird, wo Sie sie brauchen. Zu den zugrunde liegenden Daten und ihren Lücken siehe Migrationsschichten in Geburtskohorten.


Daten mit Stand 2026-07-21

Alle Zahlen wurden am 21. Juli 2026 gemessen. Die Dekaden-Abdeckung wurde direkt aus den Kohortendateien auf der Platte berechnet. Die Vorher/Nachher-Altersverteilungen wurden für diesen Artikel durch eine unabhängige Neuimplementierung sowohl der alten als auch der neuen Auswahlregeln neu abgeleitet, über dieselben Daten bei festem Seed ausgeführt, statt aus dem Änderungsprotokoll zitiert; sie reproduzieren es exakt.

Quellen und Anmerkungen:

  • Abdeckung — eine Dekaden-Spalte zählt als abgedeckt, wenn ihre Summe über alle Zeilen der Sprachregion größer als null ist, beide Geschlechtsdateien zusammengenommen. Acht Sprachregionen decken 7 von 7 ab; de_AT deckt 3 von 7 ab (1981, 1991, 2001 gefüllt; 1941, 1951, 1961, 1971 leer); it_IT deckt 1 von 7 ab (nur 2001). Die Abdeckung unterscheidet sich in keiner Sprachregion zwischen der Männer- und der Frauendatei.
  • Italien — 3.189 Zeilen in den Kohortendaten, 1.667 männlich und 1.522 weiblich, mit insgesamt 2.425.502 bzw. 2.283.897 Zählungen, alle in der Spalte 2001–2010. Die zugrunde liegende Reihe sind ISTATs Vornamenzählungen, die 1999 beginnen.
  • Österreich — 17.434 Zeilen, 8.159 männlich und 9.275 weiblich. Dekaden-Summen, männlich: 0, 0, 0, 0, 296.553, 388.347, 346.755. Weiblich: 0, 0, 0, 0, 281.455, 368.831, 329.587. Die nationale Reihe beginnt 1984, weshalb die ersten vier Spalten leer sind.
  • Altersmessungen — 10.000 Ziehungen pro Name, fester Seed, Altersfenster 19–57, Basisjahr 2026. Die vier Bänder sind 19–25, 26–35, 36–45, 46–57. Italienische Namen vor der Korrektur: 100,0 % in 19–25, Median 21, Spanne 19–25, für jeden getesteten Namen. Nachher: 29,1–30,3 % in 19–25, Mediane 34–35, Spanne 19–57. Österreichische Namen vorher: 0,0 % in 46–57 für jeden Namen, Höchstalter 45. Nachher: 17,0–17,5 % in 46–57, Maximum 57.
  • Vollständige Sprachregionen sind unverändertno_NO und en_US erzeugen in der obigen Neusimulation unter beiden Regeln identische Bandanteile und identische Mediane. In der ausgelieferten Implementierung wurde dies stärker belegt, indem eine wortwörtliche Kopie des vorherigen Codes gegen den neuen an 400 Namen pro Sprachregion × 4 Altersfenster × 40 Seeds = 64.000 Vergleichen pro Sprachregion, 640.000 insgesamt, mit null Abweichungen in den acht vollständigen Sprachregionen ausgeführt wurde.
  • Die 40-%-Zahl — die gemessene Folge der abgelehnten Alternative, bei der die fehlende Masse über die leeren Dekaden-Spalten verteilt wird statt in einen einzigen Gleichverteilungs-Eimer. Italiens leere Dekaden sind 1941–1990; gegen ein 19–57-Fenster im Basisjahr 2026 entsprechen jene Geburtsjahre Altern von 36 und darüber, die meisten jenseits von 57, sodass das Kappen sie auf die Obergrenze häuft.
  • Vorhersage gegen Messung — der erwartete Anteil eines Bandes ist der nicht abgedeckte Bruchteil der Dekaden mal dem Anteil des Bandes am Altersfenster, plus der abgedeckte Bruchteil mal dem Anteil, den die Daten selbst erzeugen. Für Italien ergibt das 29,7 % für 19–25 und 26,4 % für 46–57 gegen Messungen von 29,1–30,3 % und 25,9–26,6 %. Für Österreich ergibt es 17,6 % für 46–57 gegen 17,0–17,5 %.
  • Die Geschlechtsbehauptung — bevor Kohortendaten für eine Sprachregion existierten, wurde das an einen gesuchten Namen angehängte Geschlecht zufällig gezogen. Mit Ein-Dekaden-Kohortendaten wird es daraus abgeleitet, welche Datei die größere Masse trägt, was für alle 3.189 italienischen Namen korrekt ist, ungeachtet der Altersdegeneriertheit. Das wird als Design-Eigenschaft angegeben, nicht als gemessene Genauigkeitszahl.
  • Strukturelle gegen Stichproben-Nullen — die Terminologie ist in der kategorialen Datenanalyse Standard und wird hier wegen ihrer Präzision verwendet, nicht als Behauptung, dass unser Fall eine Lehrbuch-Kontingenztafel sei. Unsere Nullen sind systematisch unbeobachtete Zellen, was die schwierigere Variante ist, da die Fehlendheit perfekt mit der interessierenden Variablen korreliert.

← Artikel