Mis estadísticas de vida Seguí mis hábitos durante un año y esto es lo que aprendí

Mis estadísticas de vida Seguí mis hábitos durante un año y esto es lo que descubrí

Medí el tiempo que pasé en mis actividades diarias (estudiar, hacer deporte, socializar, dormir…) durante 332 días consecutivos

¿Por qué? ¿Por qué haría esto?

Este es probablemente el experimento más largo y que más tiempo me ha llevado en mi vida. Además, tiene poca importancia científica, ya que la muestra de población es solo una persona, y es altamente subjetivo (se basa completamente en mi memoria y percepción del tiempo).

Entonces, ¿por qué hacer esto? Las rutinas, al igual que cualquier otro método de rendición de cuentas personal, me ayudan en muchas formas diferentes. Comencé esto en un momento bajo de mi vida, tratando de estudiarme a mí misma y cómo diferentes hábitos podrían estar afectando mi estado de ánimo y salud mental. El objetivo era poder “hackear” mi propio cerebro: si sabía, estadísticamente, qué me hacía feliz y saludable a largo plazo (¡y qué hacía lo contrario!), podría mejorar mi vida y potencialmente dar consejos o ayudar a personas similares a mí que estén pasando por momentos difíciles.

¿Y por qué te importaría esto a ti?

Creo que este ejercicio introspectivo es un gran ejemplo de cómo la ciencia de datos se puede aplicar a cualquier cosa. Por supuesto, no tiene que ser este tipo de seguimiento y registro. Puedes estudiar cualquier cosa que encuentres valiosa en tu vida: rastrear el comportamiento de tu mascota, el clima de tu ciudad, la tasa de retraso en el sistema de transporte público local… Hay muchas análisis personales por hacer: si hay un conjunto de datos, ¡puedes estudiarlo! Afortunadamente, los datos están en todas partes, solo necesitas buscar en el lugar correcto y realizar un seguimiento de ellos.

El método: ¿qué hice y cómo lo hice?

Reservé algunos minutos todos los días para tomar notas personales sobre lo que hice y llevar un registro del tiempo dedicado (en horas) a diferentes actividades y categorías.

Las variables que medí cambiaron un poco a lo largo del año: algunas nuevas aparecieron, otras desaparecieron y otras se fusionaron. Las variables finales, y las que tienen datos en todos los registros de tiempo, son las siguientes: Sueño, Escritura, Estudio, Deporte, Música, Higiene, Idiomas, Lectura, Socialización y Estado de ánimo, un total de diez variables que cubren lo que considero los aspectos más importantes de mi vida.

Exploración inicial de los datos

Primero revisé las series de tiempo 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¹ de cinco días MA(5) (rojo) que consideré una buena medida para mi situación. La variable de estado de ánimo se calificó de 10 (¡el mejor!) a 0 (horrible).

En cuanto a los datos contenidos en la nota al pie de cada gráfico: el total es la suma de los valores de la serie, la media es la media aritmética de la serie, la DES es la desviación estándar y la desviación relativa es la DES dividida por la media.

Total: 2361h. Media: 7,1h. DES: 1,1h. Desviación relativa: 15,5% (imagen por el autor).

En general, me fue bastante bien con el sueño. Tuve días difíciles, como todos los demás, pero creo que la tendencia es bastante estable. De hecho, es uno de los aspectos menos variables de mi estudio.

Total: 589,1h. Media: 1,8h. DES: 2,2. Desviación relativa: 122% (imagen por el autor).

Estas son las horas que he dedicado a mi carrera académica. Varía mucho: encontrar el equilibrio entre el trabajo y el estudio a menudo significa tener que hacer proyectos los fines de semana. Aun así, me considero satisfecho con ello.

Total: 1440,9h. Media: 4,3h. Desviación estándar: 4,7h. Desviación relativa: 107% (imagen por autor).

Respecto a esta tabla, solo puedo decir que estoy sorprendido. El total es mayor de lo que esperaba, dado que soy introvertido. Por supuesto, también se cuentan las horas con mis colegas en la universidad. En cuanto a la variabilidad, la desviación estándar es realmente alta, lo cual tiene sentido dada la dificultad de tener una rutina establecida en cuanto a socializar.

Media: 8,0h. Desviación estándar: 0,9h. Desviación relativa: 11,3% (imagen por autor).

Esta es la serie menos variable: la desviación relativa es la más baja entre mis 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.

Estudio de correlación

Después de analizar las tendencias de las principales variables, decidí profundizar y estudiar las posibles correlaciones² entre ellas. Ya que mi objetivo era poder modelar y predecir matemáticamente (o al menos explicar) el “Estado de ánimo”, las correlaciones eran una métrica importante a considerar. A partir de ellas, podría extraer relaciones como las siguientes: “los días en los que estudio más son los días en los que duermo menos”, “suelo estudiar idiomas y música juntos”, etc.

Antes de hacer cualquier otra cosa, abramos un archivo de Python e importemos algunas bibliotecas clave para el análisis de series. Normalmente les asigno alias, ya que es una práctica común y hace que el código sea menos verboso.

import pandas as pd               #1.4.4import numpy as np                #1.22.4import seaborn as sns             #0.12.0import matplotlib.pyplot as plt   #3.5.2from pmdarima import arima        #2.0.4

Haremos dos estudios diferentes en relación a la correlación. Analizaremos el coeficiente de correlación de Pearson³ (para relaciones lineales entre variables) y el coeficiente de correlación de Spearman⁴ (que estudia relaciones monótonas entre variables). Utilizaremos su implementación⁵ en pandas.

Matriz de correlación de Pearson

El coeficiente de correlación de Pearson entre dos variables X e Y se calcula de la siguiente manera:

donde cov es la covarianza, sigma X es la desviación estándar de X y sigma Y es la desviación estándar de Y

Podemos calcular rápidamente una matriz de correlación, donde se calcula cada posible correlación por pares.

#leer, seleccionar y normalizar los datosraw = pd.read_csv("estadisticas_finales.csv", sep=";")numerics = raw.select_dtypes('number')#calcular la matriz de correlacióncorr = numerics.corr(method='pearson')#generar el mapa de calor de la correlaciónsns.heatmap(corr, annot=True)#dibujar el gráficoplt.show()

Esta es la matriz de correlación de Pearson en bruto obtenida a partir de mis datos.

Matriz de correlación de Pearson para mis variables (imagen por autor).

Y estos son los valores significativos⁶, aquellos que son diferentes de cero con un 95% de confianza. Realizamos una prueba t⁷ con la siguiente fórmula. Para cada valor de correlación rho, lo descartamos si:

donde n es el tamaño de la muestra. Podemos reutilizar el código anterior y agregar este filtro.

#constantsN=332 #número de muestrasSTEST = 2/np.sqrt(N)def significance_pearson(val):    if np.abs(val)<STEST:        return True    return False#read dataraw = pd.read_csv("final_stats.csv", sep=";")numerics = raw.select_dtypes('number')#calculate correlationcorr = numerics.corr(method='pearson')#prepare masksmask = corr.copy().applymap(significance_pearson)mask2 = np.triu(np.ones_like(corr, dtype=bool)) #remover triangulo superiormask_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 solo ruido y representar incorrectamente tendencias o relaciones. En cualquier caso, es mejor asumir que una relación verdadera es insignificante que considerar una relación significativa que no lo es (lo que nos referimos como error tipo II se prefiere sobre error tipo I). Esto es especialmente cierto en un estudio con mediciones bastante subjetivas.

Matriz de correlación de Pearson filtrada. Se han filtrado los valores no significativos (y el triángulo superior). (imagen del autor)

Coeficiente de correlación por rango de Spearman

El coeficiente de correlación de Spearman se puede calcular de la siguiente manera:

donde R indica la variable de rango⁸ - las demás variables son las mismas que se describen en el coeficiente de Pearson.

Como hicimos antes, podemos calcular rápidamente la matriz de correlación:

#read, select and normalize the dataraw = pd.read_csv("final_stats.csv", sep=";")numerics = raw.select_dtypes('number')#compute the correlation matrixcorr = numerics.corr(method='spearman') #preste atención a este cambio!#generate the heatmapsns.heatmap(corr, annot=True)#draw the plotplt.show()

Esta es la matriz de correlación de Spearman sin procesar obtenida a partir de mis datos:

Matriz de correlación de Spearman para mis variables (imagen del autor).

Vamos a ver qué valores son realmente significativos. La fórmula para verificar la significancia es la siguiente:

donde r es el coeficiente de Spearman. Aquí, t sigue una distribución t-student con n-2 grados de libertad.

Aquí, filtraremos todos los valores de t que sean mayores (en valor absoluto) que 1.96. Nuevamente, la razón por la que se han descartado es que no estamos seguros de si son ruido, una casualidad aleatoria, o una tendencia real. Vamos a programarlo:

#constantsN=332 #número de muestrasTTEST = 1.96def signficancia_spearman(val):    if val==1:        return True    t = val * np.sqrt((N-2)/(1-val*val))        if np.abs(t)<1.96:        return True    return False#leer dataraw = pd.read_csv("final_stats.csv", sep=";")numerics = raw.select_dtypes('number')#calcular correlacióncorr = numerics.corr(method='spearman')#preparar máscarasmascara = corr.copy().applymap(signficancia_spearman)mascara2 = np.triu(np.ones_like(corr, dtype=bool)) #quitar triángulo superiormascara_comb = np.logical_or(mascara, mascara2)#graficar los resultadosc = sns.heatmap(corr, annot=True, mask=mascara_comb)c.set_xticklabels(c.get_xticklabels(), rotation=-45)plt.show()

Estos son los valores significativos.

Matriz de correlación con valores significativos. (imagen del autor)

Creo que este gráfico explica mejor las relaciones aparentes entre variables, ya que su criterio es más “natural” (considera funciones y relaciones monótonas⁹, y no solo lineales). No se ve tan afectado por valores atípicos como el otro (un par de días muy malos relacionados con una cierta variable no afectarán al coeficiente de correlación general).

Aún así, dejaré ambos gráficos para que los lectores juzguen y saquen sus propias conclusiones.

Estudios de series temporales – Modelos ARIMA

Podemos tratar estos datos como una serie temporal. El tiempo podría ser un factor importante al explicar variables: algunas de ellas podrían fluctuar periódicamente, o incluso tener autocorrelación¹⁰. Por ejemplo, una mala noche podría hacerme sentir somnoliento y provocar que duerma demasiado al día siguiente, eso sería una correlación en función del tiempo. En esta sección, me centraré solo en las variables de la exploración inicial.

Exploremos el modelo ARIMA y encontremos un ajuste adecuado para nuestros datos. Un modelo ARIMA¹¹ es una combinación de un modelo autoregresivo (AR¹²) y un promedio móvil, de ahí sus siglas (Auto Regresivo Integrado de Promedio Móvil). En este caso, utilizaremos el método auto_arima de pmdarima, una función inspirada en la función “forecast::autoarima” de R, para determinar los coeficientes de nuestro modelo.

for v in ['Sleep','Studying','Socializing','Mood']:    arima.auto_arima(numerics[v], trace=True) #trace=True para ver resultados

Los resultados se han resumido en la siguiente tabla:

Modelos ARIMA(p,d,q) con su correspondiente AIC (imagen del autor).

Sorprendentemente, Sleep no es autoregresivo, ¡pero Mood parece serlo! Como podemos ver, un simple ARIMA(1,0,0) – un AR(1) – representa bastante bien a Mood. Esto implica que el Mood del día D se explica por el Mood del día D-1, o el día anterior, y algún ruido distribuido normalmente.

A pesar de parecer pequeña, esta consecuencia es lo suficientemente interesante. Studying también es autoregresivo, pero sigue un ARIMA(1,0,2) – lo que significa que no sigue directamente una tendencia, pero su promedio móvil sí. Sin embargo, el AIC¹³ para este modelo es considerablemente más alto, por lo que es posible que el modelo esté complicando demasiado la explicación del comportamiento observado.

FFT – Transformada Rápida de Fourier

Podemos utilizar una Transformada Discreta de Fourier¹⁴ para analizar nuestros datos. Con esto, deberíamos poder notar cualquier patrón relacionado con la estacionalidad. La Transformada de Fourier es una operación de transformación de datos capaz de descomponer una serie en sus componentes base. Esto se puede entender mejor a través de la siguiente imagen:

El proceso (simplificado) de la Transformada de Fourier (imagen del autor)

Aquí tienes otro ejemplo: Tenemos una señal compuesta por dos funciones seno con frecuencia 1 y 10 respectivamente. Después de aplicar la Transformada de Fourier, obtenemos esto:

Como podemos ver, la FFT descompone las señales en sus componentes de frecuencia (imagen de Wikimedia Commons)

El resultado es una gráfica con dos picos, uno en x=1 y otro en x=10. ¡La Transformada de Fourier ha encontrado los componentes base de nuestra señal!

Traduzcamos esto al código:

for v in ['Dormir','Estudiar','Socializar','Estado de ánimo']:    t = np.arange(0,N,1)    x = numerics[v]    X = np.fft.fft(x)    n = np.arange(0,len(X),1)    T = N    freq = n/T     plt.figure(figsize = (8, 4))    plt.subplot(121)    plt.plot(t, x, 'r')    plt.xlabel('Tiempo (días)')    plt.ylabel(v)    plt.subplot(122)    plt.stem(n, np.abs(X), 'b', markerfmt=" ", basefmt="-b")    plt.xlabel('Frec (1/días)')    plt.ylabel('FFT |X(freq)|')    plt.xlim(0, 30)    plt.ylim(0, 500)    plt.tight_layout()    plt.show()

Volviendo a nuestro estudio de caso, estos son los resultados que nuestro código arroja:

De izquierda a derecha y de arriba a abajo: gráficas para Dormir, Estudiar, Socializar y Estado de ánimo. (imagen del autor)

Podemos observar que Dormir tiene un valor significativo en la frecuencia 1, lo que significa que los datos siguen un ciclo de 1 día, lo cual no es muy útil. Estudiar también presenta valores interesantes: los primeros cinco o así son notablemente más altos que los demás. Desafortunadamente, el ruido se hace cargo de ellos y de cada otra gráfica, por lo que no se puede obtener ninguna conclusión con certeza.

Para contrarrestarlo, filtramos el ruido con un promedio móvil. Intentemos aplicar MA(5) nuevamente y estudiar la FFT. El código será casi el mismo, excepto por el promedio móvil.

def promedio_movil(x, w):    return np.convolve(x, np.ones(w), 'valid') / wk = 5for v in ['Dormir','Estudiar','Socializar','Estado de ánimo']:    t = np.arange(0,N-k+1,1)    x = promedio_movil(numerics[v], k)    X = np.fft.fft(x)    n = np.arange(0,len(X),1)    T = N-k+1    freq = n/T    plt.figure(figsize = (8, 4))    plt.subplot(121)    plt.plot(t, x, 'r')    plt.xlabel('Tiempo (días)')    plt.ylabel(v)    plt.subplot(122)    plt.stem(n, np.abs(X), 'b', markerfmt=" ", basefmt="-b")    plt.xlabel('Frec (1/días)')    plt.ylabel('FFT |X(freq)|')    plt.xlim(0, 30)    plt.ylim(0, 500)    plt.tight_layout()    plt.show()

Estas son las gráficas generadas por nuestro código:

De izquierda a derecha y de arriba a abajo: gráficas para Dormir, Estudiar, Socializar y Estado de ánimo. (imagen del autor)

Después de aplicar el MA, el ruido se ha reducido ligeramente. Aún así, parece que no se pueden extraer conclusiones de esto, no encontramos valores de frecuencia significativos y claros.

Conclusiones

Después de realizar diferentes estudios estadísticos, podemos concluir lo esperado: el comportamiento humano es muy complicado, más, por supuesto, de lo que una hoja de Excel y un par de modelos matemáticos pueden explicar. Sin embargo, hay valor en la recopilación metódica de datos y las oportunidades de análisis que surgen de ella. Echemos un vistazo rápido a lo que hemos hecho:

  • Resumen de datos en bruto y tendencias.
  • Análisis de correlación de Pearson y Spearman y pruebas de significancia.
  • Ajuste de modelo ARIMA.
  • Descomposición de la Transformada Rápida/Discreta de Fourier.

Después de hacer estos análisis, pudimos obtener algunas ideas sobre nuestros datos y cómo las diferentes variables se correlacionan entre sí. Aquí está el resumen de nuestros hallazgos.

  • En términos de desviación relativa (variabilidad), el Estado de Ánimo y el Sueño fueron los más bajos (11.3%, 15.5% respectivamente), mientras que el Estudio y la Socialización estaban por encima del 100%.
  • Se encontró que la Socialización estaba correlacionada negativamente con casi todos mis hobbies, pero correlacionada positivamente con mi Estado de Ánimo (tanto en Pearson como en Spearman). Esto se debe probablemente a que cuando me encuentro con amigos o familiares, tengo que dejar de lado mis hobbies por el día, pero generalmente soy más feliz que cuando estoy solo.
  • El Estado de Ánimo y la Escritura estaban correlacionados negativamente (Spearman), lo cual se explica por el hecho de que a veces desahogo mis problemas a través de historias cortas o escribiendo en mi diario.
  • Se encontró que el Estado de Ánimo y el Estudio eran autorregresivos según el ajuste del modelo ARIMA, lo que implica que el valor en un cierto día puede explicarse por el día anterior.
  • No se pudo encontrar una descomposición clara con la Transformada Discreta de Fourier, aunque algunos grupos de frecuencias se destacaron sobre otros.

También es digno de mención que obtenemos estadísticas interesantes “globales”, que si bien no tienen un significado científico, son interesantes de conocer.

A nivel personal, creo que este experimento me ha sido útil. Incluso si los resultados finales no son concluyentes, creo que me ayudó a sobrellevar los malos momentos y hacer un seguimiento de los buenos. Del mismo modo, creo que siempre es positivo hacer algo de introspección y conocerse un poco mejor a uno mismo.

Como último detalle, este es el gráfico acumulativo, hecho nuevamente en MS Excel, para todas las variables que se pueden acumular (cada una excepto el estado de ánimo e higiene, que no se cuentan en horas sino en un cierto ranking; y el sueño). Decidí representarlo como un gráfico logarítmico porque incluso si las variables acumuladas eran lineales, las diferentes pendientes dificultaban al espectador ver los datos. ¡Eso es todo! ¡Disfrútenlo!

Suma acumulativa de cada serie, eje Y logarítmico. (imagen del autor)

Como siempre, te animo a comentar cualquier pensamiento o duda que puedas tener.

El código y los datos están en mi Github.

GitHub – Nerocraft4/habittracker

Contribuye al desarrollo de Nerocraft4/habittracker creando una cuenta en GitHub.

github.com

Referencias

[1] Wikipedia. Media móvil. https://es.wikipedia.org/wiki/Media_móvil

[2] Wikipedia. Correlación. https://es.wikipedia.org/wiki/Correlación_(estadística)

[3] Wikipedia. Coeficiente de correlación de Pearson. https://es.wikipedia.org/wiki/Coeficiente_de_correlación_de_Pearson

[4] Wikipedia. Coeficiente de correlación de rangos de Spearman. https://es.wikipedia.org/wiki/Coeficiente_de_correlación_de_rangos_de_Spearman

[5] Documentación de Pandas. pandas.DataFrame.corr. https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.corr.html

[6] Wikipedia. Significación estadística. https://es.wikipedia.org/wiki/Significación_estadística

[7] Wikipedia. Prueba t de Student. https://es.wikipedia.org/wiki/Prueba_t_de_Student

[8] Wikipedia. Correlación de rangos. https://es.wikipedia.org/wiki/Correlación_de_rangos

[9] Wolfram MathWorld. Función monótona. https://mathworld.wolfram.com/MonotonicFunction.html

[10] Wikipedia. Autocorrelación. https://es.wikipedia.org/wiki/Autocorrelación

[11] Wikipedia. Media móvil autorregresiva integrada. https://es.wikipedia.org/wiki/Media_móvil_autorregresiva_integrada

[12] Wikipedia. Modelo autorregresivo. https://es.wikipedia.org/wiki/Modelo_autorregresivo

[13] Science Direct. Criterio de Información de Akaike. https://www.sciencedirect.com/topics/social-sciences/akaike-information-criterion

[14] Wikipedia. Transformada discreta de Fourier. https://es.wikipedia.org/wiki/Transformada_discreta_de_Fourier

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

CEO de OpenAI, Sam Altman Empleos en riesgo a medida que la IA demuestra su poderío

El CEO de OpenAI, Sam Altman, ha expresado públicamente sus preocupaciones sobre los posibles peligros de la intelige...

Aprendizaje Automático

El Programa MIT-Takeda entra en su cuarto año con una cosecha de 10 nuevos proyectos.

El programa aprovecha la experiencia en investigación del MIT y el conocimiento industrial de Takeda para investigar ...

Inteligencia Artificial

Conoce a CityDreamer Un modelo generativo compositivo para ciudades 3D ilimitadas

La creación de entornos naturales en 3D ha sido objeto de mucha investigación en los últimos años. Se han realizado a...

Inteligencia Artificial

Implementa modelos de ML construidos en Amazon SageMaker Canvas en los puntos finales de tiempo real de Amazon SageMaker.

Amazon SageMaker Canvas ahora admite implementar modelos de aprendizaje automático (ML) en puntos finales de inferenc...

Inteligencia Artificial

Potenciando la IA en Dispositivos Qualcomm y Meta colaboran con la tecnología Llama 2

El lanzamiento de Llama 2, la nueva versión de código abierto de Meta, ha generado discusiones sobre los casos de uso...