Simuler des données en python

1- Utiliser le module numpy pour simuler des jeux de données selon différentes loi (uniforme, normale...)

  • On peut simuler des valeurs avec le module numpy

import numpy as np # Chargement du module

np.random.seed(6) # fixer la position du générateur aléatoire pour pouvoir répéter une simulation d'un jeu de données

x = np.random.normal(size=10) # Simuler 10 valeurs centrées autour de 0 selon la loi normale

loi normale

  • On peut aussi directement charger uniquement les fonctions random de numpy

from numpy.random import *

print(dir(rd)) # Afficher le nom des fonctions disponibles dans rd

x = normal(loc=10, scale=2.0, size=20) # 20 valeurs selon la loi normale, moyenne : 10, écart-type : 2

y = binomial(n=100, p=0.2, size=20) # 20 valeurs correspondant aux pourcentages qu'on aurait sur 20 échantillons de 100 individus prélevès dans une population où le pourcentage est de 20%

loi binomiale

  • Autre exemple de génération de valeurs aléatoires avec numpy :

from numpy.random import *

from numpy import * # permet de charger arange qui génère des rangs de valeurs et abs

data = {'a': arange(50), # 50 valeurs de 0 à 50

'c': randint(0, 50, 50), # 50 valeurs dans le désordre de 0 à 49

'd': randn(50)} # 50 valeurs autour de 0 (selon la loi normale)

data['b'] = data['a'] + 10 * randn(50)

data['d'] = abs(data['d']) * 100 # mise en absolue

print(data)

# pour mieux visualiser, convertir le tout en dataframe pandas

from pandas import *

data = DataFrame(data) ; print(data.head())

Remarque importante : les valeurs simulées sont au format array. Il faut envisager de les convertir avec la fonction list() ou inversement en array() :

import numpy.random as * # pour la fonction normale

poids = list(normal(loc=65, scale=6, size=8)) ; print(poids) # 8 poids autour de 65 kh, écart-type de 6

# ou l'inverse :

import numpy as np # pour la fonction array

poids = np.array(poids) ; print(poids)

Pourquoi faire cela : car on peut faire des calculs directement sur les arrays (alors qu'il faudra faire valeur par valeur pour une liste) et facilement concaténer les listes.

Exemple : sur ce jeu de données simulées :

from numpy import random as rd

age = [18,19,20,18,19,20,17,23]

sx = ["M","F"]*4

poids = list(rd.normal(loc=65, scale=6, size=8))

Si je veux arrondir les valeurs d'une liste, je dois faire une boucle :

for i in range(len(poids)) :

poids[i] = round(poids[i],0)

poids[i] = int(poids[i])

Et si je voulais arrondir les valeurs d'une array, ce serait plus simple :

import numpy as np

poids = np.array(poids)

poids.round(0)

2- Faire des suites de nombres

  • Faire une suite répétée de valeurs

    • Ecriture simple mais limitée :

# Une séquence de "M" et "F" cinq fois de suite

c = ["M","F"]*5 ; print(c)

    • Ecriture plus complexe mais où je répète ce que je veux (il faut le module numpy)

sx = ["M","F"] # Je veux répéter 5 fois "M", puis 5 fois "F"

import numpy as np

sx = [np.repeat(sx, [5, 5]),"M"] # dernier "M" pour un ajouter un à la fin.

Le plus simple dans cet exemple est encore de faire cela :

sx = ["M"]*5 + ["F"] * 5 + ["M"] # Et j'ajoute un "M" pour le plaisir.

  • Faire une série de nombre avec range()

x = range(1,10,2) ; list(x) ; print(x) # Un range de valeurs de 1 à 10 par pas de 2 (de 1 à 9 donc)

  • Organiser des séries complexes plus simplement qu'avec la fonction range() limitée.

import numpy as np # il faut importer le module numpy

# Série allant de 0 à 5 par pas de 0.2

t = np.arange(0., 5., 0.2) # mieux que range !

3- Charger des jeux de données déjà disponibles

import seaborn as sns # nécessite dte le module seaborn

#

tips = sns.load_dataset("tips")

df = sns.load_dataset('iris') # Charger le jeu de données iris