Curso Python para Ciencia de datos
Por Jose R. Zapata - https://joserzapata.github.io/
NOTA: Realizar Primero los ejercicios y luego revisar las soluciones propuestas.
Para realizar los ejercicios prácticos de este capitulo, hacer click en el siguiente enlace que los llevara a Google Colab, donde podrán ejecutar el código y realizar los ejercicios propuestos.
Graficas con MATPLOTLIB
Siga las instrucciones para recrear los plots usando esta información:
Datos
import pandas as pd
# importar el dataset
pinguinos_df = pd.read_csv(
"https://github.com/mwaskom/seaborn-data/raw/master/penguins.csv"
)
# obtener los valores de la columna "body_mass_g"
masa_corporal = pinguinos_df["body_mass_g"].values
longitud_aleta = pinguinos_df["flipper_length_mm"].values
# verificar que es un array de numpy
type(masa_corporal)
numpy.ndarray
Importe matplotlib.pyplot
como plt
import matplotlib.pyplot as plt
- Grafica (y) en esos ejes y establece las etiquetas y títulos para que coincidan con el siguiente diagrama:
# CÓDIGO AQUÍ
plt.plot(masa_corporal)
plt.title("Masa corporal de los pinguinos")
plt.ylabel("Masa corporal (g)")
plt.show()
Use plt.subplots(nrows=1, ncols=2)
para crear la grafica siguiente
Tip: al final agregue plt.tight_layout()
para que no se superpongan las graficas
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
plt.subplot(1, 2, 1) # subplot fila=1 Col=2, grafica=1
plt.subplot(1, 2, 2) # subplot fila=1 Col=2, grafica=2
plt.tight_layout() # para que no se superpongan los graficos
Ahora grafique (masa_corporal) y (longitud_aleta) en los subplot. Juegue un poco con el ancho y el tipo de lineas.
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
plt.subplot(1, 2, 1) # subplot fila=1 Col=2, grafica=1
plt.plot(masa_corporal, "y.-")
plt.title("Masa corporal")
plt.ylabel("Masa corporal (g)")
plt.subplot(1, 2, 2) # subplot fila=1 Col=2, grafica=2
plt.plot(longitud_aleta, "g") # ; zpara no mostrar info de la función
plt.title("Longitud de la aleta")
plt.ylabel("Longitud de la aleta (mm)")
plt.tight_layout() # para que no se superpongan las graficas;
Vea si puede cambiar el tamaño de la gráfica agregando el argumento figsize()
en plt.subplots()
, Ademas cambie el tipo de linea para que coincida el tipo de las lineas.
copie, pegue y modifique su código anterior.
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1) # subplot fila=1 Col=2, grafica=1
plt.plot(masa_corporal, "b*-")
plt.title("Masa corporal")
plt.ylabel("Masa corporal (g)")
plt.subplot(1, 2, 2) # subplot fila=1 Col=2, grafica=2
plt.plot(longitud_aleta, "r:") # ; zpara no mostrar info de la función
plt.title("Longitud de la aleta")
plt.ylabel("Longitud de la aleta (mm)")
plt.tight_layout() # para que no se superpongan las graficas;
Graficas con PANDAS
Cuando se trabaja con datos y estan en un Dataframe, es mas facil usar las funciones de graficacion de Pandas.
Pero matplotlib sigue siendo util cuando se necesita mas control sobre la grafica.
Use los datos del dataframe pinguinos_df
para replicar las graficas siguientes:
# importe las librerias necesarias
import matplotlib.pyplot as plt
import pandas as pd
pinguinos_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 344 entries, 0 to 343
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 species 344 non-null object
1 island 344 non-null object
2 bill_length_mm 342 non-null float64
3 bill_depth_mm 342 non-null float64
4 flipper_length_mm 342 non-null float64
5 body_mass_g 342 non-null float64
6 sex 333 non-null object
dtypes: float64(4), object(3)
memory usage: 18.9+ KB
pinguinos_df.head()
species | island | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | sex | |
---|---|---|---|---|---|---|---|
0 | Adelie | Torgersen | 39.1 | 18.7 | 181.0 | 3750.0 | MALE |
1 | Adelie | Torgersen | 39.5 | 17.4 | 186.0 | 3800.0 | FEMALE |
2 | Adelie | Torgersen | 40.3 | 18.0 | 195.0 | 3250.0 | FEMALE |
3 | Adelie | Torgersen | NaN | NaN | NaN | NaN | NaN |
4 | Adelie | Torgersen | 36.7 | 19.3 | 193.0 | 3450.0 | FEMALE |
Recrear la gráfica de dispersión (scatter plot) de los valores bill_length_mm
vs bill_depth_mm
.
El color va depender de la variable flipper_length_mm
y el tamaño de los puntos se pondran de forma manual. También tenga en cuenta el tamaño de la figura. Vea si puede descubrir cómo estirarlo de una manera similar.
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df.plot.scatter(
x="bill_length_mm",
y="bill_depth_mm",
c="flipper_length_mm",
s=20,
title="Relación entre el largo y ancho del pico",
figsize=(12, 3),
);
Cree un histograma de los datos de la columna bill_length_mm
con 30 bins. Tengo en cuenta el titulo de la grafica
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df["bill_length_mm"].plot.hist(
bins=30,
title="Distribución del largo del pico",
);
Estos plots están bien, pero no se pueden cambiar el estilo. Utilice hojas de estilo para establecer el estilo en ‘ggplot’ y vuelva a hacer el histograma desde arriba con transparencia (alpha) de 0.5 y 50 bins.
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
plt.style.use("ggplot")
pinguinos_df["bill_length_mm"].plot.hist(
bins=50,
alpha=0.5,
title="Distribución del largo del pico",
);
Crear un boxplot comparando las columnas bill_length_mm
, bill_depth_mm
y flipper_length_mm
.
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]].plot.box();
Crear un plot kde de la columna ‘flipper_length_mm’
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df["flipper_length_mm"].plot.kde(
title="Distribución de la longitud de la aleta"
);
Identifique como cambiar el color de la linea, incrementar su ancho y como lograr que sea discontinua
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df["flipper_length_mm"].plot.kde(
lw=5, ls="--", color="b", title="Distribución de la longitud de la aleta"
);
Crear un area plot con las columnas ‘bill_length_mm’,‘bill_depth_mm’ y ‘flipper_length_mm’ con un alpha de 0.4
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
pinguinos_df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]].plot.area(
alpha=0.4
);
Graficas con Plotly
Con plotly se pueden crear graficas interactivas que permiten explorar los datos de forma mas detallada.
Los Datos
Trabajaremos con el famoso conjunto de datos del titanic ara hacer visualizaciones con seaborn
import pandas as pd
import plotly.express as px
titanic = pd.read_csv("https://github.com/mwaskom/seaborn-data/raw/master/titanic.csv")
titanic.head()
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | deck | embark_town | alive | alone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | NaN | Southampton | no | False |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | NaN | Southampton | yes | True |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | C | Southampton | yes | False |
4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | NaN | Southampton | no | True |
Recrear las siguientes graficas utilizando el dataframe de datos del titanic. Hay muy pocas pistas, ya que la mayoría de las graficas se pueden hacer con solo una o dos líneas de código y una pista básicamente daría la solución. Preste especial atención a las etiquetas de x
y y
para obtener sugerencias.
El fin principal es utilizar las visualizaciones para contestar preguntas y representar los datos
¡Nota! Para no perder la imagen de la respuesta, asegúrese de no escribir el código en la celda que está directamente arriba de la grafica
¿Existira alguna relacion entre la edad y el valor pagado por el tiquete?
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.scatter(titanic, x="fare", y="age", marginal_x="histogram", marginal_y="histogram")
¿Como fue la distribuccion del precio pagado por los tiquetes?
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.histogram(titanic, x="fare")
¿Como es la distribuccion de Cuartiles (Boxplot) de las edades de los pasajeros por Clase en que viaja?
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.box(titanic, y="age", x="class", color="class")
¿Como es la distribuccion (violin) de las edades de los pasajeros por Clase en que viaja?
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.violin(titanic, y="age", x="class", color="class")
¿Como es la distribuccion de Genero en los pasajeros?
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.histogram(titanic, "sex", color="sex")
¿Como son las correlaciones entre las variables (Heatmap)?
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
tic_corr = titanic.corr(numeric_only=True)
px.imshow(tic_corr, text_auto=True)
¿Como es la distribuccion de la Edad por Genero?
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.histogram(titanic, "age", facet_col="sex", color="sex")
¿Como es la distribuccion de la Edad por Genero y clase en la que viajan?
# CÓDIGO AQUÍ
# REPLICAR LA IMAGEN DEL CUADRO DE EJERCICIOS A CONTINUACIÓN
# TENGA CUIDADO DE NO SOBRESCRIBIR LA CELDA ABAJO
# ¡QUE QUITARÍA LA IMAGEN DEL EJERCICIO!
px.histogram(titanic, "age", facet_col="sex", facet_row="class", color="sex")
Phd. Jose R. Zapata