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>
Структура матрицы с данными состоит из 21 переменной, 10127 наблюдений. 6 переменных- категориальные, остальные 15 - числовые.
sum(is.na(clients_database1))
## [1] 0
sum(duplicated(clients_database1)==TRUE)
## [1] 0
В данных отсутствовали какие-либо пропущенные значения переменных (NA), а также повторяющиеся наблюдения.
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)
Были проанализированы выбросы в переменных датасета. Так, с помощью боксплотов можно заметить различные результаты. В некоторых переменных, таких как: “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”.
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
В данном пункте была использована описательная статистика для всех переменных. Так были рассмотрены: количество наблюдений, среднее, усеченное среднее, среднеквадратично отклонение, среднее абсолютное отклонение, медиана, min и max, стандартная ошибка, размах, ассиметрия и эксцесс.
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)
Были построены и рассмотрены гистограммы некоторых наблюдений. На гистограммах, приведенных выше, можно заметить абсолютно разные распределения. Так, например,“Total_Ct_Chng_Q4_Q1”, предположительно, соответствует нормальному распределению. Гистограмма “Customer_Age” также напоминает вид нормального распределения, но тем же временем имеет некоторые сходства с гребенчатым. “Credit_Limit”, возможно, можно отнести к усеченному виду распределения, в то время как гистограмма “Avg_Open_To_Buy”, похожая на “Credit_Limit”, скорее всего, относится к усеченному распределению. Остальные гистограммы можно отнести к распределению типа плато, с пиком на краю и т.д.
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)
Также, для проверки на нормальность распределения данных, были построены графики типа QQ-plot. Так, наложив линию тренда нормального распределения, можно заметить, что абсолютно все точки наблюдений, предположительно, не соответствуют нормальному распределению. Отдаленно, нормальное распределение напоминает переменная “Customer_Age”, хотя на хвостах по обе сторны имеются отелонения от прямой линии. Аналогично и “Total_Ct_Chng_Q4_Q1”: с самого начала наблюдения соответствуют нормальному распределению, а в хвосте- очевидное отклонение. Остальные же переменные абсолютно не соответствуют нормальному распределению.
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
И, наконец, мы провели тест Калмогорова-Смирнова, где H0 соответствует нормальному распределению, H1- ненормальному. По данным теста, в котором p-value всех переменных < 0.05, то можно сделать вывод, что все данные не сооветствуют нормальному распределению.
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)
На основе корреляционного теста и построенной выше корреляционной матрицы можно проследить степень взаимосвязи или же тесноты между всеми переменными. Вместо категориальных переменных были использованы их числовые значения, которые начинаются с 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) Все остальные степени связи между переменными слабо значимы либо же -
вообще незначимы.
library(factoextra)
library(cluster)
client_database3 = subset(clients_database1, select = - c(CLIENTNUM))
fviz_nbclust(client_database3 ,FUNcluster = kmeans,method = "silhouette") +
ggtitle("Оптимальное кол-во кластеров") +
xlab("Количество кластеров (k)") +
ylab("Cредняя ширина силуэта")
В данном анализе была проведена кластеризация и выделены группы наблюдений переменных с похожими чертами. Для начала нужно провести масштабирование (scale), чтобы все переменные имели среднее значение 0 и стандартное отклонение 1 для последующего применения K-means clustering. Затем проводится определение оптимального количества класетров. В научной литературе существует несколько способовсделать это. Самые известные: метод “локтя” и метод “силуэта”. Также данные методы являются очень популярными в среде “R”. Так, было определено оптимальное количество посредством именно метода “силуэта”. На графике, приведенном выше, можно заметить, что оптимальное количество равно двум.
set.seed(123)
kmeans_result <- kmeans(client_database3, centers = 2)
clients_database1$cluster <- kmeans_result$cluster
fviz_cluster(kmeans_result, data = client_database3, 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 ))
На данном этапе была проведена, непосредственно, сама кластеризация методом k-средних (k-means), который является наиболее популярных методов. Так, на графике кластеров можно заметить 2 кластера, синий и красный, внутри которых находится большое количество значений и наблюдений. Также есть место пересечения кластеров, значения в котором являются общими для обоих кластеров, т.е. имеется взаимосвязь наблюдений переменных между двумя группами. Скорее всего, данные точки на персечении кластеров - категориальные переменные, т.е.: “Attrition_Flag”, “Gender”, “Education_Level”, “Income_Category”, “Marital_Status” и “Card_Category”.
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.3 2.52 36.0
## 2 2 46.3 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>
Затем было проведено профилирование кластеров, чтобы определить по какому все-таки принципу совокупность значений переменных была разделена на 2 данные группы. Так, были расчитаны средние по двум кластерам, и на основе этого, можно предположить, что они были разделены по “Credit_Limit”, т.е. кредитным лимитам, т.к. между средними двух кластеров по данной переменной наблюдается наибольшее различие: 23488.303 и 4663.197.
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)
На графиках распределения значений перемнных для каждого кластера,
можно заметить, что значения
некоторых переменных обоих кластеров, к примеру, возраста клиентов и
сумм невыплаченных кредитов полностью совпадают (значения кластера 1
находится внутри значений кластера 2). В то же время, значения доступных
денег к покупкам и кредитных лимитов (предположительно по ним произошло
деление по кластерам) лишь частично пересекаются и имеют общее
распределение.
clients_database4 = subset(clients_database1, select = - c(CLIENTNUM))
models <- list()
summaries <- list()
for (i in unique(clients_database4$cluster)){
cluster_data <- clients_database4[clients_database4$cluster == i, ]
intercept_only <- lm(Credit_Limit ~ 1, data=cluster_data)
all <- lm(Credit_Limit ~ ., data=cluster_data)
model <- step(intercept_only, direction='forward', scope= formula (all), trace=0)
models[[i]] <- model
summaries[[i]] <- summary(model)
}
summaries[[1]]
##
## Call:
## lm(formula = Credit_Limit ~ Avg_Open_To_Buy + Total_Revolving_Bal +
## Total_Amt_Chng_Q4_Q1 + Total_Ct_Chng_Q4_Q1 + Total_Relationship_Count +
## Months_on_book + Dependent_count, data = cluster_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.480e-11 -1.000e-11 -8.000e-13 7.300e-12 3.589e-09
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.108e-11 1.753e-11 6.320e-01 0.5276
## Avg_Open_To_Buy 1.000e+00 2.979e-16 3.357e+15 < 2e-16 ***
## Total_Revolving_Bal 1.000e+00 2.571e-15 3.889e+14 < 2e-16 ***
## Total_Amt_Chng_Q4_Q1 6.665e-11 1.006e-11 6.622e+00 4.68e-11 ***
## Total_Ct_Chng_Q4_Q1 -2.224e-11 9.710e-12 -2.290e+00 0.0221 *
## Total_Relationship_Count 2.270e-12 1.301e-12 1.744e+00 0.0813 .
## Months_on_book 5.300e-13 2.942e-13 1.801e+00 0.0718 .
## Dependent_count 2.416e-12 1.660e-12 1.456e+00 0.1457
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.679e-11 on 1759 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: 1
## F-statistic: 1.646e+30 on 7 and 1759 DF, p-value: < 2.2e-16
summaries[[2]]
##
## Call:
## lm(formula = Credit_Limit ~ Avg_Open_To_Buy + Total_Revolving_Bal +
## Total_Ct_Chng_Q4_Q1 + Total_Trans_Ct, data = cluster_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.674e-10 -2.400e-12 0.000e+00 2.000e-12 3.686e-09
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.730e-12 2.108e-12 2.718e+00 0.00658 **
## Avg_Open_To_Buy 1.000e+00 1.394e-16 7.174e+15 < 2e-16 ***
## Total_Revolving_Bal 1.000e+00 6.071e-16 1.647e+15 < 2e-16 ***
## Total_Ct_Chng_Q4_Q1 1.750e-11 2.060e-12 8.494e+00 < 2e-16 ***
## Total_Trans_Ct -5.144e-14 2.175e-14 -2.365e+00 0.01805 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.466e-11 on 8355 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: 1
## F-statistic: 1.297e+31 on 4 and 8355 DF, p-value: < 2.2e-16
models[[1]]$anova
## Step Df Deviance Resid. Df Resid. Dev AIC
## 1 NA NA 1766 8.681352e+10 31295.55
## 2 + Avg_Open_To_Buy -1 8.566528e+10 1765 1.148233e+09 23654.33
## 3 + Total_Revolving_Bal -1 1.148233e+09 1764 1.362807e-17 -81826.31
## 4 + Total_Amt_Chng_Q4_Q1 -1 2.775166e-19 1763 1.335055e-17 -81860.67
## 5 + Total_Ct_Chng_Q4_Q1 -1 3.782020e-20 1762 1.331273e-17 -81863.68
## 6 + Total_Relationship_Count -1 2.516062e-20 1761 1.328757e-17 -81865.02
## 7 + Months_on_book -1 2.094875e-20 1760 1.326662e-17 -81865.81
## 8 + Dependent_count -1 1.596009e-20 1759 1.325066e-17 -81865.94
models[[2]]$anova
## Step Df Deviance Resid. Df Resid. Dev AIC
## 1 NA NA 8359 1.035204e+11 136536.0
## 2 + Avg_Open_To_Buy -1 9.805516e+10 8358 5.465243e+09 111948.3
## 3 + Total_Revolving_Bal -1 5.465243e+09 8357 1.681285e-17 -398394.8
## 4 + Total_Ct_Chng_Q4_Q1 -1 1.362035e-19 8356 1.667664e-17 -398460.8
## 5 + Total_Trans_Ct -1 1.115750e-20 8355 1.666548e-17 -398464.4
models[[1]]$coefficients
## (Intercept) Avg_Open_To_Buy Total_Revolving_Bal
## 1.107776e-11 1.000000e+00 1.000000e+00
## Total_Amt_Chng_Q4_Q1 Total_Ct_Chng_Q4_Q1 Total_Relationship_Count
## 6.664730e-11 -2.223541e-11 2.269846e-12
## Months_on_book Dependent_count
## 5.299864e-13 2.415812e-12
models[[2]]$coefficients
## (Intercept) Avg_Open_To_Buy Total_Revolving_Bal Total_Ct_Chng_Q4_Q1
## 5.729537e-12 1.000000e+00 1.000000e+00 1.749931e-11
## Total_Trans_Ct
## -5.144460e-14
library(car)
library(lmtest)
vif(models[[1]])
## Avg_Open_To_Buy Total_Revolving_Bal Total_Amt_Chng_Q4_Q1
## 1.016956 1.008635 1.146168
## Total_Ct_Chng_Q4_Q1 Total_Relationship_Count Months_on_book
## 1.158612 1.019979 1.016647
## Dependent_count
## 1.015563
vif(models[[2]])
## Avg_Open_To_Buy Total_Revolving_Bal Total_Ct_Chng_Q4_Q1 Total_Trans_Ct
## 1.020494 1.030524 1.024497 1.018535
bptest(models[[1]], data = clients_database4)
##
## studentized Breusch-Pagan test
##
## data: models[[1]]
## BP = 45.661, df = 7, p-value = 1.017e-07
bptest(models[[2]], data = clients_database4)
##
## studentized Breusch-Pagan test
##
## data: models[[2]]
## BP = 51.583, df = 4, p-value = 1.686e-10
Также на основе данных кластеров, можно построить модель регрессии, например - линейной. Так, для этой цели был использован метод пошаговой регрессии. Цель пошаговой регрессии состоит в построении регрессионной модели, включающей все переменные-предикторы, которые статистически значимы и связаны с зависимой переменной.Также, стоит отметить, что был применен метод подбора, начиная - с одной константы, заканчивая- набором всех переменных. Т.е. от наименьшего - к большему. Команда “trace=0” скрывает подбор разных вариаций модели, и по итогу отображается только одна - самая наилучшая, оцененная с наименьшим критерием “AIC”. Так, можно заметить, что для первого кластера были выбраны следующие переменные, включая константу: “Avg_Open_To_Buy”, “Total_Revolving_Bal”, “Total_Amt_Chng_Q4_Q1”, “Total_Ct_Chng_Q4_Q1”, “Total_Relationship_Count”, “Months_on_book” и “Dependent_count”. Для второго, включая константу: “Avg_Open_To_Buy”, “Total_Revolving_Bal”, “Total_Ct_Chng_Q4_Q1”, “Total_Trans_Ct”. Все коэффициенты для обоих кластеров указаны выше. P-value всех переменных указывает на то, что они все статистически значимые как в 1 кластере, так и во втором (в R принцип отличается от других статистических программ. Здесь звездочки между различными p-value указывают на диапазон, в котором переменная является значимой, например: *** - [0, 0,001], ** - (0,001, 0,01] и т.п). Аналогично и с F-statistica, p-value которой меньше 0.05, что означает, что уравнение, в целом, значимо. Множественные коэффициенты детерминации равны 1, может и с небольшой погрешностью, и значат, что присутствует сильная линейная зависимость. Значения коэффициентов VIF находятся близко 1, и, скорее всего, мультиколлинеарность между регрессорвами отстутствует. Тест Бреуша-Пагана на гомоскедастичность кластеров указывает на то, что как и в первой, так и во второй модели прсутствует гетероскедастичность (p-value моделей < 0.05). Так данную проблему можно решить с помощью различных методов, как нпример - обобщенный метод МНК. Также, в модель можно добавить dummies, т.е. преобразовать категориальные переменные - в бинарные. Все, конечно, зависит от конкретных поставленных целей.
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
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 человек.
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) Как видно на первом графике первой таблицы (текущий статус
обслуживания относительно пола), количество женщин и мужчин среди
ушедших и актуальных клиентов риблизительно равно. Ушедшие клиенты:
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 человека).
2 таблица графиков и их данные (по уровню доходов):
1) Во 2 таблице графиков, сгруппированной по уровню доходов, можно
заметить, что клиенты со степенями докторов наук и кандидатов имеют
самый низкий показатель в категории доходов в абсолютных показателях
"ниже $40 тыс." (158 и 170 человек - соответственно). Самая
многочисленная группа, имеющая доход "$120K +" в абсолютных показателях -
бакалавры (204).
2) Касаемо статуса брака и уровня доходов, нужно отметить, что
большинство клиентов, состоящие во всех категориях брака имеют доход -
"Less than $40K": 254 - в разводе, 1628 - в браке, 1429 - холосты и
250 - со статусом "неизвестно". Наименьшее число клиентов по всем
категориям брака получают "$120K +": 52 - в разводе, 354 - в браке,
274 - холосты и 47 - со статусом "неизвестно".
3) На последнем графике едва ли существует между уровнем доходов
клиентов и категориями кредитных карт. Так, 4 платиновые карты имеют
группы "$120K +", "$60K - $80K", "Less than $40K", 1 платиновая карта -
в группе "$40K - $60K", 2 - в "$80K - $120K" и 5 - в "Unknown".
Аналонгичная тенденция прослеживается с серебрянными и золотыми картами.