Bakgrund
Grafen ovan publicerades i en stor dagstidning under september 2025 men
avsikten här är inte att förstå eller förklara vad grafens fakta
visar.
Med ‘statistikögon’ kollar man dock axlarna men också om
kurvorna visar verklig variation. Inte sällan ser man grafer där kurvor
har utjämnas med någon typ av algoritm. Men eftersom antalet födslar
varje år är mycket stort så finns det kanske inte mycket slumpmässig
variation. (Mer om det senare.)
Självklart bör man utgå ifån hela
datamaterialet om man vill gräva mer i informationen men utgångspunkten
här är snarare lite ‘datadetektivarbete’, dvs hur kan man tolka och
resonera och hantera det som finns vid handen.
Detta dokument delas in i tre delar:
1. Beräkning av Weibull-parametrar utifrån två punkter på F(x)
2. En diskussion om binomialfördelningen
3. En diskussion om Poissonfördelningen
1. Beräkning av Weibull-parametrar utifrån två punkter på F(x)
En Weibullfördelning. Nedanstående kommandon skapar en Weibullfördelning utifrån kända värden på parametrarna. Den vänstra grafen är sannolikhetsfördelningen och den högra fördelningsfunktionen. Fördelningsfunktionen innehåller två punkter (enbart valda som exempel i följande diagram). För X = 2.1 och X = 5.6 anges på Y-axeln (ungefär) 0.25 respektive 0.96 som betyder att 25% respektive 96% av all sannolikhetsyta ligger till vänster om X = 2.1 respektive X = 5.6:
library(ggplot2) # För diagramritning
library(patchwork) # För placering av diagram
a <- 2.5 # Formparameter
b <- 3.5 # Skalparameter
ovreXgrans <- qweibull(0.999, a, b)
ft <- function(xvar) {dweibull(xvar, a, b)}
ftdia <- ggplot(data.frame(x = c(0, ovreXgrans)), aes(x = x)) + xlab("X") + ylab("f(t)") +
stat_function(fun = ft, colour = "red") +
annotate("text", x = Inf, y = Inf, label = "Weibullfördelning", vjust = 1.8, hjust = 1.5,
fontface = "bold", color = "blue", size = 4) +
annotate("text", x = Inf, y = Inf, label = "Sannoliketsfördelning", vjust = 4.0, hjust = 1.4,
fontface = "bold", color = "red", size = 3.5)
Ft <- function(xvar) {pweibull(xvar, a, b)}
Yvanstra <- pweibull(2.1, a, b)
Yhogra <- pweibull(5.6, a, b)
Ftdia <- ggplot(data.frame(x = c(0, ovreXgrans)), aes(x = x)) + xlab("X") + ylab("F(t)") +
stat_function(fun = Ft, colour = "red") +
annotate("text", x = 0, y = Inf, label = "Weibullfördelning", vjust = 1.8, hjust = 0,
fontface = "bold", color = "blue", size = 4) +
annotate("text", x = 0, y = Inf, label = "Fördelningsfunktion", vjust = 4.0, hjust = 0,
fontface = "bold", color = "red", size = 3.5) + geom_point(aes(x = c(2.1, 5.6),
y = c(Yvanstra, Yhogra)), color = "black", size = 3)
ftdia + Ftdia
Men antag att man bara har två punkter på en fördelningsfunktion och vill beräkna fördelningens parametrar (med antagande om Weibullfördelning), hur gör man då?
Fördelningsfunktionen har följande matematiska uttryck (där F(x) är ytan till vänster om x-värdet):
\[ \begin{align} \Large F(x)=1-e^{-(x/b)^a} \end{align} \]Följande kommandon plockar fram parametrarna, efter en del matematiska manipulationer (som inte visas här), givet två punkter på fördelningsfunktionen. Här används indata enligt ovan:
X1 <- 2.1
X2 <- 5.6
p1 <- 0.243
p2 <- 0.960
X <- log(X2/X1)/(log(-log(1 - p2)) - log(-log(1 - p1)))
a <- 1/X
b <- X1/((-log(1 - p1))**(1/a))
paste0("a-parameter = ", round(a, 1),", b-parameter = ", round(b, 1))
## [1] "a-parameter = 2.5, b-parameter = 3.5"
De två parametervärdena (a, b) motsvarar exakt de värden som användes för fördelningen ovan.
Den ursprungliga grafen. Diagrammet angående förlossningar visar inte antal förlossningar men här används n = 90000 förlossnigar per år. Från diagrammet kan man utläsa följande för år 2010: antal tonårsmammor (< 20 år), cirka 1300, antal mammor > 40 år, cirka 5 800.
library(ggplot2) # För diagramritning
library(patchwork) # För placering av diagram
X1 <- 20 # Gräns för tonår
X2 <- 40 # 40-årsgräns
p1 <- 1300/90000 # Andel tonårsmammor.
p2 <- 1 - 5800/90000 # Andel < 40 år.
X <- log(X2/X1)/(log(-log(1 - p2)) - log(-log(1 - p1)))
a <- 1/X # Formparameter
b <- X1/((-log(1 - p1))**(1/a)) # Skalparameter
ovreXgrans <- qweibull(0.9999, a, b)
ft <- function(xvar) {dweibull(xvar, a, b)}
ftdia <- ggplot(data.frame(x = c(10, ovreXgrans)), aes(x = x)) + xlab("Ålder vid förlossning") + ylab("f(t)") +
stat_function(fun = ft, colour = "red") +
annotate("text", x = Inf, y = Inf, label = "Weibullfördelning", vjust = 1.8, hjust = 1.5,
fontface = "bold", color = "blue", size = 4)
Ft <- function(xvar) {pweibull(xvar, a, b)}
Yvanstra <- pweibull(20, a, b)
Yhogra <- pweibull(40, a, b)
Ftdia <- ggplot(data.frame(x = c(10, ovreXgrans)), aes(x = x)) + xlab("Ålder vid förlossning") + ylab("F(t)") +
stat_function(fun = Ft, colour = "red") +
annotate("text", x = 12, y = Inf, label = "Weibullfördelning", vjust = 1.8, hjust = 0,
fontface = "bold", color = "blue", size = 4) + geom_point(aes(x = c(20, 40),
y = c(Yvanstra, Yhogra)), color = "black", size = 3)
ftdia + Ftdia
Fördelningen ovan är alltså den Weibullfördelning som skapas av de två
punkterna från den ursprungliga grafen om ålder vid förlossning för år
2010. Det verkar som att fördelningen förändras för åren efter 2010
eftersom andelen tonårsgraviditeter går ned.
Om man har tillgång
till hela datamängden är det naturligtvis bättre att studera den för att
t.ex. anpassa en fördelning. Men antag att man vill sätta mål på t.ex.
en tidsvariabel och anger en undre gräns och en övre gräns. Då är det
praktiskt med en fördelning för att studera förväntat medelvärde och
spridning som kan beräknas med de två parametrarna. Men antag att man
har en tidsprocess och vill ange ett målvärde (medelvärde) och samtidigt
en övre gräns. Detta är ju i sak samma som ovan men ibland mer
praktiskt. Se t.ex. https://ovn.ing-stat.se/Rgoal/Rgoal3.php för en utförlig
diskussion.
2. En diskussion om binomialfördelningen
Kurvan för antal tonårsmammor har en viss variation men är variationen
slumpmässig mellan de ursprungliga årliga antalen eller är kurvan
utjämnad på något sätt (inte ovanligt) och i så fall hur?
Antag att
vi bara betraktar antal tonårsmammor per år. Detta är då en diskret
antalsfördelning en s.k. binomialfördelning som styrs av två
parametrar, p och n. Standardavvikelsen, sigma, beräknas
på följande sätt:
\[ \begin{align} \Large \sigma = \sqrt{ np(1-p)} = \sqrt{ 90000\cdot 0.0144\cdot (1-0.0144)}=35.7 \phantom{invisible}\text{(tonårsmödrar)} \end{align} \]
Den naturliga variationen i kurvan vid år 2010 är ungefär 100 (3*35.7) och kanske det är vad som grafen visar.
3. En diskussion om Poissonfördelningen
Om man i stället betraktar förlossningar som en ström av händelser i
tiden är Poissonfördelningen ett första val som sannolikhetsfördelning.
Poissonfördelningen har endst en parameter, ofta betecknad med bokstaven
λ och benämnd som processens intensitet.
En intensitet
kan betraktas som en hastighet som ju kan anges på olika sätt t.ex. m/s,
km/h, etc. På samma sätt kan intensiteten i en Poissonprocess anges som
‘antal händelser per timme’, ‘…per dag’ eller, som i detta fall kanske
lämpligast, ‘antal förlossningar per år’.
För en Poissonfördelning
gäller följande (dvs sigma är roten ur intensiteten):
\[
\begin{align}
\Large \sigma = \sqrt{\lambda} = \sqrt{ 1300}=36.1
\phantom{invisible}\text{(tonårsmödrar)}
\end{align}
\]
Beräkningen av sigma i Poisson gav praktiskt taget samma resultat som
beräkningen för binomialfördelningen. Detta är ingen slump utan ett
faktum då andelen (p) är låg. Denna likhet mellan binomialfördelningen
och Poissonfördelningen untnyttjades förr i tiden eftersom Poisson var
lättare att beräkna.
Avslutningsvis
Ovanstående text avser inte att ge en
uttömmande diskussion om problemet som diskuteras i den ursprungliga
grafen. Snarare är avsikten att visa att det går att resonera och
ifrågasätta t.ex. grafer eller påståenden med hjälp av lite statistisk
teori.
(Analyserna har gjorts med datorprogrammet ‘R’ och med det grafiska gränssnittet ‘R-studio’ och bägge är gratis tillgängliga på nätet. Se https://www.indstat.se och knappen [Statistikprogram - R] för installation.)
(Se https://www.indstat.se för många andra simuleringsövningar.)