Probabilidad que 2 personas en un grupo tengan las mismas iniciales de sus nombres

Objetivo

Planteamiento

Se desea estimar la probabilidad que dentro de un grupo de 10 personas dos de ellas tengan las mismas iniciales en su nombre, para lo cual:

  • Se tendrá solo en cuenta las iniciales de su primer nombre y primer apellido.

  • Se trabajará con base en el alfabeto en español donde hay 27 letras incluyendo la letra Ñ.

  • Se hará el cálculo de probabilidad de 2 personas aunque puedan ser más personas con las mismas iniciales.

  • Se calculara también la probabilidad para grupos de 2 a 100 personas.

  • Se harán simulaciones de grupos aleatorios.

Procedimiento

Para un grupo de 10 personas

Creación vector aleatorio de 10 personas

##  [1] "HX" "TI" "VK" "XO" "WT" "AC" "RC" "WO" "BJ" "LL"

¿Hay parejas duplicadas en los datos (con las mismas iniciales)?

## [1] FALSE

Para estimar, mediante simulaciones, la probabilidad de que al menos dos personas tengan las mismas iniciales en el grupo, necesitamos replicar este vector de 10 iniciales muestreadas una gran cantidad de veces (digamos 1000 replicaciones):

Dimensión de los datos creados y una muestra de las primeras 11 grupos simulados.

## [1]   10 1000
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
##  [1,] "HX" "PM" "OP" "BU" "YB" "TK" "OR" "PG" "YG" "DF"  "DA" 
##  [2,] "TI" "RÑ" "LE" "XG" "AQ" "EE" "SD" "KN" "LW" "BÑ"  "QU" 
##  [3,] "VK" "RL" "PF" "UJ" "WC" "AS" "NK" "ZY" "YF" "UP"  "YP" 
##  [4,] "XO" "GF" "YL" "NU" "PI" "LU" "AA" "PP" "UE" "FL"  "MX" 
##  [5,] "WT" "QA" "SO" "OR" "BÑ" "PK" "FW" "NE" "LM" "XW"  "OH" 
##  [6,] "AC" "CS" "BQ" "ÑJ" "WM" "GK" "FX" "CF" "UK" "ÑÑ"  "JJ" 
##  [7,] "RC" "OG" "OU" "IJ" "WM" "NA" "QR" "VA" "ZY" "CW"  "XB" 
##  [8,] "WO" "UÑ" "MÑ" "FT" "PM" "LO" "CL" "RZ" "HX" "SA"  "QI" 
##  [9,] "BJ" "TF" "HY" "OV" "PZ" "GK" "OX" "JH" "EÑ" "KY"  "JB" 
## [10,] "LL" "ÑU" "SA" "NW" "WH" "QO" "HP" "CN" "ÑF" "GT"  "ZG"

Hay grupos duplicados en los datos (con las mismas iniciales)?

## [1] FALSE

El resultado es una matriz de 10 filas y 1000 columnas, donde:

  • cada fila corresponde a las iniciales de la muestra de una persona, y
  • cada columna corresponde a un grupo simulado de 10 personas.

Para una mejor legibilidad, cambiamos el nombre:

  • los nombres de fila como M1 a M10, correspondientes a las personas 1 a 10, y
  • los nombres de columna como T1 a T1000, correspondientes a los grupos 1 a 1000.
##     T1   T2   T3   T4   T5   T6   T7   T8   T9   T10  T11 
## M1  "HX" "PM" "OP" "BU" "YB" "TK" "OR" "PG" "YG" "DF" "DA"
## M2  "TI" "RÑ" "LE" "XG" "AQ" "EE" "SD" "KN" "LW" "BÑ" "QU"
## M3  "VK" "RL" "PF" "UJ" "WC" "AS" "NK" "ZY" "YF" "UP" "YP"
## M4  "XO" "GF" "YL" "NU" "PI" "LU" "AA" "PP" "UE" "FL" "MX"
## M5  "WT" "QA" "SO" "OR" "BÑ" "PK" "FW" "NE" "LM" "XW" "OH"
## M6  "AC" "CS" "BQ" "ÑJ" "WM" "GK" "FX" "CF" "UK" "ÑÑ" "JJ"
## M7  "RC" "OG" "OU" "IJ" "WM" "NA" "QR" "VA" "ZY" "CW" "XB"
## M8  "WO" "UÑ" "MÑ" "FT" "PM" "LO" "CL" "RZ" "HX" "SA" "QI"
## M9  "BJ" "TF" "HY" "OV" "PZ" "GK" "OX" "JH" "EÑ" "KY" "JB"
## M10 "LL" "ÑU" "SA" "NW" "WH" "QO" "HP" "CN" "ÑF" "GT" "ZG"

Ahora necesitamos calcular, entre los 1000 grupos simulados, cuántos de ellos tienen al menos dos personas con las mismas iniciales:

## [1] 57
  • Aquí, para cada columna de nuestro dataframe dat (desde la primera hasta la columna número 1000), preguntamos si hay duplicados o no.
  • Esto se hace repetidamente en todas las columnas gracias a un bucle for.
  • Para cada columna, el resultado es TRUE si hay duplicados; de lo contrario, es FALSE.
  • El resultado de cada iteración se guarda en el vector duplicates. Como TRUE = 1 y FALSE = 0 en R, podemos contar cuántas columnas (y por tanto grupos) tienen duplicados sumando el número de TRUE en el vector duplicates.

Como podemos ver en el resultado anterior, entre los 1000 grupos simulados, 57 de ellos tienen duplicados, es decir, 57 de ellos tienen al menos dos personas con las mismas iniciales.

Por lo tanto, según las simulaciones, podemos esperar que la probabilidad de que al menos dos personas con las mismas iniciales en un grupo de 10 personas sea cercana al 5,7%.

Este es un buen punto de partida. Tener en cuenta, sin embargo, que escribí cerca del 5,7% porque esta probabilidad variará cada vez que se calcula mediante simulaciones.

Por ejemplo, si repetimos exactamente el mismo proceso una segunda vez colocando una semilla distinta:

¿Cuantos grupos tienen duplicados (con las mismas iniciales)?

## [1] 47

Ahora encontramos una probabilidad del 4,7%. Esto no es un error, sino que se debe a la aleatoriedad al muestrear las iniciales.

Afortunadamente, podemos hacer que el cálculo de esta probabilidad sea más sólido gracias a las replicaciones. Intuitivamente, funciona de la siguiente manera. Repetimos el mismo cálculo varias veces, lo que nos da un rango de probabilidades posibles. Esto nos permite evaluar la incertidumbre de nuestro resultado y comprender cómo la probabilidad podría variar al tomar diferentes muestras aleatorias de iniciales.

Entonces, el objetivo es calcular nuestra probabilidad varias veces (digamos 500 veces) y ver su distribución.

Para repetir el mismo cálculo varias veces, es mejor escribir una función para evitar copiar y pegar el mismo código una y otra vez. Así que primero se escribe una función que calcula la probabilidad de que al menos dos personas compartan las mismas iniciales en un grupo de n personas y se computa la media de las probabilidades.

Una función en R requiere incluir:

  • los parámetros dentro de (), y
  • el cálculo dentro de {}.

Calcular el vector de probabilidades

Luego podemos usar nuestra función para calcular la probabilidad de que al menos dos personas compartan las mismas iniciales en un equipo de 10 personas. Y lo combinamos con la función replicate() para calcular esta probabilidad 500 veces.

##   [1] 0.057 0.057 0.058 0.065 0.063 0.080 0.067 0.057 0.064 0.053 0.066 0.069
##  [13] 0.052 0.048 0.044 0.061 0.061 0.069 0.065 0.060 0.061 0.052 0.050 0.058
##  [25] 0.066 0.061 0.051 0.061 0.071 0.062 0.058 0.059 0.048 0.049 0.053 0.057
##  [37] 0.063 0.063 0.057 0.048 0.055 0.060 0.062 0.072 0.046 0.063 0.052 0.056
##  [49] 0.071 0.069 0.062 0.053 0.052 0.064 0.064 0.065 0.061 0.072 0.053 0.057
##  [61] 0.061 0.062 0.069 0.054 0.059 0.051 0.049 0.052 0.067 0.062 0.057 0.070
##  [73] 0.058 0.066 0.057 0.070 0.046 0.064 0.067 0.073 0.065 0.074 0.060 0.055
##  [85] 0.054 0.064 0.062 0.078 0.057 0.061 0.068 0.075 0.054 0.055 0.067 0.054
##  [97] 0.068 0.050 0.050 0.063 0.058 0.059 0.056 0.058 0.059 0.054 0.058 0.058
## [109] 0.063 0.052 0.060 0.075 0.061 0.067 0.054 0.052 0.062 0.067 0.043 0.056
## [121] 0.060 0.069 0.061 0.060 0.067 0.054 0.062 0.062 0.056 0.045 0.067 0.067
## [133] 0.057 0.053 0.062 0.060 0.053 0.062 0.064 0.052 0.065 0.058 0.060 0.068
## [145] 0.075 0.060 0.074 0.066 0.053 0.057 0.058 0.051 0.060 0.062 0.057 0.058
## [157] 0.051 0.046 0.058 0.049 0.057 0.068 0.069 0.054 0.059 0.055 0.057 0.050
## [169] 0.066 0.073 0.075 0.056 0.070 0.058 0.057 0.057 0.074 0.071 0.065 0.058
## [181] 0.060 0.061 0.076 0.059 0.076 0.062 0.054 0.072 0.055 0.049 0.048 0.062
## [193] 0.054 0.057 0.057 0.066 0.067 0.061 0.052 0.064 0.065 0.051 0.065 0.062
## [205] 0.049 0.060 0.073 0.053 0.056 0.055 0.059 0.063 0.062 0.053 0.064 0.061
## [217] 0.059 0.074 0.054 0.052 0.056 0.050 0.055 0.062 0.077 0.060 0.059 0.070
## [229] 0.061 0.068 0.053 0.054 0.068 0.053 0.050 0.050 0.055 0.074 0.060 0.057
## [241] 0.055 0.064 0.065 0.066 0.051 0.075 0.045 0.063 0.043 0.052 0.043 0.064
## [253] 0.071 0.066 0.052 0.048 0.069 0.058 0.056 0.058 0.069 0.054 0.045 0.071
## [265] 0.066 0.058 0.053 0.072 0.058 0.067 0.077 0.050 0.058 0.060 0.061 0.062
## [277] 0.054 0.064 0.050 0.059 0.069 0.055 0.055 0.054 0.074 0.075 0.055 0.051
## [289] 0.057 0.062 0.058 0.062 0.070 0.050 0.046 0.060 0.062 0.056 0.063 0.056
## [301] 0.061 0.069 0.078 0.058 0.065 0.051 0.056 0.072 0.055 0.058 0.059 0.071
## [313] 0.075 0.057 0.065 0.053 0.065 0.056 0.057 0.049 0.050 0.059 0.058 0.069
## [325] 0.063 0.067 0.069 0.052 0.054 0.046 0.059 0.066 0.082 0.066 0.066 0.055
## [337] 0.062 0.054 0.070 0.077 0.064 0.066 0.057 0.061 0.070 0.041 0.044 0.054
## [349] 0.058 0.077 0.063 0.055 0.055 0.055 0.063 0.064 0.059 0.077 0.069 0.054
## [361] 0.058 0.060 0.067 0.064 0.063 0.063 0.060 0.064 0.072 0.060 0.068 0.054
## [373] 0.079 0.064 0.055 0.068 0.055 0.071 0.057 0.065 0.064 0.059 0.050 0.065
## [385] 0.069 0.070 0.063 0.053 0.059 0.054 0.061 0.063 0.070 0.060 0.062 0.061
## [397] 0.053 0.055 0.058 0.051 0.060 0.063 0.065 0.052 0.058 0.076 0.063 0.057
## [409] 0.056 0.048 0.065 0.074 0.060 0.062 0.060 0.054 0.056 0.075 0.077 0.070
## [421] 0.061 0.068 0.058 0.062 0.058 0.065 0.060 0.063 0.061 0.063 0.049 0.068
## [433] 0.060 0.051 0.059 0.053 0.059 0.059 0.065 0.071 0.057 0.064 0.063 0.049
## [445] 0.061 0.062 0.056 0.068 0.067 0.062 0.061 0.049 0.059 0.055 0.081 0.055
## [457] 0.053 0.060 0.068 0.069 0.067 0.063 0.068 0.064 0.071 0.060 0.066 0.060
## [469] 0.048 0.065 0.063 0.057 0.053 0.068 0.059 0.067 0.065 0.050 0.057 0.066
## [481] 0.056 0.060 0.051 0.073 0.054 0.063 0.061 0.078 0.057 0.051 0.058 0.035
## [493] 0.062 0.058 0.057 0.050 0.063 0.049 0.061 0.074

Grafica de las probabilidades calculadas

Finalmente, visualizamos la distribución de estas 500 probabilidades gracias a un histograma y un boxplot (con {ggplot2} package):

Estos dos gráficos muestran que la probabilidad de que al menos dos personas compartan las mismas iniciales en un grupo de 10 personas está entre el 5.9% y el 6.1%.

Para grupos de diferentes tamaños.

Ahora estamos interesados en calcular esta probabilidad no sólo para un grupo de 10 personas, sino también para grupos de diferentes tamaños. Podemos hacer esto con la ayuda de nuestra función definida anteriormente.

Para ilustrar, calculemos la probabilidad de que al menos dos personas tengan las mismas iniciales, para grupos de 2 y hasta 100 personas:

