Statisztika egyszerűen

Mágikus jelek nélkül...

Amikor nincs kontroll csoport... - Egy érdekes trükk

2021. május 14. 08:00 - glantos70

eta.jpg

Ez cikk nem az én tollamból származik, de nagyon megtetszett, mert a probléma bizonyos esetekben még aktuális is lehet, a trükk pedig egyszerűnek tűnik, még ha nem is 100%-os a megoldás. A téma sem mindennapi, a vizsgálat tárgya az ETA nevű baszk terrorszervezet működésének hatása Baszkföld gazdaságára A cikket Sajó Zsolt Attilának köszönhetjük...

Tovább
7 komment
Címkék: Érdekességek

Kívülállók… - Adatsorok kieső értékeinek vizsgálata R-ben

2021. május 07. 08:00 - glantos70

Six Sigma in R

Ezzel a témával is foglalkoztam már (Kancsal tengerész nem tud célozni! – Kieső értékek vizsgálata), de ugye itt most az a távlati cél, hogy a Six Sigma módszertanban alkalmazott leggyakoribb eszközöket hogyan tudjuk használni R-ben. Ezt most be is fogom mutatni, de azért lesznek újdonságok is a korábbiakhoz képest.

Tovább
2 komment

Van benne rendszer… - Statisztikai eloszlások függvényei R-ben

2021. április 23. 08:00 - glantos70

Six Sigma in R

Ahogyan az egy statisztikai programcsomaghoz illik, az R is rendelkezik mindenféle függvényekkel, amelyek segítségével tulajdonképpen szinte bármilyen eloszlású adatsor esetében képesek vagyunk valószínűségeket oda-vissza kiszámolni. Ráadásul egy az ezekhez használható függvények egy egészen logikus rendszerbe vannak rendezve. Minden egyes eloszlás típushoz 4 különböző függvény tartozik. Mindegyik függvény neve azonos módon épül fel. Az első karakter megadja a függvény funkcióját, ezután pedig az eloszlás nevére utaló karakterek következnek, amelyek az ugyanahhoz az eloszlás típushoz tartozó függvények esetén azonosak.

A függvény típusára utaló első betűk jelentése a következő:

  • p… – adott x-értékhez tartozó kumulatív eloszlás függvény értéke (probability function)
  • d… – adott x-értékhez tartozó sűrűségfüggvény értéke (density function)
  • q… – a kumulatív eloszlásfüggvény adott quantilisének értéke, ezzel lehet például egy adott valószínűséghez tartozó x-értéket kiszámítani (quantile)
  • r… - megadott mennyiségű adott eloszlású véletlenszámok generálása (random)

Ezeknek a függvényeknek az alkalmazásához szerencsére semmilyen extra programcsomagot nem kell betölteni, mert ezek az alap R részei.

Például a normál eloszlás esetében ez a következőképpen néz ki:

#Az x = 2-höz tartozó kumulatív eloszlásfüggvény értéke
kumVal <- pnorm(2, mean = 0, sd = 1)
kumVal

A kumulatív eloszlásfüggvények (p…) esetében a függvény a megadott x-értékhez tartozó valószínűségi értéket adja meg.

A sűrűségfüggvény alkalmazásával számoló függvény pedig így néz ki.

#Az x = 2-höz tartozó sűrűségfüggvény értéke
suruseg <- dnorm(2, mean = 0, sd = 1)
suruseg

A ’dnorm()’ sűrűségfüggvény esetébenez az x-értéktől jobbra eső görbe alatti területet jelenti.

És itt egy fura jelenséget lehet tapasztalni. Azt hinné az ember, hogy a sűrűségfüggvény esetében lehet beállítani azt, hogy a megadott x-értéktől balra vagy jobbra eső terület nagyságát adja meg. Ez sajnos nem igaz, a ’dnorm()’ függvény esetében nem tudunk ilyen módon választani, mert ehhez a függvényhez nem jár ilyen paraméter. Ez persze a valóságban nem okoz akkora pánikot, mert az x-értéktől balra eső terület nagyságát egyébként is megkapjuk, ha a jobbra eső terület nagyságát kivonjuk 1-ből. Ettől függetlenül a személyes véleményem az, hogy a lehetőséget meg lehetett volna adni.

Ezzel ellentétben a ’pnorm()’ függvénynek van ilyen paramétere, ez a ’lower.tail’ paraméter. Ennek IGAZ vagy HAMIS értéket lehet adni (TRUE vagy FALSE). Ha az értéke FALSE, akkor a fenti középső diagramnak megfelelő értéket adja meg, azaz a megadott x-értéktől jobbra eső területet, míg ellenkező esetben a fenti jobboldali diagramnak megfelelően az x-től balra eső területet. De nem így, hanem …

… így. Vagyis amikor a sűrűségfüggvény görbe alatti területének méretére vagyok kíváncsi, akkor a ’pnorm()’ függvény egyszerűen kivonja a kumulatív eloszlásfüggvény értékét 1-ből, és ezt fogja megadni eredményként. A három diagramból jól látható, hogy az alapértelmezés az, ha a ’lower.tail’ paraméter TRUE. Matematikailag teljesen helyes ez a megoldás, semmi gond vele, csak az én világképembe nem passzol bele igazán… Összefoglalva a dolog így néz ki.

A harmadik függvénytípus a ’qnorm()’ függvény, amely tulajdonképpen visszafelé számol. Ha megadok neki egy százalékos értéket, és a normál eloszlás átlagát és szórását, akkor kiszámolja az adott százalékos valószínűséghez tartozó x értékét.

#Az az x-érték, amelybe az elemek 95%-a tartozik
inverzVal <- qnorm(p = 0.95, mean = 0, sd = 1)
inverzVal

Az alábbi diagram nagyon hasonlít a korábbi kumulatív eloszlás függvényre, de ez esetben az x-, és az y-tengely jelentése felcserélődött. Az x-tengelyen van a valószínűség, az y-tengelyen pedig a keresett érték. Az értelmezése valami olyasmi, hogy a 25%-os valószínűséghez a -0,67 érték tartozik. A függvény nagyon hasonló módon működik, mint például a jól ismert táblázatkezelőben az ’inverz.norm()’ függvény.

Végezetül lássuk, hogyan működik a normál eloszlású véletlen számok generálása.

# 100 darab normál eloszlású véletlen szám generálása, ahol az adatsor átlaga 0, szórása pedig 1
adatsor <- rnorm(100, mean = 0, sd = 1)

Az alábbi diagram egy quantile-quantile plot, amelyen a korábban generált 100 darab véletlen szám látható. Minél jobban illeszkednek a pontok a diagram átlójában található egyenesre, annál inkább normál eloszlású az adatsor.

Legvégül idetettem egy listát a különféle eloszlásokhoz tartozó függvényekről. Arra mindenképpen ügyelni kell, hogy a különféle függvényeket különböző paraméterekkel kell alkalmazni, például a Student-eloszlás esetében a ’df =’ paraméterrel kell megadni, hogy melyik t-eloszlást szeretnénk alkalmazni.

Eloszlás

Függvények

 

 

 

 

 

Beta

pbeta

qbeta

dbeta

rbeta

Binomial

pbinom

qbinom

dbinom

rbinom

Cauchy

pcauchy

qcauchy

dcauchy

rcauchy

Chi-Square

pchisq

qchisq

dchisq

rchisq

Exponential

pexp

qexp

dexp

rexp

F

pf

qf

df

rf

Gamma

pgamma

qgamma

dgamma

rgamma

Geometric

pgeom

qgeom

dgeom

rgeom

Hypergeometric

phyper

qhyper

dhyper

rhyper

Logistic

plogis

qlogis

dlogis

rlogis

Log Normal

plnorm

qlnorm

dlnorm

rlnorm

Negative Binomial

pnbinom

qnbinom

dnbinom

rnbinom

Normal

pnorm

qnorm

dnorm

rnorm

Poisson

ppois

qpois

dpois

rpois

Student t

pt

qt

dt

rt

Studentized Range

ptukey

qtukey

dtukey

rtukey

Uniform

punif

qunif

dunif

runif

Weibull

pweibull

qweibull

dweibull

rweibull

Wilcoxon Rank Sum Statistic

pwilcox

qwilcox

dwilcox

rwilcox

Wilcoxon Signed Rank Statistic

psignrank

qsignrank

dsignrank

rsignrank

 A cikkben található függvények programkódjait most nem ismertettem részletesen, mert a korábbi hetekben írt cikkekhez képest nem sok újdonságot alkalmaztam. A szkripteket viszont le tudod tölteni innen, így a kódokat szabadon megvizsgálhatod és felhasználhatod.

Források:

R documentation: The Normal Distribution
https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/Normal

Data Science Blog: Using probability distributions in R: dnorm, pnorm, qnorm, and rnorm
https://www.datascienceblog.net/post/basic-statistics/distributions/#:~:text=Distribution%20functions%20in%20R&text=The%20four%20normal%20distribution%20functions,function%20of%20the%20normal%20distribution

Probability Distributions in R (Stat 5101, Geyer), University of Minnesota
http://www.stat.umn.edu/geyer/old/5101/rlook.html

 

Szólj hozzá!

Amikor túl kevés a vizsgálandó minta…

2021. április 16. 08:00 - glantos70

Six Sigma in R

Ma ismét egy már korábban bemutatott témát próbálok újra feszegetni. Az elmúlt hetekben az egymintás Z-próba rejtelmeiben merültem el (Senki többet harmadszor? – Újra az egymintás Z-próbáról, most R-kóddal) és azt is megértettem, hogy mit is jelent az, amikor azt feltételezzük, hogy a teszt feltétele az adatok normál eloszlása (És mégis miért kellene normálisnak lennie?). Viszont azt is megtudtuk, hogy ez a próba csak akkor működik megbízhatóan, ha elegendően nagyszámú mintát veszünk ki a sokaságból.

De mihez kezdjünk azokkal az esetekkel, amikor valamilyen ok miatt nem áll elegendő minta a rendelkezésünkre? Ekkor kerül képbe az egymintás t-próba, amelyről már szintén esett szó (A sörfőző, aki forradalmasította a statisztikát). Az egymintás Z-próbával szemben ennek a tesztnek az az előnye, hogy kevesebb minta esetében is alkalmazható, illetve rafinált módon akkor is használható, amikor nem ismerjük a sokaság szórását, ilyen esetekben a minta szórásával helyettesítjük azt. Cserébe viszont a normál eloszlás ez esetben nem alkalmazható, hanem az úgynevezett Student-féle t-eloszlást vagyunk kénytelenek alkalmazni, amelyről azt tudjuk, hogy nem egyetlen függvény, hanem függvények sorozata. Attól függ, hogy melyik függvényt alkalmazzuk a megbízhatósági határérték kiszámítására, hogy mekkora a vizsgált mintánk elemszáma. A fenti diagramokon folytonos vonallal rajzoltam a t-eloszlás függvényeket, szaggatott vonallal pedig a hozzá tartozó normál eloszlás sűrűségfüggvény görbét. A diagramok felett látható ’szf’ a szabadsági fokok számát jelöli, amely egyszerűen eggyel kevesebb, mint a minta elemszáma (a szabadsági fokok számáról még tartozom egy cikkel, ezt igyekszem majd mielőbb pótolni).

A fenti diagramokon egészen jól látszik, hogy a kis minta elemszámok esetében jelentős eltérés van a t-eloszlás és a normál eloszlás görbe között. A szabadsági fokok számának (azaz a vizsgált minta elemszámának) növekedésével hogyan közelít a t-eloszlás görbéje a normál eloszlás görbéjéhez.

A fenti diagram teljes kódja így néz ki:

#A szükséges csomagok betöltése
library(ggplot2)
library(grid)
library(gridExtra)

#Diagramrajzoló függvény
tDistDiagram <- function(df)
{
  szText <- as.character(df)
  diagramTitle <- paste("szf = ", szText)
  ggplot() + xlim(-4, 4) +
    geom_function(fun = "dt", args = list(df = df), color = "darkgreen") +
    geom_function(fun = "dnorm", args = list(mean = 0, sd = 1),
                  color = "darkgrey",
                  linetype = "dashed") +
    labs(title = diagramTitle)
}

#A diagramok kirajzolása különféle szabadsági fokok függvényében
plot1 <- tDistDiagram(df = 1)
plot2 <- tDistDiagram(df = 2)
plot3 <- tDistDiagram(df = 3)
plot4 <- tDistDiagram(df = 4)
plot5 <- tDistDiagram(df = 5)
plot10 <- tDistDiagram(df = 10)
plot15 <- tDistDiagram(df = 15)
plot20 <- tDistDiagram(df = 20)

#A diagramok elhelyezése egymás mellett és alatt, + cím
grid.arrange(top = textGrob("t-eloszlás függvények különféle szabadsági fokokkal",
             gp=gpar(fontsize=20,font=1)), plot1, plot2, plot3, plot4,
             plot5, plot10, plot15, plot20, nrow = 2, ncol = 4)

A szükséges csomagok betöltésével nem töltenék sok időt. A ’ggplot2’ csomag a diagramok megrajzolásához szükséges függvényeket tartalmazza, a ’grid’ és a ’gridextra’ csomagok pedig a kód utolsó részében a diagramok táblázatos elhelyezéséhez, illetve a főcím kiíratásához szükségesek.

A kód második része egy függvény, aminek a diagramok megrajzolása a feladata. Mivel ez egy többször ismétlődő feladat, ezért érdemes egy paraméteres függvényt írni rá. A függvény egyetlen paramétere a szabadsági fokok száma (df). A függvény első két sora (a kapcsos zárójel után) csak amiatt kell, hogy a diagramok címét ki tudjam íratni. Az átadott df változót, amely egy szám, karakterekké kellett alakítani, illetve ez alapján meg kellett alkotni a diagram címét tartalmazó karaktert. Ezt egy szekvenciálisan megírt program esetében ezt minden szakaszban kézzel módosítani lehetne, de egy függvény esetében ezt a stringet mindig el kell készíteni a megadott paraméter alapján.

Ezután a ’ggplot()’ függvény segítségével kirajzoljuk a diagramterületet, illetve az ’xlim()’ függvény segítségével beállítjuk az x-tengely beosztását. Ezután a sor végi ’+’ jel segítségével hozzáadjuk a diagramterülethez a t-eloszlás és a normál eloszlás sűrűségfüggvény görbéket. A ’color’ és a ’linetype’ paraméterek segítségével megváltoztattam a függvények vonalának a színét és a vonalak típusát. Végül hozzáadtam a diagramhoz a korábban létrehozott címet.

A harmadik nagy szakaszban az előbb létrehozott függvény segítségével elkészítettem a 8 diagramot és mindegyiket elmentettem egy plot.. nevű változóban.

A negyedik rész tulajdonképpen egyetlen kódsorból áll, noha 3 sorba lett leírva. Ez a kódsor tulajdonképpen megszerkeszti a 8 diagramból álló táblázatot, illetve elhelyezi a főcímet a diagramok felett. A ’textGrob()’ függvény a diagram címét, mint grafikus elemet helyezi el a diagramok felett, a ’gpar()’ függvény pedig ennek a grafikus elemkét elhelyezett szövegnek állítja be a tulajdonságait, például a használt karakter típusát és méretét. Ezek után következnek a plot1, plot2, … diagramok, majd az ’nrow’ és az ’ncol’ paraméterekkel beállítottam, hogy a diagramok hány sorban és hány oszlopban helyezkedjenek el.

Visszatérve az egymintás t-próba témakörére, a következő kérdés az, hogy mi a különbség az egymintás Z-próba és az egymintás t-próba eredménye között. A korábbi cikkek alapján már sejthető, hogy az egymintás t-próba eredménye egy szimmetrikus, de szélesebb intervallum lesz, ahol az elemek 95%-a elhelyezkedik.

A fenti két diagram összehasonlítja a kétféle eloszlást hasonló paraméterekkel. A t-eloszlás középen egy kicsivel alacsonyabb, a két szélén viszont valamivel vastagabb. Így viszont a t-eloszlás esetében a 95%-os megbízhatósági tartomány szélesebb lesz. Ez esetben a normál eloszláshoz tartozó kritikus Z-érték 1,959, míg a t-eloszlás esetében a kritikus t-érték 3,18. Ezt a különbséget az alacsonyabb minta elemszám okozza, erre már utaltam korábbi bejegyzésekben (A nagy dobókocka kísérlet). Ezt a diagramot a következő kód segítségével készítettem el:

#A szükséges csomagok betöltése
library(ggplot2)
library(grid)
library(gridExtra)

#97,5%-os megbízhatósági határok kiszámítása
ciT95.1 <- qt(p = 0.975, df = 3)
ciN95 <- qnorm(p = 0.975, mean = 0, sd = 1)

#A jobboldali normál eloszlás diagram elkészítése
plot1 <- ggplot() + xlim(-5, 5) + ylim(0, 0.4) +
  stat_function(fun = "dnorm",
                geom = "line",
                args = list(mean = 0, sd = 1),
                color = "darkgreen") +
  stat_function(fun = "dnorm",
                geom = "area",
                args = list(mean = 0, sd = 1),
                fill = "darkgrey",
                xlim = c(-5, -ciN95)) +
  stat_function(fun = "dnorm",
                geom = "area",
                args = list(mean = 0, sd = 1),
                fill = "darkgrey",
                xlim = c(ciN95, 5)) +
  labs(title = "Normál eloszlás")

#A baloldali t-eloszlás diagram elkészítése
plot2 <- ggplot() + xlim(-5, 5) + ylim(0, 0.4) +
  stat_function(fun = "dt",
                geom = "line",
                args = list(df = 3),
                color = "darkgreen") +
  stat_function(fun = "dt",
                geom = "area",
                args = list(df = 3),
                fill = "darkgrey",
                xlim = c(-5, -ciT95.1)) +
  stat_function(fun = "dt",
                geom = "area",
                args = list(df = 3),
                fill = "darkgrey",
                xlim = c(ciT95.1, 5)) +
  labs(title = "t-eloszlás")

#A diagramok elhelyezése egymás mellett és a főcím kirajzolása
grid.arrange(top = textGrob("95% megbízhatósági tartomány",
             gp=gpar(fontsize=16,font=1)),
             plot1, plot2, ncol = 2)

A kód felépítése igen hasonló az előzőhöz, úgyhogy inkább a különbségeket szeretném kiemelni. Az első rész szinte ugyanaz, úgyhogy erre most nem vesztegetnék több szót. A második részben kiszámoltam a kétféle eloszláshoz tartozó 95%-os megbízhatósági határt. Az ehhez használt függvények a ’qt()’ és a ’qnorm()’ függvények használatával az adott eloszlás inverz értékét kapjuk meg. Ez annyit jelent, hogy ha megvan a sűrűségfüggvény görbe alatti területének az értéke, akkor a függvények alkalmazásával megkapjuk az ezekhez tartozó x-értékeket. Paraméterként azért 0,975-öt adtam meg, mert kétoldali tesztről van szó, ezért úgy kapjuk meg az elemek 95%-át tartalmazó tartományt, ha az eloszlások mindkét végéről elveszek 2,5 – 2,5%-ot. A t-eloszlás esetében 3-at adtam meg a szabadsági fokok számának, azaz úgy számoltam, mintha négyelemű mintákat vettem volna a sokaságból.

A görbék kirajzoltatásához nem a ’geom_function()’, hanem a ’stat_function()’ függvényt használtam. A ’stat_function()’ függvény most azért előnyösebb, mert ennek az alkalmazásával nemcsak vonal-, vagy pontdiagramként, hanem területként is lehet ábrázolni egy függvényt, illetve megadható azon x-értékeknek a tartománya, amelyben a függvényt ábrázolni akarjuk. A paraméterek közül ki szeretném emelni a ’geom = line„’ illetve a ’geom = „area”’ paramétereket, mert ezekkel meg tudom adni, hogy a függvénygörbe milyen módon legyen ábrázolva. A másik ilyen fontos paraméter az ’xlim = c(-5, ciN95.1)’, amely megadja azt a tartományt, ahol a függvénygörbét ábrázolni kívánom. Ha megfigyeled a programkódot, akkor látható, hogy a diagramot tulajdonképpen egy vonaldiagramból és két területdiagramból legóztam össze, majd hozzáadtam a diagram címét.

Az utolsó nagy részben a diagramok elhelyezése ugyanazon logikára épül, mint az előző esetben.

Vizsgáljuk meg, hogy különböző mintaelemszámok esetében mekkora az eltérés a t-eloszlás és a normál eloszlás megbízhatósági határai között.

A baloldali diagramon a szaggatott vízszintes vonal a standard normál eloszlás 97,5%-os megbízhatósági határa látható, amely a mintaszámtól függetlenül 1,96. A görbe viszont a t-eloszlás 97,5%-os határait jeleníti meg különböző mintaelemszámok esetén. Látható, hogy 30 körül már egészen kicsi az eltérés, de a t-eloszlás határértéke még 80-nál sem éri el teljesen a normál eloszlás 1,96-ját. A százalékos eltérés a kétféle határérték között 27-nál csökken 5% alá, 31-es mintaelemszám esetén 4,19%, egy 76 elemű minta esetében pedig 1,64%. Ezt a két diagramot a következő módon készítettem el.

#A szükséges csomagok betöltése
library(ggplot2)
library(grid)
library(gridExtra)

#Az eredmények tárolásához szükséges vektorok létrehozása
ciN95 <- c()
ciT95 <- c()
diff <- c()
szazalek <- c()
x <- c()

#A 97,5%-os megbízhatósági intervallumok
#kiszámítása mindkét eloszlás típusra
for (i in 1:75)
{
  x[i] <- i
  ciN95[i] <- qnorm(p = 0.975, mean = 0, sd = 1)
  ciT95[i] <- qt(p = 0.975, df = i)
  diff[i] <- ciT95[i] - ciN95[i]
  szazalek[i] <- diff[i] / ciN95[i] * 100
  i <- i + 1
}

#A két eloszlás 97,5%-os megbízhatósági határainak különbsége
plot1 <- ggplot() + xlim(1, 75) +
            geom_line(aes(x = x, y = ciN95), linetype = "dashed") +
            geom_line(aes(x = x, y = ciT95)) +
            labs(title = "A megbízhatósági határok különbsége")

#A kétféle eloszlás megbízhatósági határainak különbsége százalékosan
plot2 <- ggplot() + xlim(1, 75) +
            geom_line(aes(x = x, y = szazalek)) +
            labs(title = "Százalékos eltérés")

#A két diagram elhelyezése egymás mellett
grid.arrange(top = textGrob("A t-eloszlás és a standard normál eloszlás 97,5%-os megbízhatósági határainak összehasonlítása",
                gp=gpar(fontsize=16,font=1)),
                plot1, plot2, ncol = 2)

#Százalékos eltérérek meghatározása a cikkhez
szazalek[26]
szazalek[30]
szazalek[75]

A szükséges csomagok betöltése után létrehoztam azokat a vektorokat (vagy tömböket), amelyekben a számítások adatait fogom tárolni. A tömbök helyett létrehozhattam volna egy adattáblát is a megfelelő mezőkkel, szóval nem ez a feladat egyetlen helyes megoldása. Ezután elvégeztem a diagramok megrajzolásához szükséges adatok kiszámítását.

  • Az ’x’ nevű tömbben tárolom le a szabadsági fokok számát 1-től 75-ig. A legegyszerűbb az volt, hogy az ’x’ i-dik elemét egyenlővé tettem i-vel.
  • A ’ciN95’ vektorba 75-ször elmentettem a standard normál eloszlás sűrűségfüggvényéhez tartozó x-értéket, amely az elemek 97,5%-át tartalmazza. Ez tulajdonképpen ugyanaz, mintha a vektorba 75-ször elmentettem volna az 1,96-ot.
  • A ’ciT95’ vektor viszont a t-eloszlás megfelelő szabadsági fokához tartozó sűrűségfüggvény azon értékét tartalmazza, amelybe az elemek 97,5%-át tartalmazza.
  • A ’diff’ tömbben van benne a ’ciT95’ és a ’ciN95’ tömbök összetartozó elemeinek különbsége lett letárolva, vagyis a ’ciT95’ tömb minden eleméből kivontam 1,96-ot.
  • A ’szazalek’ tömbben pedig a ’diff’ és a ’ciN95’ tömbök hányadosának százalékos értékei vannak, amely természetesen megadja, hogy a t-eloszlás 97,5%-os határértéke hány százalékkal nagyobb, mint a normál eloszlásé.

Ezután a diagramok kirajzolása már a korábbiakhoz hasonló módon történik. A kód legvégén egyszerűen kiíratom a százalék tömb fent idézett értékeit.

Lassan ugyan, de eljutottunk a cikk legegyszerűbb részéig, az egymintás t-próba végrehajtásáig. Ez nagyon hasonlít az egymintás Z-próba (Senki többet harmadszor? – Újra az egymintás Z-próbáról, most R-kóddal) végrehajtásához. Vagyis ismét a BSDA csomagot fogjuk alkalmazni, csak ez esetben egy másik függvényt.

#A szükséges csomagok betöltése
library(BSDA)
library(psych)

#15 elemű minta létrehozása
minta <- rnorm(15, mean = 10, sd = 3)
describe(minta) #A minta tulajdonságai

#A 15 mintaelemszámhoz tartozó 97,5%-os határérték kiszámítása
myDf <- qt(0.975, df = 14)

#Egymintás t-próba - nullhipotézis elfogadva
t.test(x = minta, mu = 11)

#Egymintás t-próba - nullhipotézis elutasítva
t.test(x = minta, mu = 13)

Ez a kód jelentősen egyszerűbb, mint a korábbiak, ez esetben egyszerűen létrehoztam egy normál eloszlású véletlenszámokból álló tömböt, majd a ’describe()’ függvény segítségével kiíratom a minta jellemző tulajdonságait („Six Sigma in R” sorozat – Leíró statisztika R-ben). Ezután alkalmaztam a ’t.test()’ függvényt a t-próba végrehajtásához. És most lássuk az eredményeket.

A ’describe()’ függvény által felsorolt statisztikák között most kiemelten fontos a mintaszám (n), az átlag (mean) és a szórás (sd) értéke, a t-próba függvény ezeket fogja felhasználni a ’t’ próbastatisztika kiszámításához (Z helyett t – leheletnyi különbség). A következő két szakaszban pedig egy-egy t-próba eredményt látunk. Az első esetben mű (μ) értéke 11, ez egy olyan potenciális sokaság átlaga, amelyből a létrehozott mintát kivehettük. Ez esetben a ’t’ próbastatisztika értéke -1,8312 (a 9,32 – 11 különbség miatt lett negatív). A 15 elemű mintához 14-es szabadsági fok tartozik. Az ehhez tartozó t-próba határérték 2,144, vagyis a kapott próba statisztika abszolút értéke értéke kisebb, mint a t-próba határérték, vagyis a nullhipotézis elvetéséhez nincs elegendő bizonyítékunk.

A második esetben azt feltételeztük, hogy a mintát egy olyan sokaságból vettük ki, amelynek az átlaga 13. Ez esetben azt kaptuk, hogy a t próba statisztika értéke -4,0112. Ennek az abszolút értéke jóval nagyobb, mint a t-próba határértéke (2,144), így a nullhipotézist elvethetjük és elfogadjuk az ellenhipotézist, mely szerint a mintát nem vehettük ki egy olyan sokaságból, amelynek az átlaga 13.

De a történet ezzel még mindig nem ér véget. Egy korábbi cikkben (És mégis miért kellene normálisnak lennie?) már fejtegettem egy soron, hogy vajon milyen feltételek mellett alkalmazható az egymintás Z-próba. A nagyszámú minta miatt ott igazából ez nem volt túl izgalmas kérdés. Az egymintás t-próba esetében viszont sajnos nem dőlhetünk hátra hasonló módon. A minták alacsony számának köszönhetően ez esetben a mintaátlagok nem feltétlenül lesznek normál eloszlásúak. Egy erősen aszimmetrikus eloszlású sokaság esetében a mintaátlagok eloszlása is hasonlóan aszimmetrikus lesz, emiatt a t-eloszlás alkalmazásával kapott eredmények nem lesznek pontosak, hiszen fentebb már tisztáztuk, hogy a student-eloszlás szimmetrikus jellegű. Has mutassam meg ezt egy példán keresztül is.

#A szükséges csomagok betöltése
library(ggplot2)
library(ggpubr)
library(grid)
library(gridExtra)

#Aszimmetrikus sokaság létrehozása
sokasag <- rexp(10000, rate = 1)

#2-elemű minták átlagainak kiszámítása
mintaAtlagok2 <- c()

for (i in 1:1000)
{
  minta <- sample(sokasag, 2, replace = FALSE)
  atlag <- mean(minta)
  mintaAtlagok2[i] <- atlag
  i <- i + 1
}

#2-elemű minták átlagainak ábrázolása
gghistogram(mintaAtlagok2, bins = 32)

Ezt a kódot most már nem magyaráznám el részletesen, itt semmi olyat nem csináltam, amelyet nem írtam volna le részletesen korábban. A lényeg az eredmény. Ha kiveszünk rengeteg kételemű mintát egy erősen aszimmetrikus sokaságból és ábrázoljuk ezek eloszlását, akkor jól látható, hogy a mintaátlagok eloszlása is aszimmetrikus lesz.

Ahogy emeljük a minták elemszámát, úgy csökken az aszimmetria, de nem múlik el teljesen.

