Introduction
La corruption s’est positionnée comme le principal problème qui inquiète les Colombiens à l’approche de l’élection du prochain président, selon le dernier sondage Invamer (10 juin 2022), reflétant l’importance et l’impuissance à combattre ce fléau qui prive le pays de 50 000 milliards de pesos colombiens par an, selon les entités de contrôle.
Ce projet tente de répondre à la question suivante : quelles sont les attentes en matière de vote dans les villes où les cas de corruption sont les plus détectés en Colombie ?

Lors des élections présidentielles de 2022, les Colombiens pourront choisir le candidat qui, selon eux, s’attaquera à la corruption dans leurs régions et dans tout le pays. Après le premier tour des élections, nous pouvons visualiser le comportement de l’électorat qui aspire à éradiquer complètement ce fléau. Selon l’indice de perception de la corruption – 2021 (Transparency International), la Colombie a obtenu 39 points sur 100, 0 correspondant à une corruption très élevée et 100 à une corruption nulle. Le pays se classe 87e sur les 180 pays évalués. Un score inférieur à 50 points indique des niveaux très sérieux de corruption dans le secteur public.
Le degré d’incertitude qu’éprouvent les Colombiens quant au destin du pays ne peut être contré que par l’exercice démocratique du vote, où la raison et l’intelligence devraient nous pousser à revoir les plans de lutte contre la corruption dans les programmes gouvernementaux.
Nous conclurons par une analyse à la fin du développement, en mettant l’accent sur la combinaison de l’utilisation de différents outils pour générer des informations précieuses. Tout cela sans la moindre intention de partialité ou de prise de parti politique, car la corruption est un cancer et il est de notre ressort d’essayer de trouver un remède dans les urnes. Il est également important de noter qu’il n’y a aucune corrélation entre le nombre de cas trouvés et le vainqueur des élections dans chaque région.
📌 J'utiliserai Pandas et Plotly de Python pour traiter les données obtenues, et les visualisations seront construites avec l'API MapBox et Tableau Public.
Data
Les principales données ont été téléchargées à partir du rapport « Así se mueve la corrupción », publié par l’ONG Transparencia por Colombia le 2 décembre 2021, qui présentait l’analyse de 967 faits de corruption rapportés dans 2026 communiqués de presse nationaux publiés entre 2016 et 2020.

Le rapport a révélé que la majorité des incidents de corruption (53%) se produisent dans : Bogotá (200 faits), Atlántico (88 faits), Antioquia (76 faits), Santander (75 faits) et Valle del Cauca (74 faits), où le type de corruption le plus fréquent est la corruption administrative dans le secteur public.
En utilisant la base de données du dernier bulletin des résultats du premier tour de l’élection présidentielle de 2022 en Colombie, publié par le Registre national colombien, nous pouvons faire une comparaison avec les données du rapport sur la corruption pour comprendre qui a voté dans chaque ville pour mettre fin à ce crime.
Ce rapport reflète une fois de plus la nature systématique et structurelle de la corruption. Ceux qui aspirent à la présidence de la République doivent présenter des propositions ambitieuses, décisives et cohérentes pour s’attaquer globalement à ce problème.
En tant que société, nous devons procéder à un examen approfondi des effets profonds de la corruption. Nous devons être en mesure d’élire ceux qui sont capables de s’attaquer réellement et sérieusement à ce problème, de ne pas se contenter de discours faciles et d’exiger des actions efficaces. Nous ne devons pas les laisser continuer à voler notre présent et notre avenir.
Andrés Hernández, Directeur exécutif, Transparencia por Colombia
MÉTHODOLOGIE
📌 Le code complet sera publié dans un notebook sur Github. Après un problème avec l'API MapBox dans le bloc-notes Jupyter exécuté localement sur mon ordinateur, j'ai décidé de traiter les données dans un bloc-notes COLAB en ligne, puis d'exporter le cadre de données au format CSV vers Tableau Public.
Traitement et nettoyage des données
- Nous importons nos dépendances (pandas, plotly et json) de Python dans notre notebook.
import pandas as pd
import json
import plotly.express as px
px.set_mapbox_access_token(token_map_plot)
import plotly.graph_objects as go
pd.options.display.max_columns = 999
Voir le rapport « Así se mueve la corrupción »
- Nous commençons par importer les données au format CSV et créons notre premier DataFrame avec Pandas en Python.
bd_corr = pd.read_csv('data/base-de-datos-hechos.csv')
- Pour cet exemple, nous devons avoir un compte pour générer un jeton avec l’API MapBox
token_map_plot = 'AquíVaTuTokenPersonalDeMapbox'
- L’étape suivante de notre EDA consistera à examiner vos informations, la taille des colonnes et des lignes, les données nulles, les noms de colonnes et les types de données à modifier.
bd_corr.info()
bd_corr.shape
bd_corr.columns
bd_corr.dtypes
- Je voulais renommer l’une des principales colonnes avec lesquelles je veux travailler :
bd_corr = bd_corr.rename(columns={'Tipo de corrupción':'tipo_corrupcion'})
- Je regroupe avec .groupby dans un nouveau DataFrame uniquement les colonnes dont j’ai besoin :
map_corr_deptos = bd_corr.groupby(['Departamento', 'Dep_Lat', 'Dep_Lng'])['tipo_corrupcion'].count().reset_index()
Pour obtenir :

- Ici, j’ai été confronté à un problème qui m’a pris plusieurs heures : Les colonnes Dep_Lat et Dep_lng (emplacement de la latitude et de la longitude pour chaque département) ont changé leurs valeurs en déplaçant le point de coordonnées par des points de milliers et de millions, à savoir:
Pour Amazonas, il renvoie les valeurs : -42.152.778 et -699.405.556 alors qu'en fait, ses coordonnées correctes sont : -4.215278 y -69.940556
- J’ai essayé de déplacer les points du NoteBook avec pandas mais je n’ai pas réussi, finalement comme il n’y avait que 32 enregistrements j’ai décidé de télécharger le DataFrame en .CSV et de le formater dans une feuille de calcul Excel. (Ce ne doit pas être une bonne pratique mais je trouverai la bonne façon de le faire plus tard ☹ ).
map_corr_deptos.to_csv("map_corr_deptos_error.csv")
- Puis j’ai rechargé le CSV en corrigeant les valeurs de Latitude et Longitude : (le paramètre ‘sep=’;’ est utilisé pour séparer les colonnes lors du chargement du Dataframe avec Pandas).
map_corr_deptos_ok = pd.read_csv('data/map_corr_deptos_ok.csv', sep=';')
map_corr_deptos_ok.head()

- Nous importons la bibliothèque plotly.io pour générer notre première visualisation :
import plotly.io as pio
pio.templates
fig = px.bar(map_corr_deptos_ok, x='Departamento', y='count',
color='count',
template='plotly_dark',
labels={'count':'Cantidad de casos'},
title='Cantidad de casos de corrupción por departamento',
height=400)
fig.show()

- J’ai apporté une modification à certains noms de départements pour réduire leur longueur :
map_corr_deptos_ok.Departamento = map_corr_deptos_ok.Departamento.replace({'BOGOTÁ, DISTRITO CAPITAL' : 'BOGOTA D.C.'})
map_corr_deptos_ok.Departamento = map_corr_deptos_ok.Departamento.replace({'GUAJIRA' : 'LA GUAJIRA'})
map_corr_deptos_ok.Departamento = map_corr_deptos_ok.Departamento.replace({'NORTE SANTANDER' : 'NORTE DE SAN'})
map_corr_deptos_ok.Departamento = map_corr_deptos_ok.Departamento.replace({'SAN ANDRES, PROV.' : 'SAN ANDRES'})
- J’ai utilisé px.scatter_mapbox pour visualiser les données avec la carte de la Colombie :
px.scatter_mapbox(map_corr_deptos_ok,
lat='Dep_Lat',
lon='Dep_Lng',
color='Departamento',
size='tipo_corrupcion',
color_continuous_scale=px.colors.cyclical.IceFire,
#size_max=5,
zoom=4,
center = dict(
lat = 4.570868,
lon = -74.297333
),
height= 600
)

- Et un autre mode d’affichage appliquant un style MapBox différent :
fig = go.Figure(go.Scattermapbox(
lon = map_corr_deptos_ok.Dep_Lng,
lat = map_corr_deptos_ok.Dep_Lat,
mode = 'markers+text',
marker = go.scattermapbox.Marker(size=map_corr_deptos_ok.tipo_corrupcion,
color = map_corr_deptos_ok.tipo_corrupcion,
#colorscale = 'Edge',
showscale = True,
sizemode = 'area',
opacity = 0.8
),
hoverinfo = 'text',
hovertext =
'<b>Departamento</b>: '+ map_corr_deptos_ok['Departamento'].astype(str) + '<b>' +
'<b>Cantidad de actos</b>: '+ map_corr_deptos_ok['tipo_corrupcion'].astype(str) + '<b>'
))
fig.update_layout(
hovermode = 'x',
margin = dict(r=0, l=0, b=0, t=0),
mapbox = dict(
accesstoken = token_map_plot,
style = 'dark',
zoom = 4.5,
center = dict(
lat = 4.570868,
lon = -74.297333
)
),
showlegend = True,
autosize = True
)

Visualisation de la carte électorale au premier tour de l’élection présidentielle en Colombie 2022 🗳
- Nous importons les données de notre fichier CSV :
df_elecciones = pd.read_csv('data/resultados_primera_vuelta_2022_boletin_68.csv')
- Nous analysons leur contenu dans les noms de colonnes (.columns), la quantité de données (.shape) et les types de données (.dtypes).
- Avec le dataFrame df_elections nous pouvons visualiser les votes à l’intérieur et à l’extérieur de la Colombie, par exemple en France 🇫🇷 voici les résultats : False=Total des votes // True=Votes en France pour chaque candidat (4 premiers) :
df_elecciones_francia = df_elecciones.groupby([df_elecciones.mun == 'FRANCIA'])['FEDERICO_GUTIÉRREZ_vot', 'RODOLFO_HERNÁNDEZ_vot', 'GUSTAVO_PETRO_vot', 'SERGIO_FAJARDO_vot'].sum().reset_index()
df_elecciones_francia.head()

df_elecciones_francia.plot(kind='bar')

- J’ai groupé un nouveau DataFrame avec .groupby les départements et les 4 candidats avec le plus de votes.
df_elecciones_deptos = df_elecciones.groupby(['dpto'])['FEDERICO_GUTIÉRREZ_vot', 'RODOLFO_HERNÁNDEZ_vot', 'GUSTAVO_PETRO_vot', 'SERGIO_FAJARDO_vot'].sum().reset_index()

- J’ai fait un diagramme à barres avec matplotlib (mais il a besoin de plus de formatage) :
df_elecciones_deptos.plot(kind='bar')

- Voici le premier diagramme en barres des votes pour chaque candidat par département :
fig = px.bar(df_elecciones_deptos, x='dpto', y='Nombre_Columna_Candidato',
color='dpto',
template='plotly_dark',
labels={'df_elecciones_deptos':'Cantidad de votos'},
title='Cantidad de votos por departamento',
height=400)
fig.show()




- Enfin, pour connaître le résultat du vote dans les villes ayant le plus de cas de corruption, j’ai unifié avec .merge les deux Dataframes (df_elecciones_deptos et map_coo_deptos_ok) en un seul Dataframe = df_elecciones_casos, avec ce Dataframe nous ajoutons les coordonnées géographiques et le nombre de cas de corruption par département.
df_elecciones_casos = df_elecciones_deptos.merge(map_corr_deptos_4, left_on='dpto', right_on='Departamento', how ='left')
df_elecciones_casos
- En analysant le type de données du nouveau Dataframe, nous constatons que la colonne « Corruption_type » est passée au type Float64 et que nous avons besoin d’un type entier « Int ».
df_elecciones_casos.tipo_corrupcion = df_elecciones_casos.tipo_corrupcion.astype(int)
- Nous avons maintenant notre Dataframe prêt à être exporté en CSV et à continuer à tester certaines possibilités dans Tableau Public.
df_elecciones_casos.to_csv("data/df_elecciones_casos_filtrado.csv")
Tableau Public

Une fois les données unifiées au format CSV, j’ai utilisé la plateforme Tableau Public pour créer un tableau de bord et rassembler quelques visualisations pour soutenir l’analyse.
📌 Vous pouvez accéder au tableau de bord public ici.
Analyse et conclusions

Bien que des cas de corruption aient été identifiés dans les 32 départements et dans le district de la capitale, Bogota, il est important de souligner que 53% sont concentrés dans seulement cinq départements : Bogotá, Atlántico, Antioquia, Santander et Valle del Cauca.
Les 200 cas de corruption étant concentrés à Bogota, la centralisation des institutions, des organismes publics et des acteurs sociaux et économiques est mise en évidence, tout comme la facilité de dénonciation, le rapport faisant référence aux garanties de la liberté d’expression et à l’existence de médias. Cette dernière reflète la sous-déclaration dans certaines régions, non pas en raison de l’inexistence de cas de corruption, mais en raison du manque de libre exercice du journalisme d’investigation, en plus des menaces, du terrorisme et de la corruption elle-même.
Le résultat du croisement des données de corruption par département et du résultat de l’élection présidentielle au premier tour se traduit simplement par la confirmation des tendances en faveur des candidats que les Colombiens ont choisis dans chaque département. Gustavo Petro a gagné à Bogotá, Atlántico et Valle del Cauca, Federico Gutiérrez a gagné à Antioquia, et Rodolfo Hernández a gagné à Santander.

Loin d’une analyse politique, il y a une forte tendance à un changement décisif dans la manière de gouverner la Colombie, générant une forte polarisation envers les gagnants qui iront au second tour le 19 juin 2022 : Gustavo Petro et Rodolfo Hernández.
Beaucoup continuent à appeler les NON-VOTANTS à participer activement à cette décision en prenant parti avec des arguments et une connaissance des propositions, et non avec des mèmes ou des fake news. L’indifférence de l’abstentionnisme fait plus mal en sachant que tout peut s’améliorer si nous nous mettons d’accord pour aller vers le même objectif et éradiquer complètement la corruption qui nous fait tant de mal en tant que peuple.
J’ai trouvé ma voie dans les données pour raconter des histoires visuelles, la courbe d’apprentissage est très raide, parfois frustrante, je rencontre des problèmes tout le temps, je poste et demande de l’aide, parfois elle arrive et parfois non, parfois la solution est sur Stack Overflow, parfois sur Youtube ou un tutoriel sur Medium, mais j’avoue que j’aime ça et j’aimerais apprendre à mieux le faire.
Je fais ce projet 4 jours avant les élections présidentielles du second tour, tous ceux d’entre nous qui ont la possibilité de choisir devraient le faire. Un vote fait la différence.

Voir le code Python de l’ensemble du projet dans le dépôt GitHub
Références
- https://www.elespectador.com/politica/elecciones-colombia-2022/la-corrupcion-sigue-siendo-la-mayor-preocupacion-de-los-colombianos-invamer/
- https://transparenciacolombia.org.co/2022/01/25/indice-de-percepcion-de-la-corrupcion-2021/
- https://www.elespectador.com/politica/elecciones-colombia-2022/la-corrupcion-sigue-siendo-la-mayor-preocupacion-de-los-colombianos-invamer/

