Calcular la Estadística KS con Python

La Estadística Kolmogorov-Smirnov (KS) es una de las métricas más importantes utilizadas para validar los modelos predictivos. Es ampliamente utilizado en el dominio BFSI. Si forma parte de un equipo de análisis de riesgos o de marketing que trabaja en un proyecto en el sector bancario, seguro que ha oído hablar de esta métrica.

¿Qué es la estadística KS?

Se trata de la estadística Kolmogorov-Smirnov, que lleva el nombre de Andrey Kolmogorov y Nikolai Smirnov. Compara las dos distribuciones acumulativas y devuelve la máxima diferencia entre ellas. Es una prueba no paramétrica, lo que significa que no es necesario probar ningún supuesto relacionado con la distribución de los datos. En la prueba KS, la hipótesis nula establece que ambas distribuciones acumulativas son similares. Rechazar la hipótesis nula significa que las distribuciones acumulativas son diferentes.

En la ciencia de los datos, compara la distribución acumulativa de eventos y no eventos y el KS es donde hay una diferencia máxima entre las dos distribuciones. En palabras sencillas, nos ayuda a entender lo bien que nuestro modelo predictivo es capaz de discriminar entre eventos y no eventos.

Suponga que está construyendo un modelo de propensión en el que el objetivo es identificar a los prospectos que probablemente compren un producto en particular. En este caso, la variable dependiente (objetivo) está en forma binaria y sólo tiene dos resultados: 0 (no evento) o 1 (evento). «Evento» se refiere a las personas que han comprado el producto. «No evento» se refiere a las personas que no compraron el producto. El estadístico KS mide si el modelo es capaz de distinguir entre prospectos y no prospectos.

Dos formas de medir el estadístico KS

Método 1 : Método de los deciles

Este método es el más común para calcular el estadístico KS para validar el modelo predictivo binario. Vea los pasos siguientes.

  1. Necesita tener dos variables antes de calcular el KS. Una es la variable dependiente que debe ser binaria. La segunda es la puntuación de probabilidad predicha que se genera a partir del modelo estadístico.
  2. Cree deciles basados en las columnas de probabilidad predicha, lo que significa dividir la probabilidad en 10 partes. El primer decil debe contener la puntuación de probabilidad más alta.
  3. Calcule el porcentaje acumulativo de sucesos y no sucesos en cada decil y, a continuación, calcule la diferencia entre estas dos distribuciones acumulativas.
  4. KS es donde la diferencia es máxima
  5. Si KS está en el tercer decil superior y la puntuación es superior a 40, se considera un buen modelo de predicción. Al mismo tiempo, es importante validar el modelo mediante la comprobación de otras métricas de rendimiento también para confirmar que el modelo no está sufriendo de un problema de sobreajuste.

KS Python

Python : Método de deciles de estadísticas KS

Importar datos y bibliotecas requeridas

He preparado una muestra de datos para el ejemplo. El conjunto de datos contiene dos columnas llamadas y y p.yes una variable dependiente.pse refiere a la probabilidad predicha.

import pandas as pdimport numpy as npdf = pd.read_csv("https://raw.githubusercontent.com/deepanshu88/data/master/data.csv")
Función de Python para el estadístico KS
def ks(data=None,target=None, prob=None): data = 1 - data data = pd.qcut(data, 10) grouped = data.groupby('bucket', as_index = False) kstable = pd.DataFrame() kstable = grouped.min() kstable = grouped.max() kstable = grouped.sum() kstable = grouped.sum() kstable = kstable.sort_values(by="min_prob", ascending=False).reset_index(drop = True) kstable = (kstable.events / data.sum()).apply('{0:.2%}'.format) kstable = (kstable.nonevents / data.sum()).apply('{0:.2%}'.format) kstable=(kstable.events / data.sum()).cumsum() kstable=(kstable.nonevents / data.sum()).cumsum() kstable = np.round(kstable-kstable, 3) * 100 #Formating kstable= kstable.apply('{0:.2%}'.format) kstable= kstable.apply('{0:.2%}'.format) kstable.index = range(1,11) kstable.index.rename('Decile', inplace=True) pd.set_option('display.max_columns', 9) print(kstable) #Display KS from colorama import Fore print(Fore.RED + "KS is " + str(max(kstable))+"%"+ " at decile " + str((kstable.index==max(kstable)]))) return(kstable)
Cómo usar la función
mydf = ks(data=df,target="y", prob="p")
  1. data se refiere al dataframe de pandas que contiene tanto la variable dependiente como las puntuaciones de probabilidad.
  2. target se refiere al nombre de la columna de la variable dependiente
  3. prob se refiere al nombre de la columna de la probabilidad predicha
Salida

Devuelve la información de cada decil en formato tabular y también imprime la puntuación KS debajo de la tabla. También genera la tabla en un nuevo marco de datos.

 min_prob max_prob events nonevents event_rate nonevent_rate \Decile 1 0.298894 0.975404 49 51 49.00% 5.67% 2 0.135598 0.298687 19 81 19.00% 9.00% 3 0.082170 0.135089 14 86 14.00% 9.56% 4 0.050369 0.082003 10 90 10.00% 10.00% 5 0.029415 0.050337 5 95 5.00% 10.56% 6 0.018343 0.029384 1 99 1.00% 11.00% 7 0.011504 0.018291 1 99 1.00% 11.00% 8 0.006976 0.011364 1 99 1.00% 11.00% 9 0.002929 0.006964 0 100 0.00% 11.11% 10 0.000073 0.002918 0 100 0.00% 11.11% cum_eventrate cum_noneventrate KS Decile 1 49.00% 5.67% 43.3 2 68.00% 14.67% 53.3 3 82.00% 24.22% 57.8 4 92.00% 34.22% 57.8 5 97.00% 44.78% 52.2 6 98.00% 55.78% 42.2 7 99.00% 66.78% 32.2 8 100.00% 77.78% 22.2 9 100.00% 88.89% 11.1 10 100.00% 100.00% 0.0 KS is 57.8% at decile 3
Método 2 : Prueba KS de dos muestras

Por medio de la bibliotecascipyde python, podemos calcular el estadístico KS de dos muestras. Tiene dos parámetros – datos1 y datos2. En data1, introduciremos todas las puntuaciones de probabilidad correspondientes a los no eventos. En data2, se tomarán las puntuaciones de probabilidad correspondientes a los eventos.

from scipy.stats import ks_2sampdf = pd.read_csv("https://raw.githubusercontent.com/deepanshu88/data/master/data.csv")ks_2samp(df.loc, df.loc)

Devuelve una puntuación KS de 0,6033 y un valor p inferior a 0,01, lo que significa que podemos rechazar la hipótesis nula y concluir que la distribución de los eventos y los no eventos es diferente.

OutputKs_2sampResult(statistic=0.6033333333333333, pvalue=1.1227180680661939e-29)
Nota importante

La puntuación KS del método 2 es ligeramente diferente del método 1, ya que el segundo se calcula a nivel de fila y el primero se calcula después de convertir los datos en diez partes.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.