Ana içeriğe atla

Bankacılıkta Veri Bilimi: Sahteciliği Tespit Etme

Bankacılık sektöründe veri biliminin nasıl uygulandığını, en yaygın kullanım örneklerinden biri olan sahteciliği tespit etmeyi inceleyerek öğrenin.
Güncel 31 Ağu 2026  · 11 dk. oku

Yapay Zekâyla Keşfet

ChatGPTClaudePerplexity

Fintech Kavramı İllüstrasyonu

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)

Sahte İşlemler

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)

SMOTE Grafiği

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

Smote Yöntemi Grafiği

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.

Konular
Veri Bilimi
Makine Öğrenimi
İlgili

blog

Hızlı Sevkiyat İçin Pratik Vibe Kodlama Teknoloji Yığını

Ön uç, arka uç, veritabanları, kimlik doğrulama, depolama, e-posta, test, dağıtım ve izleme için en iyi araçları keşfedin.
Abid Ali Awan's photo

Abid Ali Awan

14 dk.

blog

2026’da En Popüler 40 Yazılım Mühendisi Mülakat Sorusu

Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Dario Radečić's photo

Dario Radečić

15 dk.

Eğitim

.gitignore Nasıl Kullanılır: Örneklerle Pratik Bir Giriş

Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Kurtis Pykes 's photo

Kurtis Pykes

8 dk.

Eğitim

Python'da Listeyi String'e Nasıl Dönüştürürsünüz

Bu hızlı eğitimde, Python'da bir listeyi string'e nasıl dönüştüreceğinizi öğrenin.
Adel Nehme's photo

Adel Nehme

Devamını GörDevamını Gör