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