Introducción

 

Diversos artículos sugieren que los humanos no somos buenos generando números aleatorios. En particular, se ha observado que tenemos cierta afición a seleccionar números “con significado” (fechas de cumpleaños, matrículas de coche, números de viviendas, …), o que cuando generamos listas de números elegidos al azar tendemos inadvertidamente a seguir alguna clase de patrón: el patrón puede ser, por ejemplo, cierta tendencia a incluir más números consecutivos de lo que ocurriría realmente por azar; o todo lo contrario, cierta tendencia a evitar precisamente la presencia de números consecutivos.

Con objeto de adquirir algún tipo de evidencia empírica sobre este comportamiento humano, hemos seleccionado un grupo de personas y les hemos solicitado que participen en un juego consistente en realizar apuestas sobre qué números van a salir al sacar tres bolas de una urna que contiene 25 bolas numeradas del 1 al 25. Una apuesta consiste en elegir tres números distintos entre 1 y 25, y se invita a los participantes en el experimento a realizar al menos 5 apuestas. Ganará aquel que haya acertado los tres números una vez que se celebre el sorteo.

 

 

 

Resultados del experimento

Leemos los datos del muestreo y ordenamos los números de cada apuesta de menor a mayor; también ponemos en mayúscula la identificación de los apostantes, y numeramos las apuestas de 1 en adelante. Además eliminamos algunas apuestas que contienen números repetidos.

apuestas <- read_excel("apuestas.xlsx")
# Modificamos los nombres de las variables:
names(apuestas) <- c("Fecha","num1","num2","num3","apostante")
# Ordenamos de mayor a menor los números de cada apuesta:
apuestas[,2:4] <- t(apply(apuestas[,2:4],1,sort))
# Creamos la variable "apuesta", pasamos a mayúsculas los nombres, y calculamos las 
# distancias entre las cifras apostadas:
apuestas <- apuestas %>% 
  mutate(apuesta=1:nrow(apuestas),
         apostante=toupper(apostante),
         dif1=num2-num1,
         dif2=num3-num2) %>% 
  filter(dif1!=0&dif2!=0)

 

Se ha realizado un total de 218 apuestas válidas. Hacemos en primer lugar una pequeña estadística descriptiva de los números más jugados:

tablaFrec <- apuestas %>% select(-1) %>% 
  pivot_longer(1:3,names_to="posicion",values_to="numero") %>% 
  tabyl(numero) %>% adorn_pct_formatting()

flextable(tablaFrec) %>%
  fontsize(size = 12, part = "all") %>% 
  align_text_col("right")

numero

n

percent

1

26

4.0%

2

27

4.1%

3

37

5.7%

4

27

4.1%

5

22

3.4%

6

29

4.4%

7

41

6.3%

8

36

5.5%

9

31

4.7%

10

25

3.8%

11

24

3.7%

12

27

4.1%

13

20

3.1%

14

27

4.1%

15

32

4.9%

16

17

2.6%

17

18

2.8%

18

22

3.4%

19

17

2.6%

20

21

3.2%

21

25

3.8%

22

32

4.9%

23

26

4.0%

24

20

3.1%

25

25

3.8%

 

Gráficamente:

ggplot(tablaFrec,aes(x=numero,y=n,fill=n)) + geom_col() +
  scale_x_continuous(breaks=1:25,labels=1:25)

 

 

 

Análisis de la posible existencia de tendencia a evitar (o favorecer) la presencia de números consecutivos entre los elegidos.

 

