2012 年総選挙の小選挙区得票数を集計してみる

Twitter小選挙区の合計得票数について書いたところ、まあまあ反響があったので少し整理して書きます。皆さん知りたかった数字のようです。

▲ 78 RT

▲ 137 RT

似たようなのは時事通信も出していて、なんかちょっとたし算が違いますが比例小選挙区の集計が出ています。



2009 年の総選挙では民主党小選挙区を活用して圧勝し、そして今回の総選挙では自民党が同じく小選挙区制を利用して圧勝しました。そもそもは自民党議席数を盤石にするために導入された小選挙区制度と言われていましたから、「正しい使い方」に戻ったとも言えます。

小選挙区で毎回問題になるのが、小政党の切り捨てと「死票」の問題です。いくら小政党に投票しても、その小選挙区で 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]