De verjaardagsparadox1 stelt dat er meer dan 50% kans is dat in een groep van 23 personen, minstens twee personen dezelfde verjaardag hebben. Het gaat hierbij niet om een logische paradox — er valt nergens een tegenstrijdigheid te bespeuren — maar de observatie op zichzelf is contra-intuïtief. 

verjaardagsparadox
De verjaardagenparadox: $$p(n)$$ geeft de waarschijnlijkheid dat in een groep van $$n$$ personen er twee of meer op dezelfde datum jarig zijn; $$q(n)$$ geeft de waarschijnlijkheid dat in een groep van $$n$$ personen ten minste één op dezelfde datum jarig is als een van tevoren gekozen persoon (bv. uzelf). Op de horizontale as $$n$$, op de verticale as de waarschijnlijkheid (van 0 tot 1, oftewel van 0% tot 100%).

Denk bijvoorbeeld aan een klas van 30 studenten. De meeste mensen denken dat het eerder toeval is als twee studenten van die klas op dezelfde dag jarig zijn. Maar dat is het allerminst. De kans dat het gebeurt is zelfs meer dan 70%.

De beste dataset om de verjaardagsparadox te testen, was deze zomer wellicht te vinden op de wereldbeker voetbal in Brazilië. Aan de eindronde van dit toernooi namen 32 landenploegen deel, die elk bestonden uit 23 spelers. Als de verjaardagsparadox waar is, dan verwachten we dat ongeveer 50% van de landenploegen minstens twee spelers hebben die op dezelfde dag jarig zijn.

Om dat te testen, hebben we uit de officiële ploegenlijst van de FIFA enkele gegevens over de spelers verzameld. We hebben daarbij de gegevens van alle spelers van een ploeg opgeslagen in een tekstbestand. Elke regel van zo een bestand bevat de volgende gegevens van een speler: i) naam, ii) landenploeg, iii) rugnummer, iv) positie op het veld (GK=doelman, DF=verdediger, MF=middenvelder, FW=aanvaller), v) geboortedatum (JJJJ-MM-DD), vi) aantal caps en vii) ploeg. Deze informatievelden worden telkens van elkaar gescheiden door een komma (,). Bij wijze van voorbeeld staan hieronder de eerste regels van het bestand france.txt2 dat informatie bevat over de spelers van het Franse elftal.

Hugo Lloris,France,1,GK,1986-12-26,57,Tottenham Hotspur
Mathieu Debuchy,France,2,DF,1985-07-28,21,Newcastle United
Patrice Evra,France,3,DF,1981-05-15,58,Manchester United
Raphaël Varane,France,4,DF,1993-04-25,6,Real Madrid
Mamadou Sakho,France,5,DF,1990-02-13,19,Liverpool
Yohan Cabaye,France,6,MF,1986-01-14,30,Paris Saint-Germain

Opgave

In deze opgave werken we steeds met tekstbestanden die informatie bevatten over alle spelers van een voetbalelftal op het wereldkampioenschap voetbal. Deze informatie over de spelers is opgemaakt volgens het formaat dat werd beschreven in de inleiding. Alle tekstbestanden gebruiken UTF-8 codering (zie hieronder). Gevraagd wordt:

Unicode bestanden

Unicode is een internationale standaard voor de codering van binaire codes naar grafische tekens en symbolen, vergelijkbaar met de ASCII-standaard. De Unicode tekenset is echter veel uitgebreider dan de 256 symbolen van de ASCII-tekenset. Unicode ondersteunt een aantal mogelijke coderingen voor de tekenset, die aangeven hoe de symbolen binair voorgesteld worden. Als je in Python een Unicode bestand wilt openen, dan kan de gebruikte codering doorgegeven worden aan de parameter encoding van de ingebouwde functie open. Om bijvoorbeeld informatie te lezen uit het Unicode bestand france.txt3 dat gebruikt maakt van UTF-8 codering, kan het bestand als volgt geopend worden:

>>> open('france.txt', 'r', encoding='utf-8')

Voorbeeld

Bij onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden algeria.txt4, belgium.txt5 en france.txt6 zich in de huidige directory bevinden.

>>> jarigen = verjaardagen('france.txt')
>>> jarigen['02-13']
{'Mamadou Sakho', 'Eliaquim Mangala'}
>>> jarigen['03-08']
{'Rio Mavuba', 'Rémy Cabella'}

>>> verjaardagsparadox('france.txt')
True
>>> verjaardagsparadox('belgium.txt')
False

>>> testparadox([('Algerije', 'algeria.txt'), ('België', 'belgium.txt'), ('Frankrijk', 'france.txt')])
{'Algerije', 'Frankrijk'}

Bronnen

J. Fletcher (2014). The birtday paradox at the World Cup. BBC News Magazine. 7