5. Quem suportou quem: os votos na generalidade

“Just the place for a Snark!” the Bellman cried,
As he landed his crew with care;
Supporting each man on the top of the tide
By a finger entwined in his hair.

“Just the place for a Snark! I have said it twice:
That alone should encourage the crew.
Just the place for a Snark! I have said it thrice:
What I tell you three times is true.”

—Lewis Carrol, «The Hunting of the Snark»

5.1. Metodologia

A obtenção dos dados e parte substancial do seu tratamento é idêntica a utilizada nas outras análises, com uma alteração que permite a obtenção de uam nova dimensão de dados, muito semelhante à utilizada na análise do Orçamento de Estados: o perfil de votações tendo em conta a origem da proposta.

Se no Orçamento de Estado esta informação é simples de obter, nas iniciativas parlamentares é menos óbvia: uma votação associada a uma iniciativa de determinado partido não pode ser classificada como sendo uma votação sobre algo proposto por esse mesmo partido. A razão é simples: as votações podem ser, por exemplo, sobre propostas de alteração, e estas podem ter múltiplas origens.

Existem duas soluções para esta questão:

  1. Proceder a uma análise textual que permita identificar a origem da votação em causa, isto porque a única forma de proceder à sua identificação é pelo tratamento de um campo em texto livre (por exemplo, “Proposta de alteração de XXX - artigo 40”, mas com várias permutações).

  2. Isolar uma determinada categoria de votação que permita a imputação de autoria de forma directa.

Optámos pela opção 2, pela maior fiabilidade dos resultados, sob a forma de isolamento das Votações na Generalidade - que são, das que cumprem o requisito, as que são em amior número, e também aquelas que à partida melhor representam os projectos postos a votação (por não serem alvo de alterações na especialdiade que podem ser substanciais).

5.2. As propostas: quantidade, aprovações, rejeições

O total de propostas votadas na generalidade, com a identificação das aprovadas e rejeitadas, é o seguinte:

ct = pd.crosstab(l14af.GP, l14af.resultado)
ct["Total"] = ct["Aprovado"] + ct["Rejeitado"]
ct.sort_values(by=['Total'], axis=0, ascending=False)
resultado Aprovado Rejeitado Total
GP
BE 108 138 246
PCP 87 151 238
PAN 68 96 164
PEV 53 86 139
PSD 93 21 114
CDS-PP 54 49 103
PS 59 1 60
IL 11 28 39
CH 1 29 30
CR 14 14 28
L/JKM 9 14 23
ct.sort_values(by=['Total'], axis=0, ascending=False).drop("Total", axis=1).plot(kind="bar", stacked=True)
plt.show()
_images/l14-autores_20_0.png

Com esta informação, e de forma muito semelhante à utilizada para determinar os apoios às propostas de alteração do Orçamento de Estado, é possível determinar os padrões de votação; o diagrama seguinte mostra a relação entre cada par de partidos: no eixo horizontal quem propõe, e no vertical como votaram:

import seaborn as sns
from matplotlib.colors import ListedColormap
#parties   = ['BE', 'PCP', 'PEV', 'PS', 'L', 'PAN','PSD','IL','CDS-PP', 'CH']
#parties   = ['BE', 'PCP','PS', 'PAN','PSD','IL','CDS-PP', 'CH']
parties = ['BE', 'PCP', 'PEV', 'PS', 'L/JKM', 'CR', 'PAN','PSD','IL','CDS-PP', 'CH' ]
gpsubs = submissions_ini

cmap=ListedColormap(sns.color_palette("pastel").as_hex())
colors=["#DFE38C","#F59B9B","black","#7FE7CC" ]
cmap = ListedColormap(colors)

spn = 0
fig, axes = plt.subplots(nrows=11, ncols=11, figsize=(30, 30))
axes = axes.ravel()
plt.rcParams.update({'font.size': 22})

for party in parties:
    for p2 in parties:
        sns.set_style("white")
        subp = gpsubs[gpsubs['GP'] == p2][[party]]
        sp = subp.fillna("Ausência").apply(pd.Series.value_counts)
        d = pd.DataFrame(columns=["GP","Abstenção", "Contra", "Ausência","A Favor"]).merge(sp.T, how="right").fillna(0)
        d["GP"] = party
        d = d.set_index("GP")
        d = d[["Abstenção", "Contra", "Ausência","A Favor"]]
        if p2 != party:
            sns.despine(left=True, bottom=True)
            if spn < 11:
                d.plot(kind='barh', stacked=True,width=400,colormap=cmap, title=p2,use_index=False,ax=axes[spn], fontsize=12)
                axes[spn].title.set_size(20)
            else:
                d.plot(kind='barh', stacked=True,width=400,colormap=cmap,use_index=False,ax=axes[spn])
            axes[spn].get_legend().remove()
            plt.ylim(-4.5, axes[spn].get_yticks()[-1] + 0.5)
            axes[spn].tick_params(labelsize=14)

        else:
            axes[spn].set_xticks([])
            #d.plot(kind='barh', stacked=True,width=400,colormap=cmap,use_index=False,ax=axes[spn])
            #axes[spn].get_legend().remove()
            if spn < 11:
                axes[spn].set_title(p2, fontsize=20)
        axes[spn].set_yticks([])
        ## Why? Who knows? Certainly not me. This is likely a side-effect of using a single axis through .ravel
        if spn%11 == 0:
            if spn != 0:
                text = axes[spn].text(-45,0,party,rotation=90, fontsize=20)
            else:
                text = axes[spn].text(-0.17,0.5,party,rotation=90,fontsize=20)
        #print(party, p2)
        #print(d)
        #print("-------------------------_")
        spn += 1

#axes[11].set_axis_off()
text = axes[0].text(6,1.3,"Quem propôs",rotation=0,fontsize=26)
text = axes[0].text(-0.4,-6,"Como votaram",rotation=90,fontsize=26)

#fig.tight_layout()
plt.show()
_images/l14-autores_23_0.png

Uma outra visualização que foca cada gráfico nas propostas de cada partido, e como votaram os restantes:

from IPython.display import display
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
from matplotlib import cm
parties   = ['BE', 'PCP', 'PEV', 'PS'
             , 'PAN','PSD','IL','CDS-PP', 'CH']
parties = ['BE', 'PCP', 'PEV', 'PS', 'L/JKM', 'CR', 'PAN','PSD','IL','CDS-PP', 'CH' ]

ndf = pd.DataFrame()
#submissions_ini_nu = submissions_ini.loc[submissions_ini['unanime'] != "unanime"]
gpsubs = submissions_ini
cmap=ListedColormap(sns.color_palette("pastel").as_hex())
colors=["#77dd77", "#fdfd96",  "black","#ff6961" ]
cmap = ListedColormap(colors)

#spn = 0
#axes = axes.ravel()

for party in parties:
    sns.set_style("whitegrid")
    subp = gpsubs[gpsubs['GP'] == party]
    sp = subp[parties].apply(pd.Series.value_counts).fillna(0).drop([party],axis=1)
    sp = sp.sort_values(by=['A Favor','Abstenção','Contra'], ascending=False, axis=1)
    d = sp.T
    f = plt.figure()
    plt.title(party)
    d.plot(kind='bar', ax=f.gca(), stacked=True, title=party, colormap=cmap,)
    plt.legend(loc='center left',  bbox_to_anchor=(0.7, 0.9),)
    plt.show()
    #print(d)

plt.show()
_images/l14-autores_25_0.png _images/l14-autores_25_1.png _images/l14-autores_25_2.png _images/l14-autores_25_3.png _images/l14-autores_25_4.png _images/l14-autores_25_5.png _images/l14-autores_25_6.png _images/l14-autores_25_7.png _images/l14-autores_25_8.png _images/l14-autores_25_9.png _images/l14-autores_25_10.png

5.3. Análise

Os dados não divergem do panorama geral obtido por via da análise das votações (sem levar em conta a autoria), ou pelo menos não os contradizem; dada a identificação da autoria uma nova dimensão pode ser

  • BE, PCP, PEV, L/JKM e PAN estão, em ordens diferentes, sempre an metade que mais apoia as propostas de cada um.

  • PEV e BE apoiam todas as propostas do PCP, que por sua vez vota maioritariamente a fazer das propostas do BE e PEV mas com algumas abstenções e votos contra (ainda assim, residuais tendo em conta a quantidade de propostas).

  • O PCP tem alguns votos contra propostas do PEV, seu parceiro de coligação; olhando para a lista de dados são propostas em torno da caça e tauromaquia.

  • As propostas do PS obtêm mais votos favoráveis no PAN e L/JKM, e menos na IL e CH, com os restantes algures no meio.

  • Cristina Rodrigues é a maior apoiante do PAN, de onde saiu, e o PS e CDS-PP os que mais vezes votam contra propostas do PAN.

  • PSD tem maior suporte à sua direita (CDS-PP, CH, IL), sendo o PS e PCP os que menos votam favoravelmente as suas propostas.

  • IL, CH e CDS-PP são os maiores apoiantes mútuos, com a curiosidade de Cristina Rodrigues ser a maior apoiante das propostas do CH (seguida dos restantes).

  • O PAN aparece na metade que mais apoia em todo o espectro: é quem mais vota a favor de propostas à esquerda, mas está também no grupo que mais vota a favot de propostas da direita (em particular sendo, a seguir ao CH, quem mais apoia propostas da IL).

  • O PCP é o unico partido a não votar favoravelmente nenhuma proposta do CH (embora os votos favoráveis à esquerda sejam residuais nos outros partidos), sendo o PS é o partido que mais vota contra as propostas do mesmo.

lch = l14af[l14af["GP"] == "L/JKM"]
lch.sort_values(by='data', inplace = True) 
/home/frmuno/.local/lib/python3.8/site-packages/pandas/util/_decorators.py:311: SettingWithCopyWarning:


A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
lch
fase iniNr iniTipo iniDescTipo iniLeg iniSel dataInicioleg dataFimleg iniTitulo iniTextoSubst ... iniAnexos unanime iniTextoSubstCampo iniObs L ausencias peticoes publicacao iniciativasOrigem GP
757 Votação na generalidade 126 J Projeto de Lei XIV 1 2019-10-25 2020-09-14 Nona alteração à Lei n.º 37/81, de 3 de outubr... NAO ... NaN NaN NaN NaN A Favor NaN NaN NaN NaN L/JKM
1268 Votação na generalidade 365 R Projeto de Resolução XIV 1 2019-10-25 2020-09-14 Proteção dos Idosos do Vírus Sars-Cov-2 em Lar... SIM ... NaN NaN Texto inicial substituído a pedido do autor em... NaN NaN NaN NaN NaN NaN L/JKM
1269 Votação na generalidade 364 R Projeto de Resolução XIV 1 2019-10-25 2020-09-14 Recomenda ao Governo medidas de apoio ao pagam... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
1270 Votação na generalidade 363 R Projeto de Resolução XIV 1 2019-10-25 2020-09-14 Recomenda ao Governo medidas de apoio aos trab... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
1132 Votação na generalidade 498 R Projeto de Resolução XIV 1 2019-10-25 2020-09-14 Plano Urgente de Ação para a Qualidade do Ar NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
1134 Votação na generalidade 496 R Projeto de Resolução XIV 1 2019-10-25 2020-09-14 Plano de Ação para a Redução Drástica de Resíduos NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
1159 Votação na generalidade 476 R Projeto de Resolução XIV 1 2019-10-25 2020-09-14 Recomenda ao Governo o aumento da oferta de tr... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
996 Votação na generalidade 621 R Projeto de Resolução XIV 1 2019-10-25 2020-09-14 Institui o dia 25 de setembro como o Dia Nacio... NAO ... NaN unanime NaN NaN NaN NaN NaN NaN NaN L/JKM
3269 Votação na generalidade 812 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Recomenda ao Governo a criação de medidas que ... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
3203 Votação na generalidade 879 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Reforçar e Melhorar as Políticas de Saúde Ment... SIM ... NaN NaN Título e texto substituídos a pedido do autor ... NaN NaN NaN NaN NaN NaN L/JKM
3128 Votação na generalidade 960 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Recomenda a salvaguarda integral, valorização ... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
3031 Votação na generalidade 1097 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Recomenda ao Governo o Reforço Financeiro e Té... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
2976 Votação na generalidade 1177 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Recomenda ao Governo proceder à declaração de ... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
2995 Votação na generalidade 1143 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Por uma Lei Europeia do Clima com metas ambici... SIM ... NaN NaN Substituição do texto da iniciativa em 2021-03... NaN NaN NaN NaN NaN NaN L/JKM
3036 Votação na generalidade 1088 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Por uma Educação para a Sexualidade e para os ... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
2884 Votação na generalidade 1288 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Pelo reforço das respostas locais de acesso a ... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
2906 Votação na generalidade 1259 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Pela requalificação da Quinta dos Ingleses com... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
2398 Votação na generalidade 772 J Projeto de Lei XIV 2 2020-09-15 2021-09-14 Procede a uma alteração do Código Penal, atrib... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
2868 Votação na generalidade 1310 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Por uma Política de Migração que garanta a pro... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
2845 Votação na generalidade 1340 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Pelo reforço dos incentivos à aquisição de vel... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
2455 Votação na generalidade 734 J Projeto de Lei XIV 2 2020-09-15 2021-09-14 Cria o regime de proteção e ampliação do arvor... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
2842 Votação na generalidade 1347 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Pela restauração dos ecossistemas e por um mod... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM
3325 Votação na generalidade 754 R Projeto de Resolução XIV 2 2020-09-15 2021-09-14 Classificação da Serra de Carnaxide como Paisa... NAO ... NaN NaN NaN NaN NaN NaN NaN NaN NaN L/JKM

23 rows × 44 columns