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')
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).
Comments