Share on twitter
Share on linkedin
Share on telegram
Share on facebook
Share on whatsapp
Share on email

Media, varianza y otros conceptos estadísticos

En la anterior entrada introducíamos la econometría como la rama de la economía que utiliza modelos matemáticos y estadísticos para el estudio. Así, comenzamos introduciendo una serie de conceptos estadísticos básicos tales como población, muestra, tipos de escalas, qué son las variables y qué son los datos, etc.

Hoy vamos a entrar en profundidad en aspectos más prácticos. Hablaremos de la media, la varianza, la desviación típica, el coeficiente de variación y otros conceptos ampliamente utilizados en econometría o análisis cuantitativo. Veremos también cómo podemos construir nuestros algoritmos para realizar nuestro análisis cuantitativo en Python.

Valores medios y desviaciones

La media

Cuando analizamos un conjunto de datos, tendemos a pensar, inconscientemente, que los valores que más se repiten será el valor más probable. Imaginemos que estamos analizando una empresa y vemos que en los últimos 10 años, sus gastos operativos han sido los siguientes:

AñoGastos operativos
Año 1103.000 €
Año 2100.000 €
Año 3105.000 €
Año 495.000€
Año 597.500 €
Año 6102.500 €
Año 7110.000 €
Año 890.000 €
Año 9100.500 €
Año 1097.000 €

¿Qué parece más probable, que en el año 11 los gastos operativos estén más cerca de 200.000 € o de 100.000 €?

Imagino que todos estaremos de acuerdo en que resulta más lógico pensar que el año 11 los gastos operativos estén en torno los 100.000 €.

Esto que intuitivamente ocurre de forma inmediata, matemáticamente es el proceso de sumar un conjunto de datos de una misma variable en diferentes situaciones o momentos y dividirlo entre el número de datos que tenemos, y recibe el nombre de media o promedio.

Así es cómo podemos calcular la media o el promedio en Python:


gastos_operativos = [103000,100000,105000,95000,97500,102500,110000,90000,100500,97000] # Creamos una lista que incluya los datos que toma nuestra variable

def calc_media(valores):
  suma = sum(valores) # Calculamos la suma de todos los datos de la lista
  n = len(valores) # Calculamos el tamaño de la lista que será el número de datos que contiene
  media = suma / len(valores) # Calculamos la media dividiendo la suma de los valores de la lista entre el tamaño de la lista
  return media

media = calc_media(gastos_operativos)

Sin embargo, la librería Numpy ya incluye una función que calcula la media:

import numpy as np # Importamos la librería
media = np.mean(gastos_operativos)

Utilizando los algoritmos escritos la media del conjunto de datos que hemos utilizado en el ejemplo anterior sería 100.050 €, por lo que los valores estarán en torno esa cifra.

Media ponderada

¿Qué pasa si yo le quiero dar mayor importancia a un dato que a otro? A veces nos interesa que un valor tenga más importancia que otro, por ejemplo en la construcción de carteras. Imaginemos ahora que tenemos cinco activos en los que queremos invertir y que su rentabilidad media anual en los últimos 5 años en la siguiente:

ActivoRentabilidad anual media de 5 años
Activo 110%
Activo 25%
Activo 315%
Activo 47,5%
Activo 520%

Si calculamos la media como la hemos calculado hasta ahora (media aritmética) obtendríamos una rentabilidad media de nuestra que cartera del 11,5% anual con una desviación típica de 5,38%, es decir, podemos esperar que la rentabilidad de nuestra cartera esté entre el 6,12% y el 16,88%. Sin embargo, esta media es una media donde todos los valores tienen el mismo peso, en concreto 1/n (por eso dividimos la suma de los valores entre n, si en lugar de dividir entre n multiplicamos cada valor por 1/n y lo sumamos el resultado será el mismo), en nuestro caso un 20% cada uno. Pero si nuestra cartera la queremos construir con pesos diferentes a un 20% cada uno, esta media ya no nos valdría.

Para calcular la media ponderada, tenemos que, en lugar de dividir la suma de todos los datos entre n, dándole así un peso de 1/n a cada dato, multiplicar el peso que cada dato tendrá por el dato en sí, asegurándonos siempre que la suma de los pesos sea igual a 1 (si lo hacemos en tanto por 1) o 100 (si lo hacemos en porcentaje). En nuestro caso, los pesos que le vamos a dar a cada activo van a ser los siguientes:

ActivoPonderaciones
Activo 125%
Activo 225%
Activo 315%
Activo 415%
Activo 520%

La forma de calcularlo en Python es la siguiente:

rentabilidades_medias = [0.10,0.05,0.15,0.075,0.20] # Creamos una lista con las rentabilidades medias de cada activo
ponderaciones = [0.25,0.25,0.15,0.15,0.20] # Creamos una lista con los pesos que cada activo tendrá. Es importante que sigan el orden que sigue la lista de los datos ya que la multiplicación será por posición en la lista

def calc_media_ponderada(valores, ponderaciones):
  valores_ponderados = [] # Creamos una lista donde añadiremos el resultado de multiplicar cada dato por su peso
  for i in range(len(rentabilidades_medias)): # Creamos un bucle que se repetirá n veces donde n es la longitud o el tamaño de la lista
    valores_ponderados.append(rentabilidades_medias[i] * ponderaciones[i]) # Como cada vuelta el valor de i irá de 0 a n - 1, lo utilizamos para acceder a la posición i, es decir, la primera vuelta i valdrá 0 y accederemos al valor de rentabilidades_medias[0] que será el primer valor de esa lista y al valor de ponderaciones [0]
 que será el primer valor de esa lista
  media_ponderada = sum(valores_ponderados) # Calculamos la media ponderada a través de la suma de los valores ponderados
  return media_ponderada

media_ponderada = calc_media_ponderada(rentabilidades_medias, ponderaciones)

De esta forma la media ponderada difiere de la media aritmética, siendo un 11,13% frente al 11,50% que nos había dado anteriormente.

De esta forma, podemos calcular de forma más precisa la media de un conjunto de datos asignando a cada dato un peso.

Media geométrica

Esta es la forma de calcular la media que más nos interesa como analistas financieros, ya que es la forma más precisa a la hora calcular tasas de crecimiento medios o retornos medios o cualquier tipo de análisis comparativo de una misma variable en distintos periodos de tiempo.

Para obtener la media geométrica vamos a calcular la raíz de n del producto de todos los datos, o más sencillo, multiplicamos los números y los elevamos a 1/n, siendo de nuevo n el número de datos.

En Python la forma de obtener la media geométrica es la siguiente:

def calc_media_geometrica(valores):
  valores_multiplicados = np.prod(valores) # Utilizamos el metodo prod de la librería Numpy para multiplicar los elementos de una lista
  media_geometrica = valores_multiplicados ** (1/len(valores)) # Calculamos la media geométrica elevando por 1/n el valor resultante de multiplicar los elementos de la lista
  return media_geometrica

Las principales desventajas que tiene esta forma de calcular la media es que no admite valores negativos, ya que la raíz de un valor negativo no existe por definición, y que no hay forma de ponderar o dar mayor importancia a unos datos frente a otros.

Respecto el primer inconveniente se soluciona únicamente sumando uno a cada dato y calcular la media geométrica de estos nuevos datos tal y como hemos hecho anteriormente. Esto nos daría como solución 1 + la media geométrica, por lo que para obtener la media geométrica simplemente tenemos que restar 1 al resultado.

Sin embargo, el segundo problema no tiene solución, por lo que es una limitación que tenemos y uno de los motivos por los que se usa mayoritariamente para calcular tasas de crecimiento compuestas. No se si alguna vez habrás visto que en algunos informes aparece el término CAGR. Estas son las siglas de Compounded Anual Growth Rate y se obtiene precisamente calculando la media geométrica de un conjunto de tasas de crecimiento.

Para ver de nuevo un ejemplo práctico, vamos a utilizar los datos del ejemplo anterior, pero ahora en lugar de ser rentabilidades medias de cada activo son crecimientos de ventas de una empresa año a año:

ActivoCrecimiento de ventas respecto el año anterior
Año 110%
Año 25%
Año 315%
Año 47,5%
Año 520%

