Ley de Benford, el extraño principio que vive con nosotros

8 min
Ley de Benford, el extraño principio que vive con nosotros

Todos conocemos la ley de la gravedad. Los cuerpos, por el simple hecho de existir se sienten atraídos de forma proporcional a la masa de ambos e inversamente proporciona a la distancia que los separa. En objetos pequeños y distancias cortas como las que puedes tener tu en el salón de tu casa mientras lees este artículo, esta fuerza es imperceptible, pero aun así la conocemos de primera mano. También conocemos otro tipo de leyes, como las que rigen nuestra sociedad, aunque últimamente, parece que todo el mundo las conoce al dedillo, como si fuésemos catedráticos de derecho.

Por último, antes de empezar, permíteme que hable de las leyes de la probabilidad. Según la probabilidad, si tengo nueve bolas enumeradas desde el 1 hasta el 9 y las meto dentro de una urna, la posibilidad de sacar cada una de ellas metiendo la mano sin mirar es la misma: 1/9. Hasta aquí todo bien. Pero ahora te hago una pregunta, ¿qué porcentaje de municipios en España hay cuyo primer dígito de su población empiece por 1? La respuesta puede volver a ser obvia: 1/9, pero no lo es, y a eso fue a lo que se dedicó el físico Frank Benford durante una cuantiosa parte de su vida, a descubrir por qué esto no era así.

Así que agarraos fuerte, porque se viene un artículo denso, con muchos numeritos, fórmulas, gráficas y cómo no, código. ¡Empezamos!

La Ley de Benford

La Ley de Benford o la Ley del Primer Dígito asegura que hay ciertos dígitos que se repiten con mayor frecuencia en la vida real que otros. En un principio esto parece romper muchos de los principios que estudiamos en el instituto o la universidad. ¡Nadie nos dijo que las longitudes de los ríos no eran aleatorias! Tiempo al tiempo, ahora lo veremos todo en detalle.

Según Benford, el dígito 1 es el más probable que se repita, seguido del 2 y así sucesivamente hasta el 9, que es el que menos veces aparece. Pero, ¿cómo de probable es que esto suceda? Pues bien, Benford no solo tiró la piedra, sino que también aseguró que la probabilidad de que aparezca un dígito d es igual a:

Probavilidad

Si aplicamos dicha fórmula, nos queda un gráfico bien divertido como el siguiente:

Captura de pantalla 2021-02-12 a las 0.28.10.png

Pero ahora es cuando vengo a deciros que no todo es tan bonito como parece. La Ley de Benford no se aplica a sucesos puramente aleatorios como tirar un dado. Por mucho que lo tires, te darás cuenta de que siempre hay la misma probabilidad de que te salga una de las caras del mismo: 1/6. Esto no hay ley que lo cambie, a no ser que uses un dado trucado. También avisar de un pequeño detalle bastante importante que se me ha pasado decirte: esta ley funciona si cogemos el primer dígito del número que estamos tratando, es decir, del número 3547, el dígito que debemos tratar es el 3.

Entonces, ¿para dónde se utiliza esta ley? Según expertos matemáticos, a muchos hechos relacionados con el mundo natural o con elementos sociales. Pero claro, eso a nosotros no nos vale y por eso a continuación tenéis seis experimentos con muestras lo suficientemente grandes para comprobar si cumplen o no la Ley de Benford.

¿De verdad se cumple?

Bien, ya hemos dejado claro qué es la Ley de Benford y ya tenemos en claro que no tiene por qué funcionar siempre. A continuación, vamos a ver varios ejemplos de datos que he ido obteniendo del sitio data.world para ver si se cumple la Ley de Benford. Si queréis replicar el mismo experimento que yo, a continuación os dejo el repositorio de GitHub con el script de Jupyter Notebook y todos los datos en ficheros JSON.

Población en España

Ahora que ya estamos preparados, comenzamos. El primer caso es el más cercano que tenemos (si me lees desde España, claro). Si vas a seguir el experimento desde la comodidad de tu casa, vamos a trabajar con el fichero municipios.json, el cual contiene un objeto con un array de la población de todos los municipios en España en el año 2016. En un primer momento, al tratarse de un factor demográfico, parece que la Ley de Benford debería funcionar si ningún problema.

Para obtener el primer dígito de cada una de las poblaciones, usaré un script muy similar al del resto de casos, pero solo lo comentaré aquí para que el artículo no se haga repetitivo:

primeros_digitos = []

with open('municipios.json') as f:
  datos = json.load(f)
  for municipio in datos['municipios']:
      primeros_digitos.append(int(str(municipio['poblacion'])[0]))

imprimir_resultado(primeros_digitos)
  1. Abrimos el fichero
  2. Cargamos los datos en formato JSON (Python, a diferencia de JS, no lo comprende de forma nativa, hay que procesarlo antes)
  3. Recorremos cada uno de los elementos de objeto municipios
  4. Para cada uno de estos elementos, transformamos la población a un string para luego poder obetener su primer caracter, antes de volver a transformarlo de nuevo a un integer y añadirlo a nuestro array de primeros_digitos.

Posteriormente, procesamos ese array en una función que declaramos al principio del notebook:

def imprimir_resultado(primeros_digitos):
    numero_de_datos = len(primeros_digitos)
    print('Tamaño de la muestra: '+ str(numero_de_datos)+'\n')
    porcentajes = []

    for numero in range (1, 10):
        cantidad = primeros_digitos.count(numero)
        porcentaje = round(float(cantidad)/float(numero_de_datos), 3)
        porcentajes.append(porcentaje)
        benford = BENFORD_ARRAY[numero-1]
        diferencia = round(abs(benford-porcentaje), 3)
        print('Numero ' + str(numero) + ':\t' + str(porcentaje) + '\t | \t' + str(benford) + '\t diferencia de ' + str(diferencia))

    x = range (1, 10)
    y = porcentajes
    plt.bar(x, y, label='Resultado')
    plt.plot(x, BENFORD_ARRAY, 'ro' , label='Ley de Benford')
    plt.legend()
    plt.show()

En este caso no me quiero meter mucho en tecnicismos, pero quedaros con que contamos cuantos unos, doses, treses, etc. hay en la muestra y hacemos sencillas operaciones aritméticas para obtener porcentajes y diferencias que necesitamos. Por último, mostramos los datos en un sencillo gráfico que nos permite visualizar de una mejor forma el resultado final.

Volvamos a lo que nos interesa. Tras pasar este fichero por nuestro programa, obtenemos el siguiente resultado:

Captura de pantalla 2021-02-12 a las 0.27.29.png

¡Sorpresa! Aunque la ley no se cumple de forma contundente, sorprende la similitud del resultado con lo que postulaba Benford a principios del siglo pasado. No obstante, aunque no cuadre al 100%, le voy a dar mi aprobado a esta muestra.

Cotización del Bitcoin

Vale, he de reconocer que el primero era sencillo, pero vamos a probar con algo bastante diferente: las cotizaciones de activos. Para los que no estéis familiarizados con este vocabulario de inversiones, la cotización es el precio de un activo en un momento concreto. En este caso, el precio con el que termina el día la famosa criptomoneda Bitcoin.

¿Hay más posibilidades de alcanzar un precio que otro? ¿Se rige el mercado por la Ley de Benford? Para comprobarlo, he utilizado el fichero bitcoin.json que tenéis en el repositorio, el cual contiene las cotizaciones diarias del BTC desde 2010. ¡Casi nada! Pues bien, una vez procesados los precios e introducidos dentro de nuestra función, el resultado es el siguiente:

Captura de pantalla 2021-02-12 a las 0.35.08.png

En este caso no podemos dar por validada la Ley de Benford, ya que aunque exista cierta similitud en algunos dígitos, hay mucha diferencia en otros. Una de esas similitudes más características es que, casualmente, el dígito 1 es el que más se repite de todos, lo cual debe estar relacionado con los periodos en los que el Bitcoin se encontraba en 1, 10, 100 o 1.000 dólares, ya que en los 10.000 no se ha mantenido durante mucho tiempo debido a su alta volatilidad a esos niveles. También vemos un dato anormal con el dígito 6, el cual puede deberse al largo periodo de tiempo tras la primera gran caída de principios de 2018, donde la cotización se mantuvo rondando los 6.000 y 7.000 dólares.

Casos de COVID-19 en municipios de los EEUU

Ya hemos probado con factores geográficos y también con factores económicos, pero, ¿será también la sanidad dependiente de la Ley de Benford? En el fichero covid.json aparecen las cifras de casos confirmados de COVID en cada uno de los municipios de los Estados Unidos. Al meter estos datos en nuestro algoritmo, obtenemos la siguiente gráfica:

