UXデザインのペルソナ作成にクラスタリング技術を使った

こんにちは。ヌーラボの開発者の藤田です。今回は、とある機能のUXデザインの際、クラスタリング技術を応用してペルソナを作ったので、やり方をご紹介します。Pythonでクラスタリングを行うサンプルコード付きです。

ペルソナ法について

UXデザインの一環として、ユーザーが実際にどう考え、どう行動するかのストーリーを作るというワークがあります。

この時、ターゲットユーザー集合の中にいると思われる架空の人物の社会的属性、志向性、嗜好などを細かく設定した「ペルソナ」を作っておいて、「自分だったらこう考えてこうする」ではなく「このペルソナの○○さんだったらこう考えてこうするはず」という行動を積み上げてストーリーを作るのがペルソナ法です。

ペルソナの属性を書き込んだカードのサンプル

参考:ヌーラボスタッフに聞いた!おすすめテンプレートをご紹介 | Cacooブログ

ペルソナ法の効用

よく言われている通り、ペルソナ法には様々なメリットがあります。

  • 一人のユーザーがとる一貫したストーリーを複数人で考えることができる
  • ペルソナに「□□サービスを使ったことがない」と書いてあれば、その状態を何回でも使い回せる
  • ワーク参加者に「自分だったら〜〜〜と考えるかも、でもそれを言うのは恥ずかしい」といった羞恥心が生じないので、生々しい感情であっても「○○さんは〜〜〜と考えるはず」と話ができる

ペルソナ作成の難しさ

一方、ペルソナを作るのは結構難しいです。一般的に2通りの作り方がありますが、それぞれに難しさがあります。

方法1 想像で作る

ターゲットユーザー像をきっちり定義しておき、そのターゲットユーザー像から外れないように、ペルソナにどんな悩みや問題があり、どう解決したいと望んでいるかを想像で埋めていきます。

この方法は、ターゲットユーザーが世の中に広く知られている集合、たとえば「子育て中の母親」のような生活上の属性で、人数が多く、ウェブでいくらでも悩み相談の事例が見つかるような場合はそれほど難しくありません。

しかし、ヌーラボの場合は仕事で使うサービスについて考えるため、ターゲットユーザー像は「社員数100人規模の成長途中の企業の社員で、ITスキルはそこそこあって…」のような、業務上の属性になります。一つのサービスをいろんな人が使うのでペルソナは複数人作る必要があり、志向性や悩みを何パターンも想像するのは意外に難しいです。

ターゲットユーザーの属性に自分があてはまるのなら、自分をモデルにする手もあります。しかし、そうするとこんどは上に挙げたように「自分だったら〜〜〜と考えるかも、でもそれを言うのは恥ずかしい」といった羞恥心が邪魔をしてきます。

僕は最初想像で複数人を作ろうとしましたが、羞恥心を我慢してもどのペルソナも細部がだんだん自分に似てきてしまうし、自分から離そうとすると「そんな人ほんとにいるのかな」という不安が湧いてくるしで「これはダメだな」と断念しました。

方法2 インタビューで作る

ターゲットユーザー像の属性に当てはまるような人に詳しくインタビューして、その人をモデルに名前と顔を変えたくらいのペルソナを作る方法があります。

想像する難しさはありませんが、複数人のペルソナを作りたい場合、インタビュイーを何人も用意するのがまず大変です。そしてちょっと変わった特徴があった場合、後のワークの時に「それはターゲットユーザーの中でその人が特殊なだけではないのか?」という疑問がやはり解消できません。

もちろんこの疑問は方法1で作ったペルソナにも当てはまります。自分をモデルにしたペルソナが「この人が変わってるだけなんじゃないの?」と言われると地味に凹みます。

クラスタリングを用いたペルソナ作成

そこで試したのがクラスタリングという技術を用いたペルソナ作成です。クラスタリングが何なのかについては後述します。

以下の手順で行います。

  1. ターゲットユーザーのグループにUXストーリー周辺の価値観に関するアンケートを取る
  2. アンケート結果からクラスタリングでグループを抽出する
  3. クラスタリング結果を基に想像を加えてペルソナを作る

手順1 ターゲットユーザーのグループにUXストーリー周辺の価値観に関するアンケートを取る

今回UXストーリーを作りたい機能のターゲットユーザー像は「中規模の会社社員で、PCに慣れていて…」のような感じで、ヌーラボ自体もまあまあターゲットに入っていると言えたので、手っ取り早く社内でアンケートを取ることにしました。

仕事をうまく進めるための機能のUXストーリーづくりに利用するので、仕事周りの価値観や行動についての完全匿名のアンケートをGoogle Formsで作成しました。部署、年齢、性別などの個人情報は一切聞かず、価値観だけを聞くアンケートです。

ペルソナ作成のためのアンケートの冒頭部分のキャプチャ。説明文にこう書かれている。「システムのUX設計をするにあたり、社内ユーザーをモデルにしたペルソナを複数作成しようとしています。みなさんの回答内容をクラスタリングして典型的な人物像を数パターン合成するのに用います。 アクセス権を限定するためにログイン必須としていますが、個人情報は収集していません。したがって、誰がどのような考えを持っているかといった紐付けはできません。 パターンを抽出するだけなので、多数派の意見を尊重することもありません。 選択肢が多少極端かな?と感じても、1だと思ったら1、5だと思ったら5を直感に従って選んでください。ちょっと遠慮して2や4にしないでください。(もちろん、直感で2だと思ったら2を選んでください。)」アンケート冒頭にいろいろ書いておくことで正直な回答に近づける努力(効果は不明)

アンケートの設問例。設問の内容は以下。 あなたの仕事のスピード感はどちらに近いですか。(1〜5) 1. 最速でレスポンスを返すのが重要 5. じっくり取り組んで良いものを出したい リモートワークで同僚と顔を合わせないことについて(1〜5) 1. 特に困らない 5. もっと直接会いたい 定型的な業務をマニュアルやフローチャート等で明確に規定して運用することについてあなたの意見は(1〜5) 1. 特に意見を持っていない 5. 常に必ずそうするべき価値観に関する設問(13問)

こんな感じの、仕事に関わりそうな志向性や価値観を5段階で答える設問を13問用意しました。

また、社内で使われているITツールを15種類並べて、その習熟度を答える設問も作りました。

アンケートの設問例。あなたが業務に使うツールの習熟度はどのくらいですか。 1. 使わない/わからない 2. 少し使っているが自信がない 3. 基本的な機能だけ使う 4. 管理または応用的な機能も使う 5. 拡張したりAPIを使ったりする Backlog	 Typetalk	 Cacoo	 Google Spreadsheet	 Google Docs	習熟度に関する設問(15問)

あまり深く考えずに作った設問でしたが、後でこれがとても役に立ちました。

手順2 アンケート結果からクラスタリングでグループを抽出する

設問は日本語と英語の両方で作り、社内でアンケートを募ったところ、76人ものヌーラバーが協力してくれました。ありがたいことです。

さて、ここで得られた76通りの回答データの中からある程度似通ったもの同士のグループを抽出するのにクラスタリングという技術を使います。

クラスタリングとは

たとえば、もし2問しか設問がなければ、各回答者を2次元の平面上にプロットして人間がぱっと見るだけで回答者をグループ分けできます。

2次元のグラフ。縦軸は「自分の仕事と他人の仕事どちらを優先しますか」で上が「自分の仕事」、下が「他人の仕事」。横軸は「リモートワークで通勤がないことについて」で左が「通勤がないの最高」右が「会社に行きたい」となっている。グラフ上に7つの人物アイコンがプロットされており、縦軸と横軸の中央で切った4つの象限にあるアイコンを赤線で囲んだ4つの円。縦軸中央より上と下にある赤い円同士を囲んだ2つの青い円。

最も近い者同士で分けると、図中の赤線のような4つのグループ(クラスター)ができます。クラスターをもっと少なくしたければ青線のように近い者同士で2つにまとめることもできます。これを2次元でなく何次元でもできるようにするのがクラスタリングです。

今回のアンケートは価値観とアプリケーション習熟度の合計28問あるので、28次元空間上に76人の回答者をプロットしてグループを抽出します。まとまりがいくつできるかはやってみるまでわかりません。幸い、Python言語でいいライブラリが公開されているので、自分で計算式を書かずにとても簡単にできます。ありがたいです。

クラスタリング処理・実装編

実際のコードをご紹介します。Jupyter Notebookで途中の状態を出力しながら書きました。

使用ライブラリ

  • pandas
  • numpy
  • matplot
  • seaborn
  • sklearn

