Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Diagramas de dispersión en el análisis de datos

13/25
Recursos

Aportes 57

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Mi parte del reto, cambiando las variables y gracias a la lectura de la documentación logré cambiar colores y tipos de gráficas. 😜✨🎪

En busca de poder visualizar las relaciones existentes entre los anchos y largos con los sépalos y pétalos, primero me puse a realizar las distintas conbinaciones una por una. Luego, leyendo la documentación de seaborn, encontré pairgridy pairplot y esto fue como recibir el vientito de la rosa de Guadalupe 😛

Para el ejercicio del barplot:

sns.barplot(x='species', y='sepal_length', data= iris )

Podemos comprobarlo con:

iris.groupby('species')['sepal_length'].mean()

Ahora, por ejemplo para graficar otro estimador, en vez del promedio, podemos hacer lo siguiente:

from numpy import mean,median, std

Para obtener la mediana:

iris.groupby('species')['sepal_length'].median()
sns.barplot(x='species', y='sepal_length', data=iris, estimator=median)

Ahora, la desviación estandar:

iris.groupby('species')['sepal_length'].std()
sns.barplot(x='species', y='sepal_length', data=iris, estimator=std)

Miren el joint de la base de datos Cars

reto

para el joinplot use el ancho del pétalo y sépalo, me parece muy completo este tipo de grafica

sns.jointplot(data=iris,x='sepal_width',y='petal_width',hue='species')

.
para el grafico de barras use el promedio de la longitud del sépalo, para calcular el promedio u otra de las métricas que hemos visto en clase se tiene que añadir el estimador en la función para hacerlo directamente sino tendríamos que agrupar y calcular el parámetro, yo use numpy para añadir directamente el estimador

from numpy import mean
sns.barplot(data=iris, x='species',y='sepal_length', estimator=mean, order=['virginica', 'versicolor','setosa'])

Para el reto intenté hacer un código que permitiera fácilmente cambiar las variables que se estaban analizando y a su vez que me permitiera ver la ecuación de regresión que se estaba dibujando.

Para este análisis tomé los datos de los pétalos. Más abajo les cuento el proceso para hacer la gráfica, lo que me pareció interesante es poder sacar algunas conclusiones preliminares, por ejemplo:

  • En la especie setosa la variación de tamaños de pétalo es muy pequeña a comparación de las otras especies.
  • En la especie versicolor es cuando, entre más largo el pétalo, más ancho este (la pendiente en la regresión es mayor)
  • La especie virginica, si bien es la que más grande tiene sus pétalos, también es la que tiene mayor dispersión de todas (ver los boxplot, donde se ve que la caja más grande es la de esta especie, tanto para largo y ancho del pétalo.
  • La especie setosa es la más consistente en el tamaño de sus pétalos (es la que menor dispersión tiene)
    .


.

.

.
)
.
Ahora sí, cómo fue el proceso de hacer las gráficas:

Lo primero que tuve que averiguar fue cómo dibujar las líneas de regresión diferentes para cada una de las especies. Así fue como llegué a lmplot. Según la documentación de seaborn esta gráfica sirve conviene cuando se desea ver las líneas de regresión de múltiples subconjuntos de datos al mismo tiempo.
.
Lo siguiente que quise hacer fue mostrar en la gráfica las ecuaciones de regresión. Lastimosamente seaborn no ofrece la funcionalidad built-in por lo que hay que hacer uso de otra librería para hacer estos cálculos. Esto, claramente, puede traer pequeñas discordancias entre la gráfica y la ecuación, pero para usar seaborn (que era la idea del reto) no había de otra. Lo mejor sería ver si alguna otra librería gráfica nos permite obtener este información al tiempo.
.
Buscando cómo hacer esto llegué a la librería Scipy. Esta tiene un método llamado linregress que nos devuelve la pendiente, el intercepto, y otros valores que se verán más adelante en el curso.
Con este método se logra sacar las ecuaciones y con un poco de documentación de seaborn encontré cómo poner una leyenda en la cual se puede mostrar la ecuación de cada línea de regresión.
.
El código es el siguiente:

from scipy import stats

var_y = 'petal_length'
var_x = 'petal_wiidth'

iris_setosa = iris[iris['species']=='setosa'] 
iris_versicolor = iris[iris['species']=='versicolor'] 
iris_virginica = iris[iris['species']=='virginica'] 

slope_setosa, intercept_setosa, r_value_setosa, p_value_setosa, std_err_setosa = stats.linregress(iris_setosa[var_x], iris_setosa[var_y])
slope_versicolor, intercept_versicolor, r_value_versicolor, p_value_versicolor, std_err_versicolor = stats.linregress(iris_versicolor[var_x], iris_versicolor[var_y])
slope_virginica, intercept_virginica, r_value_virginica, p_value_virginica, std_err_virginica = stats.linregress(iris_virginica[var_x], iris_virginica[var_y])

lm = sns.lmplot(x=var_x, y=var_y, data=iris, hue='species')

ax = lm.axes[0, 0]
ax.legend()
leg = ax.get_legend()
L_labels = leg.get_texts()

label_setosa = f'setosa={slope_setosa:.2f}x+{intercept_setosa:.2f}'
label_versicolor = f'versicolor={slope_versicolor:.2f}x+{intercept_versicolor:.2f}'
label_virginica = f'virginica={slope_virginica:.2f}x+{intercept_virginica:.2f}'
L_labels[0].set_text(label_setosa)
L_labels[1].set_text(label_versicolor)
L_labels[2].set_text(label_virginica)
  • Puse un par de variables para definir las columnas a usar.
  • Separé el dataset en diferentes datasets para tener la información de cada especie y poder hacer la regresión (habría que buscar si es posible hacerlo con el mismo dataset)
  • Usé el método linregress para hallar los valores de la ecuación de regresión de cada dataset por especie.
  • El gráfico con seaborn es lo más sencillo (gracias seaborn) donde solo se le dice las variables a tomar y el valor por el cual se quiere separar (hue)
  • Posteriormente hay que obtener la leyenda y el texto que esta tiene, para poderla modificar y añadir cada una de las ecuaciones de regresión.

Hay muchísimos tipos de gráficos a utilizar y algunos creo que solo añaden cosas innecesarias y dan más complejidad visual.
Creo que un buen científico de datos debe de saber crear gráficos sencillos pero impactantes y por eso les quiero recomendar el libro Storytelling with data
La autora tiene más de 10 años de experiencia usando gráficos y trabajando en negocios, así que podemos decir que es experta en este campo. De hecho ella menciona que es malo en la gran mayoría de los casos usar el tan famoso ‘pie chart’.
En fin, me parece un excelente libro y por eso se lo quería recomendar 😃

Reto
En la clase usamos el largo y ahora en el reto se usará el ancho

sns.jointplot(data=iris, x = 'sepal_width', y = 'petal_width', hue='species')

¡Hola! Comparto mis aportes de la clase. Hay muchos tipos de gráficas que podemos experimentar y con los que podemos jugar, ¡quedé impresionada! Estos son sólo dos de los que me encontré 😃

Seaborn tiene un repositorio online con datasets de ejemplo para practicar. Para ver la lista de estos datasets se puede usar este código.

import seaborn as sns
sns.get_dataset_names() 

Yo me puse a jugar con el dataset de pasajeros del Titanic, está bien interesante. No tiene muchas variables numéricas, pero seaborn tiene otro tipo de gráfico que es el countplot, que me sirvió para graficar conteos por variables categóricas, como conteo de superviventes por clase, por género, etc etc.

Siguiendo el reto, hice un scatterplot relacionando “petal_width” con “petal_length”. En este caso lo hice en blanco y negro, y para diferenciar las distintas especies usé marcadores.

El código es:

sns.scatterplot(data=iris, x="petal_width", y = "petal_length", style = "species", color="black")

Relacion entre ancho del sepal y la logintud del petalo

sns.jointplot(data=iris, x = 'petal_length', y = 'sepal_width',  kind='reg')

Les recomiendo complementar con el Curso de Principios de Visualización de Datos para Business Intelligence. Está muy bueno para saber qué visualización usar. 😃

