🐍 Python para Dados: Analisar Consultorias com Python e Descobrir Insights Valiosos
A análise de dados é uma etapa essencial para entender os padrões e comportamentos em diversos contextos.
Neste artigo, mostrarei como usei Python para descobrir quais são os assuntos mais solicitados nas consultorias jurídicas, utilizando técnicas de processamento de texto e visualizações, como nuvens de palavras.
🤔 Problema:
Embora o sistema permita identificar quais especialidades têm maiores taxas de cancelamento e aceitação, não havia um entendimento claro sobre os principais assuntos ou temas relacionados a essas consultorias. Isso dificultava a análise detalhada e estratégica para melhorar os resultados.
💡Solução:
Implementei uma solução que analisa as descrições das consultorias para identificar e quantificar as palavras-chave mais frequentes. Essa análise é cruzada com a especialidade previamente registrada no sistema para validar a coerência e relevância dos assuntos identificados. A visualização desses dados no dashboard permite que tomadores de decisão compreendam os temas predominantes nas consultorias, otimizando estratégias para reduzir cancelamentos e aumentar a eficiência no atendimento.
1. Por que usei Python para análise de textos em consultorias?
- Escolhi Python porque, além de ser a linguagem com a qual tenho mais experiência, estava aprofundando meus estudos na área durante minha pós-graduação. Coincidentemente, naquela semana, tive uma aula sobre PLN (Processamento de Linguagem Natural), o que me inspirou a aplicá-lo como solução para o meu problema..
- Utilizei recursos como NLTK, Pandas e Matplotlib, que tornam o processo de análise mais fácil.
🚀 2. Estrutura do código e Explicação:
🛑OBS: O arquivo CSV deve ser construído como abaixo. coluna [observation], como no exemplo:🛑
🛠️ Importação das bibliotecas:
- pandas: Manipula e analisa dados tabulares, como arquivos CSV.
- re: Processa texto com expressões regulares para limpeza e formatação.
- nltk: Fornece ferramentas para processamento de linguagem natural, como tokenização e remoção de stopwords.
- collections.Counter: Conta a frequência de palavras ou itens em listas.
- matplotlib.pyplot: Cria gráficos e visualizações.
- wordcloud: Gera nuvens de palavras com base na frequência de termos.
- unidecode: Remove acentos e caracteres especiais de strings.
- tkinter: Cria interfaces gráficas, como janelas para selecionar arquivos.
📤Carregamento do arquivo CSV:
Função principal:
- A função open_file abre uma janela para escolher o arquivo CSV.
- Se o arquivo for carregado, a coluna observation é usada para análise. Caso contrário, um erro é levantado.
- Usei a interface gráfica (Tkinter) função (filedialog.askopenfilename) para selecionar o arquivo de entrada.
🧹 Limpeza e preparação do texto:
Neste passo, o texto é processado para facilitar a análise. Isso inclui:
- Converter para minúsculas.
- Remover acentos, números, pontuações e palavras curtas.
- Tokenizar o texto em palavras individuais.
- Filtrar palavras irrelevantes (stopwords).
Função principal:
- A limpeza e tokenização garantem que apenas palavras relevantes permaneçam para a análise.
🔢 Contagem das palavras mais frequentes:
Usei a biblioteca collections.Counter para calcular a frequência de cada palavra no texto processado.
Função principal:
- Identifica os assuntos mais discutidos nas consultorias com base nas palavras mais comuns.
☁️ Criação da nuvem de palavras com a biblioteca WordCloud.
Criei uma visualização gráfica das palavras mais frequentes para facilitar a interpretação dos resultados.
Função principal:
- A nuvem de palavras destaca as palavras mais frequentes em tamanhos maiores, proporcionando uma visão intuitiva dos tópicos mais solicitados.
🪜 3. Passo a passo para executar o código:
- Execute o script Python.
- Escolha o arquivo CSV com as consultorias.
- O script realizará a limpeza e mostrará as palavras mais frequentes.
- Visualize os resultados em uma nuvem de palavras.
🧑💻 4. Código Completo:
import pandas as pd
import re
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from collections import Counter
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import nltk
from unidecode import unidecode
import tkinter as tk
from tkinter import filedialog
# Função para abrir e carregar um arquivo CSV
def open_file():
"""
Abre um diálogo para selecionar um arquivo CSV e o carrega em um DataFrame.
Retorna None se nenhum arquivo for selecionado.
"""
file_path = filedialog.askopenfilename(title="Selecione o arquivo CSV", filetypes=[("CSV files", "*.csv")])
return pd.read_csv(file_path, encoding='utf-8') if file_path else None
# Carregar dados
df = open_file()
if df is not None:
df['observation'] = df['observation'].fillna("Sem texto")
text = df['observation'].str.cat(sep=' ')
else:
raise ValueError("Nenhum arquivo carregado ou inválido.")
# Baixar recursos do NLTK
nltk.download('punkt')
nltk.download('stopwords')
# Função para limpar texto
def clean_text(text):
"""
Realiza a limpeza do texto:
- Converte para minúsculas
- Remove acentos, números, pontuação e palavras curtas
"""
text = text.lower()
text = unidecode(text) # Remove acentos de forma mais direta
text = re.sub(r'\d+', '', text) # Remove números
text = re.sub(r'\s+', ' ', text) # Remove espaços extras
text = re.sub(r'[^\w\s]', '', text) # Remove pontuação
text = re.sub(r'\b\w{1,2}\b', '', text) # Remove palavras curtas
return text.strip()
# Limpeza do texto
cleaned_text = clean_text(text)
# Tokenização
words = word_tokenize(cleaned_text)
# Stopwords
stop_words = set(stopwords.words('portuguese'))
# Stopwords personalizadas
custom_stopwords = {
"gostaria", "texto", "boa", "saber", "anos", "pra",
"fazer", "tarde", "preciso", "valor", "ola",
"agora", "porem", "nome", "bom", "quero", "fiz",
"quer", "dia", "sobre", "casa", "caso"
"meses", "dias", "noite", "q", "tudo",
"pois", "tirar", "queria", "sendo", "2",
"onde", "3", "1", "30", "outra", "4", "ano", "desde",
"entrei", "7", "hoje", "outra", "4", "ano", "desde",
"de", "em", "e", "ser", "esta", "vai", "foi", "vai", "esta",
"sera", "bem", "como", "sim", "nao", "ja", "bem", "vou",
"mais", "menos", "aqui", "ali", "la", "vem", "vai", "da", "do",
"meu", "minha", "seu", "sua", "com", "para", "por", "se",
"ele", "ela", "eles", "elas", "ta", "ok", "ok", "ate",
"nunca", "sempre", "vez", "vezes", "tambem", "quase", "perto",
"15", "20", "5", "10", "oi", "ola", "ai", "entao", "todos",
"coisa", "fazendo", "parte", "comigo", "ficar", "veio", "ficou",
"faz", "ainda", "bem", "assim", "ola", "oi", "problemas",
"pediu", "pedi", "consigo", "pode", "fiz", "faco", "ajuda",
"quero", "querendo", "sei", "poderia", "porque", "mim", "posso",
"nada", "mes", "ter", "algumas", "fez", "nada", "alguns", "deu",
"pessoa", "apos", "paga", "feito", "consegui", "dr", "reais",
"moro", "tempo", "quais", "loja", "querem", "disse", "apos", "entrar",
"chamo", "sair", "pedir", "outro", "carteira", "obrigada", "apenas",
"ex", "nao", "dois", "dona", "antes", "todo", "6", "atras", "certo",
"total", "ja", "so", "ate", "ha", "contato"
}
# Combinar stopwords padrão com personalizadas
stop_words.update(custom_stopwords)
# Filtrar palavras indesejadas
words = [word for word in words if word not in stop_words]
# Contagem de palavras
word_counts = Counter(words)
# Exibir as 50 palavras mais comuns
most_common_words = word_counts.most_common(50)
print(most_common_words)
# Gerar nuvem de palavras
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(word_counts)
# Exibir nuvem de palavras
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
Conclusão:
Com base nas informações coletadas e analisadas em nosso dashboard, descobrimos que Direito Trabalhista e Direito da Família são as consultorias com maior número de solicitações.
Quantidade de palavras encontrada:
empresa: 1422, pensao: 979, trabalho: 925, processo: 848, contrato: 828, pai: 820, pagar: 803, meses: 758, filho: 732, direito: 663, mae: 658, conta: 647, caso: 575, filha: 567, dinheiro: 561, carro: 559, duvida: 490, advogado: 456, duvidas: 394, recebi: 382, marido: 382, problema: 358, direitos: 356, paguei: 353, guarda: 350, acordo: 346, imovel: 346, banco: 345, divida: 329, pagamento: 327, estao: 325, filhos: 323, alimenticia: 308, aluguel: 300, moto: 300, compra: 297, contra: 296, receber: 293, preso: 276, comprei: 269, salario: 248, devo: 241, servico: 239, orientacao: 232, situacao: 228, trabalhei: 226, justica: 221, terreno: 221, trabalhar: 216, causa: 216