<jupyter_start><jupyter_text>MAT281 - Laboratorios N°07  I.- Problema 01 El **cuarteto de Anscombe** comprende cuatro conjuntos de datos que tienen las mismas propiedades estadísticas, pero que evidentemente son distintas al inspeccionar sus gráficos respectivos.Cada conjunto consiste de once puntos (x, y) y fueron construidos por el estadístico <NAME>. El cuarteto es una demostración de la importancia de mirar gráficamente un conjunto de datos antes de analizarlos.<jupyter_code>import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
sns.set_palette("deep", desat=.6)
sns.set(rc={'figure.figsize':(11.7,8.27)})
# cargar datos
df = pd.read_csv(os.path.join("data","anscombe.csv"), sep=",")
df.head()<jupyter_output><empty_output><jupyter_text>Basado en la información presentada responda las siguientes preguntas:1. Gráfique mediante un gráfico tipo **scatter** cada grupo. A simple vista, ¿ los grupos son muy distintos entre si?.2. Realice un resumen de las medidas estadísticas más significativas ocuapando el comando **describe** para cada grupo. Interprete.3. Realice un ajuste lineal para cada grupo. Además, grafique los resultados de la regresión lineal para cada grupo. Interprete.4. Calcule los resultados de las métricas para cada grupo. Interprete.5. Es claro que el ajuste lineal para algunos grupos no es el correcto. Existen varias formas de solucionar este problema (eliminar outliers, otros modelos, etc.). Identifique una estrategia para que el modelo de regresión lineal ajuste de mejor manera e implemente otros modelos en los casos que encuentre necesario.<jupyter_code>#Graficamos para los 4 grupos
sns.relplot(
    data=df, x="x", y="y",
    col="grupo",
    kind="scatter"
)

plt.show()<jupyter_output><empty_output><jupyter_text>Podemos ver que graficamente los grupos son muy diferentes entre sí.2- Se realiza el resumen de medidas estadísticas por grupo<jupyter_code>grupo1=df.loc[df.loc[:, 'grupo'] == 'Grupo_1']

grupo2=df.loc[df.loc[:, 'grupo'] == 'Grupo_2']

grupo3=df.loc[df.loc[:, 'grupo'] == 'Grupo_3']

grupo4=df.loc[df.loc[:, 'grupo'] == 'Grupo_4']

grupo1.describe()
grupo2.describe()
grupo3.describe()
grupo4.describe()<jupyter_output><empty_output><jupyter_text>Podemos ver que el resumen descriptivo es similar en todos los grupos, especificamente en los valores correspondientes a la cantidad de datos, la media y la desviación estándar3- Ahora vemos el ajuste lineal y como se ve graficamente<jupyter_code>import statsmodels.api as sm
from sklearn import datasets
from sklearn.model_selection import train_test_split

# import some data to play with

X1 = grupo1[['x']] # we only take the first two features.
y1 = grupo1['y']

X_train1, X_test1, y_train1, y_test1 = train_test_split(X1, y1, test_size=0.2, random_state=42)

model_1 = sm.OLS(y_train1, sm.add_constant(X_train1))
results_1 = model_1.fit()

sns.lmplot(
    x='x',
    y='y',
    data=grupo1,
    height = 8,
)  
plt.show()
X2 = grupo2[['x']] # we only take the first two features.
y2 = grupo2['y']

X_train2, X_test2, y_train2, y_test2 = train_test_split(X2, y2, test_size=0.2, random_state=42)

model_2 = sm.OLS(y_train2, sm.add_constant(X_train2))
results_2 = model_2.fit()




sns.lmplot(
    x='x',
    y='y',
    data=grupo2,
    height = 8,
)  
plt.show()
X3 = grupo3[['x']] # we only take the first two features.
y3 = grupo3['y']

X_train3, X_test3, y_train3, y_test3 = train_test_split(X3, y3, test_size=0.2, random_state=42)

model_3 = sm.OLS(y_train3, sm.add_constant(X_train3))
results_3 = model_3.fit()
sns.lmplot(
    x='x',
    y='y',
    data=grupo3,
    height = 8,
)  
plt.show()
X4 = grupo4[['x']] # we only take the first two features.
y4 = grupo4['y']

X_train4, X_test4, y_train4, y_test4 = train_test_split(X4, y4, test_size=0.2, random_state=42)

model_4 = sm.OLS(y_train4, sm.add_constant(X_train4))

results_4 = model_4.fit()
sns.lmplot(
    x='x',
    y='y',
    data=grupo4,
    height = 8,
)  
plt.show()<jupyter_output><empty_output><jupyter_text>4- Calculamos los resultados de las métricas para cada grupo<jupyter_code>print(results_1.summary())

print(results_2.summary())
print(results_3.summary())
print(results_4.summary())<jupyter_output>OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.682
Model:                            OLS   Adj. R-squared:                  0.629
Method:                 Least Squares   F-statistic:                     12.85
Date:                Wed, 10 Nov 2021   Prob (F-statistic):             0.0116
Time:                        18:14:55   Log-Likelihood:                -13.199
No. Observations:                   8   AIC:                             30.40
Df Residuals:                       6   BIC:                             30.56
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|[...]<jupyter_text>De aquí observamos que ninguno de los 4 modelos tiene un buen ajuste lineal, ya que para los 4 grupos el R cuadrado está lejos de 1.<jupyter_code>from metrics_regression import *
from sklearn.metrics import r2_score

y_pred1 = results_1.predict(sm.add_constant(X_test1))

df_temp1 = pd.DataFrame(
    {
        'y':y_test1,
        'yhat': y_pred1
        }
)

print('\nMetricas para el regresor grupo1:\n')
summary_metrics(df_temp1)

y_pred2 = results_2.predict(sm.add_constant(X_test2))

df_temp2 = pd.DataFrame(
    {
        'y':y_test2,
        'yhat': y_pred2
        }
)

print('\nMetricas para el regresor grupo2:\n')
summary_metrics(df_temp2)

y_pred3 = results_3.predict(sm.add_constant(X_test3))

df_temp3 = pd.DataFrame(
    {
        'y':y_test3,
        'yhat': y_pred3
        }
)

print('\nMetricas para el regresor grupo3:\n')
summary_metrics(df_temp3)

y_pred4 = results_4.predict(sm.add_constant(y_test4))

df_temp4 = pd.DataFrame(
    {
        'y':y_test4,
        'yhat': y_pred4
        }
)

print('\nMetricas para el regresor grupo4:\n')
summary_metrics(df_temp4)<jupyter_output>Metricas para el regresor grupo4:<jupyter_text>5- Veremos la presencia de outliers y los quitaremos.<jupyter_code>outlier = np.zeros(11)
outlier[:10] = 1
outlier[10:12] = 2

# generar dataframe
df = pd.DataFrame({
    'x':grupo1.sort_values('y')['x'],
    'y':grupo1.sort_values('y')['y'],
    'outlier':outlier
})

sns.scatterplot(
    x='x',
    y='y',
    hue='outlier',
    data=df
)  
plt.show()
grupo_1=grupo1.sort_values('y').reset_index().drop(10)
grupo_1

#Ahora veamos la diferencia con y sin el outlier
sns.lmplot(
    x='x',
    y='y',
    data=grupo1,
    height = 8,
)  

sns.lmplot(
    x='x',
    y='y',
    data=grupo_1,
    height = 8,
)  
plt.show()

# generar dataframe
df = pd.DataFrame({
    'x':grupo2.sort_values('y')['x'],
    'y':grupo2.sort_values('y')['y'],
    'outlier':outlier
})

sns.scatterplot(
    x='x',
    y='y',
    hue='outlier',
    data=df
)  
plt.show()
grupo_2=grupo2.sort_values('y').reset_index().drop(10)
grupo_2

X= grupo2[['x']]
y= grupo2['y']


#Ahora veamos la diferencia con y sin el outlier
sns.lmplot(
    x='x',
    y='y',
    data=grupo2,
    height = 8,
)  

sns.lmplot(
    x='x',
    y='y',
    data=grupo_2,
    height = 8,
)  
plt.show()

# generar dataframe
df = pd.DataFrame({
    'x':grupo3.sort_values('y')['x'],
    'y':grupo3.sort_values('y')['y'],
    'outlier':outlier
})

sns.scatterplot(
    x='x',
    y='y',
    hue='outlier',
    data=df
)  
plt.show()
grupo_3=grupo3.sort_values('y').reset_index().drop(10)
grupo_3
#Ahora veamos la diferencia con y sin el outlier
sns.lmplot(
    x='x',
    y='y',
    data=grupo3,
    height = 8,
)  

sns.lmplot(
    x='x',
    y='y',
    data=grupo_3,
    height = 8,
)  
plt.show()<jupyter_output><empty_output><jupyter_text>En este caso (Grupo 3) Vemos que el ajuste es mucho más certero<jupyter_code># generar dataframe
df = pd.DataFrame({
    'x':grupo4.sort_values('y')['x'],
    'y':grupo4.sort_values('y')['y'],
    'outlier':outlier
})

sns.scatterplot(
    x='x',
    y='y',
    hue='outlier',
    data=df
)  
plt.show()
grupo_4=grupo4.sort_values('y').reset_index().drop(10)
grupo_4
#Ahora veamos la diferencia con y sin el outlier
sns.lmplot(
    x='x',
    y='y',
    data=grupo4,
    height = 8,
)  

sns.lmplot(
    x='x',
    y='y',
    data=grupo_4,
    height = 8,
)  
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14557180697915467, 'fraction_numerical': 0.03028907059771968, 'mean_word_length': 3.284163788850518, 'pattern_counts': {'":': 0, '<': 32, '<?xml version=': 0, '>': 33, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 7, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '182377', 'license': 'MIT', 'n_tokens_mistral': 3434, 'n_tokens_neox': 3334, 'n_words': 763, 'path': 'labs/lab_07.ipynb', 'repo_name': 'maryonmorales/MAT-281_MaryonMorales', 'size': '8691'}