# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# <img src="images/usm.jpg" width="480" height="240" align="left"/>

# # MAT281 - Laboratorios N°07
#
# ## Objetivos del laboratorio
#
# * Reforzar conceptos básicos de regresión lineal.

# ## Contenidos
#
# * [Problema 01](#p1)
#

# <a id='p1'></a>
# ## I.- Problema 01
#
#
# <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Anscombe.svg/1200px-Anscombe.svg.png" width="360" height="360" align="center"/>
#
#

# 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.

# +
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()

# 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.  

# ## Parte 1

##DATOS DE ENTRADA 
grupo1=df[df['grupo']=='Grupo_1'] 
grupo2=df[df['grupo']=='Grupo_2'] 
grupo3=df[df['grupo']=='Grupo_3'] 
grupo4=df[df['grupo']=='Grupo_4'] 
x=grupo1['x']
x4=grupo4['x']
y1=grupo1['y']
y2=grupo2['y']
y3=grupo3['y']
y4=grupo4['y']

fig,axs=plt.subplots(2,2)
axs[0,0].scatter(x,y1)
axs[0,0].set_title('Grupo 1')
axs[0,1].scatter(x,y2)
axs[0,1].set_title('Grupo 2')
axs[1,0].scatter(x,y3)
axs[1,0].set_title('Grupo 3')
axs[1,1].scatter(x4,y4)
axs[1,1].set_title('Grupo 4')

# Los datos varían mucho entre sí, por ejemplo el grupo 4 básicamente no necesita una regresión lineal porque es una recta vertical salvo por ese punto alejado, en la prática este último debería ser corregido o eliminado del dataframe.
# El grupo 2 y el 3, podrían ajustarse a una regresión polinómica (orden 2 o 3) y lineal respectivamente, el 3 tiene un punto muy alejado por lo que, omitilo o corregirlo es necesario si se buscar mejorar los parámetro de regresión.
# El grupo 1, muestra gran variabilidad entre datos, pero visualmente se podría ajustar con una regresión lineal, sin problemas.

# ## Parte 2

grupo1.describe()

grupo2.describe()

grupo3.describe()

grupo4.describe()

# el valor medio de x, es el mismo en los tres primeros, esto ocurre porque la columna consta de los mismos datos
# Para el grupo 4, la media es 9 pero la mayoría de los datos es 8, esto ocurre por el dato extremo.(con esto el grupo 4 queda con la mayor media en el eje x)
# Del mismo modo, la desviación estándar en x es mayor que en y, esto se justificar de igual forma que el anterior.
#

# ## Parte 3

# +
#Gráfico
x=grupo1['x']
x4=grupo4['x']
y1=grupo1['y']
y2=grupo2['y']
y3=grupo3['y']
y4=grupo4['y']
def fit(x):
    return 3 + 0.5 * x

fig, axs = plt.subplots(2, 2, sharex=True, sharey=True)
axs[0, 0].set(xlim=(0, 20), ylim=(2, 14))
axs[0, 0].set(xticks=(0, 10, 20), yticks=(4, 8, 12))

xfit = np.array([np.min(x), np.max(x)])
axs[0, 0].plot(x, y1, 'ks', xfit, fit(xfit), 'r-', lw=2)
axs[0, 1].plot(x, y2, 'ks', xfit, fit(xfit), 'r-', lw=2)
axs[1, 0].plot(x, y3, 'ks', xfit, fit(xfit), 'r-', lw=2)
xfit = np.array([np.min(x4), np.max(x4)])
axs[1, 1].plot(x4, y4, 'ks', xfit, fit(xfit), 'r-', lw=2)

for ax, label in zip(axs.flat, ['I', 'II', 'III', 'IV']):
    ax.label_outer()
    ax.text(3, 12, label, fontsize=20)

plt.show()
# -

# Se podría concluir que la regresión lineal es buena solo para el III, 

# ## Parte 4

# +
from sklearn import datasets
from sklearn.model_selection import train_test_split

# import some data to play with

X = grupo1[['x']]
y = grupo1['y']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
from sklearn.linear_model import LinearRegression
model_rl = LinearRegression() # Creando el modelo.
model_rl.fit(X_train, y_train) 
beta_0 = round(model_rl.intercept_,2)
beta_1 = round(model_rl.coef_[0],2)
Y_predict = model_rl.predict(X_test)
from metrics_regression import *
from sklearn.metrics import r2_score

# ejemplo 
df_temp = pd.DataFrame(
    {
        'y':y_test,
        'yhat': model_rl.predict(X_test)
        }
)

df_metrics = summary_metrics(df_temp)
df_metrics['r2'] =  round(r2_score(y_test, model_rl.predict(X_test)),4)
print(df_metrics)

# +
from sklearn import datasets
from sklearn.model_selection import train_test_split

# import some data to play with

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

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
from sklearn.linear_model import LinearRegression
model_rl = LinearRegression() # Creando el modelo.
model_rl.fit(X_train, y_train) 
beta_0 = round(model_rl.intercept_,2)
beta_1 = round(model_rl.coef_[0],2)
Y_predict = model_rl.predict(X_test)
from metrics_regression import *
from sklearn.metrics import r2_score

# ejemplo 
df_temp = pd.DataFrame(
    {
        'y':y_test,
        'yhat': model_rl.predict(X_test)
        }
)

df_metrics = summary_metrics(df_temp)
df_metrics['r2'] =  round(r2_score(y_test, model_rl.predict(X_test)),4)
print(df_metrics)

# +
from sklearn import datasets
from sklearn.model_selection import train_test_split

# import some data to play with

X = grupo3[['x']]
y = grupo3['y']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
from sklearn.linear_model import LinearRegression
model_rl = LinearRegression() # Creando el modelo.
model_rl.fit(X_train, y_train) 
beta_0 = round(model_rl.intercept_,2)
beta_1 = round(model_rl.coef_[0],2)
Y_predict = model_rl.predict(X_test)
from metrics_regression import *
from sklearn.metrics import r2_score

# ejemplo 
df_temp = pd.DataFrame(
    {
        'y':y_test,
        'yhat': model_rl.predict(X_test)
        }
)

df_metrics = summary_metrics(df_temp)
df_metrics['r2'] =  round(r2_score(y_test, model_rl.predict(X_test)),4)
print(df_metrics)

# +
from sklearn import datasets
from sklearn.model_selection import train_test_split

# import some data to play with

X = grupo4[['x']]
y = grupo4['y']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
from sklearn.linear_model import LinearRegression
model_rl = LinearRegression() # Creando el modelo.
model_rl.fit(X_train, y_train) 
beta_0 = round(model_rl.intercept_,2)
beta_1 = round(model_rl.coef_[0],2)
Y_predict = model_rl.predict(X_test)
from metrics_regression import *
from sklearn.metrics import r2_score

# ejemplo 
df_temp = pd.DataFrame(
    {
        'y':y_test,
        'yhat': model_rl.predict(X_test)
        }
)

df_metrics = summary_metrics(df_temp)
df_metrics['r2'] =  round(r2_score(y_test, model_rl.predict(X_test)),4)
print(df_metrics)
# -



# ## Parte 5

# +
X = grupo1[['x']]
y = grupo1['y']

from sklearn import datasets, linear_model
import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

from sklearn.preprocessing import PolynomialFeatures
poli_reg = PolynomialFeatures(degree=2)
X_train_poli=poli_reg.fit_transform(X_train)
X_test_poli=poli_reg.fit_transform(X_test)
pr = linear_model.LinearRegression()
Y_predict = model_rl.predict(X_test)
plt.scatter(X_test,y_test)
plt.plot(X_test,Y_predict,color='red',linewidth=3)
plt.show()
# -

# Se observa una mejora considerable en la aproximación





StarcoderdataJupyterScriptsDedupFiltered