Autor: Luis Fernando Apáez Álvarez
-Curso PyM-
Clase 6: Uniones (parte I)
Fecha: 11 de diciembre del 2022
En esta clase veremos cómo realizar distintas uniones entre dataframes, pero antes de ello indagaremos un poco en diagramas de Venn para entender de manera visual lo que ocurre detrás de esas uniones.
Un diagrama de Venn es una representación que sirve para visualizar conjuntos y operaciones entre ellos.
A los conjuntos matemáticos se les suele denotar por llaves, por ejemplo podemos considerar el conjunto matemático $A=\{1,2,3\}$ o $B=\{3,4,5\}$. Cabe mencionar que dentro de un conjunto matemático no se admiten elementos repetidos, es decir, los siguientes conjuntos son iguales:
$$ \{1,2,3,3,3,2,1\} =\{1,2,3\} $$Además, dentro de un conjunto no hay un orden como tal, es decir, si consideramos de nuevo el conjunto $A=\{1,2,3\}$, no podemos decir que el $1$ sea el primer elemento del conjunto $A$ o que el $3$ es el tercer elemento del conjunto $A$. Por ende, también podemos decir que los siguientes conjuntos son iguales:
$$ \{3,2,1\} =\{1,2,3\}=\{2,1,3\}=\{2,3,1\} $$La idea de conjunto matemático es análoga a la de conjunto, o set, dentro de Python. Recordemos que podemos definir un set como:
# podemos definir dos sets en python
A = {1,2,3}
B = {3,4,5}
print(A)
print(type(B))
{1, 2, 3} <class 'set'>
# vemos que no puede haber elementos repetidos
print({1,2,3,3,2,1})
{1, 2, 3}
Consideremos los conjuntos
$$ A=\{a,b,c,1,2\}, \ \ \ \ \ B=\{c,d,e,2,3\} $$Tendremos que la operación de unión ($\cup$) entre dos conjuntos consiste en juntar todos los elementos de los conjuntos involucrados en un solo conjunto. Por ejemplo:
$$ A\cup B=\{a,b,c,1,2,c,d,e,2,3\}=\{a,b,c,d,e,1,2,3\} $$Así, a lo hecho anteriormente podremos representarlo visualmente mediante diagramas de Venn. Antes de hacerlo veamos como graficar con Python diagramas de Venn. Para ello
# importaciones necesarias
import matplotlib.pyplot as plt
# Antes de realizar esta importacion seria necesario
# instalar primero la libreria:
# !pip install matplotlib_venn
from matplotlib_venn import venn2
Ahora bien, con la función venn2
podemos graficar dos círculos que representan dos conjuntos:
# Graficamos dos conjuntos, donde cada
# circulo representa un conjunto
venn2((1,1,1))
plt.show()
donde vemos que se les ha asignado una etiqueta (A y B) por default a cada conjunto, además
la tupla (1,1,1)
representa la proporción entre las tres partes diagrama anterior. Por ejemplo, podemos hacer que el conjunto B sea el doble que el A:
venn2((1,2,1))
plt.show()
# o podemos hacer que el conjunto A sea el doble que
# el B
venn2((2,1,1))
plt.show()
# o podemos hacer que la parte de enmedio sea el doble
# que el resto
venn2((1,1,2))
plt.show()
Podemos cambiar los colores de los conjuntos A y B:
# cambiamos los colores de los conjuntos con
# set_colors()
# A B
venn2((1,1,1), set_colors=('blue', 'red'))
plt.show()
O podemos cambiar la etiqueta que se muestra de cada conjunto. Por ejemplo, cambiemos las etiquetas A y B por X y Y:
# Cambiamos las etiquetas
venn2((1,1,1),
# A B
set_labels=('X', 'Y'),
# Cambiamos los colores
set_colors=('yellow', 'purple'),
# con alpha= configuramos el
# nivel de transparencia
alpha=0.2)
plt.show()
# Probamos con un alpha mas grande
venn2((1,1,1),
# A B
set_labels=('X', 'Y'),
# Cambiamos los colores
set_colors=('yellow', 'purple'),
# con alpha= configuramos el
# nivel de transparencia
alpha=0.8)
plt.show()
Ahora bien, del diagrama anterior podemos considerar 3 partes:
Así, podemos acceder a cada una de las partes anteriores con la función get_label_by_id()
y colocar etiquetas visibles, así como los unos que vemos en el diagrama anterior. Por ejemplo:
# definimos un diagrama de venn
venn1 = venn2((1,1,1))
# accedemos a la parte de la izquierda y
# colocamos un texto con la funcion set_text()
# como sigue
venn1.get_label_by_id('10').set_text('Left')
# definimos un diagrama de venn
venn1 = venn2((1,1,1))
# colocamos ahora un texto en el centro y a la
# derecha
venn1.get_label_by_id('11').set_text('Center')
venn1.get_label_by_id('01').set_text('Right')
Podemos adicionalmente cambiar el color del texto colocado, por ejemplo, podemos cambiar el color de la palabra center
:
# definimos un diagrama de venn
venn1 = venn2((1,1,1))
# colocamos un texto en el centro y cambiamos
# su color
venn1.get_label_by_id('11').set_text('Center')
venn1.get_label_by_id('11').set_color('blue')
Asimismo, con la función get_patch_by_id()
podemos acceder directamente a cada una de las partes del diagrama anterior. Por ejemplo, podemos cambiar el color de la parte de enmedio:
# definimos un diagrama de venn
venn1 = venn2((1,1,1))
# colocamos el color de la parte de enmedio
venn1.get_patch_by_id('11').set_color('blue')
Ahora bien, recordemos que consideramos la unión de conjuntos
$$ A\cup B=\{a,b,c,1,2,c,d,e,2,3\}=\{a,b,c,d,e,1,2,3\} $$y lo que queremos ahora es representar dicha unión de manera gráfica, para ello:
# definimos un diagrama de venn
venn1 = venn2((1,1,1))
# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('blue')
venn1.get_patch_by_id('01').set_color('blue')
# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('')
venn1.get_label_by_id('11').set_text('')
venn1.get_label_by_id('01').set_text('')
plt.title('Representación de $A\cup B$')
plt.show()
Tenemos enconces que al considerar los conjuntos A y B como dos círculos, la unión de dichos conjuntos está representado como toda la parte sombreada del diagrama anterior, es decir, la unión de los conjuntos constan de la unión de los dos círculos.
Otra manera de representación podría ser:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
# A B
set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))
# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('blue')
venn1.get_patch_by_id('01').set_color('blue')
# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('a, b, 1')
venn1.get_label_by_id('11').set_text('c, 2')
venn1.get_label_by_id('01').set_text('d, e, 3')
plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()
Lo cual nos brinda mayor información. Notemos que en el diagrama hemos colocado los elementos de al siguiente manera:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
# A B
set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))
# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('red')
venn1.get_patch_by_id('11').set_color('blue')
venn1.get_patch_by_id('01').set_color('blue')
# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('a, b, 1')
venn1.get_label_by_id('11').set_text('c, 2')
venn1.get_label_by_id('01').set_text('d, e, 3')
plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()
donde $A=\{$ a,b $,c, $ 1, $2\}$, luego, los elementos c y 2 son elementos también del conjunto A, pero dichos elementos están además en el conjunto B, es decir, los elementos c y 2 son elementos de los conjuntos A y B de manera simultánea, por ende dichos elementos son colocados en la parte de enmedio
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
# A B
set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))
# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('red')
venn1.get_patch_by_id('01').set_color('blue')
# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('a, b, 1')
venn1.get_label_by_id('11').set_text('c, 2')
venn1.get_label_by_id('01').set_text('d, e, 3')
plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
# A B
set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))
# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('blue')
venn1.get_patch_by_id('01').set_color('red')
# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('a, b, 1')
venn1.get_label_by_id('11').set_text('c, 2')
venn1.get_label_by_id('01').set_text('d, e, 3')
plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()
En resumen podemos decir que:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
# A B
set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))
# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('red')
venn1.get_patch_by_id('11').set_color('red')
venn1.get_patch_by_id('01').set_color('blue')
# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('')
venn1.get_label_by_id('11').set_text('')
venn1.get_label_by_id('01').set_text('')
plt.title('En rojo representamos al\n conjunto $A$')
plt.show()
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
# A B
set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))
# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('blue')
venn1.get_patch_by_id('11').set_color('red')
venn1.get_patch_by_id('01').set_color('red')
# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('')
venn1.get_label_by_id('11').set_text('')
venn1.get_label_by_id('01').set_text('')
plt.title('En rojo representamos al\n conjunto $B$')
plt.show()
y finalmente:
# definimos un diagrama de venn
venn1 = venn2((1,1,1),
# A B
set_labels=('$A=\{a,b,c,1,2\}$', '$B=\{c,d,e,2,3\}$'))
# configuramos un mismo color para las tres partes
venn1.get_patch_by_id('10').set_color('red')
venn1.get_patch_by_id('11').set_color('yellow')
venn1.get_patch_by_id('01').set_color('blue')
# Para quitar los unos que se ven por defecto
# colocamos como etiquetas cadenas vacias
venn1.get_label_by_id('10').set_text('Solo elementos\n del conjunto\n $A$')
venn1.get_label_by_id('11').set_text('\n\nElementos \ncompartidos')
venn1.get_label_by_id('01').set_text('Solo elementos\n del conjunto\n $B$')
plt.title('$A\cup B=\{a,b,c,d,e,1,2,3\}$')
plt.show()
La parte de enmedio del diagrama anterior corresponde a la intersección ($\cap$) entre los conjuntos A y B, es decir, $A\cap B$ son los elementos que están de manera simultánea en el conjunto A y en el B. De tal manera $A\cap B=\{c,2\}$.
Luego, podemos realizar varios diagramas de Venn en una misma figura
# La siguiente linea de codigo sera explicada en clases posteriores:
fig, (ax0, ax1) = plt.subplots(nrows=1, ncols=2, figsize=(12,6))
# diagrama 1
# pasamos al parametro ax= el valor de ax0 que hace referencia al primer
# grafico
v1 = venn2((1,1,1), set_labels=('$A_{1}$', '$B_{1}$'), alpha=0.6, ax=ax0)
# diagrama 2
# pasamos al parametro ax= el valor de ax1 que hace referencia al segundo
# grafico
v2 = venn2((1,1,1), set_labels=('$A_{2}$', '$B_{2}$'), alpha=0.6, ax=ax1)
# Colores diagrama 1
v1.get_patch_by_id('10').set_color('#6B73C2')
v1.get_patch_by_id('11').set_color('#002AB4')
v1.get_patch_by_id('01').set_color('#051AFB')
# Colores diagrama 2
v2.get_patch_by_id('10').set_color('#A3A09F')
v2.get_patch_by_id('11').set_color('#696868')
v2.get_patch_by_id('01').set_color('#000000')
# Titulos:
# diagrama 1
ax0.set(title='Diagrama 1')
# diagrama 2
ax1.set(title='Diagrama 2')
plt.show()
donde además, de nrows=1, ncols=2, figsize=(12,6)
tenemos que la figura global abarcará una fila de gráficos y dos columnas, es decir, en una misma línea del gráfico podremos colocar dos subgráficos. Luego, figsize
nos permite especificar el largo (12) y el ancho (6) de la figura global o general.
Existen otro tipo de operaciones entre conjuntos, los cuales omitiremos. Por otro lado, podemos realizar la unión e intersección entre sets de Python. Recordemos que tenemos definidos dos sets:
print(A)
print(B)
{1, 2, 3} {3, 4, 5}
Luego, sabemos que $A\cup B=\{1,2,3,4,5\}$. Podemos obtener la unión entre dos sets con el método union()
aplicado como sigue:
# representamos A union B
A.union(B)
{1, 2, 3, 4, 5}
Sabemos que la intersección es $A\cap B=\{3\}$:
# representamos A interseccion B
A.intersection(B)
{3}
En esta sección veremos las distintas maneras de unir dataframes, lo cual puede ser muy útil en distintos contextos, por ejemplo, puede ser que la información con la cual estamos trabajando se encuentra dividida en varias tablas o dataframes, por lo cual será necesario unir dos o más tablas para nuestro análisis.
Para ello construiremos los siguientes dataframes:
# Utilizaremos la libreria pandas y faker
import pandas as pd
import numpy as np
from faker import Faker
# Instanciamos
fake = Faker()
# Creamos valores para asignar ids
ID = [i for i in range(1, 1001)]
# creamos 1000 nombres
nombres = [fake.name() + ' ' + fake.last_name() for i in range(1000)]
# 1000 correos electronicos
correos = [fake.email() for i in range(1000)]
# 1000 edades
edades = [fake.random_int(18, 80) for i in range(1000)]
# Creamos un diccionario con la info anterior
dict_info = {'ID': ID, 'Nombre': nombres, 'Edad': edades, 'Correo': correos}
# Creamos el dataframe
df_empleados = pd.DataFrame(dict_info)
df_empleados.head()
ID | Nombre | Edad | Correo | |
---|---|---|---|---|
0 | 1 | Mark Good Ortiz | 72 | ronnie80@example.com |
1 | 2 | Sabrina Coleman DVM Reed | 41 | deckerkimberly@example.org |
2 | 3 | Courtney Romero Lewis | 48 | robert40@example.net |
3 | 4 | Pamela Owens Zamora | 20 | bishopdarlene@example.org |
4 | 5 | Allison Garrett Davis | 52 | dunlapmaria@example.org |
donde cada empleado tiene asignado un único ID, es decir, podemos identificar perfectamente a cada empleado con su ID asignado.
# 1000 salarios
salarios = [np.random.rand() * 10000 for i in range(1000)]
# Creamos un diccionario con el salario y el ID
dict_info = {'ID': ID, 'Salario': salarios}
# Creamos el dataframe
df_salario = pd.DataFrame(dict_info)
df_salario.head()
ID | Salario | |
---|---|---|
0 | 1 | 1911.779807 |
1 | 2 | 1884.304140 |
2 | 3 | 3923.263730 |
3 | 4 | 6673.917776 |
4 | 5 | 9902.819926 |
Cabe mencionar que para poder unir dos dataframes es necesario que éstos estén relacionados, al menos, por una columna. Es por ello que hemos definidos los dos dataframes anteriores y hemos colocado en ambos la misma columna ID
. Luego, para fines ilustrativos, supongamos que han ingresado a la compañia dos nuevos empleados
# Libreria para no ver las advertencias en la salida
import warnings
warnings.filterwarnings('ignore')
# Empleados nuevos
emp1 = {'ID': 1001, 'Nombre': 'Diana Smith', 'Edad': 27, 'Correo': 'diana27182@edu.com'}
emp2 = {'ID': 1002, 'Nombre': 'Luka Ldresh', 'Edad': 20, 'Correo': 'lukaecdf@gmail.com'}
# Los agregamos al dataframe
df_empleados = df_empleados.append(emp1, ignore_index=True)
df_empleados = df_empleados.append(emp2, ignore_index=True)
df_empleados.tail()
ID | Nombre | Edad | Correo | |
---|---|---|---|---|
997 | 998 | Amber Anderson Roberts | 54 | whuerta@example.org |
998 | 999 | Diane Daniels King | 39 | ncalderon@example.com |
999 | 1000 | Corey Taylor Turner | 53 | fowlerrichard@example.org |
1000 | 1001 | Diana Smith | 27 | diana27182@edu.com |
1001 | 1002 | Luka Ldresh | 20 | lukaecdf@gmail.com |
Pero aún no se ha actualizado la información de sus salarios en el dataframe df_salarios
, de donde el dataframe df_empleados
tiene dos elementos más que df_salarios
.
Podemos considerar a los dataframes que definimos antes como dos conjuntos. De tal manera, la intersección entre esos dos conjuntos (dataframes) se conoce como unión interna, o inner join. Gráficamente:
# ahora configuramos 3 subgraficos
fig, (ax0, ax1, ax2) = plt.subplots(nrows=1, ncols=3, figsize=(14,6))
# diagrama 1
v1 = venn2((1,1,1), set_labels=('', ''), alpha=0.6, ax=ax0)
# diagrama 2
v2 = venn2((1,1,1), set_labels=('', ''), alpha=0.6, ax=ax1)
# diagrama 3
v3 = venn2((1,1,1), set_labels=('', ''), alpha=0.6, ax=ax2)
# Colores diagrama 1
v1.get_patch_by_id('10').set_color('red')
v1.get_patch_by_id('11').set_color('red')
v1.get_patch_by_id('01').set_color('#FF7F05')
# Colores diagrama 2
v2.get_patch_by_id('10').set_color('#FF7F05')
v2.get_patch_by_id('11').set_color('red')
v2.get_patch_by_id('01').set_color('red')
# Colores diagrama 2
v3.get_patch_by_id('10').set_color('#FF7F05')
v3.get_patch_by_id('11').set_color('red')
v3.get_patch_by_id('01').set_color('#FF7F05')
# quitamos las etiquetas:
v1.get_label_by_id('10').set_text('')
v1.get_label_by_id('11').set_text('')
v1.get_label_by_id('01').set_text('')
v2.get_label_by_id('10').set_text('')
v2.get_label_by_id('11').set_text('')
v2.get_label_by_id('01').set_text('')
v3.get_label_by_id('10').set_text('')
v3.get_label_by_id('11').set_text('')
v3.get_label_by_id('01').set_text('')
# Titulos:
# diagrama 1
ax0.set(title='En rojo: df_empleados')
# diagrama 2
ax1.set(title='En rojo: df_salarios')
# diagrama 2
ax2.set(title='En rojo: unión interna')
plt.show()
# mas concisamente
# tamanio (largo por ancho) del grafico
plt.figure(figsize=(8,6))
# diagrama
v = venn2((1,1,1), set_labels=('df_empleados', 'df_salarios'), alpha=0.8)
# Colores
v.get_patch_by_id('10').set_color('#DCDCDC')
v.get_patch_by_id('11').set_color('#696868')
v.get_patch_by_id('01').set_color('#000000')
# Etiquetas
v.get_label_by_id('10').set_text('')
v.get_label_by_id('11').set_text('Intersección\no\nUnión interna')
v.get_label_by_id('01').set_text('')
plt.title('Unión interna', size=18)
plt.show()
Recordemos que para realizar una unióno intersección entre dos sets de python escribíamos, por ejemplo, A.union(B)
o A.intersection(B)
. Luego, podemos realizar una unión interna entre dos dataframes con la función merge()
de la forma:
dataframe1.merge(dataframe2, on=)
donde colocaremos en on=
el nombre de la columna que relaciona a dichos dataframes. Para nuestro ejemplo tenemos:
# realizamos la union interna
df_union_interna = df_empleados.merge(df_salario, on='ID')
# veamos
df_union_interna.head()
ID | Nombre | Edad | Correo | Salario | |
---|---|---|---|---|---|
0 | 1 | Mark Good Ortiz | 72 | ronnie80@example.com | 1911.779807 |
1 | 2 | Sabrina Coleman DVM Reed | 41 | deckerkimberly@example.org | 1884.304140 |
2 | 3 | Courtney Romero Lewis | 48 | robert40@example.net | 3923.263730 |
3 | 4 | Pamela Owens Zamora | 20 | bishopdarlene@example.org | 6673.917776 |
4 | 5 | Allison Garrett Davis | 52 | dunlapmaria@example.org | 9902.819926 |
conseguimos con lo anterior tener en un mismo dataframe la información básica de los empleados junto con su salario. Nota que no se colocaron dos columna ID
pues, dado que en ambos dataframes tenemos dicha columna, bastará con colocar una sola.
Recordemos que en df_empleados
tenemos dos empleados cuyo ID no aparece en el dataframe df_salario
display(df_empleados.tail(2))
display(df_salario.tail(2))
ID | Nombre | Edad | Correo | |
---|---|---|---|---|
1000 | 1001 | Diana Smith | 27 | diana27182@edu.com |
1001 | 1002 | Luka Ldresh | 20 | lukaecdf@gmail.com |
ID | Salario | |
---|---|---|
998 | 999 | 5733.948481 |
999 | 1000 | 2278.080933 |
# o podemos ver si hay algun ID en el dataframe df_salario
# que sea igual a 1001 o 1002
df_salario[df_salario['ID'].isin([1001, 1002])]
ID | Salario |
---|
Así, dado que la unión interna no es más que la intersección entre los dataframes (vistos como conjuntos), entonces los dos empleados nuevos que agregamos al dataframe df_empleados
no son contemplados en el dataframe resultante de la unión interna. En efecto:
df_union_interna[df_union_interna['ID'].isin([1001, 1002])]
ID | Nombre | Edad | Correo | Salario |
---|
df_union_interna.tail()
ID | Nombre | Edad | Correo | Salario | |
---|---|---|---|---|---|
995 | 996 | Stephanie Ortega Garcia | 25 | salazarchase@example.org | 5194.657376 |
996 | 997 | Sara Baker Foster | 19 | ewhite@example.net | 9925.582227 |
997 | 998 | Amber Anderson Roberts | 54 | whuerta@example.org | 6042.569715 |
998 | 999 | Diane Daniels King | 39 | ncalderon@example.com | 5733.948481 |
999 | 1000 | Corey Taylor Turner | 53 | fowlerrichard@example.org | 2278.080933 |
df_union_interna.ID.max()
1000
Gráficamente podría verse como:
# mas concisamente
# tamanio (largo por ancho) del grafico
plt.figure(figsize=(8,6))
# diagrama
v = venn2((1,1,1), set_labels=('df_empleados', 'df_salarios'), alpha=0.8)
# Colores
v.get_patch_by_id('10').set_color('#DCDCDC')
v.get_patch_by_id('11').set_color('#FF0202')
v.get_patch_by_id('01').set_color('#797979')
# Etiquetas
v.get_label_by_id('10').set_text("ID's:\n 1001 y 1002")
v.get_label_by_id('11').set_text("ID's:\n del 1 al 1000")
v.get_label_by_id('01').set_text("No hay ID's que estén\nexclusivamente\n en df_salarios")
plt.title('Unión interna', size=18)
plt.show()