Como primer ejercicio, únicamente generé el mismo gráfico de dispersión, pero enfrentando esta vez el ancho del pétalo y del sépalo. Por una parte, el ancho del sépalo mostraba la misma relación entre especies que el largo (las setosas las que lo tenías más grande, y las virgínicas las que lo tenías más pequeño. No obstante, el ancho del sépalo presenta la relación opuesta.

Para el barPlot, generé un diagrama de barras mostrando la relación entre la familia de las flores y el largo del sépalo, y subdividiéndolo en base al ancho del sépalo.

Mi aporte¡

Para el reto de la clase yo desarrollé tres ejemplos.

# scatterplot between petal length and petal width
sns.scatterplot(data= iris, x='petal_length', y='petal_width', style='species')
# A scatterplot for each species from sepal length to sepal width
sns.relplot(
    data = iris, x = 'sepal_length', y = 'sepal_width',
    col = 'species', kind = 'scatter', size='petal_length',
    sizes=(25, 150), hue = 'petal_length',
)
# A jointplot between sepal width and sepal length
sns.jointplot(data = iris, x = 'sepal_width', y = 'sepal_length', hue = 'species', kind = 'kde', palette = 'rocket')

También, encontré un gráfico de scatter que permite agregar un tamaño a los elementos. Comparto el ejemplo:

#relplot
sns.set_theme(style="whitegrid")
sns.set_palette('dark')
mpg = sns.load_dataset("mpg")
sns.relplot(
    data = df,
    x = 'petal_width',
    y = 'petal_length',
    hue = 'species',
    size = 'sepal_width',
    palette = 'colorblind',
    alpha = 0.5,
    sizes = (40,400)
    )

Mi aporte, métodos groupby , mean, plt.rcParams[‘figure, figsize’]=() y plt.plot.bar:

species= df.groupby(by=["species"]).mean()
plt.rcParams['figure.figsize']=(10,5)
species.plot.bar(stacked=True, title = 'Promedios de largo y ancho del pétalo y sépalo v/s tipo de flor',colormap = 'Set3')
plt.xlabel('Tipo de flor')
plt.ylabel('Promedios de largo y ancho')
plt.show()![1.png](https://static.platzi.com/media/user_upload/1-904c5115-e069-4421-9b2a-7c6763682fa7.jpg)

Reto
Relación entre el ancho y largo de los sepalos y petalos.

Se puede apreciar que el tamaño de los sepalos varia más que el tamaño de los petalos.

Reto cumplido, muy interesante hasta el momento.

Mediante el siguiente diagrama de relacion entre logiutd del petalo y ancho del sepal podemos observar que siguen una distribucion normal para los diferentes tipos de iris

sns.jointplot(data=iris, x = 'petal_length', y = 'sepal_width',  hue='species')

sns.barplot( data= iris , x=‘species’, y=‘sepal_length’)

Encontré otra muy buena que es el Catplot, te divide ya sea el de barras o scatter segun las filas o columnas que quieras, yo en este caso lo dividí por especie.

sns.catplot(data=iris, x='sepal_width', y='sepal_length', row='species', kind='bar', color='green', aspect=1.5, height=5)

Como parte del reto conseguí el data set de iris.csv. logre hacer todo el proceso desde cero ingresando los datos.

Muy interesante.

Para hacer el barplot de los promedios, el metodo que seguí fue:

  1. Obtener un array con las especies como llaves y el promedio el sepal_length como valores:
species_sepal = iris.groupby('species')['sepal_length'].mean()
  1. Crear un nuevo dataframe con los valores del array:
df_species_sepal = pd.DataFrame({"species": species_sepal.keys(), "sepal_length": species_sepal.values}) 
  1. Graficar con seaborn:
sns.barplot(x = 'species', y = 'sepal_length', data = df_species_sepal ) 

Nota: esto pudo ser más facil sin usar seaborn, pero es la manera que encontre para hacerlo si es que lo quieren usar.

Alternativa:

iris.groupby('species')['sepal_length'].mean().plot.bar()

Reto:

Me encantó el joint plot, es la primera vez que lo uso:

Conclusiones:

Hay una diferencia bastante marcada entre en largo y ancho del pétalo entre las especie. La distribución de la setosa es leptocútica, osea, tiene sus medidas son muy comunes entre si, en el caso de la versicolor su distribución es tiende un poco a ser mesocútica y parace un poco sesgada a la derecha eso podría indicar que también tiene muchas medidas comunes pero igual una gran parte son bastante altas, fuera de lo normal y por último la virginica, es justo al reves que la versicolor, solo que veo que tiende ser una distribución más platicúrtica.
.


.
En el caso de el largo y ancho del sepalo, la diferencia no es tanta. De hecho, vemos que la versicolor y la virginica comparten varios atributos en común, pero la setosa comparte muy pocos. Igual que las distribuciones anteriores estas tienen bastante curtosis y están algo sesgadas tanto a la derecha como a la izquierda.

Que interesante se ven los marginal_ticks=“True”:

aporte del reto:

![](

#2
![](url)

Si no se habían dado cuenta en el BARPLOT, cuando determinamos las variables “x” y “y” y una de esas variables es númerica y contiene varios valores, automaticamente barplot saca el promedio para determinar el valor que va a representar y esto lo corrobore haciendo un groupby de las especies y determinando su promedio y comparando el resultado del BARPLOT.

Reto:

Despues de hacer las combinaciones correspondientes y encontrar correlaciones y algunas que no existian.

Lo que mas me llamo la atencion es que para las Iris del tipo Versicolor y Virginica existe una correlacion positiva entre la anchura del sepalo y el largo del petalo pero para las Iris del tipo Setosa No existe una correlacion entre estos dos datos ya que la longitud del petalo se mantiene casi constante mientras que existe una variacion importante de anchura del sepalo

Dimensión de los datos!

Un tema importante es la dimensión de los datos (2d, 3d, planta, alzado), usualmente vemos los diagramas desde una perspectiva de alzado (imagen 01-02)

sns.displot(iris,x='sepal_length', hue="species",element="step")

![](

sns.displot(iris,x='sepal_length', hue="species",kind='kde',bw_adjust=2)

![](

pero al agregar dimensiones podemos hacer evaluaciones ahora en “planta” (imagen 03-04)

sns.displot(iris,x='sepal_length', y='petal_length',hue="species",kind='kde')

![](
![](

sns.displot(iris,x='sepal_length', y='petal_length',hue="species")

Este ejemplo nos hace comprender que las relaciones de los datos no solo son bidimensionales sino que, dependiendo la cantidad de variables, podemos manejar las dimensiones y así poder visualizar correlaciones que desde una sola perspectiva no podríamos.

Busqué un dataset de créditos hipotecarios. En el diagrama de dispersión vi la relación entre el ingreso y la cantidad del préstamo, separado por la categoría área.

Se puede observar que el grueso de los créditos solicitados están en los individuos que cobran menos de 20000.
Para el diagrama de caja, comparé el tipo de educación con la cantidad de ingresos.

Mi aporte:

Visualizar, usando PairGrid, cada relación en una matriz y en la diagonal el histograma por cada feature:

RETO

En mi construcción de la grafica de dispersión y en posterior análisis pude tener las siguientes observaciones:

Se puede proceder a realizar un análisis de carácter taxonómico en el genero de plantas Iris, en este caso de las especies setosa, versicolor y virginica, siendo esta ultima la que posee pétalos de flor de mayor tamaño respecto a las otras dos, y la setosa siendo la planta que posee un pétalo de flor muy pequeña a comparación de la versicolor y la virginica.

Con base en este análisis se concluye una notable diferencia entre la setosa y la virginica, con respecto al tamaño de sus respectivos pétalos de flor.

Mi reto

fucionando dos codigos, el de la clase pasada y esta sacando barras y cajas de ancho y especie.

Reto cumplido, seguiré revisando la documentación esta super interesante.

Les comparto mi ejercicio. Agrupe los datos por especie para obtener sus promedios y luego grafique en barras el comparativo para cada una de las especies, sus 4 variables:

df_agrupado = df.groupby('species').mean().reset_index().melt(id_vars = 'species' )

En R seria algo asi:
Sin librerias
plot(x=df$sepal_length, y=df$petal_length, col=df$Species)

Usando ggplot2

ggplot(df, aes(x=sepal_length, y=petal_length, fill=Species))+geom_point()

Reto
Relación entre el ancho y largo de los sepalos y petalos.


![4ED.png]

En mi caso decidí utilizar los datos de la longitud y el ancho de los pétalos porque así se puede visualizar cuales especies tienen los pétalos más grandes y cuales especies tienen los pétalos de menor tamaño.

sns.jointplot(data= iris, x= "petal_length", y= "petal_width", hue= "species")

Reto:

He explorado otras gráficas, y es sorprende lo que se puede mostrar con la librería de Seaborn 😃.

Análisis visual a sepal_width y petal_width


  • Scatter Plot
sns.scatterplot(data = iris, x = 'sepal_width', y = 'petal_width', hue = 'species', palette= 'plasma')
  • Join Plot
sns.set_theme()
sns.jointplot(data = iris, x = 'sepal_width', y = 'petal_width', hue = 'species', palette = 'plasma')
  • Box Plot
sns.boxplot(x = 'species', y = 'sepal_width', data = iris, palette= 'plasma')

Si deseamos saber los valores exactos, podriamos emplear groupby de la siguiente forma

iris.groupby('species')['sepal_width'].median()
species
setosa        3.4
versicolor    2.8
virginica     3.0
Name: sepal_width, dtype: float64
  • Bar Plot
sns.barplot(x = 'species', y = 'sepal_width', data = iris, palette= 'plasma')

Para saber el valor de la media para cada especie, podemos usar nuevamente groupby de la siguiente forma

iris.groupby('species')['sepal_width'].mean()
species
setosa        3.428
versicolor    2.770
virginica     2.974
Name: sepal_width, dtype: float64

Amo mucho esta visualización.

Aquí podemos ver que existe una clara correlación entre el largo y ancho del petalo, sin embargo, el sepalo no parece tener correlación alguna entre su largo y su ancho.
Nota: Quiero suponer que kind = ‘reg’ es por regresión, que es una técnica estadistica para pronostico de datos y que esta intimamente relacionada con el concepto de correlación.