【情報Ⅱ:データサイエンス】Python×Googleフォームで盛り上がる!クラスの「性格類似度」トップ10調査!
今回は高校生の授業でも使える「コサイン類似度」を活用した性格診断&相性ランキングの教材をどどんと紹介します。
ベクトルの内積って聞くだけで眠くなる…という方もいるかもしれませんが、そこをあえて「クラスメイト同士の似ている度を可視化する」というネタに変えると、驚くほど生徒が盛り上がるんです!
この記事では、実際にGoogleフォームで集めた10項目の性格データをCSVファイルで取り込み、Python(Google Colab)で「コサイン類似度」を計算し、相性度トップ10を一覧表示する方法を紹介します。
さらに、授業内での指導ポイントや盛り上がる演出もあわせて提案します。
1. どんな授業なのか?
◇ 授業の目的
• データサイエンスの入り口
ベクトルの内積や類似度が、身近な比較(「誰と誰が似てるのか?」など)に使えることを体感してもらう。
• プログラミングスキルを習得
Pythonを使ったデータ分析の初歩を学ぶ(CSVファイルの読み込み、配列・行列の処理、ライブラリの活用など)。
• 興味を引き出す
「自分がクラスの中で誰と似ている?」「トップ10のペアは?」といった、自分事化できるテーマで盛り上がる。
◇ 使う10項目
Googleフォームを用いたアンケートで、生徒に以下の10項目(各5段階評価など)を回答してもらいます。
1. 新しいことに挑戦する意欲
2. 他人の気持ちに共感できるか
3. チームで活動することの好み
4. リスクを取ることへの抵抗感
5. 計画的に行動できるか
6. 他人の意見を尊重するか
7. 困難な状況でも粘り強く対応できるか
8. 創造的なアイデアを生み出すことが得意か
9. 静かな時間を大事にするか
10. 物事に対する興味や好奇心
この10項目を10次元ベクトルとして扱い、「似ている度」を数値化します。
例として以下のようなフォームで調査してみてください。項目は正直なんだって大丈夫です。
さらっと答えさせてください。このデータはあくまでこの授業内でのデータ分析方法を学ぶために使うだけなので、外部に出すこともなければ、他の目的で使わないこともしっかり説明しましょう。
ただし、「名前」を書かせてしまうと後で誰かわかってしまいますので、ニックネームにしておくことをお勧めします。
アドレスを集めるのは後ほど他の分析に使うためのキーとして入れていますが、なくても良いと思います。
https://docs.google.com/forms/d/e/1FAIpQLSeN6Ga20kcpCHHnghFf5nK7c6RXvFdoGxPrm9_1YOojNS05tw/copy
2. コサイン類似度とは?
コサイン類似度は、「ふたつのベクトルが向きの点でどれくらい似ているか」を0〜1の範囲で示すものです。
• 1に近いほど「ほぼ同じ向き」=性格回答がそっくり!
• 0に近いほど「直角」=共通点が少ない
• -1に近い場合(今回はアンケート項目の点数が負の値を想定しないのであまり出ませんが)は「真逆」
単純に数値が似ているかを見るよりも、「回答のパターンが似ているか」をうまく捉えられるのがコサイン類似度の強みです。
3. いざ、Pythonコードで実装!
◇ Google Colabのセットアップ
次のようなコードを準備してみましょう!
まずは、ブラウザから使える便利な開発環境「Google Colab」で作業を行います。
Colabを開いたら、以下のコードをセルに貼り付けて順番に実行します。
# Google Driveをマウントするためのコード
from google.colab import drive
drive.mount('/content/drive')
実行後、表示される認証の手順に従うことで、自分のGoogleドライブにColabからアクセスできるようになります。
◇ CSVファイル読み込み
Googleフォームで集計した結果を「性格データ.csv」としてドライブに置いたと仮定します。パスは適宜修正してください。
# CSVファイルのパス(Google Drive上のパスを指定)
file_path = '/content/drive/MyDrive/性格データ.csv'
# pandasを使ってデータを読み込む
import pandas as pd
data = pd.read_csv(file_path)
# データの先頭をざっと確認
print("データの形状:", data.shape)
data.head()
ここで、行の数や列の数を確認し、取り込みが正常に行われたかどうかをチェックします。
• 1列目: タイムスタンプ
• 2列目: ニックネーム
• 3列目以降: 上で挙げた10項目の回答列
◇ 回答データのベクトル化
次に、最初の2列(タイムスタンプ、ニックネーム)を除いた10列分をベクトルとして取り出します。
# 必要な列(アンケート項目)のみを抽出し、ベクトル化
student_data = data.iloc[:, 2:].values # 最初の2列を除く
student_data が、(人数, 10次元) の形になっているはずです。
◇ コサイン類似度の計算
scikit-learn の cosine_similarity を利用すると、配列を渡すだけで一気に類似度行列を計算してくれます。
from sklearn.metrics.pairwise import cosine_similarity
cosine_sim_matrix = cosine_similarity(student_data)
これで cosine_sim_matrix は (人数 × 人数) の二次元配列となり、行iと列jが示す値が「iさんとjさんのコサイン類似度」を意味します。
◇ 結果をデータフレームに格納
誰が誰とどれくらい似ているかをわかりやすく可視化するため、pandas のデータフレームに変換します。
cosine_sim_df = pd.DataFrame(cosine_sim_matrix,
index=data['ニックネーム'],
columns=data['ニックネーム'])
# コサイン類似度の行列を表示(Google Colab環境なのでdisplay()が便利)
print("コサイン類似度行列:")
display(cosine_sim_df)
これで、ニックネームをインデックス・カラムにした表が表示されるはずです。
4. 相性度トップ10のペアを抽出してみる
「この行列を眺めているだけではイマイチ盛り上がらない!」というときは、類似度が高いペアをランキングしてみましょう。ただし、自分自身との類似度(=1)は除外しないと全部1だらけになってしまうので要注意!
import numpy as np
# np.argsort でコサイン類似度を大きい順にソート
# 対角線の要素(自分自身)を除外して上位10組を抽出
sorted_indices = np.dstack(
np.unravel_index(np.argsort(-cosine_sim_matrix.ravel()), (cosine_sim_matrix.shape[0], cosine_sim_matrix.shape[1]))
)[0]
# 自分自身とのペアは除去
sorted_indices = sorted_indices[sorted_indices[:, 0] != sorted_indices[:, 1]]
print("最も相性が高い上位10組のペア:")
top_pairs = sorted_indices[:10]
for idx, (i, j) in enumerate(top_pairs):
print(f"{idx + 1}. {data['ニックネーム'][i]} と {data['ニックネーム'][j]} - コサイン類似度: {cosine_sim_matrix[i, j]}")
これで、誰と誰が相性バツグンかを簡単に知ることができます。上位に出てくるペアを眺めながら、「意外な人が似てる!」「確かにあの2人はいつも一緒」などと盛り上がりましょう。
実行してみるとこのような類似度対照表が印字されます。
また、類似度のトップ10が表示されます。ニックネームにしておくことで、変な事故が起きることを防げます!(生徒との信頼関係が重要です!)
5. 授業の指導法&盛り上げポイント
1. アンケートの作成段階からワクワクさせる
「みんなの性格がどれくらい似ているのかランキングしてみるよ!」と告知し、回答の精度アップを狙いましょう。
2. 自分事化で興味を引く
結果発表の際に、「あなたはクラスの中で(ニックネーム)さんとそっくり!」と言われると、生徒は“なんで!?”と盛り上がりやすいです。
3. 数学的な背景に触れる
ただ盛り上がるだけでなく、「ベクトル」「内積」「コサイン類似度」というキーワードを抑えておくと、数学や情報系の科目を学ぶ際に役立ちます。
4. プログラム改変タイム
実際に生徒にコードを配布して、「上位5組だけ表示する」「逆に相性が低い5組を探してみる」など、アレンジをしてもらう時間を作るとよいでしょう。
5. 結果の解釈に注意
コサイン類似度は“似ている向き”を表す指標なので、数値が高いからといって必ずしも「仲がいい」わけではありません。解釈を誤らないようフォローも必要です。
6. まとめと次のステップ
今回紹介した授業ネタでは、
• 生徒の興味を引きつつ
• ベクトルやコサイン類似度の概念
• Pythonでの簡単なデータ分析の流れ
を一気に学ぶことができます。さらに発展として、たとえば主成分分析(PCA)で次元を落としてグラフに可視化してみたり、クラスタリング手法でクラスをいくつかのグループに分けてみたりすると、さらに応用的な分析へと広がっていきます。
「データサイエンス×みんなの性格比較」は、知識面だけでなく楽しさも同時に味わえるので、ぜひ取り入れてみてください。いままで苦手意識があった生徒も、「あれ、データ分析っておもしろいじゃん!」と目を輝かせるかもしれませんよ。
田中善将への仕事依頼やSNSフォローはこちら
講演・執筆・コンサルティングのお仕事依頼はこちらまで.
Xはこちら.
教育関係者の皆様は, Facebookでも繋がってください.