Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ipynb - Colaboratory
Data:
es una data de registro de retrasos en las aerolineas
Los retrasos en la llegada de los vuelos están expresados en minutos y los valores negativos
significan que el vuelo se adelantó. Hay más de 300,000 vuelos con un retraso mínimo de -60
minutos y un retraso máximo de 120 minutos
La otra columna en el marco de datos es el nombre de la aerolínea que podemos usar para las
comparaciones.
1 import matplotlib.pyplot as plt
2 import seaborn as sns
3 import pandas as pd
4
1 # Read in data and examine first 10 rows
2 flights = pd.read_csv('https://media.githubusercontent.com/media/WillKoehrsen/
3 flights.set_index("Unnamed: 0", drop=True, inplace=True)
4 flights.head(10)
5
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&printM… 1/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
arr_delay name
Unnamed: 0
3
1
flights.shape
-18.0 JetBlue Airways
En nuestro caso, los contenedores serán un intervalo de tiempo que representa el retraso
de los vuelos y el conteo será el número de vuelos que caen en ese intervalo. El binwidth
es el parámetro más importante para un histograma y siempre debemos probar algunos
valores diferentes de binwidth para seleccionar el mejor para nuestros datos.
Para crear el hisograma, especificamos el ancho de bin por el número de bins. Para este gráfico,
usaré contenedores de 5 minutos de duración, lo que significa que la cantidad de contenedores
será el rango de los datos (de -60 a 120 minutos) dividido por el ancho del contenedor, 5
minutos ( bins = int(180/5)).
1
plt.rcParams["figure.figsize"] = (8, 5)
3
# matplotlib histogram
4
plt.hist(
5
x= flights['arr_delay'],
6
color= 'blue',
7
edgecolor= 'black',
8
bins= int(180/5)
9
)
10
11
# seaborn histogram
12
sns.distplot(
13
x= flights['arr_delay'],
14
hist= True,
15
kde= False,
16
bins= int(180/5),
17
color= 'blue',
18
hist_kws= {'edgecolor':'black'}
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&printM… 2/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
19
)
20
21
# Add labels
22
plt.title('Histograma de retrasos en la llegada de los aviones')
23
plt.xlabel('Retraso (min)')
24
plt.ylabel('Vuelos')
25
plt.show()
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2619: FutureW
warnings.warn(msg, FutureWarning)
1
plt.rcParams["figure.figsize"] = (20, 10)
3
# Show 4 different binwidths
5
for i, binwidth in enumerate([1, 5, 10, 15]):
6
# Set up the plot
7
ax = plt.subplot(2, 2, i + 1)
8
9
# Draw the plot
10
ax.hist(
11
x= flights['arr_delay'],
12
bins= int(180/binwidth),
13
color= 'blue',
14
edgecolor= 'black'
15
)
16
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&printM… 3/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
17
# Title and labels
18
ax.set_title('Histograma con Binwidth = %d' % binwidth, size = 30)
19
ax.set_xlabel('retraso (min)', size = 22)
20
ax.set_ylabel('vuelos', size= 22)
21
22
plt.tight_layout(5) #espacio entre grafico y grafico
23
plt.show()
24
La elección del ancho del contenedor afecta significativamente la gráfica resultante. Binwidths
más pequeños pueden hacer que la gráfica se desordene, pero binwidths más grandes pueden
oscurecer los matices de los datos. Matplotlib elegirá automáticamente un ancho de bin
razonable para usted, pero me gusta especificar el ancho de bin yo mismo después de probar
varios valores. No hay una respuesta verdadera correcta o incorrecta, así que pruebe algunas
opciones y vea cuál funciona mejor para sus datos particulares.
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&printM… 4/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
1
plt.rcParams["figure.figsize"] = (8, 5)
3
# Make a separate list for each airline
4
x1 = list(flights[flights['name'] == 'United Air Lines Inc.']['arr_delay'])
5
x2 = list(flights[flights['name'] == 'JetBlue Airways']['arr_delay'])
6
x3 = list(flights[flights['name'] == 'ExpressJet Airlines Inc.']['arr_delay'])
7
x4 = list(flights[flights['name'] == 'Delta Air Lines Inc.']['arr_delay'])
8
x5 = list(flights[flights['name'] == 'American Airlines Inc.']['arr_delay'])
10
# Assign colors for each airline and the names
11
colors = ['#E69F00', '#56B4E9', '#F0E442', '#009E73', '#D55E00']
12
names = ['United Air Lines Inc.', 'JetBlue Airways', 'ExpressJet Airlines Inc.
13
'Delta Air Lines Inc.', 'American Airlines Inc.']
14
15
# Make the histogram using a list of lists
16
# Normalize the flights and assign colors and names
17
18
plt.hist(
19
x= [x1, x2, x3, x4, x5],
20
density= True,
21
bins= int(180/15),
22
color= colors,
23
label= names
24
)
25
26
# Plot formatting
27
plt.legend()
28
plt.xlabel('Retraso (min)')
29
plt.ylabel('Vuelos Normalizados')
30
plt.title('Histograma uno al lado del otro con múltiples aerolíneas')
31
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&printM… 5/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
/usr/local/lib/python3.7/dist-packages/numpy/core/fromnumeric.py:3208: Visibl
return asarray(a).size
/usr/local/lib/python3.7/dist-packages/matplotlib/cbook/__init__.py:1376: Vis
X = np.atleast_1d(X.T if isinstance(X, np.ndarray) else np.asarray(X))
Text(0.5, 1.0, 'Histograma uno al lado del otro con múltiples aerolíneas')
De forma predeterminada, si pasamos una lista de listas, matplotlib colocará las barras
una al lado de la otra. Aquí, cambié el ancho del contenedor a 15 minutos porque, de lo
contrario, la trama estaría demasiado desordenada, pero incluso con esta modificación,
esta no es una cifra efectiva. Hay demasiada información para procesar a la vez, las
barras no se alinean con las etiquetas y aún es difícil comparar las distribuciones entre
aerolíneas.
Cuando hacemos una trama, queremos que sea lo más fácil de entender posible para el
espectador, ¡y esta figura falla según ese criterio!.
1
colors = ['#E69F00', '#56B4E9', '#F0E442', '#009E73', '#D55E00']
2
names = ['United Air Lines Inc.', 'JetBlue Airways', 'ExpressJet Airlines Inc.
3
'Delta Air Lines Inc.', 'American Airlines Inc.']
5
# Histograma apilado con varias aerolíneas
6
plt.hist(
7
x= [x1, x2, x3, x4, x5],
8
bins= int(180/15),
9
stacked=True,
10
density=True,
11
color=colors,
12
label=names
13
)
14
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&printM… 6/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
15
plt.show()
16
Bueno, ¡eso definitivamente no es mejor! Aquí, cada aerolínea se representa como una
sección del todo para cada contenedor, pero es casi imposible hacer comparaciones.
Por ejemplo, con un retraso de -15 a 0 minutos, ¿United Air Lines o JetBlue Airlines tienen
un tamaño de barra más grande? No puedo decirlo y los espectadores tampoco podrán
hacerlo. Por lo general, no soy partidario de las barras apiladas porque pueden ser difíciles
de interpretar ( aunque hay casos de uso , como cuando se visualizan proporciones).
El kernel que se usa con más frecuencia es un gaussiano (que produce una curva de
campana gaussiana en cada punto de datos).
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&printM… 7/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
en el grafico, cada pequeña línea vertical negra en el eje x representa un punto de datos. Los
núcleos individuales (Gaussianos en este ejemplo) se muestran dibujados en líneas
discontinuas rojas sobre cada punto. La curva azul sólida se crea sumando las gaussianas
individuales y forma el gráfico de densidad general.
En general, podemos pensar en el eje y en un gráfico de densidad como un valor solo para
comparaciones relativas entre diferentes categorías.
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&printM… 8/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
Para hacer diagramas de densidad en seaborn, podemos usar la función distplot o kdeplot.
Continuaré usando la distplotfunción porque nos permite hacer múltiples distribuciones con una
llamada de función. Por ejemplo, podemos hacer un gráfico de densidad que muestre todos los
retrasos de llegada encima del histograma correspondiente.
1
# Diagrama de densidad e histograma de todos los retrasos de llegada
2
sns.distplot(
3
x= flights['arr_delay'],
4
hist= True,
5
kde= True,
6
bins= int(180/5),
7
color= 'darkblue',
8
hist_kws= {'edgecolor':'black'},
9
kde_kws= {'linewidth': 4}
10
)
11
12
plt.show()
13
La curva muestra el gráfico de densidad que es esencialmente una versión suave del
histograma. El eje y está en términos de densidad y el histograma está normalizado de forma
predeterminada para que tenga la misma escala y que el gráfico de densidad.
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&printM… 9/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
ver si hay una mejor opción. En la trama, 'scott' es el predeterminado, que parece la mejor
opción.
Tenga en cuenta que un ancho de banda más amplio da como resultado una distribución más
uniforme. También vemos que aunque limitamos nuestros datos a -60 a 120 minutos, el gráfico
de densidad se extiende más allá de estos límites. Este es un problema potencial con una
gráfica de densidad: debido a que calcula una distribución en cada punto de datos, puede
generar datos que quedan fuera de los límites de los datos originales. ¡Esto podría significar que
terminamos con valores imposibles en el eje x que nunca estuvieron presentes en los datos
originales! Como nota, también podemos cambiar el núcleo, lo que cambia la distribución
dibujada en cada punto de datos y, por lo tanto, la distribución general. Sin embargo, para la
mayoría de las aplicaciones, el kernel predeterminado, Gaussian y la estimación del ancho de
banda predeterminado funcionan muy bien.
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&print… 10/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
Ahora que entendemos cómo se hace un diagrama de densidad y qué representa, veamos cómo
puede resolver nuestro problema de visualizar los retrasos en las llegadas de varias aerolíneas.
Para mostrar las distribuciones en el mismo gráfico, podemos iterar a través de las líneas
aéreas, llamando cada vez distplot con la estimación de la densidad del núcleo establecida en
Verdadero y el histograma establecido en Falso.
1
plt.rcParams["figure.figsize"] = (10, 7)
3
# List of five airlines to plot
5
airlines = ['United Air Lines Inc.', 'JetBlue Airways', 'ExpressJet Airlines I
6
'Delta Air Lines Inc.', 'American Airlines Inc.']
8
# Iterate through the five airlines
10
for airline in airlines:
11
# Subset to the airline
12
subset = flights[flights['name'] == airline]
13
14
# Draw the density plot
15
sns.distplot(
16
x= subset['arr_delay'],
17
hist= False,
18
kde= True,
19
kde_kws= {'linewidth': 3},
20
label= airline
21
)
22
23
# Plot formatting
24
plt.legend(prop={'size': 16}, title = 'Airline')
25
plt.title('Density Plot with Multiple Airlines')
26
plt.xlabel('Delay (min)')
27
plt.ylabel('Density')
28
29
plt.show()
30
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&print… 11/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2619: FutureW
warnings.warn(msg, FutureWarning)
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2619: FutureW
warnings.warn(msg, FutureWarning)
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2619: FutureW
warnings.warn(msg, FutureWarning)
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2619: FutureW
warnings.warn(msg, FutureWarning)
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2619: FutureW
warnings.warn(msg, FutureWarning)
¡Finalmente, hemos llegado a una solución efectiva! Con el diagrama de densidad, podemos
hacer comparaciones fácilmente entre aerolíneas porque el diagrama está menos abarrotado.
Ahora que finalmente tenemos el gráfico que queremos, ¡llegamos a la conclusión de que todas
estas aerolíneas tienen distribuciones de demoras de llegada casi idénticas! Sin embargo, hay
otras aerolíneas en el conjunto de datos y podemos trazar una que sea un poco diferente para
ilustrar otro parámetro opcional para los gráficos de densidad, como el sombreando.
1
plt.rcParams["figure.figsize"] = (10, 7)
3
# List of five airlines to plot
5
airlines = ['United Air Lines Inc.', 'Alaska Airlines Inc.']
7
# Iterate through the five airlines
9
for airline in airlines:
10
# Subset to the airline
11
subset = flights[flights['name'] == airline]
12
13
# Draw the density plot
14
sns.distplot(
15
x= subset['arr_delay'],
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&print… 12/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
16
hist= False,
17
kde= True,
18
kde_kws= {'shade': True, 'linewidth': 3},
19
label= airline
20
)
21
22
# Plot formatting
23
plt.legend(prop={'size': 16}, title = 'Aerolinea')
24
plt.title('Gráfico sombreado de densidad del Retraso de llegada')
25
plt.xlabel('Retraso (min)')
26
plt.ylabel('Densidad')
27
28
plt.show()
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2619: FutureW
warnings.warn(msg, FutureWarning)
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2619: FutureW
warnings.warn(msg, FutureWarning)
Si sombrear o no el gráfico es, al igual que otras opciones de trazado, una cuestión que depende
del problema. Para este gráfico, creo que tiene sentido porque el sombreado nos ayuda a
distinguir las parcelas en las regiones donde se superponen. Ahora, finalmente tenemos
información útil: los vuelos de Alaska Airlines tienden a ser más tempranos que los de United
Airlines. La próxima vez que tenga la opción, ¡ya sabrá qué aerolínea elegir!.
Parcelas de alfombras
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&print… 13/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
Si desea mostrar todos los valores de una distribución y no solo la densidad suavizada, puede
agregar un diagrama de alfombra. Esto muestra cada punto de datos en el eje x, lo que nos
permite visualizar todos los valores reales. El beneficio de usar Seaborn distplot que podemos
agregar el gráfico de alfombra con una sola llamada de parámetro rug=True.
1
# Subset to Alaska Airlines
2
subset = flights[flights['name'] == 'Alaska Airlines Inc.']
4
# Density Plot with Rug Plot
5
sns.distplot(
6
x= subset['arr_delay'],
7
hist= False,
8
kde= True,
9
rug= True,
10
color= 'darkblue',
11
kde_kws= {'linewidth': 3},
12
rug_kws= {'color': 'black'}
13
)
14
15
# Plot formatting
16
plt.title('Gráfico de densidad con gráfico de alfombra para Alaska Airlines')
17
plt.xlabel('Retraso (min)')
18
plt.ylabel('Densidad')
19
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&print… 14/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2619: FutureW
warnings.warn(msg, FutureWarning)
/usr/local/lib/python3.7/dist-packages/seaborn/distributions.py:2103: FutureW
warnings.warn(msg, FutureWarning)
Con muchos puntos de datos, el diagrama de alfombra puede sobrecargarse, pero para algunos
Text(0, 0.5, 'Densidad')
conjuntos de datos, puede ser útil ver cada punto de datos. El gráfico de alfombras también nos
permite ver cómo el gráfico de densidad "crea" datos donde no existen porque hace una
distribución kernel en cada punto de datos. Estas distribuciones pueden filtrarse en el rango de
los datos originales y dar la impresión de que Alaska Airlines tiene demoras que son más cortas
y más largas de lo que realmente se registró. ¡Debemos tener cuidado con este artefacto de
gráficos de densidad y señalarlo a los espectadores!.
Conclusiones
Hay aún más gráficas univariadas (variable única) que podemos hacer, como gráficas empíricas
de densidad acumulada y gráficas de cuantil-cuantil, pero por ahora lo dejaremos en
histogramas y gráficos de densidad (¡y también en gráficos de alfombras!). No se preocupe si
las opciones parecen abrumadoras: con la práctica, será más fácil tomar una buena decisión y
siempre podrá pedir ayuda si la necesita. Además, a menudo no hay una opción óptima y la
decisión "correcta" se reducirá a la preferencia y los objetivos de la visualización. Lo bueno es
que no importa qué trama quieras hacer, ¡habrá una manera de hacerlo en Python! Las
visualizaciones son un medio eficaz para comunicar resultados, y conocer todas las opciones
disponibles nos permite elegir la cifra adecuada para nuestros datos.
1
! python3 --version
Python 3.7.15
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&print… 15/16
29/10/22, 17:16 HISTOGRAMA Y DENSIDAD.ipynb - Colaboratory
https://colab.research.google.com/drive/1I25NtL0VX06v7ovFXWjgUYnavLvecIdm#scrollTo=jdL1_PfmdKn3&uniqifier=1&print… 16/16