Emiatt sajnos ez esetben tényleg feltételeznünk kell, hogy a sokaság normál eloszlású, vagy legalábbis szimmetrikus eloszlású, különben tényleg hibás döntést fogunk hozni. De ez még mindig csak egy feltételezés és nem tény, mert a sokaság eloszlását nem tudjuk ellenőrizni. A minta eloszlását tudjuk ellenőrizni, bár a nagyon kicsi mintaszámok esetében ennek nem sok értelme van. Végig gondolva az egészet, leginkább azt tudom javasolni, hogy ha a sokaság jellegéből adódóan sejtjük, hogy az nem normál eloszlást követ, akkor sajnos ez a teszt nem alkalmazható, más megoldást kell keresnünk a kérdés megválaszolására. Ilyen lehet például valamilyen nem-paraméteres teszt alkalmazása, mint például a Wilcoxon-féle rangteszt (Pszichológus hallgatóknak közkívánatra – Wilcoxon-féle előjeles rang teszt a medián vizsgálatára (Wilcoxon signed rank test for a median)), de ennél például legalább azt kell feltételeznünk, hogy a sokaság szimmetrikus. Legvégső esetben szóba jöhet a megbízhatósági intervallum meghatározása ún. "bootstrap" módszer alkalmazásával, amely tulajdonképpen nagyszámú visszatevéses minta átlagai alapján adja meg azokat a határértékeket, ahol a mintaátlagok 95 vagy 99 százaléka található. Viszont a minta eloszlásának vizsgálata ebben az esetben is nagyjából szükségtelen.

Összegzés:

A cikkben megpróbáltam az egymintás t-próbát a lehető legrészletesebben bemutatni és ebben az R programozási nyelv nagy segítségemre volt, mert egy csomó olyan diagramot is el tudtam készíteni, amelyeket eddig eszembe sem jutott volna. Remélem, hogy sikerült egy minden szempontból érthető és követhető leírást adnom erről a tesztről.

A cikkben ismertetett R-kódokat le tudod innen tölteni.

4 komment

És mégis miért kellene normálisnak lennie?

2021. április 09. 08:00 - glantos70

Six Sigma in R

Most, hogy így az elmúlt hetekben elmélyedtem az egymintás Z-próbában, ismét felmerült bennem a kérdés, hogy miért kell a six sigma projektekben mindig ellenőrizni, hogy a minta eloszlása normál eloszlást követ. Például a Vargha András ezt írja a ’Matematikai statisztika pszichológiai, nyelvészeti és biológiai alkalmazásokkal’ című könyvének 157. oldalán.

… Az u-próba (Z-próba. a szerk.) olyan szakmai problémák esetén alkalmazható, amikor van egy olyan kvantitatív X változónk,

  • amelyről tudjuk, hogy normál eloszlású,
  • amelynek ismerjük az elméleti szórását (σ),
  • és amelyről van egy feltételezésünk, hogy mi lehet az elméleti átlaga …

Most tényleg nem kötözködni szeretnék, hanem meg szeretném érteni, hogy ha a Centrális Határeloszlás tétele (A nagy dobókocka kísérlet) igaz, és empirikusan is igazolható, hogy teljesen mindegy, milyen a sokaság szórása, amelyből kivettem a mintát, akkor miért kellene a sokaságnak normál eloszlásúnak lennie. Arról nem is beszélve, hogy egy ilyen feltétel nem tartható be, merthogy a sokaságot nem ismerem, így be sem tudom bizonyítani, hogy normál eloszlású. Ráadásul a sokaságból kivett nagyszámú minta eloszlását sem ismerem, hiszen a sokaságból kizárólag egyetlen mintát vettem ki, tehát azt sem tudom, hogy a mintaátlagok eloszlása milyen. Az egyetlen dolog, ami rendelkezésemre áll, az a minta. Ennek ismerem az elemeit, de tulajdonképpen a minta elemeinek eloszlása az egyetlen, ami az egymintás Z-próba esetén egyáltalán nem érdekel.

Jó, de akkor mit jelent a fenti feltételezés? Szerintem ebben a formájában semmit. A különféle statisztika könyvek és weboldalak által előszeretettel citált feltétel valójában azt feltételezi, hogy a Centrális Határeloszlás tétele alapján feltételezzük, hogy a bármilyen eloszlású sokaságból kivett nagyszámú minta átlagainak eloszlása normál eloszlású. Ezt valójában nem tudjuk, hiszen – ahogy azt már fentebb is leírtam – nem veszünk ki ötezer darab mintát a sokaságból csak azért, hogy bebizonyítsuk, hogy a mintaátlagok eloszlása normál eloszlású. Ez az, amit valójában feltételezünk, mert ha a mintaátlagok átlagai nem követnék a normál eloszlást, akkor az teszt veszítené el az értelmét.

De mi is a kockázat ebben az esetben? A Centrális Határeloszlás tétele nagy elemszámú minták esetében egészen jól működik, ez akár matematikailag bizonyítva, akár számítógépes szimulációkkal tesztelgetve bizonyítható. A kérdés például akkor vetődhet fel, ha a sokaság feltételezett eloszlása erősen aszimmetrikus, és a kivett minta elemszáma nem elég nagy.  Az szimmetria hiánya azért lehet probléma, mert ha nem elég nagy a minta elemszáma, akkor jelentősen megnő az esélye annak, hogy a mintaátlagok eloszlása is enyhén aszimmetrikussá válik. Nézzük meg ezt egy példán keresztül.

De mielőtt hozzákezdünk, töltsük be a szükséges csomagokat.

library(ggpubr)
library(nortest)
library(BSDA)
library(gridExtra)

Vegyünk egy tényleg erősen aszimmetrikus sokaságot, mondjuk egy olyat, ahol a sokaság értékei exponenciális eloszlás szerint változnak.

#10000 elemű sokaság létrehozása
expSokasag <- rexp(10000, rate = 1)

#hisztogram készítése a 10000 elemű sokaságról
plot1 <- gghistogram(expSokasag, title = "Exponenciális sokaság")

#hisztogram kirajzolása
plot1

A sokaságunk neve legyen ’expSokasag’. A fenti parancssor első sora az ’rexp()’ függvény segítségével készít egy 10 000 darab véletlen számból álló adatsort (vektort), ahol az exponenciális függvény lambda paramétere 1. A második sor készít egy hisztogramot a kapott 10 000 szám eloszlásáról és elmenti azt a ’plot1’ változóba. A ’title = „Sokaság”’ paraméter adja meg, hogy a diagram címe legyen Sokaság. A harmadik sorban a ’plot1’ változó begépelésével kirajzolódik a hisztogram.

A hisztogramról jól érzékelhető, hogy az alacsonyabb értékek jelentősen gyakrabban fordulnak elő, mint a magasabbak. Most vegyünk ezekből 1000 darab mintát és mentsük el a minták átlagát (a kódsor értelmezését megtalálod a „Senki többet harmadszor? – Újra az egymintás Z-próbáról, most R-kóddal” című cikkben).

#Az exponenciális sokaságból kivett minták átlagát tartalmazó vektor létrehozása
expMintaAtlagok <- c()

#ciklus a minták létrehozására és az átlagok elmentésére
for (i in 1:1000)
{
  #30-elemű véletlenszerű minta a sokaságból
  minta <- sample(expSokasag, 30, replace = FALSE)

  #a kivett minta átlagának elmentése az 'atlag' változóba
  atlag <- mean(minta)

  #az 'atlag' változó értékének hozzáadása a 'MintaAtlagok' vektorhoz
  expMintaAtlagok <- c(expMintaAtlagok, atlag)

  #a számláló léptetése eggyel  
  i <- i + 1
}

#A mintaátlagok hisztogramjának kirajzolása
plot2 <- gghistogram(expMintaAtlagok, title = "Mintaátlagok")

#hisztogram kirajzolása
plot2

A hisztogram láttán az az érzésünk támadhat, hogy az értékek enyhén aszimmetrikusan helyezkednek el, de azért ez nem teljesen nyilvánvaló, inkább csak egy sejtés. Győződjünk meg erről a már jól megtanult normalitási tesztek segítségével.

#Lilliefors (Kolmogorov-Smirnov) teszt
lillie.test(expMintaAtlagok)

#Shapiro-Wilks teszt
shapiro.test(expMintaAtlagok)

#Anderson-Darling teszt
ad.test(expMintaAtlagok)

Már a Lilliefors (Kolmogorov – Smirnov) teszt során kapott ’p-value’ (= 0,04767) is azt mutatja. hogy a nullhipotézist, mely szerint az adatok normál eloszlásúak, 95%-os biztonsággal elvethetjük (noha 99%-os biztonsággal valószínűleg nem). A megbízhatóbb tesztek (Shapiro - Wilks teszt p-value = 9,363*10^-18. és Anderson – Darling teszt p-value = 1,662*10^-5) p-értékei viszont egyértelműen azt mutatják, hogy a mintaátlagok eloszlása NEM normál eloszlású. Ebben az esetben viszont az egymintás Z-próba során alkalmazott törvényszerűségek itt hibához vezetnek. Azon persze ismét csak lehet vitatkozni, hogy ez a hiba mekkora és hogy vajon ez elhanyagolható-e vagy sem. Mindenesetre ajánlatos a minták elemszámának meghatározásakor ezeket a kockázatokat figyelembe venni, hiszen a mintás elemszámának növelésével ez a probléma elkerülhető és akkor egy bizonyos minta elemszám felett már joggal feltételezhetjük majd, hogy a mintaátlagok eloszlása normális.

Mondjuk ez esetben 500-elemű mintákat használtam, de ez csak a vizuális hatás kedvéért történt így…

Szólj hozzá!

Ráadás diagram egymintás Z-próbához

2021. április 02. 08:00 - glantos70

Six Sigma in R

Úgy tűnik, nem tudok elszakadni a témától. Már az előző cikk (Senki többet harmadszor? – Újra az egymintás Z-próbáról, most R-kóddal) írása közben motoszkált a fejemben, hogy a próba egyszerűsége ellenére jó lenne valahogy vizuálisan is megjeleníteni az eredményt. Neki is ugrottam, hogy készítek egyet, de aztán a kód csak hízott és hízott, úgyhogy arra jutottam, hogy írok erről egy külön cikket. Mivel az R-kód hossza nincs arányban a fontosságával, ezért a diagram kirajzolását függvényként írtam meg, így a diagram kirajzolása 2-3 sor begépelésével megoldható. Másrészt a szkript részletes elemzéséből ismét sokat lehet tanulni.

