- Bankacılıkta Veri Bilimi Kullanım Alanı: Sahteciliği Tespit Etme
- Veri Kümesini Hazırlama
- Veri Kümesinde Sahteciliği Hesaplama
- Veriyi Yeniden Dengelemek için SMOTE Kullanma
- Lojistik Regresyon Uygulama
- Sonuç
Bankacılık, tarihsel olarak çok sayıda yapılandırılmış verinin toplandığı ve veri bilimi teknolojilerinin ilk uygulandığı şanslı alanlardan biridir.
Veri bilimi bankacılıkta nasıl kullanılır? Günümüzde bu alanda veri en değerli varlık haline geldi. Veri bilimi, bankaların rakipleriyle rekabet edebilmesi, daha fazla müşteri çekmesi, mevcut müşterilerin bağlılığını artırması, daha verimli veri odaklı kararlar alması, işlerini güçlendirmesi, operasyonel verimliliği artırması, mevcut hizmet/ürünleri iyileştirmesi ve yenilerini sunması, güvenliği sağlamlaştırması ve tüm bu adımların sonucu olarak daha fazla gelir elde etmesi için gerekli bir koşuldur. Veri bilimi iş gücü talebinin büyük kısmının bankacılıktan gelmesi şaşırtıcı değildir.
Veri bilimi, bankacılık sektörünün aşağıdakiler de dahil olmak üzere çok sayıda görevi başarıyla yürütmesini sağlar:
- yatırım risk analizi
- müşteri yaşam boyu değerinin tahmini
- müşteri segmentasyonu
- müşteri kayıp oranının tahmini
- kişiselleştirilmiş pazarlama
- müşteri duygu analizi
- sanal asistanlar ve sohbet botları
Aşağıda, bankacılıkta en yaygın veri bilimi kullanım örneklerinden birine daha yakından bakacağız.
Bankacılıkta Veri Bilimi Kullanım Alanı: Sahteciliği Tespit Etme
Sahtecilik faaliyetleri, yalnızca bankacılıkta değil, hükümet, sigorta, kamu sektörü, satış ve sağlık gibi birçok başka alanda da zorlu bir sorunu temsil eder. Yüksek sayıda çevrimiçi işlemle uğraşan herhangi bir işletme önemli bir dolandırıcılık riski taşır. Finansal suçlar; sahte kredi kartı işlemleri, sahte banka çekleri, vergi kaçakçılığı, kara para aklama, siber saldırılar, müşteri hesap hırsızlığı, sentetik kimlikler, sahte başvurular ve dolandırıcılıklar gibi çeşitli biçimler alabilir.
Sahteciliği tespit etme, sahtecilik faaliyetlerini ve finansal kayıpları belirlemek ve önlemek için alınan proaktif önlemler bütünüdür. Başlıca analitik teknikleri iki gruba ayrılabilir:
- İstatistiksel: istatistiksel parametre hesaplama, regresyon, olasılık dağılımları, veri eşleştirme
- Yapay zeka (AI): veri madenciliği, makine öğrenmesi, derin öğrenme
Makine öğrenmesi, sahteciliği tespitin temel dayanaklarından biridir. Araç seti iki yaklaşım sunar:
- Denetimli yöntemler: en yakın k komşu, lojistik regresyon, destek vektör makineleri, karar ağacı, rastgele orman, zaman serisi analizi, sinir ağları vb.
- Denetimsiz yöntemler: kümeleme analizi, bağlantı analizi, özörgütlemeli haritalar, temel bileşenler analizi, anomali tanıma vb.
Sahteciliği tespit için evrensel ve güvenilir tek bir makine öğrenmesi algoritması yoktur. Bunun yerine, gerçek dünya veri bilimi kullanım örneklerinde genellikle birkaç teknik veya bunların kombinasyonları test edilir, modelin öngörü doğruluğu hesaplanır ve en uygun yaklaşım seçilir.
Sahtecilik tespit sistemlerindeki ana zorluk, sürekli değişen sahtecilik kalıplarına ve dolandırıcıların taktiklerine hızla uyum sağlamak ve yeni ve giderek karmaşıklaşan düzenleri süratle açığa çıkarmaktır. Sahtecilik vakaları her zaman azınlıktadır ve gerçek işlemler arasında iyi gizlenmiştir.
Veri Kümesini Hazırlama
Python programlama dili kullanarak kredi kartı sahteciliği tespitinin bir makine öğrenmesi uygulamasını inceleyelim. Kredi Kartı Sahteciliği Tespiti ile ilgili bir Kaggle veri setinden değiştirilmiş bir örnek olan creditcard_data veri kümesi üzerinde çalışacağız. Orijinal veriler, Eylül 2013’te iki gün içinde Avrupa’daki kart sahiplerine ait kredi kartlarıyla yapılan işlemleri temsil eder.
Verileri içe aktaralım ve hızlıca göz atalım:
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))
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5050 entries, 0 to 5049
Data columns (total 30 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 V1 5050 non-null float64
1 V2 5050 non-null float64
2 V3 5050 non-null float64
3 V4 5050 non-null float64
4 V5 5050 non-null float64
5 V6 5050 non-null float64
6 V7 5050 non-null float64
7 V8 5050 non-null float64
8 V9 5050 non-null float64
9 V10 5050 non-null float64
10 V11 5050 non-null float64
11 V12 5050 non-null float64
12 V13 5050 non-null float64
13 V14 5050 non-null float64
14 V15 5050 non-null float64
15 V16 5050 non-null float64
16 V17 5050 non-null float64
17 V18 5050 non-null float64
18 V19 5050 non-null float64
19 V20 5050 non-null float64
20 V21 5050 non-null float64
21 V22 5050 non-null float64
22 V23 5050 non-null float64
23 V24 5050 non-null float64
24 V25 5050 non-null float64
25 V26 5050 non-null float64
26 V27 5050 non-null float64
27 V28 5050 non-null float64
28 Amount 5050 non-null float64
29 Class 5050 non-null int64
dtypes: float64(29), int64(1)
memory usage: 1.2 MB
V1 V2 V3 V4 V5 V6 V7 \
0 1.725265 -1.337256 -1.012687 -0.361656 -1.431611 -1.098681 -0.842274
1 0.683254 -1.681875 0.533349 -0.326064 -1.455603 0.101832 -0.520590
2 1.067973 -0.656667 1.029738 0.253899 -1.172715 0.073232 -0.745771
V8 V9 V10 V11 V12 V13 V14 \
0 -0.026594 -0.032409 0.215113 1.618952 -0.654046 -1.442665 -1.546538
1 0.114036 -0.601760 0.444011 1.521570 0.499202 -0.127849 -0.237253
2 0.249803 1.383057 -0.483771 -0.782780 0.005242 -1.273288 -0.269260
V15 V16 V17 V18 V19 V20 V21 \
0 -0.230008 1.785539 1.419793 0.071666 0.233031 0.275911 0.414524
1 -0.752351 0.667190 0.724785 -1.736615 0.702088 0.638186 0.116898
2 0.091287 -0.347973 0.495328 -0.925949 0.099138 -0.083859 -0.189315
V22 V23 V24 V25 V26 V27 V28 \
0 0.793434 0.028887 0.419421 -0.367529 -0.155634 -0.015768 0.010790
1 -0.304605 -0.125547 0.244848 0.069163 -0.460712 -0.017068 0.063542
2 -0.426743 0.079539 0.129692 0.002778 0.970498 -0.035056 0.017313
Amount Class
0 189.00 0
1 315.17 0
2 59.98 0
Veri kümesi şu değişkenleri içerir:
- PCA dönüşümünden elde edilen temel bileşenler olan, sayısal olarak kodlanmış V1'den V28'e kadar değişkenler. Gizlilik nedeniyle orijinal özelliklere dair arka plan bilgisi sağlanmamıştır.
- Amount değişkeni, işlem tutarını temsil eder.
- Class değişkeni, işlemin sahtecilik (1) olup olmadığını (0) gösterir.
Doğası gereği, herhangi bir işlem listesinde sahtecilik vakaları neyse ki son derece azınlıktadır. Ancak makine öğrenmesi algoritmaları genellikle veri kümesinde bulunan farklı sınıflar aşağı yukarı eşit düzeyde temsil edildiğinde en iyi performansı gösterir. Aksi halde öğrenilecek veri az olur. Bu probleme sınıf dengesizliği denir.
Veri Kümesinde Sahteciliği Hesaplama
Veri kümesindeki toplam işlem sayısı içinde sahte işlemlerin yüzdesini hesaplayalım:
round(creditcard_data['Class'].value_counts()*100/len(creditcard_data)).convert_dtypes()
0 99
1 1
Name: Class, dtype: Int64
ve sahte ile sahte olmayan veri noktalarını görselleştirmek için bir grafik oluşturalım:
import matplotlib.pyplot as plt
import numpy as np
def prep_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
def plot_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)

