Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Faça como eu fiz: utilizando cadeias de Markov

import numpy as np

Estados possíveis do clima

estados = ["Ensolarado", "Nublado", "Chuvoso", "Ventando"]

Matriz de transição

Cada linha soma 1 (100%)

matriz_transicao = [
[0.60, 0.20, 0.10, 0.10], # Ensolarado
[0.30, 0.40, 0.20, 0.10], # Nublado
[0.20, 0.30, 0.40, 0.10], # Chuvoso
[0.40, 0.20, 0.20, 0.20] # Ventando
]

Estado inicial escolhido

estado_inicial = "Nublado"

Número de dias para prever

dias_previsao = 10

Função para encontrar o índice do estado

def obter_indice_estado(estado):
return estados.index(estado)

Função que implementa a Cadeia de Markov

def prever_clima(estado_inicial, dias):
estado_atual = estado_inicial
previsao = [estado_atual]

for _ in range(dias - 1):
    indice = obter_indice_estado(estado_atual)

    proximo_estado = np.random.choice(
        estados,
        p=matriz_transicao[indice]
    )

    previsao.append(proximo_estado)
    estado_atual = proximo_estado

return previsao

Teste do modelo

resultado = prever_clima(estado_inicial, dias_previsao)

Exibição dos resultados

print(f"Estado inicial: {estado_inicial}")
print("Previsão para os próximos 10 dias:")

for dia, clima in enumerate(resultado, start=1):
print(f"Dia {dia}: {clima}")

"""
Exemplo de saída possível:

Estado inicial: Nublado
Previsão para os próximos 10 dias:

Dia 1: Nublado
Dia 2: Ensolarado
Dia 3: Ensolarado
Dia 4: Nublado
Dia 5: Chuvoso
Dia 6: Chuvoso
Dia 7: Nublado
Dia 8: Ventando
Dia 9: Ensolarado
Dia 10: Ensolarado
"""

1 resposta

Fala, Isis! Tudo bom?

Agradeço por trazer sua solução para o fórum!

Curti demais como trabalhou a definição dos estados climáticos para estruturar a Cadeia de Markov com Python, entendeu perfeitamente a importância da matriz de transição para garantir que cada linha represente probabilidades válidas e usou bem o np.random.choice para simular a evolução dos estados ao longo dos dias. Esse cuidado torna o modelo mais realista e aplicável em análises probabilísticas.

Algo bem legal para complementar é calcular a distribuição final de probabilidades após várias iterações, usando multiplicação matricial em vez de apenas simulação. Dessa maneira:

import numpy as np

estados = ["Ensolarado", "Nublado", "Chuvoso", "Ventando"]
matriz_transicao = np.array([
    [0.60, 0.20, 0.10, 0.10],
    [0.30, 0.40, 0.20, 0.10],
    [0.20, 0.30, 0.40, 0.10],
    [0.40, 0.20, 0.20, 0.20]
])

# vetor inicial (estado Nublado)
estado_inicial = np.array([0,1,0,0])

# distribuição após 10 dias
distribuicao = estado_inicial @ np.linalg.matrix_power(matriz_transicao, 10)
print("Distribuição após 10 dias:", distribucao)

Isso faz com que você veja não apenas uma simulação, mas também a probabilidade teórica de cada estado após várias transições.

E algumas boas práticas que você pode adotar são:

  • Exploração: comparar resultados da simulação com os da multiplicação matricial.
  • Legibilidade: manter nomes de funções e variáveis claros, como prever_clima_simulado.
  • Generalização: permitir que o usuário escolha o número de dias e o estado inicial dinamicamente.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Ah, uma pergunta: você prefere evoluir esse modelo para incluir mais estados climáticos (como neve ou tempestade) ou aplicar a lógica de Cadeias de Markov em outro contexto, como previsão de comportamento de clientes?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!