« Roterade ord (shifted words) | Main | Spelteoretisk analys av uppvaktning »

augusti 06, 2005

Lite om konsekutiva talpar i Lotto (och dess varianter)

I Konstantinos Drakakis paper Distances between the winning numbers in Lottery (arXiv, PDF) undersöks sannolikheten för en förekomst av konsekutivt talpar i Lotto-spel. Man ger en formel för denna typ av sannolikhet, och kommer t.ex. fram till att det för ett 6/49-Lotto (dvs där 6 nummer dras av 49) är det ungefär 49.5% chans att en Lotto-rad innehåller åtminstone ett konsekutivt talpar. Vilket är förvånansvärt högt.

Här nedan är några kommentarer och utvikningar, bl.a. med hjälp av riktig data för den Lotto-form vi har i Sverige, 7/35-Lottoformen (dock ej svensk data) samt simulering av sådan Lotto-typ.


Not: Sorterad dragningslista
En not kan vara på sin plats så här i början. Det är frågan om (konsekutiva) talpar i den sorterade listan av de dragna Lotto-numren. Det gäller alltså inte talpar som uppstår i själva dragningen. Exempel: Om en dragning görs av följande "bollar" (1, 14, 34, 2, 19, 15, 20) så tittar vi här på den sorterade listan (1, 2, 14, 15, 19, 20, 34) som ha tre stycken konsekutiva talpar: (1,2), (14,15) samt (19,20).

Notera också att varken Drakakis eller jag här nedan har brytt oss om tilläggstal och andra finesser.


Matematisk formel
Problemet formuleras på följande sätt i papret:

What is the probability that, out of m > 0 numbers drawn uniformly randomly from the range 1,..., n > m, at least two are consecutive?

Dvs vad är sannolikheten att det finns minst ett konsekutivt talpar (dvs ett eller flera) om man drar m tal från intervallet 1..n.

Den slutna matematiska formeln för denna sannolikhet uträknades till

p(n,m) = 1 - p(n,m)= 1 - ( C(n-m+1, m) / C(n,m) )

där C motsvarar (binomialkoefficienten ("n över m") och som i sin tur är definierad som n!/(k!*(n-k)!). Papret visar med matematisk stringens hur man kommit fram till detta resultat, men det vågar jag inte ha någon åsikt om och kommer inte heller att beröra detta här nedan.


Konkret
Låt oss i stället bli konkreta. För den ovan nämnda Lotto-typen 6/49 studerade värdena (n=49, m=6) får man sannolikheten för att det ska finnas minst ett konsekutivt talpar om man drar 6 tal från intervallet 1..47.

I det symboliska matematisk paketet MuPad (fritt att ladda ner och fritt att använda) uttrycks det på följande sätt.

>> n:=49:m:=6:1- binomial(n-m+1,m) / binomial(n,m);float(%);

22483/45402

0.4951984494

dvs det är cirka 49.5% chans att det finns åtminstone ett talpar. Förvånande mycket, eller hur?


Simulering
Min vana trogen har jag även simulerat detta, och lika troget är det gjort i statistikpaketet R. I simuleringen gjordes 100000 "dragningar" - med sample(1:49, 6) - och sedan räknar man hur många tal som ligger intill varandra. (Som vanligt använder jag den kompakta one-liner-formen för denna typ av simuleringar. En liknande simulering har förklarats lite mer ingående här.)


> sum(sapply(1:100000, function(x) {ddd<-diff(xxx<-sort(sample(1:49,6)));sss<-sum(ddd==1);sum(sss>=1)})/100000)
[1] 0.49559

dvs 49.5%, vilket stämmer hyfsat bra med formeln.


Den svenska Lottoforme(l)n: 7/35
OK, denna typ av Lotto kanske inte är så intressant för oss. Vad med den svenska formen 7/35, dvs där man drar 7 nummer av 35? Först tar vi den teoretiska beräkningen (i MuPad):


>> n:=35:m:=7:1- binomial(n-m+1,m) / binomial(n,m);float(%);

8903/11594

0.7678971882

Dvs det är nästan 76.8% chans att det finns åtminstone ett konsekutivt talpar i de svenska lottoraderna. En simulering av 100000 dragningar ger (nästan) samma resultat 76.6%:

> sum(sapply(1:100000, function(x) {ddd<-diff(xxx<-sort(sample(1:35,7)));sss<-sum(ddd==1);sum(sss>=1)})/100000)
[1] 0.76618


Utvidningar av detta
Kommen så här långt funderade jag på några andra saker kring Lottodragningar:

- finns det data för den svenska Lotto-formen?
- hur många konsekutiva talpar finns det i genomsnitt?
- hur är fördelningen för andra typer av talpars-differenser?


Data för Lotto på formen 7/35 (dock ej svensk)
Det vore ju roligt att se hur 7/35 ser ut i praktiken. Finns det då någon lista över en massa dragningar på det detta "svenska" Lotto-format 7/35? Jepp, det finns det. Mattias Hästbacka har samlat resultaten av Lottoraderna på sin Lotto-sida. Den fullständiga listan finns på Lotto-rader från v40/1980 till v17/2005, dvs nästan 25 år.

Observera att detta inte är Svenska Spels Lottodragningar, utan motsvarande "Finska Spel". Men det spelar egentligen ingen roll för det jag vill komma åt.

Om någon har motsvarande dataanhopning för Svenska Spels Lotto så vore jag mycket intresserad av få tillgång till den. (Maila mig gärna i så fall på hakank@bonetmail.com".)

Jag har bearbetat datan och i filen lotto_all_just_numbers.txt finns "rena" rader utan någon annan information, förutom en tillbörlig källhänvisning till Mattias Hästbackas sajt.


Analys av data
OK, tillbaka till undersökningen. Det finns i Mattias Hästbackas datamängd 957 rader med åtminstone ett konsekutivt talpar av 1283 dragningar, vilket är 957/1283 = 0.746, dvs 74.6%.

Det teoretiska värdet är som vi såg ovan 76.8%, vilket skulle motsvara 1293 * 0.7678971882, dvs ungefär 985 rader. Skillnanden mellan det praktiska värdet (957) och det teoretiska (985) är 985 - 957 = 28, vilket är ett fel på 28/1283, dvs ungefär 2.2% , vilket väl får anses vara rätt hyfsat.


Hur många par blir det i genomsnitt?
Den andra frågan är något annorlunda än Drakakis ursprungliga. Hans utgångspunkt var hur stor sannolikheten är för att det ska bli ett eller flera konsekutiva talpar (dvs åtminstone ett) i en dragning. En annan fråga man kan ställa sig är: hur många konsekutiva talpar det i genomsnitt blir per dragning.

Här är den första dragningen som Mattias Hästbacka sparade (vecka 40 1980):

7, 8, 9, 16, 17, 18, 30

Det finns alltså fyra konsekutiva talpar (7,8), (8, 9), (16, 17) samt (17, 18). Så, frågan är då hur många sådana talpar det blir i genomsnitti per dragning.

En körning på Hästbackas data ger totalt 1429 konsekutiva talpar och på 1283 dragningar blir det 1429/1283 = 1.113796. Dvs för varje dragning blev det igenomsnitt 1.1 konsekutivt talbar.


Äpplen och päron
Men, kan man nu fråga sig, hur rimmar detta 1.2 talpar per dragning med att det finns 76.6% chans för att det blir åtminstone ett konsekutivt talpar per dragning? Borde sannolikheten inte bli 100% istället? Nej, det är två olika saker (olika äpplen och päron).

Konstantinos formel tar inte hänsyn hur många konsekutiva talpar det är utan endast om det är ett eller fler. Dvs det spelade ingen roll för honom om det är 1 sådant par eller 4. Denna senare uträkning tar däremot hänsyn till detta antal. Den andra skillnaden (päronet alltså) är att vi inte räknar med sannolikheter längre utan med det genomsnittliga antalet per dragning.


Fördelning av konsekutiva talpar
En fördelning av antalet konsekutiva talpar i Hästbacka-datan är

0: 325 (0.25)
1: 565 (0.44)
2: 318 (0.25)
3: 69 (0.05)
4: 4 (0.00)
5: 1 (0.00)

Dvs det finns 325 Lotto-rader utan något konsekutivt talpar (cirka 25% av alla dragningar), 565 rader med exakt 1 konsekutivt talpar (~44%) och en rad med 5 par, nämligen den 581:e dragningen (vecka 47 år 1991) som gav följande tal 15 32 33 34 35 36 37.

Låt oss nu för skoj skull simulera detta. Koden som används ser ut så här:


num.talpar = function(num.sims=1283, n=35, m=7) {
# initiera tabellen som kommer att innehåla antalet
# konsekutiva talpar. Det kan vara max m-1 (här 7-1=6) sådana talpar,
# men vi måste även ha med 0, vilket innebär att det blir m stycken
konsek.talpar = rep(0, m)
for (i in 1:num.sims) {
ss = sort(sample(1:n, m))
dd = diff(ss) # differensen mellan talen
tt = sum(dd==1) # hur många konsekutiva talpar finns det
# öka med 1. Not: "tt+1" är för att även få med dragninar som
# inte har något konsekutivt talpar
konsek.talpar[tt+1] = konsek.talpar[tt+1] + 1
}
return(konsek.talpar)
}


Här är en sådan körning som har värden som inte är helt olika de faktiska (dvs Hästbacka-datan). Först antal och sedan fördelningen.

> (ss = num.talpar(1283))
[1] 314 519 353 88 8 0

> round(ss/1283,2)
[1] 0.24 0.40 0.28 0.07 0.01 0.00

För just denna simulering blev det alltså cirka 314 dragningar (cirka 24%, av 1283 rader) utan något konsekutivt talpar alls, 519 dragningar med ett sådant talbar, och hela 8 dragningar med 5 k.t.p (dvs där det finns 6 konsekutiva tal).

Om vi nu brassar på med 100 sådana här simuleringar om vardera 1283 dragningar, dvs 1283*100 = 128300 dragningar (och delar de värden vi får med 100) så får vi något mer exakta värden att jämföra med:


> (ss=num.talpar(1283*100)/100)
[1] 299.31 540.63 339.48 92.53 10.60 0.45 0.00

> round(ss/1283,2)
[1] 0.23 0.42 0.26 0.07 0.01 0.00 0.00

Vi ser alltså att det finns cirka 23% chans att det blir 0 stycken k.t.p., cirka 42% att det blir exakt ett k.t.p. osv.

Den intressanta frågan blir då vad är det (simulerade) genomsnittet konkekutiva par per dragning. I faktisk data blev det cirka 1.1 konsekutivt par per dragning.


sum.talpar = function(num.sims=1283, n=35, m=7) {
antal.talpar = 0
for (i in 1:num.sims) {
ss = sort(sample(1:n, m))
dd = diff(ss) # differensen mellan talen
tt = sum(dd==1) # hur många konsekutiva talpar finns det
antal.talpar = antal.talpar + tt
}
return(antal.talpar)
}
sum.talpar()


Först en enkel körning för att få en känsla för informationen.

> ss = sum.talpar(1283)
[1] 1580

> ss/1283
[1] 1.231489

Och sedan en lite tyngre körning


> sum.talpar(1283*100)/(1283*100)
[1] 1.200514

Dvs det blir cirka 1.2 konsekutiva talpar per dragning. Det är alltså mer än ett par i genomsnitt.

Hur fördelas differenserna av talen?
Ovan har vi endast studerat konsekutiva talpar, dvs tal där differensen är 1. Nen det är även intressant att studera övriga differenser som uppkommit i dragningarna. Det vi ovan kallat för "konsekutiva talpar" är talpar med differensen 1, vilket vi i det följande kallar "1-differens".

I Hästbacka-datan fördelas sig differenserna enligt följande (på formatet differens: antal förekomster). Notera att en dragning nästan alltid har flera olika differenser. T.ex. ovanstående 5-talpars-dragning (15 32 33 34 35 36 37) har fem stycken 1-differenser samt en 17-differens (dvs 32 - 15 = 17).

1: 1429
2: 1184
3: 939
4: 790
5: 683
6: 585
7: 447
8: 345
9: 283
10: 231
11: 207
12: 126
13: 108
14: 99
15: 66
16: 48
17: 44
18: 17
19: 22
20: 11
21: 16
22: 2
23: 5
24: 2
25: 3

Man kan här se att det är flest 1-differenser, sedan blir det ständigt färre och färre.


OK, för fullständighets skull så simulerar vi även detta. Koden är rätt lik den föregående.

diff.table.sim = function(num.sims=1283, n=35, m=7) {
diff.table = rep(0, n)
for (i in 1:num.sims) {
ss = sort(sample(1:n, m))
dd = diff(ss) # differensen mellan talen
# lägg in respektive differens i tabellen
for (d in dd) {
diff.table[d] = diff.table[d] + 1
}
}
return(diff.table)
}

Det vi söker är alltså det genomsnittliga antalet differens per dragning, så vi simulerar 100000 dragningar.

> cbind(diff.table.sim(100000)/100000)
[,1]
[1,] 1.19969
[2,] 0.98629
[3,] 0.80547
[4,] 0.65678
[5,] 0.52912
[6,] 0.42424
[7,] 0.33684
[8,] 0.26439
[9,] 0.20978
[10,] 0.15981
[11,] 0.12235
[12,] 0.09001
[13,] 0.06614
[14,] 0.04662
[15,] 0.03512
[16,] 0.02358
[17,] 0.01583
[18,] 0.01097
[19,] 0.00734
[20,] 0.00406
[21,] 0.00281
[22,] 0.00149
[23,] 0.00073
[24,] 0.00033
[25,] 0.00013
[26,] 0.00006
[27,] 0.00002
[28,] 0.00000
[29,] 0.00000
[30,] 0.00000
[31,] 0.00000
[32,] 0.00000
[33,] 0.00000
[34,] 0.00000
[35,] 0.00000

Varvid vi kan se att det är i genomsnitt (nästan) 1.2 stycken 1-differenser (dvs det vi ovan kallade konsekutiva talpar) per dragning, i genomsnitt 0.99 2-differens per rad osv.


Genomsnittlig antal differenser
Det genomsnittliga antalet differenser är cirka 4.53 enligt följande simulering. Här delas summan av differensvärdena med det totala antalet uppkomna differenser. (Man kan trixa med föregående värden, men jag vill ha lite kontroll över saker och ting.)

diffs = function(num.sims=1283, n=35, m=7) {
diffs = 0
num.diffs = 0
for (i in 1:num.sims) {
ss = sort(sample(1:n, m))
dd = diff(ss)
for (d in dd) {
diffs = diffs + d
num.diffs = num.diffs + 1
}
}
m = diffs/num.diffs # genomsnittligt antal
return(c(diffs, num.diffs, m))
}

Och så körningen, där vi endast är intresserade av det sista värdet:


> round(diffs(1283*100),3)
[1] 3465204.000 769800.000 4.501

Vilket alltså ger det genomsnittliga differensvärdet 4.501. Äh, vi säger 4.5.


Sammanfattning
Här ovan har vi kommit fram till bl.a. följande:

* Sannolikheten att det ska förekomma åtminstone ett konsekutivt talpar i en 7/35-dragning är cirka 77%
* Det blir i genomsnitt 1.2 konsekutiva talpar per dragning.
* Det genomsnittliga differensvärdet för en dragning är 4.5.

Som antytts så anser i alla fall jag att det är förvånande.

Upprinnelse (inspiration)
Upprinnelsen till allt detta var notisen Consecutive pairs in winning lottery numbers hos MathForge.


Se även
Se även min genomgång av födelseparadoxen,tillika med R-kod, i Sammanträffanden - anteckningar vid läsning av Diaconis och Mosteller 'Methods for Studying Coincidences'.

Jämför även med den simulering som gjordes för ett liknande problem (6/49-Lotto) i Lite om resampling, simulering, sannolikhetsproblem etc.. Sök efter "Litet problem i (engelsk) Lotto". (Det koms dock inte fram till exakt samma sak.)

Samt överhuvudtaget Simulation, probability theory etc, såsom Trisssimuleringen (Java applet).

Posted by hakank at augusti 6, 2005 03:37 EM Posted to Matematik | Statistik/data-analys

Comments

Kom igen nu Håkan, allt det och inte ens en hint om vilka nummer som kommer upp i nästa veckas finska lottodragning? ;)

Posted by: jonas (lemonad) at augusti 6, 2005 06:10 EM

Kul kuriosa! Föranledde att jag spenderade en stund med matlab-programmering nu på morgonen ... *s*. Jag ville ju kolla sannolikheterna för minst ett konsekutivt talpar ...

Här är den (något ruffiga) matlabkoden:

lottodragningar.m:

N = 50000;
KT = zeros(N,1);
for j = 1:N
L(j,:)=slumpwo;
SL = sort(L(j,:));
if min(abs(diff(SL)))==1
KT(j)=1;
end
end
P = sum(KT)/N

samt

slumpwo.m:

function L = slumpwo
% dragning utan återläggning
M = 35;
V = 1:M;
for i =1:7
I = floor((M-i+1)*rand+1);
L(i) = V(I);
V(I)=0;
Vs = sort(V);
V = Vs(2:(M-i+1));
end


Resultat från ett par simuleringar:
100 dragningar: 0.78
1000 dragningar: 0.782
10000 dragningar: 0.767,0.785, 0.7644
50000 dragningar: 0.7706

Till exempel. :-)

