形態素解析のMecabを使用して、自由記述形式のアンケートをクラスタリングしてみます。
「最近導入されたキャッシュレス決済に関するご意見をお聞かせください。」
このようなアンケートの回答をchatGPTに作成依頼をしました。
10件分の回答が以下の表です。
回答番号 | アンケート回答 |
---|---|
回答1 | キャッシュレス決済は非常に便利です。特にスマホ一つで支払いが完了するので、財布を持ち歩かなくても良くなりました。 |
回答2 | セキュリティが心配です。個人情報の漏洩や不正利用のリスクがあるのではないかと思います。 |
回答3 | 店舗での支払いが速くなり、待ち時間が短縮されてとても助かっています。 |
回答4 | キャッシュレス化により、現金を使う高齢者が不利になっていると感じます。全ての人がキャッシュレスに対応できるわけではありません。 |
回答5 | ポイント還元やキャンペーンが魅力的で、積極的にキャッシュレス決済を利用しています。 |
回答6 | スマホのバッテリーが切れた時に支払いができなくなるのが困ります。常に充電を意識する必要がある。 |
回答7 | キャッシュレス決済の普及で、お金の管理が簡単になりました。支出の記録が自動で残るので、家計簿をつける手間が省けます。 |
回答8 | まだ使い慣れていないので、操作が複雑に感じます。特に多くのアプリやサービスがある中で、どれを選べば良いのか迷います。 |
回答9 | オフラインでの支払いができない場合があるので、完全にキャッシュレスに頼ることはできません。 |
回答10 | キャッシュレス決済のおかげで、海外旅行がより便利になりました。異国の通貨を気にせずに済むので、旅行が楽になります。 |
このアンケート結果をクラスタリングしてみましょう。
まずはインストールから
! pip install mecab-python3 unidic-lite
クラスタリングを行うために、sklearnのKMeansを使用します。
具体的な手順は以下の通りです。
①アンケート結果を読み込む
②TF-IDFベクトルで数値化する
③クラスタリングする
TF-IDFベクトルについては、この記事をご覧ください
作成したコードです。
import MeCab
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
# 形態素解析を行う関数
def tokenize(text):
tagger = MeCab.Tagger()
tagger.parse('')
node = tagger.parseToNode(text)
words = []
while node:
pos = node.feature.split(',')[0]
if pos in ['名詞']: # 名詞を抽出
words.append(node.surface)
node = node.next
return words
# アンケートデータ
survey_responses = [
'キャッシュレス決済は非常に便利です。特にスマホ一つで支払いが完了するので、財布を持ち歩かなくても良くなりました。',
'セキュリティが心配です。個人情報の漏洩や不正利用のリスクがあるのではないかと思います。',
'店舗での支払いが速くなり、待ち時間が短縮されてとても助かっています。',
'キャッシュレス化により、現金を使う高齢者が不利になっていると感じます。全ての人がキャッシュレスに対応できるわけではありません。',
'ポイント還元やキャンペーンが魅力的で、積極的にキャッシュレス決済を利用しています。',
'スマホのバッテリーが切れた時に支払いができなくなるのが困ります。常に充電を意識する必要がある。',
'ャッシュレス決済の普及で、お金の管理が簡単になりました。支出の記録が自動で残るので、家計簿をつける手間が省けます。',
'まだ使い慣れていないので、操作が複雑に感じます。特に多くのアプリやサービスがある中で、どれを選べば良いのか迷います。',
'オフラインでの支払いができない場合があるので、完全にキャッシュレスに頼ることはできません。',
'キャッシュレス決済のおかげで、海外旅行がより便利になりました。異国の通貨を気にせずに済むので、旅行が楽になります。'
]
# TF-IDFベクトル化
vectorizer = TfidfVectorizer(tokenizer=tokenize)
X = vectorizer.fit_transform(survey_responses)
# KMeansクラスタリング
num_clusters = 3 # クラスタの数
model = KMeans(n_clusters=num_clusters, random_state=42)
model.fit(X)
# 各アンケートをクラスタに割り当て
labels = model.labels_
# クラスタリング結果の出力
for i, label in enumerate(labels):
print(f"アンケート {i+1}: クラスタ {label}")
クラスタ数を3にすると、こんな分類になる。
アンケート 1: クラスタ 2
アンケート 2: クラスタ 1
アンケート 3: クラスタ 2
アンケート 4: クラスタ 2
アンケート 5: クラスタ 1
アンケート 6: クラスタ 2
アンケート 7: クラスタ 1
アンケート 8: クラスタ 0
アンケート 9: クラスタ 2
アンケート 10: クラスタ 1
もう少しきれいにクラスタリングできるように模索しようと思う。