Ich bin übrigens neu in Python. Ich habe gehört, dass Python eine saubere Grammatik hat, reichlich Bibliotheken hat und mächtig ist, deshalb habe ich beschlossen, in den Ferien zum Jahresende ein bisschen zu beißen.
Wenn Sie etwas studieren möchten, sollten Sie ein bestimmtes Fach / Problem haben. Deshalb habe ich mich entschlossen, es auf den Inhalt des Statistikbuchs zu stützen, das ich kürzlich gelesen habe.
** Kapitel 1 Die Praxis der Statistik beginnt mit einer Überprüfung der Grundlagen ** 05 Warum kann der Durchschnittswert die Wahrheit erfassen?
In diesem Kapitel gibt es einige Beispiele für die Verwendung von "Münzen mit einer 2/3 Chance auf die Rückseite und einer 1/3 Chance auf die Vorderseite". Also habe ich mich entschieden, Python zu verwenden, um tatsächlich viele Male "Münzen" zu werfen (obwohl es natürlich eine Simulation ist) und zu sehen, ob das Ergebnis mit dem Beispiel übereinstimmt. (Für Details kaufen Sie bitte ein Buch oder leihen Sie es aus der Bibliothek aus. Es ist der Teil von P59 bis P64.)
Die verwendete Version von Python ist 2.7. Ich habe es so eingegeben, wie mir gesagt wurde, als ich im Sommer ein Python-Seminar erhielt [Spyder](https://ja.wikipedia.org/wiki/Spyder_(%E3%82%BD%E3%83%95%). E3% 83% 88% E3% 82% A6% E3% 82% A7% E3% 82% A2)) wurde installiert, also habe ich es verwendet.
Zuerst habe ich mit Python experimentiert und ein Beispiel für die Wahrscheinlichkeit aller Kombinationen beim zweimaligen Werfen einer Münze gegeben.
Mögliche Kombinationen sind: Rücken / Rücken (vorne 0) Rückseite / Vorderseite (1 Vorderseite) Vorder- / Rückseite (1 Vorderseite) Tabelle / Tabelle (2 Tabellen)
from random import randint
from decimal import Decimal
from prettytable import PrettyTable
import numpy as np
def tossBiasedCoin():
""" Returns 0 or 1 with 0 having 2/3 chance """
return randint(0,2) % 2
# Make a 2x2 array
counts = [[0 for j in range(2)] for i in range(2)]
# Toss a coin many times to get counts
sampleCount = 500000
for num in range(sampleCount):
first = tossBiasedCoin()
second = tossBiasedCoin()
counts[first][second] += 1
# Conert all counts to perentage
TWOPLACES = Decimal(10) ** -2
for i in range(2):
for j in range(2):
value = counts[i][j]
counts[i][j] = (100 * Decimal(counts[i][j])/Decimal(sampleCount)).quantize(TWOPLACES)
print("Converted the value {} to percentage {}".format(value, counts[i][j]))
# Make summaries of number of heads.
keys = np.arange(3)
values = [counts[0][0],
counts[0][1]+counts[1][0],
counts[1][1]]
# Add row descriptions
counts[0].insert(0, '1st tail')
counts[1].insert(0, '1st head')
# Create table with column descriptions, add rows, then show it.
table = PrettyTable(["", "2nd tail", "2nd head"])
table.padding_width = 1
table.add_row(counts[0])
table.add_row(counts[1])
print table
# Draw a bar chart
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
rects = plt.bar(keys,
values,
0.5,
alpha=0.4,
align="center",
color='b')
plt.xlabel('Number of heads')
plt.ylabel('Probability (%)')
plt.title('Probabilities heads with a biased coin')
plt.xticks(keys, np.arange(3))
plt.tight_layout()
plt.show()
Zunächst wird fast dieselbe Tabelle wie in Tabelle 1-17 auf Seite 59 angezeigt. 4 Kombinationen und ihre Wahrscheinlichkeiten. (Diese Tabelle verwendet PrettyTable. Siehe unten)
Der Grund, warum es schwierig ist, "Tisch / Tisch" zu kombinieren, ist, dass Sie Münzen verwenden, die eine Chance von 1/3 haben, überhaupt zu erscheinen.
Als Nächstes wird ein Balkendiagramm angezeigt, das fast dem Diagramm 1-18 auf Seite 60 entspricht.
Dies ist eine Sammlung von 4 Mustern in 3 nach "wie viele Tabellen erscheinen". Es gibt zwei Muster von "einer Vorderseite" (vorne / hinten) und (hinten / vorne), sodass sie zu einem kombiniert werden.
Importieren in die Ausführungsumgebung, z. B. die zu verwendende Funktion. Eine nützliche Bibliothek finden Sie in Python Standard Library, aber es gibt eine große Anzahl von Drittanbietern Die Bibliothek befindet sich im Repository mit dem Namen Python Package Index.
from random import randint
from decimal import Decimal
from prettytable import PrettyTable
import numpy as np
--Verwenden Sie den Randint des Moduls random, um Zufallszahlen zu generieren.
def tossBiasedCoin():
""" Returns 0 or 1 with 0 having 2/3 chance """
return randint(0,2) % 2
Es reicht nicht aus, es zu einer Funktion zu machen, sondern als Übung von Funktionsdefinition die Vorder- und Rückseite der Münze (1 oder 0) ) Wurde erstellt. Erzeugt eine von 0, 1 und 2 mit einer Zufallszahl, gibt 0 zurück, wenn der Wert gerade ist, und gibt ansonsten 1 zurück. Da zwei der drei Werte gerade sind, beträgt die Wahrscheinlichkeit 2/3.
Verwenden Sie 2x2 Sequenz, um die Häufigkeit des Auftretens aufzuzeichnen. In diesem Fall ist es vom Typ Liste.
# Make a 2x2 array
counts = [[0 for j in range(2)] for i in range(2)]
Initialisieren Sie jede Variable auf 0. für Anweisung ist eine der integrierten Funktionen [Bereichsfunktion](http: //docs.python) Die Schleife wird in der von (.jp / 2 / library / functions.html # range) erstellten Sofortliste ausgeführt. Um es 2x2 zu machen, erstellen Sie eine Liste mit Liste als Element.
Ich werde es 500.000 Mal hier werfen, aber ich frage mich, ob ich nicht so viel werfen muss (lacht)
# Toss a coin many times to get counts
sampleCount = 500000
for num in range(sampleCount):
first = tossBiasedCoin()
second = tossBiasedCoin()
counts[first][second] += 1
Das Ergebnis ist 0 oder 1, Sie können es also einfach als Index für eine 2x2-Struktur verwenden. Erhöhen Sie die Anzahl der indizierten Zellen um eins.
Übrigens scheint es in Python keinen ++ - Operator zu geben, der mit der C-Sprache vertraut ist. Klicken Sie hier, um eine Liste der Python-Operatoren anzuzeigen.
Teilen Sie die Häufigkeit durch die Gesamtzahl der Würfe, um den Prozentsatz zu erhalten.
# Convert all counts to perentage
TWOPLACES = Decimal(10) ** -2
for i in range(2):
for j in range(2):
value = counts[i][j]
counts[i][j] = (100 * Decimal(counts[i][j])/Decimal(sampleCount)).quantize(TWOPLACES)
print("Converted the value {} to percentage {}".format(value, counts[i][j]))
Da wir jede Zelle der 2x2-Struktur besuchen, werden wir eine Schleife mit den beiden Indizes i und j durchführen und auf den Wert einer beliebigen Zelle in Form von "[i] [j]" zugreifen. Die Werte werden direkt ersetzt, aber die Werte vor und nach der Konvertierung werden zum Debuggen angezeigt.
Decimal.quantize Runden Sie den Wert auf die letzten beiden Ziffern, indem Sie der Funktion "0.01" übergeben.
Das Balkendiagramm enthält drei Balken. 0 Tabellen, 1 Tabelle und 2 Tabellen.
# Make summaries of number of heads.
keys = np.arange(3)
values = [counts[0][0],
counts[0][1]+counts[1][0],
counts[1][1]]
Nur die Häufigkeit eines Tisches ist gleich, da es keine Rolle spielt, ob der Tisch die erste oder die zweite Münze ist.
Verwenden Sie list.insert auf der linken Seite der Liste, der ersten Reihe, und verwenden Sie "1. Wurf ist zurück" und "1. Wurf ist vorne". "Hinzugefügt.
# Add row descriptions
counts[0].insert(0, '1st tail')
counts[1].insert(0, '1st head')
Verwenden Sie eine Bibliotheksfunktion eines Drittanbieters namens PrettyTable.
# Create table with column descriptions, add rows, then show it.
table = PrettyTable(["", "2nd tail", "2nd head"])
table.padding_width = 1
table.add_row(counts[0])
table.add_row(counts[1])
print table
Verwenden Sie eine Bibliothek eines Drittanbieters, matplotlib. Diese Matplotlib scheint reich genug zu sein, um selbst ein Buch zu schreiben (siehe Galerie). Schreiben Sie Balkendiagramm mit pyplot in matplotlib.
# Draw a bar chart
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
rects = plt.bar(keys,
values,
0.5,
alpha=0.4,
align="center",
color='b')
plt.xlabel('Number of heads')
plt.ylabel('Probability (%)')
plt.title('Probabilities heads with a biased coin')
plt.xticks(keys, np.arange(3))
plt.tight_layout()
plt.show()
Recommended Posts