In [38]:
%matplotlib inline
import numpy as np
import pylab as pl
import scipy.stats as st
import pandas as pd
import datetime as dt
Es una correlacción lineal en donde se compara como varía una serie $X$ con una $Y$ de manera lineal.
$P = \frac{Cov(x,y)}{\sqrt{Var(x)}\sqrt{Var(y)}}$
Características:
- Mide únicamente la relación lineal.
- Oscila entre -1 y 1.
- Se puede ver afectada por valores atípicos fácilmente.
- si $p>0.0$ entonces la relación es positiva.
- si $p<0.0$ la relación es negativa.
- Asume normalidad.
In [7]:
data = np.arange(0,1,0.01)
y = np.sin(data)
x = np.sin(data)
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)
In [8]:
y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)
In [9]:
y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.5,0.5,len(data))
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)
In [22]:
y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.where(y>0.5)[0]
y[pos] = y[pos]-(pos/150.0)**2
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)
In [24]:
y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.random.choice(100,3)
y[pos] = y[pos]+np.random.uniform(-5,5,len(pos))
x[pos] = x[pos]+np.random.uniform(-5,5,len(pos))
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)
Se usa como una medida de correlación no paramétrica, en la cual se tiene en cuenta el orden de la serie y no sus datos, por lo que tiende a ser más estable.
$\rho = 1- \frac{6 \sum_{i=1}{N} d_{i}^{2}}{n (n^2-1)}$
Características:
- No asume normalidad.
- oscila entre -1 y 1, cuando es 0 es que no hay una correlación.
- No mide únicamente la relación lineal.
- Mide si dos variables $x_i$ y $y_i$ crecen o decresen monoliticamente.
IQ, $X_i$ | Hours of TV per week, $Y_i$ |
---|---|
106 | 7 |
86 | 0 |
100 | 27 |
101 | 50 |
99 | 28 |
103 | 29 |
97 | 20 |
113 | 12 |
112 | 6 |
110 | 17 |
IQ, $X_i$ | Hours of TV per week, $Y_i$ | rank $x_i$ | rank $y_i$ | $d_i$ | $d_i^2$ |
---|---|---|---|---|---|
86 | 0 | 1 | 1 | 0 | 0 |
97 | 20 | 2 | 6 | −4 | 16 |
99 | 28 | 3 | 8 | −5 | 25 |
100 | 27 | 4 | 7 | −3 | 9 |
101 | 50 | 5 | 10 | −5 | 25 |
103 | 29 | 6 | 9 | −3 | 9 |
106 | 7 | 7 | 3 | 4 | 16 |
110 | 17 | 8 | 5 | 3 | 9 |
112 | 6 | 9 | 2 | 7 | 49 |
113 | 12 | 10 | 4 | 6 | 36 |
In [27]:
y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
fig = pl.scatter(x,y)
Spearman, PvalueS = st.spearmanr(x,y)
print 'Spearman:' + str(Spearman)
print 'P-valor:' + str(PvalueS)
In [30]:
y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.where(y>0.2)[0]
y[pos] = y[pos]-(pos/150.0)**2
fig = pl.scatter(x,y)
Spearman, Pvalue = st.spearmanr(x,y)
print 'Spearman:' + str(Spearman)
print 'P-valor:' + str(Pvalue)
In [36]:
y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.where(y>0.2)[0]
y[pos] = y[pos]-(pos/170.0)**3
fig = pl.scatter(x,y)
Spearman, Pvalue = st.spearmanr(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'Spearman:' + str(Spearman)
In [37]:
y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.random.choice(100,3)
y[pos] = y[pos]+np.random.uniform(-5,5,len(pos))
x[pos] = x[pos]+np.random.uniform(-5,5,len(pos))
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
Spearman, Pvalue = st.spearmanr(x,y)
print 'Pearson:' + str(Pearson)
print 'Spearman:' + str(Spearman)
In [55]:
def readArchivoText(ruta):
#Lectura del archivo
f = open('Montanitas.txt','r')
L = f.readlines()
f.close()
#Procesa informacion
Dates = []
Data = []
for l in L:
Data.append(float(l.split(',')[1]))
Dates.append(dt.datetime.strptime(l.split(',')[0],'%Y-%m-%d %H:%M:%S'))
return pd.Series(Data,index=Dates)
In [56]:
Serie = readArchivoText('Montanitas.txt')
In [63]:
a = pl.hist(Serie,bins = 20)
In [68]:
a = pl.hist(Serie[Serie>1],bins = 15)
In [94]:
fig = pl.figure(figsize=(16,5))
for cont,i in enumerate(['D','M','3M','6M']):
ax = fig.add_subplot(1,4,cont+1)
ax.set_title('Escala '+i,size = 16)
Serie.resample(i,how='sum').hist(bins = 10)
In [93]:
fig = pl.figure(figsize=(16,5))
for cont,i in enumerate([2,10,25,40]):
ax = fig.add_subplot(1,4,cont+1)
ax.set_title('Para X>'+str(i),size=16)
Serie[Serie>i].hist(bins = 15)
In [121]:
x = np.random.uniform(0,1,100)
y = np.random.normal(0,1,100)
def Series2IndepentHist(x,y,bins = 12):
hx = np.histogram(x,bins = bins)[0]
hy = np.histogram(y,bins = bins)[0]
#
hxy = np.zeros((bins,bins))
for ic,i in enumerate(hx):
for jc,j in enumerate(hy):
hxy[ic,jc] = i*j
return hxy
In [122]:
hxy = Series2IndepentHist(x,y)
fig = pl.figure(figsize=(9,9))
pl.imshow(hxy,interpolation='None')
pl.colorbar(orientation='horizontal')
Out[122]:
In [124]:
fig = pl.figure(figsize=(9,9))
#hxy = Series2IndepentHist(np.random.normal(0,1,100),np.random.normal(0,1,100))
pl.imshow(Series2IndepentHist(np.random.normal(0,1,1000),np.random.normal(0,1,1000),bins=20),
interpolation='None')
Out[124]:
In [ ]:
def Hist2D(x,y,bins = 12):
RangoX = np.linspace(x.min(),x.max(),bins)
RangoY = np.linspace(y.min(),y.max(),bins)
h2d = np.zeros(12,12)
for ic,i in enumerate(x):
for jc,j in enumerate(y):
In [16]:
x = np.random.normal(0,1,1000)
y = np.random.uniform(0,1,1000)
fig = pl.figure()
a = pl.hist2d(x,y,bins=12)
fig = pl.figure()
a = pl.scatter(x,y)
In [12]:
cont = 0
for i in [1,2,4,12,2]:
print i,cont
cont-=10
In [ ]: