95554 - my bank data analysis/bank data analysis.html
In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
In [3]:
data=pd.read_csv("my-bank.csv") # importing dataset
data.head()
Out[3]:
CUST_ID TARGET AGE GENDER BALANCE OCCUPATION SCR HOLDING_PERIOD ACC_TYPE ACC_OP_DATE ... NO_OF_CHQ_DR_TXNS FLG_HAS_CC AMT_ATM_DR AMT_BR_CSH_WDL_DR AMT_CHQ_DR AMT_NET_DR AMT_MOB_DR FLG_HAS_ANY_CHGS FLG_HAS_NOMINEE FLG_HAS_OLD_LOAN
0 C7927 0 27 M 3383.75 SELF-EMP 776 30 SA 3/23/2005 ... 0 0 13100 0 0 973557.0 0 0 1 1
1 C6877 0 47 M 287489.04 SAL 324 28 SA 10-11-2008 ... 0 0 6600 0 0 799813.0 0 1 1 0
2 C19922 0 40 M 18216.88 SELF-EMP 603 2 SA 4/26/2012 ... 2 0 11200 561120 49320 997570.0 0 1 1 1
3 C8183 0 53 M 71720.48 SAL 196 13 CA 07-04-2008 ... 4 0 26100 673590 60780 741506.0 71388 0 1 0
4 C12123 0 36 M 1671622.89 PROF 167 24 SA 12/29/2001 ... 0 0 0 808480 0 0.0 0 0 1 0
5 rows × 26 columns
EDA¶
In [4]:
# Removing unwanted columns
data.drop(["CUST_ID","ACC_OP_DATE"],axis=1,inplace=True)
In [5]:
# Checking the missing values
data.isnull().sum()
Out[5]:
TARGET 0
AGE 0
GENDER 0
BALANCE 0
OCCUPATION 0
SCR 0
HOLDING_PERIOD 0
ACC_TYPE 0
LEN_OF_RLTN_IN_MNTH 0
NO_OF_L_CR_TXNS 0
NO_OF_BR_CSH_WDL_DR_TXNS 0
NO_OF_ATM_DR_TXNS 0
NO_OF_NET_DR_TXNS 0
NO_OF_MOB_DR_TXNS 0
NO_OF_CHQ_DR_TXNS 0
FLG_HAS_CC 0
AMT_ATM_DR 0
AMT_BR_CSH_WDL_DR 0
AMT_CHQ_DR 0
AMT_NET_DR 0
AMT_MOB_DR 0
FLG_HAS_ANY_CHGS 0
FLG_HAS_NOMINEE 0
FLG_HAS_OLD_LOAN 0
dtype: int64
In [6]:
#Categorical Unordered Univariate Analysis
data.OCCUPATION.value_counts(normalize=True)
#plot the bar graph of percentage job categories
data.OCCUPATION.value_counts(normalize=True).plot.barh()
plt.show()
In [7]:
#Categorical Ordered Univariate Analysis
data.ACC_TYPE.value_counts(normalize=True)
#plot the pie chart of education categories
data.ACC_TYPE.value_counts(normalize=True).plot.pie()
plt.show()
In [8]:
#Bivariate Analysis
data.plot.scatter(x="AGE",y="BALANCE")
plt.show()
Graphs for EDA¶
In [9]:
# Age Analysis
plt.figure(figsize=(15,10))
sns.barplot(data.AGE.value_counts().index,data.AGE.value_counts().values) #barplot
plt.xlabel("age")
plt.ylabel("Frequency")
plt.title("Age Analysis")
plt.show()
C:\ProgramData\Anaconda3\lib\site-packages\seaborn\_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(
In [10]:
# Sex Analysis
plt.figure(figsize=(10,7))
sex=data.GENDER.value_counts()
value=(sex[0],sex[1],sex[2])
labels=['Male','Female',"Other"]
plt.pie(sex,colors=['red','green',"yellow"],labels=value) #pie chart
plt.legend(labels)
plt.title("Sex Analysis")
plt.show()
In [11]:
plt.figure(figsize=(7,7))
young=len(data[data.AGE<=45])
middle=len(data[(data.AGE>45)&(data.AGE<=60)])
elder=len(data[(data.AGE>60)&(data.AGE<=100)])
value=(young,middle,elder)
labels=["young","middle","elder"]
plt.pie((young,middle,elder),labels=value)
plt.legend(labels)
plt.title("Dividing Age into 3 catagories")
plt.show()
In [12]:
plt.figure(figsize=(10,10))
s=data.OCCUPATION.value_counts()
labels=["Salaried","Professional","SelfEmployed Non-Professional","Self Employed"]
plt.pie(s,colors=['red','green',"yellow","blue"],labels=labels) #pie chart
plt.legend(labels,loc="best")
plt.title("Different types Occupations")
plt.show()
In [13]:
plt.figure(figsize=[8,8])
ac_type=data.ACC_TYPE.value_counts()
labels=["SA","CA"]
value=[ac_type[0],ac_type[1]]
plt.bar(labels[0],ac_type[0],label=["Saving accound"],color=["green"])
plt.bar(labels[1],ac_type[1],label=["Current accound"],color=["blue"])
plt.legend()
plt.show()
Data preprocessing¶
In [14]:
# Converting categorical variables to numerical variable
data["OCCUPATION"].replace({"PROF":0,"SAL":1,"SELF-EMP":2,"SENP":3},inplace=True)
data["GENDER"].replace({"M":0,"F":1,"O":2},inplace=True)
data["ACC_TYPE"].replace({"SA":0,"CA":1},inplace=True)
In [15]:
data.info() # to check about any NA value in the variables
RangeIndex: 20000 entries, 0 to 19999
Data columns (total 24 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 TARGET 20000 non-null int64
1 AGE 20000 non-null int64
2 GENDER 20000 non-null int64
3 BALANCE 20000 non-null float64
4 OCCUPATION 20000 non-null int64
5 SCR 20000 non-null int64
6 HOLDING_PERIOD 20000 non-null int64
7 ACC_TYPE 20000 non-null int64
8 LEN_OF_RLTN_IN_MNTH 20000 non-null int64
9 NO_OF_L_CR_TXNS 20000 non-null int64
10 NO_OF_BR_CSH_WDL_DR_TXNS 20000 non-null int64
11 NO_OF_ATM_DR_TXNS 20000 non-null int64
12 NO_OF_NET_DR_TXNS 20000 non-null int64
13 NO_OF_MOB_DR_TXNS 20000 non-null int64
14 NO_OF_CHQ_DR_TXNS 20000 non-null int64
15 FLG_HAS_CC 20000 non-null int64
16 AMT_ATM_DR 20000 non-null int64
17 AMT_BR_CSH_WDL_DR 20000 non-null int64
18 AMT_CHQ_DR 20000 non-null int64
19 AMT_NET_DR 20000 non-null float64
20 AMT_MOB_DR 20000 non-null int64
21 FLG_HAS_ANY_CHGS 20000 non-null int64
22 FLG_HAS_NOMINEE 20000 non-null int64
23 FLG_HAS_OLD_LOAN 20000 non-null int64
dtypes: float64(2), int64(22)
memory usage: 3.7 MB
In [16]:
# Dividing data set into dependent and independent variable
ind_var=data.iloc[:,1:]
dep_var=data.iloc[:,0:1]
In [ ]:
# feature scaling
from sklearn.preprocessing import StandardScaler
normalization=StandardScaler()
ind_var=normalization.fit_transform(ind_var) # normalization
print(ind_var)
Logistic Regression¶
In [18]:
# applying classification model
from sklearn.linear_model import LogisticRegression # importing logistic regression model
from sklearn.model_selection import train_test_split # importing test_train library
from sklearn.metrics import confusion_matrix # importing confusion matrix to check our results
model=LogisticRegression()
x_train,x_test,y_train,y_test=train_test_split(ind_var,dep_var,train_size=0.75,random_state=0) # dividing data into training and testing phase
model=model.fit(x_train,y_train) # fitting of the model
model.coef_
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\utils\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
return f(*args, **kwargs)
Out[18]:
array([[ 0.01772332, -0.07457694, -0.17617968, 0.08932235, 0.19437728,
-0.3871862 , -0.0230113 , -0.09010904, 0.30111464, 0.0258769 ,
0.01675395, -0.05292916, -0.06270942, 0.05437429, 0.29230472,
-0.0211706 , 0.05318017, -0.01812939, 0.05852849, 0.09072257,
0.05290384, 0.02534247, -0.06826344]])
Model evaluation¶
In [ ]:
y_pred=model.predict(x_test) # predict the model with test data
cm=confusion_matrix(y_test,y_pred)
print(cm)
In [20]:
accuracy=model.score(x_test,y_test) # checking accuracy of matrix
print("Acuracy of this model is %f" %accuracy)
Acuracy of this model is 0.869800
Decision Tree¶
In [ ]:
In [25]:
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
# Train Decision Tree Classifer
clf = clf.fit(x_train,y_train)
Evaluation¶
In [27]:
y_pred = clf.predict(x_test)
cm=confusion_matrix(y_test,y_pred)
print(cm)
[[4173 177]
[ 133 517]]
In [28]:
accuracy=clf.score(x_test,y_test) # checking accuracy of matrix
print("Acuracy of this model is %f" %accuracy)
Acuracy of this model is 0.938000
In [ ]:
95554 - my bank data analysis/bank data analysis.ipynb
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "b94333ee",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "2a77ebc6",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
"\n",
"\n",
" | \n",
"CUST_ID | \n",
"TARGET | \n",
"AGE | \n",
"GENDER | \n",
"BALANCE | \n",
"OCCUPATION | \n",
"SCR | \n",
"HOLDING_PERIOD | \n",
"ACC_TYPE | \n",
"ACC_OP_DATE | \n",
"... | \n",
"NO_OF_CHQ_DR_TXNS | \n",
"FLG_HAS_CC | \n",
"AMT_ATM_DR | \n",
"AMT_BR_CSH_WDL_DR | \n",
"AMT_CHQ_DR | \n",
"AMT_NET_DR | \n",
"AMT_MOB_DR | \n",
"FLG_HAS_ANY_CHGS | \n",
"FLG_HAS_NOMINEE | \n",
"FLG_HAS_OLD_LOAN | \n",
"
\n",
"\n",
"\n",
"\n",
"0 | \n",
"C7927 | \n",
"0 | \n",
"27 | \n",
"M | \n",
"3383.75 | \n",
"SELF-EMP | \n",
"776 | \n",
"30 | \n",
"SA | \n",
"3/23/2005 | \n",
"... | \n",
"0 | \n",
"0 | \n",
"13100 | \n",
"0 | \n",
"0 | \n",
"973557.0 | \n",
"0 | \n",
"0 | \n",
"1 | \n",
"1 | \n",
"
\n",
"\n",
"1 | \n",
"C6877 | \n",
"0 | \n",
"47 | \n",
"M | \n",
"287489.04 | \n",
"SAL | \n",
"324 | \n",
"28 | \n",
"SA | \n",
"10-11-2008 | \n",
"... | \n",
"0 | \n",
"0 | \n",
"6600 | \n",
"0 | \n",
"0 | \n",
"799813.0 | \n",
"0 | \n",
"1 | \n",
"1 | \n",
"0 | \n",
"
\n",
"\n",
"2 | \n",
"C19922 | \n",
"0 | \n",
"40 | \n",
"M | \n",
"18216.88 | \n",
"SELF-EMP | \n",
"603 | \n",
"2 | \n",
"SA | \n",
"4/26/2012 | \n",
"... | \n",
"2 | \n",
"0 | \n",
"11200 | \n",
"561120 | \n",
"49320 | \n",
"997570.0 | \n",
"0 | \n",
"1 | \n",
"1 | \n",
"1 | \n",
"
\n",
"\n",
"3 | \n",
"C8183 | \n",
"0 | \n",
"53 | \n",
"M | \n",
"71720.48 | \n",
"SAL | \n",
"196 | \n",
"13 | \n",
"CA | \n",
"07-04-2008 | \n",
"... | \n",
"4 | \n",
"0 | \n",
"26100 | \n",
"673590 | \n",
"60780 | \n",
"741506.0 | \n",
"71388 | \n",
"0 | \n",
"1 | \n",
"0 | \n",
"
\n",
"\n",
"4 | \n",
"C12123 | \n",
"0 | \n",
"36 | \n",
"M | \n",
"1671622.89 | \n",
"PROF | \n",
"167 | \n",
"24 | \n",
"SA | \n",
"12/29/2001 | \n",
"... | \n",
"0 | \n",
"0 | \n",
"0 | \n",
"808480 | \n",
"0 | \n",
"0.0 | \n",
"0 | \n",
"0 | \n",
"1 | \n",
"0 | \n",
"
\n",
"\n",
"
\n",
"
5 rows × 26 columns
\n",
"
"
],
"text/plain": [
" CUST_ID TARGET AGE GENDER BALANCE OCCUPATION SCR HOLDING_PERIOD \\\n",
"0 C7927 0 27 M 3383.75 SELF-EMP 776 30 \n",
"1 C6877 0 47 M 287489.04 SAL 324 28 \n",
"2 C19922 0 40 M 18216.88 SELF-EMP 603 2 \n",
"3 C8183 0 53 M 71720.48 SAL 196 13 \n",
"4 C12123 0 36 M 1671622.89 PROF 167 24 \n",
"\n",
" ACC_TYPE ACC_OP_DATE ... NO_OF_CHQ_DR_TXNS FLG_HAS_CC AMT_ATM_DR \\\n",
"0 SA 3/23/2005 ... 0 0 13100 \n",
"1 SA 10-11-2008 ... 0 0 6600 \n",
"2 SA 4/26/2012 ... 2 0 11200 \n",
"3 CA 07-04-2008 ... 4 0 26100 \n",
"4 SA 12/29/2001 ... 0 0 0 \n",
"\n",
" AMT_BR_CSH_WDL_DR AMT_CHQ_DR AMT_NET_DR AMT_MOB_DR FLG_HAS_ANY_CHGS \\\n",
"0 0 0 973557.0 0 0 \n",
"1 0 0 799813.0 0 1 \n",
"2 561120 49320 997570.0 0 1 \n",
"3 673590 60780 741506.0 71388 0 \n",
"4 808480 0 0.0 0 0 \n",
"\n",
" FLG_HAS_NOMINEE FLG_HAS_OLD_LOAN \n",
"0 1 1 \n",
"1 1 0 \n",
"2 1 1 \n",
"3 1 0 \n",
"4 1 0 \n",
"\n",
"[5 rows x 26 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data=pd.read_csv(\"my-bank.csv\") # importing dataset\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"id": "4de939fb",
"metadata": {},
"source": [
"# EDA"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "b31c230d",
"metadata": {},
"outputs": [],
"source": [
"# Removing unwanted columns\n",
"data.drop([\"CUST_ID\",\"ACC_OP_DATE\"],axis=1,inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ff296b3c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"TARGET 0\n",
"AGE 0\n",
"GENDER 0\n",
"BALANCE 0\n",
"OCCUPATION 0\n",
"SCR 0\n",
"HOLDING_PERIOD 0\n",
"ACC_TYPE 0\n",
"LEN_OF_RLTN_IN_MNTH 0\n",
"NO_OF_L_CR_TXNS 0\n",
"NO_OF_BR_CSH_WDL_DR_TXNS 0\n",
"NO_OF_ATM_DR_TXNS 0\n",
"NO_OF_NET_DR_TXNS 0\n",
"NO_OF_MOB_DR_TXNS 0\n",
"NO_OF_CHQ_DR_TXNS 0\n",
"FLG_HAS_CC 0\n",
"AMT_ATM_DR 0\n",
"AMT_BR_CSH_WDL_DR 0\n",
"AMT_CHQ_DR 0\n",
"AMT_NET_DR 0\n",
"AMT_MOB_DR 0\n",
"FLG_HAS_ANY_CHGS 0\n",
"FLG_HAS_NOMINEE 0\n",
"FLG_HAS_OLD_LOAN 0\n",
"dtype: int64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Checking the missing values\n",
"data.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "3e30d096",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"