Año |
1993 |
1994 |
1995 |
1996 |
1997 |
Gastos en Publicidad (105 ptas) |
70 |
75 |
80 |
90 |
104 |
Beneficios (106 ptas) |
33 |
45 |
50 |
65 |
67 |
Para ver si existe una dependencia entre ambas variables obtendremos la covarianza
#Importación de librerías para resolver los problemas.
%pylab inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from __future__ import division
Populating the interactive namespace from numpy and matplotlib
Gastos = np.array([70, 75, 80, 90, 104])
Beneficios = np.array([330 , 450, 500, 650 ,670])
t = np.array([1993,1994,1995,1996,1997])
COV = np.cov(Gastos,Beneficios)
print('Covarianza = '+str(COV[1,0]))
Covarianza = 1787.5
Dado a que COV(X,Y) es postiva, hay dependencia directa, es decir, a grandes valores de x corresponden grandes valores de y
r_Pearson = stats.pearsonr(Gastos,Beneficios)
print('El coeficiente de correlación de Pearson es: '+str(round(r_Pearson[0],2)))
El coeficiente de correlación de Pearson es: 0.93
El valor del índice indica que existe una correlación positiva con una relación directa: cuando X aumenta, Y también lo hace en proporción constante.
Es necesario mirar gráficamente un conjunto de datos antes de analizarlos (ver Cuarteto de Asacombe)
plt.scatter(Gastos,Beneficios)
plt.title(u'Representación de datos')
plt.xlabel(u'Gastos en publicidad '+'$10^5 / pts$')
plt.ylabel('Beneficios '+'$10^5 / pts$')
<matplotlib.text.Text at 0x13277438>
A la vista de los resultados, se puede intuir una relación lineal. No obstante en los siguientes pasos se calcularán
x = Gastos
y = Beneficios
m, b, r_val, p_val, std_err = stats.linregress(x, y)
## En caso de quere una regresión de orden mayor
# fit, residuals, _,_,_ = np.polyfit(x,y,1,full=True)
fit_fn = np.poly1d([m,b]) # fit_fn es una funcion que coge X y estima Y
plt.plot(x,y, 'yo', x, fit_fn(x), '--k')
plt.xlim(65,110)
plt.title(u'Representación de datos Gastos vs Beneficios')
plt.xlabel(u'Gastos en publicidad '+'$10^5 / pts$')
plt.ylabel('Beneficios '+'$10^5 / pts$')
print('Valores de la recta | '+ 'm:'+str(round(m,2))+' b:'+str(round(b,2)))
print('R^2:'+str(round(r_val**2,3)))
Valores de la recta | m:9.81 b:-302.13 R^2:0.868
y = Gastos
x = Beneficios
m, b, r_val, p_val, std_err = stats.linregress(x, y)
## En caso de quere una regresión de orden mayor
# fit, residuals, _,_,_ = np.polyfit(x,y,1,full=True)
fit_fn = np.poly1d([m,b]) # fit_fn es una funcion que coge X y estima Y
plt.plot(x,y, 'yo', x, fit_fn(x), '--k')
plt.ylim(65,110)
plt.title(u'Representación de datos Gastos vs Beneficios')
plt.ylabel(u'Gastos en publicidad '+'$10^5 / pts$')
plt.xlabel('Beneficios '+'$10^5 / pts$')
print('Valores de la recta | '+ 'm:'+str(round(m,2))+' b:'+str(round(b,2)))
print('R^2:'+str(round(r_val**2,3)))
Valores de la recta | m:0.09 b:37.79 R^2:0.868
x = Gastos
y = Beneficios
m, b, r_val, p_val, std_err = stats.linregress(x, y)
inversion = 115
Benf_prox = m*inversion+b
print('Los beneficiones estimados serían de '+ str(int(round(Benf_prox,2)*1e5))+' pts')
print('Fiabilidad del '+str(int(r_val**2*100))+'%')
Los beneficiones estimados serían de 82609000 pts Fiabilidad del 86%
x = t
y = Beneficios
m, b, r_val, p_val, std_err = stats.linregress(x, y)
inversion = 1998
Benf_prox = m*inversion+b
print('Los beneficiones estimados serían de '+ str(int(round(Benf_prox,2)*1e5))+' pts')
print('Fiabilidad del '+str(int(r_val**2*100))+'%')
Los beneficiones estimados serían de 78400000 pts Fiabilidad del 95%
Vamos a representar esta nueva relación
x = t
y = Beneficios
m, b, r_val, p_val, std_err = stats.linregress(x, y)
## En caso de quere una regresión de orden mayor
# fit, residuals, _,_,_ = np.polyfit(x,y,1,full=True)
fit_fn = np.poly1d([m,b]) # fit_fn es una funcion que coge X y estima Y
plt.xlim(1992,1998)
plt.plot(x,y, 'yo', x, fit_fn(x), '--k')
plt.title(u'Representación de datos de tiempo vs Beneficios')
plt.xlabel(u'tiempo / años')
plt.ylabel('Beneficios '+'$10^5 / pts$')
xticks=['1993','1994','1995','1996','1997']
plt.xticks(t,xticks)
print('Valores de la recta | '+ 'm:'+str(round(m,2))+' b:'+str(round(b,2)))
print('R^2:'+str(round(r_val**2,3)))
Valores de la recta | m:88.0 b:-175040.0 R^2:0.958
Un error muy común consiste en inferir que existe una relación causal entre dos o más eventos por haberse observado una correlación estadística entre ellos. Por ejemplo, viendo la relación de beneficios con el tiempo podríamos pensar que conforme pasan los años ganamos más pero esto es gracias a la inversión en publicidad y otros factores que no se han estudiado. Para saber más sobre este asunto Cum hoc ergo propter hoc