Introducción al análisis exploratorio de datos

1

¿Qué es y para qué sirve el análisis exploratorio de datos?

2

¿Cómo hacer un análisis exploratorio de datos?

3

Tipos de análisis de datos

4

Tipos de datos y análisis de variables

5

Herramientas de software para el análisis exploratorio de datos

6

Conociendo nuestros datos: palmerpenguins

7

Recolección de datos, limpieza y validación

8

Ejercicio de validación de datos

Quiz: Introducción al análisis exploratorio de datos

Análisis univariado

9

Explorando una variable categórica: conteos y proporciones

10

Estadística descriptiva aplicada: medidas de tendencia central

11

Estadística descriptiva aplicada: medidas de dispersión

12

Ejercicio de obtención de medidas de dispersión

13

Estadística descriptiva aplicada: distribuciones

14

Estadística descriptiva aplicada: funciones de densidad de probabilidad

15

Bonus: Teorema del límite central

Quiz: Análisis univariado

Análisis bivariado

16

Estableciendo relaciones: gráficos de puntos

17

Estableciendo relaciones: gráficos de violín y boxplots

18

Estableciendo relaciones: matrices de correlación

19

Limitantes de los coeficientes de correlación lineal

20

Estableciendo relaciones: análisis de regresión simple

21

Limitaciones del análisis de regresión simple

Quiz: Análisis bivariado

Análisis multivariado

22

Análisis de regresión múltiple

23

Visualización del análisis de regresión múltiple

24

Análisis de regresión logística

25

Paradoja de Simpson

26

¿Qué hacer cuando tengo muchas variables?

Quiz: Análisis multivariado

Conclusiones

27

Diversidad de gráficas al explorar datos

28

Continúa aprendiendo sobre EDA

You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

0 Días
8 Hrs
8 Min
25 Seg

Estableciendo relaciones: gráficos de puntos

16/28
Resources

Contributions 36

Questions 2

Sort by:

Want to see more contributions, questions and answers from the community?

Podemos ver mejor el patron que existe en la primera grafica, (bill_depth_mm y bill_length_mm): segmentandolo por especie:

Estableciendo Relaciones: Graficos de puntos

Las relaciones entre dos variables puede analizarse mediante un grafico de puntos o scatterplot. Nos da una idea de la tendencia o agrupamiento de los datos. Algunas sugerencias para construir un scatterplot son:

  • Cuando hay muchos puntos en la grafica no se perciben de forma correcta. Puedes mejorar la visualizacion modificando la transparencia de los puntos con el parametro alpha. Un alpha de 1/30 implica que se necesitan 30 datos para que el punto sea totalmente del color negro.
  • Utilizar histogramas de dos dimensiones. Cuenta los valores que quedan dentro de un intervalo de la variable x y un intervalo de la variable ‘y’ y muestra la frecuencia utilizando una barra de colores.
  • Cambio de color de los puntos. Ayuda a visualizar las zonas donde se concentra la mayor cantidad de datos

Aquí podemos ver la relación entre la masa del pingüino y la longitud de las alas:

  • Los Gento tienen una mayor masa corporal y longitud de alas.
  • Podríamos inferir que la longitud del ala depende de la masa del pingüino.

Por otro lado. Las mismas variables pero esta vez con la isla:

  • En la isla Biscoe viendo la densidad y conociendo la longitud de ala por especie, podríamos decir que hay una mayor cantidad de especies de pingüinos que en las otras dos.

para comprobar esto decidí hacer un histplot:

  • Tiene mayor proporción de pingüinos y dos de cada especie. Sin embargo, la isla Dream también.
  • Al parecer la isla Torgensen es la única con una especie de pingüinos.

Código de los gráficos

  • Grafico de puntos
sns.scatterplot(
    data=dataFrame,
    x='nombre_variable1',
    y='nombre_variable2',
    alpha = 1/2, #transparencia
    s=100 #tamaño de los puntos
)
  • histograma 2D
sns.displot(
    data= preprocessed_penguins_df,
    x='bill_length_mm',
    y='bill_depth_mm',
    rug=True #muestra una linea de distribucion para cada variable
)
  • Grafico de contorno
sns.displot(
    data= preprocessed_penguins_df,
    x='bill_length_mm',
    y='bill_depth_mm',
    rug=True, #muestra una linea de distribucion para cada variable,
    kind='kde'
)
  • Mulltiples graficos
#multiples graficos
#scatterplot + histograma
sns.jointplot(
    data= preprocessed_penguins_df,
    x= 'bill_length_mm',
    y= 'bill_depth_mm',

)
fig1 = px.scatter(processed_penguins_df, 
                  x='bill_length_mm', 
                  y='bill_depth_mm',
                  hover_data=['sex'],
                  color='species',
                  color_discrete_map=penguin_color, 
                  marginal_x='box', 
                  marginal_y='box', 
                  opacity=0.5, 
                  trendline='ols')

fig1.update_traces(marker_size=12)

fig1.show()

Agregue un parametro stryle para hacer una diferencia entre sexo. Los machos estan “corridos” hacia la izquierda y arriba. Algo esperado, creo, porque en la mayoria de especies animales se da que los machos sean mas grandes que las hembras.

<code> 
sns.scatterplot(
    data = process_penguins_df,
    x = 'bill_length_mm',
    y = 'bill_depth_mm',
    style='sex',
    hue= 'species',
    palette=penguin_color,
    s = 100
)

Para que cada uno de estos gráficos se vea mejor pueden agregar dentro de cada uno de estos el parámetro
hu=“species” como en la figura que se muestra a contnuación:

Aqui nos muestra la relacion que existe entre body mass y flipper length, con una segmentacion por islas.

<h5>code</h5>
sns.jointplot(
    data= procesdf,
    x= 'body_mass_g',
    y= 'flipper_length_mm',
    hue= 'island',
    # rug= True
);

Estaba tratando de relacionar el body_mass_g con el sex de los pingüinos . Mi teoría es que los male tienen un body_mass_g mayor al de las female.
Estas son las gráficas que obtuve, aunque creo que hay mejores formas de hacer este tipo de gráficas.

sns.jointplot(
    data=process_penguins_df,
    x='body_mass_g',
    y='species',
    hue='sex'
)
sns.displot(
    data=process_penguins_df,
    x='body_mass_g',
    y='sex'
)
sns.jointplot(
    data=process_penguins_df,
    x='bill_length_mm',
    y='bill_depth_mm',
    hue='sex'
)
Para los nuevos que están experimentando errores con el parámetro `rug` es porque éste se removió del método `histplot()` de Seaborn. En su lugar, grafiquen por encima del histograma de la siguiente forma: `sns.histplot(    data= pg,    x= 'bill_length_mm',    y= 'bill_depth_mm')` `sns.rugplot(    data= pg,    x= 'bill_length_mm',    y= 'bill_depth_mm')` ![](https://static.platzi.com/media/user_upload/image-02294cd7-a42d-460d-91b0-9d751e63d9ff.jpg)

No habia entendido la utilidad del parametro alpha hasta ahora. Buena clase.

sns.scatterplot(
data=processed_penguins_df,
x=‘bill_length_mm’,
y=‘bill_depth_mm’,
alpha=1/2,
s=100
)

Para ver datos acumulados

sns.displot(
data=processed_penguins_df,
x=‘bill_length_mm’,
y=‘bill_depth_mm’,
rug=True,
kind=‘kde’ // para ver densidades
)

Combinacion de varios graficos

sns.jointplot(
data=processed_penguins_df,
x=‘bill_length_mm’,
y=‘bill_depth_mm’,

Prueben a todas las gráficas de esta clase agregar el siguiente parámetro:

hue='species'

Sin dudas que les va a dar una visión mucho más enriquecida.

Si primero dividimos por especie obtenemos grupos por pares de variables que nos hacen más faćil separar machos y hembras

![](https://static.platzi.com/media/user_upload/image-226e092c-c351-43f8-846b-eaab2a7fce54.jpg)
**DEEPNOTE:**  **GRÁFICO DE DISPERSIÓN ENTRE LARGO Y PROFUNDIDAD DEL PICO.** **Código:** sns.scatterplot(     data=processed\_penguins\_df,     x='bill\_length\_mm',     y='bill\_depth\_mm',     alpha=1/2,     s=100 ) **Descripción del resultado:** El gráfico muestra una nube de puntos que representa la relación entre el largo (bill\_length\_mm) y la profundidad (bill\_depth\_mm) del pico de los pingüinos. **GRÁFICO DE DISTRIBUCIÓN CON MARCAS MARGINALES.** **Código:** sns.displot(     data=processed\_penguins\_df,     x='bill\_length\_mm',     y='bill\_depth\_mm',     rug=True ) **Descripción del resultado:** El gráfico muestra una distribución bidimensional con bloques de intensidad y marcas marginales (rug) para indicar la densidad de los datos a lo largo de cada eje. **ESTIMACIÓN DE DENSIDAD KERNEL CON MARCAS MARGINALES.** **Código:** sns.displot(     data=processed\_penguins\_df,     x='bill\_length\_mm',     y='bill\_depth\_mm',     rug=True,     kind='kde' ) **Descripción del resultado:** El gráfico muestra contornos que representan la densidad estimada de los datos, junto con las marcas marginales en ambos ejes. **GRÁFICO CONJUNTO DE DISPERSIÓN CON HISTOGRAMAS MARGINALES.** **Código:** sns.jointplot(     data=processed\_penguins\_df,     x='bill\_length\_mm',     y='bill\_depth\_mm' ) **Descripción del resultado:** El gráfico incluye un gráfico de dispersión en el centro y distribuciones marginales (histogramas) en los bordes superior e izquierdo.
Les comparto este análisis que permite concluir que los pingüinos con aletas más largas, poseen claramente, más masa (g) y adémas estos pingüinos son machos; De las misma forma podemos conlcuir que las aletas mas cortas, asociadas a menor cantidad de masa, son característicos de pungüinos con sexo femenimo. ![](https://static.platzi.com/media/user_upload/image-49394d9a-e166-49a3-ba2f-20c563af9cd2.jpg) ```python figure = plt.figure(figsize=(10, 6)) sns.scatterplot( data=processed_penguins_df, x='flipper_length_mm', y='body_mass_g', hue='sex', palette=penguin_color ) ```figure = plt.figure(figsize=(10, 6))sns.scatterplot(    data=processed\_penguins\_df,    x='flipper\_length\_mm',    y='body\_mass\_g',    hue='sex',    palette=penguin\_color)
Yo realice la siguiente gráfica en Deepnote, está la realice con la clase plotly que te permite hacer gráficos interactivos. `import plotly.graph_objects as go# Elige un color (por ejemplo, azul)constant_color = '#1f77b4'` `fig = go.Figure(data=go.Splom(    dimensions=[        dict(label='bill_length_mm', values=processed_penguins_df['bill_length_mm']),        dict(label='bill_depth_mm', values=processed_penguins_df['bill_depth_mm']),        dict(label='flipper_length_mm', values=processed_penguins_df['flipper_length_mm']),        dict(label='body_mass_g', values=processed_penguins_df['body_mass_g'])    ],    marker=dict(color=constant_color, size=5, showscale=False, line_color='white', line_width=0.5)))` `fig.update_layout(title='Penguins dimensions', width=800, height=800, hovermode='closest')fig.show()` ![](https://static.platzi.com/media/user_upload/newplot-622a8ee1-0598-4683-831f-c6620a6c828b.jpg)
Algo a tener en cuenta respecto a la visualización de los scatterplots en seaborn es que los valores no están tan separados como parece * Es importante tener en cuenta los límites que se están utilizando para graficar el rango de valores. Aunque en este dataset específico puede no ser tan relevante, en otros casos una visualización podría sesgar nuestras hipótesis. *En la primera imagen, parece que hay una gran variabilidad en los valores graficados. Sin embargo, en la segunda imagen observamos que dicha variabilidad quizás no sea tan significativa cuando se consideran los límites completos del rango de datos* ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-06-18%20a%20la%28s%29%201.18.28%E2%80%AFp.m.-37993218-1e62-489f-89ee-1478f189696d.jpg)
Un poquito complejito esto pero quise quitar combinaciones innecesarias:cols = \['bill\_length\_mm', 'bill\_depth\_mm', 'flipper\_length\_mm', 'body\_mass\_g'] slots = \[]for i in range(2):    for j in range(3):        slots.append(\[i, j]) combinations = \[]for i in cols:    for j in cols:        if i == j:            continue        if {i, j} not in combinations:            combinations.append(\[i, j]) fig, ax = plt.subplots(2, 3, figsize= (15, 10)) for i in range(6):    sns.histplot(        ax= ax\[slots\[i]\[0], slots\[i]\[1]],        data= pg,        x= combinations\[i]\[0],        y= combinations\[i]\[1],        bins= 20,        hue= 'species',        palette= penguin\_color,        alpha= 0.75    )     sns.rugplot(        ax= ax\[slots\[i]\[0], slots\[i]\[1]],        data= pg,        x= combinations\[i]\[0],        y= combinations\[i]\[1],        hue= 'species',        palette= penguin\_color,    )     sns.kdeplot(        ax= ax\[slots\[i]\[0], slots\[i]\[1]],        data= pg,        x= combinations\[i]\[0],        y= combinations\[i]\[1],        hue= 'species',        palette= penguin\_color,        alpha= 0.50) ```js cols = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'] slots = [] for i in range(2): for j in range(3): slots.append([i, j]) combinations = [] for i in cols: for j in cols: if i == j: continue if {i, j} not in combinations: combinations.append([i, j]) fig, ax = plt.subplots(2, 3, figsize= (15, 10)) for i in range(6): sns.histplot( ax= ax[slots[i][0], slots[i][1]], data= pg, x= combinations[i][0], y= combinations[i][1], bins= 20, hue= 'species', palette= penguin_color, alpha= 0.75 ) sns.rugplot( ax= ax[slots[i][0], slots[i][1]], data= pg, x= combinations[i][0], y= combinations[i][1], hue= 'species', palette= penguin_color, ) sns.kdeplot( ax= ax[slots[i][0], slots[i][1]], data= pg, x= combinations[i][0], y= combinations[i][1], hue= 'species', palette= penguin_color, alpha= 0.50) ```![](https://static.platzi.com/media/user_upload/image-5ef70715-6805-4057-942b-a6fe195716df.jpg)
Les comparto un grafo general de las relaciones entre todas las variables ![](https://static.platzi.com/media/user_upload/image-70a9f12e-29bf-476c-aa3f-c2013e1524db.jpg) Con ella, podemos ver relaciones interesantes, como que la masa corporal de los pinguinos adelie y chinstrap son muy semejantes en multiples cosas, solo que los adelie son mas pesados, por ejemplo ```js sns.pairplot( data=penguins_df, hue='species', palette=penguin_color ); ```
sns.jointplot( data=processed\_penguins\_df, x='bill\_length\_mm', y='bill\_depth\_mm', hue='species', kind='kde' )

Análisis bivariado de dos variables cuantitativas

Análisis Bivariado

Dos Variables Cualitativas (Categóricas):

  • Utilización de una tabla de contingencia, expresada en frecuencia absoluta o relativa.
  • Representación visual mediante un gráfico de barras apilado.

Una Cuantitativa y Otra Cualitativa:

  • Realización de análisis univariado para cada categoría, incluyendo resúmenes numéricos por grupos.
  • Creación de histogramas, boxplots u otras representaciones gráficas de la variable cuantitativa para cada grupo de la variable cualitativa.

Dos Variables Cuantitativas Continuas:

  • Cálculo del índice de correlación para evaluar la relación entre ambas variables.
  • Representación visual mediante un diagrama de dispersión (scatter plot).
  • Incorporación de una recta de regresión para identificar tendencias o patrones.
sns.displot(data=processed_penguins_df, 
            x='bill_length_mm', 
            y='bill_depth_mm',
            rug=True,
            kind='kde',
            fill=True,
            palette='YlOrBr',
            hue='species')


Segun mi interpretacion la especie Adelie presenta una mayor profundidad del pico y en su mayoria un pico mas pequeno o corto, la especie gentoo presenta un pico mas largo pero menos profundo y la especie chinstrap es la que presenta una mayor simetria entre la profundidad y el largo de su pico, sin embargo hay una parte de esa poblacion que tiene una profundidad mayor, en conclusion si se busca simetria la especie chinstrap es la que mas se ajusta, si es por profundidad del pico la especie adelie es la correcta y si es por el largo del pico la especie gentoo es la adecuada.

Los pairplot sirven para los análisis exploratorios iniciales ya que se genera un subplot con varios scatterplots entre todas las variables numéricas del Dataframe, es útil cuando hay pocas

categorías numéricas.

sns.jointplot(
    data=processed_penguins_df,
    x="bill_length_mm",
    y="bill_depth_mm"
)
  • Los puntos donde el eje x representa el largo del pico y el eje y representa el peso del pingüino.
  • Cada punto en el gráfico representa un pingüino de la especie Adelia.
  • Podemos utilizar este gráfico para establecer si existe alguna relación entre el peso del pingüino y el largo de su pico en esta especie.
  • Si los puntos están agrupados o tienen alguna forma reconocible, podríamos inferir que hay alguna relación entre estas variables.
  • Si los puntos están dispersos por todo el gráfico, podríamos inferir que no hay relación entre ella

Se puede ver que en general la especie ‘Gentoo’ tiene una mayor longitud de pico y menor profundidad que las otras especies.
Pasa lo contrario con la especie ‘Adeline’.

sns.jointplot(
    data=processed_penguins_df,
    x='bill_length_mm',
    y='bill_depth_mm',
    hue = 'species'
    )

Segmentando por sexo se puede ver que en general los machos tienen mayor profundidad y longitud de pico que las hembras

sns.jointplot(
    data=processed_penguins_df,
    x='bill_length_mm',
    y='bill_depth_mm',
    hue = 'sex'
    )

sns.jointplot(
    data = preprocess_penguins_df,
    x= 'bill_length_mm',
    y= 'bill_depth_mm',
    kind = 'kde',
    palette=penguin_color,
    hue='species'
)
sns.jointplot(
    data=processed_penguins_df,
    x='flipper_length_mm',
    y='body_mass_g',
    hue='species'
)

En este grafico puedo validar que para todas las especies existe una tendencia lineal que a mayor longitud de aleta, mayor es el peso.
Y que las hembras suelen tener menor peso y longitud de aleta que los machos.


Separando lo pinguinos por especies se intulee por que esa forma en la grafica de dencidad general, es la agrupacion donde cada centro dencidad es de una especie de pinguino difrente.

Y agrego otro:

style='island'

La importancia de aprender a relacionar los datos entre sí y utilizar los diferentes tipos de gráficos para el análisis de datos.