Esta tendencia se podría estudiar de múltiples formas:

  1. Contando en cuántas apuestas aparecen al menos dos números consecutivos y evaluando si son muchas (y por tanto los sujetos presentan tendencia a elegir números consecutivos) o si son pocas (y por tanto los sujetos presentan tendencia a elegir números separados).

  2. Una vez ordenados los tres números de cada apuesta, podemos calcular las distancias del primero al segundo y del segundo al tercero. Cada apuesta da lugar, por tanto, a dos distancias. Si se han hecho \(n\) apuestas, se obtienen \(2n\) distancias. Que una distancia sea 1 quiere decir que los dos números son consecutivos. Podría estudiarse si la distancia 1 se presenta muchas veces (ello significaría que hay cierta tendencia a elegir números consecutivos) o muy pocas veces (significaría una tendencia a evitar números consecutivos).

  3. Igual que antes, una vez ordenados los tres números, calculamos un promedio de las distancias entre ellos (del primero al segundo, del segundo al tercero y del primero al tercero). Si los promedios son bajos, ello significaría que los sujetos muestran tendencia a agrupar los números; si son altos, la tendencia se estaría produciendo en el sentido de “alejar” los números.

4 … Podríamos seguir pensando formas de evaluar si las apuestas realizadas presentan algún patrón distintivo.

 

 

 

1. ¿En cuántas apuestas aparecen al menos dos números consecutivos?

 

frecConsec <- apuestas %>% 
  mutate(hayConsecutivos=ifelse(dif1==1|dif2==2,"Sí","No")) %>% 
  tabyl(hayConsecutivos) %>% adorn_pct_formatting()

flextable(frecConsec) %>%
  fontsize(size = 12, part = "all") %>% 
  fontsize(size=14,part="all") %>% 
  align_text_col("right") %>% autofit()

hayConsecutivos

n

percent

No

171

78.4%

47

21.6%

 

Como vemos, 47 apuestas (el 21.6%) del total contienen al menos dos números consecutivos.

 

Podemos preguntarnos ahora: que haya 47 apuestas entre 218 que contienen al menos dos números consecutivos ¿difiere de lo que cabría esperar si las apuestas se hubiesen realizado completamente al azar?

Obviamente, para responder a esta pregunta necesitamos saber qué habría ocurrido si las apuestas se hubiesen hecho completamente al azar. El siguiente código R simula la realización de 218 apuestas al azar, y devuelve el número de las que contienen al menos dos números consecutivos:

cuantasApsContienenConsecutivos <- function(n){
  sum(replicate(n,{
    apuesta <- sample(1:25,3)
    any(diff(sort(apuesta))==1)
  }))  
}

cuantasApsContienenConsecutivos(nrow(apuestas))
## [1] 47

Como cada vez que se realizan 218 apuestas el número de las que contienen números consecutivos puede diferir, es necesario repetir muchas veces el código anterior para tener una idea más clara de qué es lo que normalmente ocurre cuando se realizan 218 apuestas al azar:

# distribConsecutivos <- replicate(10000, cuantasApsContienenConsecutivos(nrow(apuestas)))
# save(distribConsecutivos,file="distribConsecutivos.rdata")
load(file="distribConsecutivos.rdata")
data.frame(nconsec=distribConsecutivos) %>% 
  tabyl(nconsec) %>% 
  ggplot(aes(x=nconsec,y=percent)) + geom_col() + 
  ggtitle(sprintf("Número de apuestas que contienen cifras consecutivas\n(en un total de N=%d apuestas realizadas)",nrow(apuestas)))+
  xlab("Apuestas con cifras consecutivas") + ylab("Porcentaje")

Observando esta gráfica podemos concluir que, cuando se realizan 218 apuestas completamente al azar (esto es, sin preferencia por agrupar o desagrupar números), lo más frecuente (lo más probable) es que el número de apuestas con al menos dos cifras consecutivas esté en torno a 50; es más, la mayor parte de las veces se observan entre 37 y 63 apuestas que contienen al menos dos números consecutivos, o incluso entre 35 y 65 si abrimos más el abanico de resultados que resultan “normales”. En nuestro experimento hubo 47 apuestas con números consecutivos. Por tanto, lo que hemos observado en nuestro experimento concuerda perfectamente con lo que cabría observar cuando no hay preferencias. Podemos decir entonces que nuestras observaciones no muestran evidencia de que las personas tengan algún tipo de preferencia a la hora de elegir números al azar (al menos en las condiciones en que hemos realizado nuestro experimento).

 

Claro, que también podíamos habernos preguntado: y si las personas realmente manifiestan tendencia, por ejemplo, a elegir números separados: ¿difiere el resultado observado de lo que cabría esperar si tal hipótesis fuera cierta?

 

Este caso es un poquito más difícil de simular debido al principio de Ana Karenina, llamado así por el comienzo del libro de Tolstoi:

«Todas las familias felices se parecen unas a otras, pero cada familia infeliz lo es a su manera».

y es que si bien hay una única forma en que la selección de tres números es completamente aleatoria, puede haber muchísimas formas en que los sujetos manifiesten preferencias. La siguiente función en R selecciona tres números al azar entre 1 y 25, asignando más probabilidad a elegir números separados que a elegir números próximos (si entrar mucho en los detalles de como funciona esta función, depende de un parámetro b>0 tal que cuanto más pequeño sea más separados tienden a elegirse los números de la apuesta):

fdens <- function(x){
    b=0.9 # Cuánto más pequeño sea b más se "repelen" las cifras
    x/(x+exp(-b*x))
 }
fd=fdens(0:24)
fd=fd/sum(fd)
urna=1:25
#plot(urna,fd)

simulaApuesta <- function(urna,fd){
  num1 <- sample(urna,1)
  p1=fd[abs(urna-num1)+1]
  num2 <- sample(urna,1,prob=p1)
  p2=fd[abs(urna-num2)+1]
  p2=apply(rbind(p1,p2),2,min)
  num3 <- sample(urna,1,prob=p2)
  c(num1,num2,num3)
}

Igual que antes, repetimos muchas veces el proceso de realizar 218 apuestas, pero ahora con sujetos que tienen preferencia por elegir números separados, y contamos cuantas apuestas contienen al menos dos números consecutivos:

cuantasApsContienenConsecutivos <- function(n){
  sum(replicate(n,{
    apuesta <- simulaApuesta(urna,fd)
    any(diff(sort(apuesta))==1)
  }))  
}

# distribConsecutivosPref <- replicate(10000, cuantasApsContienenConsecutivos(nrow(apuestas)))
# save(distribConsecutivosPref,file="distribConsecutivosPref.rdata")
load(file="distribConsecutivosPref.rdata")
data.frame(nconsec=distribConsecutivosPref) %>% 
  tabyl(nconsec) %>% 
  ggplot(aes(x=nconsec,y=percent)) + geom_col() + 
  ggtitle(sprintf("Número de apuestas que contienen cifras consecutivas\n(en un total de N=%d apuestas realizadas)\ncuando los sujetos tienen tendencia a elegir cifras separadas",nrow(apuestas)))+
  xlab("Apuestas con cifras consecutivas") + ylab("Porcentaje")

Como vemos, ahora lo más frecuente es que entre 218 apuestas haya entre 28 y 49 que contienen al menos dos cifras consecutivas. Si recordamos que en nuestro caso hubo 47 apuestas con al menos dos cifras consecutivas, resulta que el resultado observado es también compatible con lo que cabría observar si hubiese cierta preferencia a elegir números separados.

 

 

2. ¿Cuáles son las distancias entre los números elegidos en las apuestas?

tablaDist <- apuestas %>% mutate(dif1=num2-num1, 
                    dif2=num3-num2) %>% 
  select(dif1,dif2) %>% 
  pivot_longer(c(dif1,dif2),names_to="posicionDif",values_to="distancia") %>% 
  tabyl(distancia) 

tablaDist %>% adorn_pct_formatting() %>% 
  flextable() %>%
  fontsize(size = 12, part = "all") %>% 
  align_text_col("right") %>% 
  autofit()

distancia

n

percent

1

57

13.1%

2

42

9.6%

3

25

5.7%

4

44

10.1%

5

40

9.2%

6

39

8.9%

7

36

8.3%

8

31

7.1%

9

20

4.6%

