Bakgrund

Vid analys av data är det nödvändigt att fundera på variationen. Då man t.ex. adderar variabler kommer summans variation att påverkas av de enskilda variablernas variation. Det kan dessutom finnas en samvariation mellan variablerna som riskerar att öka summans total variation. Här diskutera detta på olika sätt inklusive några simuleringar för att klargöra.


Bilden ovan visar en pricipskiss av ett telefonhölje beståede av en A-del och en C-del och därimellan en B-del. Höljet är inte hermetiskt tillslutet men i vissa enheter gick det tyvärr att se in mot kretskortet vid det röda måttet Y. Detta berodde på för stor slumpmässig variation i måtten.
Mått Y kan beräknas på följande sätt:


\[ \begin{align} \Large Y = A + B + C -E - G \end{align} \]

Variationen i Y är summan av variationen i de enskilda måtten och om Y blir positivt går det att se in i telefonen från sidan.



Ytterligare exempel. Högtryckspumpar består ofta av flera segment som byggs ihop till det tryckområde som önskas, se figur. Pumpens mått (exklusive elmotor och stativ) blir då summan av ett antal mått. Dessutom finns det lika många pumphjul på en axel inuti pumpen. Detta bildar också ett längdmått som är en summa av pumphjulens bredd plus en distansring. För att axeln skall kunna rotera fritt måste alltså alla mått hållas inom snäva toleranser:





(Se https://ovn.indstat.se [24] som är en övning baserad på ett exempel från en svensk läkemedelstillverkare. Påsar med en viss lösning har två sömmar, K1 och K2, gjorde samtidigt och har då en viss kovarians i styrka.)



Ett enklare uttryck. Låt oss betrakta enbart det totala måttet (T) över telefonen:


\[ \begin{align} \Large T = A + B + C \end{align} \]


Eftersom A, B och C här betraktas som oberoende variabler så är naturligtvis T också en variabel. Variationen hos T blir då enligt följande (‘V’ betyder här variansen dvs sigma i kvadrat):

\[ \begin{align} \Large V(T) = V(A) + V(B) + V(C) \end{align} \]


Samvariation. Samvariation (som här kommer att kallas kovarians) innebär att t.ex. variablerna A och B är ‘höga/låga tillsammans’, vilket syns på ett diagram om data plottas. (Se https://ovn.ing-stat.se [48] för samband mellan två variabler.)
Om det finns en kovarians mellan t.ex. variablerna A och B kommer detta att påverka variationen i T. Uttrycket kommer att få ytterligare en term som adderar kovariansen:


\[ \begin{align} \Large V(T) = V(A) + V(B) + V(C) + 2\cdot Cov(A, B) \end{align} \]

Om det även skulle finnas kovarians mellan A och C och även mellan B och C får uttrycket ytterligare två termer:


\[ \begin{align} \Large V(T) = V(A) + V(B) + V(C) + 2\cdot Cov(A, B) + 2\cdot Cov(A, C) + 2\cdot Cov(B, C) \end{align} \]



Korrelationskoefficienten. Korrelationskoefficienten brukar vara ett välkänt begrepp för den som analyserar data och brukar i utskrifter betecknas med bokstaven r. Koefficienten är inom området [-1, 1] där r = -1 betyder att alla punkter i ett XY-diagram ligger på en rät linje som lutar nedåt. Om r = 1 ligger alla punkter på en rät linje som lutar uppåt. För andra värden på r liknar diagrammet en mer eller mindre utbredd punktsvärm.

Det finns en koppling mellan korrelationskoefficienten och kovariansen (vi lämnar exemplet ovan och använder X och Y som variabler). Kovariansen blir en produkt av r och standardavvikelsen för X respektive Y:


\[ \begin{align} \Large Cov(X, Y) = r \cdot \sigma_{X}\cdot\sigma_{Y} \end{align} \]

Om vi anger Z som en summa Y och X får vi följande uttryck:


\[ \begin{align} \Large V(Z) = V(X) + V(Y) + 2\cdot r \cdot \sigma_{X}\cdot\sigma_{Y} \end{align} \]

Om r = 0 försvinner den sista termen helt och om r är positivt ökar variansen i Z och om r är negativt minskar variansen i Z.



Simulering. Några olika exempel — korrelationskoefficienten r = 0, r = 0.75 och r = -0.80.


 1. Simulering av summan av X och Y med korrelationskoefficient 0

library(ggplot2)                             # Loads the graphical package
library(patchwork)                           # För placering av grafer

antal <- 1000                                # Antal datapunkter.

mX <- 50                                     # Medelvärde X.
mY <- 25                                     # Medelvärde Y.
sX <- 0.3                                    # Standardavvikelse X.
sY <- 0.2                                    # Standardavvikelse Y.
r  <- 0.0                                    # Korrelationskoefficienten.

X <- rnorm(antal, 0, 1)
Y <- rnorm(antal, 0, 1) 

X1 = r*X + sqrt(1-r*r)*Y
X = mX + sX*X
Y = mY + sY*X1

allData <- data.frame(X, Y)                  # Placerar data i en s.k. 'dataframe'.

hist1 <- ggplot(allData, aes(X)) + geom_histogram(bins=15, color='yellow', alpha = 0.5, 
                                                      aes(y = after_stat(density)), position = 'identity')
hist2 <- ggplot(allData, aes(Y)) + geom_histogram(bins=15, color='green', alpha = 0.5, 
                                                       aes(y = after_stat(density)), position = 'identity')

diaText <- paste0("r = ", r)                  # Text på diagrammet.

dia <- ggplot(allData, aes(x = X, y = Y)) + geom_point() + theme(legend.position="none")
dia <- dia + annotate("text", x = -Inf, y = Inf, label=diaText, vjust = 1.5, hjust=-0.9, size = 4.5, colour = "blue")

teoMedZ <- mX + mY                                   # Beräknar teoretisk medelvärde.
teoVarZ <- round(sX^2 + sY^2 + 2*r*sX*sY, 3)         # Beräknar teoretisk varians.
teoMedZ <- mX + mY                                   # Beräknar teoretisk medelvärde.
simMedZ <- round(mean(X + Y), 2)                     # Beräknar simulerad varians.
simVarZ <- round(var(X + Y), 2)                      # Beräknar simulerad varians.

rad1 <- paste0("Korr.koefficient = ", r) 
rad2 <- paste0("Teo. medel Z = ", teoMedZ) 
rad3 <- paste0("Teo. varians Z = ", teoVarZ) 
rad4 <- paste0("Sim. medel Z = ", simMedZ) 
rad5 <- paste0("Sim. varians Z = ", simVarZ)
rad6 <- paste0("Antal = ", antal)

diatext <- ggplot() + geom_point(x=2, y=3) + theme(legend.position="none") + xlim(0, 1) + ylim(0, 1)
diatext <- diatext + theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank())
diatext <- diatext + theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(),
                     axis.text.y=element_blank(), axis.ticks.y=element_blank()) + xlab("") + ylab("")
