This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

install.packages("readxl")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/sgp13/AppData/Local/R/win-library/4.4’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/readxl_1.4.5.zip'
Content type 'application/zip' length 750468 bytes (732 KB)
downloaded 732 KB
package ‘readxl’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\sgp13\AppData\Local\Temp\RtmpGOw5Qj\downloaded_packages
library(readxl)
Warning: package ‘readxl’ was built under R version 4.4.3
df <- read.csv("loanapp.csv")
df
str(df)
'data.frame':   1988 obs. of  17 variables:
 $ married                : logi  TRUE FALSE TRUE TRUE FALSE FALSE ...
 $ race                   : chr  "white" "white" "white" "white" ...
 $ loan_decision          : chr  "reject" "approve" "approve" "approve" ...
 $ occupancy              : int  1 1 1 1 1 1 1 1 1 1 ...
 $ loan_amount            : int  128 128 66 120 111 141 276 100 267 175 ...
 $ applicant_income       : int  74 84 36 59 63 72 90 72 144 97 ...
 $ num_units              : int  1 1 1 1 1 1 1 1 1 1 ...
 $ num_dependants         : int  1 0 0 0 0 0 0 1 2 0 ...
 $ self_employed          : logi  FALSE FALSE TRUE FALSE FALSE FALSE ...
 $ monthly_income         : int  4583 2666 3000 2583 2208 6000 7500 3234 5417 6292 ...
 $ purchase_price         : num  160 143 110 134 138 ...
 $ liquid_assets          : num  52 37 19 31 169 ...
 $ mortage_payment_history: int  2 2 2 2 2 2 2 2 1 1 ...
 $ consumer_credit_history: int  2 2 6 1 6 1 1 1 1 2 ...
 $ filed_bankruptcy       : logi  FALSE FALSE TRUE FALSE FALSE FALSE ...
 $ property_type          : int  2 2 2 1 2 1 2 2 2 2 ...
 $ gender                 : chr  "male" "male" "male" "male" ...
  1. Generate descriptive statistics for the dataset, and comment on the main trends.
summary(df)
  married            race           loan_decision        occupancy      loan_amount    applicant_income   num_units    
 Mode :logical   Length:1988        Length:1988        Min.   :1.000   Min.   :  2.0   Min.   :  0.00   Min.   :1.000  
 FALSE:677       Class :character   Class :character   1st Qu.:1.000   1st Qu.:100.0   1st Qu.: 48.00   1st Qu.:1.000  
 TRUE :1308      Mode  :character   Mode  :character   Median :1.000   Median :126.0   Median : 64.00   Median :1.000  
 NA's :3                                               Mean   :1.032   Mean   :143.3   Mean   : 84.68   Mean   :1.122  
                                                       3rd Qu.:1.000   3rd Qu.:165.0   3rd Qu.: 88.00   3rd Qu.:1.000  
                                                       Max.   :3.000   Max.   :980.0   Max.   :972.00   Max.   :4.000  
                                                                                                        NA's   :4      
 num_dependants   self_employed   monthly_income  purchase_price   liquid_assets     mortage_payment_history
 Min.   :0.0000   Mode :logical   Min.   :    0   Min.   :  25.0   Min.   :      0   Min.   :1.000          
 1st Qu.:0.0000   FALSE:1731      1st Qu.: 2876   1st Qu.: 129.0   1st Qu.:     20   1st Qu.:1.000          
 Median :0.0000   TRUE :257       Median : 3812   Median : 163.0   Median :     38   Median :2.000          
 Mean   :0.7713                   Mean   : 5195   Mean   : 196.3   Mean   :   4620   Mean   :1.708          
 3rd Qu.:1.0000                   3rd Qu.: 5594   3rd Qu.: 225.0   3rd Qu.:     83   3rd Qu.:2.000          
 Max.   :8.0000                   Max.   :81000   Max.   :1535.0   Max.   :1000000   Max.   :4.000          
 NA's   :3                                                                                                  
 consumer_credit_history filed_bankruptcy property_type      gender         
 Min.   :1.00            Mode :logical    Min.   :1.000   Length:1988       
 1st Qu.:1.00            FALSE:1851       1st Qu.:2.000   Class :character  
 Median :1.00            TRUE :137        Median :2.000   Mode  :character  
 Mean   :2.11                             Mean   :1.861                     
 3rd Qu.:2.00                             3rd Qu.:2.000                     
 Max.   :6.00                             Max.   :3.000                     
                                                                            

The data set is very large with 1988 individuals included. The summary shows that the continuous monetary variables have a huge range and the housing properties have less of a range. The huge ranges affect the mean in many variables such as liquid assets where the median £38,000 is much less than the mean £4,620,000. The large data set is affected by a few outliers with very large incomes and assets. Most of the categorical variables have similar means and medians because they cannot be affected by large outliers.

  1. Check any records with missing values and handle the missing data as appropriate.
df2 <- df[complete.cases(df), ]
df2
summary(df2)
  married            race           loan_decision        occupancy      loan_amount    applicant_income   num_units    
 Mode :logical   Length:1983        Length:1983        Min.   :1.000   Min.   :  2.0   Min.   :  0.00   Min.   :1.000  
 FALSE:677       Class :character   Class :character   1st Qu.:1.000   1st Qu.:100.0   1st Qu.: 48.00   1st Qu.:1.000  
 TRUE :1306      Mode  :character   Mode  :character   Median :1.000   Median :126.0   Median : 64.00   Median :1.000  
                                                       Mean   :1.032   Mean   :143.3   Mean   : 84.73   Mean   :1.122  
                                                       3rd Qu.:1.000   3rd Qu.:165.0   3rd Qu.: 88.00   3rd Qu.:1.000  
                                                       Max.   :3.000   Max.   :980.0   Max.   :972.00   Max.   :4.000  
 num_dependants self_employed   monthly_income  purchase_price   liquid_assets     mortage_payment_history
 Min.   :0.00   Mode :logical   Min.   :    0   Min.   :  25.0   Min.   :      0   Min.   :1.000          
 1st Qu.:0.00   FALSE:1726      1st Qu.: 2876   1st Qu.: 129.4   1st Qu.:     20   1st Qu.:1.000          
 Median :0.00   TRUE :257       Median : 3812   Median : 163.0   Median :     38   Median :2.000          
 Mean   :0.77                   Mean   : 5197   Mean   : 196.4   Mean   :   4632   Mean   :1.707          
 3rd Qu.:1.00                   3rd Qu.: 5595   3rd Qu.: 225.0   3rd Qu.:     83   3rd Qu.:2.000          
 Max.   :8.00                   Max.   :81000   Max.   :1535.0   Max.   :1000000   Max.   :4.000          
 consumer_credit_history filed_bankruptcy property_type      gender         
 Min.   :1.000           Mode :logical    Min.   :1.000   Length:1983       
 1st Qu.:1.000           FALSE:1848       1st Qu.:2.000   Class :character  
 Median :1.000           TRUE :135        Median :2.000   Mode  :character  
 Mean   :2.105                            Mean   :1.861                     
 3rd Qu.:2.000                            3rd Qu.:2.000                     
 Max.   :6.000                            Max.   :3.000                     

