ビジネスの背景
中央銀行が発表したデータによると、国立銀行のクレジットカードとローンを組み合わせたカード発行の伸び率は、2017年の前年比26.35%増を最高点として年々低下しており、前年比では26.35%増となっている。年間成長率は 2020 年までに 4.26% に低下しました。銀行クレジットカード発行額の伸び率が大幅に鈍化していることを背景に、従来の顧客の流出を防ぐという課題はますます重要になっている。
消費者クレジット カード銀行の経営者が顧客離れに直面しているとします。マネージャーはデータを分析し、その背後にあるものを見つけ出し、そのデータを使用して離脱する可能性のある顧客を予測したいと考えています。マネージャーはまた、解約する顧客の主な特徴を見つけて、解約を減らすための提案をしようとします。
記述統計
このプロジェクトでは、クレジット カードの解約を予測するための人工ニューラル ネットワーク モデルを構築します。
このビジネス上の問題における最初のタスクは、離脱している顧客を特定することです。
離脱しない顧客が離脱すると予測したとしても、それが当社のビジネスに悪影響を与えることはありません。
ただし、解約者を非解約者として予測することは効果があります。
したがって、再現率 (TP/TP+FN) をより高くする必要があります。
データセットは 10,000 人の顧客 (エントリ) で構成されています。
彼らは自分の年齢、給料、婚姻状況、クレジットカードの限度額、クレジットカードの種類などについて言及しました。
したがって、これらの 19 の属性 (特徴) がニューラル ネットワークへの入力となります。
以下の図は変数相関分析を示しています
次の図は、変数をヒストグラムで視覚化したものです。
これは、単変量の 1 年契約合計の KDE プロットです。
データセットは複数の形式 (主に文字列と整数) によって特徴付けられるため、準備する必要があります。
クレジット カード サービスを放棄する顧客はわずか 16.07% です。
したがって、不均衡なデータセットが得られます。
この不均衡に対処するために、ターゲット変数の 2 つのクラスに重みを割り当ててバランスをとります。
特徴列の文字列変数を整数に置き換えることにより、ANN 用のデータセットを準備します。
また、ターゲット変数に影響を与える機能ではないため、「CLIENTNUM」列も削除しました。
#%% Importing Libraries
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, RobustScaler,MinMaxScaler
from sklearn.metrics import accuracy_score,confusion_matrix,f1_score,matthews_corrcoef,precision_score,recall_score
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
from sklearn.utils import class_weight
#%% Loading the Dataset
df = pd.read_csv('C:/Users/Sahil Bagwe/Desktop/Python/dataset/Bank/BankChurners.csv')
df = df.drop(df.columns[21:23],axis=1)
df=df.drop('CLIENTNUM',axis=1)
#%% Preparing the Dataset
df['Gender'].replace('M',1,inplace = True)
df['Gender'].replace('F',0,inplace = True)
df['Education_Level'].replace('Unknown',0,inplace = True)
df['Education_Level'].replace('Uneducated',1,inplace = True)
df['Education_Level'].replace('High School',2,inplace = True)
df['Education_Level'].replace('College',3,inplace = True)
df['Education_Level'].replace('Graduate',4,inplace = True)
df['Education_Level'].replace('Post-Graduate',5,inplace = True)
df['Education_Level'].replace('Doctorate',6,inplace = True)
df['Marital_Status'].replace('Unknown',0,inplace = True)
df['Marital_Status'].replace('Single',1,inplace = True)
df['Marital_Status'].replace('Married',2,inplace = True)
df['Marital_Status'].replace('Divorced',3,inplace = True)
df['Card_Category'].replace('Blue',0,inplace = True)
df['Card_Category'].replace('Gold',1,inplace = True)
df['Card_Category'].replace('Silver',2,inplace = True)
df['Card_Category'].replace('Platinum',3,inplace = True)
df['Income_Category'].replace('Unknown',0,inplace = True)
df['Income_Category'].replace('Less than $40K',1,inplace = True)
df['Income_Category'].replace('$40K - $60K',2,inplace = True)
df['Income_Category'].replace('$60K - $80K',3,inplace = True)
df['Income_Category'].replace('$80K - $120K',4,inplace = True)
df['Income_Category'].replace('$120K +',5,inplace = True)
df['Attrition_Flag'].replace('Existing Customer',0,inplace = True)
df['Attrition_Flag'].replace('Attrited Customer',1,inplace = True)
データセットを前処理する
このフェーズは、データセットを特徴行列 (x) とターゲット変数 (y) に分割することから始まります。データの値は大きく異なるため、値をスケーリングしてこれらの値の範囲を正規化する必要があります。ロバスト スケーラーは中央値を削除し、分位範囲 (IQR: デフォルトでは四分位範囲) に従ってデータをスケーリングします。IQR は、第 1 四分位 (第 25 分位) と第 3 四分位 (第 75 分位) の間の範囲です。
人工ニューラルネットワークを構築する
データセットは不均衡であるため、カテゴリの重みを割り当てる必要があります。
これは、顧客の総数に対する解約した顧客の比率を計算することによって行われます。
次に、3 層のニューラル ネットワークを構築します。
入力層には、特徴行列の列と同じ数のニューロンが含まれます。
出力レイヤーは、出力を予測するレイヤーで構成されます。つまり、解約した顧客の場合は 1、既存の顧客の場合は 0 です。
隠れ層のニューロンの数は、通常、入力層と出力層のニューロンの数の間の値です。
隠れ層のニューロンの数を、入力層と出力層のニューロンの平均として取得するのが安全であると考えられます。
#%% Assigning weights to classes
cw = class_weight.compute_class_weight('balanced', np.unique(Y_train), Y_train)
a = y.value_counts()
ratio = a[1]/(a[1]+a[0])
weights = [ratio, 1-ratio]
#%% Building the Model
model = Sequential()
model.add(Dense(19,activation="sigmoid"))
model.add(Dense(10,activation="sigmoid"))
model.add(Dense(1))
model.compile(optimizer='rmsprop',loss = "binary_crossentropy",metrics=["BinaryAccuracy"],loss_weights=weights)
チャーンを予測する
データセットは不均衡であるため、カテゴリの重みを割り当てる必要があります。
これは、顧客の総数に対する解約した顧客の比率を計算することによって行われます。
次に、3 層のニューラル ネットワークを構築します。
入力層には、特徴行列の列と同じ数のニューロンが含まれます。
出力レイヤーは、出力を予測するレイヤーで構成されます。つまり、解約した顧客の場合は 1、既存の顧客の場合は 0 です。
隠れ層のニューロンの数は、通常、入力層と出力層のニューロンの数の間の値です。
隠れ層のニューロンの数を、入力層と出力層のニューロンの平均として取得するのが安全であると考えられます。
#%% Predicting
history = model.fit(x=X_train,y=Y_train,epochs=100, class_weight = {0:cw[0], 1:cw[1]})
predictions = model.predict_classes(X_test)
モデル検証により、正解率は 0.89、再現率は 0.9 に達し、非常に優れたモデルのパフォーマンスが得られました。
ここでは、銀行のクレジットカード紛失を予測するためのモデルを紹介します。「Python 金融リスク管理スコアカード モデルとデータ分析 (拡張版)」のより実践的な事例は、銀行研修向けに定期的に更新されます。以下の QR コードをスキャンしてください。ブックマークを忘れないでください。コース。
著作権に関する声明: この記事は公式アカウント (Python リスク管理モデル) からのものであり、許可なく、盗作はありません。CC 4.0 BY-SA 著作権契約に従い、転載する場合は元のソースリンクとこの声明を添付してください。