1. Visão geral

Objetivo

Este relatório descreve, em linguagem acessível, o pipeline de tratamento de dados, cálculo de fouling e construção da coluna de PONTUAÇÃO para um navio específico da frota – aqui referenciado como CARLA SILVA. A ideia é documentar de forma clara como saímos da base bruta (df.xlsx) até chegar em uma série histórica limpa, consistente e pronta para alimentar modelos preditivos e dashboards.

## **Navio analisado:** CARLA SILVA   
## **Período de dados:** 26/07/2021 a 20/11/2025   
## **Número de registros:** 1396

2. Do dado bruto ao navio-alvo

A base original (df.xlsx) reúne informações operacionais e ambientais da frota, incluindo velocidade, consumo de combustível, posição (latitude/longitude), condições de mar, temperatura da água e uma coluna de PONTUAÇÃO (0–24), que representa o nível de incrustação no casco. O pipeline foi estruturado para trabalhar navio a navio, tomando como exemplo o navio CARLA SILVA, de forma a gerar uma série histórica consistente, sem lacunas e pronta para alimentar modelos de fouling.

O primeiro passo consiste em selecionar o navio de interesse a partir da coluna ship_name. Para facilitar o uso, o script permite definir apenas um texto de busca (por exemplo, "CARLA SILVA") e encontra automaticamente o nome exato do navio na base, ignorando diferenças de maiúsculas/minúsculas. Em seguida:

Antes de qualquer transformação, o código cria cópias “_raw” das principais variáveis (speed_raw, consumo_raw, temperatura_raw, dec_latitude_raw etc.), garantindo rastreabilidade total entre o dado original e o dado tratado.


3. Tratamento de NAs e inconsistências

O tratamento de NAs é feito em nível de registro, sem resumir por dia, e procura sempre respeitar a física do problema: posição do navio, consumo de combustível, velocidade mínima e dinâmica de operação.

3.1 Posição (latitude/longitude)

  • Para latitude e longitude (dec_latitude, dec_longitude), o script:
    • aplica interpolação temporal dentro de cada dia (data_ref), ordenando por start_gmt_date;
    • em seguida, faz um last observation carried forward (LOCF) ao longo de toda a série, tanto para frente quanto para trás;
    • gera um indicador gps_flag para marcar possíveis casos extremos em que ainda restasse alguma lacuna.

Essa etapa reconstrói trajetórias contínuas do navio, minimizando buracos de GPS que poderiam atrapalhar a análise de velocidade e de ambiente.

3.2 Variáveis operacionais básicas

Para trim, deslocamento, Beaufort e condição de mar, a lógica é:

  • interpolar dentro de cada dia, usando na.approx;
  • se ainda restarem NAs, preencher com a mediana histórica do próprio navio;
  • no caso de sea_condition, quando ela é ausente mas existe beaufort, usa-se o Beaufort como proxy, reduzindo perda de informação.

3.3 Velocidade (speed)

A velocidade é tratada com regras físicas antes da interpolação:

  • se o navio permanece na mesma posição (mesma latitude/longitude consecutivas), assume-se que está parado → speed = 0;
  • se o consumo é zero, o script também assume motor desligado → speed = 0;
  • valores faltantes que não satisfazem essas regras são interpolados no tempo, dentro de cada dia;
  • qualquer lacuna remanescente é preenchida com a mediana histórica de velocidade do navio.

3.4 Temperatura da água

A temperatura da água é processada em três etapas:

  1. interpolação dentro de cada dia (data_ref) usando na.approx;
  2. se houver dados suficientes, ajuste de uma regressão simples temperatura ~ dec_latitude, explorando o gradiente térmico com a latitude para estimar pontos faltantes;
  3. se ainda restarem NAs, uso da mediana do navio; em um caso extremo sem nenhuma observação válida, o script adota um valor padrão (por exemplo, 25 °C).

3.5 Consumo de combustível

Para o consumo de combustível, o pipeline procura manter coerência física:

  • identifica casos incoerentes, onde consumo == 0 mas speed > 3 nós (consumo_erro = 1);
  • se o navio tiver dados suficientes, ajusta uma regressão linear:
    • consumo ~ speed + displacement + beaufort
  • usa essa regressão para recalcular apenas os pontos marcados como inconsistentes;
  • qualquer valor de consumo negativo resultante é truncado para zero.

Quando não há dados suficientes para o modelo, o script não força uma correção e apenas registra o fato em mensagem, mantendo os zeros inconsistentes.


4. Construção do índice físico de fouling

A partir das variáveis tratadas, o pipeline define um índice físico de fouling (fouling_index), usando como entrada:

Esses componentes são combinados em um escore bruto (fouling_index_raw) e reescalados para a faixa 0–4, formando o fouling_index. Em situações extremas, nas quais a reescala retorne apenas NAs (por exemplo, pouca variância no índice bruto), o script normaliza manualmente a faixa mínimo-máximo ou zera o índice, sempre explicitando a decisão em mensagem.

O fouling_index funciona como um indicador contínuo de “sujeira de casco”, independente da existência de inspeções formais.


5. Lógica de PONTUAÇÃO e ciclos de limpeza (0–24)

A PONTUAÇÃO original (0–24) é preservada e usada como âncora. A partir dela, o script reconstrói ciclos de fouling entre limpezas de casco, preenchendo os espaços sem inspeção com valores estimados coerentes com a física e com o padrão de limpeza → sujeira → limpeza.

5.1 PONTUAÇÃO original e ciclos

  • A coluna original pontuacao é copiada para pontuacao_ref e nunca é alterada.
  • Sabendo que, após uma limpeza de casco, a PONTUAÇÃO volta para valores próximos de 0 e volta a crescer até se aproximar de 24, o script identifica ciclos de fouling:
    • pontos onde PONTUAÇÃO == 0 logo após um valor alto (por exemplo, ≥ 20);
    • ou a primeira observação da série com PONTUAÇÃO igual a 0.
  • Cada trecho entre dois eventos de limpeza é marcado com um identificador ciclo_fouling (0, 1, 2, …).

5.2 Interpolação da PONTUAÇÃO dentro do ciclo

Dentro de cada ciclo:

  • a PONTUAÇÃO é interpolada no tempo usando na.approx, tomando o tempo (start_gmt_date) como eixo;
  • em seguida, aplica-se um cummax para garantir que a trajetória seja não decrescente (ou seja, não “desce” a PONTUAÇÃO dentro do mesmo ciclo, o que seria pouco plausível fisicamente);
  • os valores são truncados na faixa 0–24.

O resultado é uma PONTUAÇÃO interpolada por ciclo, que representa o crescimento gradual da incrustação entre duas limpezas de casco.

5.3 Uso do fouling_index como plano B

Em alguns ciclos, é possível que quase não existam medições reais de PONTUAÇÃO. Nesses casos, não há como interpolar adequadamente apenas com as inspeções. Para esses pontos, o script usa o fouling_index como plano B:

  • quando há ao menos uma PONTUAÇÃO real na série, o fouling_index é reescalado para a faixa observada de PONTUAÇÃO;
  • em um cenário extremo sem nenhuma PONTUAÇÃO real, o fouling_index é reescalado diretamente para 0–24.

Dessa forma, o modelo sempre consegue fornecer uma estimativa de PONTUAÇÃO, mesmo em períodos longos sem inspeções registradas.

5.4 PONTUAÇÃO final e coluna oficial

Ao final, o pipeline constrói:

  • pontuacao_modelada – a PONTUAÇÃO estimada (ciclos + fouling_index);
  • pontuacao_final – a combinação:
    • se há PONTUAÇÃO real (pontuacao_ref não é NA), usa-se o valor medido;
    • se a PONTUAÇÃO real é NA, usa-se a estimada (pontuacao_modelada).

A coluna oficial de negócio é então criada como PONTUAÇÃO, recebendo o valor de pontuacao_final (0–24). Assim:

  • a PONTUAÇÃO original segue registrada em pontuacao / pontuacao_ref;
  • a PONTUAÇÃO final consolidada (real + interpolada) é acessada diretamente pela coluna PONTUAÇÃO.

6. Produtos gerados pelo pipeline

Ao executar o script 01_tratamento_NA_fouling_e_resumo_diario.R para o navio CARLA SILVA, são gerados dois artefatos principais:

  1. Base detalhada tratada por registro
    Arquivo: df_tratado_fouling_<NAVIO>.xlsx (dentro da pasta data/).

    Esta tabela contém, para cada linha original:

    • todas as variáveis operacionais e ambientais tratadas;
    • colunas *_raw* para auditoria dos valores originais;
    • indicadores auxiliares (gps_flag, consumo_erro, ciclo_fouling etc.);
    • o fouling_index físico (0–4);
    • a PONTUAÇÃO original (pontuacao_ref);
    • a PONTUAÇÃO modelada (pontuacao_modelada);
    • a PONTUAÇÃO final consolidada (PONTUAÇÃO).
  2. Resumo diário por navio
    Arquivo: df_resumo_diario_<NAVIO>.xlsx (dentro da pasta data/).

    Cada linha corresponde a um dia de operação (data_ref) e inclui:

    • Identificação
      • ship_name – nome do navio;
      • n_registros – número de registros daquele dia.
    • Operação
      • speed_media – velocidade média no dia (nós);
      • speed_max – velocidade máxima;
      • tempo_low_speed_pct – percentual do tempo em baixa velocidade (speed < 5 nós).
    • Consumo
      • consumo_total – consumo total de combustível no dia;
      • consumo_medio – consumo médio por registro.
    • Ambiente
      • temperatura_media – temperatura média da água;
      • beaufort_medio – média da escala Beaufort;
      • sea_condition_media – condição média de mar.
    • Fouling
      • fouling_medio – valor médio diário do índice físico de fouling;
      • fouling_max – valor máximo diário do índice físico de fouling.
    • PONTUAÇÃO
      • pontuacao_media – média diária da PONTUAÇÃO FINAL (real + estimada);
      • pontuacao_inspecao_media – média diária apenas da PONTUAÇÃO de inspeções reais (pontuacao_ref).

Esse resumo diário é a entrada natural para:


7. Conclusão e próximos passos

O pipeline descrito cria uma ponte entre a base bruta de operação do navio e uma visão consolidada de fouling e eficiência energética, respeitando as restrições físicas (posição, consumo, velocidade) e a lógica operacional de limpezas de casco. A coluna PONTUAÇÃO, construída a partir de inspeções reais e estimativas consistentes, permite:

Como próximos passos, essa mesma lógica pode ser replicada para outros navios, permitindo: