🌊

【個性を可視化!?】 Big Fiveを可視化してみる

2022/01/13に公開

はじめに

今回は、複数人のBig Five (personality traits)をクラスタリングし、可視化を行う方法を紹介します。これを行うことによって、誰と誰が似ているのかといった情報を視覚的に確認することが可能になります。

本記事では、以下の手順でBig Fiveの因子を可視化します。

  1. 複数人のBig Fiveの因子を用意
  2. 因子を特徴ベクトルに変換
  3. 特徴ベクトルを2次元に次元削減
  4. 2次元ベクトルをグラフにプロット

注意事項

本記事で実際に紹介しているのは、Big Fiveの因子の可視化方法のみです。これが正しく個性の可視化を行えているかどうかは、Big Fiveの主張の妥当性によります。個性を可視化できていると主張するには、Big Fiveの主張が正しいと証明する必要があります。

Big Fiveとは

Big Five (personality traits) については、英語と日本語のWikipediaがあるので詳しくは以下のページをご覧ください。

https://en.wikipedia.org/wiki/Big_Five_personality_traits

https://ja.wikipedia.org/wiki/ビッグファイブ_(心理学)

Big Fiveでは、人間の個性は以下の5つの性格特性(因子)によって分類できると考えられています。

  • 開放性 (Openness to experience)
  • 誠実性 (Conscientiousness)
  • 外向性 (Extraversion)
  • 協調性 (Agreauleness)
  • 神経症傾向 (Neuroticism)

これらの各因子は、簡単なテストの回答結果より定量化され、数値によって表現されます。
Big FiveのテストはWeb上で行うことができ、以下はそのサービスの例です。

https://bigfive-test.com/

特徴量とは

特徴量(feature)とは、文字通り対象の特徴を表現する数量(数値)のことです。
もう少し噛み砕くと、対象の一部を数値として捉えたものであると言えます。

特徴量(英: feature)はデータを変形して得られ、その特徴を表現し、続く処理に利用される数値である[1]。表現(英: representation)とも。
https://ja.wikipedia.org/wiki/特徴量 より

特徴量の身近な例として、身長や体重が挙げられます。これらは、対象人物の身体的な特徴の一部を数値として捉えたものです。

特徴量を抽出することによって、対象データの概要把握、比較、統計的な処理の適用をした上で対象を定量的に捉えることが可能となります。また、機械学習の分野では、特徴量を要素とするベクトルを特徴ベクトル(feature vector)と呼びます。

先程の例の身長、体重はどちらも特徴量だったため、これらを組み合わせた(身長, 体重)というデータは特徴ベクトルであると解釈することができます。

勘の良い方はもう既にお気づきかと思いますが、テストの回答結果から人物の一部を数値として捉えたBig Fiveの各因子は、一種の特徴量であると言えます。そして、Big Fiveの5つの因子を組み合わせた(開放性, 誠実性, 外向性, 協調性, 神経症傾向)というデータは特徴ベクトルであると言えます。

本記事では、Big Fiveの5つの因子を特徴ベクトルであると解釈し、複数人の特徴ベクトルを集めたものを2次元グラフとして可視化します。

次元削減とは

Big Fiveの因子を特徴ベクトルとして解釈することにしましたが、この特徴ベクトルを可視化する上で問題となる点があります。それは、一般的に人間が目で確認できるのは3次元までであるという点です。今回取り扱う特徴ベクトルは、5次元ベクトルであるため、可視化を行うために3次元以下に変換しなければなりません。

このような状況は、高次元のデータを取り扱う機械学習の分野では頻繁に起こります。高次元のデータを低次元のデータに変換することを次元削減(dimensionality reduction)と呼びます。次元削減は、データの本質的な部分のみ抽出したり、データの可視化を行う際に利用されます。次元削減を行う際は、高次元で距離が近いデータは低次元になった際にも距離が近くなるように配置されます。これにより、高次元上でのデータの意味をある程度保った低次元のデータが獲得できます。

次元削減には、主に次のようなアルゴリズムが利用されます。

  • PCA (Principal Component Analysis: 主成分分析)
  • t-SNE (t-distributed Stochastic Neighbor Embedding)
  • UMAP (Uniform Manifold Approximation and Projection)

本記事では、高速・高性能に次元削減を行うことができるUMAPを利用し、Big Fiveの5次元の特徴ベクトルを2次元のベクトルに次元削減します。
UMAPは、Pythonのライブラリがオープンソースで公開されており、以下のリポジトリのものを利用することで簡単に次元削減を行うことができます。

https://github.com/lmcinnes/umap

UMAPについては、以下のQiitaの記事にてわかりやすくまとめられているため、興味のある方はご一読をおすすめします。

https://qiita.com/odanny/items/06ab88353bcee7bf6aa7

可視化

必要な情報は揃ったので実際にBig Fiveを可視化してみましょう!
今回、プログラムの実装にはPythonを利用します。

事前準備

インストール

前提として、以下のライブラリ(umap-learn, matplotlib)をインストールしておく必要があります。

pip3 install umap-learn matplotlib

データセットの用意

複数人のBig Fiveのテスト結果を以下のようなCSVファイルとして保存しておきます。以下のCSVファイルは、今回実際に利用するためにランダムに生成した10人分のサンプルデータです。

big5.csv
Name,Neuroticism,Extraversion,Openness To Experience,Agreeableness,Conscientiousness
Liam,22,88,114,33,39
Noah,5,56,110,104,12
Elijah,66,25,22,58,63
Oliver,74,19,36,104,104
Lucas,10,78,86,20,85
Olivia,32,25,72,96,27
Emma,13,52,22,89,21
Ava,63,72,29,60,34
Sophia,69,4,62,26,49
Amelia,96,4,93,33,50

実装

以下の3つの関数に分割して機能を実装します。

  • CSVファイルの読み込み (load_big5_csv)
  • ベクトルの次元削減 (get_2d_vectors)
  • グラフの描画・保存 (save_big5_fig)

各関数は、最終的に以下のmain関数で動作するようなインターフェースにします。

big5.py
def main():
    n_neighbors = 3
    labels, vectors = load_big5_csv('big5.csv')
    vectors = get_2d_vectors(vectors, n_neighbors)
    save_big5_fig('big5.png', 'Big 5', labels, vectors)

main()

CSVファイルの読み込み

この関数では、データセットのCSVからラベル(人物名)と特徴ベクトル(Big Five因子)の組を読み込みます。

big5.py
def load_big5_csv(csv_path: str):
    with open(csv_path, 'r') as file:
        reader = csv.reader(file)

        labels = []
        vectors = []
        for i, row in enumerate(reader):
            if i < 1:
                continue
            labels.append(row[0])
            vectors.append(list(map(int, row[1:])))
    
        return labels, vectors

ベクトルの次元削減

この関数では、UMAPを利用してベクトルを2次元に変換します。
詳細は省きますが、引数のn_neighborsはUMAPのアルゴリズム特有のパラメータです。今回は、main関数内でn_neighbors = 3としています。

big5.py
def get_2d_vectors(vectors: list, n_neighbors: int):
    mapper = umap.UMAP(random_state=0, n_neighbors=n_neighbors)
    embedding = mapper.fit_transform(vectors)
    return embedding

グラフの描画・保存

この関数では、ラベルと2次元ベクトルを紐付けながらグラフにプロットし、保存します。

big5.py
def save_big5_fig(fig_path: str, title: str, labels: list, vectors: list):
    plt.figure()
    plt.title(title)

    for i, label in enumerate(labels):
        x, y = vectors[i][0], vectors[i][1]
        plt.scatter(x, y, label=label)
        plt.annotate(label, (x, y))
    
    plt.savefig(fig_path)

実行結果

事前準備と関数の実装が終わったらプログラムを実行してみましょう!

python3 big5.py

プログラムを実行すると以下のようなグラフ(big5.png)がカレントディレクトリに出力されます。

このグラフより、どの人物同士が似ているのか(似ていないのか)ということや大まかなグループが分かるようになります。Big Fiveの主張が正しいならば、Big Fiveの5つの因子から構成される特徴ベクトルがグラフ上で近いということは、人物同士が似た個性を有していることを意味します。

Big Fiveの主張が正しかった場合、グラフ左下のAmeliaSophiaは似た個性であると考えられる一方、Sophiaとグラフ右上のLucasは離れた個性であると考えることができます。

おわりに

ご一読ありがとうございました。
今回紹介した方法は、対象データをBig Fiveとしましたが、対象データを別のものに入れ替えるだけで様々な高次元データを2次元データとして可視化することができます。
多次元データの散らばり具合や類似性を視覚的に確認することが可能になるため、ぜひご利用してみてください。

宣伝

HokusaiはNFTの開発インフラ「Hokusai API」を提供しています。
「デジタル上で価値を流通させたい全ての個人・事業者にとってのインフラ」としてAPIサービスを提供するEmbedded NFTサービスです。

https://hokusai.app/

「Hokusai API」を提供する日本モノバンドル株式会社では、エンジニアを採用中です!
ぜひフルリモートで、スピード感や大きな変化を楽しみながらぜひ働いてみませんか?

https://www.notion.so/0xhokusai/Backend-engineer-aabdbbbb48584113854e9e8102f13d6b

この記事を書いた人


Ida - Backend engineer

https://tocoteron.com

https://zenn.dev/tocoteron

Discussion