Veriyi Yeniden Dengelemek için SMOTE Kullanma
Artık sahte işlemlerin oranının çok düşük olduğunu ve sınıf dengesizliği sorunu yaşadığımızı doğrulayabiliriz. Bunu çözmek için verimizi sentetik azınlık aşırı örnekleme tekniği (SMOTE) ile yeniden dengeleyebiliriz. Rastgele aşırı örneklemeden farklı olarak SMOTE, gözlemlerin birebir kopyalarını oluşturmadığı için biraz daha sofistikedir. Bunun yerine, sahtecilik vakalarının en yakın komşularının özelliklerini kullanarak, azınlık sınıfındaki mevcut gözlemlere oldukça benzeyen yeni, sentetik örnekler oluşturur. SMOTE’u kredi kartı verilerimize uygulayalım:
from imblearn.over_sampling import SMOTE
method = SMOTE()
X_resampled, y_resampled = method.fit_resample(X, y)
plot_data(X_resampled, y_resampled)

Gördüğümüz gibi, SMOTE kullanmak aniden azınlık sınıfına ait daha fazla gözlem sağladı. Bu yaklaşımın sonuçlarını daha net görmek için bunları orijinal verilerle karşılaştıralım:
def compare_plot(X, y, X_resampled, y_resampled, method):
f, (ax1, ax2) = plt.subplots(1, 2)
c0 = ax1.scatter(X[y==0, 0], X[y==0, 1], label='Class #0',alpha=0.5)
c1 = ax1.scatter(X[y==1, 0], X[y==1, 1], label='Class #1',alpha=0.5, c='r')
ax1.set_title('Original set')
ax2.scatter(X_resampled[y_resampled==0, 0], X_resampled[y_resampled==0, 1], label='Class #0', alpha=.5)
ax2.scatter(X_resampled[y_resampled==1, 0], X_resampled[y_resampled==1, 1], label='Class #1', alpha=.5,c='r')
ax2.set_title(method)
plt.figlegend((c0, c1), ('Class #0', 'Class #1'), loc='lower center', ncol=2, labelspacing=0.)
plt.tight_layout(pad=3)
return plt.show()
print(f'Original set:\n'
f'{pd.value_counts(pd.Series(y))}\n\n'
f'SMOTE:\n'
f'{pd.value_counts(pd.Series(y_resampled))}\n')
compare_plot(X, y, X_resampled, y_resampled, method='SMOTE')
Original set:
0.0 5000
1.0 50
dtype: int64
SMOTE:
0.0 5000
1.0 5000
dtype: int64

