Bankowość to jedna z tych dziedzin, w których historycznie gromadzi się dużo danych ustrukturyzowanych, a także jedna z pierwszych, gdzie zastosowano technologie data science.
Jak wykorzystuje się data science w bankowości? Dziś dane stały się w tej sferze najcenniejszym zasobem. Data science to niezbędny warunek, by banki dotrzymywały kroku konkurentom, pozyskiwały więcej klientów, zwiększały lojalność obecnych, podejmowały trafniejsze decyzje oparte na danych, wzmacniały biznes, podnosiły efektywność operacyjną, ulepszały istniejące usługi/produkty i wprowadzały nowe, wzmacniały bezpieczeństwo, a w rezultacie tych działań zwiększały przychody. Nic dziwnego, że większość popytu na stanowiska w data science pochodzi z sektora bankowego.
Data science pozwala sektorowi bankowemu z powodzeniem realizować wiele zadań, w tym:
analizę ryzyka inwestycyjnego
prognozowanie wartości życiowej klienta (CLV)
segmentację klientów
prognozowanie wskaźnika odejść klientów (churn)
marketing spersonalizowany
analizę nastrojów klientów
wirtualnych asystentów i chatboty
Poniżej przyjrzymy się bliżej jednemu z najczęstszych zastosowań data science w bankowości.
Przykład użycia data science w bankowości: wykrywanie nadużyć
Oszustwa stanowią trudny problem nie tylko w bankowości, ale i w wielu innych obszarach, takich jak administracja publiczna, ubezpieczenia, sektor publiczny, sprzedaż czy opieka zdrowotna. Każdy biznes obsługujący dużą liczbę transakcji online jest narażony na istotne ryzyko nadużyć. Przestępstwa finansowe przybierają różne formy: nieautoryzowane transakcje kartą kredytową, sfałszowane czeki bankowe, unikanie podatków, pranie pieniędzy, ataki cybernetyczne, kradzież kont klientów, tożsamości syntetyczne, fałszywe wnioski i oszustwa.
Wykrywanie nadużyć to zestaw działań prewencyjnych podejmowanych w celu identyfikacji i zapobiegania oszustwom oraz stratom finansowym. Główne techniki analityczne można podzielić na dwie grupy:
Statystyczne: obliczanie parametrów statystycznych, regresja, rozkłady prawdopodobieństwa, dopasowywanie danych
Uczenie maszynowe to kluczowy filar wykrywania nadużyć. Jego zestaw narzędzi oferuje dwa podejścia:
Metody nadzorowane: k-najbliższych sąsiadów, regresja logistyczna, maszyny wektorów nośnych, drzewo decyzyjne, las losowy, analiza szeregów czasowych, sieci neuronowe itd.
Metody nienadzorowane: analiza skupień, analiza powiązań, samoorganizujące się mapy, analiza głównych składowych, wykrywanie anomalii itd.
Nie ma uniwersalnego i niezawodnego algorytmu uczenia maszynowego do wykrywania nadużyć. W realnych projektach testuje się zwykle kilka technik lub ich kombinacje, oblicza się trafność predykcji modelu i wybiera optymalne podejście.
Główne wyzwanie dla systemów wykrywania nadużyć to szybka adaptacja do stale zmieniających się wzorców oszustw i taktyk oszustów oraz szybkie ujawnianie nowych, coraz bardziej złożonych schematów. Przypadki nadużyć zawsze stanowią mniejszość i są dobrze ukryte wśród prawdziwych transakcji.
Przygotowanie zbioru danych
Przeanalizujmy implementację wykrywania nadużyć na kartach kredytowych z wykorzystaniem Pythona. Będziemy pracować na zbiorze creditcard_data, który jest zmodyfikowaną próbką z Kaggle: Credit Card Fraud Detection. Oryginalne dane to transakcje dokonane kartami kredytowymi należącymi do europejskich posiadaczy kart w ciągu dwóch dni we wrześniu 2013 r.
Zaimportujmy dane i rzućmy na nie okiem:
import pandas as pd
creditcard_data = pd.read_csv('creditcard_data.csv', index_col=0)print(creditcard_data.info())print('\n')
pd.options.display.max_columns =len(creditcard_data)print(creditcard_data.head(3))Obsługiwane przez
Numerycznie zakodowane zmienne V1–V28, które są głównymi składowymi uzyskanymi z transformacji PCA. Ze względu na poufność nie podano kontekstu dotyczącego oryginalnych cech.
Zmienna Amount to kwota transakcji.
Zmienna Class wskazuje, czy transakcja była nadużyciem (1), czy nie (0).
Z natury rzeczy przypadki nadużyć na szczęście stanowią skrajną mniejszość w każdej liście transakcji. Jednak algorytmy uczenia maszynowego zwykle działają najlepiej, gdy różne klasy w zbiorze danych są mniej więcej równie liczne. W przeciwnym razie jest niewiele danych, z których można się uczyć. Ten problem to niezrównoważenie klas.
Obliczanie odsetka nadużyć w zbiorze
Policzmy odsetek transakcji oszukańczych w stosunku do łącznej liczby transakcji w naszym zbiorze:
round(creditcard_data['Class'].value_counts()*100/len(creditcard_data)).convert_dtypes()Obsługiwane przez
i stwórzmy wykres wizualizujący punkty danych klasy oszustwo vs. brak oszustwa:
import matplotlib.pyplot as plt
import numpy as np
defprep_data(df):
X = df.iloc[:,1:28]
X = np.array(X).astype(float)
y = df.iloc[:,29]
y = np.array(y).astype(float)return X, y
defplot_data(X, y):
plt.scatter(X[y==0,0], X[y==0,1], label='Class #0', alpha=0.5, linewidth=0.15)
plt.scatter(X[y==1,0], X[y==1,1], label='Class #1', alpha=0.5, linewidth=0.15, c='r')
plt.legend()return plt.show()
X, y = prep_data(creditcard_data)
plot_data(X, y)Obsługiwane przez
Użycie SMOTE do zrównoważenia danych
Widzimy teraz, że odsetek transakcji oszukańczych jest bardzo niski i mamy do czynienia z problemem niezrównoważenia klas. Aby go naprawić, możemy zrównoważyć dane przy użyciu techniki syntetycznego nadpróbkowania mniejszości (SMOTE). W przeciwieństwie do losowego nadpróbkowania, SMOTE jest nieco bardziej wyrafinowane, ponieważ nie tworzy dokładnych kopii obserwacji. Zamiast tego wykorzystuje cechy najbliższych sąsiadów przypadków nadużyć do tworzenia nowych, syntetycznych próbek podobnych do istniejących obserwacji w klasie mniejszościowej. Zastosujmy SMOTE do naszych danych kartowych:
from imblearn.over_sampling import SMOTE
method = SMOTE()
X_resampled, y_resampled = method.fit_resample(X, y)
plot_data(X_resampled, y_resampled)Obsługiwane przez
Jak widać, użycie SMOTE nagle daje nam więcej obserwacji klasy mniejszościowej. Aby lepiej zobaczyć efekty, porównamy je z oryginalnymi danymi:
Original set:0.050001.050
dtype: int64
SMOTE:0.050001.05000
dtype: int64Obsługiwane przez
Metoda SMOTE całkowicie zrównoważyła nasze dane, a klasa mniejszościowa jest teraz tak liczna jak większościowa.
Wrócimy jeszcze do praktycznego zastosowania SMOTE, ale na razie wróćmy do oryginalnych danych i spróbujmy wykryć przypadki nadużyć. Idąc „starą szkołą”, musimy stworzyć pewne reguły, by je wychwycić. Takie reguły mogą dotyczyć np. nietypowych lokalizacji transakcji lub podejrzanie częstych operacji. Pomysł polega na zdefiniowaniu wartości progowych na podstawie statystyk, często średnich wartości obserwacji, i użyciu tych progów na naszych cechach do wykrywania nadużyć.
print(creditcard_data.groupby('Class').mean().round(3)[['V1','V3']])Obsługiwane przez
W naszym przypadku zastosujmy warunki: V1 < -3 oraz V3 < -5. Następnie, aby ocenić skuteczność tego podejścia, porównamy oznaczone przypadki nadużyć z rzeczywistymi:
creditcard_data['flag_as_fraud']= np.where(np.logical_and(creditcard_data['V1']<-3, creditcard_data['V3']<-5),1,0)print(pd.crosstab(creditcard_data['Class'], creditcard_data['flag_as_fraud'], rownames=['Actual Fraud'], colnames=['Flagged Fraud']))Obsługiwane przez
Wykryliśmy 22 z 50 przypadków nadużyć, ale nie potrafimy wykryć pozostałych 28, a do tego mamy 16 fałszywych trafień. Zobaczmy, czy techniki uczenia maszynowego poprawią te wyniki.
Wdrożymy teraz prosty algorytm klasyfikacji regresją logistyczną na naszych danych kartowych, by zidentyfikować nadużycia, a następnie zwizualizujemy wyniki na macierzy pomyłek:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
lr = LogisticRegression()
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)print(pd.crosstab(y_test, predictions, rownames=['Actual Fraud'], colnames=['Flagged Fraud']))Obsługiwane przez
Warto zauważyć, że w macierzy pomyłek mamy tu mniej obserwacji, ponieważ używamy jedynie zbioru testowego do obliczenia wyników modelu, tj. tylko 30% całego zbioru danych.
Wychwyciliśmy wyższy odsetek nadużyć: 90% (9 z 10), w porównaniu z wcześniejszym wynikiem 44% (22 z 50). Mamy też znacznie mniej fałszywych trafień niż wcześniej, więc to poprawa.
Wróćmy teraz do problemu niezrównoważenia klas i sprawdźmy, czy możemy jeszcze bardziej poprawić wyniki predykcji, łącząc model regresji logistycznej z metodą próbkowania SMOTE. Aby zrobić to sprawnie i za jednym razem, zdefiniujemy potok i uruchomimy go na naszych danych:
from imblearn.pipeline import Pipeline
# Defining which resampling method and which ML model to use in the pipeline
resampling = SMOTE()
lr = LogisticRegression()
pipeline = Pipeline([('SMOTE', resampling),('Logistic Regression', lr)])
pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)print(pd.crosstab(y_test, predictions, rownames=['Actual Fraud'], colnames=['Flagged Fraud']))Obsługiwane przez
Jak widać, w naszym przypadku SMOTE nie przyniósł poprawy: nadal wychwyciliśmy 90% przypadków nadużyć, a dodatkowo mamy nieco więcej fałszywych trafień. Wyjaśnienie jest takie, że ponowne próbkowanie niekoniecznie zawsze daje lepsze wyniki. Gdy przypadki nadużyć są silnie rozproszone w danych, ich najbliżsi sąsiedzi nie muszą być również nadużyciami, więc użycie SMOTE może wprowadzać bias.
Wnioski
Aby dalej zwiększyć trafność modelu regresji logistycznej, można dostroić część jego parametrów. Zamiast dzielić zbiór na dwie części, można też rozważyć walidację krzyżową k-krotną. Wreszcie, warto spróbować innych algorytmów uczenia maszynowego (np. drzew decyzyjnych lub lasów losowych) i sprawdzić, czy dadzą lepsze wyniki.
Jeśli chcesz dowiedzieć się więcej o teoretycznych i technicznych aspektach implementacji modeli do wykrywania nadużyć, zajrzyj do materiałów kursu Fraud Detection in Python.
Bankowość to jedna z tych dziedzin, w których historycznie gromadzi się dużo danych ustrukturyzowanych, a także jedna z pierwszych, gdzie zastosowano technologie data science.
Jak wykorzystuje się data science w bankowości? Dziś dane stały się w tej sferze najcenniejszym zasobem. Data science to niezbędny warunek, by banki dotrzymywały kroku konkurentom, pozyskiwały więcej klientów, zwiększały lojalność obecnych, podejmowały trafniejsze decyzje oparte na danych, wzmacniały biznes, podnosiły efektywność operacyjną, ulepszały istniejące usługi/produkty i wprowadzały nowe, wzmacniały bezpieczeństwo, a w rezultacie tych działań zwiększały przychody. Nic dziwnego, że większość popytu na stanowiska w data science pochodzi z sektora bankowego.
Data science pozwala sektorowi bankowemu z powodzeniem realizować wiele zadań, w tym:
Poniżej przyjrzymy się bliżej jednemu z najczęstszych zastosowań data science w bankowości.
Przykład użycia data science w bankowości: wykrywanie nadużyć
Oszustwa stanowią trudny problem nie tylko w bankowości, ale i w wielu innych obszarach, takich jak administracja publiczna, ubezpieczenia, sektor publiczny, sprzedaż czy opieka zdrowotna. Każdy biznes obsługujący dużą liczbę transakcji online jest narażony na istotne ryzyko nadużyć. Przestępstwa finansowe przybierają różne formy: nieautoryzowane transakcje kartą kredytową, sfałszowane czeki bankowe, unikanie podatków, pranie pieniędzy, ataki cybernetyczne, kradzież kont klientów, tożsamości syntetyczne, fałszywe wnioski i oszustwa.
Wykrywanie nadużyć to zestaw działań prewencyjnych podejmowanych w celu identyfikacji i zapobiegania oszustwom oraz stratom finansowym. Główne techniki analityczne można podzielić na dwie grupy:
Uczenie maszynowe to kluczowy filar wykrywania nadużyć. Jego zestaw narzędzi oferuje dwa podejścia:
Nie ma uniwersalnego i niezawodnego algorytmu uczenia maszynowego do wykrywania nadużyć. W realnych projektach testuje się zwykle kilka technik lub ich kombinacje, oblicza się trafność predykcji modelu i wybiera optymalne podejście.
Główne wyzwanie dla systemów wykrywania nadużyć to szybka adaptacja do stale zmieniających się wzorców oszustw i taktyk oszustów oraz szybkie ujawnianie nowych, coraz bardziej złożonych schematów. Przypadki nadużyć zawsze stanowią mniejszość i są dobrze ukryte wśród prawdziwych transakcji.
Przygotowanie zbioru danych
Przeanalizujmy implementację wykrywania nadużyć na kartach kredytowych z wykorzystaniem Pythona. Będziemy pracować na zbiorze creditcard_data, który jest zmodyfikowaną próbką z Kaggle: Credit Card Fraud Detection. Oryginalne dane to transakcje dokonane kartami kredytowymi należącymi do europejskich posiadaczy kart w ciągu dwóch dni we wrześniu 2013 r.
Zaimportujmy dane i rzućmy na nie okiem:
Zbiór zawiera następujące zmienne:
Z natury rzeczy przypadki nadużyć na szczęście stanowią skrajną mniejszość w każdej liście transakcji. Jednak algorytmy uczenia maszynowego zwykle działają najlepiej, gdy różne klasy w zbiorze danych są mniej więcej równie liczne. W przeciwnym razie jest niewiele danych, z których można się uczyć. Ten problem to niezrównoważenie klas.
Obliczanie odsetka nadużyć w zbiorze
Policzmy odsetek transakcji oszukańczych w stosunku do łącznej liczby transakcji w naszym zbiorze:
i stwórzmy wykres wizualizujący punkty danych klasy oszustwo vs. brak oszustwa:
Użycie SMOTE do zrównoważenia danych
Widzimy teraz, że odsetek transakcji oszukańczych jest bardzo niski i mamy do czynienia z problemem niezrównoważenia klas. Aby go naprawić, możemy zrównoważyć dane przy użyciu techniki syntetycznego nadpróbkowania mniejszości (SMOTE). W przeciwieństwie do losowego nadpróbkowania, SMOTE jest nieco bardziej wyrafinowane, ponieważ nie tworzy dokładnych kopii obserwacji. Zamiast tego wykorzystuje cechy najbliższych sąsiadów przypadków nadużyć do tworzenia nowych, syntetycznych próbek podobnych do istniejących obserwacji w klasie mniejszościowej. Zastosujmy SMOTE do naszych danych kartowych:
Jak widać, użycie SMOTE nagle daje nam więcej obserwacji klasy mniejszościowej. Aby lepiej zobaczyć efekty, porównamy je z oryginalnymi danymi:
Metoda SMOTE całkowicie zrównoważyła nasze dane, a klasa mniejszościowa jest teraz tak liczna jak większościowa.
Wrócimy jeszcze do praktycznego zastosowania SMOTE, ale na razie wróćmy do oryginalnych danych i spróbujmy wykryć przypadki nadużyć. Idąc „starą szkołą”, musimy stworzyć pewne reguły, by je wychwycić. Takie reguły mogą dotyczyć np. nietypowych lokalizacji transakcji lub podejrzanie częstych operacji. Pomysł polega na zdefiniowaniu wartości progowych na podstawie statystyk, często średnich wartości obserwacji, i użyciu tych progów na naszych cechach do wykrywania nadużyć.
W naszym przypadku zastosujmy warunki: V1 < -3 oraz V3 < -5. Następnie, aby ocenić skuteczność tego podejścia, porównamy oznaczone przypadki nadużyć z rzeczywistymi:
Zastosowanie regresji logistycznej
Wykryliśmy 22 z 50 przypadków nadużyć, ale nie potrafimy wykryć pozostałych 28, a do tego mamy 16 fałszywych trafień. Zobaczmy, czy techniki uczenia maszynowego poprawią te wyniki.
Wdrożymy teraz prosty algorytm klasyfikacji regresją logistyczną na naszych danych kartowych, by zidentyfikować nadużycia, a następnie zwizualizujemy wyniki na macierzy pomyłek:
Warto zauważyć, że w macierzy pomyłek mamy tu mniej obserwacji, ponieważ używamy jedynie zbioru testowego do obliczenia wyników modelu, tj. tylko 30% całego zbioru danych.
Wychwyciliśmy wyższy odsetek nadużyć: 90% (9 z 10), w porównaniu z wcześniejszym wynikiem 44% (22 z 50). Mamy też znacznie mniej fałszywych trafień niż wcześniej, więc to poprawa.
Wróćmy teraz do problemu niezrównoważenia klas i sprawdźmy, czy możemy jeszcze bardziej poprawić wyniki predykcji, łącząc model regresji logistycznej z metodą próbkowania SMOTE. Aby zrobić to sprawnie i za jednym razem, zdefiniujemy potok i uruchomimy go na naszych danych:
Jak widać, w naszym przypadku SMOTE nie przyniósł poprawy: nadal wychwyciliśmy 90% przypadków nadużyć, a dodatkowo mamy nieco więcej fałszywych trafień. Wyjaśnienie jest takie, że ponowne próbkowanie niekoniecznie zawsze daje lepsze wyniki. Gdy przypadki nadużyć są silnie rozproszone w danych, ich najbliżsi sąsiedzi nie muszą być również nadużyciami, więc użycie SMOTE może wprowadzać bias.
Wnioski
Aby dalej zwiększyć trafność modelu regresji logistycznej, można dostroić część jego parametrów. Zamiast dzielić zbiór na dwie części, można też rozważyć walidację krzyżową k-krotną. Wreszcie, warto spróbować innych algorytmów uczenia maszynowego (np. drzew decyzyjnych lub lasów losowych) i sprawdzić, czy dadzą lepsze wyniki.
Jeśli chcesz dowiedzieć się więcej o teoretycznych i technicznych aspektach implementacji modeli do wykrywania nadużyć, zajrzyj do materiałów kursu Fraud Detection in Python.