← Back to list

Distribuição de Poisson para tomada de decisão informada

A distribuição de Poisson é uma distribuição de probabilidade discreta usada para modelar a frequência de eventos que ocorrem em um…

Carolyne Soares · 2024-11-05 23:30 · 13 claps · 7.7 min read
#estatistica #python #180 #decision-making #data-science
Open on Medium ↗
Wiki topics: ML · Machine Learning 🔬 · Science · General

Distribuição de Poisson para tomada de decisão informada

A distribuição de Poisson é uma distribuição de probabilidade discreta usada para modelar a frequência de eventos que ocorrem em um intervalo contínuo fixo, como tempo, área ou volume. Esse modelo é especialmente útil para descrever eventos que ocorrem de forma aleatória e independente, como chamadas telefônicas recebidas por uma central em uma hora ou acidentes de trânsito em uma estrada por dia.

Conforme apontado por Ron Larson e Betsy Farber no livro Estatística Aplicada (Larson & Farber, 2015),para que um experimento seja adequadamente modelado por uma distribuição de Poisson, ele deve satisfazer algumas condições importantes: [1]

  • Eventos Contados em Intervalos Fixos: O experimento deve consistir em contar o número de vezes que um evento ocorre em intervalos contínuos, como tempo ou espaço.
  • Probabilidade Constante: A probabilidade de o evento ocorrer deve ser a mesma em intervalos de igual tamanho, independente da localização do intervalo.
  • Independência dos Eventos: A ocorrência de um evento em um intervalo não deve afetar a probabilidade de ocorrência em outro intervalo.
  • Baixa Probabilidade de Eventos Simultâneos: Em um intervalo muito pequeno, a probabilidade de ocorrer mais de um evento é próxima de zero. A fórmula que descreve a distribuição de Poisson é:

onde:

  • P(X=x) representa a probabilidade de observar exatamente x ocorrências no intervalo;
  • λ é a média de ocorrências esperadas (taxa média) no intervalo;
  • e é a base do logaritmo natural (aproximadamente 2,71828);
  • x! é o fatorial de x.

Essa abordagem é amplamente utilizada para prever a ocorrência de eventos em estudos de estatística aplicada, sendo particularmente útil para análise de dados em áreas como ciência de dados, qualidade e engenharia.

Estudo de Caso: Estimativa de Ocorrências de Violência Doméstica no Centro de Atendimento à Mulher

Em um centro de atendimento à Mulher, por meio do disque denúncia 180, a gestão solicitou ao analista de dados uma estimativa de quantas chamadas de denúncias de violência doméstica podem ser esperadas durante diferentes horas do dia. Essas informações são essenciais para auxiliar na alocação de recursos, definição de turnos de trabalho e planejamento da capacidade, garantindo que todas as chamadas sejam atendidas prontamente e de forma eficaz.

Primeiro Passo: Importando os dados

Os dados utilizados neste estudo de caso foram obtidos do portal de dados abertos do Ministério dos Direitos Humanos, disponíveis em https://www.gov.br/mdh/pt-br/acesso-a-informacao/dados-abertos/ligue180. Os dados abrangem o primeiro semestre de 2024.

Segundo Passo: Importar bibliotecas, ler os dados e verificações preliminares

#Importando as bibliotecas
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import poisson

#Lendo o arquivo CSV e visualizando as cinco primeira linhas
df= pd.read_csv("/content/drive/MyDrive/analise de dados violencia domestica/ligue180-primeiro-semestre-2024.csv", delimiter=";")
df.head()

Resultado:

linhas, colunas = df.shape

print(f"O DataFrame possui {linhas} linhas e {colunas} colunas.")

Resultado:

df.info()

Resultado:

Temos uma quantidade significativa de dados históricos (mais de 394.000 registros) que podemos utilizar para estimar as chamadas de denúncia no centro de atendimento à Mulher. Também é necessário converter a coluna de ‘Data_de_cadastro’ de objeto para o tipo de dado datetime para facilitar a análise temporal.

df['Data_de_cadastro']= pd.to_datetime(df['Data_de_cadastro'])
print(df['Data_de_cadastro'].dtype)

Resultado:

#extraindo informações específicas de data e hora da coluna 'Data_de_cadastro' do DataFrame df e criando duas novas colunas:
df['Hora'] = df['Data_de_cadastro'].dt.hour
df['Data'] = df['Data_de_cadastro'].dt.strftime('%Y-%m-%d')
df.head()

Resultado:

#Agrupando o DataFrame df com base nas colunas 'Data' e 'Hora', e exibindo o primeiro registro de cada grupo.
grouped_df = df.groupby(['Data', 'Hora'])
grouped_df.first()

Resultado:

Terceito passo: Análise exploratória de dados

Análises exploratórias de dados para compreendê-los e responder a algumas perguntas.

Qual o canal de atendimento mais utilizado?

# Contar a frequência de cada canal de atendimento
canal_mais_utilizado = df['Canal_de_atendimento'].value_counts()
canal_mais_utilizado

Canal telefônico é disparadamente o canal de atendimento mais utilizado.

Qual estado onde tem mais denúncias no 180?

estado_mais_violencia = df['UF'].value_counts()
estado_mais_violencia.head(5)

Resultado:

O estado de São Paulo (SP) apresenta o maior número de ocorrências de violência doméstica, com um total de 95.571 registros. Em seguida, temos o Rio de Janeiro (RJ) com 64.696 ocorrências, Minas Gerais (MG) com 39.771, Bahia (BA) com 26.982 e Rio Grande do Sul (RS) com 20.325.

Contando o número de atendimentos (ou ocorrências):

numero_atendimentos = grouped_df['Data_de_cadastro'].count().reset_index()
numero_atendimentos.columns= ['Data', 'Hora', 'numero_atendimentos']
numero_atendimentos.head(5)

Resultado:

# Usando o Pivot table para reorganizar os dados
relatorio = pd.pivot_table(data = numero_atendimentos,
              index='Data',
              columns='Hora',
              values='numero_atendimentos')
relatorio

Resultado:

#verificando se há valores nulos e somando caso haja
relatorio.isnull().sum()

# Substituindo os valores nulos por O
relatorio.fillna(0, inplace=True)
relatorio

Resultado:

Visualizando a Distribuição

relatorio_reset = relatorio.reset_index()
relatorio_final= pd.melt(relatorio_reset, id_vars=['Data'], value_vars=relatorio.columns, var_name='Hora', value_name='numero_atendimentos')

'''
o valor mediano é usado como estimador em vez do padrão (média),
porque a mediana é menos afetada por valores extremos em comparação com a média.
'''
sns.barplot(x='Hora', y='numero_atendimentos', data=relatorio_final, estimator=np.median)

Resultado:

O gráfico revela que o número de ocorrências começa a aumentar a partir das 7h da manhã, atingindo seu pico entre as 10h e 15h.Durante a madrugada (entre 0h e 6h), o número de ocorrências é significativamente menor, possivelmente devido ao horário em que as pessoas estão dormindo ou menos ativas.

Usando a Distribuição de Poisson

Proximo passo, usaremos a distribuição de Poisson para estimar as probabilidades de diferentes números de ocorrências de violência doméstica relatadas em uma determinada hora.

O código abaixo funciona da seguinte forma:

  • Aceita a entrada do usuário sobre qual hora ele gostaria de obter informações em relação às ocorrências de violência doméstica.
  • Valida se a entrada é um número inteiro. O código prossegue se for um inteiro.
  • Plota a distribuição do número de possíveis ocorrências que podem ser registradas naquela hora.
  • Calcula a probabilidade de receber cada número de ocorrências possíveis. Neste caso, notamos que o valor de lambda (taxa média) para cada hora do dia é diferente. Lembre-se de que estamos tratando cada hora como um intervalo de tempo separado com sua taxa constante.
  • Imprime o número de ocorrências com as maiores probabilidades para aquela hora.
hora_do_dia = int(input('Digite a hora que você deseja obter as informações sobre as ocorrências de violência doméstica:'))

while hora_do_dia < 0 or hora_do_dia > 23:
    print('Entrada inválida! \n A entrada deve ser um número inteiro entre 0 e 23')
    hora_do_dia = int(input('Digite a hora que você deseja obter as informações sobre as ocorrências de violência doméstica:'))

else:
    print('Entrada aceita!')

    #Plotando a distribuição
    fig, ax = plt.subplots(figsize=(20,8))
    ax.set_title('Distribuição das ocorrências de violência doméstica')

    data = relatorio[hora_do_dia].value_counts().sort_index().plot(kind='bar', ax=ax)

    ax.set_xlabel(f'Número de atendimento às {hora_do_dia} horas. ')
    ax.set_ylabel('Frequência')
    plt.xticks(rotation = 45)
    plt.show()

    #Retornando as probabilidades
    lambda_ = relatorio[hora_do_dia].median()

    #Definindo o número possível de atendimentos
    minimo = int(lambda_) - 10
    maximo = int(lambda_) + 20

    num_atendimento = range(minimo,maximo)

    #calculate the probabilities for different numbers of calls
    estimativa = []
    for num in num_atendimento:
        if num>=0:
            estimativa.append([num, round(poisson.pmf(num, mu=lambda_), 4)*100])

    est_df = pd.DataFrame(estimativa, columns=['numero_atendimento', 'prob%'])

    maior_probabilidade = est_df.sort_values(by = 'prob%', ascending=False).head(10)

    print(maior_probabilidade)

Resultado:

A tabela mostra os 10 números de chamadas mais prováveis ​​de serem recebidas, em comparação com outros números de chamadas na distribuição da 10ª hora. Isso significa que na central de atendimento à Mulher, durante a 10ª hora (10h — 11h) de qualquer dia, é mais provável que recebamos de130 a 131 ligações.

Tomada de decisão informada com base na análise da 10ª hora

Precisamos de um número suficiente de atendentes para gerenciar entre 130 a 131 chamadas durante a 10ª hora (10h — 11h), levando em consideração o tempo médio de atendimento por chamada.

Por exemplo, se cada chamada leva cerca de 4 minutos, atender 131 chamadas exigiria aproximadamente 524 minutos de tempo de atendimento total. Essa informação nos permite planejar adequadamente e decidir o número de atendentes necessários para o turno da 10ª hora, garantindo que todas as chamadas sejam atendidas sem sobrecarregar a equipe.

Levando em consideração que o canal de atendimento mais utilizado é o meio telefônico, essa análise deixa clara a necessidade de alocar e, se necessário, remanejar atendentes para suportar a demanda de chamadas durante o horário de pico. O meio telefônico, sendo o principal canal de contato das vítimas, exige uma resposta rápida e eficaz para assegurar que nenhuma ligação seja perdida, principalmente em horários de alta demanda.

Além disso, podemos implementar um sistema para alocar recursos de forma dinâmica com base em dados de volume de chamadas em tempo real. Esse sistema permitiria o envio rápido de recursos adicionais caso o número de chamadas exceda o esperado, garantindo que o sistema de roteamento de chamadas possa lidar com pelo menos 130 a 131 chamadas simultâneas sem deixar nenhuma chamada sem resposta.

Por fim, para garantir a eficiência a longo prazo, podemos modelar a distribuição de chamadas para todas as horas do dia, a fim de entender os padrões de chamadas ao longo do tempo e do ano. Isso nos ajudará a prever tendências futuras e a planejar recursos com maior precisão, de acordo com as demandas esperadas.

Conclusão

Diante do exposto, pode-se concluir que a distribuição de Poisson é de suma importância para estimar a probabilidade de um determinado número de atendimentos em uma hora específica, com base em uma taxa média histórica (lambda). Isso é útil para prever a demanda de ocorrências de violência doméstica ao longo do dia, possibilitando uma melhor alocação de recursos e equipes de suporte.

Com esses dados, é possível planejar turnos e aumentar a equipe nos horários de maior demanda, o que ajuda a reduzir o tempo de resposta e a melhorar a eficiência do atendimento, beneficiando diretamente as vítimas de violência doméstica.

Parabéns por ter chegado até aqui! Compartilhe com aqueles que precisam ver isso!

Fique à vontade para ver esse case também no GitHub.

Até a próxima :)

Meu linkedin: www.linkedin.com/in/carolyne-soares

Referência

[1] Larson, R., & Farber, B. Estatística Aplicada. Tradução de José Fernando Pereira Gonçalves; revisão técnica de Manoel Henrique Salgado. São Paulo: Pearson Education do Brasil, 2015.


메타데이터
post_id
ca545a4c6d6e
slug
distribuição-de-poisson-para-tomada-de-decisão-informada-ca545a4c6d6e
url
https://medium.com/@carolynerscosta/distribui%C3%A7%C3%A3o-de-poisson-para-tomada-de-decis%C3%A3o-informada-ca545a4c6d6e
canonical_url
https://medium.com/@carolynerscosta/distribui%C3%A7%C3%A3o-de-poisson-para-tomada-de-decis%C3%A3o-informada-ca545a4c6d6e
author_url
https://medium.com/@carolynerscosta
status
ok
fetched_at
2026-06-16 19:09:56