Eingaben & Verteilungen¶
Jeder FAIR-Faktor wird als Verteilung eingegeben, aus der die Monte-Carlo-Simulation zieht. pyfair (Fork) kennt dafür zwei Eingabestile, die sich beliebig mischen lassen.
Zwei Eingabestile¶
1. Legacy (Kurzform-Schlüsselwörter)¶
Aus der Kombination der Schlüsselwörter leitet pyfair die Verteilung ab:
| Schlüsselwörter | Verteilung |
|---|---|
constant |
Konstante |
mean, stdev |
Normal |
low, mode, high (gamma optional) |
PERT |
model.input_data('Loss Magnitude', mean=20_000, stdev=5_000) # Normal
model.input_data('Loss Event Frequency', low=10, mode=20, high=100) # PERT
model.input_data('Secondary Loss', constant=3_500) # Konstante
2. Strukturiert (Fork)¶
Explizit über distribution, params und optional confidence / input_mode:
model.input_data(
'Threat Capability',
distribution='beta',
params={'mean': 0.3},
confidence='moderate',
)
| Argument | Bedeutung |
|---|---|
distribution |
'constant', 'normal', 'pert', 'lognormal', 'poisson', 'beta'. |
params |
Dictionary der Verteilungsparameter (siehe unten). |
confidence |
Qualitative Streubreite: very_low, low, moderate, high, very_high. |
input_mode |
Spezial-Eingabeart (aktuell nur confidence_interval für beta). |
Additiv & abwärtskompatibel
Die strukturierte API ergänzt die Legacy-Form, ersetzt sie nicht. Bestehende Modelle laufen unverändert weiter.
Die Verteilungen im Detail¶
Constant¶
Fester Wert für alle Iterationen.
params={'constant': 50_000}
# Legacy: constant=50_000
Normal¶
Normalverteilung um mean mit Streuung stdev.
params={'mean': 20_000, 'stdev': 5_000}
# Legacy: mean=20_000, stdev=5_000
PERT (Beta-PERT)¶
Dreipunkt-Schätzung low/mode/high mit Formparameter gamma (Default 4;
höheres gamma = spitzer um mode). Es muss gelten low ≤ mode ≤ high.
params={'low': 10, 'mode': 20, 'high': 100} # gamma default 4
params={'low': 10, 'mode': 20, 'high': 100, 'gamma': 8}
# Legacy: low=10, mode=20, high=100, gamma=8
Lognormal¶
Schiefe Verteilung für Verlusthöhen. mean ist der arithmetische
Mittelwert auf der Originalskala, sigma die Streuung der zugrunde
liegenden Normalverteilung. mean muss > 0 sein.
params={'mean': 250_000, 'sigma': 0.6}
sigma kann auch über confidence gesetzt werden (Default 0.6).
Poisson¶
Zähl-Häufigkeiten mit unsicherem lambda. range streut lambda
symmetrisch, bevor gezogen wird:
lambda_sample ~ Uniform(lambda · (1 − range), lambda · (1 + range))
variates ~ Poisson(lambda_sample)
params={'lambda': 12, 'range': 0.4}
range kann über confidence gesetzt werden (Default 0.4).
Beta¶
Für Wahrscheinlichkeiten / 0–1-Faktoren. Zwei Parametrisierungen:
alpha/beta– direkt, odermean/k– mitalpha = mean·k,beta = (1−mean)·k.kist die „Konzentration" (höheresk= schmaler).meanmuss in [0, 1] liegen.
params={'mean': 0.3, 'k': 15} # k default 15
params={'alpha': 2, 'beta': 5}
k kann über confidence gesetzt werden.
Konfidenz-Mapping¶
confidence ersetzt den Formparameter der jeweiligen Verteilung durch einen
hinterlegten Wert. Je Verteilung gibt es genau einen solchen Parameter:
| Verteilung | Formparameter | Default (ohne confidence) |
|---|---|---|
beta |
k |
15 |
lognormal |
sigma |
0.6 |
poisson |
range |
0.4 |
pert |
gamma |
4 |
Mit confidence ergeben sich diese Werte (höhere Konfidenz = engere Streuung;
bei poisson ist kleineres range enger, bei lognormal ist die Tabelle
bewusst so kalibriert):
| confidence | beta k |
lognormal sigma |
poisson range |
pert gamma |
|---|---|---|---|---|
very_low |
4 | 0.25 | 2.5 | 10 |
low |
7 | 0.4 | 0.75 | 8 |
moderate |
15 | 0.6 | 0.4 | 4 |
high |
40 | 0.9 | 0.25 | 3 |
very_high |
100 | 1.2 | 0.15 | 2 |
# Konfidenz statt explizitem Formparameter:
model.input_data('Primary Loss', distribution='lognormal',
params={'mean': 100_000}, confidence='high') # sigma = 0.9
Nicht beides gleichzeitig
confidence und der explizite Formparameter derselben Verteilung schließen
sich aus. confidence='high' und params={'sigma': 0.5} für dieselbe
Eingabe wirft eine FairException.
Die Tabellen sind zentral in pyfair/utility/confidence_mapping.py definiert –
fair-web macht die Standardwerte in der App-Konfiguration editierbar.
Beta-Konfidenzintervall (input_mode)¶
Statt mean/k lässt sich eine Beta-Verteilung aus einem zentralen
Konfidenzintervall über [0, 1] fitten. pyfair löst daraus mean/k:
model.input_data(
'Threat Capability',
distribution='beta',
input_mode='confidence_interval',
params={'low': 0.2, 'high': 0.6, 'confidence': 0.9},
)
Bedeutung: „Mit 90 % Wahrscheinlichkeit liegt der Faktor zwischen 0,2 und 0,6."
Bedingungen: 0 ≤ low < high ≤ 1 und 0 < confidence < 1; mean/k/alpha/
beta dürfen dann nicht zusätzlich angegeben werden.
Wertebereiche & Clipping¶
Vier Faktoren sind Wahrscheinlichkeiten und müssen in [0, 1] liegen – Eingabe-Parameter außerhalb [0, 1] werden abgewiesen, und die erzeugten Samples werden auf [0, 1] beschnitten:
Probability of Action, Vulnerability, Control Strength, Threat Capability
Alle übrigen Faktoren werden auf ≥ 0 beschnitten (keine negativen
Häufigkeiten/Verluste). Zusätzlich prüft pyfair, dass numerische Parameter nicht
negativ sind und PERT-Tripel geordnet sind (low ≤ mode ≤ high).