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

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Estableciendo relaciones: gráficos de puntos

16/28
Recursos

Aportes 34

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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'
)

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

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)
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)
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.
Relación entra el peso y la longitud de las aletas clasificado por las especies. * En el gráfico podemos observar como la especie Gentoo que en peso supera a las otras dos especies también lo los supera en el tamaño de su aleta esto nos hace concluir que estos pingüinos son los mas grandes de las especies. * La correlación positiva que existe entre las variables de peso y la longitud de la aleta. ![](https://static.platzi.com/media/user_upload/descarga%20%281%29-237216bc-6a51-4797-886c-5dcb62ba2d16.jpg) ```js sns.scatterplot(data=pre_penguins, x='flipper_length_mm', y='body_mass_g', s=100, hue = 'species', ).set_title('Relación entra el peso y la longitud de las aletas clasificado por las especies') ```Mirando solo la especie Gentoo una de las cosas que se observaron es que solo habitan en la isla Biscoe y encontré dos pingüinos que son los más gorditos del estudio, machos los dos. ```js data=pre_penguins.loc[pre_penguins.body_mass_g > 6000] data ```data=pre\_penguins.loc\[pre\_penguins.body\_mass\_g > 6000]data ![](https://static.platzi.com/media/user_upload/Sin%20t%C3%ADffdtulo-4408c7f6-6da5-4e16-8b37-fbe4db90818a.jpg) Son los puntos más arriba y alejados de la gráfica. ```js sns.scatterplot(data=pre_penguins.loc[pre_penguins.species == 'Gentoo'], x='bill_length_mm', y='body_mass_g', s=100, hue = 'sex', ).set_title('Relación entra el peso y la longitud del pico clasificado por el sexo') ```![](https://static.platzi.com/media/user_upload/XXXXXdescarga%20%282%29-d526921d-2582-46a8-8710-b5c914dec979.jpg)
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.