Dolayısıyla SMOTE yöntemi verimizi tamamen dengeledi ve azınlık sınıfı artık çoğunluk sınıfıyla aynı büyüklükte.
SMOTE yönteminin pratik uygulamasına birazdan geri döneceğiz; ancak şimdilik orijinal verilere dönelim ve sahtecilik vakalarını tespit etmeye çalışalım. “Eski usul” yaklaşıma göre sahteciliği yakalamak için bazı kurallar oluşturmamız gerekir. Bu tür kurallar, örneğin işlemlerin alışılmadık konumları veya şüpheli derecede sık işlemlerle ilgili olabilir. Fikir, yaygın istatistiklere, çoğu zaman gözlemlerin ortalama değerlerine dayalı eşik değerleri tanımlamak ve sahteciliği tespit etmek için bu eşikleri özelliklerimizde kullanmaktır.
print(creditcard_data.groupby('Class').mean().round(3)[['V1', 'V3']])
V1 V3
Class
0 0.035 0.037
1 -4.985 -7.294
Özel durumumuzda şu koşulları uygulayalım: V1 < -3 ve V3 < -5. Ardından, bu yaklaşımın performansını değerlendirmek için işaretlenen sahtecilik vakalarını gerçek vakalarla karşılaştıralım:
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']))
Flagged Fraud 0 1
Actual Fraud
0 4984 16
1 28 22
Lojistik Regresyon Uygulama
50 sahtecilik vakasının 22’sini tespit ettik, ancak diğer 28’ini tespit edemedik ve 16 yanlış pozitif aldık. Makine öğrenmesi tekniklerinin bu sonuçları aşabileceğine bakalım.
Şimdi, sahtecilik olaylarını belirlemek için kredi kartı verilerimiz üzerinde basit bir lojistik regresyon sınıflandırma algoritması uygulayacağız ve ardından sonuçları bir karmaşıklık matrisi üzerinde görselleştireceğiz:
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']))
Flagged Fraud 0.0 1.0
Actual Fraud
0.0 1504 1
1.0 1 9
Burada karmaşıklık matrisinde daha az gözlem bulunduğunu unutmamak önemlidir; çünkü model sonuçlarını yalnızca test kümesi üzerinde, yani tüm veri setinin yalnızca %30’u üzerinde hesaplıyoruz.
Daha yüksek bir sahtecilik yakalama yüzdesi elde ettik: %90 (10 vakadan 9), önceki %44’lük (50 vakadan 22) sonuca kıyasla. Ayrıca önceye göre çok daha az yanlış pozitif aldık; bu da bir iyileşme.
Şimdi, daha önce tartıştığımız sınıf dengesizliği sorununa geri dönelim ve lojistik regresyon modelini SMOTE yeniden örnekleme yöntemiyle birleştirerek tahmin sonuçlarını daha da iyileştirip iyileştiremeyeceğimizi araştıralım. Bunu verimli biçimde ve tek seferde yapmak için bir ardışık düzen (pipeline) tanımlayıp verimiz üzerinde çalıştırmamız gerekiyor:
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']))
Flagged Fraud 0.0 1.0
Actual Fraud
0.0 1496 9
1.0 1 9
Gördüğümüz gibi, bizim örneğimizde SMOTE herhangi bir iyileşme getirmedi: Sahtecilik vakalarının %90’ını yakalamaya devam ettik ve ayrıca yanlış pozitif sayımız biraz daha yüksek. Buradaki açıklama, yeniden örneklemenin her durumda daha iyi sonuçlara yol açmamasıdır. Sahtecilik vakaları veriler üzerinde çok dağınık olduğunda, en yakın komşuları da mutlaka sahtecilik vakası olmayabilir; bu nedenle SMOTE kullanmak önyargı oluşturabilir.
Sonuç
İleriye dönük olası bir yol olarak, lojistik regresyon modelinin doğruluğunu artırmak için algoritmanın bazı parametrelerini ayarlayabiliriz. Veri kümesini yalnızca ikiye bölmek yerine k-katlı çapraz doğrulamayı da düşünebiliriz. Son olarak, başka bazı makine öğrenmesi algoritmalarını (ör. karar ağacı veya rastgele orman) deneyerek daha iyi sonuç verip vermediklerine bakabiliriz.
Sahtecilik tespiti modelinin kuramsal ve teknik yönleri hakkında daha fazla bilgi edinmek isterseniz, Fraud Detection in Python kursunun materyallerini inceleyebilirsiniz.

