Calculați statistica KS cu Python

Statistica Kolmogorov-Smirnov (KS) este una dintre cele mai importante metrici utilizate pentru validarea modelelor predictive. Este utilizat pe scară largă în domeniul BFSI. Dacă faceți parte din echipa de analiză de risc sau de marketing care lucrează la un proiect în domeniul bancar, trebuie să fi auzit de această măsurătoare.

Ce este statistica KS?

Este acronimul de la Kolmogorov-Smirnov, care este numit după Andrey Kolmogorov și Nikolai Smirnov. Aceasta compară cele două distribuții cumulative și returnează diferența maximă dintre ele. Este un test neparametric, ceea ce înseamnă că nu este nevoie să testați nicio ipoteză legată de distribuția datelor. În testul KS, ipoteza nulă afirmă că ambele distribuții cumulative sunt similare. Respingerea ipotezei de nul înseamnă că distribuțiile cumulative sunt diferite.

În știința datelor, acesta compară distribuția cumulativă a evenimentelor și a non-evenimentelor, iar KS este acolo unde există o diferență maximă între cele două distribuții. Cu cuvinte simple, ne ajută să înțelegem cât de bine este capabil modelul nostru predictiv să discrimineze între evenimente și non-evenimente.

Să presupunem că construiți un model de propensiune în care obiectivul este de a identifica perspectivele care sunt susceptibile de a cumpăra un anumit produs. În acest caz, variabila dependentă (țintă) este în formă binară care are doar două rezultate : 0 (non-eveniment) sau 1 (eveniment). „Eveniment” înseamnă persoanele care au cumpărat produsul. „Non-eveniment” se referă la persoanele care nu au cumpărat produsul. Statistica KS măsoară dacă modelul este capabil să facă distincția între prospecți și non-prospecți.

Două modalități de măsurare a statisticii KS

Metoda 1 : Metoda decilelor

Această metodă este cea mai comună modalitate de a calcula statistica KS pentru validarea modelului predictiv binar. Consultați pașii de mai jos.

  1. Trebuie să aveți două variabile înainte de a calcula KS. Una este variabila dependentă care ar trebui să fie binară. A doua este scorul de probabilitate prezis, care este generat de modelul statistic.
  2. Creați decile pe baza coloanelor de probabilitate prezise, ceea ce înseamnă împărțirea probabilității în 10 părți. Prima decilă ar trebui să conțină cel mai mare scor de probabilitate.
  3. Calculează procentul cumulativ de evenimente și non-evenimente în fiecare decilă și apoi calculează diferența dintre aceste două distribuții cumulative.
  4. KS este acolo unde diferența este maximă
  5. Dacă KS se află în primele 3 decile și are un scor de peste 40, se consideră că este un model predictiv bun. În același timp, este important să se valideze modelul prin verificarea și a altor parametri de performanță pentru a confirma că modelul nu suferă de o problemă de supraadaptare.

KS Python

Python : KS Statistics Decile Method

Import Data and Required Libraries

Am pregătit o mostră de date ca exemplu. Setul de date conține două coloane numite y și p.yeste o variabilă dependentă.pse referă la probabilitatea prezisă.

import pandas as pdimport numpy as npdf = pd.read_csv("https://raw.githubusercontent.com/deepanshu88/data/master/data.csv")
Funcție Python pentru statistica 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)
Cum se utilizează funcția
mydf = ks(data=df,target="y", prob="p")
  1. data se referă la pandas dataframe care conține atât variabila dependentă, cât și scorurile de probabilitate.
  2. target se referă la numele de coloană al variabilei dependente
  3. prob se referă la numele de coloană al probablității prezise
Output

Întoarce informații despre fiecare decilă în format tabelar și, de asemenea, tipărește scorul KS sub tabel. De asemenea, generează tabelul într-un nou cadru de date.

 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
Metoda 2 : KS Two Sample Test

Cu ajutorul biblioteciiscipypython, putem calcula statistica KS pe două eșantioane. Aceasta are doi parametri – data1 și data2. În data1, Vom introduce toate scorurile de probabilitate corespunzătoare non-evenimentelor. În data2, se vor lua scorurile de probabilitate corespunzătoare evenimentelor.

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

Acesta returnează scorul KS 0,6033 și valoarea p mai mică de 0,01, ceea ce înseamnă că putem respinge ipoteza nulă și să concluzionăm că distribuția evenimentelor și a non-evenimentelor este diferită.

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

Scorul KS al metodei 2 este ușor diferit de cel al metodei 1, deoarece al doilea este calculat la nivel de rând, iar primul este calculat după convertirea datelor în zece părți.

Lasă un răspuns

Adresa ta de email nu va fi publicată.