1 CSVファイルを読み込む

Google Formの結果をCSVファイルとしてエクスポートしたものを使います。

df = pd.read_csv(f"data/my-servey-result.csv")
all_data = df.drop(['タイムスタンプ'], axis=1)
all_data

Jupyter Notebookの出力のスクリーンショット。アンケートの全回答が表形式になっている。Jupyter Notebookの出力。

2 デンドログラムを作ってみて、ざっとクラスタ数の見当をつける

まず最も近いもの同士をクラスターにまとめ、それらのクラスター同士を近いもの同士でまとめ、それらをさらに近い者同士で…というように階層的にクラスタリングするとトーナメント表のようなツリー構造ができます。これをデンドログラムといいます。

from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set(font="Ricty Diminished")

hclust = linkage(all_data, metric="euclidean", method="ward")
plt.figure(figsize=(12, 8))
dendrogram(hclust)
plt.show()

Jupyter Notebookの出力のスクリーンショット。トーナメント表のようなグラフ。中央辺りに横線が引いてあり、5本の縦線と交わる。注釈「この辺を閾値にすると5つのクラスタができる」色分けはscipyが勝手にやってくれました

デンドログラムを目視したところ、あまりわかりやすくきっちり分かれるグループは無さそうでした。scipyライブラリが色分けでお薦めしてくれてるのもあり、クラスタ数は5ぐらいが良さそうかなと思いました。

3 クラスタ数の見当をつける他の手法

他の手法でも試してみます。実際にクラスタ数を1から10まで変えながら、最もよく使われるアルゴリズムであるK-means法でクラスタリングしてみて、クラスタ中心から各点までの距離の合計が急に大きく下がるところがあればそれが「良いクラスタ数」です。

from numpy import ndarray
from sklearn.cluster import KMeans

def determine_cluster_number(data: ndarray):
    result = []
    for i in range(1, 11):
        km = KMeans(n_clusters=i, n_init=10, max_iter=300, random_state=42)
        km.fit(data)
        result.append(km.inertia_)
    plt.plot(range(1, 11), result)
    plt.xlabel('クラスタ数')
    plt.ylabel('Distortion')
    plt.show()

all_data_array = all_data.values
determine_cluster_number(all_data_array)

折れ線グラフ。縦軸Distortion、横軸クラスタ数。左上から右下に向かってなだらかに下がるグラフ。良いクラスタ数、見つからず

デンドログラムの時点で予想していたとおり、目に見えて下がるところはありませんでした。この方法でも最良のクラスタ数は見つからなかったので、デンドログラムの見た目でなんとなく決めたクラスタ数=5に決めました。

4 K-means法でクラスタリングする

def make_clusters_kmeans(data: ndarray):
    km = KMeans(n_clusters=5, random_state=42)
    return km.fit_predict(data)

all_data_pred = make_clusters_kmeans(all_data.values)
all_data_pred 

クラスタリング結果の表。2列のうち1列目は0、1、2、3のように増えている。2列めは3、2、1、2、1のようにランダムな数。

アンケートの各回答者がどのクラスタ番号になったかという結果が得られました。

5 各グループの回答の平均値を求める

グループを特徴づけるために設問ごとの回答の平均値を求めます。

def make_cluster_mean(cluster_id: int) -> pd.DataFrame:
    df = clustered_data[clustered_data['cluster ID'] == cluster_id]
    return df.drop(['cluster ID'], axis=1).mean()

cluster0_data = make_cluster_mean(0)
cluster1_data = make_cluster_mean(1)
cluster2_data = make_cluster_mean(2)
cluster3_data = make_cluster_mean(3)
cluster4_data = make_cluster_mean(4)
all_clusters = pd.DataFrame({'cluster 0': cluster0_data,
'cluster 1': cluster1_data,
'cluster 2': cluster2_data,
'cluster 3': cluster3_data,
'cluster 4': cluster4_data})
all_clusters

これをCSV出力してGoogle Spreadsheetに取り込み、見やすいようにグラフにしました。

後の工程も自分がめちゃくちゃ見返すのでとにかく見やすく工夫した

手順3 クラスタリング結果を基に想像を加えてペルソナを作る

ここまでの結果として、76人のアンケート回答から5つのグループが抽出でき、そのグループごとに各回答の平均値が得られました。次はその平均値からペルソナを作ります。

抽出したグループの特徴をとらえる

まず各グループを特徴づける価値観をとらえます。考え方の説明のため、上の「もし設問が2つだけだったら」の例を使います。

青線のように2つのグループを作った場合、それぞれのグループをはっきり分けているのは「自分の仕事と他人の仕事どちらを優先しますか」の軸だと言えます。「自分の仕事を優先する」グループはリモートワークについての意見はまんべんなく分布しているため、グループとしての特徴とは言えなさそうです。一方、「他人の仕事を優先する」グループは、リモートワークについてはやや「会社に行きたい」側に寄っているので、それはグループの特徴と言えます。

グループの特徴を使ってペルソナを作成する

上の単純化した例を継続します。

次のような特徴を持つ2つのグループが得られ、ここから2人のペルソナを作るとします。

  • [グループ1] 自分の仕事を優先する
  • [グループ2] 他人の仕事を優先し、やや会社に行きたい

[グループ2]から作るペルソナは考えやすいです。自分の仕事より他人の仕事を優先、自宅でやるよりは会社で仕事したいという性格付けです。なんとなく優しげな、お人好しなイメージが浮かんできますね。

[グループ1]は、リモートワークについての価値観の平均値が「3.0」です。これは「その項目の価値観がない」のではなく「その項目はどんなふうにペルソナを作っても誰か実在する」ということだと考えます。なので、平均値が「3」付近の価値観については他のペルソナとの兼ね合いを見ながら恣意的に決めていいことにしました。

このように恣意的な部分が出てはきますが、それでもベースとなる価値観はデータに基づいているので作るときの安心感が全然違います。

価値観の設問は実際には13問あるので、その結果をもとにグループごとの価値観の特徴を決めていきました。

ITツールの習熟度に関する設問が役立った

社内で利用しているITツールの習熟度をアンケートで聞いていたことが、ペルソナの性格付けに非常に役に立ちました。

たとえば、AWSの習熟度平均が4.2と突出して高いグループがあり、そのグループは「リモートよりもっと直接会いたい」「気分はパフォーマンスに影響する」「業務で学習するのが大好き」などの特徴がありました。それらを基にしつつ他のグループと見比べながら「飲み会好きSRE」というペルソナを作りました。ITツール習熟度の特徴からペルソナの部署を決められたのはラッキーでした。

また、あるグループはITツールの習熟度が全体的に他のグループより低くなっていたので、ペルソナの部署を考える時に、『開発やマーケティング関係のITツールの習熟度が低い』→『開発やマーケティング以外の職種にしよう』→『事務系』のように決めることができました。

ヌーラボの開発者の多くが使っているIntelliJについても聞いていて、習熟度が突出したグループができて開発者のペルソナにできるかなと少し期待しましたが、開発者は全グループに満遍なくばらけたらしく、IntelliJの習熟度が特に突出したグループはできませんでした。クラスタリング、面白いです。

細部を想像で補う

グループごとの基本的な性格付けをした後、細部やアンケートで聞かなかったデモグラフィックの部分を想像で補っていきます。

以上のようにして28問、76人のアンケート回答から、「アンケート対象(ターゲットユーザー像)の価値観をある程度代表していて、誰でもない」ペルソナを5人分作成できました。

写真をつける

写真がユニークすぎた

写真にはちょっとウケを狙ってマッスルプラスさんのユニークな人物写真を使わせてもらいました。

ですが、この後のUXストーリーを作るワークの時に議論の内容が写真のユニークさに引っ張られてしまいそうになったのは反省点です。

今回作ったペルソナはこの先何度も使うことになりますし、ペルソナにマッチした写真を使うほうがリアルなユーザー像をイメージしやすくなりそうなので、次回のワークでは写真を変えようと思います。

おわりに

ペルソナ作成にアンケート結果のクラスタリングを利用する方法をご紹介しました。最終的に細部は想像で補う必要があるものの、骨格となる価値観のベースがデータを基にしていることによって、全てを想像するのに比べ、作る時に安心でき、できたペルソナもずっと納得感のあるものになりました。

アンケートでもっといろんな価値観を聞けばよかったとか、特徴がもっとはっきり出るように設問に工夫できたなど、反省点はいくつかありますが、まずまずいいペルソナが作れたと感じています。

開発メンバー募集中

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる