Estatística e programação

Probabilidade e batatinhas!

No artigo de hoje vou falar um pouco sobre como não é necessário conhecer a distribuição de uma variável aleatória para dizer algo sobre um fenômeno probabilístico. Vamos lá?

Certo dia tive uma ideia meio doida enquanto comia a famosa batata do Messi, a batata Lay’s. Na época eu estava inscrito na disciplina de probabilidade 1 e só sabia falar disso o tempo inteiro, minha família e amigos provavelmente não aguentavam mais. Pois bem, o que me chamou a atenção ao abrir aquele pacote de batatinhas foi perceber a volta dos tazos(sim!). Se você foi criança entre os anos 90 e anos 2000, com certeza sabe a febre que foram os tazos e como se fazia de tudo para completar uma coleção. Para o - não tão glorioso - retorno dos tazos, a Elma Chips escolheu como tema as bolas usadas em finais de Champions League, a maior competição de futebol da Europa.

Tá, mas o que tem de interessante nisso?

Digamos que você seja muito fã de futebol e quer juntar os tazos. A economia do país não está nenhuma maravilha, então será que vale a pena gastar seu dinheiro suado só para completar essa coleção? Quantos sacos de batatinhas alguém precisa comprar para ter todos os tazos distintos em mãos?

Não é possível obter uma resposta exata para a pergunta, já que os tazos são sortidos. Contudo, podemos pensar na questão de forma probabilística.

Nós queremos o número de sacos de batatas comprados até se obter todos os tazos distintos, sabendo que são 20 tazos diferentes(20 finais de Champions League). E é assim que construiremos a variável aleatória de interesse. Porém, aparentemente essa variável aleatória não é definida por nenhuma das principais distribuições conhecidas.

Ao final dessa reflexão, temos as seguintes informações:

  • A variável aleatória: X = “número de tentativas necessárias até conseguir completar a coleção”.
  • Existem 20 tazos distintos.
  • É difícil encontrar uma expressão analítica para a distribuição de X(imagina fazer operações com ela).

Se não dá para obter diretamente f(x), então ferrou, né?

Não! Calma, ainda há esperança. Literamente há esperança, podemos obter \(E[X]\) por simulação e a partir disso saber mais sobre X. Usaremos o Python para aleatorizar o experimento, repeti-lo 100 mil vezes e por fim calcular o número médio de tentativas para completar a coleção de tazos.

Usei dois jeitos para fazer a simulação, da forma mais preguiçosa possível e depois com o pacote Numpy.

Jeito preguiçoso

import random as rd
import statistics as st

def colecionarTazos(experimentos, colecionaveis):

    obtidos = []
    tentativas = 0

    while(len(obtidos) < colecionaveis):

        novo_tazo = rd.randint(1, colecionaveis)
        if novo_tazo not in obtidos:
            obtidos.append(novo_tazo)
        tentativas += 1

    experimentos.append(tentativas)


experimentos = []
colecionaveis = 20
rep_experimento = 100000


for i in range(1, rep_experimento):
    colecionarTazos(experimentos, colecionaveis)

print(st.mean(experimentos))
Resultado no console
72.06983069830699
[Finished in 13.8s]

Usando o numpy

import random as rd
import numpy as np

experimentos = np.array([])
rep_experimento = 100000


for i in range(1, rep_experimento):
    obtidos = np.array([])
    tentativas = 0
    while(len(obtidos) < 20):

        novo_tazo = rd.randint(1, 20)
        if novo_tazo not in obtidos:
            obtidos = np.append(obtidos, novo_tazo)
        tentativas += 1

    experimentos = np.append(experimentos, tentativas)

print(np.mean(experimentos))
Resultado no console
72.03112031120311
[Finished in 54.2s]

Observações

Estranhamente o numpy foi absurdamente mais lento, não sei se foi um problema da minha máquina ou da forma em que o código foi escrito. Se alguém souber o motivo e quiser entrar em contato, eu ficaria muito feliz!

EDIT

Fiz uma pergunta no stackoverflow e me mostraram como não dá para pensar em um numpy array como uma lista, é preciso adaptar o código de outra forma.

Aqui estão as respostas completas.

Esquecendo um pouco o tempo de execução, perceba que nos dois casos a média parece estar convergindo para 72. Logo, é razoável supor que \(E[X] = 72\). Isso quer dizer que você precisa em média comprar 72 sacos de batatinhas para completar a coleção de tazos. Uau! isso por si só já é bem interessante, mas o que mais podemos dizer de X?

Desigualdade de Markov

Existem algumas desigualdades importantes na Teoria das Probabilidades que podem ser usadas para encontrar limites superiores e inferiores para a probabilidade de um evento ocorrer. Uma delas é a desigualdade de Markov, que é dada por:

\[P(X \geq k) \leq \frac{E[X]}{k}\]

Ou seja, no pior dos casos possíveis, qual a probabilidade da quantidade de sacos comprados ultrapassar certo valor? Digamos que cada um custe R$6, e você quer gastar no máximo R$ 600, ou seja, 100 sacos. Usando a desigualdade de markov:

\[P(X \geq 100) \leq \frac{72}{100} = 0.72\]

Na pior das hipóteses, você vai ter que pagar mais que 600 reais para completar sua coleção com probabilidade 0.72. Porém, essa “pior hipótese” não é muito próxima do que realmente pode acontecer, nesses casos também é bom olhar para o desvio padrão ou até mesmo outras desigualdades. Para não estender muito o post, fica para outra oportunidade.

Espero que tenham gostado da publicação, até a próxima!