Criando dados falsos

Uma das tarefas mais divertidas em estatística e análise de dados é gerar dados falsos, aleatórios, para fazer simulações. Isso normalmente acontece quando estamos interessados em testar alguma ideia ou fazer alguma comparação entre diferentes métodos ou situações.

Suponha que você queira montar um conjunto de dados sobre preços de 100 produtos diferentes em três supermercados concorrentes.

O numpy é o pacote que te permite gerar dados aleatórios.

Suponha que você queira 10 preços variando entre 15 e 100 reais com duas casa decimais.
Basta o seguinte comando:

In [1]:
%matplotlib inline
import pandas as pd
import numpy as np                 # aqui está o numpy
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='whitegrid')
In [5]:
np.random.uniform(low=15, high=100, size=10).round(2)
Out[5]:
array([ 23.75,  93.21,  41.4 ,  22.51,  20.78,  93.76,  85.  ,  55.25,
        35.62,  73.7 ])

A cada vez que você executá-lo ele gerará valores diferentes. Experimente.

Como ele está usando a distribuição uniforme, todos os valores de 15 a 100 têm a mesma probabilidade de serem selecionados.

Para nossos supermercados, vamos usar a distribuição normal. Isso nos permite indicar a média e o desvio padrão, permitindo que simulemos estabelecimentos com diferentes níveis de preços.

In [13]:
supermercado1 = np.random.normal(30, 30, 100).round(2) + 50

supermercado2 = np.random.normal(20, 10, 100).round(2) + 20

supermercado3 = np.random.normal(40, 5, 100).round(2) + 10
In [14]:
df = pd.DataFrame({
    'supermercado1': supermercado1,
    'supermercado2': supermercado2,
    'supermercado3': supermercado3 
})
In [15]:
df.head()
Out[15]:
supermercado1 supermercado2 supermercado3
0 21.15 34.37 50.04
1 62.59 49.32 45.28
2 91.04 24.26 49.97
3 73.66 35.97 52.91
4 84.90 43.29 56.88
In [16]:
df.describe()
Out[16]:
supermercado1 supermercado2 supermercado3
count 100.000000 100.000000 100.000000
mean 79.302100 39.406300 49.464500
std 30.898887 9.734536 5.498117
min 0.340000 16.740000 35.150000
25% 58.697500 31.802500 45.662500
50% 80.030000 39.790000 48.940000
75% 104.060000 45.612500 53.597500
max 143.470000 61.190000 62.680000
In [17]:
sns.pairplot(df);

Gerando números aleatórios a partir de diferentes distribuições estatísticas

In [37]:
dados = np.random.uniform(0, 1, 1000)

plt.hist(dados);
In [38]:
dados = np.random.normal(0, 1, 1000)

plt.hist(dados);
In [44]:
dados = np.random.chisquare(3, size=1000)

plt.hist(dados);
In [40]:
dados = np.random.binomial(100, .1, size=100)

plt.hist(dados)
plt.xlim(0, 100);
In [107]:
fig, ax = plt.subplots(3, 1, sharex=True, figsize=(5, 10))

p = [0.1, 0.5, 0.9]
lista = [0, 1, 2]

for i, j in zip(p, lista):
    dados = np.random.binomial(100, i, size=100)
    ax[j].hist(dados)
In [2]:
fig, ax = plt.subplots(3, 2, sharex=True, figsize=(10, 10))
ax = ax.flatten()

n = [10, 50, 100, 500, 1000, 10000]
lista = list(range(len(n)))

for i, j in zip(n, lista):
    dados = np.random.uniform(size=i)
    ax[j].hist(dados)
    ax[j].annotate('n = '+str(i), xycoords='axes fraction', xy=(.7, .9))
In [3]:
fig, ax = plt.subplots(3, 2, sharex=True, figsize=(10, 10))
ax = ax.flatten()

n = [10, 50, 100, 500, 1000, 10000]
lista = list(range(len(n)))

for i, j in zip(n, lista):
    dados = np.random.normal(size=i)
    ax[j].hist(dados)
    ax[j].annotate('n = '+str(i), xycoords='axes fraction', xy=(.7, .9))