A cél az, hogy láthatóvá tegyük az egymintás Z-próba eredményét. A fenti diagramon látható normál eloszlás görbe a sokaságból elméletileg kivehető nagyszámú minta átlagainak az eloszlását reprezentálja. A két függőleges szaggatott vonal határolja azt a tartományt, amelybe a mintaátlagok 95%-a esne. A tesztünk nullhipotézise az, hogy az általunk vizsgált mintát a megadott átlag és szórású sokaságól vettük ki. A vastag piros vonal az általunk kivett minta átlagát jelzi. Ha a vastag piros vonal beleesik a 95%-os tartományba, akkor a nullhipotézist el kell, hogy fogadjuk, azaz nem igazolható, hogy az általunk vizsgált mintát NEM a megadott átlagú és szórású sokaságból vettük ki. Ha a vastag piros vonal a 95%-os tartományon kívül esik, akkor viszont elvethetjük a nullhipotézist, azaz bizonyítékot találtunk arra, hogy a vizsgált mintát nem vehettük ki a sokaságból.

A teljes szkript egyben letölthető szövegfile-ként az alábbi linkről. A tömörített fájlban található egymintasztesztdiagram.R file-t R-ben vagy RStudio-ban megnyitva a szkript futtatható.

https://m.blog.hu/st/statisztikaegyszeruen/egymintasztesztdiagram.zip

A file tartalmazza a ’z.testgraph()’ függvényt, illetve azokat a kódsorokat is, amelyek segítségével teszteltem a függvény működését. Akkor nézzük részletesen, mit is csinál a program…

Először is töltsünk be három csomagot.

library(ggplot2) #A diagram kirajzolásához
library(ggpubr) #Csak a sokaság hisztogramjának kirajzolásához használtam
library(gridExtra) #A két diagram egymás mellé rajzolásához szükséges

A sorok végén a # jel után rövid megjegyzéseket helyeztem el a jobb átláthatóság kedvéért. Amint azt ott is írtam, a függvény használatához csak a ’ggplot2’ csomag szükséges, a másik kettőt csak a kipróbáláshoz használtam.

A következő blokkban az előző cikkhez hasonlóan létrehoztam egy nagyon hasonló sokaságot, mint az előző cikkben, így a részletes ismertetéstől eltekintek.

#Sokaság létrehozása
sok1 <- rnorm(200, mean = 10, sd = 2)
sok2 <- rnorm(200, mean = 25, sd = 5)
sok3 <- rnorm(200, mean = 30, sd = 1.5)
sok4 <- rnorm(200, mean = 40, sd = 3)
sok5 <- rnorm(200, mean = 50, sd = 2)

sokasag <- c(sok1, sok2, sok3, sok4, sok5)

#Sokaság hisztogramja
gghistogram(sokasag, bins = 32)

Ezután kiszámoltam a létrehozott sokaság átlagát és szórását és elmentettem egy-egy változóba.

Mellékes megjegyzés: R-ben van egy olyan konvenció, hogy a változónevek első betűje kisbetű, de az összetett neveknél a második, harmadik stb. részeket nagybetűvel jelöljük. Ez nemcsak poénból van így, az RStudio-nak van egy olyan tulajdonsága, hogy amikor elkezdesz begépelni egy nevet, akkor a szerkesztő feldobja azokat a változókat vagy függvényeket, amelyek a begépelt karakterekkel kezdődnek. Így akár egy hosszabb változónevet is simán be tudsz gépelni pár billentyűleütéssel.

Ezekre majd akkor lesz szükség, amikor a diagram rajzoló függvényt hívjuk majd meg, hiszen a mintaátlagok eloszlásának becsléséhez szükség lesz a sokaság átlagára és szórására.

#Sokaság átlagának és szórásának kiszámítása
sokasagAtlag <- mean(sokasag)
sokasagSzoras <- sd(sokasag)

Ha a ’mean()’ és az ’sd()’ függvények használata esetleg nem egyértelmű, akkor ezt részletesebben megtalálod a „Six Sigma in R” sorozat – Leíró statisztika R-ben című cikkben.

Ezután létrehoztam kétféle mintát, hogy megmutassam a különféle mintaátlagok hatását az eredményre. A ’minta1’ változó egy olyan 100-elemű mintát tartalmaz, amelyet ugyan nem a korábban létrehozott sokaságból vettem ki, de elméletileg kivehettem volna belőle. A ’minta2’ változóban egy olyan minta van, amelyet biztosan nem vehettem ki a létrehozott sokaságból.

#Kétféle minta létrehozása
minta1 <- rnorm(100, mean = 29, sd = 3)  #mintaátlag a megbízhatósági tartományban
minta2 <- rnorm(100, mean = 35, sd = 3)  #mintaátlag a megbízhatósági tartományon kívül

#mintaátlagok kiszámítása
minta1Atlag <- mean(minta1)
minta2Atlag <- mean(minta2)

Remek megfigyelés, hogy a mintáknak csak az átlagát számoltam ki, a szórását nem, hiszen a minták szórására nem lesz szükségünk, hiszen ismerjük a sokaság szórását. Ezzel megvan mindenünk, a

És most következzen a függvény leírása.

#grafikon rajzoló függvény
z.testgraph <- function(mintaAtlag, sokasagAtlag, sokasagSzoras, n)
{ ... }

A függvény megadása olyan, mintha egy változónak adnánk értéket. Ez olyannyira igaz, hogy a függvényt nem is tudjuk addig használni, amíg a kurzorral a sorra ráállva a CTRL-Enter billentyű kombináció lenyomásával le nem futtatjuk az értékadást és a függvény neve meg nem jelenik a változók között. Mondjuk ez a fajta függvénydefiníció logikusnak tűnik és nem kényelmetlen, csak egy kicsit meg kellett szokni. Természetesen a zárójelben megadott paramétereket kell majd átadni a függvénynek, amikor majd meghívjuk. A változóknak igyekeztem hosszabb „beszélő” nevet adni, hogy a kód könnyebben követhető legyen. Amint az látható, négy paramétert kell megadnunk. Az általunk kivett minta átlagát (mintaAtlag), a sokaság átlagát és szórását (sokasagAtlag, sokasagSzoras) és a minta elemszámát (n). A függvény törzsét kapcsos zárójelek közé kell tenni, ezért látható egy ’{’ a következő sorban.

 #A mintaátlagok eloszlás paramétereinek kiszámítása
  mintaEloszlasAtlag <- sokasagAtlag
  mintaEloszlasSzoras <- sokasagSzoras/sqrt(n)

A ’mintaEloszlasAtlag’ változó jelenti sokaságból elméletben kivett nagyszámú minta átlagát. Ezt a változót nem lett volna fontos létrehozni, de inkább létrehoztam, hogy jobban lehessen követni a kódot. A ’mintaEloszlasSzoras’ változó viszont a nagyszámú mintaátlag szórásának becsült értékét tartalmazza, amelyet ugye úgy kaptunk, hogy a sokaság szórását elosztottuk a minta elemszámának négyzetgyökével.

#A mintaátlagok 95%-os megbízhatósági határainak kiszámítása
  mintaEloszlas95Lower <- mintaEloszlasAtlag - 2 * mintaEloszlasSzoras
  mintaEloszlas95Upper <- mintaEloszlasAtlag + 2 * mintaEloszlasSzoras

A mintaeloszlás tulajdonságainak segítségével kiszámoltam azt a tartományt, amelybe várhatóan beleesne a sokaságból kivett minták 95%-a. A ’ mintaEloszlas95Lower’ értelemszerűen az alsó, a ’mintaEloszlas95Upper’ a felső határt jelenti (igen, itt írhattam volna alsót és felsőt is, de csak most vettem észre, hogy véletlenül angol maradt az elnevezés. Bocs).

#A diagram kirajzolásához szükséges legkisebb és legnagyobb x-értékek kiszámítása
  diagramLowerLimit <- mintaEloszlasAtlag - 4 * mintaEloszlasSzoras
  diagramUpperLimit <- mintaEloszlasAtlag + 4 * mintaEloszlasSzoras

Ez a két sor technikai jellegű, a két változóba a diagramterület alsó, illetve felső határát tároltam el.

  #A mintaátlag és a megbízhatósági határértékek értékének szöveggé alakítása a tizedesjegyek beállításával
  mintaAtlagSzoveg <- as.character(format(mintaAtlag, digits = 5))
  mintaEloszlas95LowerSzoveg <- as.character(format(mintaEloszlas95Lower, digits = 5))
  mintaEloszlas95UpperSzoveg <- as.character(format(mintaEloszlas95Upper, digits = 5))

Ez a rész szintén technikai jellegű. Azért, hogy a diagramon megjelenhessenek a mintaátlag és a 95% megbízhatósági tartomány határainak értékei, a kiszámított értékeket szöveggé kell alakítani. Ráadásul azt úgy, hogy a tizedespont után ne legyenek tizedesjegyek kilométerhosszan. A szöveggé alakítást az ’as.character()’ függvény segítségével lehet elvégezni. A tizedesjegyek hosszának beállításához viszont a ’format()’ függvényt tudjuk használni. A ’format()’ függvény ’digits = 5’ paramétere azt mondja, hogy a számnak csak 5 számjegye jelenjen meg összesen, azaz az egész és a tizedes jegyek száma összesen 5 lehet. Ez nem biztos, hogy minden esetben szerencsés, mert például a egymillió felett ez már problémás lehet. Most így átgondolva, a ’format()’ függvénynek van egy ’nsmall’ nevű paramétere is, ezzel a tizedespont mögötti számok mennyiségét lehet beállítani. Igény szerint ez kicserélhető a kódban, vagyis a ’digits =5’ helyett az ’nsmall = 2’ is alkalmazható.

Most jön a lényeg, a diagram kirajzolása.

Ez a legösszetetteb kódrészlet, de csak elsőre tűnik vadnak, igazából az egész olyan, mint a legó, az egyes diagram elemeket szépen egymás után pakoltam. Az egyes elemeket a ’+’ jellel kötjük össze, ebből tudja a fordító, hogy ezek a kódrészletek összetartoznak. Nézzük meg soronként, hogy mi mit jelent.

ggplot() + xlim(diagramLowerLimit, diagramUpperLimit) +                                                                        

A ’ggplot()1 függvény fogja össze a diagram egészét. Önmagában meghívva ez a függvény egy üres diagramterületet fog kirajzolni.

ggplot() + xlim(diagramLowerLimit, diagramUpperLimit) +                                                                   

Az ’xlim()’ függvénnyel be tudjuk állítani az x-tengely mérettartományát.

 …
geom_function(fun = dnorm, args = list(mean = mintaEloszlasAtlag, sd = mintaEloszlasSzoras)) +        

 A ’geom_function()’ függvénnyel bármilyen függvénygörbét ki tudunk rajzoltatni. Természetesen vannak előre definiált függvénytípusok, amelyeket a ’fun =’ paraméter beállításával lehet megadni. Ez esetben ez a normál eloszlás sűrűségfüggvénye, ezért lett a ’fun =’ paraméter értéke ’dnorm’, ahol a d betű a ’density’, azaz sűrűség fogalmat takarja.


geom_function(fun = dnorm, args = list(mean = mintaEloszlasAtlag, sd = mintaEloszlasSzoras)) +     …

Nem elég megadni a függvény típusát, az adott függvény konkrét paramétereit is meg kell adnunk. Ezt az ’args =’ paraméter segítségével tudjuk megadni. Azért ilyen kacifántos, mert ahányféle függvénytípus, annyiféle paramétersort kell megadni a függvény pontos definíciójához. Az ’args =’ után egy listát kell megadnunk, amelyben benne vannak az egyes paraméterek, ez esetben az átlag (’mean =’) és a szórás (’sd =’). Mivel a diagramon a mintaátlagok eloszlását akarom megjeleníteni, ezért a normál eloszlás átlagának a mintaátlagok átlagát, azaz a sokaság átlagát adom meg, szórásának pedig a mintaátlagok szórását (lásd fentebb).


    geom_vline(xintercept = mintaEloszlasAtlag, color = "darkgreen", linetype = "dashed") +                
    geom_vline(xintercept = mintaEloszlas95Lower, color = "darkgreen", linetype = "dashed") +                
    geom_vline(xintercept = mintaEloszlas95Upper, color = "darkgreen", linetype = "dashed") +                
    geom_vline(xintercept = mintaAtlag, color = "red", linetype = "solid", size = 2) +                  

A ’geom_vline()’ függvény egy függőleges vonalat rajzol a diagramra, amely a diagramterület aljától a tetejéig tart, ezért nem kell megadni az y-irányú koordinátákat, csak az x-tengely metszéspontját az ’xintercept =’ paraméter megadásával.


    geom_vline(xintercept = mintaEloszlasAtlag, color = "darkgreen", linetype = "dashed") +               
    geom_vline(xintercept = mintaEloszlas95Lower, color = "darkgreen", linetype = "dashed") +                
    geom_vline(xintercept = mintaEloszlas95Upper, color = "darkgreen", linetype = "dashed") +                
    geom_vline(xintercept = mintaAtlag, color = "red", linetype = "solid", size = 2) +                  

A ’color = „darkgreen”’ a vonal színét adja meg, a ’linetype = „dashes”’ pedig a vonal mintázatát, jelen esetben a ’dashed’ a szaggatott vonalat jelöli.


    geom_vline(xintercept = mintaEloszlasAtlag, color = "darkgreen", linetype = "dashed") +                
    geom_vline(xintercept = mintaEloszlas95Lower, color = "darkgreen", linetype = "dashed") +                
    geom_vline(xintercept = mintaEloszlas95Upper, color = "darkgreen", linetype = "dashed") +                
    geom_vline(xintercept = mintaAtlag, color = "red", linetype = "solid", size = 2) +                  

A ’size = 2’ a vonal vastagságát adja meg.


labs(title = "Egymintás Z-próba - 95% megbízhatósági szint") +                                                              

Ez a sor írja ki a diagram címét a bal felső sarokba.


    annotate(geom = "label", x = mintaAtlag, y = 0.25, label = "minta átlag") +                         
    annotate(geom = "label", x = mintaEloszlas95Lower, y = 0, label = "95% meg.tart. alsó határ") +     
    annotate(geom = "label", x = mintaEloszlas95Upper, y = 0, label = "95% meg.tart. felső határ") +    
    annotate(geom = "label", x = mintaAtlag, y = 0.23, label = mintaAtlagSzoveg) +                                  
    annotate(geom = "label", x = mintaEloszlas95Lower, y = 0.02, label = mintaEloszlas95LowerSzoveg) +
    annotate(geom = "label", x = mintaEloszlas95Upper, y = 0.02, label = mintaEloszlas95UpperSzoveg) 

}

Az ’annotate()’ függvény segítségével mindenféle megjegyzéseket és jelzéseket tehetünk a diagramra egy szabadon választott helyre. Ez lehet egyszerű szöveg, pont, egyenes vagy görbe vonal, esteleg téglalap is. A megjegyzés típusát a ’geom =’ paraméterrel lehet megadni, ez esetben a ’geom = „label”’ azt jelenti, hogy egy bekeretezett címkét kell megjeleníteni. Itt vigyázni kell az idézőjelek alkalmazására, mert különben hibára futunk. Az x és az y-irányú koordináták megadása értelemszerű, a 0:0 pont a két koordinátatengely metszéspontjában van. A címke szövegét a ’label =’ paraméter után kell megadni idézőjelek között. A címke szövegét nemcsak közvetlenül adhatjuk meg, hanem egy szöveges változóra történő hivatkozással is, mint például az utolsó két sorban, ahol a már előzőleg elkészített szöveges változót adtam meg a címke felirataként.

Összegzés:

Ez a diagram véleményem szerint nem létszükséglet, de előfordulhat, hogy szükség van rá valamilyen jelentésben vagy prezentációban. Akadnak még továbbfejlesztési lehetőségek, például paraméterként át lehetne adni a megkívánt megbízhatósági szintet, vagy be lehetne színezni a megbízhatósági tartományt. Ha valakinek van ilyen igénye, akkor nyugodtan fejlessze tovább a függvényt a saját szükségletei és szájíze szerint. Sajnos a kódsorok hossza miatt a tördelés egy kicsit szétcsúszott, emiatt elnézést kérek.

8 komment

Senki többet harmadszor? – Újra az egymintás Z-próbáról, most R-kóddal

2021. március 26. 08:00 - glantos70

A múlt heti bejegyzésben (Mi is az a hipotézis vizsgálat) tisztáztuk, hogy miért van szükségünk a feltevésünk indirekt bizonyítására. A következő lépésben azt szeretném bemutatni, hogyan működteti ez az alapelv az egyik legegyszerűbb hipotézis vizsgálatot, az egymintás Z-próbát. Erről a tesztről már volt szó korábban (Z, mint Z-próba… egymintás), a megoldás folyamatát is tárgyaltuk (Számítógépes bowlingozás egymintás Z-próbával). Most azonban a múlt heti bejegyzés szellemében szeretném bemutatni ennek a vizsgálatnak a lényegét.

A probléma erősen hasonlít az előző heti bejegyzésben megfogalmazott kérdéshez:

Egy segéd ad nekünk egy cilindert, amiben rengeteg cetli van és mindegyikre van írva egy szám. Azt nem tudjuk, hogy a cetliken pontosan milyen számok szerepelnek, a segéd csak annyit árul el, hogy mekkora a cetliken szereplő számok átlaga és a szórása. Tényleg csak ennyit tudunk, azt sem tudjuk, hogy a kalapban lévő számoknak milyen az eloszlása. Sem a fejfedőhöz, sem a benne lévő papírdarabokhoz nem nyúlhatunk hozzá.

A segéd ad még nekünk 30 darab olyan papírt is, amelyekről azt állítja, hogy ő húzta ki őket a kalapból. Ezeket a cetliket megfoghatjuk, leolvashatjuk a számokat és számításokat is végezhetünk ezek segítségével.

A feladat az, hogy megállapítsuk, vajon a segéd tényleg a cilinderben lévő sokaságból húzhatta ki a mintaként adott 30 papírdarabot vagy sem.

A kérdés megválaszolása elsőre egyszerűnek tűnhet, de higgyük el, mégsem az. Az, hogy a segéd kivehette a 30 cetlit a kalapból, még nem jelenti azt, hogy tényleg onnan is vette ki, vagyis ez nem egyértelmű bizonyíték. Az viszont az lenne, ha be tudnánk bizonyítani, hogy a segéd nem vehette ki a 30 cetlit a kalapból, vagy legalábbis elenyészően kicsi a valószínűsége annak, hogy ez megtörténhetett.

A feladat fogósnak tűnik, mert egy csomó dolgot nem ismerünk.

  • Nem tudjuk, hogy konkrétan milyen számok vannak a cilinderben lévő papírdarabokon.
  • Nem láttuk, hogy a segéd tényleg a kalapból vette ki a 30 cetlit
  • Nem tudjuk, hogy a segéd igazat mond, vagy hazudik.

A feladat fogósnak tűnik, de aztán a blog szorgalmas olvasóinak esetleg eszébe jut egy réges-régi írás (A nagy dobókocka kísérlet), ahol valami nagyon hasonlót tapasztaltunk, mint a múlt heti cikkben. A sok ezer egyedi dobókocka dobás eredményeinek átlaga 3,5 volt, míg az ebből a sokaságból kivett n-elemű minták átlagai kisebb vagy nagyobb mértékben eltértek ettől a 3,5-től. Amikor viszont rengeteg elegendően nagy elemszámú mintát vettünk ki a dobások sokezres halmazából, akkor ezeknek a mintáknak az átlagait hisztogramon ábrázolva maguk is egy jellegzetes mintázatot rajzoltak ki.

Noha az egyedi dobókocka dobások esetében mind a hat szám körülbelül egyenlő eséllyel jöhetett ki, az átlagok azonban egy haranggörbéhez nagyon hasonló alakzatot vettek fel.

Ezenkívül az is megfigyelhető volt, hogy a mintaátlagok átlaga megegyezett a sokaság átlagával, a mintaátlagok szórása pedig a sokaság szórásának és a mintaszám négyzetgyökének hányadosával.

Szerencsénk van, mert ez a jelenség nemcsak a dobókocka dobások esetében figyelhető meg. Szerencsére ez egy matematikailag is bizonyítható általános szabály, igazából teljesen mindegy, hogy milyen eloszlású a populáció, amelyből mintákat veszünk, a mintaátlagok eloszlása elegendően nagy mintaszám esetén mindig normál eloszlás lesz.

Ez az, amelyet most fel tudunk használni a megoldáshoz. Ugyanis ekkor a sokaság átlaga és szórása ismeretében – függetlenül a sokaságban lévő számok konkrét eloszlásától – mindig meg tudjuk mondani, hogy a sokaságból kivett nagy elemszámú minták átlaga mekkora eséllyel mennyi lesz.

Ez esetben viszont azt is meg tudjuk mondani, hogy a minta átlaga mekkora eséllyel mennyi NEM LEHET, ha a mintát ténylegesen abból a sokaságból vettük ki!

Ezek szerint a feladat egyszerű. Ismerve a cilinderben lévő számok átlagát és szórását, ki tudjuk számolni, hogy milyen tartományban lesznek a kalapból kivett minták átlagai. Ha a kezünkben lévő 30 szám átlaga nem esik bele ebbe a tartományba, akkor előáll az egyértelmű bizonyíték, amelyet keresünk. Jó, de hogyan számoljuk ki ezt a tartományt konkrétan? Ehhez ismét elő kell vennünk egy régebbi blogbejegyzést (Ismerd meg a hibafüggvényt! – A normál eloszlás legfontosabb tulajdonságai). Ebben volt arról szó, hogy a normál eloszlás esetében az átlag körüli ± egyszeres, kétszeres és háromszoros szórástartományban található az elemek 68, 95, illetve 99,73 százaléka.

Ha ismerjük a kalapban lévő számok átlagát és szórását, akkor eszerint kijelenthetjük, hogy a kalapból kivett minták átlagainak 95%-a a kalapban lévő számok átlaga körüli ± kétszeres szórás tartományban van. Ha a sokaság átlagát μ-vel, a sokaság szórását σ-val, a kivett minták elemszámát pedig n-nel jelöljük, akkor ezt a tartományt a következő módon tudjuk meghatározni:

Ezek szerint nincs más dolgunk, mint kiszámítani a kezünkben lévő 30 minta átlagát, illetve a kalapban lévő számok átlagának és szórásának ismeretében kiszámítani a fenti tartományt. Ha a minta átlaga netalán nem lenne benne a fenti tartományban, akkor szerencsénk van, mert kijelenthetjük, hogy 5%-nál kisebb a valószínűsége annak, hogy a kezünkben lévő mintát a segéd a kalapból vette ki, vagyis 100 próbálkozásból kevesebb, mint ötször sikerülne neki ehhez hasonló átlagú mintát kihúzni a kalapból. Szeretném hangsúlyozni, hogy a tankönyvekben nem ez a képlet szerepel, de aki tényleg érti, az nem akad majd ki ezen, mert tudja, hogy a kétféle megközelítés ekvivalens.

Próbáljuk ki a gyakorlatban is, hogyan működik ez a dolog. Az RStudio-ban létrehoztam egy sokaságot, amelynek az a legfontosabb tulajdonsága, hogy minden, csak nem normál eloszlású. Ezt úgy értem el, hogy összekevertem öt normál eloszlású véletlen minta elemeit. Ez így is létrehozható R-ben:

sok1 <- rnorm(200, mean = 10, sd = 2)
sok2 <- rnorm(200, mean = 25, sd = 5)
sok3 <- rnorm(200, mean = 30, sd = 1.5)
sok4 <- rnorm(200, mean = 40, sd = 3)
sok5 <- rnorm(200, mean = 50, sd = 2)

sokasag <- c(sok1, sok2, sok3, sok4, sok5)

A fenti kóddal létrehoztam a ’sok1’ … ’sok5’ vektorokat, amelyeknek az ’rnorm()’ függvény segítségével adtam értéket. Az ’rnorm()’ függvény alkalmazását már bemutattam egy korábbi cikkben (Ha nem normál eloszlás, akkor micsoda? – adatsor eloszlásának azonosítása R-ben), szóval itt most nem húznám ezzel az időt. A lényeg, hogy a végén a ’sokasag’ nevű változóba összemásolom a ’sok1’ … ’sok5’ változók tartalmát, így az öt darab 200 elemből álló vektorból lett egy darab 1000 elemű vektor, amelynek az eloszlását most már titkosszolgálati eszközökkel sem lehet kideríteni. Íme…

gghistogram(sokasag, bins = 32)

Erre biztosan vannak százszor elegánsabb és valószínűleg hatékonyabb kódok is, de nekem most nem az elegancia, hanem az egyszerűség volt a fontosabb. Amennyiben tudsz ennél jobb vagy gyorsabb kódot erre a célra, akkor megköszönöm, ha kommentben megosztod az olvasókkal.

Akkor most a rend kedvéért nézzük meg ennek az 1000 elemű számhalmaznak az átlagát és a szórását. Merthogy annak ellenére, hogy az adatsor eloszlása többé-kevésbé semmire sem emlékeztet, azért neki is van átlaga és szórása, csak ez (még) most nem mond a számunkra semmit.

sokasagAtlag <- mean(sokasag)
sokasagSzoras <- sd(sokasag)
sokasagAtlag
sokasagSzoras

Ezen két számból azonban már ki tudjuk számolni azt a tartományt, amelybe a sokaságból kivett minták átlagait várjuk. Ehhez csak a fentebb leírt képletbe kell behelyettesíteni a sokaság átlagát és szórását. Úgy döntöttem, hogy 100 elemből álló mintákat fogok kivenni a sokaságból. 30-32 elemű minták is elegendőek lennének, de inkább biztosra megyek. A ’mintaAtlagAh’ jelenti a mintaátlagok tartományának várható alsó határát, a ’mintaAtlagFh’ pedig a tartomány felső határát adja meg. Az R-ben nagyon egyszerűen lehet képleteket létrehozni és számolni egyszerű számokkal vagy akár változókkal.

n <- 100
mintaAtlagAh <- sokasagAtlag - 2*sokasagSzoras/sqrt(n)
mintaAtlagFh <- sokasagAtlag + 2*sokasagSzoras/sqrt(n)
mintaAtlagAh
mintaAtlagFh

Ok, akkor most megvan a keresett tartomány, ahová a mintaátlagokat várjuk. Következő lépésként vegyünk ki ebből a sokaságból rengeteg mintát. Ez a kód ez kicsivel bonyolultabb lesz, de nem teljesen érthetetlen. Mindenekelőtt leszögezem, hogy nekem most kizárólag a minták átlagaira lesz szükségem, a mintákra magukra nem, ezért azokat nem is fogom elmenteni.

mintaAtlagok <- vector()

for (i in 1:1024) {
      minta <- sample(sokasag, 100, replace = FALSE)
      atlag <- mean(minta)
      mintaAtlagok <- c(mintaAtlagok, atlag)
      i <- i + 1
}

A minták átlagait a ’mintaAtlagok’ nevű változóba fogom elmenteni. Ezt R-ben nem feltétlenül fontos előre létrehozni, de az átláthatóság kedvéért én most létrehoztam. Ezután a ’for()’ parancs alkalmazásával létrehozok egy ciklust, amely készít 1024 darab mintát (azért 1024-et, mert ennek a négyzetgyöke 32). A for-ciklus számlálója az ’i’ változó, a ciklus addig fog futni, ameddig ’i’ értéke el nem éri az 1024-et. A cikluson belüli parancsokat kapcsos zárójellel jelöljük.

  • A ciklus első sorában a ’sample()’ függvény segítségével kiveszek a ’sokasag’ nevű változóban elmentett 1000-elemű számhalmazból 100 véletlenszerűen kiválasztott számot. A függvény ’replace = FALSE’ paramétere azt mondja, hogy a kivett mintaelemet a függvény ne tegye vissza, azaz legyen ez egy nem visszatevéses mintavétel (mint a lottószám sorsolás).
  • A ciklus második sorában kiszámolom az előzőleg kivett minta átlagát és elmentem az ’atlag’ nevű változóba.
  • A ciklus harmadik sorában az ’atlag’ változó értékét hozzáteszem a ’mintaAtlagok’ tömbhöz.
  • A ciklus negyedik sorában megnövelem ’i’ értékét eggyel.

Végeredményként kaptunk egy 1024 elemből álló vektort (vagy tömböt), amely fel van töltve a sokaságból kivett minták átlagaival. Hogyan néz ki a mintaátlagok hisztogramja?

gghistogram(mintaAtlagok, bins = 32)

Ez egy láthatóan haranggörbére emlékeztető alakzat. A rend kedvéért azért győződjünk meg arról, hogy a mintaátlagok tényleg normál eloszlásúak. Ehhez ne felejtsük el betölteni a ’normtest’ csomagot. Ha esetleg úgy érzed, hogy érdemes a normalitás vizsgálatokkal kapcsolatos tudásodat felfrissíteni, akkor fusd át a 'Ne hanyagold el! - Normalitásvizsgálatok R-ben' című cikket.

library(normtest)

lillie.test(mintaAtlagok)
shapiro.test(mintaAtlagok)
ad.test(mintaAtlagok)

Mivel a ’p-value’ mindhárom esetben nagyobb, mint 0,05, ezért nyugodtan elfogadhatjuk, hogy a teljesen szabálytalan eloszlású sokaságból kivett 100-elemű minták átlagai normál eloszlást követnek. De vajon igaz-e a másik állításom, hogy a mintaátlagok a sokaság tulajdonságai alapján fent kiszámított tartományba esnek? Nézzük meg, mekkora a mintaátlagok legkisebb és legnagyobb eleme.

Ha visszalapozol egy kicsit, akkor látni fogod, hogy a legkisebb mintaátlag KISEBB, mint a sokaság tulajdonságai alapján becsült alsó határérték, illetve a legnagyobb mintaátlag is NAGYOBB, mint a sokaság tulajdonságai alapján becsült felső határérték. Akkor most az egész eddigi magyarázat nem igaz?

De, igaz. Mert ugye azt senki sem mondta, hogy a fenti képlet alkalmazásával azt a tartományt adjuk meg, amin kívül biztosan egyetlen átlag sem fog esni. Azt mondtuk, hogy az átlagok 95%-a fog beleesni ebbe a tartományba! Rendben, – mondod kedves okkal gyanakvó olvasó – akkor ez most igaz? Nézzük meg…

Akkor most a ’mintaAtlagok’ változóban szereplő átlagok közül ki fogom szűrni azokat, amelyek a fent megadott 28,1856 és 33,7325 közé esnek.

mintaAtlagok95 <- mintaAtlagok[mintaAtlagok > 28.1856 & mintaAtlagok < 33.7325]

Ez a sor nagyon trükkös, de megmondom őszintén, nagyon tetszik, hogy egy vektor elemeit úgy is tudom szűrni, hogy a szűrőfeltételt úgy adom meg, mint ahogyan a vektor elemeire szoktunk hivatkozni. Tehát egy vektor elemeire nemcsak sorszámokkal lehet hivatkozni, hanem szűrőfeltételek megadásával is. Ez esetben a mintaAtlagok95 változóba elmentettem a mintaAtlagok vektor azon elemeit, amelyek nagyobbak, mint 28,1856 és kisebbek, mint 33,7325.

Eredményként azt kaptam, hogy a mintaAtlagok95 vektor 987 elemből áll, vagyis az eredeti 1024 átlagból 987 beleesik az előzőleg megbecsült tartományba.

Ez az összes mintaátlag 96,38%-át jelenti. Mivel ez egy kicsivel több is, mint a célul kitűzött 95%, ezért mégiscsak kijelenthetjük, hogy a rendszer működik! A minták átlagai normál eloszlásúak és a sokaság tulajdonságai alapján valóban előre meg lehet mondani, hogy a minták átlagai milyen tartományba fognak esni.

Azonban itt még mindig nem ér véget a történet. Akár véget is érhetne, mert tulajdonképpen megvan az egyértelmű döntési kritérium, amit kerestünk. Érdekes módon azonban a tankönyvekben nemcsak ez a módszer szerepel, hiszen a korábbi cikkeimben én sem ezt az utat választottam, hanem a standardizálást. De akkor miért használjuk a másik módszert is és miért nem csak ezt?

Ez véleményem szerint (merthogy „hivatalos” választ erre még nem találtam) ez azért van, mert a régi időkben, amikor még nem voltak nagy teljesítményű számítógépek, igen nehéz volt egy teljesen általános normál eloszlás esetében kiszámolni egy adott esemény valószínűségét. Az egyetlen standard normál eloszlás esetében viszont a rendelkezésre álltak az előre kiszámolt valószínűségi táblázatok, amelyekből Z értékének ismeretében ki lehetett számolni annak a valószínűségét, hogy egy adott minta átlaga mekkora valószínűséggel vehet fel egy adott értéket. Vagyis ez egy kicsivel több információt ad, mint az általam fentebb ismertetett megbízhatósági tartomány.

Mivel ezt a módszert már leírtam korábban és az erről szóló cikk linkjét is beillesztettem a cikk elején, azért ezt most nem készítem el, inkább arra koncentrálok, hogy hogyan lehet ezt R-ben elvégezni. Szokásosan ehhez sem kell más, mint egy újabb csomag, amelyet most ’BSDA’ néven emlegetnek. A titokzatosnak látszó név a ’Basic Statistics and Data Analysis’ nevet takarja, és Larry J. Kitchens hasonló című könyvének a segédleteként funkcionál. Van a csomagban egy csomó minta adatsor, amikkel játszadozni lehet, de emellett található itt egy-két hasznos függvény is. Ilyen például a ’z.test()’ függvény is, amelyet alkalmazni fogunk. Először is töltsük be a ’BSDA’ könyvtárat.

library(BSDA)

Ezután létre kell hoznunk egy minta adatsort, amelyet vizsgálni fogunk, hogy kivehettük-e a fentebb már létrehozott ’sokasag’ nevű adathalmazból. Először ténylegesen ebből a sokaságból veszek majd ki egy mintát, hogy lássuk, a teszt tényleg azt fogja hozni, hogy a mintát kivehettük ebből a sokaságból.

egyMinta <- sample(sokasag, 100, replace = FALSE)

A kapott mintát a neve begépelésével meg lehet jeleníteni.

 

Most pedig a ’z-test()’ függvény alkalmazásával elvégzem az egymintás Z-próbát.

z.test(egyMinta, mu = sokasagAtlag, sigma.x = sokasagSzoras, alternative = "two.sided", conf.level = 0.95)

A ’z.test()’ függvény első paramétere a minta saját maga, azaz az egyMinta változó. A sokaság általában nem áll a rendelkezésünkre adatsorként, ezért csak a sokaság átlagát (mu = sokasagAtlag) és a szórását (sigma.x = sokasagSzoras) tudjuk megadni. A ’sigma.x’-ben azért van a ’.x’ mert ezzel a függvénnyel kétdimenziós sokaságot is tudunk vizsgálni, csak akkor az y-irányú szórást is meg kell adnunk. az ’alternative = „two-sided” azt jelenti, hogy kétoldali tesztet kérünk, azaz nem tudjuk, hogy a minta kisebb-e vagy nagyobb a sokaság átlagánál. A ’conf.level = 0,95’ pedig azt jelenti, hogy 95%-os megbízhatósági szinten szeretnénk tudni, hogy a mintát a sokaságból vettük ki vagy sem.

Nos, az eredményt a következő módon tudjuk értelmezni. A ’data: egyMinta’ sor egyértelmű, ez arra szolgál, hogy amennyiben több hasonló tesztet is végzünk, akkor azonosítani tudjuk, hogy melyik teszt melyik. A következő sor természetesen a standardizáláskor kiszámított ’z’ próbastatisztika és a p-value értékét tartalmazza. Csak emlékeztetőül:

A p-value jelentésének részletes magyarázata pedig ’A titokzatos P színre lép – Mi az a P-Value?’ című cikkben olvashatod el. A harmadik sorban található a nullhipotézis ellenkezője az alternatív hipotézis, amely ez esetben azt mondja, hogy a sokaság átlaga, amiből ezt a mintát kivettük nem egyenlő 30,95911-el, azaz az általunk megadott sokaságátlaggal (csak ez most nem látszik). Az ötödik sorban található a 95%-os megbízhatósági intervallum alsó és felső értéke. Ezek azok, amelyeket fentebb mintaAtlagokAh és mintaAtlagokFh nevekkel illettem (mivel közben időnként újraszámolgattam dolgokat, tizedes eltérések lehetnek az adatok között. Bocs). A riport végén vannak a mintára vonatkozó becsült értékek (sample estimates). Itt csak a minta átlaga jelenik meg, amely ez esetben 31,13311.

A riport eredménye egyrészt az, hogy a p-value jóval nagyobb, mint 0,05. Másrészt a minta átlaga (31,13311) benne van a 28,41515 és a 33,85106 közötti tartományban. Sajnos szöveges kiértékelést nem kapunk, pedig illendő lenne leírni, hogy a nullhipotézist elfogadjuk, azaz nincs elegendő bizonyítékunk arra, hogy a mintát nem az általunk megadott sokaságból vettük ki.

Összegzés:

Azt hiszem, hogy kimerítő mélységben elemeztem ezt az egyébként nem túl bonyolult módszert. Noha a cikk egészen hosszú lett, reménykedem benne, hogy a magyarázat követhető és így érthető lesz mind a próba, mind pedig a teszt megvalósítása R-ben.

2 komment

Mi is az a hipotézis vizsgálat?

2021. március 19. 08:00 - glantos70

Hipotézis vizsgálatok

A napokban a kollégáimnak próbáltam elmagyarázni az egymintás Z-próba lényegét és rájöttem, hogy nem igazán tudom értelmesen elmagyarázni, hogy mi is az a hipotézis vizsgálat és miért kell ezt pont úgy csinálni, ahogyan azt csináljuk. Állati régóta töröm ezen a fejem, de eddig még nem sikerült igazán plasztikusan megvilágítani a probléma lényegét. Most újra megpróbálok nekifutni a dolognak…

Tovább
20 komment

Melyik illeszkedik a legjobban? - Valószínűségi eloszlás azonosítása R-ben (Six Sigma in R) - 2. rész

2021. március 12. 08:00 - glantos70

Six Sigma in R

Az előző cikkben (Ha nem normál eloszlás, akkor micsoda? – Valószínűségi eloszlás azonosítása R-ben) ott fejeztem be, hogy sikerült elsajátítani egy becslési eljárást a vizsgált adatsor eloszlására vonatkozóan. Ez azonban még igen messze van attól, amit valójában el szeretnénk érni, hiszen az előző cikkben bemutatott módszer csak egy becslést ad az adatsor eloszlására vonatkozóan, de nem adja meg egyértelműen, hogy

  • Az adatsor melyik eloszlással írható le a legjobban, és mik a paraméterei annak az eloszlásnak, amely a leginkább illeszkedik az adatainkra
  • Milyen bizonyítékok alapján tudjuk azt állítani, hogy ez a bizonyos eloszlás a megadott paraméterekkel valóban elég jól illeszkedik a vizsgált adathalmazra.

Tovább
Szólj hozzá!
süti beállítások módosítása