はじめに
- WEBサービスを運営していることから、レコメンデーションなどがとっつきやすい実例なのかもしれないと思い、軽く触ってみました。
- 専門的に設定値や軸などがそもそも正しいのかは置いておいて、仮定のような状態としてあります。
参考
scikit-learn による最も基本的なクラスタリング分析
scikit-learnのインストール
pip install scikit-learn
概要
- 例えば、お店を紹介するようなWEBサービスがあるとします。
- WEBページは主に検索ページ、店舗ページ、CVの入力/確認ページ、CVの完了ページがあるとします。
- ユーザの行動履歴を用いてユーザの検索意欲やCV意欲をクラスタリングできればと思います。
- 以下のプログラムコメントに記載はありますが、ページによってポイントを振って重みをつけてます。
- また、ユーザの行動履歴を各店舗毎に最終閲覧ページ番号をランダムにデータとして用いてます。
プログラム
#!/usr/local/bin/python3
#! -*- coding: utf-8 -*-
import numpy as np
from sklearn.cluster import KMeans
if __name__ == '__main__':
# 店舗毎に番号を与える
#
# 行はユーザ
# 各配列キーは店舗
#
# 最終閲覧ページ(検索/CV意欲が高いほど数値が高い)
# 0: 未閲覧
# 1: その他
# 2: 検索
# 3: 店舗
# 4: CV入力/確認
# 5: CV完了
features = np.array([
[ 0, 5, 0 ],
[ 1, 3, 0 ],
[ 3, 1, 3 ],
[ 3, 2, 2 ],
[ 5, 0, 1 ],
[ 1, 0, 2 ],
[ 2, 3, 4 ],
[ 4, 2, 2 ],
[ 5, 3, 2 ],
[ 5, 4, 5 ],
[ 0, 1, 3 ],
[ 0, 2, 0 ],
[ 0, 0, 1 ],
[ 0, 2, 2 ],
[ 2, 4, 4 ],
[ 3, 4, 1 ],
[ 1, 0, 2 ],
[ 2, 4, 5 ],
[ 0, 1, 4 ],
[ 0, 0, 0 ],
[ 4, 0, 3 ],
[ 4, 3, 3 ],
[ 4, 0, 2 ],
[ 5, 3, 0 ],
[ 5, 4, 0 ],
[ 2, 0, 4 ],
[ 3, 2, 2 ],
[ 1, 1, 2 ],
[ 0, 2, 0 ],
[ 2, 3, 3 ],
[ 3, 2, 3 ],
[ 0, 5, 4 ],
[ 0, 3, 4 ],
[ 1, 0, 5 ],
[ 2, 5, 4 ],
[ 3, 4, 0 ],
[ 4, 5, 3 ],
])
# K-meansクラスタリングをおこなう
# この例では3つのグループに分割 (メルセンヌツイスターの乱数の種を10とする)
kmeans_model = KMeans(n_clusters=3, random_state=10).fit(features)
# 分類先となったラベルを取得する
labels = kmeans_model.labels_
# label クラスタリングラベル
# 0: 検索意欲/CV意欲が高いユーザ
# 1: 検索意欲/CV意欲がまずまずなユーザ
# 2: 検索意欲/CV意欲が低いユーザ
# feature 店舗毎の最終閲覧番号
# feature.sum() 最終閲覧ページ番号の加算
for label, feature in zip(labels, features):
print(label, feature, feature.sum())
実行結果
2 [0 5 0] 5
2 [1 3 0] 4
1 [3 1 3] 7
1 [3 2 2] 7
1 [5 0 1] 6
2 [1 0 2] 3
0 [2 3 4] 9
1 [4 2 2] 8
1 [5 3 2] 10
0 [5 4 5] 14
2 [0 1 3] 4
2 [0 2 0] 2
2 [0 0 1] 1
2 [0 2 2] 4
0 [2 4 4] 10
1 [3 4 1] 8
2 [1 0 2] 3
0 [2 4 5] 11
2 [0 1 4] 5
2 [0 0 0] 0
1 [4 0 3] 7
1 [4 3 3] 10
1 [4 0 2] 6
1 [5 3 0] 8
1 [5 4 0] 9
2 [2 0 4] 6
1 [3 2 2] 7
2 [1 1 2] 4
2 [0 2 0] 2
0 [2 3 3] 8
1 [3 2 3] 8
0 [0 5 4] 9
0 [0 3 4] 7
2 [1 0 5] 6
0 [2 5 4] 11
1 [3 4 0] 7
0 [4 5 3] 12
まとめ
- プログラムコメントにも書いてるように、閲覧ページの加算が高いほど意欲が高く、低いほど意欲も低いような傾向になんとなく見えます。
- 例えば、このデータを元に意欲の高いユーザのページ行動フローや流入経路を分析したり、ラベル毎にアプローチを変えてみたりとかできそうですね。