LoginSignup
2
2

More than 5 years have passed since last update.

実務に役立つかどうかちょこっとだけk平均法によるクラスタリングを試してみた

Posted at

はじめに

  • 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

まとめ

  • プログラムコメントにも書いてるように、閲覧ページの加算が高いほど意欲が高く、低いほど意欲も低いような傾向になんとなく見えます。
  • 例えば、このデータを元に意欲の高いユーザのページ行動フローや流入経路を分析したり、ラベル毎にアプローチを変えてみたりとかできそうですね。
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2