Data Cleaning

Limpeza e normalização do arquivo bruto

Author

Marlon L.

Published

May 7, 2026

📁 Projeto: whatsapp-interaction-analysis

Data Cleaning

Com base nas descobertas documentadas no Data Profiling, esta etapa implementa as transformações de limpeza necessárias para preparar o arquivo bruto para parsing e análise.

Objetivo

Transformar o arquivo bruto exportado do WhatsApp em um arquivo limpo e otimizado, removendo caracteres invisíveis, linhas vazias, normalizando espaços e anonimizando participantes.


Configuração do Pipeline

Parâmetro Valor Path
Entrada raw-data.txt ~/whatsapp-interaction-analysis/data/raw/export_2024-10_2025-10
Saída export_2024-10_2025-10 ~/whatsapp-interaction-analysis/data/interim/export_2024-10_2025-10

Execução do Pipeline

# Etapa Resultado
1 Remoção U+200E 48,699 caracteres
2 Anonimização 91,968 substituições
3 Otimização timestamps 91,968 timestamps
4 Normalização indentação 3,038 espaços
5 Remoção linhas vazias 1,156 linhas
6 Normalização espaços 1,003 bytes
7 Remoção timestamps vazios 39 linhas

✅ Pipeline concluído!

📉 Redução: 5.04 MB → 4.10 MB (18.6%)
📄 Arquivo: raw-data_cln7.txt

Pipeline de Transformação

Etapa 1: Remoção U+200E

O caractere U+200E (Left-to-Right Mark) é um caractere de formatação invisível usado para controle de direção de texto. O WhatsApp o insere sistematicamente durante a exportação, mas não carrega informação semântica útil.

Impacto identificado: ~48.700 ocorrências, ~243 KB, presente em ~50% das linhas.

Resultado:

  • Caracteres Removidos: 48,699

Auditoria:

Métrica Valor
Entrada 5.04 MB (97,333 linhas)
Saída 4.81 MB (97,333 linhas)
Redução 243,430 bytes (4.61%)

Etapa 2: Anonimização

Substitui nomes dos participantes por identificadores genéricos: - Marlon → P1 - Lê 🖤 → P2

Resultado:

  • Marlon: 46,975
  • Lê 🖤: 44,993

Auditoria:

Métrica Valor
Entrada 4.81 MB (97,333 linhas)
Saída 4.37 MB (97,333 linhas)
Redução 457,858 bytes (9.08%)

Etapa 3: Otimização timestamps

Remove delimitadores redundantes para facilitar o parsing: - De: [28/11/24, 19:30:05] P1: Mensagem - Para: 28/11/24 19:30:05 P1: Mensagem

Resultado:

  • Timestamps Otimizados: 91,968

Auditoria:

Métrica Valor
Entrada 4.37 MB (97,333 linhas)
Saída 4.11 MB (97,333 linhas)
Redução 275,904 bytes (6.02%)

Etapa 4: Normalização indentação

Remove espaços/tabs iniciais de linhas de continuação (mensagens multilinha). Esses espaços são visuais e não carregam informação semântica.

Resultado:

  • Espacos Removidos: 3,038

Auditoria:

Métrica Valor
Entrada 4.11 MB (97,333 linhas)
Saída 4.10 MB (97,333 linhas)
Redução 3,038 bytes (0.07%)

Etapa 5: Remoção linhas vazias

Linhas completamente vazias (apenas \n) aparecem entre mensagens e não carregam informação. Serão removidas preservando a formatação interna.

Resultado:

  • Linhas Removidas: 1,156

Auditoria:

Métrica Valor
Entrada 4.10 MB (97,333 linhas)
Saída 4.10 MB (96,177 linhas)
Redução 1,156 bytes (0.03%)

Etapa 6: Normalização espaços

Normaliza espaços em branco internos: - Múltiplos espaços → espaço único - Tabs → espaço único
- Trailing whitespace → removido - Preserva: Indentação inicial

Resultado:

  • Bytes Economizados: 1,003

Auditoria:

Métrica Valor
Entrada 4.10 MB (96,177 linhas)
Saída 4.10 MB (96,177 linhas)
Redução 1,003 bytes (0.02%)

Etapa 7: Remoção timestamps vazios

Quando múltiplas mídias são enviadas simultaneamente, o WhatsApp registra uma linha com timestamp vazio seguida das mídias. A primeira linha é redundante.

Resultado:

  • Linhas Removidas: 39

Auditoria:

Métrica Valor
Entrada 4.10 MB (96,177 linhas)
Saída 4.10 MB (96,138 linhas)
Redução 858 bytes (0.02%)

Auditoria Final do Pipeline

Estágio Linhas Chars Tamanho Δ Linhas Δ Chars Δ %
📄 Original (raw-data.txt) 97,333 4,846,244 5.04 MB - - -
└─ Remoção U+200E 97,333 4,797,545 4.81 MB - -48,699 -4.61%
└─ Anonimização 97,333 4,519,659 4.37 MB - -277,886 -9.08%
└─ Otimização timestamps 97,333 4,243,755 4.11 MB - -275,904 -6.02%
└─ Normalização indentação 97,333 4,240,717 4.10 MB - -3,038 -0.07%
└─ Remoção linhas vazias 96,177 4,239,561 4.10 MB -1,156 -1,156 -0.03%
└─ Normalização espaços 96,177 4,238,560 4.10 MB - -1,001 -0.02%
└─ Remoção timestamps vazios 96,138 4,237,702 4.10 MB -39 -858 -0.02%
Etapa Tamanho Após Bytes Removidos Linhas Removidas Chars Removidos Redução %
1️⃣ Remoção U+200E 4.81 MB 243,430 - 48,699 4.61%
2️⃣ Anonimização 4.37 MB 457,858 - 277,886 9.08%
3️⃣ Otimização timestamps 4.11 MB 275,904 - 275,904 6.02%
4️⃣ Normalização indentação 4.10 MB 3,038 - 3,038 0.07%
5️⃣ Remoção linhas vazias 4.10 MB 1,156 1,156 1,156 0.03%
6️⃣ Normalização espaços 4.10 MB 1,003 - 1,001 0.02%
7️⃣ Remoção timestamps vazios 4.10 MB 858 39 858 0.02%

🎯 Resultado Final

Métrica Valor
Arquivo original 5.04 MB
Arquivo final 4.10 MB
Redução (bytes) 983,247
Redução (%) 18.61%
Linhas removidas 1,195
Caracteres removidos 608,542

✅ Arquivo de saída: raw-data_cln7.txt

O arquivo limpo está pronto para a próxima etapa: parsing e estruturação em DataFrame.


💡 Impacto da Limpeza

**Redução no Arquivo Bruto:**

- Original: 5.04 MB
- Após limpeza: 4.10 MB
- Redução: 18.61%

**Projeção para Dataset Enriquecido (~8x):**

- Sem otimização: ~40.3 MB
- Com otimização: ~32.8 MB
- Economia projetada: ~7.5 MB

Benefícios:

  • Menos dados para armazenar
  • Processamento mais rápido
  • Transferências mais eficientes

Arquivo de Saída

O arquivo final agora possui:

  • ✅ Formato otimizado: DD/MM/YY HH:MM:SS Remetente: Conteúdo
  • ✅ Participantes anonimizados (P1, P2)
  • ✅ Sem caracteres invisíveis
  • ✅ Sem linhas/timestamps vazios
  • ✅ Espaços e indentação normalizados
# Padrão para identificar início de mensagem
message_pattern = r'^(\d{2}/\d{2}/\d{2}) (\d{2}:\d{2}:\d{2}) (.+?): (.*)$'

# Grupos de captura:
# 1: Data (DD/MM/YY)
# 2: Hora (HH:MM:SS)
# 3: Remetente (P1 ou P2)
# 4: Conteúdo da mensagem

Próximos Passos

Com o arquivo limpo, seguimos para:

  1. Data Wrangling — Parsing, agregação de multilinha, vinculação de mídia