Primero miré las series temporales individuales de cuatro variables: sueño, estudio, socialización y estado de ánimo. Utilicé Microsoft Excel para dibujar rápidamente algunos gráficos. Representan el número diario de horas dedicadas (azul) y el promedio móvil¹ durante cinco días MA(5) (rojo), que consideré una buena medida para mi situación. La variable estado de ánimo se calificó de 10 (¡el mejor!) a 0 (¡horrible!).
Respecto a los datos contenidos en la nota a pie de página de cada parcela: el total es la suma de los valores de la serie, el significar es la media aritmética de la serie, la ETS es la desviación estándar y la desviación relativa es la ETS dividida por la media.
Teniendo todo en cuenta, dormí bastante bien. Tuve días difíciles, como todos, pero creo que la tendencia es bastante estable. De hecho, es uno de los que menos varían de mi estudio.
Estas son las horas que dediqué a mi carrera académica. Fluctúa mucho: encontrar el equilibrio entre el trabajo y el estudio a menudo significa tener que abarrotar proyectos los fines de semana, pero aun así me considero satisfecho con ello.
Respecto a esta tabla lo único que puedo decir es que estoy sorprendido. El total general es mayor de lo que esperaba, dado que soy introvertido. Por supuesto, las horas con mis compañeros de la universidad también cuentan. En términos de variabilidad, el STD es realmente elevado, lo que tiene sentido dada la dificultad de tener una rutina establecida en cuanto a socialización.
Esta es la serie menos variable: la desviación relativa es la más baja entre las variables estudiadas. A priori, Estoy satisfecho con la tendencia observada. Creo que es positivo mantener un estado de ánimo bastante estable, y aún mejor si es bueno.
Después de observar las tendencias de las principales variables, decidí profundizar más y estudiar las posibles correlaciones² entre ellas. Dado que mi objetivo era poder modelar y predecir matemáticamente (o al menos explicar) “Estado de ánimo”, las correlaciones fueron una métrica importante a considerar. De ellos podría extraer relaciones como las siguientes: “los días que más estudio son los que menos duermo”, “suelo estudiar idiomas y música juntos”, etc.
Antes de hacer cualquier otra cosa, abramos un archivo Python e importemos algunas bibliotecas clave del análisis de series. Normalmente uso alias para ellos, ya que es una práctica común y hace que las cosas sean menos detalladas en el código real.
import pandas as pd #1.4.4
import numpy as np #1.22.4
import seaborn as sns #0.12.0
import matplotlib.pyplot as plt #3.5.2
from pmdarima import arima #2.0.4
Haremos dos estudios diferentes en cuanto a correlación. Analizaremos el coeficiente de correlación de personas³ (para relaciones lineales entre variables) y el coeficiente de correlación de Spearman⁴ (que estudia relaciones monótonas entre variables). Usaremos su implementación⁵ en pandas.
Matriz de correlación de Pearson
El coeficiente de correlación de Pearson entre dos variables X y Y se calcula de la siguiente manera:
Podemos calcular rápidamente una matriz de correlación, donde se calcula cada posible correlación por pares.
#read, select and normalize the data
raw = pd.read_csv("final_stats.csv", sep=";")
numerics = raw.select_dtypes('number')#compute the correlation matrix
corr = numerics.corr(method='pearson')
#generate the heatmap
sns.heatmap(corr, annot=True)
#draw the plot
plt.show()
Esta es la matriz de correlación de Pearson sin procesar obtenida de mis datos.
Y estos son los valores significativos⁶: los que, con un 95% de confianza, son diferentes de cero. Realizamos una prueba t⁷ con la siguiente fórmula. Para cada valor de correlación rho, lo descartamos si:
dónde norte es el tamaño de la muestra. Podemos reciclar el código de antes y agregar este filtro.
#constants
N=332 #number of samples
STEST = 2/np.sqrt(N)def significance_pearson(val):
if np.abs(val)<STEST:
return True
return False
#read data
raw = pd.read_csv("final_stats.csv", sep=";")
numerics = raw.select_dtypes('number')
#calculate correlation
corr = numerics.corr(method='pearson')
#prepare masks
mask = corr.copy().applymap(significance_pearson)
mask2 = np.triu(np.ones_like(corr, dtype=bool)) #remove upper triangle
mask_comb = np.logical_or(mask, mask2)
c = sns.heatmap(corr, annot=True, mask=mask_comb)
c.set_xticklabels(c.get_xticklabels(), rotation=-45)
plt.show()
Aquellos que han sido descartados podrían ser simplemente ruido y representar erróneamente tendencias o relaciones. En cualquier caso, es mejor asumir que una relación verdadera no tiene sentido que considerar significativa una que no lo es (se prefiere lo que llamamos error tipo II sobre el error tipo I). Esto es especialmente cierto en un estudio con mediciones bastante subjetivas.
Coeficiente de correlación de rangos de Spearman
El coeficiente de correlación de Spearman se puede calcular de la siguiente manera:
Como hicimos antes, podemos calcular rápidamente la matriz de correlación:
#read, select and normalize the data
raw = pd.read_csv("final_stats.csv", sep=";")
numerics = raw.select_dtypes('number')#compute the correlation matrix
corr = numerics.corr(method='spearman') #pay attention to this change!
#generate the heatmap
sns.heatmap(corr, annot=True)
#draw the plot
plt.show()
Esta es la matriz de correlación de rangos de Spearman obtenida de mis datos:
Veamos qué valores son realmente significativos. La fórmula para comprobar la significancia es la siguiente:
Aquí, filtraremos todos los valores t superiores (en valor absoluto) a 1,96. Una vez más, la razón por la que se han descartado es que no estamos seguros de si se trata de ruido (azar) o de una tendencia real. Vamos a codificarlo:
#constants
N=332 #number of samples
TTEST = 1.96
def significance_spearman(val):
if val==1:
return True
t = val * np.sqrt((N-2)/(1-val*val))
if np.abs