Hur man skapar slumptal i ett datamaterial med hjälp av ACCESS

Nivå: Avancerad nivå

Förutsättningar: Det här exmplet förutsätter att du är mycket förtrogen med hur man arbetar med egentillverkade funktioner skrivna VB (Visual Basic programmering) och hur du implementerar dessa funktioner i en ACCESS-fråga, som sedan exekveras.

Inledning
Antag att vi har ett stort datamaterial, i en Access-tabell, och att vi vill kunna förbereda datamaterialet, så att vi kan dra ett ett stickprov från datamaterialet. Datamaterialet består av data från 22 olika enheter som har olika betäckningar, ”enhet1”, ”enhet2” osv. I vårt datamaterial har vi över 10 000 fakturor som alla har ett fakturanummer (ID). Vi vill nu genomföra ett stickprov för att t.ex genomföra en kvalitetsgranskning. Vårt stickprov ska vara enligt klassisk statistisk teori, enligt principen: ”obundet slumpmässigt urval utan återläggning (OSU)”.

En strategi till lösning
En strategi är att använda den inbyggda slumpgeneratorn RND (se referens till funktionen nedan) i Access. Sedan måste vi programmera en funktion som skapar våra slumptal. Vad våran funktion kommer att göra är att skriva ett slumptal mellan 1-22 för varje faktura, utifrån den enhet som fakturan kommer ifrån.

Nedan framgår hur VB-koden ser ut, när den implementeras i en VB-funktion:

++++++++++++++++++++ Kodstart i funktionen+++++++++++++++++++++
Option Compare Database

Function Sample(SampleValue As Variant)

Dim SampleOut As Integer

If SampleValue = ”enhet1” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet2” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet3” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet4” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet5” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet6” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet7” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet8” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet9” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet10” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet11” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet12” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet13” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet14” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet15” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet16” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet17” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet18” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet19” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet20” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet21” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
ElseIf SampleValue = ”enhet22” Then
SampleOut = Int((22 – 1 + 1) * Rnd + 1)
End If

Sample = SampleOut

End Function
++++++++++++++++++++ Kodslut i funktionen+++++++++++++++++++++

Kommentar till VB-koden:
Koden i funktionen ovan gör följande: När strängen ”enhet1” hittas, generera ett slumptal mellan 1-22; När strängen ”enhet2” hittas, generera ett slumptal mellan 1-22 osv. Beroende på vad VI sedan har för statistiska preferenser, kan man välja sitt stickprov från t.ex alla som har siffran 4, skall vara med osv.

I nedanstående skärmdump visas resultatet, när vi kör funktionen i en ACCESS-fråga:

dataslumptal

 

 

 

 

 

 

 

 

Slutsatser: Användning av funktionen RND är smidigt och ganska enkelt, eftersom den är inbyggd och redan finns i ACCESS och därför kräver lite kod. OBS! Man bör vara obeservant på att de statistiska preferenserna är korrekta och hur man vet hur stickprovet skall genomföras. Annars finns en risk för att man gör antingen en överskattning eller underskattning av antalet element som ska vara med i stickprovet. I exemplet ovan hade det bästa alternativet troligvis varit att dela in datamaterialet i olika stratum. Hur man gör detta ligger utanför denna artikel.

 

Referens:
RND Function (Visual Basic)
http://msdn.microsoft.com/en-us/library/f7s023d2(v=vs.90).aspx

Share