Medidas de Correlación

Correlaciones paramétricas:

  • Pearson.

Correlaciones no paramétricas:

  • Mann Kendall.
  • Spearman.
  • Información mutua.

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

Definición de Pearson.

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)


Pearson:1.0
P-valor:0.0

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)


Pearson:0.974262377171
P-valor:3.22851500598e-65

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)


Pearson:0.648371244826
P-valor:3.02989950926e-13

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)


Pearson:0.844113465885
P-valor:2.80736484788e-28

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)


Pearson:0.789062057836
P-valor:1.85241771585e-22

Definición de Spearman.

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)


Spearman:0.974281428143
P-valor:3.11488667475e-65

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)


Spearman:0.930297029703
P-valor:1.78164364453e-44

Pearson Vs Spearman.


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)


Pearson:0.964133836134
Spearman:0.976225622562

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)


Pearson:0.187596038696
Spearman:0.887500750075

Histogramas

  • Simples $f(x)$.
  • Conjuntos $p(x,y)$.
  • Independientes: $f(x)g(y)$
  • Escaldado: $\frac{p(x,y)}{f(x)g(y)}$
  • Dependen en gran medida de la selección de intervalos o bins
  • Muestran la forma en que se distribuyen los datos.

Simples

  • Se construyen unicamente a partir de un conjunto de datos.
  • Sensibles a la cantidad de datos y a la cantidad de intervalos
  • Pueden representar si los datos presentan o no una distribución clara.
  • No simpre son explicados por una función contínua del tipo $f(x)$

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')

Histograma con muchos datos iguales


In [63]:
a = pl.hist(Serie,bins = 20)



In [68]:
a = pl.hist(Serie[Serie>1],bins = 15)


Límite central en la lluvia


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)


Histogramas dentro de histogramas


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)


Independientes

$h = f(x)g(y)$

En este tipo de histogramas no se tiene en cuenta la ocurrencia de ambos eventos de forma simultánea, es decir independiente de que $y$ ocurra o no su probabilidad de ocurrencia es multiplicada por la probabilidad de $x$.


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]:
<matplotlib.colorbar.Colorbar instance at 0x7f51ceea5518>

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]:
<matplotlib.image.AxesImage at 0x7f51cebb6490>

Histogramas conjuntos

A diferencia del histograma independiente, en este se presenta la probabilidad de ocurrencia de un suceso sólo en el caso en que el otro suceso ocurre de manera simultánea. Cuando este histograma es igual al histograma independiente se dice que las variables son independientes


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


1 0
2 -10
4 -20
12 -30
2 -40

In [ ]: