こんにちは。ヌーラボの開発者の藤田です。今回は、とある機能のUXデザインの際、クラスタリング技術を応用してペルソナを作ったので、やり方をご紹介します。Pythonでクラスタリングを行うサンプルコード付きです。
目次
ペルソナ法について
UXデザインの一環として、ユーザーが実際にどう考え、どう行動するかのストーリーを作るというワークがあります。
この時、ターゲットユーザー集合の中にいると思われる架空の人物の社会的属性、志向性、嗜好などを細かく設定した「ペルソナ」を作っておいて、「自分だったらこう考えてこうする」ではなく「このペルソナの○○さんだったらこう考えてこうするはず」という行動を積み上げてストーリーを作るのがペルソナ法です。
参考:ヌーラボスタッフに聞いた!おすすめテンプレートをご紹介 | Cacooブログ
ペルソナ法の効用
よく言われている通り、ペルソナ法には様々なメリットがあります。
- 一人のユーザーがとる一貫したストーリーを複数人で考えることができる
- ペルソナに「□□サービスを使ったことがない」と書いてあれば、その状態を何回でも使い回せる
- ワーク参加者に「自分だったら〜〜〜と考えるかも、でもそれを言うのは恥ずかしい」といった羞恥心が生じないので、生々しい感情であっても「○○さんは〜〜〜と考えるはず」と話ができる
ペルソナ作成の難しさ
一方、ペルソナを作るのは結構難しいです。一般的に2通りの作り方がありますが、それぞれに難しさがあります。
方法1 想像で作る
ターゲットユーザー像をきっちり定義しておき、そのターゲットユーザー像から外れないように、ペルソナにどんな悩みや問題があり、どう解決したいと望んでいるかを想像で埋めていきます。
この方法は、ターゲットユーザーが世の中に広く知られている集合、たとえば「子育て中の母親」のような生活上の属性で、人数が多く、ウェブでいくらでも悩み相談の事例が見つかるような場合はそれほど難しくありません。
しかし、ヌーラボの場合は仕事で使うサービスについて考えるため、ターゲットユーザー像は「社員数100人規模の成長途中の企業の社員で、ITスキルはそこそこあって…」のような、業務上の属性になります。一つのサービスをいろんな人が使うのでペルソナは複数人作る必要があり、志向性や悩みを何パターンも想像するのは意外に難しいです。
ターゲットユーザーの属性に自分があてはまるのなら、自分をモデルにする手もあります。しかし、そうするとこんどは上に挙げたように「自分だったら〜〜〜と考えるかも、でもそれを言うのは恥ずかしい」といった羞恥心が邪魔をしてきます。
僕は最初想像で複数人を作ろうとしましたが、羞恥心を我慢してもどのペルソナも細部がだんだん自分に似てきてしまうし、自分から離そうとすると「そんな人ほんとにいるのかな」という不安が湧いてくるしで「これはダメだな」と断念しました。
方法2 インタビューで作る
ターゲットユーザー像の属性に当てはまるような人に詳しくインタビューして、その人をモデルに名前と顔を変えたくらいのペルソナを作る方法があります。
想像する難しさはありませんが、複数人のペルソナを作りたい場合、インタビュイーを何人も用意するのがまず大変です。そしてちょっと変わった特徴があった場合、後のワークの時に「それはターゲットユーザーの中でその人が特殊なだけではないのか?」という疑問がやはり解消できません。
もちろんこの疑問は方法1で作ったペルソナにも当てはまります。自分をモデルにしたペルソナが「この人が変わってるだけなんじゃないの?」と言われると地味に凹みます。
クラスタリングを用いたペルソナ作成
そこで試したのがクラスタリングという技術を用いたペルソナ作成です。クラスタリングが何なのかについては後述します。
以下の手順で行います。
- ターゲットユーザーのグループにUXストーリー周辺の価値観に関するアンケートを取る
- アンケート結果からクラスタリングでグループを抽出する
- クラスタリング結果を基に想像を加えてペルソナを作る
手順1 ターゲットユーザーのグループにUXストーリー周辺の価値観に関するアンケートを取る
今回UXストーリーを作りたい機能のターゲットユーザー像は「中規模の会社社員で、PCに慣れていて…」のような感じで、ヌーラボ自体もまあまあターゲットに入っていると言えたので、手っ取り早く社内でアンケートを取ることにしました。
仕事をうまく進めるための機能のUXストーリーづくりに利用するので、仕事周りの価値観や行動についての完全匿名のアンケートをGoogle Formsで作成しました。部署、年齢、性別などの個人情報は一切聞かず、価値観だけを聞くアンケートです。
こんな感じの、仕事に関わりそうな志向性や価値観を5段階で答える設問を13問用意しました。
また、社内で使われているITツールを15種類並べて、その習熟度を答える設問も作りました。
あまり深く考えずに作った設問でしたが、後でこれがとても役に立ちました。
手順2 アンケート結果からクラスタリングでグループを抽出する
設問は日本語と英語の両方で作り、社内でアンケートを募ったところ、76人ものヌーラバーが協力してくれました。ありがたいことです。
さて、ここで得られた76通りの回答データの中からある程度似通ったもの同士のグループを抽出するのにクラスタリングという技術を使います。
クラスタリングとは
たとえば、もし2問しか設問がなければ、各回答者を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
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()
デンドログラムを目視したところ、あまりわかりやすくきっちり分かれるグループは無さそうでした。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)
デンドログラムの時点で予想していたとおり、目に見えて下がるところはありませんでした。この方法でも最良のクラスタ数は見つからなかったので、デンドログラムの見た目でなんとなく決めたクラスタ数=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
アンケートの各回答者がどのクラスタ番号になったかという結果が得られました。
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ストーリーを作るワークの時に議論の内容が写真のユニークさに引っ張られてしまいそうになったのは反省点です。
今回作ったペルソナはこの先何度も使うことになりますし、ペルソナにマッチした写真を使うほうがリアルなユーザー像をイメージしやすくなりそうなので、次回のワークでは写真を変えようと思います。
おわりに
ペルソナ作成にアンケート結果のクラスタリングを利用する方法をご紹介しました。最終的に細部は想像で補う必要があるものの、骨格となる価値観のベースがデータを基にしていることによって、全てを想像するのに比べ、作る時に安心でき、できたペルソナもずっと納得感のあるものになりました。
アンケートでもっといろんな価値観を聞けばよかったとか、特徴がもっとはっきり出るように設問に工夫できたなど、反省点はいくつかありますが、まずまずいいペルソナが作れたと感じています。