Zunächst einmal brauchen wir Daten.

Ich habe Daten zu allen Gesetzen heruntergeladen, über die abgestimmt wurde, und wie jedes Mitglied des Kongresses von 2023 bis 2024 bis zum 18. Mai abgestimmt hat. Alle Daten sind beim brasilianischen C verfügbarDas offene Datenportal von ongress. Anschließend habe ich zwei verschiedene Pandas-Datenrahmen erstellt, einen mit allen Gesetzen, über die abgestimmt wurde, und einen anderen mit der Artwork und Weise, wie jedes Kongressmitglied bei jeder Abstimmung abgestimmt hat.

votacoes = pd.concat((pd.read_csv('votacoes-2023.csv', header=0, sep=';'),  pd.read_csv('votacoes-2024.csv', header=0, sep=';')))
votacoes_votos_dep = pd.concat((pd.read_csv('votacoesVotos-2023.csv', sep=';', quoting=1) , pd.read_csv('votacoesVotos-2024.csv', sep=';', on_bad_lines='warn', quoting=1, encoding='utf-8')))

Zum Votacoes Datenrahmen, ich habe nur die Einträge mit ausgewählt idOrgao von 180, was bedeutet, dass sie in der Hauptkammer des Kongresses gewählt wurden. Wir haben additionally die Daten für die Stimmen der meisten Kongressmitglieder. Dann habe ich die Liste der verwendet votacoes_Ids um die zu filtern votacoes_votos_dep Datenrahmen.

plen = votacoes(votacoes('idOrgao') == 180)
votacoes_ids = plen('id').distinctive()
votacoes_votos_dep = votacoes_votos_dep(votacoes_votos_dep('idVotacao').isin(votacoes_ids))

Nun, im votacoes_votos_dep, Bei jeder Abstimmung handelt es sich um eine Zeile mit dem Namen des Kongressmitglieds und der Abstimmungssitzungs-ID, um zu identifizieren, auf wen und worauf sich die Abstimmung bezieht. Deshalb habe ich eine Pivot-Tabelle erstellt, in der jede Zeile ein Kongressmitglied darstellt und jede Spalte sich auf eine Stimme bezieht. Dabei habe ich „Ja“ als 1 und „Nein“ als 0 kodiert und alle Stimmen gelöscht, bei denen mehr als 280 Abgeordnete nicht abgestimmt haben.

votacoes_votos_dep('voto_numerico') = votacoes_votos_dep('voto').map({'Sim': 1, 'Não':0})
votes_pivot = votacoes_votos_dep.pivot_table(index='deputado_nome', columns='idVotacao', values='voto_numerico').dropna(axis=1, thresh=280)

Bevor ich die Ähnlichkeitsmatrix berechnete, habe ich alle verbleibenden NAs mit 0,5 gefüllt, um die Positionierung des Kongressmitglieds nicht zu beeinträchtigen. Schließlich berechnen wir die Ähnlichkeit zwischen den Vektoren jedes Stellvertreters mithilfe der Kosinusähnlichkeit und speichern sie in einem Datenrahmen.

from sklearn.metrics.pairwise import cosine_similarity
similarity_matrix = cosine_similarity(votes_pivot)
similarity_df = pd.DataFrame(similarity_matrix, index=votes_pivot.index, columns=votes_pivot.index)
Ähnlichkeitsmatrix – Bild vom Autor

Nutzen Sie nun die Informationen über die Abstimmungsähnlichkeiten zwischen Kongressabgeordneten, um mithilfe von N ein Netzwerk aufzubauenetworkx. Ein Knoten repräsentiert jedes Mitglied.

import networkx as nx

names = similarity_df.columns
# Create the graph as earlier than
G = nx.Graph()
for i, title in enumerate(names):
G.add_node(title)

Dann stellen die Kanten, die zwei Knoten verbinden, eine Ähnlichkeit von mindestens 75 % des Abstimmungsverhaltens der beiden Kongressabgeordneten dar. Um der Tatsache Rechnung zu tragen, dass einige Kongressabgeordnete Dutzende von Kollegen mit einem hohen Grad an Ähnlichkeit haben, habe ich nur die ersten 25 Kongressabgeordneten mit der höchsten Ähnlichkeit ausgewählt, um ihnen einen Vorteil zu verschaffen.

threshold = 0.75
for i in vary(len(similarity_matrix)):
for j in vary(i + 1, len(similarity_matrix)):
if similarity_matrix(i)(j) > threshold:
# G.add_edge(names(i), names(j), weight=similarity_matrix(i)(j))
counter(names(i)).append((names(j), similarity_matrix(i)(j)))
for supply, goal in counter.gadgets():
selected_targets = sorted(goal, key=lambda x: x(1), reverse=True)(:26)
for goal, weight in selected_targets:
G.add_edge(supply, goal, weight=weight)

Um das Netzwerk zu visualisieren, müssen Sie die Place jedes Knotens in der Ebene bestimmen. Ich habe mich für das Federlayout entschieden, bei dem die Kanten als Federn verwendet werden, die Knoten zusammenhalten und gleichzeitig versuchen, sie zu trennen. Das Hinzufügen eines Startwerts ermöglicht die Reproduzierbarkeit, da es sich um einen zufälligen Prozess handelt.

pos = nx.spring_layout(G, ok=0.1,  iterations=50, seed=29)

Abschließend zeichnen wir das Netzwerk mithilfe einer Go-Figur auf und fügen die Kanten und Knoten basierend auf ihrer Place einzeln hinzu.


# Create Edges
edge_x = ()
edge_y = ()
for edge in G.edges():
x0, y0 = pos(edge(0))
x1, y1 = pos(edge(1))
edge_x.lengthen((x0, x1, None))
edge_y.lengthen((y0, y1, None))

# Add edges as a scatter plot
edge_trace = go.Scatter(x=edge_x, y=edge_y, line=dict(width=0.5, shade='#888'), hoverinfo='none', mode='traces')
# Create Nodes
node_x = ()
node_y = ()
for node in G.nodes():
x, y = pos(node)
node_x.append(x)
node_y.append(y)

# Add nodes as a scatter plot
node_trace = go.Scatter(x=node_x, y=node_y, mode='markers+textual content', hoverinfo='textual content', marker=dict(showscale=True, colorscale='YlGnBu', dimension=10, shade=(), line_width=2))

# Add textual content to the nodes
node_trace.textual content = listing(G.nodes())

# Create a determine
fig = go.Determine(knowledge=(edge_trace, node_trace),
structure=go.Format(showlegend=False, hovermode='closest', margin=dict(b=0,l=0,r=0,t=0), xaxis=dict(showgrid=False, zeroline=False, showticklabels=False), yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)))

fig.present()

Ergebnis:

Bild vom Autor

Nun, es ist ein guter Anfang. Es sind verschiedene Cluster von Kongressabgeordneten zu sehen, was darauf hindeutet, dass die politische Ausrichtung und die Bündnisse im Kongress genau erfasst werden. Aber es ist ein Chaos, und es ist unmöglich, wirklich zu erkennen, was vor sich geht.

Um die Visualisierung zu verbessern, habe ich dafür gesorgt, dass der Title nur dann angezeigt wird, wenn Sie mit der Maus über den Knoten fahren. Außerdem habe ich die Knoten entsprechend den auf der Web site des Kongresses verfügbaren politischen Parteien und Koalitionen eingefärbt und ihre Größe danach bestimmt, mit wie vielen Kanten sie verbunden sind.

Bild vom Autor

Es ist viel besser. Wir haben drei Cluster mit einigen Knoten dazwischen und jeweils einigen größeren. Außerdem gibt es in jedem Cluster einen Großteil einer bestimmten Farbe. Nun, lassen Sie es uns genauer analysieren.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert