<jupyter_start><jupyter_text>MAT281 Aplicaciones de la Matemática en la Ingeniería  Módulo 03 Laboratorio Clase 02: Visualización Imperativa  Instrucciones* Completa tus datos personales (nombre y rol USM) en siguiente celda.* La escala es de 0 a 4 considerando solo valores enteros.* Debes _pushear_ tus cambios a tu repositorio personal del curso.* Como respaldo, debes enviar un archivo .zip con el siguiente formato `mXX_cYY_lab_apellido_nombre.zip` a <EMAIL>, debe contener todo lo necesario para que se ejecute correctamente cada celda, ya sea datos, imágenes, scripts, etc.* Se evaluará:    - Soluciones    - Código    - Que Binder esté bien configurado.    - Al presionar  `Kernel -> Restart Kernel and Run All Cells` deben ejecutarse todas las celdas sin error.* __La entrega es al final de esta clase.__ __Nombre__: <NAME>__Rol__: 201711049-K  Datos: _European Union lesbian, gay, bisexual and transgender survey (2012)_Link a los datos [aquí](https://www.kaggle.com/ruslankl/european-union-lgbt-survey-2012). ContextoLa FRA (Agencia de Derechos Fundamentales) realizó una encuesta en línea para identificar cómo las personas lesbianas, gays, bisexuales y transgénero (LGBT) que viven en la Unión Europea y Croacia experimentan el cumplimiento de sus derechos fundamentales. La evidencia producida por la encuesta apoyará el desarrollo de leyes y políticas más efectivas para combatir la discriminación, la violencia y el acoso, mejorando la igualdad de trato en toda la sociedad. La necesidad de una encuesta de este tipo en toda la UE se hizo evidente después de la publicación en 2009 del primer informe de la FRA sobre la homofobia y la discriminación por motivos de orientación sexual o identidad de género, que destacó la ausencia de datos comparables. La Comisión Europea solicitó a FRA que recopilara datos comparables en toda la UE sobre este tema. FRA organizó la recopilación de datos en forma de una encuesta en línea que abarca todos los Estados miembros de la UE y Croacia. Los encuestados eran personas mayores de 18 años, que se identifican como lesbianas, homosexuales, bisexuales o transgénero, de forma anónima. La encuesta se hizo disponible en línea, de abril a julio de 2012, en los 23 idiomas oficiales de la UE (excepto irlandés) más catalán, croata, luxemburgués, ruso y turco. En total, 93,079 personas LGBT completaron la encuesta. Los expertos internos de FRA diseñaron la encuesta que fue implementada por Gallup, uno de los líderes del mercado en encuestas a gran escala. Además, organizaciones de la sociedad civil como ILGA-Europa (Región Europea de la Asociación Internacional de Lesbianas, Gays, Bisexuales, Trans e Intersexuales) y Transgender Europe (TGEU) brindaron asesoramiento sobre cómo acercarse mejor a las personas LGBT.Puede encontrar más información sobre la metodología de la encuesta en el [__Informe técnico de la encuesta LGBT de la UE. Metodología, encuesta en línea, cuestionario y muestra__](https://fra.europa.eu/sites/default/files/eu-lgbt-survey-technical-report_en.pdf). ContenidoEl conjunto de datos consta de 5 archivos .csv que representan 5 bloques de preguntas: vida cotidiana, discriminación, violencia y acoso, conciencia de los derechos, preguntas específicas de personas transgénero.El esquema de todas las tablas es idéntico:* `CountryCode` - name of the country* `subset` - Lesbian, Gay, Bisexual women, Bisexual men or Transgender (for Transgender Specific Questions table the value is only Transgender)* `question_code` - unique code ID for the question* `question_label` - full question text* `answer` - answer given* `percentage`* `notes` - [0]: small sample size; [1]: NA due to small sample size; [2]: missing valueEn el laboratorio de hoy solo utilizaremos los relacionados a la vida cotidiana, disponibles en el archivo `LGBT_Survey_DailyLife.csv` dentro de la carpeta `data`.<jupyter_code>import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
daily_life_raw = pd.read_csv(os.path.join("data", "LGBT_Survey_DailyLife.csv"))
daily_life_raw.head()
daily_life_raw.info()
daily_life_raw.describe(include="all").T
questions = (
    daily_life_raw.loc[: , ["question_code", "question_label"]]
    .drop_duplicates()
    .set_index("question_code")
    .squeeze()
)
for idx, value in questions.items():
    print(f"Question code {idx}:\n\n{value}\n\n")<jupyter_output>Question code b1_a:

In your opinion, how widespread is offensive language about lesbian, gay, bisexual and/or transgender people by politicians in the country where you live?


Question code b1_b:

In your opinion, how widespread are casual jokes in everyday life about lesbian, gay, bisexual and/or transgender people in the country you live?


Question code b1_c:

In your opinion, how widespread are expressions of hatred and aversion towards lesbian, gay, bisexual and/or transgender in public in the country where you live?


Question code b1_d:

In your opinion, how widespread are assaults and harassment against lesbian, gay, bisexual and/or transgender people in the country where you live?


Question code b1_e:

In your opinion, how widespread is same-sex partners holding hands in public in the country where you live?


Question code b1_f:

In your opinion, how widespread is heterosexual partners holding hands in public in the country where you live?


Question code b1_g:

In your op[...]<jupyter_text>Preprocesamiento de datos ¿Te fijaste que la columna `percentage` no es numérica? Eso es por los registros con notes `[1]`, por lo que los eliminaremos.<jupyter_code>daily_life_raw.notes.unique()
daily_life = (
    daily_life_raw.query("notes != ' [1] '")
    .astype({"percentage": "int"})
    .drop(columns=["question_label", "notes"])
    .rename(columns={"CountryCode": "country"})
)
daily_life.head()<jupyter_output><empty_output><jupyter_text>Ejercicio 1  (1 pto)¿A qué tipo de dato (nominal, ordinal, discreto, continuo) corresponde cada columna del DataFrame `daily_life`? __Respuesta:__* `country`: nominal* `subset`:nominal* `question_code`:nominal* `answer`:nominal* `percentage`:discreto  Ejercicio 2  (1 pto)Crea un nuevo dataframe `df1` tal que sean solo registros de Bélgica, la pregunta con código `b1_b` y que hayan respondido _Very widespread_.Ahora, crea un gráfico de barras vertical con la función `bar` de `matplotlib`  para mostrar el porcentaje de respuestas por cada grupo. La figura debe ser de tamaño 10 x 6 y el color de las barras verde.<jupyter_code>print(f"Question b1_b:\n\n{questions['b1_b']}")
df1 = daily_life.query("country == 'Belgium' and question_code == 'b1_b'  and answer == 'Very widespread'")
df1.head()
x = df1['subset'].values
y = np.arange(len(x))
porcentajes = df1['percentage'].values

fig = plt.figure(figsize=(10, 6))

plt.bar(y, porcentajes, align='center', color="g", alpha=0.8)
plt.xticks(y, x)
plt.xlabel('Grupos')
plt.ylabel('Porcentajes')

plt.show()<jupyter_output><empty_output><jupyter_text>Ejercicio 3  (1 pto) Respecto a la pregunta con código `g5`, ¿Cuál es el porcentage promedio por cada valor de la respuesta (notar que la respuestas a las preguntas son numéricas)?<jupyter_code>print(f"Question g5:\n\n{questions['g5']}")<jupyter_output>Question g5:

All things considered, how satisfied would you say you are with your life these days? *<jupyter_text>Crea un DataFrame llamado `df2` tal que:1. Solo sean registros con la pregunta con código `g5`2. Cambia el tipo de la columna `answer` a `int`.3. Agrupa por país y respuesta y calcula el promedio a la columna porcentaje (usa `agg`).4. Resetea los índices.<jupyter_code>df2 = (
    daily_life.query("question_code == 'g5'")
    .astype({"answer": int})
    .groupby(["country", "answer"])
    .agg(percentage_prom=("percentage", "mean"))
    .reset_index()
)
df2<jupyter_output><empty_output><jupyter_text>Crea un DataFrame llamado `df2_mean` tal que:1. Agrupa `df2` por respuesta y calcula el promedio del porcentaje.2. Resetea los índices.<jupyter_code>df2_mean = df2.groupby(["answer"]).mean().reset_index()
df2_mean.head()<jupyter_output><empty_output><jupyter_text>Ahora, grafica lo siguiente:1. Una figura con dos columnas, tamaño de figura 15 x 12 y que compartan eje x y eje y. Usar `plt.subplots`.2. Para el primer _Axe_ (`ax1`), haz un _scatter plot_ tal que el eje x sea los valores de respuestas de `df2`, y el eye y corresponda a los porcentajes de `df2`. Recuerda que en este caso corresponde a promedios por país, por lo que habrán más de 10 puntos en el gráfico..3. Para el segundo _Axe_ (`ax2`), haz un gráfico de barras horizontal tal que el eje x sea los valores de respuestas de `df2_mean`, y el eye y corresponda a los porcentajes de `df2_mean`.<jupyter_code>x = df2[["answer"]].values
y = df2[["percentage_prom"]].values

x_mean = df2_mean.loc[:, "answer"]
y_mean = df2_mean.loc[:, "percentage_prom"]

#x_mean = df2_mean[["answer"]].values
#y_mean = df2_mean[["percentage_prom"]].values


fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(15, 12), sharex=True, sharey=True)

ax1.scatter(x, y)
ax1.grid(alpha=0.3)

ax2.barh(x_mean, y_mean)
ax2.grid(alpha=0.3)

fig.show()<jupyter_output>C:\Users\Tomas\Anaconda3\lib\site-packages\ipykernel_launcher.py:19: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.<jupyter_text>Ejercicio 4  (1 pto) Respecto a la misma pregunta `g5`, cómo se distribuyen los porcentajes en promedio para cada país - grupo?Utilizaremos el mapa de calor presentado en la clase, para ello es necesario procesar un poco los datos para conformar los elementos que se necesitan.Crea un DataFrame llamado `df3` tal que:1. Solo sean registros con la pregunta con código `g5`2. Cambia el tipo de la columna `answer` a `int`.3. Agrupa por país y subset, luego calcula el promedio a la columna porcentaje (usa `agg`).4. Resetea los índices.5. Pivotea tal que los índices sean los países, las columnas los grupos y los valores el promedio de porcentajes.6. Llena los valores nulos con cero. Usa `fillna`.<jupyter_code>from mpl_heatmap import heatmap, annotate_heatmap
df3 = (
    daily_life.query("question_code == 'g5'")
    .astype({"answer": int})
    .groupby(["country", "subset"])
    .agg(percentage_prom=("percentage", "mean"))
    .reset_index()
    .pivot(index='country', columns= 'subset', values= 'percentage_prom')
    .fillna(0)
)
df3.head()<jupyter_output><empty_output><jupyter_text>Finalmente, los ingredientes para el heat map son:<jupyter_code>countries = df3.index.tolist()
subsets = df3.columns.tolist()
answers = df3.values<jupyter_output><empty_output><jupyter_text>El mapa de calor debe ser de la siguiente manera:* Tamaño figura: 15 x 20* cmap = "YlGn"* cbarlabel = "Porcentaje promedio (%)"* Precición en las anotaciones: Flotante con dos decimales.<jupyter_code>fig, ax = plt.subplots(figsize=(15, 20))

im, cbar = heatmap(answers, countries, subsets, ax=ax,
                   cmap="YlGn", cbarlabel="Porcentaje promedio (%)")
texts = annotate_heatmap(im, valfmt="{x:.2f}")

fig.tight_layout()
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09123627856757244, 'fraction_numerical': 0.014936116609681483, 'mean_word_length': 5.272573363431151, 'pattern_counts': {'":': 4, '<': 40, '<?xml version=': 0, '>': 41, 'https://': 2, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '17326', 'license': 'MIT', 'n_tokens_mistral': 3902, 'n_tokens_neox': 3748, 'n_words': 1352, 'path': 'm03_data_visualization/m03_c02_lab_tapia_tomas/m03_c02_lab.ipynb', 'repo_name': 'tomastc/mat281_portafolio', 'size': '11143'}