Konfidensintervall
Kunna beräkna och tolka konfidensintervall för medelvärden och andelar.
Intuition
Ett 95 %-konfidensintervall är ett intervall beräknat så att, om du upprepade hela stickprovsproceduren många gånger, 95 % av intervallen skulle täcka det sanna värdet. Det är inte «95 % sannolikhet att sanningen ligger här» — sanningen är fast, intervallet slumpar.
För ett medelvärde: x̄ ± 1,96·s/√n (stort n). För en andel: p̂ ± 1,96·√(p̂(1−p̂)/n). Vid små n eller andelar nära 0/1: Wilson-intervall.
Användning i ML: rapportera testmått med intervall. Jämför du två modeller på samma testfall behöver du ett intervall för den parade skillnaden; överlapp mellan separata intervall avgör inte frågan. Bootstrap kan skatta osäkerhet även för mått utan enkel intervallformel.
Formellt
Exempel: två versioner av en AI-handledare. I ett slumpat försök slutför 80 av 200 elever en lektion med den gamla versionen och 96 av 200 med den nya. Andelarna är 40 % och 48 %; skillnaden är +8 procentenheter.
För två oberoende grupper är en enkel approximation . Här blir intervallet ungefär −2 till +18 procentenheter. Det rymmer noll: datan ger ännu inte ett tydligt stöd för att byta. Intervallet visar också att en användbar förbättring fortfarande är möjlig. Samla fler observationer enligt en plan bestämd före nästa analys.
Intervall för varje grupps andel besvarar inte frågan om skillnaden. Räkna ett intervall för skillnaden. Om samma elever eller testfall får båda versionerna är observationerna parade och analysen måste bevara paren, till exempel med parad bootstrap.
Kod
import numpy as np
from scipy import stats
# Medelvärde av åtta mätningar: t-intervall när spridningen skattas.
errors = np.array([3.1, 2.4, 4.0, 3.3, 2.9, 3.8, 3.5, 2.7])
mean = errors.mean()
se = errors.std(ddof=1) / np.sqrt(len(errors))
lo, hi = stats.t.interval(0.95, len(errors) - 1, loc=mean, scale=se)
print(round(mean, 2), round(lo, 2), round(hi, 2)) # 3.21 2.76 3.67
# En andel: Wilson-intervallet är bättre än normalapproximationen nära 0/1.
def wilson(k, n, z=1.96):
p = k / n
d = 1 + z**2 / n
center = (p + z**2 / (2 * n)) / d
half = z * np.sqrt(p * (1 - p) / n + z**2 / (4 * n**2)) / d
return center - half, center + half
print(tuple(float(round(x, 2)) for x in wilson(87, 100))) # (0.79, 0.92)
# Skillnad mellan två oberoende andelar i skolans försök.
old, new, n = 80 / 200, 96 / 200, 200
diff = new - old
diff_se = np.sqrt(old * (1 - old) / n + new * (1 - new) / n)
print(tuple(float(round(x * 100, 1)) for x in
(diff - 1.96 * diff_se, diff + 1.96 * diff_se))) # (-1.7, 17.7)
# Bootstrap för ett mått utan enkel intervallformel: medianen av samma mätningar.
rng = np.random.default_rng(0)
medians = [np.median(rng.choice(errors, len(errors), replace=True))
for _ in range(2000)]
print(np.percentile(medians, [2.5, 97.5]))
Behärskning innebär
- Beräknar konfidensintervall för medelvärde och andel
- Tolkar intervallet korrekt (frekventistiskt)
- Använder bootstrap för godtyckliga mått
Förkunskaper
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- NIST — Confidence Limits for the Mean
- NIST — Confidence intervals for proportions (Wilson)
- NIST — Difference of Proportions Confidence Interval
- SciPy — Bootstrap documentation
- Wikipedia — Konfidensintervall (CC BY-SA 4.0) — CC BY-SA 4.0
- Wikipedia — Binomial proportion confidence interval (CC BY-SA 4.0) — CC BY-SA 4.0