Cómo calcular la distancia de Mahalanobis en Python

La distancia de Mahalanobis es la distancia entre dos puntos en un espacio multivariado. A menudo se usa para encontrar valores atípicos en análisis estadísticos que involucran varias variables.

Este tutorial explica cómo calcular la distancia de Mahalanobis en Python.

Ejemplo: Distancia de Mahalanobis en Python

Utilice los siguientes pasos para calcular la distancia de Mahalanobis para cada observación en un conjunto de datos en Python.

Paso 1: crea el conjunto de datos.

Primero, crearemos un conjunto de datos que muestra el puntaje del examen de 20 estudiantes junto con la cantidad de horas que pasaron estudiando, la cantidad de exámenes de preparación que tomaron y su calificación actual en el curso:

importar numpy como np
 importar pandas como pd 
importar scipy como estadísticas

datos = {'puntuación': [91, 93, 72, 87, 86, 73, 68, 87, 78, 99, 95, 76, 84, 96, 76, 80, 83, 84, 73, 74],
        'horas': [16, 6, 3, 1, 2, 3, 2, 5, 2, 5, 2, 3, 4, 3, 3, 3, 4, 3, 4, 4],
        'preparación': [3, 4, 0, 3, 4, 0, 1, 2, 1, 2, 3, 3, 3, 2, 2, 2, 3, 3, 2, 2],
        'grado': [70, 88, 80, 83, 88, 84, 78, 94, 90, 93, 89, 82, 95, 94, 81, 93, 93, 90, 89, 89]
        }

df = pd.DataFrame (datos, columnas = ['puntuación', 'horas', 'preparación', 'calificación'])
df.head ()

 puntaje de horas grado de preparación
0 91 16 3 70
1 93 6 4 88
2 72 3 0 80
3 87 1 3 83
4 86 2 4 88

Paso 2: Calcule la distancia de Mahalanobis para cada observación.

A continuación, escribiremos una función corta para calcular la distancia de Mahalanobis.

#create función para calcular la distancia de Mahalanobis 
def mahalanobis (x = Ninguno , datos = Ninguno , cov = Ninguno ):

    x_mu = x - np.mean (datos)
    si no cov:
        cov = np.cov (datos.valores.T)
    inv_covmat = np.linalg.inv (cov)
    izquierda = np.dot (x_mu, inv_covmat)
    mahal = np.dot (izquierda, x_mu.T)
    volver mahal.diagonal ()

# crear una nueva columna en el marco de datos que contenga la distancia de Mahalanobis para cada fila
df ['mahalanobis'] = mahalanobis (x = df, data = df [['score', 'hours', 'prep', 'grade']])

#muestra las primeras cinco filas del marco de datos
 df.head ()

 puntaje de horas grado de preparación mahalanobis
0 91 16 3 70 16.501963
1 93 6 4 88 2.639286
2 72 3 0 80 4.850797
3 87 1 3 83 5.201261
4 86 2 4 88 3.828734

Paso 3: Calcule el valor p para cada distancia de Mahalanobis.

Podemos ver que algunas de las distancias de Mahalanobis son mucho mayores que otras. Para determinar si alguna de las distancias es estadísticamente significativa, necesitamos calcular sus valores p.

El valor p para cada distancia se calcula como el valor p que corresponde al estadístico Chi-Cuadrado de la distancia de Mahalanobis con k-1 grados de libertad, donde k = número de variables. Entonces, en este caso usaremos grados de libertad de 4-1 = 3.

de scipy.stats importar chi2

#calcular el valor p para cada distancia de Mahalanobis 
df ['p'] = 1 - chi2.cdf (df ['mahalanobis'], 3)

# mostrar valores p para las primeras cinco filas en el marco de datos
df.head ()

 puntuación horas grado de preparación mahalanobis p
0 91 16 3 70 16.501963 0.000895
1 93 6 4 88 2.639286 0.450644
2 72 3 0 80 4.850797 0.183054
3 87 1 3 83 5,201261 ​​0,157639
4 86 2 4 88 3.828734 0.280562

Normalmente, un valor p inferior a 0,001 se considera un valor atípico.Podemos ver que la primera observación es un valor atípico en el conjunto de datos porque tiene un valor p menor que .001.

Dependiendo del contexto del problema, puede decidir eliminar esta observación del conjunto de datos, ya que es un valor atípico y podría afectar los resultados del análisis.

  • https://r-project.org
  • https://www.python.org/
  • https://www.stata.com/

Deja un comentario

Se usa una prueba F para probar si dos varianzas poblacionales son iguales. Las hipótesis nula y alternativa para la…
statologos comunidad-2

Compartimos información EXCLUSIVA y GRATUITA solo para suscriptores (cursos privados, programas, consejos y mucho más)

You have Successfully Subscribed!