La Matriz de Confusión: ¡claramente explicada!
Parece que se acordó aposta este apellido de ‘de confusión’ a esta técnica porque, efectivamente, puede llegar a ser realmente confusa las primeras veces que te enfrentas con ella. Bueno, a no ser, que las primeras veces sean leyendo este artículo ;). Aquí espero explicarte de manera realmente clara qué es la matriz de confusión, para qué se utiliza y porqué es una herramienta que se emplea ampliamente cuando evaluamos modelos de aprendizaje automático. Comencemos!
Los problemas de clasificación en aprendizaje automático (una ligerísima introducción)
¡Pero bueno! Estaba yo leyendo sobre matrices de confusión y ahora pasamos a temas de problemas de clasificación… ¡Esto si que es confuso!
Bueno, realmente si estás interesado en conocer y aclarar tus dudas de la matriz de confusión, conoces lo que son los problemas de clasificación en el aprendizaje automático. ¿Y por qué hablar de esto en un artículo sobre la matriz de confusión? Pues básicamente porque la matriz de confusión y los problemas de clasificación en ‘machine learning’ van bien cogidos de la mano. Y la razón es bien sencilla:
La matriz de confusión no es más que la herramienta base para conocer y evaluar cuán bueno es nuestro algoritmo (o modelo) de clasificación que hemos desarrollado con objeto de resolver nuestro problema de clasificación.
Definición Propia
Como tal, la matriz de confusión no es una medida o un indicador unívoco de lo bueno o malo que es un modelo por si mismo, pero si es la base para construir multitud de métricas de rendimiento de un algoritmo clasificador.
Ahora es cuando te recuerdo brevemente que un algoritmo de clasificación (destinado a resolver un problema de clasificación) es aquel que dada una serie de datos de entrada permite clasificar una variable de salida entre dos o varias opciones (a veces numéricas, a veces categóricas, a veces binarias, a veces multiclase…).
La mayoría de los problemas reales que enfrentan multitud de negocios son problemas de clasificación. Y me atrevería a decir más, la vasta mayoría de los problemas de clasificación son de naturaleza binaria, es decir, elegir entre dos opciones.
Existen miles de ejemplos de algoritmos de clasificación: detectar si un individuo es positivo o no en la enfermedad del COVID-19 (enfermedad que habréis oído hablar de ella seguro…), clasificar un mensaje de correo electrónico en SPAM o HAM (HAM es la terminología un tanto friki para referirse a NO-SPAM), conocer si un cliente renovará o no el contrato del seguro del coche, determinar el tipo de variedad de lirio conociendo ciertas medidas de sus sepalos (seguro que esto te es familiar…). Y podría estar escribiendo ejmplo tras ejemplo el resto de esta preciosa y calurosa tarde de viernes…
Por tanto, y acudiendo a la cita del estadístico británico George E.P. Box:
Todos los modelos están equivocados, pero algunos son útiles
George E. P. Box
Se puede uno preguntar ¿Sería posible entonces, medir, cuánto de equivocados están, o bien, cuán de útiles son? La respuesta es sí y subyace en la matriz de confusión.
La Matriz de Confusión en Clasificación Binaria
Como he mencionado unos párrafos más arriba, la gran mayoría de problemas de clasificación suelen ser de naturaleza binaria: nuestro clasificador debe devolver un resultado que o bien vale una cosa o bien vale otra.
Por eso, lo más comúnmente empleado y más profundizado son las matrices de confusión de clasificaciones binarias.
Y sin más preámbulos te presento a la estrella de nuestro artículo. Aquí tienes la Matriz de Confusión:

Esta es, sin duda, la modalidad más común en la que te encontrarás a la matriz de confusión (en su versión en español). Sin embargo, desde mi punto de vista, los términos positivo y negativo pueden llevar a cierta equivocación cuando nos enfrentamos a ciertos casos de clasificación con lo que yo he realizado pequeñas modificaciones de notación y nomenclatura que, espero, te permita recordar más fácilmente esta matriz. Et voilà!

¡La matriz de confusión ha pasado de tener positivos, negativos a tener ‘hombrecito’ azul y ‘hombrecito’ blanco! ¡Y lo que antes eran verdaderos positivos ahora son verdaderos ‘perseguidos’!
Efectivamente, siempre que tenemos una cuestión de clasificación binaria, suele ocurrir que es una de las clases la que nos interesa más identificar mejor, es decir, es la clase que perseguimos. El claro ejemplo se tendría en los modelos de «churning» de clientes, esto es, modelos que basándose en datos históricos de clientes predicen si un cliente se dará de baja o no de un cierto servicio/s. Considerando este ejemplo y la matriz de la Figura 1, la clase positiva sería: ‘cliente que se va a dar de baja’. Sin embargo, nuestro sentido común podría alertarnos de que no parece algo tan «positivo» que un cliente se dé de baja de un servicio… Lo que sí que es cierto es que en éste y cualquier otro modelo siempre tenemos una clase que es la que nos gustaría poder detectar sí o sí pues realizaremos ciertas acciones sobre los sujetos / individuos pertenecientes a dicha clase. En el caso del «churning» de clientes, por ejemplo, podría ser el de lanzar una cierta oferta o campaña para reforzar la permanencia en el servicio del cliente. Por tanto nuestro caso de negocio «persigue» detectar este tipo de individuo y de ahí que los positivos se traduzcan en ‘perseguidos’ (qué curioso! también empieza por «p»…) y los negativos en ‘NO perseguidos’ (nuevamente curioso que comience por «n»…)
Ahora con los conceptos de ‘hombrecito’ azul y blanco y clase ‘perseguida’ y ‘no perseguida’ más o menos entendidos podemos comenzar a desgranar todas las posibilidades que nos ofrece la matriz de confusión.
Ejemplo de aplicación: renovación del contrato del seguro del coche.
Para ilustrar de un modo más intuitivo la matriz de confusión y las diferentes métricas partiremos de un ejemplo más o menos real al que podrías enfrentarte si estás en el departamento de Data Science de una aseguradora. El proyecto en el que te encuentras inmerso o inmersa busca conocer si un cliente renovará o no su contrato anual del seguro premium de su vehículo. Para ello la empresa cuenta, por supuesto, con una base de datos histórica de renovaciones de seguros con la que trabajaremos para la creación de nuestro modelo / algoritmo de clasificación.
Como en casi todos los problemas de clasificación (por no decir en todos) en los que empleamos algoritmos supervisados, hemos reservado un conjunto de datos de nuestra base de datos para el «testeo» de lo bueno que es nuestro algoritmo. Este conjunto podría ser perfectamente como el mostrado en la siguiente figura:

Efectivamente se trata de un conjunto de clientes de los cuáles sabemos que algunos renovarán el contrato y otros no. A nuestra compañía le interesa identificar a aquellos que «no renovarán» el contrato para dirigirles una cierta campaña de re-captación. Por tanto podemos decir que:
- Clase ‘Perseguida’ == ‘Hombrecito’ azul == Cliente que NO renovará el seguro de automóvil.
- Clase ‘No Perseguida’ == ‘Hombrecito’ blanco == Cliente que SÍ renovará el seguro de automóvil.
Realizando un conteo básico en nuestro conjunto de testeo hemos visto que tenemos un total de 1875 clientes de los cuáles 793 no renovaron el seguro y el resto, 1082 sí lo hicieron. Con estos datos no podemos, todavía, rellenar los ‘cuadraditos’ de la matriz de confusión, pero, si podemos establecer ciertas restricciones:

A continuación, probaríamos el conjunto de datos de testeo a través de nuestro algoritmo y obtendríamos el conjunto de predicciones. Imaginemos que el resultado de las 1875 predicciones es el siguiente:
- 746 clientes no renuevan el seguro
- 1129 clientes sí lo hacen
Nuevamente, seguimos sin poder rellenar los cuadraditos de la matriz de confusión, pero tenemos nuevas restricciones:

Para poder poblar definitivamente la matriz de confusión se deberá comparar uno a uno la realidad dentro del conjunto de datos y lo que el modelo predijo para cada individuo, tal y como se muestra en la Figura 6, a continuación:

Esta comparación y conteo ya se encuentra mapeada dentro de los lenguajes comunes de Data Science (R, Python, Julia…) por lo que no es necesario, desde nuestro quehacer como científico de datos, ir recorriendo matrices/arrays e ir comparando. Una vez realizada esta operación en nuestro ejemplo práctico tenemos los siguientes datos:

¡Perfecto! Ya tenemos construida perfectamente la matriz de confusión de nuestro clasificador (renueva o no contrato) aplicado a nuestro conjunto de testeo. Parece evidente ver que un clasificador «perfecto» tendría una matriz de confusión diagonal (es decir, con ceros en todos los elementos de la matriz que no fueran la diagonal principal) puesto que eso implicaría que no hay observaciones donde se dijo que el ‘hombrecito’ era azul cuando en realidad era blanco y viceversa. Observando a priori la matriz que hemos obtenido, y sin conocer mucho más allá de todas las métricas de evaluación y rendimiento que podemos obtener de ella, vemos que nuestro clasificador no es «perfecto» y que ha cometido errores…
Errores de clasificación.
No es casualidad que los colores que he elegido para los ‘cuadraditos’ de la matriz de confusión sean los que son. Si te fijas bien hay colores de tono verde y colores de tono rojo. Los de color verde pertenecen a la diagonal principal puesto que el interés, al final, es el de tener esos valores los máximos posibles. El hecho de que uno sea «más verde» que el otro no es más que por dar algo más de importancia al verdadero ‘perseguido’ respecto al verdadero ‘NO perseguido’ aunque esto no depende del algoritmo en sí sino de las proporciones reales dentro de la población de individuos.
Sin embargo, los colores de tono rojo si tienen mayor significado. El hecho de que uno sea «más rojo» que el otro es porque ambos ‘cuadraditos’ representan errores de clasificación de diferente gravedad.
Para ilustrar mucho mejor porqué decimos que son errores de diferente gravedad tomaremos como ejemplo un problema de clasificación en el que el objetivo es el diagnóstico del cáncer. En este caso la clase «»positiva»» es considerar que el paciente SÍ tiene cáncer y como clase «»negativa»» el hecho de que NO lo tiene. Nuevamente en este ejemplo puede verse la razón por la que he cambiado la nomenclatura, ya que nuestro esfuerzo para este caso es perseguir al paciente aquejado de cáncer para poder iniciar su tratamiento lo antes posible.
Los dos tipos de errores que encontramos son:
- Error Tipo I == Falsos Positivos == Falsos ‘Perseguidos’: El paciente no tiene cáncer, pero el algoritmo ha diagnosticado que sí lo padece. Se realizarán pruebas diagnósticas adicionales que acabarán descartando el diagnóstico. Tendrá un coste económico y un impacto emocional sobre el paciente, pero no se traducirá en riesgo vital.
- Error Tipo II == Falsos Negativos == Falsos ‘NO Perseguidos’: El paciente sí tiene cáncer, pero el algoritmo predice que no. Este error del algoritmo se traduce en una falta de detección temprana de la enfermedad. El paciente no recibirá tratamiento a tiempo y esto, indudablemente reduce sus posibilidades de superar la enfermedad.
Viendo la importancia que tiene discriminar en cada caso concreto los distintos tipos de error que pueden resultar de la aplicación del algoritmo, entendemos mejor la necesidad de trabajar con diferentes métricas. Es importante, antes de comenzar con ello, tener bien claro la nomenclatura en inglés y en español de cada uno de los términos.
Pero quizá antes de comenzar con la explicación de las métricas definiremos, ya bien, los cuatro ‘cuadraditos’ que forman parte de la matriz de confusión y que introdujimos en la Figura 2 de este artículo utilizando el ejemplo:
- Verdaderos «Perseguidos» == Verdaderos Positivos (VP) == True Positives (TP): Son los casos en los que el modelo/algoritmo predice que se trata de un ‘hombrecito’ azul y en la realidad es un ‘hombrecito’ azul.
- Verdaderos «NO Perseguidos» == Verdaderos Negativos (VN) == True Negatives (TP): Son los casos en los que el modelo/algoritmo predice que se trata de un ‘hombrecito’ blanco y en la realidad es un ‘hombrecito’ blanco.
- Falsos «Perseguidos» == Falsos Positivos (FP) == False Positives (FP) == Error de Tipo I: Son los casos en los que el modelo/algoritmo predice que se trata de un ‘hombrecito’ azul y en la realidad es un ‘hombrecito’ blanco.
- Falsos «NO Perseguidos» == Falsos Negativos (FN) == False Negatives (FN) == Error de Tipo II: Son los casos en los que el modelo/algoritmo predice que se trata de un ‘hombrecito’ blanco y en la realidad es un ‘hombrecito’ azul.
Ahora sí, conociendo lo que significa cada número dentro de la matriz de confusión vamos a definir las diferentes métricas que nos serán muy útiles para conocer el desempeño de nuestro clasificador y, sobretodo, poder compararlo. Las medidas más importantes son:
- Exactitud (Accuracy)
- Precision (Precision)
- Sensibilidad (Recall)
- Especificidad (Especificity)
- Índice F1 (F1 Score)
Además de estas medidas existen otras, quizá de menor importancia, pero que suelen obtenerse también a la hora de pedir a un lenguaje de programación orientado a Data Science (Python, R, Julia) que nos devuelva un resumen del rendimiento de un clasificador a través de métodos de «matriz de confusión». Estas serían:
- Tasa de Error (Error Rate)
- Prevalencia (Prevalence)
- Índice de Jaccard (Jaccard Index)
- Tasa de Falsos Positivos (False Positive Rate, FPR)
- Tasa de Falsos Negativos (False Negative Rate, FNR) (Se usa poco o nada)
- Ratio de Predicciones Positivas (Positive Predictive Ratio, PPR) (En realidad es la precisión)
- Ratio de Predicciones Negativas (Negative Predictive Ratio, NPR) (También usado con poca frecuencia)
- Tasa de Verdaderos Positivos (True Positive Rate, TPR) (En realidad es la sensibilidad…)
- Tasa de Verdaderos Negativos (True Negative Rate, TNR) (En realidad es la especificidad)
Como ves, hay medidas para rato así que, vamos a desgranarlas una a una comenzando por las más comunes.
Exactitud (Accuracy)
Es quizá la medida más «natural» y de «sentido común» que nos vendría a la mente sobre lo bien que funciona nuestro clasificador ya que se define como la proporción que existe entre las predicciones realizadas correctamente sobre el total de predicciones realizadas. En nuestro caso del ejemplo sería la suma de:
- Aquellas observaciones en las que el algoritmo predijo ‘hombrecito’ azul y, efectivamente, era ‘hombrecito’ azul (Verdadero ‘Perseguido’)
- Aquellas observaciones en las que el algoritmo predijo ‘hombrecito’ blanco y, efectivamente, era ‘hombrecito’ blanco (Verdadero ‘No Perseguido’)
Esa suma se divide entre el total de predicciones realizadas y tenemos el valor de la exactitud. Si queremos verlo con los colores de la matriz de confusión sería algo así:

Para nuestro ejemplo obtenemos un valor del 84.7% que no es, digamos, un valor malo a priori aunque debemos tener un cuidado extremo al evaluar la clasificación solamente fijándonos en el valor de la exactitud. Más adelante explicaré porqué. Vamos ahora a por la siguiente medida.
Precisión (Precision)
Hemos visto que la exactitud (accuracy en inglés) se fija en predicciones correctas hechas por el algoritmo de clasificación «dándole un poco igual» que la predicción sea correcta para la clase «perseguida» (‘hombrecito azul’) como la «no perseguida» (‘hombrecito’ blanco). La precisión, en cambio, se fija solamente en la clase «perseguida» y su objetivo es darnos la proporción de aciertos de la clase «perseguida» (es decir observaciones predichas como ‘hombrecito’ azul que realmente eran ‘hombrecitos’ azules) sobre el total de predicciones de ‘hombrecito’ azul, es decir, el porcentaje de predicciones ‘perseguidas’ que fueron correctas. Nuevamente con un gráfico se ve mucho mejor:

Para nuestro ejemplo obtenemos un valor de precisión del 83.9%, un valor nada desdeñable… Pero todavía quedan muchas métricas por descubrir.
Exactitud y precisión, precisión y exactitud…
En nuestro lenguaje habitual muchas veces no nos detenemos a analizar el uso de estas dos palabras empleándolas habitualmente de manera indiferente. Sin embargo en el campo de la matemática / estadística / ciencia de datos / etc tienen significados diferentes como hemos visto más arriba.
La exactitud (accuracy) se refiere a lo cerca que está el resultado de una medición del valor verdadero. En términos estadísticos, la exactitud está relacionada con el sesgo de una estimación.
Por su parte, la precisión, se refiere a la dispersión del conjunto de valores obtenidos a partir de mediciones repetidas de una magnitud. Cuanto menor es la dispersión mayor la precisión.
Como siempre, una imágen vale más que mil palabras y nos puede ayudar ciertamente a comprender bien los conceptos. Pongamos a 4 individuos a disparar a diana. Diremos de ellos que tienen:

Sensibilidad (Recall)
La sensibilidad y la especificidad son dos valores que nos indican la capacidad de nuestro estimador para discriminar los casos positivos («perseguidos»), de los negativos («no perseguidos»).
A la sensibilidad (que generalmente es referida como Recall en los entornos científico-profesionales de habla castellana) también se la conoce como Tasa de Verdaderos Positivos (True Positive Rate, TPR).
En la práctica es la proporción de casos «perseguidos» que fueron identificados correctamente por el algoritmo. Es decir, de todos los ‘hombrecitos’ azules que había en mi conjunto de testeo qué porcentaje identificó correctamente el algoritmo de clasificación. Por tanto, gráficamente esto queda como:

Especificidad (Specificity)
También conocida como la Tasa de Verdaderos Negativos, (True Negative Rate, TRN) Se trata de los casos negativos («no perseguidos») que el algoritmo ha clasificado correctamente. Expresa cuán bien puede el modelo detectar esa clase.
En la práctica es la proporción de casos «no perseguidos» que fueron identificados correctamente por el algoritmo. Es decir, de todos los ‘hombrecitos’ blancos que había en mi conjunto de testeo qué porcentaje identificó correctamente el algoritmo de clasificación como ‘hombrecitos’ blancos. Por tanto, gráficamente esto queda como:

Fijándonos un poco bien, y sin ánimo de confundir más sobre este tema, la especificidad no es más que el ‘Recall’ de la clase «no perseguida» puesto que toma como numerador y denominador los valores complementarios a los tomados en el cálculo del ‘Recall’.
Índice F1 (F1 Score)
Esta es otra metrica muy empleada porque nos resume la precisión y sensibilidad (precisión y recall) en una sola cifra. Por ello es de gran utilidad cuando la distribución de las clases es desigual, por ejemplo cuando el número de observaciones de la clase «no perseguida» es del 15% y los de la clase «perseguida es del otro es 85% restante.
El F1-Score se calcula como la media armónica entre precision y sensibilidad. Es una métrica equilibrada entre tener pocos falsos positivos y pocos falsos negativos:

Estas son las 4 métricas más importantes (junto con el F1-Score) que se pueden obtener de la matriz de confusión y por tanto podemos identificar cuatro casos posibles al analizar el comportamiento de sus valores con respecto a la clase «perseguida» (que en nuestro ejemplo, recuerdo, es identificar a los ‘hombrecitos’ azules):
- Alta precision y alto recall: el modelo maneja perfectamente esa clase. Se trata de un buen modelo de clasificación para poder implementar en nuestro proyecto.
- Alta precision y bajo recall: el modelo no detecta la clase «perseguida» muy bien, pero cuando lo hace es altamente confiable.
- Baja precisión y alto recall: El algoritmos detecta bien la clase «perseguida» pero también incluye muestras de la/s otra/s clase/s.
- Baja precisión y bajo recall: El modelo no logra clasificar la clase correctamente. No sería bueno seguir adelante con la implementación de dicho modelo.
Describiré muy someramente, a continuación, el resto de medidas ya menos importantes que también se obtienen de la matriz de confusión:
Tasa de Error (Error Rate)
Lo complementario a la Exactitud (Accuracy) es la tasa de error y muestra la proporción con la que el algoritmo de clasificación se equivoca:

Prevalencia
La prevalencia no tiene mucho que ver con el rendimiento del algoritmo clasificador en sí pero es una medida muy importante para conocer si estamos ante un caso de un conjunto de datos desbalanceado y que puede ocasionar bastantes quebraderos de cabeza para el científico de datos.
La prevalencia no es más ni menos que la proporción de individuos / observaciones reales de la clase «perseguida» sobre el total de individuos / observaciones dentro del conjunto de datos. Lo ideal es que la prevalencia se encuentre en torno al 50% para evitar lo mencionado anteriormente de conjuntos de datos desbalanceados. Aunque esto casi siempre es una utopía por la propia naturaleza del hecho que estamos observando en cuestión.

Índice de Jaccard (Jaccard Index)
¿Qué es el índice de Jaccard? El índice de Jaccard está muy extensamente empleado para la medida del grado de similaridad de dos conjuntos, sea cual sea el tipo de elementos.
El caso que aquí nos ocupa no es muy diferente a dos conjuntos distintos (observaciones reales y predicciones hechas por un algoritmos) de los cuales queremos conocer su similaridad, por tanto, el índice de Jaccard parece una manera sensata de poder medirlo.
El índice de Jaccard tiene la siguiente formulación:

Por tanto, toma la proporción de elementos comunes en dos conjuntos con respecto a todos los elementos de ambos conjuntos. El índice de Jaccard va desde 0 a 1. Si toma el valor de 1 el índice de Jaccard nos está diciendo que se trata de conjuntos completamente idénticos.
Visualizándolo con respecto a la matriz de confusión quedaría de la siguiente manera:

Tasa de Falsos Positivos (False Positive Rate, FPR)
Si bien no la incluí entre las métricas más importantes (las primeras 4 descritas) ésta es una medida bastante empleada, sobretodo, porque se usa en la construcción de las curvas ROC de los clasificadores binarios. (En otro momento hablaré de dichas curvas en otro artículo). También se conoce como el Ratio de Falsa Alarma (False Alarm Ratio).
La tasa de falsos positivos es la proporción de casos negativos que fueron erróneamente clasificados como positivos por el algoritmo sobre el total de casos reales negativos, traducido a nuestro ejemplo: la proporción «no perseguidos» (‘hombrecitos’ blancos) que fueron erróneamente clasificados como «perseguidos» (‘hombrecitos’ azules) sobre el total de ‘hombrecitos’ blancos rales.

Tasa de Falsos Negativos (False Negative Rate, FNR)
Esta métrica se usa realmente poco en la medición de rendimiento y potencial de un algoritmo clasificador. Se trataría de la proporción de casos positivos incorrectamente clasificados.

Tasa de Verdaderos Positivos (True Positive Rate, TPR)
Por definición esto corresponde a la sensibilidad (Recall).
Tasa de Verdaderos Negativos (True Negative Rate, TNR)
Por definición, esto corresponde a la especificidad (Especificity)
Ratio de Predicciones Positivas (Positive Predictive Ratio, PPR)
Por definición, esto corresponde a la precisión (precision)
Ratio de Predicciones Negativas (Negative Predictive Ratio, NPR)
Al igual que la tasa de Falsos Negativos, esta métrica se emplea realmente poco para la comparación de rendimientos de un algoritmo de clasificación.
En Resumen…
Como hemos visto el concepto de la matriz de confusión no es tan confuso como pudiera parecer pero si es cierto que conlleva muchos tipos de medidas, cálculos y definiciones y es algo denso «de digerir…»
Al final, en la práctica, emplearemos la matriz de confusión y sus métricas para comparar diferentes algoritmos de clasificación y nos conviene conocer sobre qué métricas actuar dependiendo del tipo de proyecto en el que estemos trabajando. A continuación te pongo algunos ejemplos:
- PROYECTO – Diagnosticar un tumor como maligno o benigno en función de una colección de lecturas médicas: En este caso, el objetivo es no mandar pacientes enfermos a casa, por tanto, se maximizará el recall.
- PROYECTO – Predecir si una transacción es fraudulenta o no: En este caso, el objetivo es reconocer fraude, pero sin molestar a los clientes que no han cometido ninguna ilegalidad. Se maximizará, entonces, la precision.
- PROYECTO – Predecir si una reserva de un hotel se cancelará o no: En este caso, se persigue un equilibrio entre reconocer cancelaciones y aplicar promociones, y aplicar promociones a reservas que no se van a cancelar, por tanto, el f1-score será la métrica a maximizar.
Ahora te toca a ti asimilar estos conceptos y comenzar a jugar con los resultados de tus algoritmos de clasificación. ¡Mucha suerte y gracias por tu lectura!
PS: En este artículo nos hemos centrado en la matriz de confusión binaria, pero el concepto se puede desplegar de manera similar para algoritmos de clasificación de 3 o más clases (como por ejemplo el famoso dataset de Iris…). Dejo para más adelante una publicación sobre esta matriz aplicada a casos no binarios pero seguro que con todo lo que sabes ya, puedes hacerte una idea de cómo irán los tiros :).