1
resposta

Cadeias de Markov - Prever o Clima

import numpy as np

# Passo 1: Definição dos Estados e Matriz de Transição
estados = ["Ensolarado", "Nublado", "Chuvoso"]

# Matriz de Transição (P)
# Cada linha representa o estado ATUAL (Ensolarado, Nublado, Chuvoso)
# Cada coluna representa a probabilidade do estado SEGUINTE
matriz_transicao = np.array([
    [0.7, 0.2, 0.1],  # Se hoje está Ensolarado: 70% Sol, 20% Nublado, 10% Chuva
    [0.3, 0.4, 0.3],  # Se hoje está Nublado: 30% Sol, 40% Nublado, 30% Chuva
    [0.2, 0.3, 0.5]   # Se hoje está Chuvoso: 20% Sol, 30% Nublado, 50% Chuva
])

# Passo 2: Lógica da Cadeia de Markov
def prever_clima(estado_inicial, dias, estados, matriz):
    previsao = [estado_inicial]
    estado_atual_indice = estados.index(estado_inicial)
    
    for _ in range(dias):
        # Seleciona o próximo estado com base nas probabilidades da linha atual
        proximo_estado = np.random.choice(
            estados, 
            p=matriz[estado_atual_indice]
        )
        previsao.append(proximo_estado)
        
        # Atualiza o índice para a próxima iteração
        estado_atual_indice = estados.index(proximo_estado)
        
    return previsao

# Passo 3: Teste do Modelo
estado_partida = "Ensolarado"
proximos_10_dias = prever_clima(estado_partida, 10, estados, matriz_transicao)

print(f"Previsão começando com '{estado_partida}':")
for i, clima in enumerate(proximos_10_dias):
    print(f"Dia {i}: {clima}")

Entendendo o Processamento
Para visualizar o que está acontecendo no código, imagine o seguinte grafo de transições:

Por que usar numpy.random.choice?
Essa função é o "coração" da simulação. Ela recebe a lista de estados e um parâmetro p (as probabilidades). Se o estado atual for Ensolarado, ela olha para a primeira linha da matriz: [0.7, 0.2, 0.1]. O computador então gera um número aleatório e, estatisticamente, escolherá "Ensolarado" 70% das vezes, mantendo a coerência com seus dados históricos.

A Propriedade de Markov
Observe que, para decidir o clima do Dia 5, a função olha apenas para o que aconteceu no Dia 4. Ela não precisa saber como estava o tempo no Dia 1 ou 2. Essa "falta de memória" é o que define uma Cadeia de Markov.

1 resposta

Oi, Tiago! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

O que chamou atenção foi como você organizou bem os estados, a matriz de transição e a função, deixando claro o raciocínio por trás da Cadeia de Markov e a ideia de ausência de memória, usando numpy.random.choice de forma correta.

Uma dica interessante para o futuro é observar a distribuição dos estados ao longo do tempo, usando contagem de ocorrências. Veja este exemplo:


from collections import Counter

resultados = prever_clima("Ensolarado", 100, estados, matriz_transicao)
contagem = Counter(resultados)

print(contagem)

Esse código conta quantas vezes cada clima apareceu na simulação, ajudando a entender o comportamento do sistema no longo prazo.

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