Méthodes de test qui renvoient des valeurs aléatoires en Python

Cet article est l'article du 14ème jour du Calendrier de l'Avent Python 2015.

Une méthode qui renvoie une valeur aléatoire peut être testée, comme l'échec du test si les résultats s'écartent d'un certain montant du résultat attendu. J'ai écrit un programme en me demandant s'il pouvait être testé statistiquement.

Test unitaire une méthode qui renvoie une valeur aléatoire à l'aide du test du chi carré.

la mise en oeuvre

Par exemple, si vous écrivez un programme qui lance un dé et renvoie 1 à 6 au hasard, ce sera comme suit.

dice.py


# -*- coding: utf-8 -*-

import random

class Dice(object):
    def throw(self):
        return random.randint(1, 6)

Le code pour tester cela ressemble à ceci:

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):
        #Exécutez 6000 fois
        result = [self.__target.throw() for n in range(0, 6000)]
        #Agrégation des résultats d'exécution
        counted = collections.Counter(result)
        #Vérifiez s'il y a des yeux irréguliers
        self.assertItemsEqual([1, 2, 3, 4, 5, 6], counted.keys())
        #Effectuer un test du chi carré, niveau de signification 1%Si l'hypothèse nulle selon laquelle il n'y a pas de biais peut être rejetée, le test échoue.
        #Environ 1000 yeux devraient apparaître, et s'il y a un écart significatif par rapport à cela, cela échouera.
        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)

Le module stats de scipy est requis, donc s'il n'est pas installé, installez-le avec pip.

$ pip install numpy
$ pip install scipy

Commentaire

Exécutez-le un nombre spécifique de fois (6000 fois cette fois) et agrégez les résultats de l'exécution. Par exemple, le 1er œil est 1007 fois, le 2ème œil 1050 fois, et ainsi de suite.

Est-il possible de tester la différence entre le nombre total de fois et la valeur théorique, et dans ce cas, 1000 fois pour chaque jet, et de rejeter l'hypothèse nulle que "le nombre de fois que les dés lancent est le même"? Découvrir.

Si l'hypothèse nulle peut être rejetée, cela signifie que le résultat n'est pas celui que vous attendiez et le test échouera. Au contraire, s'il ne peut pas être rejeté, le test est réussi.

point important

Même les tests statistiques échoueront toujours si vous n'êtes pas chanceux, il peut donc être difficile de fonctionner.

Abaisser le niveau de signification réduit le nombre de modèles dans lesquels le test échoue même s'il est en fait correct, mais au contraire, le test n'échoue pas avec un léger écart, de sorte que le nombre de 1 était en fait légèrement plus élevé que les autres. Peut ne pas être détecté.

Inversement, l'augmentation du niveau de signification augmente le modèle d'échecs de test qui sont réellement corrects. Cependant, même de petits écarts peuvent être détectés.

Les tests avec trop d'échecs ne seront pas considérés comme d'habitude, donc je pense qu'il est préférable de le faire avec un niveau de signification faible lors de son fonctionnement.

Page référencée

Recommended Posts

Méthodes de test qui renvoient des valeurs aléatoires en Python
Marche aléatoire en Python
Échange de valeurs en Python
Méthodes d'objet chaîne en Python
Utiliser Random Forest avec Python
Choix aléatoire pondéré en python
Appeler dynamiquement des méthodes en Python
Transférer les valeurs des paramètres en Python
Définir dynamiquement des fonctions (méthodes) en Python
Créer une chaîne aléatoire en Python
Une classe qui résume les méthodes fréquemment utilisées dans l'api twitter (python)
Mettre en œuvre collectivement des tests d'hypothèses statistiques en Python
Méthodes et champs privés en python [chiffrement]
Résumé des méthodes intégrées, etc. de la liste Python
Classification des maladies par Random Forest en utilisant Python
[Python] Classification des maladies dans une forêt aléatoire-avec LDA-
[Python] Un programme qui trouve les valeurs minimales et maximales sans utiliser de méthodes
Une doublure qui produit quatre-vingt-dix-neuf en Python
Dessiner des lignes de contour qui apparaissent dans les manuels (Python)
Un mémo que j'ai écrit un tri rapide en Python
Créer un environnement qui utilise Python avec Eclipse
Un programme qui supprime les instructions en double en Python
Vérification de type statique qui démarre vaguement en Python
Remplissez les valeurs des variables dynamiques avec 0 en Python
Celui qui affiche la barre de progression en Python
Formules qui apparaissent dans Faire des mathématiques avec Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Retour anticipé de Python
Python: valeurs Tips-Swap
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv