mots quotidiens.
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp by hns, version 2.10-pl1.

先月 2022年07月 来月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

2022年07月15日(金) [n年日記]

#1 参院選からみる東京の「市区ベクトル」

先週, 全国で参議院議員選挙が行われました。今回は特に, 投票を呼びかける動きが多く見られたように記憶しています。私も, 出張先の名古屋で街頭演説を耳にしつつ, 日曜日に東京に戻って投票所に足を運びました。

選挙の結果はともかく, 終了後に NHKの開票速報 を見て気付いたことは, リンク先のページで一番下の「開票所」をクリックした時に現れる, 区ごとの投票結果がかなり異なるということでした。
たとえば, 私の投票した港区では海老澤由紀氏が2位で11.3%の得票率があるのに対し, 新宿区では5位で9.2%にすぎません。一方で港区では山添拓氏は6位で8.2%なのに対し, 新宿区では2位で, 11.8%もの得票率があります。 中野区では, 共産党の山添拓氏が自民党の朝日健太郎氏を抜いて1位になっています。 一番わかりやすいのは, 公明党の竹谷とし子氏が大田区, 北区, 板橋区, 荒川区, 八王子市などでは1位になっているということでしょう。 区だけでなく市部や離島にも大きな違いがあり, 神津島や三宅島では生稲晃子氏が圧倒的な得票で1位, 小笠原村では山本太郎氏が1位になっています。

これは, ある程度は所得や基盤地域(創価学会が多摩地域に大きな基盤を持っているなど)で説明できますが, 2位以降も含めると, 市区の間にはかなり似ているもの, あるいは違うものがあり, 選挙結果から統計的に地域の特徴が見えてきそうです。
そこで, 上のページから各市町村の選挙結果をテキストにコピペし, Pythonでパーズしてデータを作り, 統計的に分析してみました。 *1

・ 投票率の違い

まず, そもそも投票率が利島村の77.74%から瑞穂町の48.44%まで, かなり違いがあることに気づきます。この投票率の違いは, 自然に説明できる程度の分散なのでしょうか。
こういった場合には, 投票率そのものではなく, 各市町村の投票率の, 全体の投票率(56.55%)に対する比率を見るのが有効です。 *2 比が1であれば全体と同じということですので, 対数をとれば, 比が1のときに値は0になります。 地域 a での投票率を p(v|a), 全体での投票率を p(v) (=0.5655) とおくと, これは log p(v|a)/p(v) を計算することになります。これをプロットしたものが以下です。

これからわかるように, 投票率の差はほぼ正規分布で分布しているといってよいでしょう。ただし, 上位の3市町村, つまり利島村, 御蔵島村, 青ヶ島村は正規分布からの外れ値といえます。また, 外れ値とはいえませんが, それに続いて投票率の高い文京区, および逆に投票率の低い瑞穂町, 武蔵村山市, 足立区は正規分布のかなり裾の方に位置しており, 特異度が高い地域であることがわかります。

・ 「市区ベクトル」と相互情報量

さて, それでは本論の, 各市区の特徴を分析してみましょう。 これも同様に, それぞれの候補の, 東京都全体の平均得票率に対する比を計算すればよさそうです。各候補を c, 地域を a としたとき, 地域aでのcの得票率を p(c|a) と 表し, 東京都全体でのcの得票率を p(c) と表すと,

log p(c|a)/p(c)

を計算します。上でも計算したこの量は, 自己相互情報量(PMI)とよばれている量で, 地域 a と候補 c との相関を表す量 PMI(a,c) になっています。 各地域 a (たとえばa=千代田区) についてこれを34人の候補者について並べたベクトル, つまり

( PMI(a,c1), PMI(a,c2), …, PMI(a,c34) )

が, その地域の特徴ベクトルになります。 これは, 実は自然言語処理で知られている word2vec が計算している量と数学的に等価であることが示されています (Levy et al. 2014)。

上のベクトルのままでも地域の特徴は表せますが, word2vec と同様に, これを 次元圧縮することで, 情報をよりコンパクトに凝縮したベクトルを得ることができます。具体的には, PMI(a,c) を縦横に並べた行列を X とおくと,

X = USVT = (U√S)(V√S)T

とXを特異値分解します。このとき, U√SおよびV√Sの各列が, 地域および候補者を表すベクトルになります。この内積が大きければ, 元のデータでPMIの値が大きい, つまりその地域とその候補者の相関が大きいことを意味しているわけです。
特に, 特異値分解で上位2個の固有値および固有ベクトルをとれば, 最も違いの大きな直交する2次元で市区ベクトルを可視化することができます。 これを行ったのが下の図です。(クリックで拡大)

この方法では候補者も, 市区ベクトルと同じ空間に埋め込むことができます (ベクトルが似ていれば, そこで大きな支持があることを意味します)ので, 青字で示したのが候補者ベクトルです。
上の図は中心部にベクトルが集中していますので, 拡大したものが下の図です。 (クリックで拡大)

これを見ると, 図の上部に文京区, 千代田区, 武蔵野市といった文教的な市区が集まっている一方で, 郊外の市区は下の方に配置されていることがわかります。 また, 港区や渋谷区が最も左に, 青梅町や武蔵村山市 (および檜原村や神津島)が右に来ているのは, 横軸は「都会度」を表しているのかもしれません。この分析には, 各市町村の人口や位置はまったく用いていないことに注意してください。

この可視化は, あくまで最初の2個の固有ベクトルを用いたもので, 3個目以降にはもっと有益な情報が隠れている可能性があります。3個の固有ベクトルを用いれば, ベクトルを3次元にプロットすることができます。 これを行ったものが下の図です。

こうして特異値分解(=主成分分析)を使わず, 単に市区ベクトルを t-SNE で2次元に可視化することも可能ですが, その場合は結果は次のようになります。

この場合は非線形な可視化になるため, ベクトルの要素を全部使える一方で, 軸に上下左右の意味はなくなってしまいます。似た市区町村は確かに近い位置に配置されているものの, 本当に文京区と利島村が近いのかには, 疑問の余地がありそうです。

なお, 上の分析は, すべての候補者34人の情報を等価に用いると, 泡沫候補の一致が不必要に高く評価されてしまうため, 得票数上位15人のデータを用いています( (PMI(a,c1),…,PMI(a,c15) )を実際の特徴ベクトルにしています)。この値を変えると結果が変わるため, PMI(a,c)をその候補者の得票確率p(c)で重みづけることが考えられますが, そうするとword2vecとの対応関係がなくなるため, 単語ベクトルに関して知られている様々な理論的な性質が保証されるかどうかについては, 検証が必要になりそうです。

なお, 分析に用いたデータおよびPythonスクリプトは, すべてGithubのレポジトリ https://github.com/daiti-m/tokyo2022 にて公開しています。


*1: NHKのページでは選挙結果はJavascriptで生成されていますが, それを解読して元データを得ることは, 少し見た限りでは容易ではないようでしたので, 地道に手作業でテキスト化することにしました。
*2: 投票率は確率ですが, 確率の対数は情報量としての意味を持ちますから, 情報量の引き算を行って差を見ることは, 確率の比を計算してから対数をとることと等価になります。

1 days displayed.
タイトル一覧
カテゴリ分類
 なかのひと
Powered by hns-2.10-pl1, HyperNikkiSystem Project