library(dplyr)
library(readr)
clients_database <- read_csv("C:\\Users\\Админ\\Downloads\\clientum.csv")
clients_database1 = subset(clients_database, select = - c(...1))
str(clients_database1)
## tibble [10,127 × 21] (S3: tbl_df/tbl/data.frame)
## $ CLIENTNUM : num [1:10127] 7.69e+08 8.19e+08 7.14e+08 7.70e+08 7.09e+08 ...
## $ Attrition_Flag : chr [1:10127] "Existing Customer" "Existing Customer" "Existing Customer" "Existing Customer" ...
## $ Customer_Age : num [1:10127] 45 49 51 40 40 44 51 32 37 48 ...
## $ Gender : chr [1:10127] "M" "F" "M" "F" ...
## $ Dependent_count : num [1:10127] 3 5 3 4 3 2 4 0 3 2 ...
## $ Education_Level : chr [1:10127] "High School" "Graduate" "Graduate" "High School" ...
## $ Marital_Status : chr [1:10127] "Married" "Single" "Married" "Unknown" ...
## $ Income_Category : chr [1:10127] "$60K - $80K" "Less than $40K" "$80K - $120K" "Less than $40K" ...
## $ Card_Category : chr [1:10127] "Blue" "Blue" "Blue" "Blue" ...
## $ Months_on_book : num [1:10127] 39 44 36 34 21 36 46 27 36 36 ...
## $ Total_Relationship_Count: num [1:10127] 5 6 4 3 5 3 6 2 5 6 ...
## $ Months_Inactive_12_mon : num [1:10127] 1 1 1 4 1 1 1 2 2 3 ...
## $ Contacts_Count_12_mon : num [1:10127] 3 2 0 1 0 2 3 2 0 3 ...
## $ Credit_Limit : num [1:10127] 12691 8256 3418 3313 4716 ...
## $ Total_Revolving_Bal : num [1:10127] 777 864 0 2517 0 ...
## $ Avg_Open_To_Buy : num [1:10127] 11914 7392 3418 796 4716 ...
## $ Total_Amt_Chng_Q4_Q1 : num [1:10127] 1.33 1.54 2.59 1.4 2.17 ...
## $ Total_Trans_Amt : num [1:10127] 1144 1291 1887 1171 816 ...
## $ Total_Trans_Ct : num [1:10127] 42 33 20 20 28 24 31 36 24 32 ...
## $ Total_Ct_Chng_Q4_Q1 : num [1:10127] 1.62 3.71 2.33 2.33 2.5 ...
## $ Avg_Utilization_Ratio : num [1:10127] 0.061 0.105 0 0.76 0 0.311 0.066 0.048 0.113 0.144 ...
head(clients_database1)
## # A tibble: 6 × 21
## CLIENTNUM Attrition_Flag Customer_Age Gender Dependent_count Education_Level
## <dbl> <chr> <dbl> <chr> <dbl> <chr>
## 1 768805383 Existing Custom… 45 M 3 High School
## 2 818770008 Existing Custom… 49 F 5 Graduate
## 3 713982108 Existing Custom… 51 M 3 Graduate
## 4 769911858 Existing Custom… 40 F 4 High School
## 5 709106358 Existing Custom… 40 M 3 Uneducated
## 6 713061558 Existing Custom… 44 M 2 Graduate
## # ℹ 15 more variables: Marital_Status <chr>, Income_Category <chr>,
## # Card_Category <chr>, Months_on_book <dbl>, Total_Relationship_Count <dbl>,
## # Months_Inactive_12_mon <dbl>, Contacts_Count_12_mon <dbl>,
## # Credit_Limit <dbl>, Total_Revolving_Bal <dbl>, Avg_Open_To_Buy <dbl>,
## # Total_Amt_Chng_Q4_Q1 <dbl>, Total_Trans_Amt <dbl>, Total_Trans_Ct <dbl>,
## # Total_Ct_Chng_Q4_Q1 <dbl>, Avg_Utilization_Ratio <dbl>
sum(is.na(clients_database1))
## [1] 0
sum(duplicated(clients_database1)==TRUE)
## [1] 0
clients_database1$Gender <- as.factor(clients_database1$Gender)
clients_database1$Gender <- as.numeric(clients_database1$Gender)
clients_database1$Gender <- clients_database1$Gender - 1
clients_database1$Education_Level <- as.factor(clients_database1$Education_Level)
clients_database1$Education_Level <- as.numeric(clients_database1$Education_Level)
clients_database1$Education_Level <- clients_database1$Education_Level - 1
clients_database1$Attrition_Flag <- as.factor(clients_database1$Attrition_Flag)
clients_database1$Attrition_Flag <- as.numeric(clients_database1$Attrition_Flag)
clients_database1$Attrition_Flag <- clients_database1$Attrition_Flag - 1
clients_database1$Marital_Status <- as.factor(clients_database1$Marital_Status)
clients_database1$Marital_Status <- as.numeric(clients_database1$Marital_Status)
clients_database1$Marital_Status <- clients_database1$Marital_Status - 1
clients_database1$Income_Category <- as.factor(clients_database1$Income_Category)
clients_database1$Income_Category <- as.numeric(clients_database1$Income_Category)
clients_database1$Income_Category <- clients_database1$Income_Category - 1
clients_database1$Card_Category <- as.factor(clients_database1$Card_Category)
clients_database1$Card_Category <- as.numeric(clients_database1$Card_Category)
clients_database1$Card_Category <- clients_database1$Card_Category - 1
library(ggplot2)
library(gridExtra)
box1 <-ggplot(clients_database1) +
aes(y = Customer_Age) +
geom_boxplot(fill = "lightblue", color = "blue") +
ggtitle("Выбросы в возрастных данных") +
ylab("Возраст") +
xlab(NULL)+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
box2 <-ggplot(clients_database1) +
aes(y = Avg_Open_To_Buy) +
geom_boxplot(fill = "lightblue", color = "blue") +
ggtitle("Выбросы в доступности денег к покупкам") +
ylab("Доступность денег к покупке") +
xlab(NULL)+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
box3 <-ggplot(clients_database1) +
aes(y = Credit_Limit) +
geom_boxplot(fill = "lightblue", color = "blue") +
ggtitle("Выбросы в лимитах по кредитным лимитам") +
ylab("Кредитный лимит") +
xlab(NULL)+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
box4 <-ggplot(clients_database1) +
aes(y = Total_Revolving_Bal) +
geom_boxplot(fill = "lightblue", color = "blue") +
ggtitle("Выбросы в суммах невыплаченных кредитов") +
ylab("Невыплаченный кредит") +
xlab(NULL)+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
box5 <-ggplot(clients_database1) +
aes(y = Total_Trans_Amt) +
geom_boxplot(fill = "lightblue", color = "blue") +
ggtitle("Выбросы в суммах транзакций (12 мес.)") +
ylab("Сумма транзакции") +
xlab(NULL)+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
box6 <-ggplot(clients_database1) +
aes(y = Total_Trans_Ct) +
geom_boxplot(fill = "lightblue", color = "blue") +
ggtitle("Выбросы в суммах транзакций") +
ylab("Сумма транзакции") +
xlab(NULL)+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
box7 <-ggplot(clients_database1) +
aes(y = Total_Ct_Chng_Q4_Q1) +
geom_boxplot(fill = "lightblue", color = "blue") +
ggtitle("Выбросы в суммах транзакций (4Q:1Q)") +
ylab("Отношение") +
xlab(NULL)+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
box8 <-ggplot(clients_database1) +
aes(y = Avg_Utilization_Ratio) +
geom_boxplot(fill = "lightblue", color = "blue") +
ggtitle("Выбросы в среднем использовании карты (потраченные/доступные") +
ylab("Отношение") +
xlab(NULL)+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
grid.arrange(box1, box2, box3, box4, box5, box6, box7, box8, ncol=2)
library(psych)
describe(clients_database1)
## vars n mean sd median
## CLIENTNUM 1 10127 739177606.33 36903783.45 717926358.00
## Attrition_Flag 2 10127 0.84 0.37 1.00
## Customer_Age 3 10127 46.33 8.02 46.00
## Gender 4 10127 0.47 0.50 0.00
## Dependent_count 5 10127 2.35 1.30 2.00
## Education_Level 6 10127 3.10 1.83 3.00
## Marital_Status 7 10127 1.46 0.74 1.00
## Income_Category 8 10127 2.86 1.50 3.00
## Card_Category 9 10127 0.18 0.69 0.00
## Months_on_book 10 10127 35.93 7.99 36.00
## Total_Relationship_Count 11 10127 3.81 1.55 4.00
## Months_Inactive_12_mon 12 10127 2.34 1.01 2.00
## Contacts_Count_12_mon 13 10127 2.46 1.11 2.00
## Credit_Limit 14 10127 8631.95 9088.78 4549.00
## Total_Revolving_Bal 15 10127 1162.81 814.99 1276.00
## Avg_Open_To_Buy 16 10127 7469.14 9090.69 3474.00
## Total_Amt_Chng_Q4_Q1 17 10127 0.76 0.22 0.74
## Total_Trans_Amt 18 10127 4404.09 3397.13 3899.00
## Total_Trans_Ct 19 10127 64.86 23.47 67.00
## Total_Ct_Chng_Q4_Q1 20 10127 0.71 0.24 0.70
## Avg_Utilization_Ratio 21 10127 0.27 0.28 0.18
## trimmed mad min max
## CLIENTNUM 733606202.47 9411100.02 708082083.0 828343083.00
## Attrition_Flag 0.92 0.00 0.0 1.00
## Customer_Age 46.35 8.90 26.0 73.00
## Gender 0.46 0.00 0.0 1.00
## Dependent_count 2.37 1.48 0.0 5.00
## Education_Level 3.12 1.48 0.0 6.00
## Marital_Status 1.45 1.48 0.0 3.00
## Income_Category 2.92 1.48 0.0 5.00
## Card_Category 0.00 0.00 0.0 3.00
## Months_on_book 35.99 5.93 13.0 56.00
## Total_Relationship_Count 3.88 1.48 1.0 6.00
## Months_Inactive_12_mon 2.29 1.48 0.0 6.00
## Contacts_Count_12_mon 2.46 1.48 0.0 6.00
## Credit_Limit 6685.09 3844.38 1438.3 34516.00
## Total_Revolving_Bal 1148.50 876.22 0.0 2517.00
## Avg_Open_To_Buy 5514.94 3951.13 3.0 34516.00
## Total_Amt_Chng_Q4_Q1 0.74 0.17 0.0 3.40
## Total_Trans_Amt 3707.92 1939.24 510.0 18484.00
## Total_Trans_Ct 64.30 25.20 10.0 139.00
## Total_Ct_Chng_Q4_Q1 0.70 0.18 0.0 3.71
## Avg_Utilization_Ratio 0.24 0.26 0.0 1.00
## range skew kurtosis se
## CLIENTNUM 1.20261e+08 1.00 -0.62 366716.53
## Attrition_Flag 1.00000e+00 -1.85 1.41 0.00
## Customer_Age 4.70000e+01 -0.03 -0.29 0.08
## Gender 1.00000e+00 0.12 -1.99 0.00
## Dependent_count 5.00000e+00 -0.02 -0.68 0.01
## Education_Level 6.00000e+00 0.15 -0.96 0.02
## Marital_Status 3.00000e+00 0.13 -0.28 0.01
## Income_Category 5.00000e+00 -0.39 -1.07 0.01
## Card_Category 3.00000e+00 3.73 12.15 0.01
## Months_on_book 4.30000e+01 -0.11 0.40 0.08
## Total_Relationship_Count 5.00000e+00 -0.16 -1.01 0.02
## Months_Inactive_12_mon 6.00000e+00 0.63 1.10 0.01
## Contacts_Count_12_mon 6.00000e+00 0.01 0.00 0.01
## Credit_Limit 3.30777e+04 1.67 1.81 90.32
## Total_Revolving_Bal 2.51700e+03 -0.15 -1.15 8.10
## Avg_Open_To_Buy 3.45130e+04 1.66 1.80 90.34
## Total_Amt_Chng_Q4_Q1 3.40000e+00 1.73 9.99 0.00
## Total_Trans_Amt 1.79740e+04 2.04 3.89 33.76
## Total_Trans_Ct 1.29000e+02 0.15 -0.37 0.23
## Total_Ct_Chng_Q4_Q1 3.71000e+00 2.06 15.68 0.00
## Avg_Utilization_Ratio 1.00000e+00 0.72 -0.80 0.00
hist1 <-ggplot(clients_database1, aes(x = Customer_Age)) +
geom_histogram(binwidth = 1, fill = "blue", color = "white", alpha = 0.7) +
ggtitle("Распределение возраста клиентов") +
xlab("Возраст") +
ylab("Частота")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
hist2 <-ggplot(clients_database1, aes(x = Avg_Open_To_Buy)) +
geom_histogram(binwidth = 500, fill = "blue", color = "white", alpha = 0.7) +
ggtitle("Распределение доступности денег к покупкам") +
xlab("Доступность денег к покупке") +
ylab("Частота")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
hist3 <-ggplot(clients_database1, aes(x = Credit_Limit)) +
geom_histogram(binwidth = 500, fill = "blue", color = "white", alpha = 0.7) +
ggtitle("Распределение кредитного лимита клиентов") +
xlab("Кредитный лимит") +
ylab("Частота")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
hist4 <-ggplot(clients_database1, aes(x = Total_Revolving_Bal)) +
geom_histogram(binwidth = 50, fill = "blue", color = "white", alpha = 0.7) +
ggtitle("Распределение по сумме невыплаченного кредита") +
xlab("Сумма невыплаченного кредита") +
ylab("Частота")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
hist5 <-ggplot(clients_database1, aes(x = Total_Trans_Amt)) +
geom_histogram(binwidth = 700, fill = "blue", color = "white", alpha = 0.7) +
ggtitle("Распределение по сумме транзакций (12 мес.)") +
xlab("Сумма транзакций") +
ylab("Частота")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
hist6 <-ggplot(clients_database1, aes(x = Total_Trans_Ct)) +
geom_histogram(binwidth = 5, fill = "blue", color = "white", alpha = 0.7) +
ggtitle("Распределение по сумме транзакций") +
xlab("Сумма транзакций") +
ylab("Частота")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
hist7 <-ggplot(clients_database1, aes(x = Total_Ct_Chng_Q4_Q1)) +
geom_histogram(binwidth = 0.05, fill = "blue", color = "white", alpha = 0.7) +
ggtitle("Распределение по сумме транзакций (4Q:1Q)") +
xlab("Отношение") +
ylab("Частота")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
hist8 <-ggplot(clients_database1, aes(x = Avg_Utilization_Ratio)) +
geom_histogram(binwidth = 0.05, fill = "blue", color = "white", alpha = 0.7) +
ggtitle("Среднее использование карты (потраченные/доступные)") +
xlab("Отношение") +
ylab("Частота")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 7)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
grid.arrange(hist1, hist2, hist3, hist4,hist5,hist6, hist7, hist8, ncol=2)
qqnorm(clients_database1$Customer_Age, main = "Q-Q график (Customer_age)",xlab = "Теоретические квантили", ylab = "Фактические квантили", col = "lightblue"); qqline(clients_database1$Customer_Age)
qqnorm(clients_database1$Months_on_book, main = "Q-Q график (Months_on_book)",xlab = "Теоретические квантили", ylab = "Фактические квантили", col = "lightblue"); qqline(clients_database1$Months_on_book)
qqnorm(clients_database1$Credit_Limit, main = "Q-Q график (Credit_Limit)",xlab = "Теоретические квантили", ylab = "Фактические квантили", col = "lightblue"); qqline(clients_database1$Credit_Limit)
qqnorm(clients_database1$Total_Revolving_Bal, main = "Q-Q график (Total_Revolving_Bal)",xlab = "Теоретические квантили", ylab = "Фактические квантили", col = "lightblue"); qqline(clients_database1$Total_Revolving_Bal)
qqnorm(clients_database1$Avg_Open_To_Buy, main = "Q-Q график (Avg_Open_To_Buy)",xlab = "Теоретические квантили", ylab = "Фактические квантили", col = "lightblue"); qqline(clients_database1$Avg_Open_To_Buy)
qqnorm(clients_database1$Total_Trans_Amt, main = "Q-Q график (Total_Trans_Amt)",xlab = "Теоретические квантили", ylab = "Фактические квантили", col = "lightblue"); qqline(clients_database1$Total_Trans_Amt)
qqnorm(clients_database1$Total_Trans_Ct, main = "Q-Q график (Total_Trans_Ct)",xlab = "Теоретические квантили", ylab = "Фактические квантили", col = "lightblue"); qqline(clients_database1$Total_Trans_Ct)
qqnorm(clients_database1$Total_Ct_Chng_Q4_Q1, main = "Q-Q график (Total_Ct_Chng_Q4_Q1)",xlab = "Теоретические квантили", ylab = "Фактические квантили", col = "lightblue"); qqline(clients_database1$Total_Ct_Chng_Q4_Q1)
qqnorm(clients_database1$Avg_Utilization_Ratio, main = "Q-Q график (Avg_Utilization_Ratio)",xlab = "Теоретические квантили", ylab = "Фактические квантили", col = "lightblue"); qqline(clients_database1$Avg_Utilization_Ratio)
ks.test(clients_database1$Customer_Age, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: clients_database1$Customer_Age
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(clients_database1$Months_on_book, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: clients_database1$Months_on_book
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(clients_database1$Credit_Limit, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: clients_database1$Credit_Limit
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(clients_database1$Total_Revolving_Bal, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: clients_database1$Total_Revolving_Bal
## D = 0.7561, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(clients_database1$Avg_Open_To_Buy, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: clients_database1$Avg_Open_To_Buy
## D = 0.9999, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(clients_database1$Total_Trans_Amt, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: clients_database1$Total_Trans_Amt
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(clients_database1$Total_Trans_Ct, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: clients_database1$Total_Trans_Ct
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(clients_database1$Total_Ct_Chng_Q4_Q1, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: clients_database1$Total_Ct_Chng_Q4_Q1
## D = 0.59814, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(clients_database1$Avg_Utilization_Ratio, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: clients_database1$Avg_Utilization_Ratio
## D = 0.5, p-value < 2.2e-16
## alternative hypothesis: two-sided
cor_clients_database1 <-cor(clients_database1)
round(cor_clients_database1, 2)
## CLIENTNUM Attrition_Flag Customer_Age Gender
## CLIENTNUM 1.00 0.05 0.01 0.02
## Attrition_Flag 0.05 1.00 -0.02 0.04
## Customer_Age 0.01 -0.02 1.00 -0.02
## Gender 0.02 0.04 -0.02 1.00
## Dependent_count 0.01 -0.02 -0.12 0.00
## Education_Level 0.00 -0.01 0.00 0.00
## Marital_Status 0.00 -0.02 -0.01 0.00
## Income_Category -0.03 -0.02 -0.01 -0.54
## Card_Category 0.01 0.01 -0.02 0.08
## Months_on_book 0.13 -0.01 0.79 -0.01
## Total_Relationship_Count 0.01 0.15 -0.01 0.00
## Months_Inactive_12_mon 0.01 -0.15 0.05 -0.01
## Contacts_Count_12_mon 0.01 -0.20 -0.02 0.04
## Credit_Limit 0.01 0.02 0.00 0.42
## Total_Revolving_Bal 0.00 0.26 0.01 0.03
## Avg_Open_To_Buy 0.01 0.00 0.00 0.42
## Total_Amt_Chng_Q4_Q1 0.02 0.13 -0.06 0.03
## Total_Trans_Amt -0.02 0.17 -0.05 0.02
## Total_Trans_Ct 0.00 0.37 -0.07 -0.07
## Total_Ct_Chng_Q4_Q1 0.01 0.29 -0.01 -0.01
## Avg_Utilization_Ratio 0.00 0.18 0.01 -0.26
## Dependent_count Education_Level Marital_Status
## CLIENTNUM 0.01 0.00 0.00
## Attrition_Flag -0.02 -0.01 -0.02
## Customer_Age -0.12 0.00 -0.01
## Gender 0.00 0.00 0.00
## Dependent_count 1.00 0.00 0.00
## Education_Level 0.00 1.00 0.01
## Marital_Status 0.00 0.01 1.00
## Income_Category -0.04 -0.01 0.01
## Card_Category 0.02 -0.01 0.04
## Months_on_book -0.10 0.00 -0.01
## Total_Relationship_Count -0.04 0.01 -0.02
## Months_Inactive_12_mon -0.01 -0.01 0.00
## Contacts_Count_12_mon -0.04 0.01 0.00
## Credit_Limit 0.07 0.00 0.03
## Total_Revolving_Bal 0.00 0.01 -0.03
## Avg_Open_To_Buy 0.07 0.00 0.03
## Total_Amt_Chng_Q4_Q1 -0.04 0.01 -0.04
## Total_Trans_Amt 0.03 0.02 0.04
## Total_Trans_Ct 0.05 0.00 0.08
## Total_Ct_Chng_Q4_Q1 0.01 0.01 0.00
## Avg_Utilization_Ratio -0.04 0.01 -0.03
## Income_Category Card_Category Months_on_book
## CLIENTNUM -0.03 0.01 0.13
## Attrition_Flag -0.02 0.01 -0.01
## Customer_Age -0.01 -0.02 0.79
## Gender -0.54 0.08 -0.01
## Dependent_count -0.04 0.02 -0.10
## Education_Level -0.01 -0.01 0.00
## Marital_Status 0.01 0.04 -0.01
## Income_Category 1.00 -0.05 -0.02
## Card_Category -0.05 1.00 -0.01
## Months_on_book -0.02 -0.01 1.00
## Total_Relationship_Count 0.01 -0.07 -0.01
## Months_Inactive_12_mon 0.02 -0.02 0.07
## Contacts_Count_12_mon -0.02 0.00 -0.01
## Credit_Limit -0.23 0.48 0.01
## Total_Revolving_Bal -0.03 0.02 0.01
## Avg_Open_To_Buy -0.22 0.48 0.01
## Total_Amt_Chng_Q4_Q1 0.00 0.00 -0.05
## Total_Trans_Amt -0.01 0.18 -0.04
## Total_Trans_Ct 0.03 0.12 -0.05
## Total_Ct_Chng_Q4_Q1 0.01 0.00 -0.01
## Avg_Utilization_Ratio 0.12 -0.21 -0.01
## Total_Relationship_Count Months_Inactive_12_mon
## CLIENTNUM 0.01 0.01
## Attrition_Flag 0.15 -0.15
## Customer_Age -0.01 0.05
## Gender 0.00 -0.01
## Dependent_count -0.04 -0.01
## Education_Level 0.01 -0.01
## Marital_Status -0.02 0.00
## Income_Category 0.01 0.02
## Card_Category -0.07 -0.02
## Months_on_book -0.01 0.07
## Total_Relationship_Count 1.00 0.00
## Months_Inactive_12_mon 0.00 1.00
## Contacts_Count_12_mon 0.06 0.03
## Credit_Limit -0.07 -0.02
## Total_Revolving_Bal 0.01 -0.04
## Avg_Open_To_Buy -0.07 -0.02
## Total_Amt_Chng_Q4_Q1 0.05 -0.03
## Total_Trans_Amt -0.35 -0.04
## Total_Trans_Ct -0.24 -0.04
## Total_Ct_Chng_Q4_Q1 0.04 -0.04
## Avg_Utilization_Ratio 0.07 -0.01
## Contacts_Count_12_mon Credit_Limit Total_Revolving_Bal
## CLIENTNUM 0.01 0.01 0.00
## Attrition_Flag -0.20 0.02 0.26
## Customer_Age -0.02 0.00 0.01
## Gender 0.04 0.42 0.03
## Dependent_count -0.04 0.07 0.00
## Education_Level 0.01 0.00 0.01
## Marital_Status 0.00 0.03 -0.03
## Income_Category -0.02 -0.23 -0.03
## Card_Category 0.00 0.48 0.02
## Months_on_book -0.01 0.01 0.01
## Total_Relationship_Count 0.06 -0.07 0.01
## Months_Inactive_12_mon 0.03 -0.02 -0.04
## Contacts_Count_12_mon 1.00 0.02 -0.05
## Credit_Limit 0.02 1.00 0.04
## Total_Revolving_Bal -0.05 0.04 1.00
## Avg_Open_To_Buy 0.03 1.00 -0.05
## Total_Amt_Chng_Q4_Q1 -0.02 0.01 0.06
## Total_Trans_Amt -0.11 0.17 0.06
## Total_Trans_Ct -0.15 0.08 0.06
## Total_Ct_Chng_Q4_Q1 -0.09 0.00 0.09
## Avg_Utilization_Ratio -0.06 -0.48 0.62
## Avg_Open_To_Buy Total_Amt_Chng_Q4_Q1 Total_Trans_Amt
## CLIENTNUM 0.01 0.02 -0.02
## Attrition_Flag 0.00 0.13 0.17
## Customer_Age 0.00 -0.06 -0.05
## Gender 0.42 0.03 0.02
## Dependent_count 0.07 -0.04 0.03
## Education_Level 0.00 0.01 0.02
## Marital_Status 0.03 -0.04 0.04
## Income_Category -0.22 0.00 -0.01
## Card_Category 0.48 0.00 0.18
## Months_on_book 0.01 -0.05 -0.04
## Total_Relationship_Count -0.07 0.05 -0.35
## Months_Inactive_12_mon -0.02 -0.03 -0.04
## Contacts_Count_12_mon 0.03 -0.02 -0.11
## Credit_Limit 1.00 0.01 0.17
## Total_Revolving_Bal -0.05 0.06 0.06
## Avg_Open_To_Buy 1.00 0.01 0.17
## Total_Amt_Chng_Q4_Q1 0.01 1.00 0.04
## Total_Trans_Amt 0.17 0.04 1.00
## Total_Trans_Ct 0.07 0.01 0.81
## Total_Ct_Chng_Q4_Q1 -0.01 0.38 0.09
## Avg_Utilization_Ratio -0.54 0.04 -0.08
## Total_Trans_Ct Total_Ct_Chng_Q4_Q1
## CLIENTNUM 0.00 0.01
## Attrition_Flag 0.37 0.29
## Customer_Age -0.07 -0.01
## Gender -0.07 -0.01
## Dependent_count 0.05 0.01
## Education_Level 0.00 0.01
## Marital_Status 0.08 0.00
## Income_Category 0.03 0.01
## Card_Category 0.12 0.00
## Months_on_book -0.05 -0.01
## Total_Relationship_Count -0.24 0.04
## Months_Inactive_12_mon -0.04 -0.04
## Contacts_Count_12_mon -0.15 -0.09
## Credit_Limit 0.08 0.00
## Total_Revolving_Bal 0.06 0.09
## Avg_Open_To_Buy 0.07 -0.01
## Total_Amt_Chng_Q4_Q1 0.01 0.38
## Total_Trans_Amt 0.81 0.09
## Total_Trans_Ct 1.00 0.11
## Total_Ct_Chng_Q4_Q1 0.11 1.00
## Avg_Utilization_Ratio 0.00 0.07
## Avg_Utilization_Ratio
## CLIENTNUM 0.00
## Attrition_Flag 0.18
## Customer_Age 0.01
## Gender -0.26
## Dependent_count -0.04
## Education_Level 0.01
## Marital_Status -0.03
## Income_Category 0.12
## Card_Category -0.21
## Months_on_book -0.01
## Total_Relationship_Count 0.07
## Months_Inactive_12_mon -0.01
## Contacts_Count_12_mon -0.06
## Credit_Limit -0.48
## Total_Revolving_Bal 0.62
## Avg_Open_To_Buy -0.54
## Total_Amt_Chng_Q4_Q1 0.04
## Total_Trans_Amt -0.08
## Total_Trans_Ct 0.00
## Total_Ct_Chng_Q4_Q1 0.07
## Avg_Utilization_Ratio 1.00
library(corrplot)
corrplot(cor_clients_database1, method = "color",tl.cex = 0.7)
library(factoextra)
library(cluster)
clients_database_scaled <-scale(clients_database1)
fviz_nbclust(clients_database_scaled ,FUNcluster = kmeans,method = "silhouette") +
ggtitle("Оптимальное кол-во кластеров") +
xlab("Количество кластеров (k)") +
ylab("Cредняя ширина силуэта")
set.seed(123)
kmeans_result <- kmeans(clients_database_scaled, centers = 2)
clients_database1$cluster <- kmeans_result$cluster
fviz_cluster(kmeans_result, data = clients_database_scaled, repel = FALSE, geom = "point", show.clust.cent = TRUE,
ellipse.type = "convex", ggtheme = theme_minimal(),
main = "Factor map") +
ggtitle("График кластеров")+
theme(plot.title = element_text (hjust = 0.5 ))
profiles <- clients_database1 %>%
group_by(cluster) %>%
summarise(
AvgCustomerAge = mean(Customer_Age, na.rm = TRUE),
AvgDependentcount = mean(Dependent_count, na.rm = TRUE),
AvgMonthsonbook = mean(Months_on_book, na.rm = TRUE),
AvgTotalRelationshipCount = mean(Total_Relationship_Count, na.rm = TRUE),
AvgMonthsInactive12mon = mean(Months_Inactive_12_mon, na.rm = TRUE),
AvgContactsCount12mon = mean(Contacts_Count_12_mon, na.rm = TRUE),
AvgCreditLimit = mean(Credit_Limit, na.rm = TRUE),
AvgTotalRevolvingBal = mean(Total_Revolving_Bal, na.rm = TRUE),
AvgTotalAmtChngQ4Q1 = mean(Total_Amt_Chng_Q4_Q1, na.rm = TRUE),
AvgTotalTransAmt = mean(Total_Trans_Amt, na.rm = TRUE),
AvgTotalTransCt = mean(Total_Trans_Ct, na.rm = TRUE),
AvgTotalCtChngQ4Q1 = mean(Total_Ct_Chng_Q4_Q1, na.rm = TRUE),
AvgAvgUtilizationRatio = mean(Avg_Utilization_Ratio, na.rm = TRUE)
)
print(profiles)
## # A tibble: 2 × 14
## cluster AvgCustomerAge AvgDependentcount AvgMonthsonbook
## <int> <dbl> <dbl> <dbl>
## 1 1 46.2 2.49 35.9
## 2 2 46.4 2.31 35.9
## # ℹ 10 more variables: AvgTotalRelationshipCount <dbl>,
## # AvgMonthsInactive12mon <dbl>, AvgContactsCount12mon <dbl>,
## # AvgCreditLimit <dbl>, AvgTotalRevolvingBal <dbl>,
## # AvgTotalAmtChngQ4Q1 <dbl>, AvgTotalTransAmt <dbl>, AvgTotalTransCt <dbl>,
## # AvgTotalCtChngQ4Q1 <dbl>, AvgAvgUtilizationRatio <dbl>
ai1 <-ggplot(clients_database1, aes(x = Customer_Age, fill = as.factor(cluster))) +
geom_histogram(position = "identity", alpha = 0.5, bins = 30) +
scale_fill_manual(values = c("red", "lightblue")) +
ggtitle("Распределение возраста клиентов по кластерам") +
xlab("Возраст клиента") +
ylab("Кол-во") +
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
ai2 <-ggplot(clients_database1, aes(x = Avg_Open_To_Buy, fill = as.factor(cluster))) +
geom_histogram(position = "identity", alpha = 0.5, bins = 30) +
scale_fill_manual(values = c("red", "lightblue")) +
ggtitle("Распределение доступности денег к покупкам по кластерам") +
xlab("Деньги к покупке") +
ylab("Кол-во") +
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
ai3 <-ggplot(clients_database1, aes(x = Credit_Limit, fill = as.factor(cluster))) +
geom_histogram(position = "identity", alpha = 0.5, bins = 30) +
scale_fill_manual(values = c("red", "lightblue")) +
ggtitle("Распределение кредитного лимита клиентов банка по кластерам") +
xlab("Кредитный лимит клиента") +
ylab("Кол-во") +
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
ai4 <-ggplot(clients_database1, aes(x = Total_Revolving_Bal, fill = as.factor(cluster))) +
geom_histogram(position = "identity", alpha = 0.5, bins = 30) +
scale_fill_manual(values = c("red", "lightblue")) +
ggtitle("Распределение сумм невыплченных кредитов") +
xlab("Невыплаченные кредиты") +
ylab("Кол-во") +
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
grid.arrange(ai1, ai2, ai3, ai4, ncol=2)
models <- list()
summaries <- list()
for (i in unique(clients_database1$cluster)){
cluster_data <- clients_database1[clients_database1$cluster == i, ]
model <- lm(Credit_Limit ~ Avg_Open_To_Buy + Avg_Utilization_Ratio,
data = cluster_data)
models[[i]] <- model
summaries[[i]] <- summary(model)
}
models
## [[1]]
##
## Call:
## lm(formula = Credit_Limit ~ Avg_Open_To_Buy + Avg_Utilization_Ratio,
## data = cluster_data)
##
## Coefficients:
## (Intercept) Avg_Open_To_Buy Avg_Utilization_Ratio
## -773.196 1.044 16859.643
##
##
## [[2]]
##
## Call:
## lm(formula = Credit_Limit ~ Avg_Open_To_Buy + Avg_Utilization_Ratio,
## data = cluster_data)
##
## Coefficients:
## (Intercept) Avg_Open_To_Buy Avg_Utilization_Ratio
## -199.485 1.112 2914.442
summaries
## [[1]]
##
## Call:
## lm(formula = Credit_Limit ~ Avg_Open_To_Buy + Avg_Utilization_Ratio,
## data = cluster_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4512.1 -159.8 65.2 218.4 668.2
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.732e+02 3.137e+01 -24.65 <2e-16 ***
## Avg_Open_To_Buy 1.044e+00 1.075e-03 971.65 <2e-16 ***
## Avg_Utilization_Ratio 1.686e+04 1.865e+02 90.39 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 368.3 on 2132 degrees of freedom
## Multiple R-squared: 0.9981, Adjusted R-squared: 0.9981
## F-statistic: 5.576e+05 on 2 and 2132 DF, p-value: < 2.2e-16
##
##
## [[2]]
##
## Call:
## lm(formula = Credit_Limit ~ Avg_Open_To_Buy + Avg_Utilization_Ratio,
## data = cluster_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2128.35 -283.20 1.57 278.39 1185.80
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.995e+02 1.397e+01 -14.28 <2e-16 ***
## Avg_Open_To_Buy 1.112e+00 1.951e-03 570.17 <2e-16 ***
## Avg_Utilization_Ratio 2.914e+03 2.304e+01 126.47 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 466.6 on 7989 degrees of freedom
## Multiple R-squared: 0.9802, Adjusted R-squared: 0.9802
## F-statistic: 1.977e+05 on 2 and 7989 DF, p-value: < 2.2e-16
library(car)
library(lmtest)
vif(models[[1]])
## Avg_Open_To_Buy Avg_Utilization_Ratio
## 1.281879 1.281879
vif(models[[2]])
## Avg_Open_To_Buy Avg_Utilization_Ratio
## 1.549314 1.549314
resettest(formula = Credit_Limit ~ Avg_Open_To_Buy + Avg_Utilization_Ratio, data = cluster_data, power = 3, type = "fitted")
##
## RESET test
##
## data: Credit_Limit ~ Avg_Open_To_Buy + Avg_Utilization_Ratio
## RESET = 9.5543, df1 = 1, df2 = 2131, p-value = 0.002021
library(gridExtra)
clients_database.2 <- read_csv("C:\\Users\\Админ\\Downloads\\clientum.csv")
clients_database2 = subset(clients_database.2, select = - c(...1))
gga<-ggplot(clients_database2, aes(x = Attrition_Flag)) +
geom_bar(color="black",fill = "lightblue") +
ggtitle("Актуальные/ушедшие клиенты")+
labs(x = "Актуальный статус",
y = "Кол-во")+
theme(plot.title = element_text (hjust = 0.5 ))
ggb<-ggplot(clients_database2, aes(x = Gender)) +
geom_bar(color="black",fill = "lightblue") +
ggtitle("Пол клиентов")+
labs(x = "Пол",
y = "Кол-во")+
theme(plot.title = element_text (hjust = 0.5 ))
ggc<-ggplot(clients_database2, aes(x = Education_Level)) +
geom_bar(color="black",fill = "lightblue") +
ggtitle("Уровень образования клиентов")+
labs(x = "Уровень образования",
y = "Кол-во")+
theme(plot.title = element_text (hjust = 0.5 ))+
theme(axis.text = element_text(size = 5))
ggd<-ggplot(clients_database2, aes(x = Income_Category)) +
geom_bar(color="black",fill = "lightblue") +
ggtitle("Уровень дохода клиентов")+
labs(x = "Уровень дохода",
y = "Кол-во")+
theme(plot.title = element_text (hjust = 0.5 ))+
theme(axis.text = element_text(size = 5))
ggf<-ggplot(clients_database2, aes(x = Marital_Status)) +
geom_bar(color="black",fill = "lightblue") +
ggtitle("Брачный статус клиентов")+
labs(x = "Брачный статус",
y = "Кол-во")+
theme(plot.title = element_text (hjust = 0.5 ))
ggg<-ggplot(clients_database2, aes(x = Card_Category)) +
geom_bar(color="black",fill = "lightblue") +
ggtitle("Категория карты клиентов")+
labs(x = "Категория карты",
y = "Кол-во")+
theme(plot.title = element_text (hjust = 0.5 ))
grid.arrange(gga, ggb, ggc, ggd, ggf, ggg, ncol=2)
table(clients_database2$Attrition_Flag)
##
## Attrited Customer Existing Customer
## 1627 8500
table(clients_database2$Gender)
##
## F M
## 5358 4769
table(clients_database2$Education_Level)
##
## College Doctorate Graduate High School Post-Graduate
## 1013 451 3128 2013 516
## Uneducated Unknown
## 1487 1519
table(clients_database2$Income_Category)
##
## $120K + $40K - $60K $60K - $80K $80K - $120K Less than $40K
## 727 1790 1402 1535 3561
## Unknown
## 1112
table(clients_database2$Marital_Status)
##
## Divorced Married Single Unknown
## 748 4687 3943 749
table(clients_database2$Card_Category)
##
## Blue Gold Platinum Silver
## 9436 116 20 555
ggh <-ggplot(data = clients_database2,
aes(x = Attrition_Flag,
fill = Gender)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Текущий статус клиента",
y = "Кол-во", title = "Текущий статус обслуживания относительно пола")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
ggi <- ggplot(data = clients_database2,
aes(x = Education_Level,
fill = Gender)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Образование",
y = "Кол-во", title = "Уровень образования клиентов относительно пола")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
ggj <- ggplot(data = clients_database2,
aes(x = Customer_Age,
fill = Gender)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Возраст",
y = "Кол-во", title = "Возраст клиента относительно пола")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
ggk <-ggplot(data = clients_database2,
aes(x = Marital_Status,
fill = Gender)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Брачный статус",
y = "Кол-во", title = "Брачный статус клиентов относительно пола")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
ggl <-ggplot(data = clients_database2,
aes(x = Income_Category,
fill = Gender)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Доход",
y = "Кол-во", title = "Доходы клиентов относительно пола")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
ggm <-ggplot(data = clients_database2,
aes(x = Card_Category,
fill = Gender)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Вид карты",
y = "Кол-во", title = "Вид карты относительно пола")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 5)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 5),
axis.title.y = element_text(size = 5))
grid.arrange(ggh, ggi, ggj, ggk, ggl, ggm, ncol = 2)
clients_database2%>%filter(Gender=="F")%>%count(Attrition_Flag)
## # A tibble: 2 × 2
## Attrition_Flag n
## <chr> <int>
## 1 Attrited Customer 930
## 2 Existing Customer 4428
clients_database2%>%filter(Gender=="M")%>%count(Attrition_Flag)
## # A tibble: 2 × 2
## Attrition_Flag n
## <chr> <int>
## 1 Attrited Customer 697
## 2 Existing Customer 4072
clients_database2%>%filter(Gender=="F")%>%count(Education_Level)
## # A tibble: 7 × 2
## Education_Level n
## <chr> <int>
## 1 College 532
## 2 Doctorate 257
## 3 Graduate 1670
## 4 High School 1028
## 5 Post-Graduate 263
## 6 Uneducated 796
## 7 Unknown 812
clients_database2%>%filter(Gender=="M")%>%count(Education_Level)
## # A tibble: 7 × 2
## Education_Level n
## <chr> <int>
## 1 College 481
## 2 Doctorate 194
## 3 Graduate 1458
## 4 High School 985
## 5 Post-Graduate 253
## 6 Uneducated 691
## 7 Unknown 707
clients_database2%>%filter(Gender=="F")%>%count(Customer_Age)
## # A tibble: 42 × 2
## Customer_Age n
## <dbl> <int>
## 1 26 39
## 2 27 19
## 3 28 13
## 4 29 22
## 5 30 33
## 6 31 45
## 7 32 45
## 8 33 72
## 9 34 78
## 10 35 105
## # ℹ 32 more rows
clients_database2%>%filter(Gender=="F")%>%count(mean(Customer_Age))
## # A tibble: 1 × 2
## `mean(Customer_Age)` n
## <dbl> <int>
## 1 46.5 5358
clients_database2%>%filter(Gender=="M")%>%count(Customer_Age)
## # A tibble: 44 × 2
## Customer_Age n
## <dbl> <int>
## 1 26 39
## 2 27 13
## 3 28 16
## 4 29 34
## 5 30 37
## 6 31 46
## 7 32 61
## 8 33 55
## 9 34 68
## 10 35 79
## # ℹ 34 more rows
clients_database2%>%filter(Gender=="M")%>%count(mean(Customer_Age))
## # A tibble: 1 × 2
## `mean(Customer_Age)` n
## <dbl> <int>
## 1 46.2 4769
clients_database2%>%filter(Gender=="F")%>%count(Marital_Status)
## # A tibble: 4 × 2
## Marital_Status n
## <chr> <int>
## 1 Divorced 402
## 2 Married 2451
## 3 Single 2125
## 4 Unknown 380
clients_database2%>%filter(Gender=="M")%>%count(Marital_Status)
## # A tibble: 4 × 2
## Marital_Status n
## <chr> <int>
## 1 Divorced 346
## 2 Married 2236
## 3 Single 1818
## 4 Unknown 369
clients_database2%>%filter(Gender=="F")%>%count(Income_Category)
## # A tibble: 3 × 2
## Income_Category n
## <chr> <int>
## 1 $40K - $60K 1014
## 2 Less than $40K 3284
## 3 Unknown 1060
clients_database2%>%filter(Gender=="M")%>%count(Income_Category)
## # A tibble: 6 × 2
## Income_Category n
## <chr> <int>
## 1 $120K + 727
## 2 $40K - $60K 776
## 3 $60K - $80K 1402
## 4 $80K - $120K 1535
## 5 Less than $40K 277
## 6 Unknown 52
clients_database2%>%filter(Gender=="F")%>%count(Card_Category)
## # A tibble: 4 × 2
## Card_Category n
## <chr> <int>
## 1 Blue 5101
## 2 Gold 38
## 3 Platinum 9
## 4 Silver 210
clients_database2%>%filter(Gender=="M")%>%count(Card_Category)
## # A tibble: 4 × 2
## Card_Category n
## <chr> <int>
## 1 Blue 4335
## 2 Gold 78
## 3 Platinum 11
## 4 Silver 345
ggn <-ggplot(data = clients_database2,
aes(x = Attrition_Flag,
fill = Income_Category)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Текущий статус клиента",
y = "Кол-во", title = "Текущий статус обслуживания относительно уровня дохода") +
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 6)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
ggp <- ggplot(data = clients_database2,
aes(x = Education_Level,
fill = Income_Category)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Образование",
y = "Кол-во", title = "Уровень образования клиентов относительно уровня дохода")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 6)) +
theme(axis.text.x= element_text(size =3),
axis.text.y= element_text(size =3)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
ggq <-ggplot(data = clients_database2,
aes(x = Marital_Status,
fill = Income_Category)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Брачный статус",
y = "Кол-во", title = "Брачный статус клиентов относительно уровня дохода")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 6)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
ggr <-ggplot(data = clients_database2,
aes(x = Card_Category,
fill = Income_Category)) +
geom_bar(position = position_dodge(preserve = "single"))+
labs(x = "Вид карты",
y = "Кол-во", title = "Вид карты относительно уровня дохода")+
theme(plot.title = element_text (hjust = 0.5 )) +
theme(plot.title = element_text(size = 6)) +
theme(axis.text.x= element_text(size =5),
axis.text.y= element_text(size =5)) +
theme(axis.title.x = element_text(size = 6),
axis.title.y = element_text(size = 6))
grid.arrange(ggn, ggp, ggq, ggr, ncol = 2)
clients_database2%>%filter(Income_Category=="Less than $40K")%>%count(Attrition_Flag)
## # A tibble: 2 × 2
## Attrition_Flag n
## <chr> <int>
## 1 Attrited Customer 612
## 2 Existing Customer 2949
clients_database2%>%filter(Income_Category=="$40K - $60K")%>%count(Attrition_Flag)
## # A tibble: 2 × 2
## Attrition_Flag n
## <chr> <int>
## 1 Attrited Customer 271
## 2 Existing Customer 1519
clients_database2%>%filter(Income_Category=="$60K - $80K")%>%count(Attrition_Flag)
## # A tibble: 2 × 2
## Attrition_Flag n
## <chr> <int>
## 1 Attrited Customer 189
## 2 Existing Customer 1213
clients_database2%>%filter(Income_Category=="$80K - $120K")%>%count(Attrition_Flag)
## # A tibble: 2 × 2
## Attrition_Flag n
## <chr> <int>
## 1 Attrited Customer 242
## 2 Existing Customer 1293
clients_database2%>%filter(Income_Category=="$120K +")%>%count(Attrition_Flag)
## # A tibble: 2 × 2
## Attrition_Flag n
## <chr> <int>
## 1 Attrited Customer 126
## 2 Existing Customer 601
clients_database2%>%filter(Income_Category=="Unknown")%>%count(Attrition_Flag)
## # A tibble: 2 × 2
## Attrition_Flag n
## <chr> <int>
## 1 Attrited Customer 187
## 2 Existing Customer 925
clients_database2%>%filter(Income_Category=="Less than $40K")%>%count(Education_Level)
## # A tibble: 7 × 2
## Education_Level n
## <chr> <int>
## 1 College 345
## 2 Doctorate 158
## 3 Graduate 1139
## 4 High School 671
## 5 Post-Graduate 170
## 6 Uneducated 522
## 7 Unknown 556
clients_database2%>%filter(Income_Category=="$40K - $60K")%>%count(Education_Level)
## # A tibble: 7 × 2
## Education_Level n
## <chr> <int>
## 1 College 183
## 2 Doctorate 70
## 3 Graduate 553
## 4 High School 355
## 5 Post-Graduate 111
## 6 Uneducated 249
## 7 Unknown 269
clients_database2%>%filter(Income_Category=="$60K - $80K")%>%count(Education_Level)
## # A tibble: 7 × 2
## Education_Level n
## <chr> <int>
## 1 College 132
## 2 Doctorate 59
## 3 Graduate 422
## 4 High School 307
## 5 Post-Graduate 77
## 6 Uneducated 195
## 7 Unknown 210
clients_database2%>%filter(Income_Category=="$80K - $120K")%>%count(Education_Level)
## # A tibble: 7 × 2
## Education_Level n
## <chr> <int>
## 1 College 175
## 2 Doctorate 57
## 3 Graduate 478
## 4 High School 308
## 5 Post-Graduate 81
## 6 Uneducated 217
## 7 Unknown 219
clients_database2%>%filter(Income_Category=="$120K +")%>%count(Education_Level)
## # A tibble: 7 × 2
## Education_Level n
## <chr> <int>
## 1 College 70
## 2 Doctorate 37
## 3 Graduate 204
## 4 High School 147
## 5 Post-Graduate 30
## 6 Uneducated 119
## 7 Unknown 120
clients_database2%>%filter(Income_Category=="Unknown")%>%count(Education_Level)
## # A tibble: 7 × 2
## Education_Level n
## <chr> <int>
## 1 College 108
## 2 Doctorate 70
## 3 Graduate 332
## 4 High School 225
## 5 Post-Graduate 47
## 6 Uneducated 185
## 7 Unknown 145
clients_database2%>%filter(Income_Category=="Less than $40K")%>%count(Marital_Status)
## # A tibble: 4 × 2
## Marital_Status n
## <chr> <int>
## 1 Divorced 254
## 2 Married 1628
## 3 Single 1429
## 4 Unknown 250
clients_database2%>%filter(Income_Category=="$40K - $60K")%>%count(Marital_Status)
## # A tibble: 4 × 2
## Marital_Status n
## <chr> <int>
## 1 Divorced 138
## 2 Married 816
## 3 Single 704
## 4 Unknown 132
clients_database2%>%filter(Income_Category=="$60K - $80K")%>%count(Marital_Status)
## # A tibble: 4 × 2
## Marital_Status n
## <chr> <int>
## 1 Divorced 108
## 2 Married 661
## 3 Single 531
## 4 Unknown 102
clients_database2%>%filter(Income_Category=="$80K - $120K")%>%count(Marital_Status)
## # A tibble: 4 × 2
## Marital_Status n
## <chr> <int>
## 1 Divorced 103
## 2 Married 735
## 3 Single 561
## 4 Unknown 136
clients_database2%>%filter(Income_Category=="$120K +")%>%count(Marital_Status)
## # A tibble: 4 × 2
## Marital_Status n
## <chr> <int>
## 1 Divorced 52
## 2 Married 354
## 3 Single 274
## 4 Unknown 47
clients_database2%>%filter(Income_Category=="Unknown")%>%count(Marital_Status)
## # A tibble: 4 × 2
## Marital_Status n
## <chr> <int>
## 1 Divorced 93
## 2 Married 493
## 3 Single 444
## 4 Unknown 82
clients_database2%>%filter(Income_Category=="Less than $40K")%>%count(Card_Category)
## # A tibble: 4 × 2
## Card_Category n
## <chr> <int>
## 1 Blue 3403
## 2 Gold 24
## 3 Platinum 4
## 4 Silver 130
clients_database2%>%filter(Income_Category=="$40K - $60K")%>%count(Card_Category)
## # A tibble: 4 × 2
## Card_Category n
## <chr> <int>
## 1 Blue 1675
## 2 Gold 15
## 3 Platinum 1
## 4 Silver 99
clients_database2%>%filter(Income_Category=="$60K - $80K")%>%count(Card_Category)
## # A tibble: 4 × 2
## Card_Category n
## <chr> <int>
## 1 Blue 1273
## 2 Gold 29
## 3 Platinum 4
## 4 Silver 96
clients_database2%>%filter(Income_Category=="$80K - $120K")%>%count(Card_Category)
## # A tibble: 4 × 2
## Card_Category n
## <chr> <int>
## 1 Blue 1395
## 2 Gold 21
## 3 Platinum 2
## 4 Silver 117
clients_database2%>%filter(Income_Category=="$120K +")%>%count(Card_Category)
## # A tibble: 4 × 2
## Card_Category n
## <chr> <int>
## 1 Blue 645
## 2 Gold 18
## 3 Platinum 4
## 4 Silver 60
clients_database2%>%filter(Income_Category=="Unknown")%>%count(Card_Category)
## # A tibble: 4 × 2
## Card_Category n
## <chr> <int>
## 1 Blue 1045
## 2 Gold 9
## 3 Platinum 5
## 4 Silver 53
Таким образом, можно сделать определенные выводы по каждому из пунктов проделанной работы:
1.1 Структура матрицы с данными состоит из 21 переменной, 10127 наблюдений. 6 переменных- числовые, остальные 15- категориальные. Категориальные данные для дальнейшего удобства анализа была преобразованы в числовые.
1.1 В данных отсутствовали какие-либо пропущенные значения переменных (NA), а также повторяющиеся наблюдения.
1.2 Были проанализированы выбросы в переменных датасета. Так, с помощью боксплотов можно заметить различные результаты. В некоторых переменных, таких как: “Credit_Limit”, “Avg_Open_To_Buy”, “Total_Trans_Amt”, “Total_Ct_Chng_Q4_Q1”, можно обнаружить большое количество выбросов, что выглядит как плотная линия, состоящая из множества точек-выбросов. В другие же, как “Customer_Age” и “Total_Trans_Ct” обнаруживается меньшее количество выбросов, изображенных в виде точек. И наконец, присутствуют переменные без выбросов, как “Total_Revolving_Bal” и “Avg_Utilization_Ratio”.
2.1 В данном пункте была использована описательная статистика для всех переменных. Так были рассмотрены: количество наблюдений, среднее, усеченное среднее, среднеквадратично отклонение, среднее абсолютное отклонение, медиана, min и max, стандартная ошибка, размах, ассиметрия и эксцесс.
3.1 Были построены и рассмотрены гистограммы некоторых наблюдений. На гистограммах, приведенных выше, можно заметить абсолютно разные распределения. Так, например,“Total_Ct_Chng_Q4_Q1”, предположительно, соответствует нормальному распределению. Гистограмма “Customer_Age” также напоминает вид нормального распределения, но тем же временем имеет некоторые сходства с гребенчатым. “Credit_Limit”, возможно, можно отнести к усеченному виду распределения, в то время как гистограмма “Avg_Open_To_Buy”, похожая на “Credit_Limit”, скорее всего, относится к усеченному распределению. Остальные гистограммы можно отнести к распределению типа плато, с пиком на краю и т.д.
3.2 Также, для проверки на нормальность распределения данных, были построены графики типа QQ-plot. Так, наложив линию тренда нормального распределения, можно заметить, что абсолютно все точки наблюдений, предположительно, не соответствуют нормальному распределению. Отдаленно, нормальное распределение напоминает переменная “Customer_Age”, хотя на хвостах по обе сторны имеются отелонения от прямой линии. Аналогично и “Total_Ct_Chng_Q4_Q1”: с самого начала наблюдения соответствуют нормальному распределению, а в хвосте- очевидное отклонение. Остальные же переменные абсолютно не соответствуют нормальному распределению.
3.3 И, наконец, мы провели тест Калмогорова-Смирнова, где H0 соответствует нормальному распределению, H1- ненормальному. По данным теста, в котором p-value всех переменных < 0.05, то можно сделать вывод, что все данные не сооветствуют нормальному распределению.
4.1 На основе корреляционного теста и построенной выше корреляционной матрицы можно проследить степень взаимосвязи или же тесноты между всеми переменными. Вместо категориальных переменных были использованы их числовые значения, которые начинаются с 0. Альтернативой может быть замена категориальных переменных на dummies (фиктивные переменные). Так, рассмотрев визуальный вариант в виде матрицы,значения на главной диагонали который равны 1. Можно увидеть следующее:
1) Между "Credit_Limit" и "Avg_Open_To_Buy" присутствует высокая степень
положительной корреляции (связь между кредитным лимитом и средней суммы
денег для покупок) и равня 1.
2) Высокая степень положительной взаимосвязи, равная 0.81, сущетсвует
между "Total_Trans_Amt" и "Total_Trans_Ct" (Сумма транзакций за 12 мес.
и общая сумма транзакций).
3) Присутсвует нормальная положительная взаимосвязь
"Avg_Utilization_Ratio" (Среднее использование карты (потраченные/
доступные деньги)) и "Total_Revolving_Bal" (Невыплаченная сумма кредита)
(0,62) и нормальная отрицательная взаимосвязь "Avg_Utilization_Ratio" и
"Avg_Open_To_Buy" (средняя сумма денег для покупок) (-0.54).
4) Также можно отметить нормальную отрицательную связь между полом
клиента и категорией дохода ("Gender" и "Income_Category"), равную -0.54
и относительно высокую положительную связь между периодом обслуживания
клиентов и возрастом клиентов ("Months_On_Book" и "Customer_Age), равную
0.79.
5) Все остальные степени связи между переменными слабо значимы либо же -
вообще незначимы.
5.1 В данном анализе была проведена кластеризация и выделены группы наблюдений переменных с похожими чертами. Для начала нужно провести масштабирование (scale), чтобы все переменные имели среднее значение 0 и стандартное отклонение 1 для последующего применения K-means clustering. Затем проводится определение оптимального количества класетров. В научной литературе существует несколько способов сделать это. Самые известные: метод “локтя” и метод “силуэта”. Также данные методы являются очень популярными в среде “R”. Так, было определено оптимального количества посредством именно метода “силуэта”. На графике, приведенном выше, можно заметить, что оптимальное количество равно двум.
5.2 На данном этапе была проведена, непосредственно, сама кластеризация методом k-средних (k-means), который является наиболее популярных методов. Так, на графике кластеров можно заметить 2 кластера, синий и красный, внутри которых находится большое количество значений и наблюдений. Также есть место пересечения кластеров, значения в котором являются общими для обоих кластеров, т.е. имеется взаимосвязь наблюдений переменных между двумя группами.
5.3 Затем было проведено профилирование кластером, чтобы определить по какому все-таки принципу совокупность значений переменных была разделена на 2 данные группы. Так, были расчитаны средние по двум кластерам, и на основе этого, можно предположить, что они были разделены по “Credit_Limit”, т.е. кредитным лимитам, т.к. между средними двух кластеров по данной переменной наблюдается наибольшее различие: 23488.303 и 4663.197.
5.4 На графиках распределения значений перемнных для каждого
кластера, можно заметить, что значения
некоторых переменных обоих кластеров, к примеру, возраста клиентов и
сумм невыплаченных кредитов полностью совпадают (значения кластера 1
находится внутри значений кластера 2). В то же время, значения доступных
денег к покупкам и кредитных лимитов (предположительно по ним произошло
деление по кластерам) лишь частично пересекаются и имеют общее
распределение.
5.5 Также на основе данных кластеров, можно построить модель
регрессии, например линейной. Но т.к. в данном анализе нет цели ее
проведения, например, для прогнозирования регрессантов, были построены
пробные модели, которые служат лишь примером. Так, были взяты следующие
переменные: зависимые из 1 и 2 кластеров - “Credit_Limit”, независимые-
“Avg_Open_To_Buy”, “Avg_Utilization_Ratio”, “Customer_Age”. Также в
моделе можно использовать и категориальные переменные, преобразовав их в
dummy. Данные переменные были взяты по причине высокой степени
взаимосвязи регрессоров с регрессантом. p-value коэффициентов переменных
< 0.05, что означает, что переменные статистически значимы.
Аналогична и F-statistica, p-value которой меньше 0.05, что означает,
что уравнение, в целом, значимо.
Множественные коэффициенты детерминации близки к 1, что присутствует
сильная линейная зависимость. Значения коэффициентов VIF находятся
близко 1, и, скорее всего, мультиколлинеарность отстутствует между
регрессорами. Несмотря на высокий коэффициент множественной
детерминации, RESET-тест с p-value < 0.05 показывает, что
спецификация модели является неправильной. Таким образом, изменив
спецификацию данной модели или использовав другие переменные, можно
найти оценки прогнозных значений регрессанта.
6.1 Так, расмотрев графики одиночных категориальных переменных, можно сделать следующие выводы:
1) На первом графике заметно, что большинство клиентов являются
актуальными клиентами, которых в данный обслуживает банк, таковых -
8500. Ушедших - 1627.
2) Относительно пола, клиенты мужского и женского - практически равны,
тем не менее, клиенты жеского пола превалируют над мужчинами. Так, всего
в банке за все время обслуживалось 5358 женщин и 4769 мужчин.
3) По уровню образования доминирует группа- "выпускники" (3128). Затем
идут те, кто закончил среднюю школу (2013). Необразованные и клиенты c
неопределенным уровнем обраования практически равны (1487 и 1519).
Наименьшее число клиентов- со степенями докторов наук. Таковых - всего
лишь 451 клиент.
4) Большинство клиентов получает годовой уровень дохода ниже чем $40 тыс.
(3561 клиент). За ними по убыванию следуют клиенты, получающие $40-60
тыс. Таковых- 1790. Клиенты, получающие $60-80 тыс. и $80-120 тыс.
практически равны (1402 и 1535). И меньше всего клиентов с доходом
$120 тыс. (727 человек).
5) Клиентов, находящихся в браке, за все время было больше других групп
(4687). Меньше всего лиентов, которые разведены (748), правда, их на 1
человека меньше, чем клиентов с неизвестным статусом брака.
6) Большинство клиентов банка, которые когда-либо обслуживавшиеся в нем,
были держателями обычных синих карт. Таковых- 9436 человек. И наименьшая
группа- владельцы платиновых карт - 20 человек.
6.2 Также стоит рассмотреть графики с совместными категориальными переменными. Так прослеживаются следующие тенденции:
1) Как видно на первом графике (текущий статус обслуживания относительно
пола), количество женщин и мужчин среди ушедших и актуальных клиентов
приблизительно равно. Ушедшие клиенты: 930(Ж) и 697(М); актуальные
клиенты: 4428 (Ж) и 4072 (М)
2) Женщины и мужчины имеют практически одинаковый уровень
образования. Колледж: 532(Ж) и 481(М); Докторская степень: 257(Ж) и
194(М); бакалавры: 1670(Ж) и 1458(М); старшая школа: 1028(Ж) и 985(М);
кандидаты аук: 263(Ж) и 253(М); необразованные: 796(Ж) и 691(М);
неизвестно: 812(Ж) и 707(М). Тем не менее, женщины лидируют ввиду того,
что кол-во клиентов женского пола больше, чем мужского (5358 женщин и
4769 мужчин).
3) Относительно возраста, клиенты мужского и женского пола также
практически равны друг с другом. Так, самый распространенный возраст
среди клиентов-женщин - 44 года (277 человек), среди клиентов-мужчин -
46 лет (249 человек). Средний возраст женщин - 46.5; мужчин - 46.2.
4) Брачный статус и категории кредитных карт, используемых обеими
группами соответствует тенденции прошлых выводов. Так, самая
распространенная категория по статусу брака - "женат(а): 2451(Ж) и
2236(М);самая малочисленная категория у женской группы - "неизвестный
статус" - 380 человек; у мужчин - "разведены" - 346 человек. Относительно
категорий кредитных карт: самая многочисленная категория "синия" -
5101(Ж) и 4335(М); самая малочисленная категория "платиновая" - 9(Ж) и
11(М).
5) Главные отличия можно увидеть на 5 графике. Так, в женской группе
полностью отстуствуют клиенты, получающие "$60K - $80K", "$80K - $120K"
и "$120K +". Самая многочисленная категория в данной группе -
"Less than $40K" - 3284 человека. Число людей из группы, подпадающих
под категории "$40K - $60K" и "Unknown" - практически одинаково (1014 и
1060 - соответственно). Мужская же группа, подпадает под все категории.
Самая многочисленная - "$80K - $120K" (1535 человек); самая
малочисленная - "Unknown" (52 человека).
6) Во 2 таблице графиков, сгруппированной по уровню доходов, можно
заметить, что клиенты со степенями докторов наук и кандидатов имеют
самый низкий показатель в категории доходов в абсолютных показателях
"ниже $40 тыс." (158 и 170 человек - соответственно). Самая
многочисленная группа, имеющая доход "$120K +" в абсолютных показателях -
бакалавры (204).
7) Касаемо статуса брака и уровня доходов, нужно отметить, что
большинство клиентов, состоящие во всех категориях брака имеют доход -
"Less than $40K": 254 - в разводе, 1628 - в браке, 1429 - холосты и
250 - со статусом "неизвестно". Наименьшее число клиентов по всем
категориям брака получают "$120K +": 52 - в разводе, 354 - в браке,
274 - холосты и 47 - со статусом "неизвестно".
8) На последнем графике едва ли существует между уровнем доходов
клиентов и категориями кредитных карт. Так, 4 платиновые карты имеют
группы "$120K +", "$60K - $80K", "Less than $40K", 1 платиновая карта -
в группе "$40K - $60K", 2 - в "$80K - $120K" и 5 - в "Unknown".
Аналонгичная тенденция прослеживается с серебрянными и золотыми картами.