PTI by Twentile
cbind(
t1 %>%
group_by(pti_bin) %>%
summarise(min = round(min(pti)*100,2),
max = round(max(pti)*100,2)
)
,t2
)
## pti_bin min max 0 1 BR
## 1 1 0.00 1.51 3925 26 0.6580613
## 2 2 1.51 2.06 3925 26 0.6580613
## 3 3 2.06 2.51 3928 23 0.5821311
## 4 4 2.51 2.91 3917 34 0.8605416
## 5 5 2.91 3.30 3911 40 1.0124019
## 6 6 3.30 3.70 3922 29 0.7339914
## 7 7 3.70 4.11 3919 32 0.8099215
## 8 8 4.11 4.53 3904 47 1.1895723
## 9 9 4.53 4.98 3904 46 1.1645570
## 10 10 4.98 5.46 3897 53 1.3417722
## 11 11 5.46 5.97 3892 58 1.4683544
## 12 12 5.97 6.56 3890 60 1.5189873
## 13 13 6.56 7.20 3893 57 1.4430380
## 14 14 7.20 7.95 3867 83 2.1012658
## 15 15 7.95 8.82 3848 102 2.5822785
## 16 16 8.82 9.92 3860 90 2.2784810
## 17 17 9.92 11.36 3842 108 2.7341772
## 18 18 11.36 13.40 3843 107 2.7088608
## 19 19 13.40 17.09 3824 126 3.1898734
## 20 20 17.09 Inf 3809 141 3.5696203
#
# kable(
# t1 %>%
# group_by(pti_bin) %>%
# summarise(min = round(min(pti)*100,2),
# max = round(max(pti)*100,2)
# )
# ) %>%
# kable_styling(fixed_thead = T, full_width = T)
# kable(
# cbind(
# t1 %>%
# group_by(pti_bin) %>%
# summarise(min = round(min(pti)*100,2),
# max = round(max(pti)*100,2)
# )
# ,t2
# )
# ) %>%
# kable_styling(fixed_thead = T, full_width = T)
DTI By Twentile
cbind(
t1 %>%
group_by(DTI_bin) %>%
summarise(min = round(min(debt_ratio),2),
max = round(max(debt_ratio),2)
)
,t3
)
## DTI_bin min max 0 1 BR
## 1 1 0.00 8.54 3897 54 1.366743
## 2 2 8.54 12.69 3892 59 1.493293
## 3 3 12.69 15.67 3870 81 2.050114
## 4 4 15.67 18.14 3874 77 1.948874
## 5 5 18.14 20.29 3867 84 2.126044
## 6 6 20.29 22.24 3884 67 1.695773
## 7 7 22.24 24.12 3892 59 1.493293
## 8 8 24.12 25.96 3895 56 1.417363
## 9 9 25.97 27.79 3885 65 1.645570
## 10 10 27.79 29.58 3875 75 1.898734
## 11 11 29.58 31.43 3875 75 1.898734
## 12 12 31.43 33.33 3885 65 1.645570
## 13 13 33.34 35.38 3891 59 1.493671
## 14 14 35.38 37.66 3870 80 2.025316
## 15 15 37.66 40.11 3896 54 1.367089
## 16 16 40.11 42.85 3894 56 1.417722
## 17 17 42.85 46.12 3884 66 1.670886
## 18 18 46.12 50.22 3894 56 1.417722
## 19 19 50.22 59.28 3898 52 1.316456
## 20 20 59.29 922.14 3902 48 1.215190
# kable(
# t1 %>%
# group_by(DTI_bin) %>%
# summarise(min = round(min(debt_ratio),2),
# max = round(max(debt_ratio),2)
# )
# ) %>%
# kable_styling(fixed_thead = T, full_width = T)
Discretionary Income By Twentile
cbind(
t1 %>%
group_by(DI_bin) %>%
summarise(min = round(min(discr_income),0),
max = round(max(discr_income),0)
)
,t10
)
## DI_bin min max 0 1 BR
## 1 1 -168720 -247 3899 52 1.316123
## 2 2 -247 106 3881 70 1.771703
## 3 3 106 326 3868 83 2.100734
## 4 4 327 519 3876 75 1.898254
## 5 5 519 714 3872 79 1.999494
## 6 6 714 904 3889 62 1.569223
## 7 7 904 1103 3893 58 1.467983
## 8 8 1103 1317 3884 67 1.695773
## 9 9 1317 1537 3893 57 1.443038
## 10 10 1537 1778 3873 77 1.949367
## 11 11 1778 2045 3878 72 1.822785
## 12 12 2046 2356 3884 66 1.670886
## 13 13 2356 2690 3879 71 1.797468
## 14 14 2691 3101 3879 71 1.797468
## 15 15 3101 3608 3887 63 1.594937
## 16 16 3608 4252 3887 63 1.594937
## 17 17 4252 5180 3901 49 1.240506
## 18 18 5181 6708 3886 64 1.620253
## 19 19 6708 10598 3903 47 1.189873
## 20 20 10600 681428 3908 42 1.063291
# kable(
# t1 %>%
# group_by(DI_bin) %>%
# summarise(min = round(min(discr_income),0),
# max = round(max(discr_income),0)
# )
# ) %>%
# kable_styling(fixed_thead = T, full_width = T)
PTI Interval Bad Rate by FICO
pti_fico <- as.data.frame(cbind(rownames(t5), as.numeric(t5$BR), as.numeric(t6$BR), as.numeric(t7$BR), as.numeric(t8$BR), as.numeric(t9$BR)))
colnames(pti_fico) = c("PTI", "800+","740-799","700-739","675-699","650-674")
# pti_fico$`650-674` <- NULL
# library(reshape2)
#
# pti_fico_2 <- melt(pti_fico, id="PTI")
#
# ggplot(data=pti_fico_2,
# aes(x=PTI, y=as.numeric(value), colour=variable, group =1)) +
# # scale_y_continuous(breaks = round(0, 25, by = 1),1)) +
# geom_line()
ggplot(pti_fico, aes(PTI, group =1)) +
geom_line(aes(y = as.numeric(as.character(`800+`)), color = "800+")) +
geom_line(aes(y = as.numeric(as.character(`740-799`)), color = "740-799")) +
geom_line(aes(y = as.numeric(as.character(`700-739`)), color = "700-739")) +
geom_line(aes(y = as.numeric(as.character(`675-699`)), color = "675-699")) +
geom_line(aes(y = as.numeric(as.character(`650-674`)), color = "650-674")) +
theme_bw() +
theme(axis.text.x = element_text(angle = 20, hjust = 1), legend.title=element_blank()) +
coord_cartesian(ylim = c(0, 13)) +
ggtitle("PTI Interval Bad Rate by FICO Band") +
labs(subtitle = "Population: 2017 - Jan 2018 Funded Direct Auto", caption = "Bad Definition: 90+ Over MOB 24") +
ylab("Bad Rate") +
xlab("Payment to Income (%)")