diatext <- diatext + annotate("text", x = 0, y = 0.9,  label=rad1, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.72, label=rad2, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.6,  label=rad3, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.42, label=rad4, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.3,  label=rad5, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.1,  label=rad6, size=4, colour = "blue", hjust=0)

hist1 + hist2 + dia + diatext + plot_layout(ncol = 2)     # Placerar graferna.

Kommentar till simulering 1. Eftersom korrelationskoefficienten är 0 finns det ingen kovarians mellan variablerna. Teoretisk varians är alltså bara en summa av varianserna för X och Y dvs summan 0.30 * 0.30 + 0.20 * 0.20 (ingen kovariansterm.) Teoretiskt och simulerat resultat överensstämmer väl.


2. Simulering av summan av X och Y med korrelationskoefficient 0.80

library(ggplot2)                             # Loads the graphical package
library(patchwork)                           # För placering av grafer

antal <- 1000                                # Antal datapunkter.

mX <- 50                                     # Medelvärde X.
mY <- 25                                     # Medelvärde Y.
sX <- 0.3                                    # Standardavvikelse X.
sY <- 0.2                                    # Standardavvikelse Y.
r  <- 0.80                                   # Korrelationskoefficienten.

X <- rnorm(antal, 0, 1)
Y <- rnorm(antal, 0, 1) 

X1 = r*X + sqrt(1-r*r)*Y
X = mX + sX*X
Y = mY + sY*X1

allData <- data.frame(X, Y)                  # Placerar data i en s.k. 'dataframe'.

hist1 <- ggplot(allData, aes(X)) + geom_histogram(bins=15, color='yellow', alpha = 0.5, 
                                                      aes(y = after_stat(density)), position = 'identity')
hist2 <- ggplot(allData, aes(Y)) + geom_histogram(bins=15, color='green', alpha = 0.5, 
                                                       aes(y = after_stat(density)), position = 'identity')

diaText <- paste0("r = ", r)                  # Text på diagrammet.

dia <- ggplot(allData, aes(x = X, y = Y)) + geom_point() + theme(legend.position="none")
dia <- dia + annotate("text", x = -Inf, y = Inf, label=diaText, vjust = 1.5, hjust=-0.9, size = 4.5, colour = "blue")

teoMedZ <- mX + mY                                   # Beräknar teoretisk medelvärde.
teoVarZ <- round(sX^2 + sY^2 + 2*r*sX*sY, 3)         # Beräknar teoretisk varians.
teoMedZ <- mX + mY                                   # Beräknar teoretisk medelvärde.
simMedZ <- round(mean(X + Y), 2)                     # Beräknar simulerad varians.
simVarZ <- round(var(X + Y), 2)                      # Beräknar simulerad varians.

rad1 <- paste0("Korr.koefficient = ", r) 
rad2 <- paste0("Teo. medel Z = ", teoMedZ) 
rad3 <- paste0("Teo. varians Z = ", teoVarZ) 
rad4 <- paste0("Sim. medel Z = ", simMedZ) 
rad5 <- paste0("Sim. varians Z = ", simVarZ)
rad6 <- paste0("Antal = ", antal)

diatext <- ggplot() + geom_point(x=2, y=3) + theme(legend.position="none") + xlim(0, 1) + ylim(0, 1)
diatext <- diatext + theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank())
diatext <- diatext + theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(),
                     axis.text.y=element_blank(), axis.ticks.y=element_blank()) + xlab("") + ylab("")
diatext <- diatext + annotate("text", x = 0, y = 0.9,  label=rad1, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.72, label=rad2, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.6,  label=rad3, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.42, label=rad4, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.3,  label=rad5, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.1,  label=rad6, size=4, colour = "blue", hjust=0)

hist1 + hist2 + dia + diatext + plot_layout(ncol = 2)     # Placerar graferna.

Kommentar till simulering 2. Eftersom korrelationskoefficienten är 0.80 finns det en positiv kovarians mellan variablerna vilket framgår av diagrammet. Teoretisk varians är alltså högre än bara en summa av varianserna för X och Y. Teoretiskt och simulerat resultat överensstämmer väl.


3. Simulering av summan av X och Y med korrelationskoefficient -0.75

library(ggplot2)                             # Loads the graphical package
library(patchwork)                           # För placering av grafer

antal <- 1000                                # Antal datapunkter.

mX <- 50                                     # Medelvärde X.
mY <- 25                                     # Medelvärde Y.
sX <- 0.3                                    # Standardavvikelse X.
sY <- 0.2                                    # Standardavvikelse Y.
r  <- -0.75                                  # Korrelationskoefficienten.

X <- rnorm(antal, 0, 1)
Y <- rnorm(antal, 0, 1) 

X1 = r*X + sqrt(1-r*r)*Y
X = mX + sX*X
Y = mY + sY*X1

allData <- data.frame(X, Y)                  # Placerar data i en s.k. 'dataframe'.

hist1 <- ggplot(allData, aes(X)) + geom_histogram(bins=15, color='yellow', alpha = 0.5, 
                                                      aes(y = after_stat(density)), position = 'identity')
hist2 <- ggplot(allData, aes(Y)) + geom_histogram(bins=15, color='green', alpha = 0.5, 
                                                       aes(y = after_stat(density)), position = 'identity')

diaText <- paste0("r = ", r)                  # Text på diagrammet.

dia <- ggplot(allData, aes(x = X, y = Y)) + geom_point() + theme(legend.position="none")
dia <- dia + annotate("text", x = -Inf, y = Inf, label=diaText, vjust = 1.5, hjust=-0.9, size = 4.5, colour = "blue")

teoMedZ <- mX + mY                                   # Beräknar teoretisk medelvärde.
teoVarZ <- round(sX^2 + sY^2 + 2*r*sX*sY, 3)         # Beräknar teoretisk varians.
teoMedZ <- mX + mY                                   # Beräknar teoretisk medelvärde.
simMedZ <- round(mean(X + Y), 2)                     # Beräknar simulerad varians.
simVarZ <- round(var(X + Y), 2)                      # Beräknar simulerad varians.

rad1 <- paste0("Korr.koefficient = ", r) 
rad2 <- paste0("Teo. medel Z = ", teoMedZ) 
rad3 <- paste0("Teo. varians Z = ", teoVarZ) 
rad4 <- paste0("Sim. medel Z = ", simMedZ) 
rad5 <- paste0("Sim. varians Z = ", simVarZ)
rad6 <- paste0("Antal = ", antal)

diatext <- ggplot() + geom_point(x=2, y=3) + theme(legend.position="none") + xlim(0, 1) + ylim(0, 1)
diatext <- diatext + theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank())
diatext <- diatext + theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(),
                     axis.text.y=element_blank(), axis.ticks.y=element_blank()) + xlab("") + ylab("")
diatext <- diatext + annotate("text", x = 0, y = 0.9,  label=rad1, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.72, label=rad2, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.6,  label=rad3, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.42, label=rad4, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.3,  label=rad5, size=4, colour = "blue", hjust=0)
diatext <- diatext + annotate("text", x = 0, y = 0.1,  label=rad6, size=4, colour = "blue", hjust=0)

hist1 + hist2 + dia + diatext + plot_layout(ncol = 2)     # Placerar graferna.

Kommentar till simulering 3. Eftersom korrelationskoefficienten är -0.75 finns det en negativ kovariansterm. Teoretisk varians är alltså lägre än summan av varianserna för X och Y. Teoretiskt och simulerat resultat överensstämmer väl.



Avslutningsvis. Generellt är det naturligtvis önskvärt med en liten variation i resultaten men naturligtvis inte till varje pris. Antag att man vill sätta ihop två detaljer och där variationen är kritisk. Till exempel en kolv i en cylinder.
Om möjligt kan man sortera delarna från minsta till största och från största till minsta. Summan blir då mindre än om man tagit detaljerna slumpmässigt (se simulering 3). Ett annat alternativ, kanske automatiskt, är att sortera detaljerna i grupper, och sedan plocka från dessa då man sätter ihop dem.
(Inom simulering kan man använda s.k. antitetiska variabler för att minska variationen. Se litteraturen för fler detaljer.)

(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.)