
- Tình huống sử dụng khoa học dữ liệu trong bán hàng: Phân tích cảm xúc khách hàng
- Chuẩn bị tập dữ liệu
- Áp dụng phương pháp BOW
- Sử dụng mô hình học máy có giám sát để dự đoán cảm xúc
- Kết luận
Các trường hợp sử dụng khoa học dữ liệu có thể liên quan đến hầu như bất kỳ ngành nào nơi một lượng lớn dữ liệu đang hoặc có thể được tích lũy. Cửa hàng và trang web thương mại điện tử là nơi trải nghiệm khách hàng thực sự của những người bị thu hút bởi các chiến dịch tiếp thị diễn ra, và cũng là nơi thu thập dữ liệu mua sắm quý giá của một thương hiệu hoặc công ty cụ thể. Tại đây, mọi người đưa ra quyết định cuối cùng về việc họ có thực sự muốn mua một sản phẩm nào đó hay không, liệu họ có quan tâm đến việc mua thứ gì khác mà trước đó chưa dự định hay không, họ sẵn sàng trả bao nhiêu, liệu họ có quay lại cửa hàng này hay không, và họ sẽ để lại đánh giá như thế nào về trải nghiệm của mình.
Thật vậy, đánh giá của khách hàng là nguồn dữ liệu vững chắc để phân tích và hiểu những gì có thể thay đổi hoặc củng cố trong toàn bộ quy trình bán hàng. Phân tích dữ liệu theo cách này có thể giúp giảm chi phí, nâng cao hiệu quả vận hành, cải thiện trải nghiệm khách hàng, khám phá cơ hội mới, phát triển doanh nghiệp và cuối cùng là tăng doanh thu. Hãy cùng xem kỹ hơn cách phân tích và mô hình hóa thông tin quý giá này bằng các thuật toán khoa học dữ liệu, nhằm khai mở các insight ẩn và nắm bắt thông điệp tổng thể từ từng khách hàng.
Tình huống sử dụng khoa học dữ liệu trong bán hàng: Phân tích cảm xúc khách hàng
Phân tích cảm xúc khách hàng là quy trình tự động nhằm xác định cảm xúc của khách hàng khi họ sử dụng dịch vụ hoặc sản phẩm của một công ty nào đó. Thông thường, đây là dữ liệu văn bản phi cấu trúc được thu thập từ khảo sát trực tuyến, mạng xã hội, phiếu hỗ trợ, biểu mẫu phản hồi, đánh giá sản phẩm, diễn đàn, cuộc gọi điện thoại, email và chatbot. Trong học máy, phân tích cảm xúc khách hàng được thực hiện thông qua xử lý ngôn ngữ tự nhiên (NLP) áp dụng các phương pháp thống kê và ngôn ngữ học để trích xuất cảm xúc tích cực, tiêu cực và trung tính trực tiếp từ dữ liệu văn bản. Về bản chất, nó đưa ra hai tham số:
- Polarity (độ cực): cho biết cảm xúc là tích cực hay tiêu cực.
- Magnitude (cường độ): cho biết mức độ mạnh yếu của cảm xúc đó.
Phân tích cảm xúc khách hàng là công cụ then chốt cho bất kỳ doanh nghiệp hiện đại nào, vì nó giúp thu được insight có thể hành động, phát hiện và khắc phục các vấn đề lặp lại nghiêm trọng khiến khách hàng không hài lòng, củng cố các tính năng sản phẩm hoặc dịch vụ mang lại cảm xúc tích cực cho khách hàng, và ra quyết định dựa trên dữ liệu hiệu quả hơn nhìn chung. Ở cấp độ chi tiết hơn, phân tích cảm xúc khách hàng cho phép chúng ta:
- cải thiện dịch vụ khách hàng và qua đó nâng cao trải nghiệm,
- tăng mức độ trung thành của khách hàng,
- giảm tỷ lệ rời bỏ,
- nâng cấp sản phẩm và dịch vụ kịp thời,
- tối ưu hóa các chiến dịch tiếp thị,
- dự đoán xu hướng và thị trường mới,
- duy trì uy tín cao của công ty,
- tăng lợi nhuận.
Như với bất kỳ nhiệm vụ phân tích văn bản nào, có thể gặp một số cạm bẫy khi tiến hành phân tích cảm xúc khách hàng. Chẳng hạn, một số đánh giá có châm biếm mà thuật toán NLP không nắm bắt được và phân loại sai. Đôi khi nó cũng có thể không giải mã được các chữ viết tắt rất đặc thù hoặc từ lóng ít dùng.
Chuẩn bị tập dữ liệu
Hãy khám phá cách phân tích cảm xúc khách hàng hoạt động trong thực tế bằng cách sử dụng một tập dữ liệu các đánh giá phim trên 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
Chúng ta có hai cột: một cột chứa văn bản của từng đánh giá và một cột chứa ước lượng cảm xúc tổng thể: tích cực (1) hoặc tiêu cực (0).
Hãy tính tỷ lệ phần trăm các đánh giá tích cực và tiêu cực:
round(movies['label'].value_counts()*100/len(movies['label'])).convert_dtypes()
0 50
1 50
Name: label, dtype: Int64
Do đó, chúng ta có tỷ lệ gần như tương đương giữa đánh giá tích cực và tiêu cực.
Áp dụng phương pháp BOW
Bước tiếp theo là chuyển đổi dữ liệu văn bản sang dạng số vì mô hình học máy chỉ làm việc với đặc trưng số. Cụ thể, chúng ta sẽ tạo các đặc trưng đếm số lần mỗi từ xuất hiện trong đánh giá tương ứng. Cách tiếp cận cơ bản và trực quan nhất cho mục đích này gọi là bag-of-words (BOW), xây dựng một tập từ vựng gồm tất cả các từ xuất hiện trong tài liệu và đếm tần suất của mỗi từ trong từng đánh giá. Kết quả là chúng ta sẽ thu được các đặc trưng mới, mỗi đặc trưng ứng với một từ, kèm theo tần suất tương ứng.
Hãy áp dụng phương pháp BOW cho tập dữ liệu của chúng ta:
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]
Ở trên, chúng ta đã áp dụng tham số tùy chọn max_features để chỉ xét 200 từ được dùng nhiều nhất và tránh khả năng mô hình bị overfit.
Sử dụng mô hình học máy có giám sát để dự đoán cảm xúc
Bây giờ, chúng ta sẽ dùng một mô hình học máy có giám sát để dự đoán cảm xúc. Vì chúng ta muốn ước lượng xem cảm xúc từ một đánh giá mới thuộc nhóm tích cực hay tiêu cực dựa trên các đánh giá đã được gán nhãn, nên một lần nữa chúng ta đang xử lý bài toán phân loại. Hãy tiếp tục sử dụng thuật toán hồi quy logistic và đo độ chính xác của mô hình:
Accuracy score: 0.754
Confusion matrix:
[[37.62772101 13.23856064]
[11.32829853 37.80541981]]
Chúng ta thấy mô hình đã gán nhãn 11% trong số các đánh giá thực sự tích cực thành tiêu cực, và 13% thành tích cực dù chúng vốn là tiêu cực. Để cải thiện độ chính xác của mô hình, chúng ta có thể cân nhắc loại bỏ stopword (tức là các từ ít thông tin nhưng xuất hiện quá thường xuyên, như "about", "will", "you", v.v.) và tăng kích thước từ vựng.
Khi áp dụng BOW, chúng ta có thể tạo ra hàng trăm thậm chí hàng nghìn đặc trưng mới trong dataframe. Điều này có thể dẫn đến một mô hình quá phức tạp: overfit, với quá nhiều đặc trưng và tham số không cần thiết. Một cách khắc phục là sử dụng regularization (chuẩn hóa), giới hạn hàm mục tiêu của mô hình. Tham số cần tinh chỉnh ở đây là C, đại diện cho cường độ chuẩn hóa. Hãy thử 2 giá trị của tham số này: 100 và 0.1, và xem giá trị nào cho hiệu năng tốt hơn trên dữ liệu kiểm tra:
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]]
Sự khác biệt về độ chính xác của mô hình khi dùng các giá trị C đã chọn là không đáng kể. Có thể chúng ta sẽ tìm được tham số cải thiện hiệu năng hơn nếu thử nghiệm thêm nhiều giá trị khác. Tuy nhiên, ở đây chúng ta chỉ có 200 đặc trưng mới, nên mô hình không quá phức tạp và bước chuẩn hóa thực ra không thật sự cần thiết trong trường hợp này.
Thay vì dự đoán nhãn 0 hoặc 1 bằng hàm predict, chúng ta có thể dự đoán xác suất cảm xúc bằng predict_proba. Cần lưu ý rằng chúng ta không thể áp dụng trực tiếp độ chính xác hoặc ma trận nhầm lẫn cho các xác suất dự đoán, vì các thước đo này chỉ hoạt động với lớp. Do đó, ta cần mã hóa chúng lại thành lớp. Theo mặc định, xác suất lớn hơn hoặc bằng 0.5 được chuyển thành lớp 1, ngược lại là lớp 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]
Kết luận
Chúng ta còn nhiều cách tiếp cận hữu ích khác có thể áp dụng cho tập dữ liệu để thực hiện phân tích cảm xúc chi tiết hơn:
- sử dụng n-gram (tổ hợp từ) thay vì chỉ từng từ đơn lẻ để giữ ngữ cảnh,
- loại bỏ stopword,
- giới hạn kích thước từ vựng dựa trên ngưỡng tần suất trên hoặc dưới,
- tạo các đặc trưng số bổ sung mô tả độ dài mỗi đánh giá hoặc số lượng dấu chấm câu (yếu tố sau đôi khi tương quan với cường độ cảm xúc),
- loại trừ số, một số ký tự, từ có độ dài nhất định, hoặc xét đến các mẫu từ phức tạp hơn,
- áp dụng stemming và lemmatization, tức là đưa từ về gốc,
- sử dụng các phương pháp tinh vi hơn BOW để tạo từ vựng, ví dụ TfIdf (term frequency–inverse document frequency) tính đến việc một từ xuất hiện trong một đánh giá thường xuyên như thế nào so với phần còn lại.
- sử dụng một số thư viện chuyên dụng cho phân tích cảm xúc, như TextBlob, SentiWordNet, VADER (Valence Aware Dictionary and Sentiment Reasoner).
Nếu bạn muốn khám phá những kỹ thuật này và các phương pháp hữu ích khác để thực hiện phân tích cảm xúc sâu sắc, hãy xem khóa học Sentiment Analysis in Python.