En este estudio se analiza el género del primer nombre de los candidatos de cada candidatura por España a las Elecciones europeas de 2014. Se considerará como "género" el género del primer nombre de cada candidato. En el estudio se usará el valor -1 para el género masculino y 1 para el femenino tal y como es ofrecido por la API de nombres consultada.
Se cargan los módulos necesarios para trabajar con lo datos.
In [1]:
import pandas as pd
import numpy as np
import os
%pylab inline
Se leen los datos que han sido preprocesados con anterioridad tal y como se explica en el README de Github.
In [2]:
store = pd.HDFStore(os.path.join('data','candidatos.h5'))
data = store["data"]
Hay 39 candidaturas con 54 candidatos cada una. Cada candidatura también presenta un número variable de suplentes.
Nota 1.- Los primeros nombres se encuentran codificados de tal manera que solo contienen caracteres ascii, así que las tildes y otros caracteres como la "ñ" se encuentran transliterados.
Los 25 nombres masculinos más comunes entre los candidatos.
In [3]:
pd.value_counts(data[data["gender"] == -1.]["nombre"])[:25][::-1].plot(kind="barh")
Out[3]:
Los 25 nombres femeninos más comunes. Hay que tener en cuenta que el nombre Maria y M.a se encuentran separados aún tratandose del mismo, y que para los nombres compuestos solo se considera el primer nombre.
In [4]:
pd.value_counts(data[data["gender"] == 1.]["nombre"])[:25][::-1].plot(kind="barh")
Out[4]:
A partir de los datos se puede crear una tabla que contenga el género de los candidatos —descartando a los suplentes—. En esta tabla las filas representan a las distintas candidaturas y las columnas son los distintos candidatos en orden de lista.
In [5]:
genero = data[(~data["suplente"])].pivot(index='siglas', columns='numero', values='gender')
El género de los candidatos se puede observar en la siguiente figura:
In [6]:
rcParams['figure.figsize'] = (12, 7)
ny, nx = genero.shape
imshow(genero, interpolation="none", cmap="jet")
yticks(range(ny), genero.index.values)
ylabel("Candidatura")
xticks(np.arange(nx)[::2], genero.columns.values[::2])
xlabel(u"Número de candidato")
colorbar(ticks=[-1,1], label=u"Género")
Out[6]:
En la figura se muestran en dos colores (rojo - femenino; azul - masculino) el género de los candidatos de las distintas candidaturas. Se puede apreciar el patrón de elección de candidatos en cada candidatura, en algunos casos se sigue un patrón alternante mientras que en otros el patrón es más aleatorio.
Podemos comprobar cuál es el género dominante dependiendo del número de lista del candidato. Solo se muestran los 5 primeros candidatos de cada candidatura para simplificar.
In [7]:
rcParams['figure.figsize'] = (6, 4)
genero.sum(axis=0)[0:5][::-1].plot(kind="barh")
ylabel(u"Número de candidato")
Out[7]:
Se ve como el género de la mayoría de los cabeza de lista es el masculino, con 27 candidatos de diferencia (33 masculino y 6 femenino). El los números 2 y 3 sigue habiendo más candidatos de género másculino (diferencia de 3 y 1 respectivamente) y en los números 4 y 5 se invierte la tendencia (diferencia de 7 y 3 respectivamente).
Se puede comprobar cuál es el desequilibrio final en cada candidatura tras sumar el género de todos los candidatos. Las candidaturas con mayor desequilibrio final tienen 10 candidatos más de un género con respecto al otro. En estas candidaturas el número de candidatos de género masculino es de 32 y femenino 22 o viceversa.
In [8]:
rcParams['figure.figsize'] = (12, 8)
genero.sum(axis=1)[::-1].plot(kind="barh")
Out[8]:
En la figura anterior se muestra el desequilibrio de género final de las candidaturas.
La distribución de candidaturas por desequilibrio se muestra en la siguiente figura.
In [9]:
rcParams['figure.figsize'] = (6, 4)
hist(genero.sum(axis=1), bins=np.linspace(-11,11,12))
xticks(np.linspace(-10,10,11))
xlim([-11,11])
xlabel("Desequilibrio acumulado")
ylabel("N")
Out[9]:
Se observa como la mayoría de candidaturas presentan un desequilibrio máximo hacia el género masculino, le siguen las candidaturas equilibradas. Hay 5 candidaturas con desequilibrio hacia el género femenino, 8 equilibradas y 26 con desequilibrio hacia el género masculino.
Se puede ver también el balance entre los 3 primeros candidatos. En la siguiente figura se muestra este balance.
In [10]:
rcParams['figure.figsize'] = (6, 4)
hist(genero.ix[:,0:3].sum(axis=1), bins=[-4,-2,0,2,4])
xticks([-3,-1,1,3])
xlabel("Desequilibrio en los 3 primeros candidatos")
ylabel("N")
Out[10]:
Otra forma de visualizar el desequilibrio es realizar la suma acumulada del género de los candidatos hata cierta posición en la lista.
In [11]:
rcParams['figure.figsize'] = (12, 7)
imshow(log10(genero.cumsum(axis=1).abs()), interpolation="none")
title("Desequilibrio acumulado")
yticks(range(ny), genero.index.values)
ylabel("Candidatura")
xticks(np.arange(nx)[::2], genero.columns.values[::2])
xlabel(u"Número de candidato")
from matplotlib.ticker import FuncFormatter
t = log10(np.arange(12+1))
def ffunc(a, b):
return "%1.0f"%10**a
colorbar(ticks=t, format=FuncFormatter(ffunc), label="Cantidad de desequilibrio")
Out[11]:
En la figura anterior se muestra el desequilibrio acumulado en cada posición. El color blanco indica que la candidatura se encuentra equilibrada en esa posición. En las posiciones impares el desequilibrio no puede ser nulo. El desequilibrio aumenta hasta un valor máximo de 12 en algunas candidaturas. En el puesto final (54) el desequilibrio máximo es de 10 como se mostró antes.
Por último, en la siguiente figura se muestra el desequilibrio en cierta posición sumando los candidatos de todas las candidaturas.
In [12]:
rcParams['figure.figsize'] = (6, 4)
genero.sum(axis=0).cumsum().plot()
title("Desiquilibrio acumulado (todas las candituras)")
ylabel("Desequilibrio")
xlabel(u"Número de candidato")
Out[12]:
In [ ]: