Simulere uttrekk av elevers karakter fra tilfeldig normalfordelt skole
Forskere ønsker å undersøke matematikkunnskapene til elever i videregående skole. Elever fra tre store skoler skal være med i undersøkelsen.
Karakterstatistikk fra de tre skolene viser at karakterene i matematikk er tilnærmet normalfordelt. Tabellen nedenfor viser forventningsverdi og standardavvik for hver av de tre skolene.
| Skole | Forventningsverdi | Standardavvik |
|---|---|---|
| Skole A | 3,8 | 1,2 |
| Skole B | 3,4 | 1,4 |
| Skole C | 4,1 | 1,1 |
Forskerne skal trekke ut 20 elever. For hver elev de skal trekke, trekker de først en tilfeldig skole og deretter en tilfeldig elev fra den skolen.
- Lag et program som simulerer gjennomsnittskarakteren til 20 elever som er valgt ut på denne måten.
- Bruk simuleringer til å estimere sannsynligheten for at karaktersnittet til de 20 elevene er høyere enn 4.
Fasit
b) \(P(X>4)\approx 0{,}205\)
Løsningsforslag
a
from random import randint, gauss
# henter nødvendige pakker for uniform fordeling og normalfordeling
n = 20
sum_karakterer = 0
for i in range(n):
# trekker et tilfeldig tall fra 1 til 3. Dette tilsvarer
# skole A, B og C
skole = randint(1,3)
if skole == 1:
# hvis det tilfeldige tallet er 1, så skal vi trekke
# tilfeldig elev fra skole A. I dette tilfellet har
# normalfordelingen my = 3.8 og sigma = 1.2
# # vi trekker en tilfeldig elev med gauss(mu, sigma)
elev = gauss(3.8, 1.2)
elif skole == 2:
elev = gauss(3.4, 1.4)
else:
elev = gauss(4.1, 1.1)
# vi legger til elevens karakter på summen
sum_karakterer += elev
print(f"Gjennomsnittskarakteren til de {n} elevene er {sum_karakterer/n:.3f}.")
b
from random import randint, gauss
# henter nødvendige pakker for uniform fordeling og normalfordeling
N = 10_000
antall_gunstige = 0
for j in range(N):
n = 20
sum_karakterer = 0
for i in range(n):
# trekker et tilfeldig tall fra 1 til 3.
# Dette tilsvarer skole A, B og C
skole = randint(1,3)
if skole == 1:
# hvis det tilfeldige tallet er 1, så skal vi trekke
# tilfeldig elev fra skole A. I dette tilfellet har
# normalfordelingen my = 3.8 og sigma = 1.2
# vi trekker en tilfeldig elev med gauss(mu, sigma)
elev = gauss(3.8, 1.2)
elif skole == 2:
elev = gauss(3.4, 1.4)
else:
elev = gauss(4.1, 1.1)
# vi legger til elevens karakter på summen
sum_karakterer += elev
if sum_karakterer/n > 4:
# hvis snittkarakteren er over 4 så har vi et gunstig utfall
antall_gunstige += 1
print(f"Etter {N} simuleringer estimerer jeg at sannsynligheten for at"
f"gjennomsnittskarakteren er over 4 til {antall_gunstige/N:.4f}.")
Jeg brukte \(10\,000\) simuleringer og testet programmet noen ganger. Jeg så at estimatene mine lå mellom 0,200 og 0,210. Siden avvikene er små og programmet allerede bruker 6-7 sekunder på å kjøre, så velger jeg å ikke øke antall simuleringer, \(N\), for å oppnå bedre nøyaktighet.
Sannsynligheten for at gjennomsnittskarakteren til de 20 elevene er over 4 er estimert til 0,205 ved hjelp av programmet over.