Bakgrund

Ibland mäter man flera mått på en och samma enhet och inte sällan är antal mått många men antal enheter få. En första vanlig ansats är att rita histogram och beräkna medelvärde och spridning på varje mått. Om antal enheter är få blir det sålunda histogram över få värden. Dylika histogram blir därför ofta oinformativa och om många histogram skall redovisas i samma rapport blir det oöverskådligt speciellt som de enskilda histogrammen får olika skalor.

Bättre då att redovisa de olika måttens avvikelser från ritningskravet. Då kan alla avvikelser redovisas i ett genemsamt histogram plus ytterligare några diagram för att avslöja olikheter eller variationskällor i datamaterialet.



En simulering

Nedan simuleras n detaljer som innehåller fem mått (M1 – M5). Här skapas data som normalfördelade värden med samma sigma, utom mått fyra (M4) som har högre spridning.

Målvärdet för varje mått är i koden nedan angivet som ‘ritn1’, ‘ritn2’, osv.


library(ggplot2)                             # Bibliotek för ritning av diagram.
library(patchwork)                           # För placering av grafer

n <- 80                                      # Antal detaljer.

my1 <- 50; sigma1 <- 0.04                    # Mått nummer 1.
my2 <- 25; sigma2 <- 0.04
my3 <- 20; sigma3 <- 0.04
my4 <- 15; sigma4 <- 0.08
my5 <- 5;  sigma5 <- 0.04

M1 <- rnorm(n, my1, sigma1)                   # Mått nummer 1.
M2 <- rnorm(n, my2, sigma2)
M3 <- rnorm(n, my3, sigma3)
M4 <- rnorm(n, my4, sigma4)
M5 <- rnorm(n, my5, sigma5)

ritn1 <- 49.96                                 # ritningskrav mått 1, mm
ritn2 <- 24.95
ritn3 <- 20.00
ritn4 <- 15.05
ritn5 <-  5.05

mattNr <- rep(1:5, each = n)                    # Skapar en X-axel.

Data1 <- data.frame(M1, M2, M3, M4, M5)         # Alla mätningar i en tabell (5 kolumner).
cor(Data1)                                      # Beräknar korrelationskoefficienter.
##              M1         M2         M3           M4          M5
## M1  1.000000000 0.10218273 0.07548116 -0.006581486 -0.04694942
## M2  0.102182727 1.00000000 0.10676666  0.157418334  0.03997938
## M3  0.075481156 0.10676666 1.00000000  0.187945052  0.16808958
## M4 -0.006581486 0.15741833 0.18794505  1.000000000 -0.04268346
## M5 -0.046949424 0.03997938 0.16808958 -0.042683455  1.00000000

