| 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 |
Data Cleaning
Limpeza e normalização do arquivo bruto
📁 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
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 mensagemPróximos Passos
Com o arquivo limpo, seguimos para:
- Data Wrangling — Parsing, agregação de multilinha, vinculação de mídia