多次元尺度法で可視化する政党ポジショニングマップ2024

# はじめに
こんにちは！
ついに待ちに待った衆議院選挙の日がやってきましたね。

「各政党の立ち位置を直感的に把握したい」と思い、今回は多次元尺度法（以後,MDS)を使って、政党を2次元の空間にマッピングしてみました！視覚化することで、どの政党がどの立場に近いのか、一目で理解できるようになります。


## MDSとは
多次元尺度法（MDS: Multidimensional Scaling）とは、データ間の「距離」や「非類似度」を基に、オブジェクト（ここでは政党）を低次元の空間に配置する手法です(詳細な議論はhttps://cogpsy.jp/wp/wp-content/uploads/COGPSY-TR-002.pdf を参照してください)。

簡単に言えば、「似ているものは近く、異なるものは遠く」なるようにマッピングする方法です。

政治学では、「左派」「右派」や「リベラル」「保守」といった空間的な概念が頻繁に使われるため、MDSのような分析手法と非常に相性が良いと言われています(岡田 & 加藤,2016)。


### 使用データ
今回の分析では、Yahoo! 衆議院選挙2024(https://news.yahoo.co.jp/senkyo/#l_party) に掲載されている、各政党の政策争点に対する立場を順序尺度として数値化して使用しました。スコアの割り当ては次のようにしています：

反対：1
やや反対：2
中立：3
やや賛成：4
賛成：5

 ![スクリーンショット 2024-10-27 15.25.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/65ac31ef-13d6-9213-8b20-075dbcb6553b.png)
 
このデータをもとに、政党間の「距離」を計算し、2次元の空間に配置することで、政党間の立場の近さが直感的に理解できる可視化を目指します。



## 分析
分析はRを使って行いました。以下のライブラリを使用します。
```
library(tidyverse)
library(ggplot2)
library(ggrepel)
library(MASS)
```
### データの作成と前処理
Yahoo!のサイトから取得したデータをデータフレームに変換し、順序尺度のスコアを使ってMDSを行います。以下はその手順です。
```
party_data <- data.frame(
  政党 = c("自民", "立民", "維新", "公明", "共産", "国民", "れいわ", "社民", "参政", "みんな"),
  Question1 = c(3, 5, 5, 5, 5, 5, 5, 5, 5, 4),
  Question2 = c(3, 4, 1, 3, 5, 1, 5, 5, 3, 2),
  Question3 = c(5, 4, 5, 5, 1, 4, 1, 5, 5, 5),
  Question4 = c(3, 2, 5, 3, 1, 1, 1, 1, 5, 5),
  Question5 = c(1, 1, 1, 4, 1, 1, 1, 1, 3, 4),
  Question6 = c(3, 1, 5, 5, 1, 1, 1, 1, 5, 1),
  Question7 = c(5, 5, 5, 5, 5, 5, 5, 5, 4, 5),
  Question8 = c(5, 1, 5, 5, 1, 1, 1, 1, 3, 1),
  Question9 = c(4, 5, 5, 4, 5, 4, 5, 5, 5, 5),
  Question10 = c(5, 3, 4, 5, 3, 3, 3, 5, 3, 3)
)

#転置させて列名をつけて余分な行は消す
party_data_t <- as.data.frame(t(party_data))
#名前ベクトルの作成
name_row <- party_data_t[1,]
name_col <- as.data.frame(name_row)%>%
  t()
#それぞれの列名を挿入
colnames(party_data_t) <- as.vector(name_row)
#不必要な行を削除
party_data_t_col <- party_data_t[-1,]
#ユークリッド距離
party_dist <- dist(t(party_data_t_col),method="euclidean")
#れいわと共産が全く同じ数値だったので微小の数字を入れる
party_dist[party_dist == 0] <- 1e-8
```

非計量MDSを実行し、結果をバリマックス回転して可視化します。
可視化にはggplotを使ってます。

```
#非計量MDS
result.iso <- isoMDS(party_dist,k=2)
#データフレームとして保存する
df.result <- as.data.frame(result.iso)
#後ほど可視化するときに使う政党名ベクトルをあらかじめ作っておく
party_df <- cbind(name_col,df.result)
colnames(party_df) <- c("name","dim1","dim2")

#バリマックス回転
df_rot <- varimax(as.matrix(df.result), normalize = TRUE, eps = 1e-5)
plot_rot <- as.data.frame.matrix(df_rot[1]$loadings)
party_rot <- cbind(name_col,plot_rot)


#plot
ggplot(party_rot, aes(x = points.1, y = points.2, group = 政党)) +
  geom_point(size = 2, alpha = 0.8, shape = 15, color = "#B2182B") +
  geom_text_repel(aes(label = 政党), family = "HiraKakuPro-W3", size = 5) +
  labs(
    x = "Left - Right",
    y = "Liberal - Conservative",
  ) +
  theme_bw() +
  theme(aspect.ratio = 1,plot.title = element_text(size = 15, hjust = 0.5, face = "bold"))+
  xlim(-1,8)+
  ylim(-7.3,2.7)

```
## 結果
以下は、MDSを使って作成した政党ポジショニングマップ（2024年版)です。


![スクリーンショット 2024-10-27 15.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/237181c1-e4d7-1f87-e435-b438a1c03caf.png)


### マップの特徴
- 自民党と公明党、共産党と社民党、国民民主党と立憲民主党が近い立場にある
- みんなの党は他の政党から離れた立場をとっている

### 軸ごとの関係
- 一次元目（X軸）：この軸は「左派-右派」軸と解釈できそうです。自民、公明、維新、参政が「右派」として、共産、れいわ、立民、国民民主、社民が「左派」として配置されています。
- 二次元目（Y軸）：この軸は「保守-リベラル」軸として解釈できそうですが、自民・公明・維新が保守寄りに位置する一方で、れいわや共産はあまり下側（リベラル側）に配置されていませんでした。実際の印象とやや異なる部分もあります。筆者は政治学の専門家ではないため、ぜひ皆さんの解釈も聞かせていただけると幸いです！


## まとめ
いかがでしたか？多次元尺度法（MDS）を使うことで、政党間の関係を直感的に可視化することができました。実はMDSは、モデルを拡張することで有権者の立場もマッピングし、「誰がどの政党と考えが近いか」を表現することも可能です！今後他のデータセットが公開されましたら、分析の続きをやってみようと思います！

ぜひ今回の結果について、皆さんのご意見もお聞かせください！
## 参考資料
岡田謙介 & 加藤淳子 (2016). 政治学における空間分析と認知空間 ―個人差・集団差を考慮した多次元尺度法の展開と実証分析―. 行動計量学, 43(2), 155–166.