Am încercat să îmi dau seama eu cu cine votez... hâc!

Nu știu de unde să încep să caut date cât de cât obiective despre candidații la președinție. Dacă aveți sugestii, vă rog să lăsați un mesaj!

În lipsa acestora, am decis să analizez partidele cu care aceștia sunt afiliați: am folosit date despre voturi ale partidelor Camerei Deputaților pe Parlament Transparent.

Prin aceste date, am vrut să văd cum diferă partidele și cât de mult. Putem obține astfel o analiză ce ia în considerare voturile efectuate, și nu propaganda electorală.

Nu cred că această analiză e absolut obiectivă, deoarece unele partide ar putea vota pentru imagine când ar ști că votul lor nu ar avea efect. De asemenea, un partid se comportă într-un fel când e la putere, și altfel când e în opoziție.

Constat că lipsesc datele grupării "PRO Europa", ceea ce înseamnă că datele despre apartenență sunt mai vechi. Nu am ajuns să le actualizez. Oricum, cu excepția dlui. Balint Liviu, care a fost și prin PMP, ceilalți din PRO Europa au fost doar în PSD sau ALDE.

Datele din Senat sunt disponibile pe site-ul Senatului, dar nu le-a aranjat nimeni (încă?) pentru a le putea procesa cu ușurință. Poate o să le aranjez eu mai încolo, folosind un scraper.

Vă invit să îmi analizați această analiză și să-mi ziceți ce idei mai aveți. Sper să vă folosească aceste date pentru a decide și a vota!

Notă: Această analiză e disponibilă și aici, în format original Jupyter Notebook (Python).

Încărcare date

%matplotlib inline

import pandas as pd
pd.options.display.max_rows = 100

# Date obtinute de la Parlament Transparent, Popescu, Marina și Chiru, Mihail.
# https://parlament.openpolitics.ro/export/
# Datele pot fi reutilizate sub licență CC-BY-SA-4.0 sau CC-BY-SA-3.0-RO
# Datele se refera doar la Camera Deputatilor (nu si Senat).

!wget -nc https://parlament.openpolitics.ro/export/membri_grupuri.csv
!wget -nc https://parlament.openpolitics.ro/export/voturi.csv
File ‘membri_grupuri.csv’ already there; not retrieving.

File ‘voturi.csv’ already there; not retrieving.
# Ordonare obiectivă: putere (PSD) -> opoziție (partide nesimilare cu PSD)
coloane_partide = ['PSD', 'ALDE', 'Minorități', 'UDMR', 'Neafiliați', 'PNL', 'PMP', 'USR']
descriere_partide = [
    'Grupul parlamentar al Partidului Social Democrat',
    'Grupul parlamentar ALDE (Alianţa liberalilor şi democraţilor)',
    'Grupul parlamentar al minorităţilor naţionale',
    'Grupul parlamentar al Uniunii Democrate Maghiare din România',
    'Deputati neafiliati',
    'Grupul parlamentar al Partidului Naţional Liberal',
    'Grupul parlamentar al Partidului Mişcarea Populară',
    'Grupul parlamentar al Uniunii Salvaţi România',
]

membri = pd.read_csv('membri_grupuri.csv')

for partid, abrev in zip(descriere_partide, coloane_partide):
    membri = membri.replace(partid, abrev)

voturi = pd.read_csv('voturi.csv')
voturi_cu_partide = voturi.merge(membri[['nume', 'partid']])
voturi_cu_partide['partid'].fillna('niciunul curent', inplace=True)
voturi_cu_partide
data cod cdep nume vot vot grup partid
0 2017-02-14 16105 Antoneta Ioniţă da da PNL
1 2017-02-14 16106 Antoneta Ioniţă da da PNL
2 2017-02-14 16107 Antoneta Ioniţă da da PNL
3 2017-02-14 16108 Antoneta Ioniţă nu nu PNL
4 2017-02-14 16109 Antoneta Ioniţă da da PNL
... ... ... ... ... ... ...
415760 2019-10-22 22897 Andrian Ampleev da da Minorități
415761 2019-10-22 22898 Andrian Ampleev da da Minorități
415762 2019-10-22 22899 Andrian Ampleev da da Minorități
415763 2019-10-22 22900 Andrian Ampleev da da Minorități
415764 2019-10-22 22901 Andrian Ampleev da da Minorități

415765 rows × 6 columns

Top partide după voturi rebele

Această analiză a fost făcută deja aici, până la 5 iulie 2018: https://parlament.openpolitics.ro/statistici/vot-rebel

Observ că rata "rebeliunii" e destul de mică, și nu consider că ar avea vreo influență în votul meu. Decid să nu caut detalii aici. Dar dacă îmi trimiteți cod pe tavă și mă rugați să îl includ, o să o fac.

Procesare: voturi în funcție de partide

grupate = voturi_cu_partide.groupby(['cod cdep', 'vot', 'partid'], as_index=False).count().sort_values(['cod cdep', 'vot', 'partid'])
grupate = grupate.pivot_table(index='cod cdep', columns=['partid', 'vot'], values=['data'])['data'].fillna(0)
grupate
partid ALDE Minorități Neafiliați ... PSD UDMR USR
vot abținere da nu abținere da nu abținere da ... nu abținere da nu abținere da nu
cod cdep
16105 0.0 13.0 2.0 0.0 0.0 14.0 0.0 0.0 0.0 20.0 ... 4.0 0.0 0.0 21.0 0.0 0.0 0.0 23.0 0.0 1.0
16106 0.0 13.0 2.0 0.0 1.0 13.0 0.0 0.0 0.0 20.0 ... 4.0 0.0 0.0 21.0 0.0 0.0 0.0 23.0 1.0 0.0
16107 1.0 14.0 0.0 0.0 0.0 14.0 0.0 0.0 0.0 20.0 ... 0.0 0.0 0.0 21.0 0.0 0.0 0.0 24.0 0.0 0.0
16108 0.0 10.0 5.0 0.0 0.0 13.0 1.0 0.0 0.0 20.0 ... 4.0 0.0 0.0 21.0 0.0 0.0 0.0 24.0 0.0 0.0
16109 0.0 15.0 0.0 0.0 0.0 14.0 0.0 0.0 0.0 20.0 ... 2.0 0.0 0.0 21.0 0.0 0.0 0.0 24.0 0.0 0.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
22897 0.0 14.0 0.0 0.0 0.0 12.0 0.0 0.0 0.0 12.0 ... 0.0 0.0 0.0 16.0 0.0 0.0 0.0 25.0 0.0 0.0
22898 0.0 15.0 0.0 0.0 0.0 13.0 0.0 0.0 1.0 11.0 ... 0.0 0.0 0.0 17.0 0.0 0.0 0.0 25.0 0.0 0.0
22899 0.0 14.0 0.0 0.0 1.0 13.0 0.0 0.0 0.0 12.0 ... 0.0 0.0 0.0 17.0 0.0 0.0 0.0 25.0 0.0 0.0
22900 0.0 15.0 0.0 0.0 0.0 14.0 0.0 0.0 0.0 12.0 ... 0.0 0.0 0.0 17.0 0.0 0.0 0.0 25.0 0.0 0.0
22901 9.0 4.0 0.0 0.0 3.0 11.0 0.0 0.0 0.0 9.0 ... 1.0 0.0 0.0 16.0 0.0 0.0 0.0 0.0 25.0 0.0

1601 rows × 32 columns

Subiecte de vot: top abțineri

vot = 'abținere' # poți alege și: 'da', 'nu', '—'

from IPython.core.display import display, HTML

def detalii_vot(cod_cdep, scor):
    display(HTML(f"<a href=http://www.cdep.ro/pls/steno/evot2015.nominal?idv={cod_cdep}>Vot {cod_cdep}</a>: scor {scor:.3f} "))

def serie_link_cdep(serie, nr_top=10):
    top = serie.sort_values(ascending=False).head(nr_top)
    for cod, scor in zip(top.index, top):
        detalii_vot(cod, scor)

serie_link_cdep(grupate.loc[:, (slice(None), vot)].sum(axis=1))

Vot 22468: scor 174.000

Vot 22764: scor 105.000

Vot 20644: scor 104.000

Vot 20642: scor 101.000

Vot 22380: scor 101.000

Vot 22078: scor 95.000

Vot 16287: scor 94.000

Vot 20524: scor 94.000

Vot 22732: scor 94.000

Vot 16539: scor 93.000

Subiecte de vot caracteristice partidelor

Pentru fiecare partid, o să vedem top 10 subiecte de vot ce diferențiază acel partid de altele.

def normalize():
    vot_relativ = grupate.copy()
    sume = {}
    for p in coloane_partide:
        total_voturi = vot_relativ[p].sum(axis=1)
        vot_relativ.loc[:, p] = vot_relativ.loc[:, p].divide(total_voturi, axis=0).values
    return vot_relativ

# Pondere de 1 pentru partidul în vedere, și -1 pentru medie
normalizat = normalize()

medie = normalizat.mean(axis=1, level=1)

for partid in coloane_partide:
    print(f"Voturi specifice {partid}:")
    serie_link_cdep((normalizat[partid] - medie).max(axis=1)/0.875)
    print()

Citiți partea a 2-a, unde comentez cele mai specifice voturi ale partidelor!

Voturi specifice PSD:

Vot 22732: scor 0.868

Vot 22764: scor 0.865

Vot 22079: scor 0.825

Vot 20403: scor 0.750

Vot 22463: scor 0.741

Vot 20071: scor 0.741

Vot 22460: scor 0.734

Vot 22586: scor 0.728

Vot 22587: scor 0.725

Vot 20717: scor 0.688

Voturi specifice ALDE:

Vot 22079: scor 0.835

Vot 20403: scor 0.770

Vot 20402: scor 0.756

Vot 22586: scor 0.748

Vot 22460: scor 0.744

Vot 22463: scor 0.741

Vot 20342: scor 0.698

Vot 22362: scor 0.686

Vot 22587: scor 0.680

Vot 20071: scor 0.662

Voturi specifice Minorități:

Vot 16498: scor 1.000

Vot 16894: scor 0.972

Vot 16887: scor 0.871

Vot 16490: scor 0.852

Vot 16696: scor 0.740

Vot 20402: scor 0.714

Vot 16694: scor 0.700

Vot 20403: scor 0.636

Vot 21028: scor 0.615

Vot 20417: scor 0.612

Voturi specifice UDMR:

Vot 22871: scor 1.000

Vot 20136: scor 1.000

Vot 20343: scor 1.000

Vot 22472: scor 1.000

Vot 19094: scor 1.000

Vot 19235: scor 1.000

Vot 22590: scor 0.996

Vot 17289: scor 0.994

Vot 19452: scor 0.992

Vot 18786: scor 0.988

Voturi specifice Neafiliați:

Vot 22291: scor 0.857

Vot 22300: scor 0.857

Vot 22299: scor 0.857

Vot 22162: scor 0.842

Vot 22307: scor 0.833

Vot 22078: scor 0.833

Vot 22872: scor 0.828

Vot 22151: scor 0.824

Vot 22158: scor 0.791

Vot 22529: scor 0.777

Voturi specifice PNL:

Vot 19318: scor 0.981

Vot 20722: scor 0.975

Vot 20998: scor 0.973

Vot 18628: scor 0.973

Vot 18840: scor 0.973

Vot 17367: scor 0.964

Vot 22528: scor 0.962

Vot 21116: scor 0.961

Vot 20598: scor 0.958

Vot 21032: scor 0.957

Voturi specifice PMP:

Vot 18586: scor 0.999

Vot 19235: scor 0.998

Vot 19232: scor 0.998

Vot 22896: scor 0.998

Vot 22240: scor 0.997

Vot 16346: scor 0.996

Vot 16297: scor 0.996

Vot 20318: scor 0.994

Vot 16605: scor 0.994

Vot 19412: scor 0.994

Voturi specifice USR:

Vot 22277: scor 1.000

Vot 22275: scor 1.000

Vot 22896: scor 1.000

Vot 20128: scor 0.998

Vot 20131: scor 0.998

Vot 16569: scor 0.997

Vot 22194: scor 0.991

Vot 20650: scor 0.990

Vot 16788: scor 0.990

Vot 16854: scor 0.989

Citiți partea a 2-a, unde comentez cele mai specifice voturi ale partidelor!

Similaritate între voturile partidelor

Ce partide votează similar pentru aceleași subiecte?

def diferente(p1, p2):
    vot_relativ = normalize()
    return abs(vot_relativ[p1] - vot_relativ[p2]).sum(axis=1)

def sim(p1, p2):
    return 1-(diferente(p1, p2)/2).mean()

sim_mat = pd.DataFrame(0, index=coloane_partide, columns=coloane_partide)
for p1 in coloane_partide:
    for p2 in coloane_partide:
        if not sim_mat.loc[p1, p2]:
            s = sim(p1, p2)
            sim_mat.loc[p1, p2] = s
            sim_mat.loc[p2, p1] = s
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [6, 6]

import seaborn as sns
sns.set()
ax = sns.heatmap(sim_mat, square=True)

# https://stackoverflow.com/questions/56942670/matplotlib-seaborn-first-and-last-row-cut-in-half-of-heatmap-plot
bottom, top = ax.get_ylim()
ax.set_ylim(bottom + 0.5, top - 0.5)
ax.set_title('Similaritate între voturile partidelor')

png

Ce înseamnă toate acestea?

  • Partidele sunt destul de similare (de exemplu, PSD și USR au votat similar la aprox. 70% din voturi).
  • Avem de unde alege (există diferențe importante în acele 30% rămase).

Citiți și partea a 2-a, unde comentez cele mai specifice voturi ale partidelor!

Comments