Performance

PTI

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

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

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

Overall PTI Interval Bad Rate

Overall PTI Cumulative Bad Rate

800+ PTI Bad Rate

800+ PTI Cumulative Bad Rate

740-799 PTI Bad Rate

740-799 PTI Cumulative Bad Rate

700-739 PTI Bad Rate

700-739 PTI Cumulative Bad Rate

675-699 PTI Bad Rate

675-699 PTI Cumulative Bad Rate

650-675 PTI Bad Rate

650-675 PTI Cumulative Bad Rate

Funded Indirect Data

## # A tibble: 2 x 4
##   Vehicle.Condition Avg_PTI   min   max
##   <chr>               <dbl> <dbl> <dbl>
## 1 New                  12.4  0.27 223. 
## 2 Used                 10.3  0     86.1

TTD Indirect Data

## # A tibble: 2 x 4
##   Vehicle.Condition Avg_PTI   min   max
##   <chr>               <dbl> <dbl> <dbl>
## 1 New                  13.4     0  429.
## 2 Used                 11.4     0  544.

DTI and PTI Percentiles

DTI Cumulative Application Population

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)