
- Data Science-användningsfall inom försäljning: analysera kundsentiment
- Förbereda datasetet
- Tillämpa BOW-metoden
- Använda en övervakad maskininlärningsmodell för att förutsäga sentiment
- Slutsats
Användningsfall för data science kan kopplas till i stort sett alla branscher där stora mängder data samlas in eller kan samlas in. Butiker och e-handelssajter är platserna där den verkliga kundupplevelsen hos personer som lockats av marknadsföringskampanjer äger rum, och där värdefull köpdata för ett visst varumärke eller företag samlas in. Här fattar människor det slutliga beslutet om de verkligen vill köpa en viss produkt, om de är intresserade av att köpa något annat som de inte planerat tidigare, hur mycket de är beredda att betala, om de skulle återvända till butiken och vilket omdöme de skulle lämna om sin kundupplevelse.
Kundomdömen utgör i själva verket en solid datakälla för att analysera och förstå vad som kan förändras eller förstärkas i hela säljprocessen. Genom att analysera data på detta sätt kan man sänka kostnader, öka den operativa effektiviteten, förbättra kundupplevelsen, upptäcka nya möjligheter, växa verksamheten och i slutändan öka intäkterna. Låt oss titta närmare på hur denna värdefulla information kan analyseras och modelleras med hjälp av data science-algoritmer för att få fram dolda insikter och fånga det övergripande budskapet från varje enskild kund.
Data Science-användningsfall inom försäljning: analysera kundsentiment
Kundsentimentsanalys är en automatiserad process för att identifiera kunders känslor när de använder ett visst företags tjänster eller produkter. Det är vanligtvis ostrukturerad textdata som samlas in från nätundersökningar, sociala medier, supportärenden, feedbackformulär, produktrecensioner, forum, telefonsamtal, e-post och chatbots. Inom maskininlärning utförs kundsentimentsanalys via natural language processing (NLP), som använder statistiska och lingvistiska metoder för att extrahera positiva, negativa och neutrala sentiment direkt ur textdata. I grunden ger den två parametrar:
- Polaritet: visar om ett sentiment är positivt eller negativt.
- Styrka: visar hur starkt sentimentet är.
Kundsentimentsanalys är ett nyckelverktyg för alla moderna företag eftersom det hjälper till att få handlingsbara insikter, identifiera och åtgärda kritiska återkommande problem som gör kunder missnöjda, förstärka de produkt- eller tjänstefunktioner som leder till positiva känslor hos kunder samt fatta mer effektiva datadrivna beslut överlag. På en mer detaljerad nivå kan kundsentimentsanalys hjälpa oss att:
- förbättra kundservice och därmed kundupplevelser,
- öka kundlojaliteten,
- minska avhoppsgraden (churn),
- uppgradera produkter och tjänster i rätt tid,
- optimera marknadsföringskampanjer,
- förutse nya trender och marknader,
- upprätthålla vårt företags goda rykte,
- öka vinsten.
Som vid all textanalys kan vissa fallgropar uppstå vid kundsentimentsanalys. Till exempel fångar NLP-algoritmen inte sarkasm i vissa omdömen och kategoriserar dem felaktigt. Den kan också ibland misslyckas med att tyda mycket specifika förkortningar eller sällan använda slangord.
Förbereda datasetet
Låt oss utforska hur kundsentimentsanalys fungerar i praktiken med hjälp av ett dataset med IMDB-filmrecensioner:
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
Vi har två kolumner: en med texten i varje recension och en annan med bedömningen av det övergripande sentimentet: positivt (1) eller negativt (0).
Låt oss beräkna andelen positiva och negativa recensioner:
round(movies['label'].value_counts()*100/len(movies['label'])).convert_dtypes()
0 50
1 50
Name: label, dtype: Int64
Alltså har vi nästan lika stora andelar positiva och negativa recensioner.
Tillämpa BOW-metoden
Nästa steg blir att transformera textdata till numerisk form eftersom en maskininlärningsmodell bara kan arbeta med numeriska egenskaper. Vi ska särskilt skapa variabler som räknar hur många gånger varje ord förekommer i respektive recension. Det mest grundläggande och raka angreppssättet för detta kallas bag-of-words (BOW), som bygger ett ordförråd av alla ord som förekommer i dokumentet och räknar frekvensen för varje ord i varje recension. Som resultat får vi nya variabler, en för varje ord, med motsvarande frekvenser.
Låt oss tillämpa BOW-metoden på vårt 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]
Ovan använde vi den valfria parametern max_features för att endast ta med de 200 mest frekvent använda orden och undvika potentiell överanpassning av modellen.
Använda en övervakad maskininlärningsmodell för att förutsäga sentiment
Nu använder vi en övervakad maskininlärningsmodell för att förutsäga sentimentet. Eftersom vi vill bedöma om sentimentet i en ny recension tillhör en positiv eller negativ kategori baserat på redan märkta recensioner, har vi återigen att göra med ett klassificeringsproblem. Låt oss åter använda en logistisk regressionsalgoritm och mäta modellens noggrannhet:
Accuracy score: 0.754
Confusion matrix:
[[37.62772101 13.23856064]
[11.32829853 37.80541981]]
Vi ser att modellen märkte 11 % av alla recensioner som var positiva som negativa, och 13 % som positiva trots att de var negativa. För att förbättra modellens noggrannhet kan vi till exempel överväga att exkludera stoppord (dvs. låginformativa ord som förekommer mycket ofta, såsom "about", "will", "you" osv.) och att öka ordförrådets storlek.
När vi tillämpar BOW-metoden kan vi få hundratals eller till och med tusentals nya variabler i vår dataframe. Detta kan leda till en alltför komplex modell: överanpassad, med för många onödiga variabler och parametrar. Ett sätt att åtgärda detta är att använda regularisering, som begränsar modellens funktion. Parametern att justera här är C, som representerar regulariseringens styrka. Låt oss testa 2 värden för denna parameter: 100 och 0,1, och se vilket som ger bäst modellprestanda på testdatan:
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]]
Skillnaden i modellens noggrannhet när vi använder de valda värdena för parametern C är försumbar. Vi skulle troligen kunna hitta en parameter som förbättrar modellens prestanda mer genom att experimentera vidare med fler värden. Här har vi dock bara 200 nya variabler, så vår modell är inte särskilt komplex och regulariseringssteget behövs egentligen inte i vårt fall.
I stället för att förutsäga etiketterna 0 eller 1 med funktionen predict går det att förutsäga en sannolikhet för sentiment med predict_proba. Här måste vi ha i åtanke att vi inte kan tillämpa accuracy score eller en förväxlingsmatris direkt på de förutsagda sannolikheterna, eftersom dessa mått bara fungerar med klasser. Vi behöver alltså koda dem vidare som klasser. Som standard översätts en sannolikhet som är högre än eller lika med 0,5 till klass 1, annars till klass 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]
Slutsats
Det finns många andra användbara angreppssätt som vi kan tillämpa på vårt dataset för att göra en mer detaljerad sentimentsanalys:
- använda n-gram (kombinationer av ord) i stället för enbart enstaka ord för att bevara kontext,
- exkludera stoppord,
- begränsa ordförrådets storlek baserat på övre eller undre frekvensvärden,
- skapa numeriska extravariabler som beskriver längden på varje recension eller antalet skiljetecken (det senare kan ibland korrelera med sentimentets styrka),
- exkludera siffror, vissa tecken, ord av en viss längd, eller beakta mer komplexa ordmönster,
- tillämpa stemming och lemmatisering, dvs. reducera orden till sina rötter,
- använda mer sofistikerade metoder än BOW för att skapa ett ordförråd, t.ex. TfIdf (term frequency–inverse document frequency) som tar hänsyn till hur ofta ett ord förekommer i en recension i förhållande till resten av recensionerna.
- använda specialiserade bibliotek utformade för sentimentsanalys, såsom TextBlob, SentiWordNet, VADER (Valence Aware Dictionary and Sentiment Reasoner).
Om du vill utforska dessa och andra användbara tekniker för att göra insiktsfull sentimentsanalys kan du kolla in kursen Sentiment Analysis in Python.