Schuhgröße synthetisch WS 2025 (Notebook)#

Erstellt von ChatGPT (Modell 4o oder 5?), 2025-10-25

Promt etwas so:

Erzeuge einen synthetischen Datensatz mit Alter, Geschlecht, Körpergröße, Schuhgröße

ChatGPT:

Gut, ich kann dir einen synthetischen Datensatz erzeugen, der näher an den echten Wachstums-Standards der World Health Organization (WHO) liegt. Dabei liegt der Fokus auf Alter, Geschlecht, Körpergröße — Schuhgröße kann ich zusätzlich approximieren (wenngleich Wertsätze dafür weniger standardisiert verfügbar sind).

Vorgehensweise:

  • Ich verwende die WHO-Wachstumsstandards für „Länge/Höhe-für-Alter“ (Height-for-age) als Referenz.

  • Jeder Wert (Körpergröße) wird so generiert, dass er sich innerhalb realistischer Perzentilen-Spannen für das betreffende Alter und Geschlecht befindet.

  • Schuhgröße wird anhand der Körpergröße geschätzt – z. B. grobe Zuordnung: je 5 cm Körpergröße mehr → ca. eine EU-Schuhgröße mehr.

Füge noch den BMI hinzu

Da der Datensatz Personen von 3 bis 40 Jahren enthält, unterscheiden wir zwei Fälle:

Kinder & Jugendliche (< 18 Jahre), vereinfacht orientiert an WHO-Perzentilen (ungefähre Richtwerte):

  • < 5. Perzentile (≈ BMI < 14–15): Untergewichtig

  • 5.–85. Perzentile (≈ BMI 14–22): Normalgewicht

  • 85.–95. Perzentile (≈ BMI 22–25): Übergewichtig

  • ≥ Perzentile (≈ BMI > 25): Adipositas

Erwachsene (≥ 18 Jahre), nach WHO-Klassifikation:

  • < 18.5 → Untergewichtig

  • 18.5–24.9 → Normalgewicht

  • 25–29.9 → Übergewichtig

  • ≥ 30 → Adipositas

(Die Werte für Kinder sind hier bewusst grob gehalten, da exakte Perzentilen tabellenabhängig sind.)

import csv
import random

1. Wachstum & BMI Referenz für Kinder & Jugendliche —#

growth_reference = {
    3: {"m": 96, "w": 95},
    5: {"m": 110, "w": 109},
    10: {"m": 140, "w": 139},
    12: {"m": 152, "w": 151},
    13: {"m": 158, "w": 156},
    14: {"m": 165, "w": 160},
    15: {"m": 170, "w": 163},
    16: {"m": 174, "w": 165},
    17: {"m": 177, "w": 166},
    18: {"m": 178, "w": 167},
    19: {"m": 179, "w": 167},
    20: {"m": 179, "w": 167},
    21: {"m": 179, "w": 167}
}

bmi_reference = {
    3: 15, 5: 15.5, 10: 17, 12: 18, 13: 19,
    14: 20, 15: 21, 16: 21.5, 17: 22, 18: 22.5,
    19: 23, 20: 23.5, 21: 24
}
def interpolate_height(age, gender):
    if age in growth_reference:
        return growth_reference[age][gender]
    lower_ages = [a for a in growth_reference if a < age]
    upper_ages = [a for a in growth_reference if a > age]
    low = max(lower_ages)
    high = min(upper_ages)
    low_val = growth_reference[low][gender]
    high_val = growth_reference[high][gender]
    return low_val + (high_val - low_val) * (age - low) / (high - low)
def interpolate_bmi(age):
    if age in bmi_reference:
        return bmi_reference[age]
    lower_ages = [a for a in bmi_reference if a < age]
    upper_ages = [a for a in bmi_reference if a > age]
    low = max(lower_ages)
    high = min(upper_ages)
    low_val = bmi_reference[low]
    high_val = bmi_reference[high]
    return low_val + (high_val - low_val) * (age - low) / (high - low)
def estimate_shoe_size(height_cm):
    foot_length = height_cm * 0.15
    return round((foot_length + 1.5) * 1.5)

BMI-Kategorie bestimmen#

def bmi_category(age, bmi):
    if age < 18:  # grobe Einteilung für Kinder & Jugendliche
        if bmi < 15:
            return "Untergewichtig"
        elif bmi < 22:
            return "Normalgewicht"
        elif bmi < 25:
            return "Übergewichtig"
        else:
            return "Adipositas"
    else:  # Erwachsene
        if bmi < 18.5:
            return "Untergewichtig"
        elif bmi < 25:
            return "Normalgewicht"
        elif bmi < 30:
            return "Übergewichtig"
        else:
            return "Adipositas"

Kinder & Jugendliche (3-21 Jahre)#

rows = []
for i in range(1, 1001):
    age = random.randint(3, 21)
    gender = random.choice(["m", "w"])
    base_height = interpolate_height(age, gender)
    height = round(random.gauss(base_height, 5), 1)
    base_bmi = interpolate_bmi(age)
    bmi = round(random.gauss(base_bmi, 2), 1)
    weight = round(bmi * (height / 100) ** 2, 1)
    shoe_size = estimate_shoe_size(height)
    cat = bmi_category(age, bmi)
    rows.append([i, age, gender, height, weight, bmi, cat, shoe_size])

Erwachsene (22-40 Jahre)#

adult_mean_height = {"m": 179, "w": 167}
adult_height_sd = 6
adult_bmi_mean = {"m": 25, "w": 24}
adult_bmi_sd = 3

for i in range(1001, 1501):
    age = random.randint(22, 40)
    gender = random.choice(["m", "w"])
    height = round(random.gauss(adult_mean_height[gender], adult_height_sd), 1)
    bmi = round(random.gauss(adult_bmi_mean[gender], adult_bmi_sd), 1)
    weight = round(bmi * (height / 100) ** 2, 1)
    shoe_size = estimate_shoe_size(height)
    cat = bmi_category(age, bmi)
    rows.append([i, age, gender, height, weight, bmi, cat, shoe_size])

CSV speichern#

filename = "synthetische_daten_3bis40_mit_BMI_Kategorien.csv"
with open(filename, "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow([
        "ID", "Alter_Jahre", "Geschlecht", "Körpergröße_cm", "Gewicht_kg", "BMI", "BMI_Kategorie", "Schuhgröße_EU"
    ])
    writer.writerows(rows)

print(f"Datei '{filename}' mit {len(rows)} Einträgen und BMI-Kategorien erfolgreich erstellt.")
Datei 'synthetische_daten_3bis40_mit_BMI_Kategorien.csv' mit 1500 Einträgen und BMI-Kategorien erfolgreich erstellt.