Chi-Quadrat-Kurve aus Münzwürfen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Bob Billsworth
User
Beiträge: 11
Registriert: Freitag 12. Juni 2015, 00:01

Hallo Zusammen :D

Ich bin im Netz auf folgende Leseprobe gestoßen:

http://www.springer.com/cda/content/doc ... p176976174

Sie stammt aus dem Buch „Statistik für Anwender“ mit dem Untertitel „Statistik aus der Münze“. Die Idee, die statistischen Standardverteilungen aus Münzwürfen herzuleiten, finde ich genial. Ich habe folgenden Code zur Reproduktion der Prozedur Nr.4 (Chi-Quadrat-Kurve) ausprobiert:

Code: Alles auswählen

from matplotlib import pyplot as plt
import random

n = 500000
n2 = 10
delta = 1.6

random.seed()

zw2sammlung = []

for i in range(n):
    for i2 in range(n2):
        x = 0
        xse = []
        for i3 in range(n2):
            x += random.randint(0,1)
        xse.append(x/n2)
    zw2sammlung.append(xse)

xdds = []

for liste in zw2sammlung:
    xdds.append(sum(liste)/n2)

chis = []

for i in range(len(xdds)):
    sq = 0
    for item in zw2sammlung[i]:
        sq += (item-xdds[i])**2
    chis.append(((n2-1)*(sq/(n2-1)))/(0.25/n2))

preYAchse = []
skalalevel = min(chis)

while skalalevel < max(chis):
    skalalevel += delta
    preYAchse.append(skalalevel)

yAchse = []
xAchse = []

for i in range(len(preYAchse)):
    if i == 0:
        cnt = 0
        for chi in chis:
            if chi < preYAchse[i]:
                cnt += 1
        yAchse.append((cnt/n)/delta)
        xAchse.append(preYAchse[i]/2)
    else:
        cnt = 0
        for chi in chis:
            if chi > preYAchse[i-1] and chi < preYAchse[i]:
                cnt += 1
        yAchse.append((cnt/n)/delta)
        xAchse.append(preYAchse[i-1]+((preYAchse[i]-preYAchse[i-1])/2))
    
plt.plot(xAchse,yAchse, color="green", marker="o", linestyle="solid")
plt.title("")
plt.show()
Störend in der Ausgabe sind die vielen „Null“-Punkte. Zudem scheinen insgesamt die Datenpunkte nicht denen in der Abbildung 2.9 (9 Freiheitsgrade) des Buches zu entsprechen. Ich könnte entweder die Prozedur falsch verstanden oder irgendetwas falsch implementiert haben; vielleicht auch beides.

Für Eure Hilfe danke ich Euch im Voraus.
Bob Billsworth
User
Beiträge: 11
Registriert: Freitag 12. Juni 2015, 00:01

Habe es herausgefunden. 8)

Die Leseprobe hat wahrscheinlich einen Schreib- bzw. Druckfehler. In Schritt Nr.2 müßte es 5.000.000mal heißen, damit in Schritt Nr.3 die 500.000mal stimmen. Alternativ könnte es auch in Schritt Nr.3 einfach nur 50.000mal heißen, damit in Schritt Nr.2 die 500.000mal stimmen.

Richtigerweise müsste der Code für 9 Freiheitsgrade daher lauten:

Code: Alles auswählen

from matplotlib import pyplot as plt
import random

n = 500000
n2 = 10
delta = 1.6

random.seed()

xds = []
for i in range(n):
    x = 0
    for i2 in range(n2):
        x += random.randint(0,1)
    xds.append(x/n2)

chis = []
for i in range(int(n/n2)):
    stp = []
    for i2 in range(n2):
        stp.append(xds.pop(-1))
    xdd = (sum(stp)/n2)
    abw = 0
    for item in stp:
        abw += (item-xdd)**2
    sdd = abw/(n2-1)
    chis.append(((n2-1)*sdd)/(0.25/n2))
    
preYAchse = []
skalalevel = min(chis)

while skalalevel < max(chis):
    skalalevel += delta
    preYAchse.append(skalalevel)

yAchse = []
xAchse = []

for i in range(len(preYAchse)):
    if i == 0:
        cnt = 0
        for chi in chis:
            if chi < preYAchse[i]:
                cnt += 1
        yAchse.append((cnt/n)/delta)
        xAchse.append(preYAchse[i]/2)
    else:
        cnt = 0
        for chi in chis:
            if chi > preYAchse[i-1] and chi < preYAchse[i]:
                cnt += 1
        yAchse.append((cnt/n)/delta)
        xAchse.append(preYAchse[i-1]+((preYAchse[i]-preYAchse[i-1])/2))
    
plt.plot(xAchse,yAchse, color="green", marker="o", linestyle="solid")
plt.title("")
plt.show()
Antworten