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

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

11 Días
22 Hrs
35 Min
50 Seg

Estableciendo relaciones: análisis de regresión simple

20/28
Recursos

Aportes 29

Preguntas 7

Ordenar por:

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

Aquí dejo la correlación si se pudiera ver por especie, revelando que la tendencia es positiva en todas las especies de pingüino.

sns.lmplot(
    data=processed_penguins_df,
    x='bill_length_mm',
    y='bill_depth_mm',
    height=10,
    hue='species'
)
sns.scatterplot(x=x1, y=y1)

fx1 = np.array([x1.min(), x1.max()])
fy1 = r1.intercept + r1.slope * fx1

plt.plot(fx1, fy1)


sns.scatterplot(x=x2, y=y2)

fx2 = np.array([x2.min(), x2.max()])
fy2 = r2.intercept + r2.slope * fx2

plt.plot(fx2, fy2)

plt.legend(["1", "1","2","2"])

sns.scatterplot(preprocessed, x="bill_length_mm", y="bill_depth_mm")

res_penguins = scipy.stats.linregress(x=preprocessed.bill_length_mm, y=preprocessed.bill_depth_mm)

print(res_penguins)

fx1 = np.array([preprocessed.bill_length_mm.min(), preprocessed.bill_length_mm.max()])
fy1 = res_penguins.intercept + res_penguins.slope * fx1

plt.plot(fx1,fy1) 
  • slope: representa la pendiente de la línea de regresión. Indica cuánto cambia la variable dependiente por unidad de cambio en la variable independiente. En este caso, un aumento de una unidad en la longitud del pico se asocia con un aumento de 0.0119 en la masa del pingüino.
  • intercept: representa el valor de la variable dependiente cuando la variable independiente es igual a cero. En este caso, el intercepto indica la masa del pingüino cuando la longitud del pico es cero, lo que no tiene mucho sentido en términos prácticos.
  • rvalue: representa el coeficiente de correlación entre las dos variables. Indica cuánto se ajustan los datos a la línea de regresión. El valor de rvalue oscila entre -1 y 1, y un valor cercano a 1 indica una correlación positiva fuerte entre las variables. En este caso, el valor de rvalue es 0.6416, lo que indica una correlación moderadamente fuerte entre la longitud del pico y la masa del pingüino.
  • pvalue: representa el valor p asociado a la hipótesis nula de que no hay relación entre las dos variables. Un valor p pequeño (generalmente < 0.05) indica que la hipótesis nula puede ser rechazada y que hay evidencia suficiente para decir que existe una relación significativa entre las variables. En este caso, el valor de pvalue es 3.7481e-09, que es muy pequeño y sugiere que hay una relación significativa entre la longitud del pico y la masa del pingüino.
  • stderr y intercept_stderr: representan el error estándar de la pendiente y el intercepto, respectivamente. Indican cuánto varía la pendiente y el intercepto en diferentes muestras de datos. En este caso, valores más pequeños indican que el ajuste del modelo es más preciso y confiable.

Analisis de Regresion Simple

Permite medir la fuerza del efecto en los datos mediante el ajuste de una linea recta. Es mucho mas efectivo para interpretar el comportamiento de los datos.

  • Regression Lineal con scipy
res_1 = scipy.stats.linregress(x=x1, y=y1)
res_2 = scipy.stats.linregress(x=x2, y=y2)

print(res_1, res_2, sep='\n')
  • Esto arroja parametros como el slope el cual indica la pendiente de la recta (A mayor slope, mayor el efecto de la variable x sobre la variable y), intercep que indica el punto donde la linea corta el eje ‘y’ y el rvalue que nos indica la proporcion de datos capturados lo que ayuda en una mejor descripcion de los datos.
  • Ejemplo donde se realiza de manera manual la regresion lineal con scipy.
#grafica de la longitud en funcion del ancho del pico
sns.scatterplot(
    data=preprocessed_penguins_df,
    x='bill_length_mm',
    y='bill_depth_mm'
)

#calculo de la regresion lineal
res_penguins = scipy.stats.linregress(
    x=preprocessed_penguins_df.bill_length_mm,
    y=preprocessed_penguins_df.bill_depth_mm
)

print(res_penguins)

#grafico de la linea utilizando los parametros dados por la regresion
fx_1 = np.array([preprocessed_penguins_df.bill_length_mm.min(), preprocessed_penguins_df.bill_length_mm.max()])
fy_1 = res_penguins.intercept + res_penguins.slope*fx_1