Captura de pantalla 2021-02-12 a las 0.35.50.png

Creo que todos podíamos esperar un resultado bastante similar al obtenido, ya que los índices de casos de COVID-19 es un dato muy ligado a la población de los diferentes municipios donde se miden. A decir verdad, ese caso parece incluso más próximo a la Ley de Benford que el de la población en municipios españoles.

Precios de productos de Amazon en EEUU

Vamos ahora a por el tercer caso. En esta situación tenemos en el fichero amazon.json los datos de los precios de diferentes productos de Amazon USA. Contamos con una buena muestra, por lo que la fiabilidad del resultado es alta. Veamos qué obtenemos al pasar los datos por nuestra función:

Captura de pantalla 2021-02-12 a las 0.37.15.png

Si os soy sincero, me esperaba un resultado totalmente distinto al que podemos ver aquí. Obviamente no podemos decir que se cumpla la Ley de Benford, pero impresiona lo cerca se queda de hacerlo. Como podemos ver, los precios que empiezan por 1 son los más recurrentes, seguidos de los que empiezan por 2 y por 5 respectivamente. La razón por la que me esperaba un resultado mucho más variado es porque los precios que tienen los productos cuentan con un pequeño margen que fluctúa en consecuencia de decisiones de marketing: que si el numero 9 vende más que el 2, que si el 7 más que el 3, ... Ya me entiendes.

Otras de las razones por las que estos datos pueden seguir sutilmente la forma de la Ley de Benford, es porque la mayoría de los productos que podemos encontrar en Amazon son productos económicos, por eso esa predominancia de los primeros dígitos. En el caso del 5 y del 6 podemos estar simplemente ante una cuestión de marketing, pero no es seguro. La verdad que es uno de los resultados más interesantes de todos los que llevamos.

Capacidad de producción eléctrica de todas las plantas del mundo

Vamos con otro caso cuyos resultados seguro que también te sorprenderán. En el dichero eletricidad.json podemos encontrar un listado con la capacidad de producción eléctrica de todas las centrales del mundo. Esta capacidad se mide en MW, lo que equivale a un millón (1.000.000) de vatios (W). Para haceros una idea, el vatio es una unidad que se utiliza para medir la transferencia de energía, es decir, los julios que se transfieren por segundo. Pero no es el objetivo de hoy entender qué son los vatios, si no ver el resultado de introducir todos estos datos en en el programa:

Captura de pantalla 2021-02-12 a las 0.38.16.png

A mí el resultado también me impresionó bastante, ya que no me esperaba que se llegase a asemejar tanto a la ley de Benford. Recordemos que en este caso contamos con los datos de capacidad energética de todas las centrales eléctricas del mundo, ya sean nucleares, térmicas, geotérmicas, eólicas, solares, etc. Aún así, tratándose de un caso meramente planificado y para nada fruto de la naturaleza, la Ley de Benford ha decidido aparecer.

Líneas de código

Ya para finalizar, veía conveniente hablar sobre un poco de programación y desarrollo. En el fichero codigo.json puedes encontrar diferentes errores ortográficos que se han encontrado en múltiples repositorios, con su fichero y linea correspondiente en la que se encuentra. ¿Habrá alguna relación entre la Ley de Benford y la programación? Una vez introducido estos datos en nuestra función, el resultado es el siguiente:

Captura de pantalla 2021-02-12 a las 0.38.53.png

Creo que podemos afirmar sin ninguna duda de que se cumple casi a la perfección la ley de Benford para esta muestra. Pero, ¿por qué se cumple? ¿Seguimos la Ley de Benford sin quererlo a la hora de programar? Yo creo que la respuesta es mucho más sencilla. Los que programamos, sabemos que los ficheros de código deben quedar lo más cortos y simplificados posibles, y por esa misma razón creo que hay una mayor cantidad de errores en en las líneas cuyos dígitos empiezan por 1, 2 o 3 (principalmente las líneas 100-199, 200-299 y 300-399). Esta hipótesis anterior se obtiene, claro está, si entendemos que la probabilidad de cometer un fallo es totalmente aleatoria, y que por lo tanto, el resultado de este análisis se debe principalmente al número de líneas que tienen los ficheros de código.