![見出し画像](https://assets.st-note.com/production/uploads/images/113577094/rectangle_large_type_2_57332c6994e899dae9fcb29bf6f6838e.png?width=1200)
【データ分析】つくば市と似ている都市はどこ?
こんにちは。つくばに住む研究者です。
前回はつくば市の産業別の就業者数の割合について観察しました。今回は小中学校に関するデータ分析も考えていましたが、その前に「産業別の就業者の割合からみて、つくば市と似ている都市はどこだろうか?」という疑問が湧いてきたので、やっていきます。
データ間の類似度を測る指標として、今回は「コサイン類似度」を使います。コサイン類似度は最近よく話題になる人工知能(AI)技術の中でも良く使われる数学の道具です。
コサイン類似度について
三角関数を聞くと少し不安になるかもしれませんが、仕組みはとても単純です。例として、ある小学校のクラスの生徒4人が国語と算数のテストを受けた結果が以下のようであったとします。
test_data = pd.DataFrame([['A君', 30, 90], ['B君', 80, 70], ['C君', 100, 40], ['D君', 30, 30]],
columns=['名前', '国語', '算数'])
![](https://assets.st-note.com/img/1691798641123-9364GKXLXO.png)
これについて、「得意科目が似た生徒」をコサイン類似度によって探してみましょう。テストの結果が2科目ですので、2次元平面上で各生徒の結果を図示してみます。
fig = plt.figure(figsize = (4,4),dpi=100)
ax = fig.add_subplot(1, 1, 1)
ax.scatter(test_data['国語'], test_data['算数'], s = 15, edgecolors='black', marker='o', alpha=0.3)# ,color=colors[dfs['cluster'].iloc[i]], label=str(dfs['cluster'].iloc[i]))
for i, txt in enumerate(test_data['名前'].to_list()):
ax.annotate(txt, (test_data.iloc[i]['国語'],test_data.iloc[i]['算数']), fontsize=12)
plt.xlabel('PC1', size=16)
plt.ylabel('PC2', size=16)
plt.xlim([20,105])
plt.ylim([20,105])
![](https://assets.st-note.com/img/1691798703832-aqWIjPe0zw.png)
原点から各点に対して矢印を引き、それぞれの矢印同士がなす角がコサイン類似度となります。
![](https://assets.st-note.com/img/1691798765580-lf3m53d6sU.png)
算数の得意なA君と国語の得意なC君の間の角度が大きく、どちらも得意なB君はその間ですが、若干国語の点数の方が高いのでC君に寄っていることがわかります。
ベクトルの類似度には線の長さ(得点の大きさ)は考慮されていませんので、点数の大きさについても考慮したい場合にはまた別の指標を使う必要があります(ただし今回扱う市区町村毎の産業別就業者の割合については合計値が必ず1になるので気にする必要はありません)。
4人の間で、それぞれに対するコサイン類似度を行列としてまとめた「類似度行列」を作成します。
from sklearn.metrics.pairwise import cosine_similarity
similarity = cosine_similarity(test_data.loc[:, ['国語','算数']])
result = pd.DataFrame(data= similarity, index=test_data['名前'].to_list(),columns=test_data['名前'])
result
![](https://assets.st-note.com/img/1691799324702-RmFVy7KMKC.png?width=1200)
表の読み方について少し解説します。1行目のA君の行を見ます。A君と最も似ているのはもちろんA君自身で、類似度は1なので完全に一致しているとわかります。次に似ているのは2列目のB君で、その類似度は0.86とわかります。最も似ていないC君との間の類似度は0.64です。4列目のD君をみた時、B君とC君との間の類似度は0.984と0.987で共にD君によく似ていますが、わずかにC君の方が類似度が高いとわかります。
全く同じ方法で、前々回の全国の市区町村とつくば市の産業別就業者数割合の類似度を計算し、「最もつくば市に似ている市区町村」を探します。
![](https://assets.st-note.com/img/1691971739854-Gbz14O1TQd.png?width=1200)
全ての市区町村(+都道府県)の間での類似度が計算できました。つくば市について注目して、類似度が高い自治体を上から順に10個みてみましょう。
![](https://assets.st-note.com/img/1691972235254-Z4rH9HCKVV.png)
つくば市と同じく研究分野での就業者の多い東海村との類似度が約0.98と最も高い結果でした。ついで、近隣の牛久市も近いようです。地理的に離れており、かつ規模も大きい「市」として似ているのは、鎌倉市や芦屋市のようです。芦屋市と池田市以外は全て首都圏の市です。
「似ていない」のランキングも見てみます。
![](https://assets.st-note.com/img/1691972508051-nSRdya3dp0.png)
どうやら都市部でない町村が並んでいるようです。
さて、前回の記事でもみたように、東海村は男性の研究分野での就業者割合が全国1位であり、その点でつくば市と良く似ているのは直感的に納得がいきます。2位にならんだ牛久市とは、違った方向性で「似ている」ように思います。前々回の記事と同じような折れ線グラフを見てみます。
![](https://assets.st-note.com/img/1691986826809-LX7b1ydrUR.png?width=1200)
つくば市と東海村は学術研究の分野の部分で非常に近く、つくば市と牛久市はそれ以外の点で良く似ているようです。3つのサンプル程度であればこうした折れ線グラフでも「似ている要素」が何であるのか理解しやすいですが、
数が多いと大変です。多くのサンプル(例えば全国の自治体の産業構造)について同時に類似の方向性についても比較する場合には主成分分析(PCA; Principal Component Analysis)などを使うのが一般的です。
主成分分析を使った類似度の比較方法などについても次回以降で取り組もうと思います。
それでは。
この記事が気に入ったらサポートをしてみませんか?