plt.plot(fx_1, fy_1)
  • Regresion lineal con Seaborn. No da detallles sobre los datos estadisticos como scipy. Genera una zona de tendencia donde los datos de un modelo tienen mayor probabilidad de caer.
sns.lmplot(
    data=preprocessed_penguins_df,
    x='bill_length_mm',
    y='bill_depth_mm'
)

Ese factor que nos está faltando al momento de hacer la gráfica es la segmentación por los distintos tipos de pingüinos.

A pesar de que lo que dice el profe es cierto, el resultado 2 tiene mayor impacto en Y (variable dependiente), esto tampoco quiere decir que sea mejor para predecir o incluir en un modelo ya que solo te habla del impacto, si se fijan en el rvalue que es la metrica que te dice cuanto la regresion (la recta que ajustamos a los datos) capta la variabilidad de los datos es menor con respecto al resultado 1, esto quiere decir que un valor de X usando la variable de mayor impacto puede tener muchos valores en Y y terminar solapandose con otros valores de X que tambien tienen ese valor de Y.
Lo cual para un modelo no es bueno al momento de predecir.

esto me estanco por que no me salia el grafico de la pendiente ?

SOLUCION :
manejar los valores en blanco

  • como ?
df_penguis=(
    df_penguis
    .dropna()
)

Con Seaborn la vida es mucho más feliz. Acá el motivo:

sns.lmplot(
    data=neo_pre_df_peng,
    x='bill_length_mm',
    y='bill_depth_mm',
    hue='species',
    height=10
    )

plt.show()

sns.scatterplot(
x=x1,
y=y1
)
fx_1=np.array([x1.min(), x1.max()])
fy_1=res_1.intercept + res_1.slope * fx_1

plt.plot(fx_1, fy_1)

sns.scatterplot(
x=x2,
y=y2
)
fx_2=np.array([x2.min(), x2.max()])
fy_2=res_2.intercept + res_2.slope * fx_2

plt.plot(fx_2, fy_2)

plt.legend(labels=[“1”,“2”, “1”,“2”])

Slope es la pendiente o inclinación de la recta. Entre mayor sea la pendiente, mayor es el cambio en Y si cambia X.

Recuerden la ecuación de la recta: y = mx + b

m = slope
b = intercept

💡 Slope = Pendiente

sns.lmplot(
    data=processed_penguins_df,
    x='bill_length_mm',
    y='bill_depth_mm',
    hue='species',
    aspect=3/2
)

Hice mi análisis de correlación entre body_mass y flipper_length. Este fue el resultado:


Los separé por su respectiva especie y poder entender mejor cómo se comportabanlos datos.

Según los resultados Chinstrap es la especie con más correlación.

Adelie slope=0.006610
Gento slope=0.009340
Chinstrap slope=0.011905

Pero hay algo que no termino de comprender, se supone que entre más cercano a 1, más correlacionados están. Pero en los 3 casos, estos se acercan más a 0. Pero cómo se muestra en la gráfica, en los 3 casos hay una relación evidente.

¿Qué puede estar pasando allí? Alguien me podría explicar?

sns.FacetGrid(
    processed_penguins_df,
    col= 'species',
    hue = 'species'
    ).map(sns.regplot,
        'body_mass_g',
        'flipper_length_mm',
        scatter_kws={'alpha':0.3}
        )

adelie = processed_penguins_df[processed_penguins_df['species'] == 'Adelie']
gentoo = processed_penguins_df[processed_penguins_df['species'] == 'Gentoo']
chinstrap = processed_penguins_df[processed_penguins_df['species'] == 'Chinstrap']

ade = scipy.stats.linregress(x = adelie['body_mass_g'], y = adelie['flipper_length_mm'])
gen = scipy.stats.linregress(x = gentoo['body_mass_g'], y = gentoo['flipper_length_mm'])
chin = scipy.stats.linregress(x = chinstrap['body_mass_g'], y = chinstrap['flipper_length_mm'])

print(ade, gen, chin, sep='\n')

La ultima grafica que hizo pierde sentido, ya que utilizo todos los pinguinos. Lo mejor hubiera sido dividirlo por especies.

20. Estableciendo relaciones: análisis de regresión simple

¿Cómo calcular la fuerza del efecto?

Con la regresión lineal

Escogí las variables de peso del pingüino y tamaño de alas, al hacer la regresión lineal encuentro una correlación alta con un slope bajo y al intercambiar las variables queda la misma correlación, pero el slope es mayor porque el impacto del peso es mayor.

sns.scatterplot( # Gráfico de dispersión
    data=processed_penguins_df,
    x='body_mass_g',
    y='flipper_length_mm'
)

res_penguins = scipy.stats.linregress( # Regresión lineal
    x=processed_penguins_df['body_mass_g'],
    y=processed_penguins_df['flipper_length_mm']
)
print(res_penguins)

fx_1 = np.array([processed_penguins_df['body_mass_g'].min(), processed_penguins_df['body_mass_g'].max()]) # Rango de valores para x
fy_1 = res_penguins.intercept + res_penguins.slope * fx_1 # Rango de valores para y
plt.plot(fx_1, fy_1)

sns.lmplot( # Gráfico de dispersión con regresión lineal
    data=processed_penguins_df,
    x='body_mass_g',
    y='flipper_length_mm'
)

Valores obtenidos en el análisis de regresión simple:

  • Slope (es el efecto que tiene la correlación en caso de que exista).
  • Intercept (indica en donde se corta el eje de las y, porque estamos ajustando una línea).
  • Rvalue (indica cuanto de nuestra variabilidad de los datos estamos capturando con la regresión lineal, podemos ver representado el coeficiente de correlación en este valor aunque con un poco de ruido).
  • Pvalue (indica si la regresión lineal es significativa)
  • Y otra serie de parámetros que no forman parte del objeto de estudio de esta clase
Escogí 2 variables: * body mass * flipper length Primero las grafique en un scatter plot: ![](https://static.platzi.com/media/user_upload/image-cbf6a113-7755-446a-a77b-08353b9a8675.jpg) Obtuve su factor de correlación: 0.8730 Después Seaborn para saber la forma grafica de la regresión lineal: ![](https://static.platzi.com/media/user_upload/image-d2664f5c-df74-4352-8293-e07e2e610f74.jpg) Se puede observar que el rango de confiabilidad es pequeño. Ahora procedemos a obtener los parametros que ajustan la recta de la ecuación. Obteniendo lo siguiente: * slope=0.015195264815217666 * intercept=137.03962089225467 Con estos datos obtenemos los array correspondientes para la grafica. Y procedemos a graficar el scatter plot y la recta de regresión lineal: ![](https://static.platzi.com/media/user_upload/image-04bbc595-a2f6-4a8a-80d3-583036f92aa3.jpg) Como se puede observar hay una correlación positiva y quiere decir que un aumento en la \*\*masa corporal\*\* esta relacionado en un aumento en la \*\*longitud de la aleta\*\*.
![](https://static.platzi.com/media/user_upload/image-0e6a06ec-81c9-4ede-9421-6e240a706112.jpg) \_\_\_\_\_\_ ```js # # Variables o atributos mi_index = ( proces_penguins_df .columns .slice_indexer( 'bill_length_mm', 'body_mass_g' ) ) species = proces_penguins_df['species'].value_counts().reset_index()['index'] variables = proces_penguins_df.columns[mi_index] # Definiendo el grid y el grafico cols = len(variables) rows = cols fig, ax = ( plt .subplots( ncols=cols, nrows=rows, figsize=(20, 10), layout='constrained', facecolor='none' ) ) #Subtitulo de la figura fig.suptitle('Regresion_Lineales Pinguinos') # Filas for i, variable_row in enumerate(variables): # Columnas for j, variable_col in enumerate(variables): # Graficando por especie en cada ax[i][j] for specie, group in proces_penguins_df.groupby('species'): sns.regplot( y=variable_row, x=variable_col, data=group, ax=ax[i][j], label=specie, color=penguin_color[specie] ) # Parametros en 'comun' ax[i][j].grid(True) ax[i][j].set_xlabel('') # La specie como y_label pero solo en la columna 0 if j != 0: ax[i][j].set_ylabel('') else: ax[i][j].set_ylabel(f'{variable_row}') # Solo titulos en la fila de arriba if (i == 0): ax[i][j].set_title(variable_col) # Solo tick label en la fila de abajo if (i != rows - 1): ax[i][j].set_xticklabels([]) if i == j: ax[i][j].legend() # ```
![](https://static.platzi.com/media/user_upload/image-f9953385-d148-4f74-9830-070191487c52.jpg)
Relacion entre flipper\_length\_mm y body\_mass\_g ![](https://static.platzi.com/media/user_upload/image-ee1c05a1-839d-4d0a-99c2-f406ba82af69.jpg) ![](https://static.platzi.com/media/user_upload/image-cf2d4001-124e-45a8-9a48-8f997c5baf5f.jpg)
![](https://static.platzi.com/media/user_upload/image-9099400a-1875-4638-886d-f0d0c87d9b47.jpg) Relacion entre flipper\_length\_mm y body\_mass\_g ![](https://static.platzi.com/media/user_upload/image-ac6a7607-28e8-4b31-a548-0c7e249154f6.jpg)



E r-cuadrado está negativo por la simple razón de que están 3 tipos de pingüinos, cuando grafiquen con el hue por species, entonces verán que por solo esas 2 características (bill length y bill depth) se ven las diferencias por color, se ven algo separados y se pueden meter en un modelo de machine learning para clasificar las 3 especies con un buen grado de accuracy.

sns.scatterplot(
    x=x1,
    y=y2
)

fx1=np.array([x1.min(),x1.max()])
fy1 = res_1.intercept + res_1.slope * fx1

plt.plot(fx1, fy1)

sns.scatterplot(
    x=x2,
    y=y2
)

fx2 = np.array([x2.min(),x2.max()])
fy2 = res_2.intercept + res_2.slope * fx2

plt.plot(fx2, fy2)

plt.legend(labels = ["1","1","2","2"])

De mi lado lo hice con el body mass y el bill depth , cambiandolos por x y y cambia la forma del grafico pero se mantiene la pendiente negativa

Y si le coloco el hue vemos pendiente positiva

  • El análisis de regresión simple es una técnica estadística utilizada para analizar la relación entre dos variables. En este análisis, una variable se considera la variable independiente (predictora) y la otra variable se considera la variable dependiente (objetivo). El objetivo del análisis de regresión simple es determinar si existe una relación entre ambas variables y, en caso afirmativo, describir la naturaleza y la fuerza de esa relación.

  • El análisis de regresión simple se utiliza comúnmente en muchas áreas, como la economía, la psicología, la biología, la física, entre otras. Se puede utilizar para predecir el valor de una variable a partir del valor de otra variable y para identificar las variables que tienen el mayor efecto en la variable de interés.

  • En Python, se pueden utilizar varias bibliotecas para realizar un análisis de regresión simple, como numpy, pandas, scikit-learny statsmodels.

X = penguins['bill_depth_mm']
y = penguins['bill_length_mm']
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()

print(model.summary())

Cuando intercambiamos los ejes cambia el slope. También creo que es sensitivo a la escala, ya que el bill_length_mm de los penguins tiene mucho mas rango que el bill_depth_mm. Entonces si colocamos el bill_depth_mm en el eje x nos da un slope mucho mas grande (positivo o negativo) ya que con muy poca variabilidad en el eje x tenemos mucho mas cambio en el eje y.
En conclusión: El rango de las variables afecta a la pendiente.
(Mismo código del profe, solo se intercambian los x y y)

LinregressResult(slope=-0.08232675339862275, intercept=20.786648668433827, rvalue=-0.22862563591302915,

LinregressResult(slope=-0.6349051704195029, intercept=54.890854245047564, rvalue=-0.22862563591302915,

sns.scatterplot(
    data=process_penguins_df,
    y='bill_length_mm',
    x='bill_depth_mm'
)

res_penguins = scipy.stats.linregress(
    y=process_penguins_df.bill_length_mm,
    x=process_penguins_df.bill_depth_mm
)

print(res_penguins)

fx1 = np.array([process_penguins_df.bill_depth_mm.min(), process_penguins_df.bill_depth_mm.max()])
fy1 = res_penguins.intercept + res_penguins.slope * fx1

plt.plot(fx1,fy1)

Les comparto el código con el que hice la gráfica de forma manual. (ojo, no le puse el mismo nombre al df).

penguin_species = list(df_penguins_nn['species'].unique())

sns.scatterplot(
    data = df_penguins_nn,
    x = 'bill_length_mm',
    y = 'bill_depth_mm',
    hue = 'species',
    palette = penguin_color
)
for specie in penguin_species:
    res = scipy.stats.linregress(
    x = df_penguins_nn[df_penguins_nn['species']== specie ].bill_length_mm,
    y = df_penguins_nn[df_penguins_nn['species']== specie].bill_depth_mm
    )
    fx = np.array([df_penguins_nn.bill_length_mm[df_penguins_nn['species']==specie].min(), df_penguins_nn[df_penguins_nn['species']== specie].bill_length_mm.max()])
    fy = res.intercept + res.slope * fx

    plt.plot(fx, fy, color = penguin_color[specie] )
    plt.savefig('linregress.png')

res_1=scipy.stats.linregress(x=x_1, y=y_1)
res_2=scipy.stats.linregress(x=x_2, y=y_2)

print(res_1, res_2, sep=’\n’)