Posted by: thebe at augusti 7, 2005 11:37 FM

Jonas: :-) En sådan utmaning lämnar en verkligen inte oberörd. Kanske inte sömnlös, men nästan.

Så, efter mycket långa och oerhört avancerade beräkningar (och flera CPU-timmar senare) har jag kommit fram till att det är stor chans att nästa dragning kommer att ge följande rad: (4,5,7,9,13,21,31).

Eftersom jag inte är riktigt klar med modulen som ger den den exakta dragningsordningen så är numren sorterade.

Serien uppfyller de kriterium som uppställts ovan: - har (i genomsnitt) 1.2 konsekutiva talpar
- den fullständiga differenslistan (1, 2, 2, 4, 8, 10) har ett medelvärde på 4.5.

Not till ovanstående prognosticering: Eftersom jag angav att det är stor chans att den förutsagda dragningsraden kommer upp, finns det inte något sätt att kontrollera förutsägelsen. Det är kul med statistik. :-) :-)

Eventuellt kommer mer att skrivas i detta ämne.


Thebe: Skoj att du också slösar bort din tid på detta.

Jag har använt Matlab en del tidigare, men jag tycker att R känns trevligare för den typ av simuleringar/undersökningar jag mest arbetar med, bl.a. eftersom det är så rätt lätt att göra one-liners.

Något jag upptäckte: Det finns en funktion (i Matlabs Statistics Toolbox) för dragning utan återläggning: randsample(35,7) .


Mer om R: Parentetiskt kan nämnas att jag i R saknar hashtabeller och postinkrementella operatorer (såsom lista[2]++ eller lista[3] *= 3). Autovivifikation vore inte heller så dumt, men det är nog att begära för mycket. Dessa features underlättar mycket i min programmering.

För att citera mig själv: "Syntaktiskt socker i ett programspråk är allt". Alan Perlis har tydligen sagt “Syntactic sugar causes cancer of the semicolon”; noten sid 11 i Abelson, Sussman, Sussman "Structure and Interpretation of Computer Programs". Å andra sidan är det en bok som behandlar och lovordar Scheme/Lisp, och citatet är kanske en ledtråd till att jag inte riktigt är bästa vän med Lisp-grenen av de funktionella språken. :)

Posted by: Håkan Kjellerstrand at augusti 8, 2005 10:59 EM

Jag har tyvärr inte tillgång till Statistics Toolbox, men vad gör väl det ... några extra rader kod :-)! R känner jag inte till sen tidigare, kanske är kul att kolla på. Vem vet vad man kan få för sig att simulera :-)!

Posted by: thebe at augusti 9, 2005 01:14 EM

haha håkan, jag missade helt att du faktiskt gjorde en prognos - nu hann jag ju inte skicka in min kupong! Tyvärr verkar det dock som du hade för bråttom och skulle låtit programmet i lugn takt räkna fram 5, 9, 16, 19, 20, 37 och 38 istället. Sju rätt slår liksom lite högre än två ;)

Posted by: jonas (lemonad) at augusti 16, 2005 04:33 FM

Hej!
Intressant blogg om talpar i Lotto. I min site maltestips.se finns möjlighet att använda sig av "talparsfilter". Där finns också lite Lotto och Måltips -statistik (kommer i januari att kompletteras med 2005).
God Jul
Stefan

Posted by: swiden [TypeKey Profile Page] at december 23, 2005 11:50 FM

Hej!
Ang lottoraders vinstnummer, så kan du gå in på www.svenskaspel.se och få lottorader från 1980, om du har tålamod att skriva av alla.
Din statistik om vinnartal är intressant.
Mvh
Gunilla

Posted by: Gunilla Lengard-Tegnér at maj 13, 2008 01:04 EM

Hej
vet någon om eller hur man spela på finska lotto från Sverige internetspel.
mvh Rolf

Posted by: Rolf at februari 4, 2009 06:45 EM