##   [1]    NA 0.002 0.010 0.006 0.014 0.025 0.032 0.034 0.051 0.068 0.094 0.086
##  [13] 0.101 0.134 0.141 0.131 0.143 0.215 0.241 0.258 0.256 0.275 0.285 0.330
##  [25] 0.353 0.336 0.376 0.399 0.424 0.453 0.491 0.500 0.538 0.553 0.552 0.567
##  [37] 0.627 0.637 0.671 0.670 0.658 0.696 0.738 0.722 0.745 0.750 0.782 0.785
##  [49] 0.816 0.811 0.812 0.832 0.853 0.868 0.892 0.885 0.897 0.907 0.919 0.930
##  [61] 0.920 0.923 0.944 0.942 0.944 0.944 0.962 0.970 0.962 0.971 0.959 0.970
##  [73] 0.982 0.981 0.978 0.980 0.982 0.992 0.995 0.989 0.990 0.992 0.989 0.994
##  [85] 0.994 0.994 0.995 0.993 0.996 0.995 0.996 0.999 0.998 1.000 0.999 1.000
##  [97] 0.999 0.999 0.997 0.997

Nos queda almacenar estas probabilidades junto con la cantidad de personas en el equipo en un dataframe y visualizamos las primeras 6 filas:

## [1] 100   2
##   n_persons  prob
## 1         1    NA
## 2         2 0.002
## 3         3 0.010
## 4         4 0.006
## 5         5 0.014
## 6         6 0.025

Por supuesto, dos personas con las mismas iniciales en un grupo de 1 (si podemos llamar a esto un grupo) es imposible.

Un evento que es imposible tiene una probabilidad igual a 0. Por lo tanto, imputamos esta probabilidad en nuestro dataframe, en la primera fila:

##   n_persons  prob
## 1         1 0.000
## 2         2 0.002
## 3         3 0.010
## 4         4 0.006
## 5         5 0.014
## 6         6 0.025

Visualización de probabilidades

Finalmente, visualizamos estas probabilidades en función del número de personas del grupo:

En el gráfico anterior, vemos que la probabilidad de que al menos dos personas tengan las mismas iniciales alcanza el 50% cuando el grupo supera las 30 personas.

Además, observe que esta probabilidad se acerca al 100% cuando el grupo llega a alrededor de 75 personas.

Verificación

En aras de la exhaustividad, ahora comparamos los resultados obtenidos mediante simulaciones con los resultados obtenidos de la teoría de la probabilidad.

Primero definimos la función que se utilizará para comparar los resultados encontrados anteriormente:

# define function
have_same <- function(s, n) {
  sample_space <- s
  probability <- 1
  for (i in 0:(n - 1)) {
    probability <- probability * (sample_space - i) / sample_space
  }
  1 - probability
}

Para nuestro grupo

Aplicando la función de probabilidad, teniendo en cuenta que en el idioma español tenemos 27 letras en el alfabeto (un espacio muestral de \(27^{2}\)), el resultado es:

## [1] 0.06011551

La probabilidad de que al menos dos personas tengan las mismas iniciales en un grupo de 10 es del 6,0%. Esto está cerca de la probabilidad encontrada con las simulaciones y dentro del rango del 5.9% al 6.1%.

Para grupos de diferentes tamaños.

Ahora calculamos la probabilidad para grupos de entre 1 y 100 personas y visualizamos las primeras 6 filas:

## [1] 100   2
##   n_persons        prob
## 1         1 0.000000000
## 2         2 0.001371742
## 3         3 0.004111463
## 4         4 0.008209770
## 5         5 0.013651691
## 6         6 0.020416769

Visualización según la teoría de la probabilidad

Finalmente, visualizamos estas probabilidades en función del número de personas del grupo:

Visualización simultanea.

Para una comparación más fácil, trazamos las probabilidades encontradas gracias a las simulaciones y gracias a la teoría de la probabilidad en el mismo gráfico:

El gráfico anterior muestra que los resultados que utilizan la teoría de la probabilidad son relativamente similares a los resultados obtenidos mediante simulaciones, lo que indica que las simulaciones son confiables.

Conclusiones

Es importante tener en cuenta los siguientes supuestos que se tuvieron:

  • Todas las letras del alfabeto tenían la misma probabilidad de aparecer, lo que significa que todos los pares de iniciales eran igualmente probables. Probablemente este no sea el caso en la realidad, ya que un nombre y apellido que comiencen con X no es tan probable como un nombre y apellido que comiencen respectivamente con M y K. Este sesgo podría limitarse especificando pesos diferentes al muestrear las iniciales.

  • Nos limitamos a iniciales de dos letras. Por lo tanto, para nombres o apellidos compuestos, sólo se considera la primera letra. Los segundos nombres tampoco se tienen en cuenta.

  • Se obtendran diferentes resultados cada vez que se ejecute el código. Para obtener el mismo resultado, toca setear una semilla base al inicio del código con setseed().

Código adaptado del BLOG Stats and R.