メインコンテンツへスキップ

セールスのデータサイエンス:顧客感情分析

データサイエンスを用いて顧客の感情を分析し、販売最適化に役立つ洞察を得る方法を学びましょう。
更新 2026年8月31日  · 9 分 読む

AIで探索

ChatGPTClaudePerplexity

Artificial Intelligence Concept Illustration

データサイエンスのユースケースは、データが大量に蓄積されている、あるいは蓄積し得るほぼすべての業界に関連します。 実店舗やECサイトは、マーケティング施策に惹きつけられた人々が実際に顧客体験をする場であり、特定のブランドや企業の貴重な購買データが収集される場所です。ここで人々は、特定の商品を本当に購入したいかどうか、当初予定していなかった別のものに興味を持ったか、どのくらいの価格なら支払う用意があるか、再訪するかどうか、そしてその顧客体験についてどのようなレビューを残すか、といった最終判断を下します。 

実際、顧客レビューは、販売プロセス全体で何を変えるべきか、あるいは強化すべきかを分析・把握するための強力なデータ源です。このようにデータを分析することで、コスト削減、業務効率の向上、顧客体験の改善、新たな機会の発見、事業の成長、そして最終的には収益の増加が見込めます。ここでは、この貴重な情報をデータサイエンスのアルゴリズムでどのように分析・モデリングし、隠れた洞察を得て、個々の顧客からの全体的なメッセージを把握できるかを詳しく見ていきます。

セールスにおけるデータサイエンスのユースケース:顧客感情の分析 

顧客感情分析は、特定企業のサービスや製品を利用する際の顧客の感情を自動的に特定するプロセスです。通常、オンライン調査、ソーシャルメディア、サポートチケット、フィードバックフォーム、商品レビュー、フォーラム、電話、メール、チャットボットなどから収集される非構造化のテキストデータを扱います。機械学習では、自然言語処理(NLP)を通じて、統計的・言語学的手法を適用し、テキストデータから直接、肯定・否定・中立の感情を抽出します。基本的には、次の2つのパラメータを出力します。

  • 極性(Polarity):感情がポジティブかネガティブかを示す。
  • 強度(Magnitude):その感情の強さを示す。

顧客感情分析は、実行可能な示唆を得て、顧客を不満にさせる重大な反復的課題を特定・修正し、ポジティブな感情を生む製品・サービスの機能を強化し、全体としてより効率的なデータドリブンの意思決定を行うのに役立つため、あらゆる現代ビジネスにとって重要なツールです。より細かなレベルでは、顧客感情分析によって次のことが可能になります。

  • 顧客対応を改善し、その結果として顧客体験を向上させる
  • 顧客ロイヤルティを高める
  • 解約率を下げる
  • 製品・サービスを適時にアップグレードする
  • マーケティング施策を最適化する
  • 新しいトレンドや市場を見越す
  • 自社の高い評判を維持する
  • 利益を増やす

他のテキスト分析タスクと同様に、顧客感情分析の実施にあたってはいくつかの落とし穴があります。たとえば、NLPアルゴリズムは一部のレビューに含まれる皮肉を捉えられず、誤分類することがあります。また、ごく特定の略語や稀なスラングをうまく解読できない場合もあります。

データセットの準備

ここでは、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

列は2つあります。各レビュー本文と、全体的な感情の評価(ポジティブ=1、ネガティブ=0)です。

ポジティブ・ネガティブ各レビューの割合を計算します。

round(movies['label'].value_counts()*100/len(movies['label'])).convert_dtypes()
0    50
1    50
Name: label, dtype: Int64

したがって、ポジティブとネガティブの比率はほぼ同じです。

BOW手法の適用 

次のステップは、テキストデータを数値に変換することです。機械学習モデルは数値特徴量しか扱えないためです。具体的には、各単語が各レビューで何回出現したかを数える特徴量を作成します。最も基本的かつ直接的なアプローチがBag-of-Words(BOW)で、文書に出現するすべての単語の語彙を構築し、各レビューにおける各単語の出現頻度を数えます。その結果、単語ごとに1つの新しい特徴量が得られ、対応する頻度が格納されます。

データセットにBOW手法を適用してみましょう。

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]

上では、max_featuresというオプション引数を適用し、最も頻出する200語のみに絞ることで、潜在的な過学習を避けています。

教師あり機械学習モデルによる感情の予測

ここからは、教師あり機械学習モデルを使って感情を予測します。ラベル付きの既存レビューに基づいて、新しいレビューの感情がポジティブかネガティブかを推定したいので、分類問題を扱うことになります。ここでもロジスティック回帰アルゴリズムを用い、モデルの精度を測定します。

Accuracy score: 0.754

Confusion matrix:
[[37.62772101 13.23856064]
[11.32829853 37.80541981]]

このモデルでは、実際はポジティブだったレビューの11%をネガティブと誤分類し、実際はネガティブだったレビューの13%をポジティブと誤分類しました。精度向上のための方策としては、ストップワード(例:「about」「will」「you」など、情報量が少なく頻出する語)の除外や、語彙サイズの拡大が考えられます。

BOW手法を適用すると、データフレームに数百から数千の新しい特徴量が生まれる可能性があります。これは、不要な特徴量やパラメータが多すぎる過度に複雑な(過学習した)モデルを招くことがあります。これを抑える一つの方法が正則化で、モデルの関数を制約します。ここで調整するパラメータがCで、正則化の強さを表します。Cの値として100と0.1の2つを試し、テストデータでどちらがより良い性能を示すかを確認してみましょう。

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]]

選択したCの値による精度の差はごくわずかでした。さらに多くの値で試行すれば、性能をより向上させるパラメータが見つかる可能性はあります。しかし、ここでは新しい特徴量は200個に限られており、モデルはそれほど複雑ではないため、正則化は必須ではありません。

predict関数で0または1のラベルを予測する代わりに、predict_probaで感情の確率を予測することもできます。この場合、確率に対してはそのまま精度や混同行列を適用できません。これらの指標はクラスに対してのみ機能するためです。したがって、確率をクラスに変換する必要があります。既定では、確率が0.5以上ならクラス1、未満ならクラス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]

まとめ 

よりきめ細かな感情分析を行うために、このデータセットに適用できる有用なアプローチは他にも多数あります。

  • コンテキストを保つため、単語単体ではなくn-gram(単語の組合せ)を用いる
  • ストップワードを除外する
  • 出現頻度の上限または下限に基づいて語彙サイズを制限する
  • 各レビューの長さや句読点の数など、数値の補助特徴量を作成する(後者は感情の強度と相関する場合がある)
  • 数字や特定の文字、一定長の語を除外する、あるいはより複雑な語のパターンを考慮する
  • ステミングやレンマ化(語を語幹や原形に還元する)を適用する
  • BOWより高度な語彙作成手法を使う(例:TfIdf=term frequency inverse document frequency。レビュー全体に対する相対的な出現頻度を考慮する)
  • TextBlob、SentiWordNet、VADER(Valence Aware Dictionary and Sentiment Reasoner)など、感情分析向けの特化ライブラリを活用する

これらの手法や、洞察に富む感情分析のためのその他の有用なテクニックに関心があれば、コース「Sentiment Analysis in Python」をご覧ください。

トピック
データサイエンス
機械学習