Dieser Artikel ist der 14. Tagesartikel von Python Advent Calendar 2015.
Eine Methode, die einen zufälligen Wert zurückgibt, kann getestet werden, z. B. wenn der Test nicht bestanden wird, wenn die Ergebnisse um einen bestimmten Betrag vom erwarteten Ergebnis abweichen. Ich habe ein Programm geschrieben und mich gefragt, ob es statistisch getestet werden kann.
Unit Test Eine Methode, die mithilfe des Chi-Quadrat-Tests einen zufälligen Wert zurückgibt.
Wenn Sie beispielsweise ein Programm schreiben, das einen Würfel wirft und zufällig 1 bis 6 zurückgibt, ist dies wie folgt.
dice.py
# -*- coding: utf-8 -*-
import random
class Dice(object):
def throw(self):
return random.randint(1, 6)
Der Code zum Testen sieht folgendermaßen aus:
test_dice.py
# -*- coding: utf-8 -*-
import collections
import unittest
import dice
from scipy import stats
class TestDice(unittest.TestCase):
def setUp(self):
self.__target = dice.Dice()
def test_throw(self):
#6000 Mal ausführen
result = [self.__target.throw() for n in range(0, 6000)]
#Aggregation der Ausführungsergebnisse
counted = collections.Counter(result)
#Überprüfen Sie, ob unregelmäßige Augen vorhanden sind
self.assertItemsEqual([1, 2, 3, 4, 5, 6], counted.keys())
#Führen Sie einen Chi-Quadrat-Test mit Signifikanzstufe 1 durch%Wenn die Nullhypothese, dass keine Verzerrung vorliegt, zurückgewiesen werden kann, schlägt der Test fehl.
#Fast jedes Auge sollte ungefähr 1000 Mal erscheinen, und wenn es erheblich davon abweicht, wird es versagen.
chi_square_value, p_value = stats.chisquare(
[counted[1], counted[2], counted[3], counted[4], counted[5], counted[6]],
f_exp=[1000, 1000, 1000, 1000, 1000, 1000]
)
self.assertLess(0.01, p_value)
Das stats
Modul von scipy
ist erforderlich. Wenn es nicht installiert ist, installieren Sie es mit pip
.
$ pip install numpy
$ pip install scipy
Führen Sie es eine bestimmte Anzahl von Malen aus (diesmal 6000 Mal) und aggregieren Sie die Ausführungsergebnisse. Zum Beispiel ist das 1. Auge 1007-mal, das 2. Auge 1050-mal und so weiter.
Ist es möglich, die Differenz zwischen der Gesamtzahl und dem theoretischen Wert, in diesem Fall 1000 Mal für jeden Wurf, zu testen und die Nullhypothese abzulehnen, dass "die Häufigkeit des Würfelns gleich ist"? Herausfinden.
Wenn die Nullhypothese zurückgewiesen werden kann, bedeutet dies, dass das Ergebnis nicht Ihren Erwartungen entspricht und der Test fehlschlägt. Im Gegenteil, wenn es nicht abgelehnt werden kann, ist der Test bestanden.
Selbst statistische Tests schlagen immer noch fehl, wenn Sie Pech haben. Daher kann es schwierig sein, tatsächlich zu arbeiten.
Durch Verringern des Signifikanzniveaus wird die Anzahl der Muster verringert, bei denen der Test fehlschlägt, obwohl er tatsächlich korrekt ist. Im Gegenteil, der Test schlägt nicht mit einer geringfügigen Abweichung fehl, sodass die Anzahl der Einsen tatsächlich geringfügig höher war als die anderen. Kann nicht erkannt werden.
Umgekehrt erhöht das Erhöhen des Signifikanzniveaus das Muster der tatsächlich korrekten Testfehler. Es können jedoch auch kleine Abweichungen festgestellt werden.
Tests mit zu vielen Fehlern werden nicht wie gewohnt betrachtet, daher denke ich, dass es besser ist, sie mit einem niedrigen Signifikanzniveau durchzuführen, wenn sie tatsächlich betrieben werden.
Recommended Posts