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: análisis de regresión simple

20/28
Recursos

Aportes 32

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
**REPORTE DE ANÁLISIS DE CÓDIGO EN DEEPNOTE NOTEBOOK** **CÁLCULO DE REGRESIONES LINEALES SIMPLES.** **Código:** 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') **Descripción del código:** 1. res\_1 = scipy.stats.linregress(x=x\_1, y=y\_1): Calcula una regresión lineal simple para las variables x\_1 y y\_1. Devuelve un objeto con información como la pendiente, el intercepto y el valor p. 2. res\_2 = scipy.stats.linregress(x=x\_2, y=y\_2): Calcula una regresión lineal simple para las variables x\_2 y y\_2. 3. print(res\_1, res\_2, sep='\n'): Imprime los resultados de ambas regresiones en la consola, separándolos por una línea nueva. **Salida esperada:** Se imprimen dos objetos que incluyen: * La pendiente (slope). * El intercepto (intercept). * Los valores estadísticos asociados (por ejemplo, rvalue, pvalue, stderr). **VISUALIZACIÓN DE LAS REGRESIONES LINEALES CON DATOS.** **Código:** sns.scatterplot(x=x\_1, y=y\_1) fx\_1 = np.array(\[x\_1.min(), x\_1.max()]) fy\_1 = res\_1.intercept + res\_1.slope \* fx\_1 plt.plot(fx\_1, fy\_1) sns.scatterplot(x=x\_2, y=y\_2) fx\_2 = np.array(\[x\_2.min(), x\_2.max()]) fy\_2 = res\_2.intercept + res\_2.slope \* fx\_2 plt.plot(fx\_2, fy\_2) plt.legend(labels=\['1', '2']) **Descripción del código:** 1. sns.scatterplot(x=x\_1, y=y\_1): Genera un diagrama de dispersión para las variables x\_1 y y\_1. 2. fx\_1 = np.array(\[x\_1.min(), x\_1.max()]): Crea un arreglo con los valores mínimo y máximo de x\_1. 3. fy\_1 = res\_1.intercept + res\_1.slope \* fx\_1: Calcula los valores de y para la línea de regresión correspondiente a x\_1. 4. plt.plot(fx\_1, fy\_1): Dibuja la línea de regresión. 5. Se repiten los pasos anteriores para las variables x\_2 y y\_2. 6. plt.legend(labels=\['1', '2']): Agrega una leyenda para identificar las dos series de datos. **Salida esperada:** Un gráfico que muestra: * Dos diagramas de dispersión (uno para x\_1, y\_1 y otro para x\_2, y\_2). * Dos líneas de regresión superpuestas. * Una leyenda que identifica las series. **REGRESIÓN LINEAL APLICADA A DATOS DE PINGÜINOS.** **Código:** sns.scatterplot(     data=processed\_penguins\_df,     x='bill\_length\_mm',     y='bill\_depth\_mm', ) res\_penguins = scipy.stats.linregress(     x=processed\_penguins\_df.bill\_length\_mm,     y=processed\_penguins\_df.bill\_depth\_mm ) print(res\_penguins) fx\_1 = np.array(\[processed\_penguins\_df.bill\_length\_mm.min(), processed\_penguins\_df.bill\_length\_mm.max()]) fy\_1 = res\_penguins.intercept + res\_penguins.slope \* fx\_1 plt.plot(fx\_1, fy\_1) **Descripción del código:** 1. sns.scatterplot(...): Genera un diagrama de dispersión para las variables bill\_length\_mm (longitud del pico) y bill\_depth\_mm (profundidad del pico) en el conjunto de datos procesado. 2. res\_penguins = scipy.stats.linregress(...): Calcula la regresión lineal simple entre las dos variables del conjunto de datos. 3. print(res\_penguins): Imprime los resultados de la regresión, incluyendo la pendiente, el intercepto y valores estadísticos. 4. fx\_1 = np.array(\[...]): Define los límites para la línea de regresión. 5. fy\_1 = res\_penguins.intercept + res\_penguins.slope \* fx\_1: Calcula los valores y para la línea de regresión. 6. plt.plot(fx\_1, fy\_1): Dibuja la línea de regresión sobre el diagrama de dispersión. **Salida esperada:** Un gráfico que muestra: * Un diagrama de dispersión de las variables bill\_length\_mm y bill\_depth\_mm. * Una línea de regresión superpuesta al gráfico.
### **ANÁLISIS DE REGRESIÓN LINEAL:**  La regresión lineal simple es una herramienta clave para entender la relación entre dos variables. En esta clase, hemos utilizado ejemplos prácticos para aprender a: 1. **Cuantificar el efecto de una variable sobre otra.** 2. **Interpretar parámetros clave como la pendiente (slope) y el intercepto (intercept).** #### **Contexto** En clases anteriores: * Observamos puntos distribuidos en una gráfica que no siempre se ajustaban perfectamente a una línea. * Aprendimos que el coeficiente de correlación mide la relación entre variables, pero no cuantifica el efecto directo. **Objetivo actual:** Ajustar una línea a los datos usando la función lm para calcular el efecto de las variables y analizar los resultados. ### **PASOS PARA REALIZAR UNA REGRESIÓN LINEAL SIMPLE** #### **1. Ajuste inicial de datos** * Usamos la función lm con dos parámetros: x e y. * Guardamos los resultados en variables (por ejemplo, resultado1). #### **2. Interpretación de resultados** * **Pendiente (slope):** Representa el cambio en y por cada unidad de cambio en x. * **Intercepto (intercept):** Punto donde la línea cruza el eje y. * **Coeficiente de correlación (r):** Proporción de la variabilidad capturada por la regresión. * **P-valor:** Indica si la relación es estadísticamente significativa. #### **3. Ejemplo práctico** * Conjunto 1: slope = 0.1 (efecto pequeño por cambio en x). * Conjunto 2: slope = 0.54 (efecto 5 veces mayor que en el conjunto 1). * **Conclusión:** El valor del slope puede tener un impacto significativo en las decisiones analíticas, más allá del coeficiente de correlación. ### **VISUALIZACIÓN Y ANÁLISIS GRÁFICO** #### **1. Relación negativa en un nuevo conjunto** * Se analizó la relación entre bill\_length (longitud del pico) y bill\_depth (profundidad del pico). * Resultado: * **Pendiente negativa:** slope = -0.08. * **Interpretación:** A mayor longitud del pico, menor profundidad. #### **2. Uso de Seaborn** * La función lmplot permite generar gráficas de regresión con intervalos de confianza de manera sencilla. * Ventajas: * Visualización rápida. * Intervalos de confianza (área sombreada). * Limitaciones: * No muestra directamente parámetros como slope, r o p-valor. #### **3. Comparación visual** * Las gráficas permiten identificar tendencias generales, pero es esencial comparar los datos estadísticos para comprender el efecto real.
### **ANÁLISIS DE CORRELACIÓN: DE COEFICIENTES A REGRESIÓN LINEAL** Ya hemos aprendido sobre las **matrices de correlación** y los **coeficientes de correlación lineal**, como el coeficiente de Pearson. Sin embargo, estas herramientas tienen limitaciones importantes. Por ejemplo, un coeficiente de correlación lineal no nos indica: * **El impacto de la correlación**. * **La fuerza de la relación** entre las variables. #### **¿Cómo podemos calcular la fuerza de esta relación?** Para resolver esta pregunta, utilizamos un ejemplo práctico: un conjunto de datos que incluye dos variables relacionadas con pingüinos: 1. **La longitud de sus alas**. 2. **El peso**. ##### **Descubrimientos iniciales:** * Encontramos una correlación positiva entre estas variables. * El coeficiente de correlación fue **0,87**, lo que indica una relación alta y positiva. Pero surge una duda clave: **¿Qué tan fuerte es realmente esta relación?** Es decir, ¿cómo afecta un cambio en la longitud de las alas al peso del pingüino? ### **INTRODUCCIÓN A LA REGRESIÓN LINEAL** Para responder esta pregunta, recurrimos a la **regresión lineal**. Este método nos permite: 1. Ajustar una **línea** a nuestros datos, representándolos con una ecuación matemática. 2. Calcular la **pendiente** (*slope*) de esa línea. #### **¿Qué nos dice la pendiente (*slope*)?** * La pendiente indica **la inclinación de la línea**. * Una pendiente pronunciada significa que: * Un pequeño cambio en la variable X (longitud de las alas) genera un cambio significativo en la variable Y (peso). * Si la pendiente es casi plana: * Aunque exista correlación, los cambios en X tendrán un efecto mínimo sobre Y. De esta forma, la pendiente nos ayuda a **cuantificar la fuerza del efecto** entre las variables.
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’)