10

15

3.4%

11

19

4.4%

12

20

4.6%

13

10

2.3%

14

14

3.2%

15

8

1.8%

16

6

1.4%

17

4

0.9%

18

1

0.2%

19

2

0.5%

20

2

0.5%

22

1

0.2%

Como vemos, la distancia más frecuente es precisamente la distancia 1: se ha observado 57 veces, un 0.1307339 del total. Así pues, hay más parejas de números consecutivos, que parejas separadas por una distancia 2,3,4, etc.

 

Gráficamente:

ggplot(tablaDist,aes(x=distancia,y=n,fill=n)) + geom_col() +
    scale_x_continuous(breaks=1:max(tablaDist$distancia),
                       labels=1:max(tablaDist$distancia))

 

Obviamente, es difícil juzgar si la distancia 1 se presenta tan frecuentemente porque hay una tendencia entre los sujetos experimentales a seleccionar números consecutivos, o simplemente porque es más probable seleccionar números consecutivos (o próximos entre sí), que números alejados; al fin y al cabo parejas consecutivas hay muchas: 1-2, 2-3, 3-4, …, 24-25, mientras que parejas alejadas una distancia 24 solo hay una, la pareja 1-25; alejadas una distancia 23 hay dos, la pareja 1-24 y 2-25. Por tanto el patrón de distancias que vemos en la figura anterior puede deberse más a la propia naturaleza del sorteo que a la existencia de un patrón de preferencias por números próximos.

 

 

¿Cuántas parejas posibles de números hay para cada distancia?

En total hay 2300 formas de escoger 3 números distintos entre 1 y 25:

choose(25,3)
## [1] 2300

R nos permite calcular todas esas formas gracias a la función combn() del paquete utils:

library(utils)
ternas <- combn(25,3)

Las primeras 10 combinaciones son:

ternas[,1:10]
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,]    1    1    1    1    1    1    1    1    1     1
## [2,]    2    2    2    2    2    2    2    2    2     2
## [3,]    3    4    5    6    7    8    9   10   11    12

Podemos calcular fácilmente todas las distancias posibles entre el primer número y el segundo, así como entre el segundo y el tercero:

dif12 <- ternas[2,]-ternas[1,]
dif23 <- ternas[3,]-ternas[2,]

Podemos hacer ahora una tabla con el número de veces que aparece cada distancia (de 1 a 24) en todos estos casos:

distancias <- data.frame(distancia=c(dif12,dif23)) %>% 
  tabyl(distancia) 

distancias %>% 
  adorn_pct_formatting() %>% 
  flextable() %>%
  fontsize(size = 12, part = "all") %>% 
  set_formatter_type(fmt_double="%.0f") %>% 
  align_text_col("right")

distancia

n

percent

1

552

12.0%

2

506

11.0%

3

462

10.0%

4

420

9.1%

5

380

8.3%

6

342

7.4%

7

306

6.7%

8

272

5.9%

9

240

5.2%

10

210

4.6%

11

182

4.0%

12

156

3.4%

13

132

2.9%

14

110

2.4%

15

90

2.0%

16

72

1.6%

17

56

1.2%

18

42

0.9%

19

30

0.7%

20

20

0.4%

21

12

0.3%

22

6

0.1%

23

2

0.0%

y gráficamente:

ggplot(distancias,aes(x=distancia,y=n,fill=n)) + geom_col() +
    scale_x_continuous(breaks=1:max(distancias$distancia),
                       labels=1:max(distancias$distancia))

Si los números se escogen completamente al azar cabe esperar que todas las ternas tengan la misma probabilidad de ser elegidas. En tal caso las distancias observadas en el muestreo deberían presentarse con unas frecuencias relativas similares a las de la tabla anterior. Si representamos juntas ambas tablas podemos visualizar qué diferencias hay entre ellas:

