Género y tecnología: ¿qué eligen los estudiantes?

# módulos propios
import sys
sys.path.insert(0, '/viz-carreras-nexjournal/scripts')

import mapas, pygal_helpers
from pygal_helpers import df_to_pygal_line, get_pygal_html
from helpers import format_pct, get_bins

# dependencias externas
import pandas as pd
import folium
from IPython.display import HTML, display

Evolución de género en carreras de tecnología

df_evolucion_carreras = pd.read_csv('/viz-carreras-nexjournal/data/output/grupos_evolucion_genero.csv')
df_evolucion_grupos_carreras = pd.read_csv('/viz-carreras-nexjournal/data/output/grupos_carreras_evolucion_genero.csv')

¿Cómo evolucionó la proporción de estudiantes femeninos en carreras de tecnología?

def generate_chart_evolucion_grupos(carrera_grupo, indicador):
    """Genera gráfico % de est. femeninos por grupo."""
    
    serie_grupo_carrera = df_evolucion_carreras[
        df_evolucion_carreras.carrera_grupo.isin(carrera_grupo)][[
            "anio", 'carrera_grupo',  indicador]]

    serie_grupo_carrera[indicador]=serie_grupo_carrera[indicador].apply(format_pct)
    
    df_pivot_serie_grupo_carrera = serie_grupo_carrera.pivot_table(
        index='anio', columns='carrera_grupo', values=indicador)
    
    return HTML(get_pygal_html(df_to_pygal_line(df_pivot_serie_grupo_carrera)))
generate_chart_evolucion_grupos(["Tecnologia"], "estudiantes_mujeres_pct")

¿Hay algunos títulos en particular que expliquen mejor esta tendencia negativa?

def generate_chart_evolucion_titulos(carrera_grupo):
    """Evolucion % est. femeninos de titulos de uno o varios grupos."""
    
    serie_grupo_carrera = df_evolucion_grupos_carreras[
        df_evolucion_grupos_carreras.carrera_grupo.isin(carrera_grupo)][[
        "anio", 'carrera_nombre',  "estudiantes_mujeres_pct"]]
    df_pivot_serie_grupo_carrera = serie_grupo_carrera.pivot_table(
        index='anio', columns='carrera_nombre', values='estudiantes_mujeres_pct')
    
    return HTML(get_pygal_html(df_to_pygal_line(df_pivot_serie_grupo_carrera)))
        
generate_chart_evolucion_titulos(["Tecnologia"])

Comparación de género por provincias y universidades

df_universidades = pd.read_csv('viz-carreras-nexjournal/data/output/universidades_mapa.csv')
df_evolucion_ubicacion = pd.read_csv('viz-carreras-nexjournal/data/output/ubicacion_evolucion_genero.csv', 
                                     dtype={'provincia_id': str})

# corrige identificadores de provincias, que deben tener 2 digitos
df_evolucion_ubicacion['provincia_id'] = df_evolucion_ubicacion.provincia_id.str.zfill(2)
# todos los mapas van a estar centrados ahí
argentina_coords = [-35, -64]

# usa la capa de OSM sin etiquetas
osm_no_labels = "https://tiles.wmflabs.org/osm-no-labels/{z}/{x}/{y}.png"

# usa las etiquetas oficiales del IGN para Argentina
ign_labels = "http://wms.ign.gob.ar/geoserver/gwc/service/tms/1.0.0/capabaseargenmap@EPSG%3A3857@png/{z}/{x}/{y}.png"

Indicadores por provincia

¿Cuál es la provincia con mayor proporción de mujeres en tecnología?

INDICADORES_HEATMAP = {
    "estudiantes_mujeres_pct" : "Ratio de estudiantes mujeres",
    "estudiantes_grupo_pct" : "Ratio de estudiantes",
    "estudiantes_varones" : "Total de estudiantes hombres"
}

def generate_heat_map(anio, carrera_grupo, indicador, scale_type=None):
    """Genera mapa de calor de indicadores de género o tecnología por provincia, para un año y grupo de carreras determinado. Permite elegir la metodología de la escala."""
    
    mapa_heatmap = folium.Map(location=argentina_coords, zoom_start=4)
    folium.TileLayer(ign_labels, tms=True, attr="IGN").add_to(mapa_heatmap)
    
    df_filter = df_evolucion_ubicacion[(df_evolucion_ubicacion.anio == anio)&
                           (df_evolucion_ubicacion.carrera_grupo == carrera_grupo)]
    
    if scale_type == 'Cuantiles':
        bins = list(df_filter[indicador].quantile([0, 0.2, 0.4, 0.6, 0.8, 1]))
    elif scale_type == 'Fija':
        bins = get_bins(df_evolucion_ubicacion[indicador].min(), df_evolucion_ubicacion[indicador].max())
    else:
        bins = 5
       
    indicador_desc = INDICADORES_HEATMAP[indicador]
    folium.Choropleth(
        geo_data="viz-carreras-nexjournal/data/input/provincias.geojson", # la capa de provincias en GeoJson
        data=df_filter, # DataFrame con los datos a graficar
        columns=['provincia_id', indicador], # columna con id de geometrías, columna con el dato
        key_on='feature.properties.id', # campo del geojson que tiene el id de las geometrías
        fill_color='YlGn', # escala de colores a usar
        #fill_opacity=0.7, # opacidad del color de relleno
        #line_opacity=0.2, # opacidad de las líneas que separan los polígonos
        legend_name='{} en {} (Año {})'.format(indicador_desc, carrera_grupo, anio), # título de la leyenda de la escala
        bins=bins
    ).add_to(mapa_heatmap)
    #mapas.add_labels_from_column(mapa_heatmap,df_evolucion_ubicacion,"nombre")

    return mapa_heatmap
heatmap1 = generate_heat_map(2016, "Tecnologia", "estudiantes_mujeres_pct", "Relativa")
heatmap1.save("heatmap1.html")
HTML("heatmap1.html")

¿Cuál es la provincia con mayor proporción de estudiantes en carreras de tecnología?

heatmap2 = generate_heat_map(2016, "Tecnologia", "estudiantes_grupo_pct", "Relativa")
heatmap2.save("heatmap2.html")
HTML("heatmap2.html")

¿Cuál es la provincia con mayor proporción de mujeres en tecnología (versión con universidades)?

def mapear_universidades(mapa, df, lat_col, lon_col, institucion_nombre_col, carreras_grupos_col):
    """ cargar informacion al marker de forma masiva.

        Args:
            lat (float): latitud
            lon (float): longuitud
            institucion_nombre (str): nombre de la universidad
            carreras_grupos (list): lista con las areas de estudios ofrecidas

        """
    
    for row in df_universidades.iterrows():
        mapas.crear_marker(
            mapa,
            row[1]["lat"],
            row[1]["lon"],
            row[1]["institucion_nombre"],
            str(row[1]["carrera_grupo"]).split(",")
        )
def generate_heat_map_with_markers(anio, carrera_grupo, indicador, scale_type=None):
    mapa_heatmap = folium.Map(location=argentina_coords, zoom_start=4)
    folium.TileLayer(ign_labels, tms=True, attr="IGN").add_to(mapa_heatmap)
    
    df_filter = df_evolucion_ubicacion[(df_evolucion_ubicacion.anio == anio)&
                           (df_evolucion_ubicacion.carrera_grupo == carrera_grupo)]
    
    if scale_type == 'Cuantiles':
        bins = list(df_filter[indicador].quantile([0, 0.2, 0.4, 0.6, 0.8, 1]))
    elif scale_type == 'Fija':
        bins = get_bins(df_evolucion_ubicacion[indicador].min(), df_evolucion_ubicacion[indicador].max())
    else:
        bins = 5
       
    indicador_desc = INDICADORES_HEATMAP[indicador]
    folium.Choropleth(
        geo_data="viz-carreras-nexjournal/data/input/provincias.geojson", # la capa de provincias en GeoJson
        data=df_filter, # DataFrame con los datos a graficar
        columns=['provincia_id', indicador], # columna con id de geometrías, columna con el dato
        key_on='feature.properties.id', # campo del geojson que tiene el id de las geometrías
        fill_color='YlGn', # escala de colores a usar
        #fill_opacity=0.7, # opacidad del color de relleno
        #line_opacity=0.2, # opacidad de las líneas que separan los polígonos
        legend_name='{} en {} (Año {})'.format(indicador_desc, carrera_grupo, anio), # título de la leyenda de la escala
        bins=bins
    ).add_to(mapa_heatmap)
    #mapas.add_labels_from_column(mapa_heatmap,df_evolucion_ubicacion,"nombre")
    
    # agrega markers de universidades al mapa
    mapear_universidades(
        mapa_heatmap, df_universidades, 
        "lat","lon","institucion_nombre","carrera_grupo"
    )

    return mapa_heatmap
heatmap3 = generate_heat_map_with_markers(2016, "Tecnologia", "estudiantes_mujeres_pct", "Relativa")
heatmap3.save("heatmap3.html")
HTML("heatmap3.html")

¿Cuál es la provincia con mayor proporción de estudiantes en carreras de tecnología? (versión con universidades)

heatmap4 = generate_heat_map_with_markers(2016, "Tecnologia", "estudiantes_grupo_pct", "Relativa")
heatmap4.save("heatmap4.html")
HTML("heatmap4.html")