2012 年総選挙の小選挙区得票数を集計してみる
Twitter で小選挙区の合計得票数について書いたところ、まあまあ反響があったので少し整理して書きます。皆さん知りたかった数字のようです。
【再RT (さっきの勘違いで消しちゃったので)】300選挙区の合計で各党の得票数。自民2590万、民主1371万、維新703万、共産521万、未来312万、みんな282万、公明89万、社民45万、大地32万、国民12万。(奥村曉 調べ)
しかし、こんだけ分散したら自民大勝するに決まってる。RT @AkiraOkumura: 300選挙区の合計で各党の得票数。自民2590万、民主1371万、維新703万、共産521万、未来312万、みんな282万、公明89万、社民45万、大地32万、国民12万。(奥村曉 調べ)
似たようなのは時事通信も出していて、なんかちょっとたし算が違いますが比例と小選挙区の集計が出ています。
小選挙区で毎回問題になるのが、小政党の切り捨てと「死票」の問題です。いくら小政党に投票しても、その小選挙区で 1 位にならなければ (比例復活を除いて) その候補は当選できず、落選議員に投票した民意は反映されないと言われているからです。
比例区の合計得票数は新聞記事でもよく目にしますが、では小選挙区での各党の合計得票数はどのようになっているのでしょうか。それを集計したものが以下の表です (比例は時事通信の結果より)。括弧内は相対値です。
政党 | 小選挙区得票数 | 小選挙区議席数 | 比例区得票数 | 比例区議席数 |
---|---|---|---|---|
自民党 | 25,643,306 (43.0%) | 237 (79.0%) | 16,624,457 (27.6%) | 57 (31.7%) |
民主党 | 13,598,770 (22.8%) | 27 (9.0%) | 9,628,653 (15.9%) | 30 (16.7%) |
日本維新の会 | 6,942,350 (11.6%) | 14 (4.7%) | 12,252,228 (20.3%) | 40 (22.2%) |
共産党 | 4,700,287 (7.9%) | 0 (0.0%) | 3,689,159 (6.1%) | 8 (4.4%) |
日本未来の党 | 2,992,365 (5.0%) | 2 (0.7%) | 3,423,915 (5.6%) | 7 (3.9%) |
みんなの党 | 2,807,244 (4.7%) | 4 (1.3%) | 5,245,586 (8.7%) | 14 (7.8%) |
公明党 | 885,881 (1.5%) | 9 (3.0%) | 7,116,474 (11.8%) | 22 (12.2%) |
社民党 | 451,762 (0.8%) | 1 (0.3%) | 1,420,790 (2.3%) | 1 (0.6%) |
新党大地 | 315,604 (0.5%) | 0 (0.0%) | 346,848 (0.5%) | 1 (0.6%) |
国民新党 | 117,185 (0.2%) | 1 (0.3%) | 70,847 (0.1%) | 0 (0.0%) |
まあ、別に政治の床屋談義をするつもりはないので細かい話はしませんが、自民はそれほどの得票数ではないにもかかわらず、小選挙区 300 議席のうち実に 79% も占めるという結果になりました。維新は民主について得票しているのに、4.7% の議席数と大きく損をした感じです (小選挙区様々かもしれません)。
面白いのが共産党と公明党。共産党は 300 選挙区中 299 選挙区で候補者を擁立するという、他の政党に比べて圧倒的な充填率なのですが、支持層自体は大きくないため、7.9% も小選挙区で得票と健闘しているにも拘わらず比例当選しかありません。大選挙区になったり、比例ブロックが全国になれば大きく議席を増やして、小選挙区を維持したい人達にとっては困ったことになります。
公明党は 9 選挙区でしか候補を擁立しておらず得票数も 1.5% しかないのに、なんと全選挙区で当選というスゴ技です。さすが選挙慣れしています。比例区で 7.3% の議席を取り、小選挙区の得票数で 1.5% ということは、擁立した選挙区に創価学会員の多くが住民票を持っているなんて都市伝説はきっと嘘なのでしょう (=会員以外も公明支持層はいる)。あとまあ、うまく自民と連携している、と。
集計には毎日新聞の選挙特集のページを wget でひたすら落としてきて、
for i in {01..47}; do for j in {001..030}; do wget http://senkyo.mainichi.jp/46shu/kaihyo_area_ichiran.html\?aid=A$i$j; done; done
次の Python script を使用して整理しました。集計した結果は CSV でここに置いてあります。
# -*- coding: utf-8 -*- import codecs import os def rm(): for i in range(1, 48): for j in range(1, 31): fname = 'data/kaihyo_area_ichiran.html?aid=A%02d%03d' % (i, j) try: f = open(fname) print 'opening', fname except: continue hasEntries = False for line in f.readlines(): if line.find('<li class="Name"><div><a href') >= 0: print line hasEntries = True f.close() if not hasEntries: os.remove(fname) def data(): countList = {u'民主' : 0, u'自民' : 0, u'未来' : 0, u'公明' : 0, u'維新' : 0, u'共産' : 0, u'みな' : 0, u'社民' : 0, u'大地' : 0, u'国民' : 0, u'日本' : 0, u'改革' : 0, u'諸派' : 0, u'無属' : 0, u'' : 0} for i in range(1, 48): for j in range(1, 31): fname = 'data/kaihyo_area_ichiran.html?aid=A%02d%03d' % (i, j) try: f = codecs.open(fname, 'r', 'utf8') except: break h1count = 0 for line in f.readlines(): if line.find('<h1>') == 0: if h1count == 1: block = line.split('<h1>')[1].split('<')[0] num = u'0123456789' for k in range(10): block = block.replace(num[k], str(k)) block h1count += 1 elif line.find('<li class="Name"><div><a href=') == 0: name = line.split('</a></div></li>')[0].split('>')[-1] print block + ', ' + name + ',', elif line.find('<li class="Age"><div>') == 0: age = line.split(')</div></li>')[0].split('(')[-1] print age + ',', elif line.find('<li class="Party"><div><a href=') == 0: party = line.split('</span></a></div></li>')[0].split('>')[-1] print party + ',', elif line.find('<li class="Party"><div><span') == 0: party = line.split('</span></div></li>')[0].split('>')[-1] print party + ',', elif line.find('<li class="Duplicate"><a href=') == 0: duplicate = line.split('</span></a></li>')[0].split('>')[-1] print duplicate + ',', elif line.find('<li class="Duplicate"></li>') == 0: duplicate = '' print duplicate + ',', elif line.find('<li class="State"><div><span>') == 0: state = line.split('</span></div></li>')[0].split('>')[-1] print state + ',', elif line.find('<li class="VotesCount"><div>') == 0: count = line.split('</span></div></li>')[0].split('>')[-2].split('<')[0].replace(',', '') print count countList[party] += int(count) for key in countList.keys(): print key, countList[key]