
- Caso de uso de data science em vendas: analisando o sentimento do cliente
- Preparando o dataset
- Aplicando o método BOW
- Usando um modelo supervisionado de machine learning para prever o sentimento
- Conclusão
Casos de uso de data science podem estar ligados a praticamente qualquer setor em que um grande volume de dados é ou pode ser acumulado. Lojas físicas e sites de e-commerce são onde acontece a experiência real do cliente atraído por campanhas de marketing e onde são coletados dados valiosos de compra de uma marca ou empresa. É ali que as pessoas decidem se realmente querem comprar um produto, se têm interesse em adquirir algo que antes não planejavam, quanto estão dispostas a pagar, se voltariam a essa loja e qual avaliação deixariam sobre a experiência de compra.
De fato, avaliações de clientes são uma fonte rica de dados para analisar e entender o que pode ser mudado ou reforçado em todo o processo de vendas. Olhar para esses dados dessa forma pode ajudar a reduzir custos, aumentar a eficiência operacional, melhorar a experiência do cliente, revelar novas oportunidades, fazer o negócio crescer e, no fim, aumentar a receita. Vamos ver de perto como essas informações valiosas podem ser analisadas e modeladas com algoritmos de data science para extrair insights ocultos e captar a mensagem geral de cada cliente.
Caso de uso de data science em vendas: analisando o sentimento do cliente
A análise de sentimento do cliente é um processo automatizado para identificar as emoções dos usuários ao utilizar produtos ou serviços de uma empresa. Normalmente, trabalha-se com dados textuais não estruturados coletados de pesquisas on-line, redes sociais, tickets de suporte, formulários de feedback, avaliações de produtos, fóruns, ligações telefônicas, e-mails e chatbots. Em machine learning, a análise de sentimento é feita via processamento de linguagem natural (NLP), que aplica métodos estatísticos e linguísticos para extrair sentimentos positivos, negativos e neutros diretamente do texto. Essencialmente, ela gera dois parâmetros:
- Polaridade: indica se o sentimento é positivo ou negativo.
- Magnitude: indica a intensidade desse sentimento.
A análise de sentimento é uma ferramenta essencial para qualquer negócio moderno, pois ajuda a obter insights acionáveis, identificar e corrigir problemas recorrentes que deixam clientes insatisfeitos, reforçar recursos do produto ou serviço que geram emoções positivas e, no geral, tomar decisões mais eficientes e orientadas por dados. Em um nível mais detalhado, a análise de sentimento permite:
- melhorar o atendimento e, consequentemente, a experiência do cliente,
- aumentar a fidelidade,
- reduzir a taxa de churn,
- evoluir produtos e serviços no tempo certo,
- otimizar campanhas de marketing,
- antecipar novas tendências e mercados,
- preservar a alta reputação da empresa,
- aumentar os lucros.
Como em qualquer tarefa de análise de texto, alguns desafios podem surgir ao realizar a análise de sentimento. Por exemplo, o algoritmo de NLP pode não captar sarcasmo em algumas avaliações e categorizá-las de forma incorreta. Às vezes, também pode falhar ao decifrar abreviações muito específicas ou gírias pouco usuais.
Preparando o dataset
Vamos explorar na prática como funciona a análise de sentimento usando um dataset de avaliações de filmes do IMDB:
import pandas as pd
movies = pd.read_csv('movies.csv', index_col=0).reset_index(drop=True)
print(f'Number of reviews: {movies.shape[0]:,}\n')
print(movies.head())
Number of reviews: 7,501
review label
0 This short spoof can be found on Elite's Mille... 0
1 A singularly unfunny musical comedy that artif... 0
2 An excellent series, masterfully acted and dir... 1
3 The master of movie spectacle Cecil B. De Mill... 1
4 I was gifted with this movie as it had such a ... 0
Temos duas colunas: uma com o texto de cada avaliação e outra com a classificação do sentimento geral: positivo (1) ou negativo (0).
Vamos calcular a porcentagem de avaliações positivas e negativas:
round(movies['label'].value_counts()*100/len(movies['label'])).convert_dtypes()
0 50
1 50
Name: label, dtype: Int64
Ou seja, temos proporções quase iguais de avaliações positivas e negativas.
Aplicando o método BOW
O próximo passo é transformar os textos em números, já que modelos de machine learning trabalham apenas com variáveis numéricas. Em particular, vamos criar atributos que contam quantas vezes cada palavra aparece na respectiva avaliação. A abordagem mais básica e direta para isso é o bag-of-words (BOW), que constrói um vocabulário com todas as palavras presentes no documento e contabiliza a frequência de cada palavra em cada avaliação. Como resultado, teremos novos atributos, um para cada palavra, com suas frequências correspondentes.
Vamos aplicar o método BOW ao nosso dataset:
from sklearn.feature_extraction.text import CountVectorizer
# Creating new features
vect = CountVectorizer(max_features=200)
vect.fit(movies.review)
X_review = vect.transform(movies.review)
X_df = pd.DataFrame(X_review.toarray(), columns=vect.get_feature_names())
# Combining the new features with the label
movies_bow = pd.concat([movies['label'], X_df], axis=1)
print(movies_bow.head())
label 10 about acting action actors actually after again all ... \
0 0 0 0 0 0 0 0 0 0 0 ...
1 0 1 0 1 0 1 0 0 0 3 ...
2 1 0 0 0 0 0 0 1 0 0 ...
3 1 0 0 0 1 0 0 0 0 0 ...
4 0 1 0 0 1 0 0 0 0 3 ...
will with without work world would years you young your
0 0 1 0 0 0 1 0 0 0 0
1 2 7 1 0 0 2 0 3 0 2
2 0 2 0 0 0 0 0 0 1 0
3 0 0 0 0 0 0 0 1 1 0
4 0 2 0 1 0 0 0 0 0 0
[5 rows x 201 columns]
Acima, aplicamos o parâmetro opcional max_features para considerar apenas as 200 palavras mais frequentes e evitar um possível overfitting do modelo.
Usando um modelo supervisionado de machine learning para prever o sentimento
Agora, vamos usar um modelo supervisionado de machine learning para prever o sentimento. Como queremos estimar se o sentimento de uma nova avaliação é positivo ou negativo com base em avaliações já rotuladas, estamos novamente diante de um problema de classificação. Vamos usar, mais uma vez, regressão logística e medir a acurácia do modelo:
Accuracy score: 0.754
Confusion matrix:
[[37.62772101 13.23856064]
[11.32829853 37.80541981]]
Vemos que o modelo classificou 11% das avaliações positivas como negativas e 13% como positivas mesmo sendo negativas. Para melhorar a acurácia, podemos considerar a exclusão de stopwords (palavras pouco informativas e muito frequentes, como "about", "will", "you", etc.) e aumentar o tamanho do vocabulário.
Ao aplicar BOW, podemos acabar com centenas ou até milhares de novos atributos no dataframe. Isso pode gerar um modelo excessivamente complexo: superajustado, com variáveis e parâmetros desnecessários. Uma forma de corrigir é usar regularização, que restringe a função do modelo. O parâmetro a ajustar aqui é C, que representa a força da regularização. Vamos testar 2 valores desse parâmetro: 100 e 0,1, e ver qual oferece o melhor desempenho no conjunto de teste:
lr_1 = LogisticRegression(C=100)
lr_1.fit(X_train, y_train)
predictions_1 = lr_1.predict(X_test)
lr_2 = LogisticRegression(C=0.1)
lr_2.fit(X_train, y_train)
predictions_2 = lr_2.predict(X_test)
print(f'Accuracy score, lr_1 model: {round(accuracy_score(y_test, predictions_1), 3)}\n'
f'Accuracy score, lr_2 model: {round(accuracy_score(y_test, predictions_2), 3)}\n\n'
f'Confusion matrix for lr_1 model, %:\n{confusion_matrix(y_test, predictions_1)/len(y_test)*100}\n\n'
f'Confusion matrix for lr_2 model, %:\n{confusion_matrix(y_test, predictions_2)/len(y_test)*100}')
Accuracy score, lr_1 model: 0.753
Accuracy score, lr_2 model: 0.756
Confusion matrix for lr_1 model, %:
[[37.53887161 13.32741004]
[11.32829853 37.80541981]]
Confusion matrix for lr_2 model, %:
[[37.67214571 13.19413594]
[11.19502443 37.93869391]]
A diferença de acurácia entre os valores testados de C é insignificante. Poderíamos encontrar um parâmetro que melhore mais o desempenho explorando outros valores. Porém, aqui temos apenas 200 novos atributos; nosso modelo não é tão complexo e a regularização não é realmente necessária neste caso.
Em vez de prever os rótulos 0 ou 1 com a função predict, também é possível prever a probabilidade do sentimento usando predict_proba. Aqui é importante lembrar que não podemos aplicar diretamente acurácia ou matriz de confusão às probabilidades previstas, pois essas métricas funcionam apenas com classes. Portanto, precisamos convertê-las em classes. Por padrão, probabilidade maior ou igual a 0,5 vira classe 1; caso contrário, classe 0.
lr = LogisticRegression()
lr.fit(X_train, y_train)
# Predicting the probability of the 0 class
predictions_prob_0 = lr.predict_proba(X_test)[:, 0]
# Predicting the probability of the 1 class
predictions_prob_1 = lr.predict_proba(X_test)[:, 1]
print(f'First 10 predicted probabilities of class 0: {predictions_prob_0[:10].round(3)}\n'
f'First 10 predicted probabilities of class 1: {predictions_prob_1[:10].round(3)}')
First 10 predicted probabilities of class 0: [0.246 0.143 0.123 0.708 0.001 0.828 0.204 0.531 0.121 0.515]
First 10 predicted probabilities of class 1: [0.754 0.857 0.877 0.292 0.999 0.172 0.796 0.469 0.879 0.485]
Conclusão
Há muitas outras abordagens úteis que podemos aplicar ao dataset para realizar uma análise de sentimento mais detalhada:
- usar n-grams (combinações de palavras) em vez de palavras isoladas para preservar o contexto,
- excluir stopwords,
- limitar o tamanho do vocabulário com base em frequências mínima ou máxima,
- criar atributos numéricos extras descrevendo o tamanho de cada avaliação ou o número de sinais de pontuação (este último às vezes pode correlacionar com a magnitude do sentimento),
- excluir números, alguns caracteres, palavras de certo comprimento ou considerar padrões de palavras mais complexos,
- aplicar stemming e lematização, ou seja, reduzir as palavras às suas raízes,
- usar abordagens mais sofisticadas do que BOW para criar o vocabulário, como TfIdf (term frequency–inverse document frequency), que considera a frequência de uma palavra em uma avaliação em relação ao restante,
- usar bibliotecas especializadas em análise de sentimento, como TextBlob, SentiWordNet e VADER (Valence Aware Dictionary and Sentiment Reasoner).
Se você quer explorar estas e outras técnicas para conduzir análises de sentimento mais ricas, confira o curso Sentiment Analysis in Python.