ggplot(data=pti_fico, aes(x=PTI, y=as.numeric(as.character(`800+`)), group=1)) +
geom_line(color="blue")+
geom_point() +
ggtitle("FICO 800+ Combined PTI Interval Bad Rate") +
labs(subtitle = "Population: 2017 - Jan 2018 Funded Direct Auto", caption = "Bad Definition: 90+ Over MOB 24") +
ylab("# Acct % Bad") +
xlab("Payment to Income") +
geom_text(aes(label= round(as.numeric(as.character(`800+`)), 2), vjust = -1.5))

ggplot(data=pti_fico, aes(x=PTI, y=as.numeric(as.character(`740-799`)), group=1)) +
geom_line(color="green")+
geom_point() +
ggtitle("FICO 740-799 Combined PTI Interval Bad Rate") +
labs(subtitle = "Population: 2017 - Jan 2018 Funded Direct Auto", caption = "Bad Definition: 90+ Over MOB 24") +
ylab("# Acct % Bad") +
xlab("Payment to Income") +
geom_text(aes(label= round(as.numeric(as.character(`740-799`)), 2), vjust = -1.5))

ggplot(data=pti_fico, aes(x=PTI, y=as.numeric(as.character(`700-739`)), group=1)) +
geom_line(color="red")+
geom_point() +
ggtitle("FICO 700-739 Combined PTI Interval Bad Rate") +
labs(subtitle = "Population: 2017 - Jan 2018 Funded Direct Auto", caption = "Bad Definition: 90+ Over MOB 24") +
ylab("# Acct % Bad") +
xlab("Payment to Income") +
geom_text(aes(label= round(as.numeric(as.character(`700-739`)), 2), vjust = -1.5))

ggplot(data=pti_fico, aes(x=PTI, y=as.numeric(as.character(`675-699`)), group=1)) +
geom_line(color="purple")+
geom_point() +
ggtitle("FICO 675-699 Combined PTI Interval Bad Rate") +
labs(subtitle = "Population: 2017 - Jan 2018 Funded Direct Auto", caption = "Bad Definition: 90+ Over MOB 24") +
ylab("# Acct % Bad") +
xlab("Payment to Income") +
coord_cartesian(ylim = c(0, 15)) +
geom_text(aes(label= round(as.numeric(as.character(`675-699`)), 2), vjust = -1.5))

ggplot(data=pti_fico, aes(x=PTI, y=as.numeric(as.character(`650-674`)), group=1)) +
geom_line(color="gray")+
geom_point() +
ggtitle("FICO 650-674 Combined PTI Interval Bad Rate") +
labs(subtitle = "Population: 2017 - Jan 2018 Funded Direct Auto", caption = "Bad Definition: 90+ Over MOB 24") +
ylab("# Acct % Bad") +
xlab("Payment to Income") +
coord_cartesian(ylim = c(0, 35)) +
geom_text(aes(label= round(as.numeric(as.character(`650-674`)), 2), vjust = -1.5))

Funded PTI to DTI Swapset
t1$pti_policy <- ifelse(t1$pti >= 0.20, "20+",
ifelse(t1$pti >=0.15, "15-19.99",
ifelse(t1$pti>=0, "0-14.99", "NA")))
t1$dti_policy <- ifelse(t1$debt_ratio>56.1, "GT 56.1",
ifelse(t1$debt_ratio>51, "gt51",
ifelse(t1$debt_ratio>=0, "0-51", "NA")))
table(t1$pti_policy, t1$dti_policy, t1$bad90)
## , , = 0
##
##
## 0-51 GT 56.1 gt51
## 0-14.99 66222 3722 2065
## 15-19.99 2759 534 188
## 20+ 1511 612 107
##
## , , = 1
##
##
## 0-51 GT 56.1 gt51
## 0-14.99 1021 36 24
## 15-19.99 116 10 5
## 20+ 61 13 2
PTI Cumulative Application Population

ggplot(data=pti_pop_dir, aes(x=as.numeric(pti_r), y=Cum_Apps, group=1)) +
geom_line()+
geom_point()+
# geom_vline(xintercept = 20)+
# geom_vline(xintercept = 15)+
# geom_hline(yintercept=90.925232)+
# geom_hline(yintercept=84.129020)+
scale_x_continuous(breaks = round(seq(min(pti_pop$pti_r), max(pti_pop$pti_r), by = 5),1)) +
scale_y_continuous(breaks = round(seq(min(pti_pop$Cum_Apps), max(pti_pop$Cum_Apps), by = 5),1)) +
ggtitle("PTI Cumulative Application Population") +
ylab("Cum % of Apps") +
xlab("PTI")
## Warning: Removed 1 rows containing missing values (geom_path).
## Warning: Removed 1 rows containing missing values (geom_point).

# geom_text(aes(label= round(Cum_Apps, 0), vjust = 1.5))
# geom_text_repel(aes(label= round(Cum_Apps, 0)),
# box.padding = unit(0.1, "lines"), force = 2,
# segment.color = NA)