Вы находитесь на странице: 1из 5

#Comandos iniciales:

import pandas as pd
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
import itertools
%matplotlib inline
___________________________________________________________________________________
_________________________________________________________

#Importar tabla
df = pd.read_excel(�NOMBRETABLA.xlsx�)
df.head()

#Grafico de dispersion (x,y)


df.plot.scatter('X','Y')
___________________________________________________________________________________
_________________________________________________________

#Modelo regresi�n
modelo = smf.ols('Y ~ X', data=df)
resultado = modelo.fit()
resultado.summary()
___________________________________________________________________________________
_______
#Obtener valor p
resultado.f_pvalue

#con valor alpha


resultado.f_pvalue < valoraplha

__________________________________________________

#Definicion de y_gorro
y_gorro = lambda x: FORMULA+FORMULA*x
___________________________________________________________________________________
_______
#En caso de pedir variable con log
df['LOGX'] = np.log(df['X'])
df.head()
__________________________________________________

#Si es que me piden predecir un valor Y al X valor


y_gorro(X)
___________________________________________________________________________________
_________________________________________________________

#grafico de dispersion con linea de regresion


fig = plt.figure(figsize=(8,5))
ax = fig.add_subplot(111)
ax.scatter(df.X,df.Y)
x_val = np.linspace(0,25,1000)
ax.plot(x_val,y_gorro(x_val),color='g')
___________________________________________________________________________________
_______

#Grafico para ver relaci�n de puntos


plt.scatter('X','Y',data=df)
plt.xlabel('X')
plt.ylabel('Y');
__________________________________________________

#Analisis de residuos
fig = plt.figure(figsize=(8,6))

#Residuos respecto al valor observado


ax = fig.add_subplot(221)
ax.scatter(df.index, resultado.resid_pearson, color='orange')
ax.set_xlabel('Observations')
ax.set_ylabel('Standard error')

#Residuos respecto al valor ajustado


ax = fig.add_subplot(222)
ax.scatter(resultado.fittedvalues, resultado.resid_pearson, color='orange')
ax.set_xlabel('Mean response $\hat{y}$')
ax.set_ylabel('Standard error')

#Gr�fico de probabilidad
ax = fig.add_subplot(223)
st.probplot(resultado.resid_pearson, plot=ax);

#Histograma
ax = fig.add_subplot(224)
ax.hist(resultado.resid_pearson, bins=6)
ax.set_ylabel('Frecuency')
ax.set_xlabel('Standard error')

plt.tight_layout()
___________________________________________________________________________________
_________________________________________________________

#Analisis de residuos tmbn


resultado.resid
___________________________________________________________________________________
_________________________________________________________

#Tambien analisis de residuos


x_val = np.linspace(df['X'].min(), df['X'].max(), 100)
predi = resultado.get_prediction({'X': x_val})
df.plot.scatter('X', 'Y')
plt.plot(x_val,predi.predicted_mean, color='red')
___________________________________________________________________________________
_________________________________________________________

#Desv estandar de residuos


resultado.mse_resid
___________________________________________________________________________________
_________________________________________________________

#Si es que me piden grafica de intervalos de confianza, etc..


pred = resultado.get_prediction({'X':x_val})

fig = plt.figure(figsize=(8,5))
ax = fig.add_subplot(111)
ax.scatter(df.X,df.Y)
ax.plot(x_val,y_gorro(x_val),color='g')
ax.plot(x_val,pred.conf_int(),color='r')
ax.plot(x_val,pred.conf_int(obs=True),color='orange')
#El intervalo de respuesta media (Representado con lineas rojas) representa el
intervalo en el cual se encuentra la media real de los datos mientras que el
intervalo de prediccion (Representado con lineas naranjas) nos indica el rango de
valores que puede tomar "y".

#grafica de intervalos de confianza para media y pron�sticos


x_val = np.linspace(df['X'].min(), df['X'].max(), 100)
puntos=plt.scatter(df['X'],df['Y'],label="Observaciones")
recta,=plt.plot(x_val,y_gorro(x_val),color="red",zorder=-1,label="Recta ajustada")
#No se intimiden por el codigo enorme, es asi ya que se realizan todos los pasos
para obtener las partes de los IC

alfa=0.05 #se define el valor de alpha con el que realizaran los IC


n= df['X'].count() #Se calcula "n"
x_barra=df['X'].mean() #se calcula la media de x
sum_x2=sum(x**2 for x in df['X']) #sumatoria de los x al cuadrado
sum_x=x_barra*n #sumatoria de los x
sigma2=resultado.mse_resid #se obtiene sigma cuadrado
t=st.t.ppf(1-alfa/2,n-2) #valor de la t student
int_media_ls=lambda x:y_gorro(x)+t*np.sqrt(sigma2*(1/n+n*(x-x_barra)**2/(n*sum_x2-
sum_x**2))) #esto ya corresponde a cada linea de los intervalos
int_media_li=lambda x:y_gorro(x)-t*np.sqrt(sigma2*(1/n+n*(x-x_barra)**2/(n*sum_x2-
sum_x**2)))
int_predi_ls=lambda x:y_gorro(x)+t*np.sqrt(sigma2*(1+1/n+n*(x-x_barra)**2/
(n*sum_x2-sum_x**2)))
int_predi_li=lambda x:y_gorro(x)-t*np.sqrt(sigma2*(1+1/n+n*(x-x_barra)**2/
(n*sum_x2-sum_x**2)))
int1,=plt.plot(x_val,int_media_ls(x_val),color="blue",label="Intervalo de respuesta
media") #y se grafican las lineas
plt.plot(x_val,int_media_li(x_val),color="blue")
int2,=plt.plot(x_val,int_predi_ls(x_val),color="green",label=" Intervalo de
predicci�n")
plt.plot(x_val,int_predi_li(x_val),color="green")
leg1= plt.legend(handles=[puntos,recta],loc=2)
plt.gca().add_artist(leg1)
plt.legend(handles=[int1,int2],loc=4)
___________________________________________________________________________________
_________________________________________________________

#Si es que me piden obtener el intervalo de confianza para cierto dato X:


predic = resultado.get_prediction(exog={'X': VALOR})
predic.summary_frame()
___________________________________________________________________________________
_________________________________________________________

#El grafico belico


pd.plotting.scatter_matrix(df, figsize=(7, 7));
___________________________________________________________________________________
_________________________________________________________

#Para ver si todas las variables son significativas de una


all_vars = ['X1','X2','X3','X4','X5','X6']
modelos = []
for k in range(1, len(all_vars)+1):
subconjuntos = itertools.combinations(all_vars, k)
for sc in subconjuntos:
formula = 'Y ~ ' + ' + '.join(list(sc))
resultado = smf.ols(formula, data=df).fit()
modelos.append({'k': k,
'R2': resultado.rsquared,
'R2adj': resultado.rsquared_adj,
'Formula': formula})
df_mdls = pd.DataFrame(modelos)
df_mdls.sort_values(['R2adj'], ascending=False)
___________________________________________________________________________________
_________________________________________________________

#Prediccion de valores
predict = resultado.get_prediction(exog={'1': 'Valor1',
'2':'Valor2',
'3':Valor3,
})
predict.summary_frame()
___________________________________________________________________________________
_________________________________________________________

#Codigo polinomial
df['x1x1'] = (df['x1']) **2
df['x2x2'] = (df['x2']) **2
df['x3x3'] = (df['x3']) **2
df['x1x2'] = (df['x1'])*(df['x2'])
df['x1x3'] = (df['x1'])*(df['x2'])
df['x2x3'] = (df['x2'])*(df['x3'])
df.head()
___________________________________________________________________________________
_________________________________________________________

#Calculo de residuos estandarizados


resultado.resid_pearson
___________________________________________________________________________________
_________________________________________________________

df['z'] = np.log(df['y']) #LogNaturalDeY


df['w1'] = np.power(df['x1'],-1/2) #1PartidoEnRaizDex1
df['w2'] = np.power(df['x2'], 1/2) #RaizDeX
df['w3'] = np.power(df['x3'],-1/2)
df['w4'] = np.power(df['x4'], 1/2)
df.head()
___________________________________________________________________________________
_________________________________________________________

#Si es que me piden los graficos de los residuos Y gorro y de cada uno de sus
regresores

plt.scatter(resultado.fittedvalues, resultado.resid_pearson)
plt.xlabel('y_gorro*')
plt.ylabel('residuo estandar')

plt.scatter(df['x'], resultado.resid_pearson)
plt.xlabel('Nombre de x')
plt.ylabel('residuo estandar')

_____________________________________________

#Grafico de probabilidad normal de los residuos


fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111)
st.probplot(result.resid_pearson, plot=ax);

___________________________________________________________________________________
___________

#Si no se muestra una relaci�n lineal se pueden probar:

1. Relaci�n exponencial y=ae^bx


Que linealizando lny=abx

df['ln_Y'] = np.log(df['Y'])

plt.scatter('X','Y',data=df)
plt.xlabel('X')
plt.ylabel('Y');

model = smf.ols('ln_Y ~ X',data=df)


result = model.fit()
result.summary()

(De seguir lineal se procede a realizar el modelo y residuos)

2.Relacion inversa y=a/bx

df['inv_X'] = 1/df['X']

plt.scatter('inv_X','Y',data=df)
plt.xlabel('inv_X')
plt.ylabel('Y');

3.Relacion y=ax^B

df['ln_X'] = np.log(df['X'])

plt.scatter('ln_X','ln_Y',data=df)
plt.xlabel('ln_X')
plt.ylabel('ln_Y');

4.Relacion y=a+blnx

model = smf.ols('Y ~ ln_X',data=df)


result = model.fit()
result.summary()

plt.scatter('inv_X','ln_Y',data=df)
plt.xlabel('inv_X')
plt.ylabel('ln_Y');

5.Relacion lny=a+b(1/x)

model = smf.ols('ln_Y ~ inv_X',data=df)


result = model.fit()
result.summary()

Вам также может понравиться