Kommentar till korrelationsmatrisen. Här anges korrelationskoefficienterna för alla fem måtten. Diagonalvärdena är naturligtvis exakt 1 ty där korreleras ett mått med sig självt. Övriga korrelationskoefficienter är här bara utslag av slumpmässiga variationer. Men det kan vara bra att titta efter höga värden (plus eller minus) som indikerar en icke-slumpmässig korrelation som kan vara värt att undersöka. (Se https://ovn.ing-stat.se/kovarians.html för mer om korrelation.)


Nedan skapas histogram och normalfördelningsdiagram för samtliga avvikelserna:

avvikelser <- c(M1-ritn1, M2-ritn2, M3-ritn3, M4-ritn4, M5-ritn5)   # Lägger avvikelserna i en kolumn.

Data2 <- data.frame(avvikelser, mattNr)                             # Avvikelser och måttnummer i en dataframe.

hist <- ggplot(Data2, aes(avvikelser)) + geom_histogram(bins=12, color='black', alpha = 0.5, fill="yellow", 
                                                        aes(y = after_stat(density)), position='identity')
hist <-  hist + xlab("Avvikelser (mm)") + ylab("") + annotate("text", x = 0, y = Inf, 
                                        label="Alla avvikelser (mm)", size=4.0, colour = "blue", vjust=2.0)

diagram1 <- ggplot(Data2, aes(sample = avvikelser)) + stat_qq() + stat_qq_line() + ylab("") + 
                                  xlab("Alla avvikelser (mm)")
diagram1 <- diagram1 + annotate("text", x = 0, y = Inf, label="Alla avvikelser (mm)", size=4.0, 
                                 colour = "blue", vjust=2.0)

hist + diagram1                         # Placerar diagram sida vid sida.

Kommentar till graferna. Histogrammet visar möjligtvis en smula skevhet men inget direkt avslöjande (en aning typiskt för histogram). Normalfördelningsdiagrammet till höger visar att fördelningens svansar borde ligga längre ut från mitten för att följa en normalfördelning. (Man kan också säga att mitten är för ‘tjock’.)



Nedan skapas ytterligare två diagram över avvikelserna:

medelavvikelser <- aggregate(Data2$avvikelser, list(Data2$mattNr), FUN=mean)        # Beräknar medelavikelser.

diagram2 <- ggplot(Data2, aes(y = avvikelser, x = mattNr, colour = Måttnr)) + geom_point() + 
                               ylab("Avvikelser (mm)") + xlab("Måttnummer")
diagram2 <- diagram2 + geom_hline(yintercept=0) + geom_point(data = medelavvikelser, aes(x=Group.1, y=x), 
                                                             shape = 18, size = 6, colour="red")
diagram2 <- diagram2 + annotate("text", x = 3, y = Inf, label="Avvikelser per måttnummer", size=4.0, 
                                colour = "blue", vjust=2.0)
diagram2 <- diagram2 + theme(legend.position = "none")

Måttnr <- factor(mattNr)
diagram3 <- ggplot(Data2, aes(sample = avvikelser, colour = Måttnr)) + stat_qq() + stat_qq_line() + ylab("") + 
                   xlab("Avvikelser (mm)")
diagram3 <- diagram3 + annotate("text", x = 0, y = Inf, label="Avvikelser per måttnummer", size=4.0, 
                                colour = "blue", vjust=2.0)

diagram2 + diagram3                          # Placerar diagram sida vid sida.

Kommentar till graferna. Dessa två grafer (“Avvikelser per måttnummer”) avslöjar ganska mycket om datamängden. Det vänstra visar att mått 1 och 2 ligger över vad som står på ritningen. (Eftersom sigma för dessa mått är 0.04 mm och avvikelsen från ritningskrav är cirka 0.05 mm kan man påstå att medelvärdet ligger cirka en standardavvikelse för högt, alltså något som borde undersökas.)
På samma sätt ligger mått 4 och 5 cirka en standardavvikelse under 0, dvs ritningskravet. Det framgår alltså att histogrammet ovan är en blandning av flera fördelningar.
Diagrammet till höger visar att de olika måtten (förutom mått 4) har ungeför samma spridning (linjerna är parallella.) Mått 4, som ju har sigma 0.08 mm i simuleringen, har en mycket högre lutning, dvs högre spridning (vilket också framgår i det vänstra diagrammet).



Avslutningsvis. Att studera avvikelserna i en process kan ibland ge en bättre insikt i skeendet. Analysen blir på så sätt något närmare processens röst, inte chefens röst. Vid ett tillfälle inom mönsterkorttillverkning undersöktes skillnaden mellan elektroniskt styra repektive mekaniskt styrda likriktare (de användes för att plätera cirka 30 mm/1000 koppar på många A3-stora ämnen placerade i hängare).
Strömstyrkan styrdes uppåt i flera stora steg och sänktes senare stegvis ned till 0. Genom att ofta mäta verklig strömstyrka redovisades sedan avvikelserna från korrekt profil. Med stor tydlighet framgick det att mekaniskt styrda likriktare gjorde ett mycket sämre jobb.

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