Calculando la media aritmética obtenemos un valor de 10,24% de crecimiento medio lo cual también lo podemos llamar un 10.24% CAGR (ahora ya te puedes creer un analista financiero profesional 😉).

La varianza y la desviación típica

Ya sabemos lo qué es la media, qué significado tiene y diferentes formas de calcularlo en función de nuestras necesidades. El resultado es un número que representa lo normal dentro de esa muestra. Hemos puesto ejemplos de ingresos medios, de retornos medios y de crecimientos medios, aplicando para cada caso un método diferente.

Sin embargo, ¿cuánto podemos esperar que se desvíe esa cifra?, es decir, ¿cuántos euros arriba o abajo de la media podríamos esperar que se desvíe de la media el dato del año que viene? Como vemos en el ejemplo expuesto al principio, aunque la media nos haya dado 100.050 €, lo cierto es que ha habido años donde el valor era de 110.000 €, otros de 90.000 € y diversas cifras que no coincidían con la media. Vemos, por tanto, que la media por si sola no nos dice nada, simplemente nos vale para descartar que el dato del año que viene estará más cerca de 200.000 € que de 100.000 €, porque la media es de 100.050 €.

El complemento que necesitamos es la desviación típica. Como dice el nombre, la desviación típica es lo que se suelen desviar los datos del valor medio y se forma de calcularlo es precisamente viendo esas diferencias entre cada dato y la media y calcular la media de esas diferencias.

Sin embargo, la suma de esas diferencias, que se calculan restando a cada valor la media, dará 0 siempre, ya que los números por encima de la media contrarrestarán a los números por debajo de la media provocando que al sumar de 0. Para poder calcular la desviación típica necesitamos primero calcular la varianza, que es la suma de las desviaciones cuadráticas dividido entre el número de observaciones, en cristiano, la suma de las diferencias entre cada dato y la media elevadas al cuadrado y divididas entre el número de datos. Una vez tenemos la varianza, la desviación típica es el resultado de hacer la raíz cuadrada de la varianza.

Veamos cómo se calcula en Python:

def calc_desviacion_tipica(valores):
  media = calc_media(valores) # Calculamos la media de los valores
  desviaciones_cuadraticas = [] # Creamos una lista donde incluiremos las desviaciones cuadráticas
  for d in valores: # Calculamos, a través de un bucle, la desviación cuadrática def calc_desviacion_tipica(valores, media = None):
  if media is None:
    media = calc_media(valores) # Calculamos la media de los valores en caso de no asignarla previamente
  else:
    pass
  desviaciones_cuadraticas = [] # Creamos una lista donde incluiremos las desviaciones cuadráticas
  for d in valores: # Calculamos, a través de un bucle, la desviación cuadrática de cada dato y la añadimos a la lista
    desviaciones_cuadraticas.append((d-media)**2)
  suma_desviaciones_cuadraticas = sum(desviaciones_cuadraticas) # Calculamos la suma de las desviaciones cuadráticas
  n = len(valores) # Calculamos el número de valores a través del tamaño de la lista
  varianza = suma_desviaciones_cuadraticas / n # Calculamos la varianza dividiendo la suma de las desviaciones cuadráticas entre el tamaño de la lista
  desviacion_tipica = np.sqrt(varianza) # Calculamos la desviación típica obteniendo la raíz cuadrada de la varianza
  return desviacion_tipica

desviacion_tipica = calc_desviacion_tipica(gastos_operativos)

Nuevamente, la librería Numpy tiene una función ya incluida:

import numpy as np # Si ya tenemos la librería importada podemos saltarnos este paso
desviacion_tipica = np.std(gastos_operativos)

Calculando la desviación típica, tenemos un valor de 5298,35 €. Este número es la desviación media de los datos de nuestra muestra respecto la media de nuestra muestra. Esto implica que el valor que podemos esperar ahora para el año que viene no será exactamente 100.050 €, sino que estará entre 94751,65 y 105348,35, que es el resultado de sumar y restar la desviación típica a la media. Tenemos ahora ya no un valor esperado, sino un rango donde esperamos que caiga el valor siguiente, lo cual es mucho más preciso.

Coeficiente de variación

Una vez sabemos qué es y cómo calcular la media y la desviación típica podemos obtener conclusiones asociadas a los datos que cabría esperar obtener, basándonos en un conjunto de datos de una muestra. Sin embargo, ¿cómo sabemos si la desviación típica es muy alta, muy baja o normal? Si comparamos, por ejemplo, el comportamiento en bolsa de dos activos y uno (Activo A) tiene una media del 20% y una desviación típica del 15% y otro (Activo B) una media del 5% y una desviación típica del 6%, podemos afirmar que el Activo B es menos volátil que el Activo A en términos absolutos, ya que todos sabemos que 6% < 15%.

Pero, si hay algún listo leyéndome, ya se habrá dado cuenta que mientras que uno tiene una rentabilidad del 20% y otro del 5% y que la diferencia entre estos es mayor que la diferencia entre sus volatilidades. Si es tu caso, estás relativizando y te doy mi enhorabuena ya que es justamente lo que hay que hacer (más o menos).

El término que necesitamos para poder comparar dos o más conjuntos de datos es el coeficiente de variación y consiste, simplemente, en dividir la desviación típica entre la media. En Python es tan sencillo como:

def calc_cv(media, desviacion_tipica):
  cv = desviacion_tipica/media # Calculamos el coeficiente de variación
  return cv

O, si queremos aprovechar las fórmulas previamente escritas:

def calc_cv(valores, tipo_media = "aritmetica", ponderaciones = None):
  if tipo_media == "aritmetica": # Preguntamos si el tipo de media seleccionado es aritmetica, si es así la calculamos, si no pasamos al siguiente paso
    media = calc_media(valores)
  elif tipo_media == "geometrica": # Preguntamos si el tipo de media seleccionado es geometrica, si es así la calculamos, si no pasamos al siguiente paso
    media = calc_media_geometrica(valores)
  elif tipo_media == "ponderada": # Preguntamos si el tipo de media seleccionado es ponderada, si es así la calculamos, si no pasamos al siguiente paso
    media = calc_media_ponderada(valores, ponderaciones) # Es importante que si vamos a seleccionar la media ponderada, le demos a la función una lista con los pesos 
  desviacion_tipica = calc_desviacion_tipica(valores, media) # Calculamos la desviación típica en función de la media que hemos calculado
  cv = desviacion_tipica/media # Calculamos el coeficiente de variación
  return cv

Para seguir con nuestro ejemplo, vamos a utilizar la primera función, ya que nos permite asignar valores a la media y a la desviación típica sin necesidad de darle un conjunto de datos. Comparemos entonces los dos activos:

ActivoMediaDesviación típicaCoeficiente de variación
Activo A20%15%0,75
Activo B5%6%1,2

Como vemos, el activo A, a pesar de tener una mayor desviación típica en términos absolutos, tiene un menor coeficiente de variación, es decir, varía menos en función de su rentabilidad que el activo B. Evidentemente, a mayor coeficiente de variación mayor es el nivel de dispersión de sus valores.

Skew y Kurtosis como indicadores de la simetría y la anchura de la distribución

Por último, vamos a hablar de dos medidas que son fundamentales a la hora de estudiar un conjunto de datos. Estas dos medidas sirven para medir la simetría con la que se distribuyen los datos y nos van a decir hasta que punto debemos subestimar la media o sobreestimarla, vamos a verlo.

Por regla general, las distribuciones suelen tener una forma de campana. Esto supone que la mayoría de observaciones estarán en torno a una media y a los lados de la media el número de observaciones menor a medida que se va alejando de ella:

https://economipedia.com/definiciones/distribucion-normal.html

Esto es lo que se llama una distribución normal, donde la media coincide con la mediana y la moda.

Introducimos así dos nuevos conceptos:

  • Mediana: Es el número que ocupa la posición central de un conjunto de datos después de que estos hayan sido ordenados numéricamente.
  • Moda: Es el valor que más se repite dentro de un conjunto de datos.

Sin embargo, esta situación, a pesar de que se llame normal, no es común. Es muy difícil encontrar un conjunto de números donde el número de valores a la izquierda y la derecha de la media sea idéntica, en forma de campana y con una desviación típica tan exacta. Ya hablaremos más adelante en futuras entradas sobre las distribuciones, ahora vamos a tratar de explicar los conceptos de skew y kurtosis:

Skew

El skew o sesgo por su traducción al español, mide la simetría de la distribución, es decir, si las frecuencias a la derecha y a la izquierda de la media son iguales o no. Un conjunto de datos que deje caer a la derecha y a la izquierda el mismo número de datos tendrá un skew de 0 y la forma de la distribución tendrá la forma de campana vista anteriormente. En cambio, tal y como hemos dicho, resulta muy difícil encontrar este tipo de distribuciones. Lo normal es que uno de los dos lados predomine sobre el otro, teniendo así una cierta inclinación de la curva hacia ese lado vencedor. Hablamos de skew positivo cuando a la derecha de la media hay más valores que a la izquierda de ella y viceversa.

https://marcosammon.com/2016/08/09/skewness.html

Tal y como vemos en la imagen, la forma de campana que veíamos antes se distorsiona, cediendo ante el lado donde más datos hay. Por entender mejor el concepto de skew, volvamos al concepto de mediana, explicado anteriormente. Si recordamos los conceptos de mediana y moda, la mediana era el valor que se ubicaba en el centro del conjunto de datos si estos los ordenamos y la moda el dato que más se repetía. Recordemos también que la media, la mediana y la moda coincidían en una distribución normal, pues todas ellas se situaban en el centro del conjunto de datos. Bien, pues en este caso, esta distorsión provoca que estos valores se desplacen y dejen de coincidir.

En el caso de un skew positivo, la mediana se desplazará a la izquierda de la media y la moda, que seguirá estando en el punto más alto de la distribución, se situará a la derecha de la mediana; mientras que en un skew negativo, la mediana y la moda se desplazarán hacia la izquierda del mismo modo.

https://www.assetinsights.net/Glossary/G_Positive_Skewness.html
¿Por qué sucede esto?

Como siempre, vamos a tratar de ver las cosas desde el punto de vista lógico. Si estamos ante una distribución con un skew positivo, esto quiere decir que hay un mayor número de valores a la derecha de la media. Para que esto pueda suceder tiene que ocurrir que los valores a la izquierda de la media estén más cerca de la media y más concentrados en unos pocos intervalos. Esto, como hemos visto hará que la mediana se desplace a la derecha, ya que hay más valores ahí y esta refleja el punto intermedio en el conjunto de datos. Y además, veremos que la media, arrastrada por esos valores extremos que se alejan de la moda o la mediana provocan que también se desplace a la derecha, situándose a la derecha incluso de la mediana.

¿Qué implicaciones tiene esto a la hora interpretar la media?

Bien, pues si recordamos el principal significado que tiene la media era el valor normal y, por tanto, el que era más probable obtener. Sin embargo, cuando tenemos distribuciones con skew diferente de 0 vemos la media se ve afectada por valores extremos, que la arrastran a la izquierda o a la derecha. Y esto es malo para la media, ya que trata valores extremos como valores normales y los incluye en su cálculo. Tenemos, por tanto, que menospreciar el valor de la media en estos casos y darle mayor importancia a la mediana o a la moda, que reflejan mejor los valores “normales” en nuestro conjunto de datos.

Kurtosis

Vamos ahora a explicar la Kurtosis, que es mide lo “puntiaguda” que es una distribución, es decir, si la distribución tiene una forma más puntiaguda o más chata.

https://deepai.org/machine-learning-glossary-and-terms/kurtosis

De esta forma, una kurtosis positiva supone que hay una mayor concentración de los datos en torno la media y que las colas (las partes laterales de la distribución) son más delgadas. y una kurtosis negativa implica que los datos no están tan concentrados en torno la media si no que se encuentran más diversificados a lo largo de la distribución.

