
- Data-Science-Use-Case im Vertrieb: Kundenstimmungen analysieren
- Den Datensatz vorbereiten
- Die BOW-Methode anwenden
- Mit überwachten ML-Modellen Stimmung vorhersagen
- Fazit
Data-Science-Anwendungsfälle finden sich praktisch in jeder Branche, in der viele Daten anfallen oder gesammelt werden können. Filialen und E‑Commerce-Websites sind die Orte, an denen die tatsächliche Kundenerfahrung von Menschen stattfindet, die durch Marketingkampagnen angezogen wurden – und an denen wertvolle Einkaufsdaten einer Marke oder eines Unternehmens erfasst werden. Hier entscheiden Menschen, ob sie ein Produkt wirklich kaufen möchten, ob sie sich für etwas interessieren, das sie vorher nicht geplant hatten, wie viel sie zu zahlen bereit sind, ob sie in diesen Shop zurückkehren würden und welche Bewertung sie zu ihrer Erfahrung abgeben.
Kundenbewertungen sind eine starke Datenquelle, um zu analysieren und zu verstehen, was im gesamten Vertriebsprozess geändert oder verstärkt werden sollte. Auf diese Weise analysierte Daten helfen, Kosten zu senken, die operative Effizienz zu steigern, das Kundenerlebnis zu verbessern, neue Chancen zu erkennen, das Geschäft zu skalieren und am Ende den Umsatz zu erhöhen. Schauen wir uns an, wie sich diese wertvollen Informationen mit Data-Science-Algorithmen analysieren und modellieren lassen, um verborgene Insights zu gewinnen und die Botschaft jedes einzelnen Kunden zu erfassen.
Data-Science-Use-Case im Vertrieb: Kundenstimmungen analysieren
Customer Sentiment Analysis ist ein automatisierter Prozess, um die Emotionen von Kundinnen und Kunden zu identifizieren, wenn sie die Produkte oder Services eines Unternehmens nutzen. Dabei handelt es sich in der Regel um unstrukturierte Textdaten aus Online-Umfragen, Social Media, Support-Tickets, Feedback-Formularen, Produktbewertungen, Foren, Telefonaten, E-Mails und Chatbots. Im Machine Learning wird Customer Sentiment Analysis mithilfe von Natural Language Processing (NLP) durchgeführt, das statistische und linguistische Methoden anwendet, um positive, negative und neutrale Stimmungen direkt aus Textdaten zu extrahieren. Im Kern liefert sie zwei Parameter:
- Polarität: Gibt an, ob eine Stimmung positiv oder negativ ist.
- Stärke: Zeigt an, wie ausgeprägt diese Stimmung ist.
Customer Sentiment Analysis ist für moderne Unternehmen ein zentrales Werkzeug. Sie liefert umsetzbare Insights, deckt kritische, wiederkehrende Probleme auf, die für Unzufriedenheit sorgen, stärkt Produkt- oder Servicefunktionen, die positive Emotionen auslösen, und unterstützt insgesamt effizientere, datenbasierte Entscheidungen. Auf granularerer Ebene hilft sie dabei:
- den Kundenservice – und damit die Kundenerlebnisse – zu verbessern,
- die Kundentreue zu erhöhen,
- die Abwanderungsrate zu senken,
- Produkte und Services rechtzeitig weiterzuentwickeln,
- Marketingkampagnen zu optimieren,
- neue Trends und Märkte frühzeitig zu erkennen,
- den guten Ruf unseres Unternehmens zu sichern,
- die Gewinne zu steigern.
Wie bei jeder Textanalyse gibt es Fallstricke. So erkennt ein NLP-Algorithmus etwa Sarkasmus in manchen Bewertungen nicht und ordnet sie falsch zu. Auch sehr spezifische Abkürzungen oder seltene Slang-Begriffe können Probleme bereiten.
Den Datensatz vorbereiten
Schauen wir uns in der Praxis an, wie Customer Sentiment Analysis funktioniert – mit einem Datensatz von IMDB-Filmrezensionen:
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
Wir haben zwei Spalten: den Text der jeweiligen Rezension und die Einschätzung der Gesamtstimmung: positiv (1) oder negativ (0).
Lass uns den Anteil positiver und negativer Rezensionen berechnen:
round(movies['label'].value_counts()*100/len(movies['label'])).convert_dtypes()
0 50
1 50
Name: label, dtype: Int64
Damit liegen die Anteile positiver und negativer Rezensionen nahezu gleichauf.
Die BOW-Methode anwenden
Als Nächstes wandeln wir die Textdaten in numerische Form um, da ein Machine-Learning-Modell nur mit numerischen Merkmalen arbeiten kann. Konkret erstellen wir Features, die zählen, wie oft jedes Wort in der jeweiligen Rezension vorkommt. Der simpelste Ansatz dafür ist Bag-of-Words (BOW): Es baut ein Vokabular aller im Dokument vorkommenden Wörter auf und zählt die Häufigkeit jedes Wortes in jeder Rezension. So entstehen neue Features – je eines pro Wort – mit den entsprechenden Häufigkeiten.
Wenden wir die BOW-Methode auf unseren Datensatz an:
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]
Oben haben wir den optionalen Parameter max_features genutzt, um nur die 200 am häufigsten verwendeten Wörter zu berücksichtigen und Überanpassung im Modell zu vermeiden.
Mit überwachten ML-Modellen Stimmung vorhersagen
Jetzt setzen wir ein überwachtes Machine-Learning-Modell ein, um die Stimmung vorherzusagen. Da wir anhand bereits gelabelter Rezensionen schätzen wollen, ob die Stimmung einer neuen Rezension positiv oder negativ ist, handelt es sich wieder um ein Klassifikationsproblem. Wir verwenden erneut eine logistische Regression und messen die Modellgenauigkeit:
Accuracy score: 0.754
Confusion matrix:
[[37.62772101 13.23856064]
[11.32829853 37.80541981]]
Das Modell hat 11% aller tatsächlich positiven Rezensionen als negativ und 13% der negativen als positiv eingestuft. Um die Genauigkeit zu verbessern, können wir zum Beispiel Stoppwörter ausschließen (also wenig informative, sehr häufige Wörter wie "about", "will", "you" usw.) und den Wortschatz vergrößern.
Bei der BOW-Methode entstehen schnell Hunderte oder sogar Tausende neuer Features im Dataframe. Das kann zu einem übermäßig komplexen, überangepassten Modell mit vielen unnötigen Merkmalen und Parametern führen. Eine Lösung ist Regularisierung, die die Modellfunktion begrenzt. Der zu justierende Parameter ist C und steht für die Stärke der Regularisierung. Testen wir zwei Werte: 100 und 0,1, und prüfen, welcher auf den Testdaten besser abschneidet:
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]]
Der Unterschied in der Genauigkeit bei den gewählten C-Werten ist gering. Mit weiteren Experimenten ließe sich eventuell ein besserer Wert finden. Da wir hier jedoch nur 200 neue Features haben, ist das Modell nicht besonders komplex – Regularisierung ist in diesem Fall nicht zwingend nötig.
Statt mit predict die Klassen 0 oder 1 vorherzusagen, lässt sich mit predict_proba auch die Wahrscheinlichkeit der Stimmung schätzen. Dabei ist zu beachten, dass Accuracy Score und Confusion Matrix nicht direkt auf Wahrscheinlichkeiten anwendbar sind, da diese Metriken mit Klassen arbeiten. Wir müssen daher einen Schwellenwert setzen. Standardmäßig wird eine Wahrscheinlichkeit größer oder gleich 0,5 als Klasse 1, andernfalls als Klasse 0 interpretiert.
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]
Fazit
Es gibt viele weitere hilfreiche Ansätze, um eine feinere Sentimentanalyse durchzuführen:
- N‑Gramme (Wortkombinationen) statt einzelner Wörter verwenden, um Kontext zu bewahren,
- Stoppwörter ausschließen,
- den Wortschatz mithilfe unterer/oberer Häufigkeitsschwellen begrenzen,
- zusätzliche numerische Features erstellen, z. B. Textlänge je Rezension oder Anzahl an Satzzeichen (letztere korrelieren teils mit der Intensität der Stimmung),
- Zahlen, bestimmte Zeichen oder Wörter bestimmter Länge ausschließen oder komplexere Wortmuster berücksichtigen,
- Stemming und Lemmatisierung anwenden, also Wörter auf ihre Wurzeln zurückführen,
- statt BOW anspruchsvollere Ansätze zur Vokabularerstellung nutzen, z. B. TfIdf (Term Frequency–Inverse Document Frequency), das die Häufigkeit eines Wortes relativ zu allen Rezensionen gewichtet.
- spezialisierte Bibliotheken für Sentimentanalyse einsetzen, etwa TextBlob, SentiWordNet, VADER (Valence Aware Dictionary and Sentiment Reasoner).
Wenn du diese und weitere Techniken für aussagekräftige Sentimentanalysen vertiefen möchtest, schau dir den Kurs Sentiment Analysis in Python an.