ggplot(tablaDist,aes(x=distancia,y=percent,fill=percent)) + geom_col() +
  geom_point(data=distancias,aes(x=distancia,y=percent,color="red")) +
  geom_line(data=distancias,aes(x=distancia,y=percent,color="red")) +
  guides(color=FALSE)

 

 

¿Cuál es la distribución esperada de distancias cuando no hay preferencia por evitar distancias cortas o largas entre números?

Realmente este gráfico no nos dice gran cosa, deberíamos ver qué es lo que ocurre en muchas muestras del mismo tamaño que la nuestra en las que se realice una selección completamente aleatoria. El siguiente código hace exactamente eso, y dibuja lineas entre los percentiles 2.5 y 97.5 de los valores resultantes:

d0 <- data.frame(distancia=1:24)
simDistancias <- function(n){
  sim <- replicate(n,sample(1:25,3))
  sim <- data.frame(t(apply(sim,2,sort)))
  distancia <- c(sim[,2]-sim[,1],sim[,3]-sim[,2])
  d1 <- data.frame(prop.table(table(distancia)))
  dd <- merge(d0,d1,all=TRUE)
  dd$Freq <- ifelse(is.na(dd$Freq),0,dd$Freq)
  dd$Freq  
}
#simDist <- replicate(10000,simDistancias(nrow(apuestas)))
#save(simDist,file="simDist.rdata")
load(file="simDist.rdata")
ptiles <- t(apply(simDist,1, quantile,probs=c(0.025,0.975)))
p025 <- data.frame(distancia=1:24,percent=ptiles[,1])
p975 <- data.frame(distancia=1:24,percent=ptiles[,2])

ggplot(tablaDist,aes(x=distancia,y=percent,fill=percent)) + geom_col() +
  geom_point(data=distancias,aes(x=distancia,y=percent),color="red") +
  geom_line(data=distancias,aes(x=distancia,y=percent),color="red") +
  geom_point(data=p025,aes(x=distancia,y=percent),color="green") +
  geom_line(data=p025,aes(x=distancia,y=percent),color="green",lty=2) +
  geom_point(data=p975,aes(x=distancia,y=percent),color="green") +
  geom_line(data=p975,aes(x=distancia,y=percent),color="green",lty=2) 

Como vemos, el número de observaciones a cada distancia (salvo la distancia 3) está dentro del intervalo que cabe esperar cuando los números se eligen completamente al azar.

 

 

¿Cuál es la distribución esperada de distancias cuando hay tendencia a evitar distancias cortas entre números?

Realizamos ahora una simulación con apuestas que tienden a evitar que salgan números consecutivos:

d0 <- data.frame(distancia=1:24)
simDistanciasPref <- function(n){
  sim <- replicate(n,simulaApuesta(urna,fd))
  sim <- data.frame(t(apply(sim,2,sort)))
  distancia <- c(sim[,2]-sim[,1],sim[,3]-sim[,2])
  d1 <- data.frame(prop.table(table(distancia)))
  dd <- merge(d0,d1,all=TRUE)
  dd$Freq <- ifelse(is.na(dd$Freq),0,dd$Freq)
  dd$Freq  
}
#simDistPref <- replicate(10000,simDistanciasPref(nrow(apuestas)))
#save(simDistPref,file="simDistPref.rdata")
load(file="simDistPref.rdata")
ptiles <- t(apply(simDistPref,1, quantile,probs=c(0.025,0.5,0.975)))
p025 <- data.frame(distancia=1:24,percent=ptiles[,1])
Mediana <- data.frame(distancia=1:24,percent=ptiles[,2])
p975 <- data.frame(distancia=1:24,percent=ptiles[,3])

ggplot(tablaDist,aes(x=distancia,y=percent,fill=percent)) + geom_col() +
  geom_point(data=Mediana,aes(x=distancia,y=percent),color="red") +
  geom_line(data=Mediana,aes(x=distancia,y=percent),color="red") +
  geom_point(data=p025,aes(x=distancia,y=percent),color="green") +
  geom_line(data=p025,aes(x=distancia,y=percent),color="green",lty=2) +
  geom_point(data=p975,aes(x=distancia,y=percent),color="green") +
  geom_line(data=p975,aes(x=distancia,y=percent),color="green",lty=2) 

 

En este caso el número de observaciones a distancia 1 y a distancia 3 están fuera del intervalo que cabe esperar cuando los números se eligen con tendencia a evitar cifras consecutivas. Por tanto los datos no parecen compatibles con esta hipótesis (al menos con la forma en que la hemos parametrizado; recordemos el principio de Ana Karenina).

 

 

 

4. Distancia media entre las cifras de una apuesta.

Veamos por último cuál es la distancia media entre las cifras de las apuestas en los resultados que hemos obtenido. Para ello calculamos la distancia del primero al segundo, del segundo al tercero y del primero al tercero y las promediamos. En las apuestas de nuestra muestra, estas fueron las distancias medias observadas:

difs <- apuestas %>% mutate(dif3=num3-num1) %>% 
  select(dif1,dif2,dif3)

apuestas <- mutate(apuestas,distMedia = rowMeans(difs)) 
ggplot(apuestas,aes(x=distMedia)) + geom_histogram(bins=18)

Globalmente, la distancia media para todas las apuestas es 8.6636086. Esta distancia media ¿es grande (los números tienden a estar separados) o es pequeña (tienden a estar juntos)? Para responder a esta pregunta tenemos que evaluar cómo es esta distancia cuando no hay preferencia por alejar o juntar los números.

 

¿Cómo son estas distancias cuando no hay preferencias? Usamos de nuevo la simulación:

simDistanciaMedia <- function(n){
  sim <- replicate(n,sample(1:25,3))
  sim <- data.frame(t(apply(sim,2,sort)))
  distmedia <- sim[,3]-sim[,1]
  mean(distmedia)
}
# distMediaSimulada <- replicate(10000,simDistanciaMedia(nrow(apuestas)))
# save(distMediaSimulada,file="distMediaSimulada.rdata")
load(file="distMediaSimulada.rdata")
dm <- data.frame(distMedia=distMediaSimulada*2/3)
ggplot(dm,aes(x=distMedia)) + geom_histogram()

Como vemos, cuando no hay preferencias la distancia media entre números oscila entre 8 y 9.4 aproximadamente, estando los valores más probables situados en torno a 8.7 aproximadamente. Como vemos, en nuestra muestra, la distancia media observada está muy cerca de este valor, por lo que la muestra no arroja evidencia de que la selección de números al apostar se haga de manera distinta a una selección completamente al azar.

¿Cómo son estas distancias cuando hay preferencia por alejar los números? Usamos de nuevo la simulación:

simDistanciaMediaPref <- function(n){
  sim <- replicate(n,simulaApuesta(urna,fd))
  sim <- data.frame(t(apply(sim,2,sort)))
  distmedia <- sim[,3]-sim[,1]
  mean(distmedia)
}
# distMediaSimuladaPref <- replicate(10000,simDistanciaMediaPref(nrow(apuestas)))
# save(distMediaSimuladaPref,file="distMediaSimuladaPref.rdata")
load(file="distMediaSimuladaPref.rdata")
dm <- data.frame(distMedia=distMediaSimuladaPref*2/3)
ggplot(dm,aes(x=distMedia)) + geom_histogram()

Vemos que la distribución de valores se ha desplazado a la derecha (distancias medias más grandes), como cabía esperar si hay preferencia por alejar los números. La distancia media entre números oscila ahora entre 8.2 y 9.6 aproximadamente, estando los valores más probables situados en torno a 8.9 aproximadamente. La media observada en nuestra muestra (8.66) no se aleja demasiado de este valor. De hecho, viendo la gráfica, un valor como el obtenido en nuestra muestra resulta bastante probable cuando los sujetos muestran tendencia a no elegir números consecutivos. Ello significa que nuestros datos son también compatibles con esa hipótesis.

 

 

 

¿CONCLUSIONES?