The missing values have been resolved by removing all individuals with missing variables. Because of the size of the data set it will not affect the validity of the tests. There are 1983 observations in df2 instead of the 1988 in the original dataframe. The mean applicant income and liquid assets have changed slightly but most of the key statistics are unchanged.

  1. Build graphs visualizing the following and comment on the obtained visual insights A. The distribution of one or more individual continuous variables
hist(df2$applicant_income, bins=100)
Warning in plot.window(xlim, ylim, "", ...) :
  "bins" is not a graphical parameter
Warning in title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...) :
  "bins" is not a graphical parameter
Warning in axis(1, ...) : "bins" is not a graphical parameter
Warning in axis(2, at = yt, ...) : "bins" is not a graphical parameter

The vast majority of applicants have incomes between 0 and £100,000. There are a few bigger incomes over £600,000. This explains why the median 64 is below the mean 84.73.

hist(df2$purchase_price, bins=100)
Warning in plot.window(xlim, ylim, "", ...) :
  "bins" is not a graphical parameter
Warning in title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...) :
  "bins" is not a graphical parameter
Warning in axis(1, ...) : "bins" is not a graphical parameter
Warning in axis(2, at = yt, ...) : "bins" is not a graphical parameter

A similar trend with the over 1000 purchases prices on the lower end between £100,000 and £200,000, but less than 100 over the £500,000 threshold.

3B. The relationship of a pair of continuous variables.

plot(df2$applicant_income, df2$purchase_price,
     xlab = "Applicant Income",
     ylab = "Purchase Price", )

cor(df2$purchase_price, df2$applicant_income)
[1] 0.4503725

The correlation is 0.4503725 which is fairly weak but still positive. A regression model gives an estimate purchase price = £140,309.36 + 0.66258 x applicant income meaning that on the whole the higher the income the higher the purchase price. But the model is not that accurate and the majority of observations are on the lower end of both variables, with some outliers scattered around. The income in particular varies a lot which can affect the mean.

reg1 <- lm(df2$purchase_price ~ df2$applicant_income)
summary(reg1)

Call:
lm(formula = df2$purchase_price ~ df2$applicant_income)

Residuals:
    Min      1Q  Median      3Q     Max 
-495.59  -51.15  -21.81   31.00 1152.91 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)          140.30936    3.58716   39.11   <2e-16 ***
df2$applicant_income   0.66258    0.02951   22.45   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 114.5 on 1981 degrees of freedom
Multiple R-squared:  0.2028,    Adjusted R-squared:  0.2024 
F-statistic: 504.1 on 1 and 1981 DF,  p-value: < 2.2e-16

3C. The association b/w a categorical variable and a continuous one.


install.packages("ggplot2")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/sgp13/AppData/Local/R/win-library/4.4’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/ggplot2_3.5.2.zip'
Content type 'application/zip' length 5017658 bytes (4.8 MB)
downloaded 4.8 MB
package ‘ggplot2’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\sgp13\AppData\Local\Temp\RtmpGOw5Qj\downloaded_packages
library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.4.3
ggplot(df2, aes(x = df2$loan_decision, y = df2$applicant_income)) +
  geom_boxplot()
Warning: Use of `df2$loan_decision` is discouraged.
ℹ Use `loan_decision` instead.
Warning: Use of `df2$applicant_income` is discouraged.
ℹ Use `applicant_income` instead.

Median income for approvals is higher than for rejections. The people who got their loan approved had higher incomes than those who were rejected. There are lots of outliers suggesting because of the size and variation of the dataset a box plot is not the most valid way to present the data.

3D. The relationship between more than two variables, e.g., using semantic mappings.

ggplot(df2, aes(x = applicant_income, y = purchase_price, color = married, shape = loan_decision)) +
  geom_point(size = 4) +
  labs(title = "Income vs Purchase Price by Marital Status and Loan Approval",
       x = "Income",
       y = "Purchase Price")

The graph shows how marriage and loan approval status link to income and purchase price. There are lots of blue circles showing lots if married people got a loan approved. Another observation is that there are mainly circles above a purchase price of 500 suggesting that people buying more expensive homes get approved for loans more. Also couples typically buy the more expensive homes. At the lower end of purchase price there is more of a mix of approvals and rejections.

  1. Display unique values of a categorical variable and their frequencies.



ggplot(df2, aes(x = num_dependants)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = ..count..),vjust = -0.4, colour = "red") + 
  labs(title = "Frequency of Number of Dependents",
       x = "Number of Dependents",
       y = "Count")
Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(count)` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.

The lower end of the number of dependents is much more common and there are only 10 individuals with over 4 dependents, representing 0.504% of the data. This suggests that the parameters for the data collection were too wide and some findings should have been excluded to make the better more representative of the population.

ggplot(df2, aes(x = loan_decision, fill = married)) +
  geom_bar() +
  labs(title = "Frequency of Loan Approval Status",
       x = "Loan Status",
       y = "Count",
       fill = "Married")

There are far more approvals than rejections and most of the approvals were for married people. The marital and loan status only had two categories and created much more reliable data.

  1. Build a contingency table of two potentially related categorical variables. Conduct a statistical test of the independence between them and interpret the results.
test1 <- table(df2$loan_decision, df2$married)
test1
         
          FALSE TRUE
  approve   575 1166
  reject    102  140
chisq.test(test1)

    Pearson's Chi-squared test with Yates' continuity correction

data:  test1
X-squared = 7.4621, df = 1, p-value = 0.006301

The Chi-squared test determines whether or not there is a relationship between marriage and loan decision in the dataset. The null hypothesis that the two variables are independent and the alternative hypothesis is that the two variables are associated. We get a P-Value of 0.006301 which is less than 0.05 so we can reject the null hypothesis at the 5% significance level. There is an association between marriage and loan decision because people who are married are more likely to get a loan.

  1. Retrieve one or more subset of rows based on two or more criteria and present descriptive statistics on the subset(s).
install.packages("dplyr")
Error in install.packages : Updating loaded packages
library(dplyr)
Warning: package ‘dplyr’ was built under R version 4.4.3

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
subset1 <- df2 %>%
  filter(married == "TRUE", loan_decision == "approve", gender == "male", applicant_income > mean(df2$applicant_income))
summary(subset1)
 married            race           loan_decision        occupancy      loan_amount    applicant_income   num_units    
 Mode:logical   Length:358         Length:358         Min.   :1.000   Min.   : 34.0   Min.   : 85.0    Min.   :1.000  
 TRUE:358       Class :character   Class :character   1st Qu.:1.000   1st Qu.:152.0   1st Qu.: 97.0    1st Qu.:1.000  
                Mode  :character   Mode  :character   Median :1.000   Median :188.0   Median :115.0    Median :1.000  
                                                      Mean   :1.047   Mean   :224.4   Mean   :154.4    Mean   :1.064  
                                                      3rd Qu.:1.000   3rd Qu.:264.8   3rd Qu.:151.0    3rd Qu.:1.000  
                                                      Max.   :2.000   Max.   :980.0   Max.   :870.0    Max.   :4.000  
 num_dependants  self_employed   monthly_income  purchase_price   liquid_assets       mortage_payment_history
 Min.   :0.000   Mode :logical   Min.   : 1025   Min.   :  43.0   Min.   :      3.9   Min.   :1.0            
 1st Qu.:0.000   FALSE:278       1st Qu.: 5000   1st Qu.: 210.5   1st Qu.:     38.6   1st Qu.:1.0            
 Median :1.000   TRUE :80        Median : 7500   Median : 285.0   Median :     84.5   Median :1.0            
 Mean   :1.151                   Mean   : 9392   Mean   : 324.1   Mean   :   5758.9   Mean   :1.5            
 3rd Qu.:2.000                   3rd Qu.:10049   3rd Qu.: 364.2   3rd Qu.:    175.5   3rd Qu.:2.0            
 Max.   :7.000                   Max.   :72529   Max.   :1535.0   Max.   :1000000.0   Max.   :4.0            
 consumer_credit_history filed_bankruptcy property_type      gender         
 Min.   :1.000           Mode :logical    Min.   :1.000   Length:358        
 1st Qu.:1.000           FALSE:343        1st Qu.:2.000   Class :character  
 Median :1.000           TRUE :15         Median :2.000   Mode  :character  
 Mean   :1.955                            Mean   :1.905                     
 3rd Qu.:2.000                            3rd Qu.:2.000                     
 Max.   :6.000                            Max.   :3.000                     
subset2 <- df2 %>%
  filter(married == "FALSE", loan_decision == "approve", gender == "male", applicant_income > mean(df2$applicant_income))
summary(subset2)
  married            race           loan_decision        occupancy      loan_amount    applicant_income   num_units    
 Mode :logical   Length:76          Length:76          Min.   :1.000   Min.   : 40.0   Min.   : 85.0    Min.   :1.000  
 FALSE:76        Class :character   Class :character   1st Qu.:1.000   1st Qu.:126.5   1st Qu.: 99.0    1st Qu.:1.000  
                 Mode  :character   Mode  :character   Median :1.000   Median :178.5   Median :114.5    Median :1.000  
                                                       Mean   :1.013   Mean   :182.5   Mean   :160.3    Mean   :1.092  
                                                       3rd Qu.:1.000   3rd Qu.:193.2   3rd Qu.:157.2    3rd Qu.:1.000  
                                                       Max.   :2.000   Max.   :650.0   Max.   :666.0    Max.   :4.000  
 num_dependants   self_employed   monthly_income  purchase_price   liquid_assets     mortage_payment_history
 Min.   :0.0000   Mode :logical   Min.   : 1714   Min.   :  75.0   Min.   :   0.90   Min.   :1.000          
 1st Qu.:0.0000   FALSE:62        1st Qu.: 4154   1st Qu.: 173.8   1st Qu.:  39.92   1st Qu.:1.000          
 Median :0.0000   TRUE :14        Median : 7376   Median : 211.5   Median :  88.00   Median :2.000          
 Mean   :0.2237                   Mean   : 8339   Mean   : 246.9   Mean   : 179.08   Mean   :1.632          
 3rd Qu.:0.0000                   3rd Qu.: 9517   3rd Qu.: 301.0   3rd Qu.: 195.25   3rd Qu.:2.000          
 Max.   :4.0000                   Max.   :29167   Max.   :1050.0   Max.   :2369.00   Max.   :3.000          
 consumer_credit_history filed_bankruptcy property_type      gender         
 Min.   :1.000           Mode :logical    Min.   :1.000   Length:76         
 1st Qu.:1.000           FALSE:73         1st Qu.:1.000   Class :character  
 Median :1.000           TRUE :3          Median :2.000   Mode  :character  
 Mean   :1.803                            Mean   :1.697                     
 3rd Qu.:2.000                            3rd Qu.:2.000                     
 Max.   :6.000                            Max.   :3.000                     

There were more married high earning men who successfully applied for loans. Because of the defined subsets the data is much more evenly distributed. The means are higher than the median for almost all the variables so there are still outliers affecting the averages but the subsets are more reliable than the whole sample. The only variable with an outlier is number of dependents for unmarried men.

  1. Conduct a statistical test of the significance of the difference between the means of two subsets of the data and interpret the results.
married <- (subset1$applicant_income)

single <- (subset2$applicant_income)

t.test(married, single)

    Welch Two Sample t-test

data:  married and single
t = -0.379, df = 106.43, p-value = 0.7054
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -36.71956  24.93317
sample estimates:
mean of x mean of y 
 154.4358  160.3289 

The P-Value was 0.7054 which is much higher than 0.05 which suggests there is no evidence that the means are significantly different. The married male high earners who successfully applied for a loan don’t make significantly less than the non-married male high earners who were also successful.

married2 <- (subset1$purchase_price)

single2 <- (subset2$purchase_price)

t.test(married2, single2)

    Welch Two Sample t-test

data:  married2 and single2
t = 4.256, df = 156.84, p-value = 3.57e-05
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
  41.37798 113.04726
sample estimates:
mean of x mean of y 
 324.0685  246.8559 

The test on purchase prices of the two subsets gave a P-Value of 3.57e-05 which is approximately 0.0000357 and much less than 0.05. This means that at a 5% significance level we can reject H0 that the means are the same. Married men that earn above average incomes secure loans for more expensive houses.


married3 <- (subset1$num_units)

single3 <- (subset2$num_units)

t.test(married3, single3)

    Welch Two Sample t-test

data:  married3 and single3
t = -0.49537, df = 90.933, p-value = 0.6215
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.13957433  0.08385542
sample estimates:
mean of x mean of y 
 1.064246  1.092105 

The P-Value for this test on number of units was 0.6215 which is greater than 0.05. There was no significant difference in the number of units in the property.

The married men had similar incomes and units in their houses, yet got loans for more expensive houses. They had more dependents which could explain the prices with houses in more child friendly areas near good schools being more expensive.

  1. Create one or more tables that group the data by a certain categorical variable and display summarized information for each group (e.g., the mean or sum within the group).
df2$bankruptcy_dummy <- ifelse(df2$filed_bankruptcy == "TRUE", 1, 0)
summary(df2$bankruptcy_dummy)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.00000 0.00000 0.00000 0.06808 0.00000 1.00000 
df2$loan_decision_dummy <- ifelse(df2$loan_decision == "approve", 1, 0)
summary(df2$loan_decision_dummy)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   1.000   1.000   0.878   1.000   1.000 
table <- df2 %>%
group_by(loan_decision) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE))
Warning: There was 1 warning in `summarise()`.
ℹ In argument: `across(where(is.numeric), mean, na.rm = TRUE)`.
ℹ In group 1: `loan_decision = "approve"`.
Caused by warning:
! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
Supply arguments directly to `.fns` through an anonymous function instead.

  # Previously
  across(a:b, mean, na.rm = TRUE)

  # Now
  across(a:b, \(x) mean(x, na.rm = TRUE))
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
print(table)

People who were successful in their loan application had higher average monthly income but less number of dependents. Their purchase price and liquid assets were higher but consumer credit history much lower. The average bankruptcy for people who secured a loan was 5.9 times less than those who were unsuccessful. This is the variable that differs the most significantly across the table.

  1. Implement a linear regression model and interpret its output including its accuracy

reg9a <- lm(df2$loan_decision_dummy~ df2$monthly_income + df2$loan_amount + df2$num_units + df2$num_dependants + df2$purchase_price + df2$liquid_assets)
summary(reg9a)

Call:
lm(formula = df2$loan_decision_dummy ~ df2$monthly_income + df2$loan_amount + 
    df2$num_units + df2$num_dependants + df2$purchase_price + 
    df2$liquid_assets)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.97932  0.09232  0.11424  0.12648  0.39149 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)         9.650e-01  2.378e-02  40.574  < 2e-16 ***
df2$monthly_income -9.129e-07  1.782e-06  -0.512 0.608414    
df2$loan_amount    -5.787e-04  1.658e-04  -3.491 0.000492 ***
df2$num_units      -8.265e-02  1.671e-02  -4.946 8.21e-07 ***
df2$num_dependants -1.022e-02  6.697e-03  -1.526 0.127101    
df2$purchase_price  5.145e-04  1.094e-04   4.703 2.74e-06 ***
df2$liquid_assets   2.498e-08  1.083e-07   0.231 0.817579    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3236 on 1976 degrees of freedom
Multiple R-squared:  0.02613,   Adjusted R-squared:  0.02317 
F-statistic: 8.836 on 6 and 1976 DF,  p-value: 1.569e-09

In the model with all the continuous monetary variables, despite many of the variables being statistically significant, the adjusted R squared is very low at 0.023. This linear regression model is not very good at explaining loan decisions. Only 2.3% of variations in loan approval decision can be explained by the variables in the model.


reg9b <- lm(df2$loan_decision_dummy~  df2$loan_amount + df2$num_units + df2$purchase_price + df2$bankruptcy_dummy + df2$consumer_credit_history)
summary(reg9b)

Call:
lm(formula = df2$loan_decision_dummy ~ df2$loan_amount + df2$num_units + 
    df2$purchase_price + df2$bankruptcy_dummy + df2$consumer_credit_history)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.98798  0.04261  0.06283  0.10702  0.66435 

Coefficients:
                              Estimate Std. Error t value Pr(>|t|)    
(Intercept)                  1.046e+00  2.350e-02  44.521  < 2e-16 ***
df2$loan_amount             -4.544e-04  1.550e-04  -2.931  0.00342 ** 
df2$num_units               -6.558e-02  1.577e-02  -4.158 3.34e-05 ***
df2$purchase_price           3.927e-04  9.736e-05   4.034 5.69e-05 ***
df2$bankruptcy_dummy        -2.639e-01  2.841e-02  -9.291  < 2e-16 ***
df2$consumer_credit_history -4.215e-02  4.320e-03  -9.755  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3048 on 1977 degrees of freedom
Multiple R-squared:  0.1355,    Adjusted R-squared:  0.1333 
F-statistic: 61.99 on 5 and 1977 DF,  p-value: < 2.2e-16

In the second model that includes bankruptcy and consumer credit history the adjusted R squared is increased to 0.1333. It is still a weak model but all the variables are significant. The new additions have lower Pr(>|t|) values and are more significant. More consumer credit history reduces chance of securing a loan.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gDQoNClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDdHJsK1NoaWZ0K0VudGVyKi4gDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KbGlicmFyeShrbml0cikNCmluc3RhbGwucGFja2FnZXMoInJlYWR4bCIpDQpsaWJyYXJ5KHJlYWR4bCkNCg0KZGYgPC0gcmVhZC5jc3YoImxvYW5hcHAuY3N2IikNCmRmDQpzdHIoZGYpDQoNCmBgYA0KMS4gR2VuZXJhdGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgdGhlIGRhdGFzZXQsIGFuZCBjb21tZW50IG9uIHRoZSBtYWluIHRyZW5kcy4NCg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0KYGBgDQpUaGUgZGF0YSBzZXQgaXMgdmVyeSBsYXJnZSB3aXRoIDE5ODggaW5kaXZpZHVhbHMgaW5jbHVkZWQuIFRoZSBzdW1tYXJ5IHNob3dzIHRoYXQgdGhlIGNvbnRpbnVvdXMgbW9uZXRhcnkgdmFyaWFibGVzIGhhdmUgYSBodWdlIHJhbmdlIGFuZCB0aGUgaG91c2luZyBwcm9wZXJ0aWVzIGhhdmUgbGVzcyBvZiBhIHJhbmdlLiBUaGUgaHVnZSByYW5nZXMgYWZmZWN0IHRoZSBtZWFuIGluIG1hbnkgdmFyaWFibGVzIHN1Y2ggYXMgbGlxdWlkIGFzc2V0cyB3aGVyZSB0aGUgbWVkaWFuIMKjMzgsMDAwIGlzIG11Y2ggbGVzcyB0aGFuIHRoZSBtZWFuIMKjNCw2MjAsMDAwLiBUaGUgbGFyZ2UgZGF0YSBzZXQgaXMgYWZmZWN0ZWQgYnkgYSBmZXcgb3V0bGllcnMgd2l0aCB2ZXJ5IGxhcmdlIGluY29tZXMgYW5kIGFzc2V0cy4gTW9zdCBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGVzIGhhdmUgc2ltaWxhciBtZWFucyBhbmQgbWVkaWFucyBiZWNhdXNlIHRoZXkgY2Fubm90IGJlIGFmZmVjdGVkIGJ5IGxhcmdlIG91dGxpZXJzLg0KDQoyLiBDaGVjayBhbnkgcmVjb3JkcyB3aXRoIG1pc3NpbmcgdmFsdWVzIGFuZCBoYW5kbGUgdGhlIG1pc3NpbmcgZGF0YSBhcyBhcHByb3ByaWF0ZS4NCg0KYGBge3J9DQpkZjIgPC0gZGZbY29tcGxldGUuY2FzZXMoZGYpLCBdDQpkZjINCnN1bW1hcnkoZGYyKQ0KDQpgYGANCg0KVGhlIG1pc3NpbmcgdmFsdWVzIGhhdmUgYmVlbiByZXNvbHZlZCBieSByZW1vdmluZyBhbGwgaW5kaXZpZHVhbHMgd2l0aCBtaXNzaW5nIHZhcmlhYmxlcy4gQmVjYXVzZSBvZiB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBzZXQgaXQgd2lsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvZiB0aGUgdGVzdHMuIFRoZXJlIGFyZSAxOTgzIG9ic2VydmF0aW9ucyBpbiBkZjIgaW5zdGVhZCBvZiB0aGUgMTk4OCBpbiB0aGUgb3JpZ2luYWwgZGF0YWZyYW1lLiBUaGUgbWVhbiBhcHBsaWNhbnQgaW5jb21lIGFuZCBsaXF1aWQgYXNzZXRzIGhhdmUgY2hhbmdlZCBzbGlnaHRseSBidXQgbW9zdCBvZiB0aGUga2V5IHN0YXRpc3RpY3MgYXJlIHVuY2hhbmdlZC4NCg0KMy4gQnVpbGQgZ3JhcGhzIHZpc3VhbGl6aW5nIHRoZSBmb2xsb3dpbmcgYW5kIGNvbW1lbnQgb24gdGhlIG9idGFpbmVkIHZpc3VhbCBpbnNpZ2h0cw0KQS4gVGhlIGRpc3RyaWJ1dGlvbiBvZiBvbmUgb3IgbW9yZSBpbmRpdmlkdWFsIGNvbnRpbnVvdXMgdmFyaWFibGVzDQpgYGB7cn0NCmhpc3QoZGYyJGFwcGxpY2FudF9pbmNvbWUsIGJpbnM9MTAwKQ0KDQpgYGANCg0KVGhlIHZhc3QgbWFqb3JpdHkgb2YgYXBwbGljYW50cyBoYXZlIGluY29tZXMgYmV0d2VlbiAwIGFuZCDCozEwMCwwMDAuIFRoZXJlIGFyZSBhIGZldyBiaWdnZXIgaW5jb21lcyBvdmVyIMKjNjAwLDAwMC4gVGhpcyBleHBsYWlucyB3aHkgdGhlIG1lZGlhbiA2NCBpcyBiZWxvdyB0aGUgbWVhbiA4NC43My4NCg0KYGBge3J9DQpoaXN0KGRmMiRwdXJjaGFzZV9wcmljZSwgYmlucz0xMDApDQoNCmBgYA0KQSBzaW1pbGFyIHRyZW5kIHdpdGggdGhlIG92ZXIgMTAwMCBwdXJjaGFzZXMgcHJpY2VzIG9uIHRoZSBsb3dlciBlbmQgYmV0d2VlbiDCozEwMCwwMDAgYW5kIMKjMjAwLDAwMCwgYnV0IGxlc3MgdGhhbiAxMDAgb3ZlciB0aGUgwqM1MDAsMDAwIHRocmVzaG9sZC4gDQoNCjNCLiBUaGUgcmVsYXRpb25zaGlwIG9mIGEgcGFpciBvZiBjb250aW51b3VzIHZhcmlhYmxlcy4NCg0KYGBge3J9IA0KcGxvdChkZjIkYXBwbGljYW50X2luY29tZSwgZGYyJHB1cmNoYXNlX3ByaWNlLA0KICAgICB4bGFiID0gIkFwcGxpY2FudCBJbmNvbWUiLA0KICAgICB5bGFiID0gIlB1cmNoYXNlIFByaWNlIiwgKQ0KYGBgDQoNCmBgYHtyfQ0KY29yKGRmMiRwdXJjaGFzZV9wcmljZSwgZGYyJGFwcGxpY2FudF9pbmNvbWUpDQpgYGANClRoZSBjb3JyZWxhdGlvbiBpcyAwLjQ1MDM3MjUgd2hpY2ggaXMgZmFpcmx5IHdlYWsgYnV0IHN0aWxsIHBvc2l0aXZlLiBBIHJlZ3Jlc3Npb24gbW9kZWwgZ2l2ZXMgYW4gZXN0aW1hdGUgcHVyY2hhc2UgcHJpY2UgPSDCozE0MCwzMDkuMzYgKyAwLjY2MjU4IHggYXBwbGljYW50IGluY29tZSBtZWFuaW5nIHRoYXQgb24gdGhlIHdob2xlIHRoZSBoaWdoZXIgdGhlIGluY29tZSB0aGUgaGlnaGVyIHRoZSAgcHVyY2hhc2UgcHJpY2UuIEJ1dCB0aGUgbW9kZWwgaXMgbm90IHRoYXQgYWNjdXJhdGUgYW5kIHRoZSBtYWpvcml0eSBvZiBvYnNlcnZhdGlvbnMgYXJlIG9uIHRoZSBsb3dlciBlbmQgb2YgYm90aCB2YXJpYWJsZXMsIHdpdGggc29tZSBvdXRsaWVycyBzY2F0dGVyZWQgYXJvdW5kLiBUaGUgaW5jb21lIGluIHBhcnRpY3VsYXIgdmFyaWVzIGEgbG90IHdoaWNoIGNhbiBhZmZlY3QgdGhlIG1lYW4uDQoNCmBgYHtyfQ0KcmVnMSA8LSBsbShkZjIkcHVyY2hhc2VfcHJpY2UgfiBkZjIkYXBwbGljYW50X2luY29tZSkNCnN1bW1hcnkocmVnMSkNCmBgYA0KDQozQy4gVGhlIGFzc29jaWF0aW9uIGIvdyBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlIGFuZCBhIGNvbnRpbnVvdXMgb25lLg0KDQpgYGB7cn0NCg0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZGYyLCBhZXMoeCA9IGRmMiRsb2FuX2RlY2lzaW9uLCB5ID0gZGYyJGFwcGxpY2FudF9pbmNvbWUpKSArDQogIGdlb21fYm94cGxvdCgpDQpgYGANCg0KTWVkaWFuIGluY29tZSBmb3IgYXBwcm92YWxzIGlzIGhpZ2hlciB0aGFuIGZvciByZWplY3Rpb25zLiBUaGUgcGVvcGxlIHdobyBnb3QgdGhlaXIgbG9hbiBhcHByb3ZlZCBoYWQgaGlnaGVyIGluY29tZXMgdGhhbiB0aG9zZSB3aG8gd2VyZSByZWplY3RlZC4gVGhlcmUgYXJlIGxvdHMgb2Ygb3V0bGllcnMgc3VnZ2VzdGluZyBiZWNhdXNlIG9mIHRoZSBzaXplIGFuZCB2YXJpYXRpb24gb2YgdGhlIGRhdGFzZXQgYSBib3ggcGxvdCBpcyBub3QgdGhlIG1vc3QgdmFsaWQgd2F5IHRvIHByZXNlbnQgdGhlIGRhdGEuDQoNCjNELiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9yZSB0aGFuIHR3byB2YXJpYWJsZXMsIGUuZy4sIHVzaW5nIHNlbWFudGljIG1hcHBpbmdzLg0KDQpgYGB7cn0NCmdncGxvdChkZjIsIGFlcyh4ID0gYXBwbGljYW50X2luY29tZSwgeSA9IHB1cmNoYXNlX3ByaWNlLCBjb2xvciA9IG1hcnJpZWQsIHNoYXBlID0gbG9hbl9kZWNpc2lvbikpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKw0KICBsYWJzKHRpdGxlID0gIkluY29tZSB2cyBQdXJjaGFzZSBQcmljZSBieSBNYXJpdGFsIFN0YXR1cyBhbmQgTG9hbiBBcHByb3ZhbCIsDQogICAgICAgeCA9ICJJbmNvbWUiLA0KICAgICAgIHkgPSAiUHVyY2hhc2UgUHJpY2UiKQ0KYGBgDQpUaGUgZ3JhcGggc2hvd3MgaG93IG1hcnJpYWdlIGFuZCBsb2FuIGFwcHJvdmFsIHN0YXR1cyBsaW5rIHRvIGluY29tZSBhbmQgcHVyY2hhc2UgcHJpY2UuIFRoZXJlIGFyZSBsb3RzIG9mIGJsdWUgY2lyY2xlcyBzaG93aW5nIGxvdHMgaWYgbWFycmllZCBwZW9wbGUgZ290IGEgbG9hbiBhcHByb3ZlZC4gQW5vdGhlciBvYnNlcnZhdGlvbiBpcyB0aGF0IHRoZXJlIGFyZSBtYWlubHkgY2lyY2xlcyBhYm92ZSBhIHB1cmNoYXNlIHByaWNlIG9mIDUwMCBzdWdnZXN0aW5nIHRoYXQgcGVvcGxlIGJ1eWluZyBtb3JlIGV4cGVuc2l2ZSBob21lcyBnZXQgYXBwcm92ZWQgZm9yIGxvYW5zIG1vcmUuIEFsc28gY291cGxlcyB0eXBpY2FsbHkgYnV5IHRoZSBtb3JlIGV4cGVuc2l2ZSBob21lcy4gQXQgdGhlIGxvd2VyIGVuZCBvZiBwdXJjaGFzZSBwcmljZSB0aGVyZSBpcyBtb3JlIG9mIGEgbWl4IG9mIGFwcHJvdmFscyBhbmQgcmVqZWN0aW9ucy4NCg0KNC4gRGlzcGxheSB1bmlxdWUgdmFsdWVzIG9mIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUgYW5kIHRoZWlyIGZyZXF1ZW5jaWVzLg0KDQpgYGB7cn0NCg0KDQoNCmdncGxvdChkZjIsIGFlcyh4ID0gbnVtX2RlcGVuZGFudHMpKSArDQogIGdlb21fYmFyKCkgKw0KICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IC4uY291bnQuLiksdmp1c3QgPSAtMC40LCBjb2xvdXIgPSAicmVkIikgKyANCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgTnVtYmVyIG9mIERlcGVuZGVudHMiLA0KICAgICAgIHggPSAiTnVtYmVyIG9mIERlcGVuZGVudHMiLA0KICAgICAgIHkgPSAiQ291bnQiKQ0KYGBgDQoNClRoZSBsb3dlciBlbmQgb2YgdGhlIG51bWJlciBvZiBkZXBlbmRlbnRzIGlzIG11Y2ggbW9yZSBjb21tb24gYW5kIHRoZXJlIGFyZSBvbmx5IDEwIGluZGl2aWR1YWxzIHdpdGggb3ZlciA0IGRlcGVuZGVudHMsIHJlcHJlc2VudGluZyAwLjUwNCUgb2YgdGhlIGRhdGEuIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGRhdGEgY29sbGVjdGlvbiB3ZXJlIHRvbyB3aWRlIGFuZCBzb21lIGZpbmRpbmdzIHNob3VsZCBoYXZlIGJlZW4gZXhjbHVkZWQgdG8gbWFrZSB0aGUgYmV0dGVyIG1vcmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIHBvcHVsYXRpb24uDQpgYGB7cn0NCmdncGxvdChkZjIsIGFlcyh4ID0gbG9hbl9kZWNpc2lvbiwgZmlsbCA9IG1hcnJpZWQpKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBMb2FuIEFwcHJvdmFsIFN0YXR1cyIsDQogICAgICAgeCA9ICJMb2FuIFN0YXR1cyIsDQogICAgICAgeSA9ICJDb3VudCIsDQogICAgICAgZmlsbCA9ICJNYXJyaWVkIikNCmBgYA0KVGhlcmUgYXJlIGZhciBtb3JlIGFwcHJvdmFscyB0aGFuIHJlamVjdGlvbnMgYW5kIG1vc3Qgb2YgdGhlIGFwcHJvdmFscyB3ZXJlIGZvciBtYXJyaWVkIHBlb3BsZS4gVGhlIG1hcml0YWwgYW5kIGxvYW4gc3RhdHVzIG9ubHkgaGFkIHR3byBjYXRlZ29yaWVzIGFuZCBjcmVhdGVkIG11Y2ggbW9yZSByZWxpYWJsZSBkYXRhLg0KDQo1LiBCdWlsZCBhIGNvbnRpbmdlbmN5IHRhYmxlIG9mIHR3byBwb3RlbnRpYWxseSByZWxhdGVkIGNhdGVnb3JpY2FsIHZhcmlhYmxlcy4gQ29uZHVjdCBhIHN0YXRpc3RpY2FsIHRlc3Qgb2YgdGhlIGluZGVwZW5kZW5jZSBiZXR3ZWVuIHRoZW0gYW5kIGludGVycHJldCB0aGUgcmVzdWx0cy4NCmBgYHtyfQ0KdGVzdDEgPC0gdGFibGUoZGYyJGxvYW5fZGVjaXNpb24sIGRmMiRtYXJyaWVkKQ0KdGVzdDENCmBgYA0KDQoNCmBgYHtyfQ0KY2hpc3EudGVzdCh0ZXN0MSkNCmBgYA0KVGhlIENoaS1zcXVhcmVkIHRlc3QgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1hcnJpYWdlIGFuZCBsb2FuIGRlY2lzaW9uIGluIHRoZSBkYXRhc2V0LiBUaGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIHR3byB2YXJpYWJsZXMgYXJlIGluZGVwZW5kZW50IGFuZCB0aGUgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyBpcyB0aGF0IHRoZSB0d28gdmFyaWFibGVzIGFyZSBhc3NvY2lhdGVkLiBXZSBnZXQgYSBQLVZhbHVlIG9mIDAuMDA2MzAxIHdoaWNoIGlzIGxlc3MgdGhhbiAwLjA1IHNvIHdlIGNhbiByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBhdCB0aGUgNSUgc2lnbmlmaWNhbmNlIGxldmVsLiBUaGVyZSBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuICBtYXJyaWFnZSBhbmQgbG9hbiBkZWNpc2lvbiBiZWNhdXNlIHBlb3BsZSB3aG8gYXJlIG1hcnJpZWQgYXJlIG1vcmUgbGlrZWx5IHRvIGdldCBhIGxvYW4uDQoNCiA2LiBSZXRyaWV2ZSBvbmUgb3IgbW9yZSBzdWJzZXQgb2Ygcm93cyBiYXNlZCBvbiB0d28gb3IgbW9yZSBjcml0ZXJpYSBhbmQgcHJlc2VudCBkZXNjcmlwdGl2ZSAgICAgICAgICAgIHN0YXRpc3RpY3Mgb24gdGhlIHN1YnNldChzKS4NCg0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQpzdWJzZXQxIDwtIGRmMiAlPiUNCiAgZmlsdGVyKG1hcnJpZWQgPT0gIlRSVUUiLCBsb2FuX2RlY2lzaW9uID09ICJhcHByb3ZlIiwgZ2VuZGVyID09ICJtYWxlIiwgYXBwbGljYW50X2luY29tZSA+IG1lYW4oZGYyJGFwcGxpY2FudF9pbmNvbWUpKQ0Kc3VtbWFyeShzdWJzZXQxKQ0KDQpzdWJzZXQyIDwtIGRmMiAlPiUNCiAgZmlsdGVyKG1hcnJpZWQgPT0gIkZBTFNFIiwgbG9hbl9kZWNpc2lvbiA9PSAiYXBwcm92ZSIsIGdlbmRlciA9PSAibWFsZSIsIGFwcGxpY2FudF9pbmNvbWUgPiBtZWFuKGRmMiRhcHBsaWNhbnRfaW5jb21lKSkNCnN1bW1hcnkoc3Vic2V0MikNCg0KYGBgDQoNClRoZXJlIHdlcmUgbW9yZSBtYXJyaWVkIGhpZ2ggZWFybmluZyBtZW4gd2hvIHN1Y2Nlc3NmdWxseSBhcHBsaWVkIGZvciBsb2Fucy4gQmVjYXVzZSBvZiB0aGUgZGVmaW5lZCBzdWJzZXRzIHRoZSBkYXRhIGlzIG11Y2ggbW9yZSBldmVubHkgZGlzdHJpYnV0ZWQuIFRoZSBtZWFucyBhcmUgaGlnaGVyIHRoYW4gdGhlIG1lZGlhbiBmb3IgYWxtb3N0IGFsbCB0aGUgdmFyaWFibGVzIHNvIHRoZXJlIGFyZSBzdGlsbCBvdXRsaWVycyBhZmZlY3RpbmcgdGhlIGF2ZXJhZ2VzIGJ1dCB0aGUgc3Vic2V0cyBhcmUgbW9yZSByZWxpYWJsZSB0aGFuIHRoZSB3aG9sZSBzYW1wbGUuIFRoZSBvbmx5IHZhcmlhYmxlIHdpdGggYW4gb3V0bGllciBpcyBudW1iZXIgb2YgZGVwZW5kZW50cyBmb3IgdW5tYXJyaWVkIG1lbi4NCg0KNy4gQ29uZHVjdCBhIHN0YXRpc3RpY2FsIHRlc3Qgb2YgdGhlIHNpZ25pZmljYW5jZSBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtZWFucyBvZiB0d28gc3Vic2V0cyAgIG9mIHRoZSBkYXRhIGFuZCBpbnRlcnByZXQgdGhlIHJlc3VsdHMuDQoNCmBgYHtyfQ0KbWFycmllZCA8LSAoc3Vic2V0MSRhcHBsaWNhbnRfaW5jb21lKQ0KDQpzaW5nbGUgPC0gKHN1YnNldDIkYXBwbGljYW50X2luY29tZSkNCg0KdC50ZXN0KG1hcnJpZWQsIHNpbmdsZSkNCmBgYA0KVGhlIFAtVmFsdWUgd2FzIDAuNzA1NCB3aGljaCBpcyBtdWNoIGhpZ2hlciB0aGFuIDAuMDUgd2hpY2ggc3VnZ2VzdHMgdGhlcmUgaXMgbm8gZXZpZGVuY2UgdGhhdCB0aGUgbWVhbnMgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50LiBUaGUgbWFycmllZCBtYWxlIGhpZ2ggZWFybmVycyB3aG8gc3VjY2Vzc2Z1bGx5IGFwcGxpZWQgZm9yIGEgbG9hbiBkb24ndCBtYWtlIHNpZ25pZmljYW50bHkgbGVzcyB0aGFuIHRoZSBub24tbWFycmllZCBtYWxlIGhpZ2ggZWFybmVycyB3aG8gd2VyZSBhbHNvIHN1Y2Nlc3NmdWwuDQoNCmBgYHtyfQ0KbWFycmllZDIgPC0gKHN1YnNldDEkcHVyY2hhc2VfcHJpY2UpDQoNCnNpbmdsZTIgPC0gKHN1YnNldDIkcHVyY2hhc2VfcHJpY2UpDQoNCnQudGVzdChtYXJyaWVkMiwgc2luZ2xlMikNCmBgYA0KVGhlIHRlc3Qgb24gcHVyY2hhc2UgcHJpY2VzIG9mIHRoZSB0d28gc3Vic2V0cyBnYXZlIGEgUC1WYWx1ZSBvZiAzLjU3ZS0wNSB3aGljaCBpcyBhcHByb3hpbWF0ZWx5IDAuMDAwMDM1NyBhbmQgbXVjaCBsZXNzIHRoYW4gMC4wNS4gVGhpcyBtZWFucyB0aGF0IGF0IGEgNSUgc2lnbmlmaWNhbmNlIGxldmVsIHdlIGNhbiByZWplY3QgSDAgdGhhdCB0aGUgbWVhbnMgYXJlIHRoZSBzYW1lLiBNYXJyaWVkIG1lbiB0aGF0IGVhcm4gYWJvdmUgYXZlcmFnZSBpbmNvbWVzIHNlY3VyZSBsb2FucyBmb3IgbW9yZSBleHBlbnNpdmUgaG91c2VzLg0KDQpgYGB7cn0NCg0KbWFycmllZDMgPC0gKHN1YnNldDEkbnVtX3VuaXRzKQ0KDQpzaW5nbGUzIDwtIChzdWJzZXQyJG51bV91bml0cykNCg0KdC50ZXN0KG1hcnJpZWQzLCBzaW5nbGUzKQ0KYGBgDQpUaGUgUC1WYWx1ZSBmb3IgdGhpcyB0ZXN0IG9uIG51bWJlciBvZiB1bml0cyB3YXMgMC42MjE1IHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiAwLjA1LiBUaGVyZSB3YXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgbnVtYmVyIG9mIHVuaXRzIGluIHRoZSBwcm9wZXJ0eS4gDQoNClRoZSBtYXJyaWVkIG1lbiBoYWQgc2ltaWxhciBpbmNvbWVzIGFuZCB1bml0cyBpbiB0aGVpciBob3VzZXMsIHlldCBnb3QgbG9hbnMgZm9yIG1vcmUgZXhwZW5zaXZlIGhvdXNlcy4gVGhleSBoYWQgbW9yZSBkZXBlbmRlbnRzIHdoaWNoIGNvdWxkIGV4cGxhaW4gdGhlIHByaWNlcyB3aXRoIGhvdXNlcyBpbiBtb3JlIGNoaWxkIGZyaWVuZGx5IGFyZWFzIG5lYXIgZ29vZCBzY2hvb2xzIGJlaW5nIG1vcmUgZXhwZW5zaXZlLg0KDQogIDguIENyZWF0ZSBvbmUgb3IgbW9yZSB0YWJsZXMgdGhhdCBncm91cCB0aGUgZGF0YSBieSBhIGNlcnRhaW4gY2F0ZWdvcmljYWwgdmFyaWFibGUgYW5kIGRpc3BsYXkgICAgICAgICAgc3VtbWFyaXplZCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBncm91cCAoZS5nLiwgdGhlIG1lYW4gb3Igc3VtIHdpdGhpbiB0aGUgZ3JvdXApLg0KDQoNCmBgYHtyfQ0KZGYyJGJhbmtydXB0Y3lfZHVtbXkgPC0gaWZlbHNlKGRmMiRmaWxlZF9iYW5rcnVwdGN5ID09ICJUUlVFIiwgMSwgMCkNCnN1bW1hcnkoZGYyJGJhbmtydXB0Y3lfZHVtbXkpDQpkZjIkbG9hbl9kZWNpc2lvbl9kdW1teSA8LSBpZmVsc2UoZGYyJGxvYW5fZGVjaXNpb24gPT0gImFwcHJvdmUiLCAxLCAwKQ0Kc3VtbWFyeShkZjIkbG9hbl9kZWNpc2lvbl9kdW1teSkNCnRhYmxlIDwtIGRmMiAlPiUNCmdyb3VwX2J5KGxvYW5fZGVjaXNpb24pICU+JQ0Kc3VtbWFyaXNlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgbWVhbiwgbmEucm0gPSBUUlVFKSkNCg0KcHJpbnQodGFibGUpDQpgYGANCg0KUGVvcGxlIHdobyB3ZXJlIHN1Y2Nlc3NmdWwgaW4gdGhlaXIgbG9hbiBhcHBsaWNhdGlvbiBoYWQgaGlnaGVyIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUgYnV0IGxlc3MgbnVtYmVyIG9mIGRlcGVuZGVudHMuIFRoZWlyIHB1cmNoYXNlIHByaWNlIGFuZCBsaXF1aWQgYXNzZXRzIHdlcmUgaGlnaGVyIGJ1dCBjb25zdW1lciBjcmVkaXQgaGlzdG9yeSBtdWNoIGxvd2VyLiBUaGUgYXZlcmFnZSBiYW5rcnVwdGN5IGZvciBwZW9wbGUgd2hvIHNlY3VyZWQgYSBsb2FuIHdhcyA1LjkgdGltZXMgbGVzcyB0aGFuIHRob3NlIHdobyB3ZXJlIHVuc3VjY2Vzc2Z1bC4gVGhpcyBpcyB0aGUgdmFyaWFibGUgdGhhdCBkaWZmZXJzIHRoZSBtb3N0IHNpZ25pZmljYW50bHkgYWNyb3NzIHRoZSB0YWJsZS4NCg0KOS4gSW1wbGVtZW50IGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgYW5kIGludGVycHJldCBpdHMgb3V0cHV0IGluY2x1ZGluZyBpdHMgYWNjdXJhY3kNCiAgIA0KICAgDQpgYGB7cn0NCg0KcmVnOWEgPC0gbG0oZGYyJGxvYW5fZGVjaXNpb25fZHVtbXl+IGRmMiRtb250aGx5X2luY29tZSArIGRmMiRsb2FuX2Ftb3VudCArIGRmMiRudW1fdW5pdHMgKyBkZjIkbnVtX2RlcGVuZGFudHMgKyBkZjIkcHVyY2hhc2VfcHJpY2UgKyBkZjIkbGlxdWlkX2Fzc2V0cykNCnN1bW1hcnkocmVnOWEpDQpgYGANCkluIHRoZSBtb2RlbCB3aXRoIGFsbCB0aGUgY29udGludW91cyBtb25ldGFyeSB2YXJpYWJsZXMsIGRlc3BpdGUgbWFueSBvZiB0aGUgdmFyaWFibGVzIGJlaW5nIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIHRoZSBhZGp1c3RlZCBSIHNxdWFyZWQgaXMgdmVyeSBsb3cgYXQgMC4wMjMuIFRoaXMgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgaXMgbm90IHZlcnkgZ29vZCBhdCBleHBsYWluaW5nIGxvYW4gZGVjaXNpb25zLiBPbmx5IDIuMyUgb2YgdmFyaWF0aW9ucyBpbiBsb2FuIGFwcHJvdmFsIGRlY2lzaW9uIGNhbiBiZSBleHBsYWluZWQgYnkgdGhlIHZhcmlhYmxlcyBpbiB0aGUgbW9kZWwuDQpgYGB7cn0NCg0KcmVnOWIgPC0gbG0oZGYyJGxvYW5fZGVjaXNpb25fZHVtbXl+ICBkZjIkbG9hbl9hbW91bnQgKyBkZjIkbnVtX3VuaXRzICsgZGYyJHB1cmNoYXNlX3ByaWNlICsgZGYyJGJhbmtydXB0Y3lfZHVtbXkgKyBkZjIkY29uc3VtZXJfY3JlZGl0X2hpc3RvcnkpDQpzdW1tYXJ5KHJlZzliKQ0KYGBgDQpJbiB0aGUgc2Vjb25kIG1vZGVsIHRoYXQgaW5jbHVkZXMgYmFua3J1cHRjeSBhbmQgY29uc3VtZXIgY3JlZGl0IGhpc3RvcnkgdGhlIGFkanVzdGVkIFIgc3F1YXJlZCBpcyBpbmNyZWFzZWQgdG8gMC4xMzMzLiBJdCBpcyBzdGlsbCBhIHdlYWsgbW9kZWwgYnV0IGFsbCB0aGUgdmFyaWFibGVzIGFyZSBzaWduaWZpY2FudC4gVGhlIG5ldyBhZGRpdGlvbnMgaGF2ZSBsb3dlciBQcig+fHR8KSB2YWx1ZXMgYW5kIGFyZSBtb3JlIHNpZ25pZmljYW50LiBNb3JlIGNvbnN1bWVyIGNyZWRpdCBoaXN0b3J5IHJlZHVjZXMgY2hhbmNlIG9mIHNlY3VyaW5nIGEgbG9hbi4NCg0K