Esto, aunque pueda asemejarse a la desviación típica, nos ayuda mejor a interpretar esta desviación. Recordemos el caso del skew, donde la media se veía influenciada por los datos extremos y se desplazaba. Bien, pues aquí ocurre lo mismo, salvo que en este caso los dos extremos están ejerciendo la misma fuerza y el efecto es nulo sobre la media. Para una desviación concreta, una mayor kurtosis implica que hay valores extremos muy alejados de la media, que provocan que las colas se alejen a ambos lados y que la influencia que estas tienen sobre la media se compensan, dejándola intacta. Con la misma desviación, una kurtosis menor supondrá que no hay apenas datos extremos o estos no están muy alejados de la media, por lo que la forma de la distribución es más “puntiaguda”.

La kurtosis que una distribución normal tiene es de 3, por lo que toda distribución cuya kurtosis sea distinta de 3 la podremos considerar como no normal (aunque irónicamente será la más común en la vida real a pesar del nombre). En concreto, cuando la kurtosis supera el 3 y, por tanto, la distribución es más “puntiaguda” se dice que es una distribución leptocúrtica, cuando es menor que 3 y, por tato, más “chata” se le llama platicúrtica y cuando es igual a 3 la llamaremos mesocúrtica.

Cálculo de skew y kurtosis

La forma de calcular estas dos medidas es muy similar, siendo la fórmula prácticamente idéntica. Para calcular el skew calcularemos primero las diferencias de cada valor respecto la media, las elevaremos a 3 y sumaremos todos estos números. Luego dividiremos este número resultante entre la desviación típica elevado a 3 y el resultado entre n, que recordemos que será el tamaño de nuestra muestra. En el caso de la kurtosis, la forma de calcularla será idéntica salvo porque en lugar de elevar a 3 las diferencias entre los valores y la media antes de sumarlas y la desviación típica, estos se elevarán a 4, pero la fórmula es exactamente la misma.

No obstante, nosotros vamos a calcularlo todo en Python como buenos analistas que somos y para ello los algoritmos son los siguientes:

def calc_skew(valores, media, desviacion_tipica):
  suma_desviaciones = [] # Creamos una lista donde irán las sumas de las desviaciones elevadas a 3
  for v in valores: # Calculamos la suma de las desviaciones, las elevamos a 3 y las añadimos a la lista previamente creada
    suma_desviaciones.append((v + media)**3)
  n = len(valores) # Calculamos el tamaño de la lista
  skew = (suma_desviaciones/(desviacion_tipica**3))/n # Calculamos el skew dividiendo la suma de las desviaciones elevadas a 3 entre la desviación típica elevada a 3, y esto entre n
  return skew

def calc_kurtosis(valores, media, desviacion_tipica):
  suma_desviaciones = [] # Creamos una lista donde irán las sumas de las desviaciones elevadas a 4
  for v in valores: # Calculamos la suma de las desviaciones, las elevamos a 4 y las añadimos a la lista previamente creada
    suma_desviaciones.append((v + media)**4)
  n = len(valores) # Calculamos el tamaño de la lista
  kurtosis = (suma_desviaciones/(desviacion_tipica**4))/n # Calculamos la kurtosis dividiendo la suma de las desviaciones elevadas a 4 entre la desviación típica elevada a 3, y esto entre n
  return skew

Conclusión

Estos conceptos estadísticos, sumado a primera entrada escrita sobre análisis cuantitativo nos permiten tener una base lo suficientemente sólida como para adentrarnos en la siguiente entrada en conceptos probabilísticos. Por ahora, en esta entrada tenemos que tener claro qué es son la media, la varianza y la desviación típica, así como las diferentes formas de calcular la media y los escenarios que hacen más útil calcularlo de una forma u otra. También tenemos que entender el concepto de coeficiente de variación y entender las formas en las que un conjunto de datos se puede distribuir, explicado a través de los conceptos de skew y kurtosis y las implicaciones que esto tiene sobre la interpretación de la media.

Como digo, de cara a la siguiente entrada, hablaremos de conceptos probabilísticos que nos permitirá realizar análisis más exhaustivos de nuestros análisis financieros a través de, por ejemplo, un análisis de escenarios o regresiones lineares. No olvides dejar un comentario si tienes alguna duda o sugerencia para futuras entradas.

Kevin González

Kevin González

Analista financiero en Gesem AV. Graduado en ADE en la Universidad de Alicante. Master en FIntech y Blockchain en la Universidad Europea.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *