
- Przykład użycia data science w sprzedaży: analiza nastrojów klientów
- Przygotowanie zbioru danych
- Zastosowanie metody BOW
- Użycie nadzorowanego modelu ML do przewidywania nastrojów
- Wnioski
Przypadki użycia data science można powiązać praktycznie z każdą branżą, w której gromadzi się lub można gromadzić duże ilości danych. Sklepy i serwisy e‑commerce to miejsca, w których rozgrywa się realne doświadczenie klientów przyciągniętych kampaniami marketingowymi, a także gdzie zbiera się cenne dane zakupowe danej marki czy firmy. To tutaj ludzie podejmują ostateczną decyzję, czy naprawdę chcą kupić dany produkt, czy zainteresuje ich coś, czego wcześniej nie planowali, ile są gotowi zapłacić, czy wrócą do tego sklepu i jaką opinię wystawią o swoim doświadczeniu zakupowym.
Rzeczywiście, recenzje klientów to solidne źródło danych, które pomaga analizować i rozumieć, co można zmienić lub wzmocnić w całym procesie sprzedaży. Taka analiza danych może pozwolić na obniżenie kosztów, zwiększenie efektywności operacyjnej, poprawę doświadczeń klientów, odkrycie nowych szans, rozwój biznesu i ostatecznie wzrost przychodów. Przyjrzyjmy się bliżej, jak tę cenną informację można analizować i modelować za pomocą algorytmów data science, aby wydobyć ukryte wnioski i uchwycić ogólny przekaz od każdego, pojedynczego klienta.
Przykład użycia data science w sprzedaży: analiza nastrojów klientów
Analiza nastrojów klientów to zautomatyzowany proces identyfikowania emocji klientów podczas korzystania z usług lub produktów danej firmy. Zazwyczaj są to niestrukturalne dane tekstowe zbierane z ankiet online, mediów społecznościowych, zgłoszeń do supportu, formularzy opinii, recenzji produktów, forów, rozmów telefonicznych, e‑maili i chatbotów. W uczeniu maszynowym analiza nastrojów odbywa się z wykorzystaniem przetwarzania języka naturalnego (NLP), które stosuje metody statystyczne i lingwistyczne do wydobywania pozytywnych, negatywnych i neutralnych nastrojów bezpośrednio z tekstu. W istocie zwraca ona dwa parametry:
- Polaryzacja: wskazuje, czy nastrój jest pozytywny, czy negatywny.
- Siła: wskazuje intensywność tego nastroju.
Analiza nastrojów klientów to kluczowe narzędzie dla nowoczesnego biznesu, ponieważ pomaga pozyskiwać praktyczne wnioski, wychwytywać i naprawiać krytyczne, nawracające problemy, które frustrują klientów, wzmacniać cechy produktu lub usługi budzące pozytywne emocje oraz podejmować ogólnie bardziej efektywne decyzje oparte na danych. Na bardziej szczegółowym poziomie analiza nastrojów pozwala:
- poprawić obsługę klienta, a tym samym doświadczenia klientów,
- zwiększyć lojalność klientów,
- zredukować wskaźnik rezygnacji,
- na bieżąco ulepszać produkty i usługi,
- optymalizować kampanie marketingowe,
- przewidywać nowe trendy i rynki,
- utrzymywać wysoką reputację firmy,
- zwiększać zyski.
Jak przy każdej analizie tekstu, podczas analizy nastrojów można napotkać pewne pułapki. Na przykład algorytm NLP nie wychwytuje sarkazmu w niektórych recenzjach i kategoryzuje je błędnie. Czasem może też nie poradzić sobie z bardzo specyficznymi skrótami lub rzadko używanym slangiem.
Przygotowanie zbioru danych
Zobaczmy w praktyce, jak działa analiza nastrojów klientów, korzystając ze zbioru recenzji filmów z 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
Mamy dwie kolumny: jedną z treścią każdej recenzji i drugą z oceną ogólnego nastroju: pozytywny (1) lub negatywny (0).
Policzmy odsetek recenzji pozytywnych i negatywnych:
round(movies['label'].value_counts()*100/len(movies['label'])).convert_dtypes()
0 50
1 50
Name: label, dtype: Int64
Mamy zatem niemal równe proporcje recenzji pozytywnych i negatywnych.
Zastosowanie metody BOW
Kolejny krok to przekształcenie danych tekstowych do postaci numerycznej, ponieważ model uczenia maszynowego działa wyłącznie na cechach liczbowych. W szczególności utworzymy cechy zliczające, ile razy każde słowo pojawia się w danej recenzji. Najprostsze i najbardziej bezpośrednie podejście do tego celu to bag‑of‑words (BOW), które buduje słownik wszystkich słów występujących w dokumencie i zlicza częstość każdego słowa w każdej recenzji. W rezultacie otrzymamy nowe cechy, po jednej dla każdego słowa, z odpowiadającymi im częstościami.
Zastosujmy metodę BOW do naszego zbioru danych:
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]
Powyżej zastosowaliśmy opcjonalny parametr max_features, aby uwzględniać tylko 200 najczęściej używanych słów i uniknąć ewentualnego przeuczenia modelu.
Użycie nadzorowanego modelu ML do przewidywania nastrojów
Teraz użyjemy nadzorowanego modelu uczenia maszynowego do przewidywania nastroju. Ponieważ chcemy ocenić, czy nastrój z nowej recenzji należy do kategorii pozytywnej czy negatywnej na podstawie już oznaczonych recenzji, mamy do czynienia z problemem klasyfikacji. Ponownie skorzystajmy z algorytmu regresji logistycznej i zmierzmy dokładność modelu:
Accuracy score: 0.754
Confusion matrix:
[[37.62772101 13.23856064]
[11.32829853 37.80541981]]
Widzimy, że model oznaczył 11% wszystkich recenzji, które były pozytywne, jako negatywne, a 13% jako pozytywne, choć były negatywne. Aby poprawić dokładność modelu, można rozważyć wykluczenie stop‑słów (tj. nisko informacyjnych słów występujących bardzo często, takich jak „about”, „will”, „you” itp.) oraz zwiększenie rozmiaru słownika.
Stosując metodę BOW, możemy skończyć ze setkami, a nawet tysiącami nowych cech w naszym dataframe. Może to skutkować nadmiernie złożonym modelem: przeuczonym, zbyt wieloma zbędnymi cechami i parametrami. Jednym ze sposobów naprawy jest regularizacja, która ogranicza funkcję modelu. Strojonym tu parametrem jest C, reprezentujący siłę regularizacji. Przetestujmy 2 wartości tego parametru: 100 i 0.1, i zobaczmy, która da najlepszą wydajność modelu na danych testowych:
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]]
Różnica w dokładności modelu przy użyciu wybranych wartości parametru C jest nieistotna. Być może udałoby się znaleźć wartość, która poprawi działanie modelu bardziej, eksperymentując dalej z tym parametrem. Jednak tutaj mamy tylko 200 nowych cech, więc nasz model nie jest bardzo złożony i krok regularizacji w tym przypadku nie jest naprawdę potrzebny.
Zamiast przewidywać etykiety 0 lub 1 funkcją predict, można przewidywać prawdopodobieństwo nastroju za pomocą predict_proba. Trzeba pamiętać, że nie możemy bezpośrednio zastosować accuracy score ani macierzy pomyłek do przewidywanych prawdopodobieństw, ponieważ te metryki działają wyłącznie na klasach. Dlatego musimy je dalej zakodować jako klasy. Domyślnie prawdopodobieństwo większe lub równe 0.5 tłumaczy się na klasę 1, w przeciwnym razie na klasę 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]
Wnioski
Istnieje wiele innych pomocnych podejść, które możemy zastosować do naszego zbioru danych, aby przeprowadzić bardziej szczegółową analizę nastrojów:
- korzystanie z n‑gramów (kombinacji słów) zamiast pojedynczych słów, aby zachować kontekst,
- wykluczanie stop‑słów,
- ograniczanie rozmiaru słownika na podstawie górnych lub dolnych wartości częstości,
- tworzenie dodatkowych cech liczbowych opisujących długość każdej recenzji lub liczbę znaków interpunkcyjnych (te ostatnie czasem korelują z siłą nastroju),
- wykluczanie liczb, niektórych znaków, słów o określonej długości lub rozważanie bardziej złożonych wzorców słów,
- stosowanie stemmingu i lematyzacji, czyli sprowadzania słów do ich rdzeni,
- korzystanie z bardziej zaawansowanych metod niż BOW do tworzenia słownika, np. TfIdf (term frequency–inverse document frequency), które uwzględnia, jak często słowo pojawia się w recenzji względem pozostałych recenzji.
- użycie wyspecjalizowanych bibliotek do analizy nastrojów, takich jak TextBlob, SentiWordNet, VADER (Valence Aware Dictionary and Sentiment Reasoner).
Jeśli chcesz poznać te i inne techniki prowadzenia wnikliwej analizy nastrojów, sprawdź kurs Sentiment Analysis in Python.