Application: Risque de crédit#

Avant de commencer notre prochain exercice qui consiste à analyser des données de crédit, essayons d’abord de comprendre ce que c’est le risque de crédit.

Le risque de crédit est le risque qu’un emprunteur ne rembourse pas tout ou une partie de son crédit aux échéances prévues par le contrat signé entre lui et l’organisme préteur (généralement une banque).

—Wikipédia

Dans notre cas, il s’agit d’une banque qui agit en tant qu’organisme financier et qui accorde des prêts aux clients qui en font la demande. Par conséquent, les clients susceptibles de ne pas rembourser leur prêt représentent un risque de crédit pour la banque.

En analysant les données des clients et avant même d’y appliqer une quelconque inférence, la banque sera en mesure d’avoir une idée sur le profl des clients qui peuvent présenter un risque de crédit potentiel.

Cela permettra d’atténuer les risques et de minimiser les pertes en évitant d’accorder des prêts à des clients qui pourraient présenter des risques de crédit pour la banque.

# install.packages("rchallenge")
library(rchallenge)
data("german")
head(german)
A data.frame: 6 × 21
statusdurationcredit_historypurposeamountsavingsemployment_durationinstallment_ratepersonal_status_sexother_debtorspropertyageother_installment_planshousingnumber_creditsjobpeople_liabletelephoneforeign_workercredit_risk
<fct><int><fct><fct><int><fct><fct><ord><fct><fct><fct><int><fct><fct><ord><fct><fct><fct><fct><fct>
1no checking account18all credits at this bank paid back duly car (used)1049unknown/no savings account< 1 yr < 20 female : non-single or male : singlenonecar or other 21nonefor free1 skilled employee/official0 to 2 nono good
2no checking account 9all credits at this bank paid back duly others 2799unknown/no savings account1 <= ... < 4 yrs25 <= ... < 35male : married/widowed noneunknown / no property36nonefor free2-3skilled employee/official3 or morenono good
3... < 0 DM 12no credits taken/all credits paid back dulyretraining 841... < 100 DM 4 <= ... < 7 yrs25 <= ... < 35female : non-single or male : singlenoneunknown / no property23nonefor free1 unskilled - resident 0 to 2 nono good
4no checking account12all credits at this bank paid back duly others 2122unknown/no savings account1 <= ... < 4 yrs20 <= ... < 25male : married/widowed noneunknown / no property39nonefor free2-3unskilled - resident 3 or morenoyesgood
5no checking account12all credits at this bank paid back duly others 2171unknown/no savings account1 <= ... < 4 yrs< 20 male : married/widowed nonecar or other 38bankrent 2-3unskilled - resident 0 to 2 noyesgood
6no checking account10all credits at this bank paid back duly others 2241unknown/no savings account< 1 yr >= 35 male : married/widowed noneunknown / no property48nonefor free2-3unskilled - resident 3 or morenoyesgood
dim(german)
  1. 1000
  2. 21

À partir de la sortie précédente, vous pouvez voir que notre ensemble de données a un total de 1000 obbservations, où chacune traite des points de données relatifs à un client de la banque.

Chaque observation possède divers attributs décrivant les données et nous avons un total de 21 variable.

colnames(german)
  1. 'status'
  2. 'duration'
  3. 'credit_history'
  4. 'purpose'
  5. 'amount'
  6. 'savings'
  7. 'employment_duration'
  8. 'installment_rate'
  9. 'personal_status_sex'
  10. 'other_debtors'
  11. 'present_residence'
  12. 'property'
  13. 'age'
  14. 'other_installment_plans'
  15. 'housing'
  16. 'number_credits'
  17. 'job'
  18. 'people_liable'
  19. 'telephone'
  20. 'foreign_worker'
  21. 'credit_risk'

Dans la prochaine section, nous étudions plus en détail chacune de ces variables.

Prétraitement des données#

Dans cette section, nous allons nous concentrer sur le prétraitement des données, qui comprend le nettoyage, la transformation et la normalisation des données si nécessaire. En fait, nous effectuons des opérations pour préparer les données à la modélisation.

Les valeurs manquantes#

Dans certaines situations, les données que vous traitez comportent des valeurs manquantes, qui sont souvent représentées par NA dans R.

vérifions si les données contiennent des valeurs NA

sum(is.na(german))
0

Types de données#

str(german)
'data.frame':	1000 obs. of  21 variables:
 $ status                 : Factor w/ 4 levels "no checking account",..: 1 1 2 1 1 1 1 1 4 2 ...
 $ duration               : int  18 9 12 12 12 10 8 6 18 24 ...
 $ credit_history         : Factor w/ 5 levels "delay in paying off in the past",..: 5 5 3 5 5 5 5 5 5 3 ...
 $ purpose                : Factor w/ 11 levels "others","car (new)",..: 3 1 10 1 1 1 1 1 4 4 ...
 $ amount                 : int  1049 2799 841 2122 2171 2241 3398 1361 1098 3758 ...
 $ savings                : Factor w/ 5 levels "unknown/no savings account",..: 1 1 2 1 1 1 1 1 1 3 ...
 $ employment_duration    : Factor w/ 5 levels "unemployed","< 1 yr",..: 2 3 4 3 3 2 4 2 1 1 ...
 $ installment_rate       : Ord.factor w/ 4 levels ">= 35"<"25 <= ... < 35"<..: 4 2 2 3 4 1 1 2 4 1 ...
 $ personal_status_sex    : Factor w/ 4 levels "male : divorced/separated",..: 2 3 2 3 3 3 3 3 2 2 ...
 $ other_debtors          : Factor w/ 3 levels "none","co-applicant",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ present_residence      : Ord.factor w/ 4 levels "< 1 yr"<"1 <= ... < 4 yrs"<..: 4 2 4 2 4 3 4 4 4 4 ...
 $ property               : Factor w/ 4 levels "unknown / no property",..: 2 1 1 1 2 1 1 1 3 4 ...
 $ age                    : int  21 36 23 39 38 48 39 40 65 23 ...
 $ other_installment_plans: Factor w/ 3 levels "bank","stores",..: 3 3 3 3 1 3 3 3 3 3 ...
 $ housing                : Factor w/ 3 levels "for free","rent",..: 1 1 1 1 2 1 2 2 2 1 ...
 $ number_credits         : Ord.factor w/ 4 levels "1"<"2-3"<"4-5"<..: 1 2 1 2 2 2 2 1 2 1 ...
 $ job                    : Factor w/ 4 levels "unemployed/unskilled - non-resident",..: 3 3 2 2 2 2 2 2 1 1 ...
 $ people_liable          : Factor w/ 2 levels "3 or more","0 to 2": 2 1 2 1 2 1 2 1 2 2 ...
 $ telephone              : Factor w/ 2 levels "no","yes (under customer name)": 1 1 1 1 1 1 1 1 1 1 ...
 $ foreign_worker         : Factor w/ 2 levels "yes","no": 2 2 2 1 1 1 1 1 2 2 ...
 $ credit_risk            : Factor w/ 2 levels "bad","good": 2 2 2 2 2 2 2 2 2 2 ...

Nous avons généralement deux types de variables :

  • Les variables numériques : Les valeurs de ces variables ont une signification mathématique. Cela signifie que vous pouvez effectuer des opérations mathématiques, telles que des additions, des soustractions, etc. L’âge, le poids, etc. d’une personne en sont des exemples.

  • duration : durée en mois.

  • amount : montant du crédit.

  • installment_rate : taux de remboursement en pourcentage du revenu disponible.

  • present_residence : résidence actuelle depuis .

  • age : âge du client.

  • number_credits : nombre de crédits existants dans cette banque.

  • other_debtors : nombre de personnes tenues d’assurer le prêt.

library(dplyr)
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
german %>%
    select(duration,
           amount,
           installment_rate,
           present_residence,
           age,
           number_credits,
           other_debtors) %>%
    str()
'data.frame':	1000 obs. of  7 variables:
 $ duration         : int  18 9 12 12 12 10 8 6 18 24 ...
 $ amount           : int  1049 2799 841 2122 2171 2241 3398 1361 1098 3758 ...
 $ installment_rate : Ord.factor w/ 4 levels ">= 35"<"25 <= ... < 35"<..: 4 2 2 3 4 1 1 2 4 1 ...
 $ present_residence: Ord.factor w/ 4 levels "< 1 yr"<"1 <= ... < 4 yrs"<..: 4 2 4 2 4 3 4 4 4 4 ...
 $ age              : int  21 36 23 39 38 48 39 40 65 23 ...
 $ number_credits   : Ord.factor w/ 4 levels "1"<"2-3"<"4-5"<..: 1 2 1 2 2 2 2 1 2 1 ...
 $ other_debtors    : Factor w/ 3 levels "none","co-applicant",..: 1 1 1 1 1 1 1 1 1 1 ...
  • Variables catégorielles : Les valeurs de ces variables n’ont aucune signification mathématique et vous ne pouvez effectuer aucune opération mathématique sur elles. Chaque valeur de cette variable appartient à une classe ou à uneclasse ou catégorie spécifique. Le sexe d’une personne, son emploi, etc. en sont des exemples.

  • credit_risk: Une variable binaire indiquant le risque de crédit ou la solvabilité avec les niveaux Bon et Mauvais.

  • telephone : variable binaire indiquant si le client a un numéro de téléphone enregistré.

  • foreign_worker : variable binaire indiquant si le client est un travailleur étranger.

  • status : variable factorielle indiquant le statut du compte courant.

  • credit_history : variable factorielle indiquant l’historique de crédit.

  • purpose : variable factorielle indiquant le motif du crédit.

  • savings : variable factorielle indiquant le compte d’épargne/les obligations.

  • employment_duration : facteur ordonné indiquant la durée de l’emploi actuel.

  • personal_status_sex : variable factorielle indiquant le statut personnel et le sexe.

  • people_liable : variable factorielle indiquant les autres débiteurs.

  • property : variable factorielle indiquant le bien le plus précieux du client.

  • other_installment_plans : variable factorielle indiquant les autres plans de paiement.

  • housing : variable factorielle indiquant le logement

  • job : facteur indiquant la situation professionnelle

german %>%
    select(credit_risk,
           telephone,
           foreign_worker,
           status,
           credit_history,
           purpose,
           savings,
          employment_duration,
          personal_status_sex,
          people_liable,
          property,
          other_installment_plans,
          housing,
          job) %>%
    str()
'data.frame':	1000 obs. of  14 variables:
 $ credit_risk            : Factor w/ 2 levels "bad","good": 2 2 2 2 2 2 2 2 2 2 ...
 $ telephone              : Factor w/ 2 levels "no","yes (under customer name)": 1 1 1 1 1 1 1 1 1 1 ...
 $ foreign_worker         : Factor w/ 2 levels "yes","no": 2 2 2 1 1 1 1 1 2 2 ...
 $ status                 : Factor w/ 4 levels "no checking account",..: 1 1 2 1 1 1 1 1 4 2 ...
 $ credit_history         : Factor w/ 5 levels "delay in paying off in the past",..: 5 5 3 5 5 5 5 5 5 3 ...
 $ purpose                : Factor w/ 11 levels "others","car (new)",..: 3 1 10 1 1 1 1 1 4 4 ...
 $ savings                : Factor w/ 5 levels "unknown/no savings account",..: 1 1 2 1 1 1 1 1 1 3 ...
 $ employment_duration    : Factor w/ 5 levels "unemployed","< 1 yr",..: 2 3 4 3 3 2 4 2 1 1 ...
 $ personal_status_sex    : Factor w/ 4 levels "male : divorced/separated",..: 2 3 2 3 3 3 3 3 2 2 ...
 $ people_liable          : Factor w/ 2 levels "3 or more","0 to 2": 2 1 2 1 2 1 2 1 2 2 ...
 $ property               : Factor w/ 4 levels "unknown / no property",..: 2 1 1 1 2 1 1 1 3 4 ...
 $ other_installment_plans: Factor w/ 3 levels "bank","stores",..: 3 3 3 3 1 3 3 3 3 3 ...
 $ housing                : Factor w/ 3 levels "for free","rent",..: 1 1 1 1 2 1 2 2 2 1 ...
 $ job                    : Factor w/ 4 levels "unemployed/unskilled - non-resident",..: 3 3 2 2 2 2 2 2 1 1 ...

Analyse et transformation des données#

Maintenant que nous avons traité nos données, elles sont prêtes à être analysées. Comme nous l’avons mentionné précédemment, nous allons procéder à une analyse descriptive et exploratoire dans cette section.

Nous analyserons les différents attributs de l’ensemble de données et parlerons de leur signification et de leur relation avec l’attribut de risque de crédit. Nous utiliserons des fonctions statistique et des visualisations pour illustrer tout cela.

La variable réponse#

Étudions d’abord la variable d’intérêt que la banque veut prédire pour un futur client.

table(german$credit_risk)
 bad good 
 300  700 

Selon ce résultat de solvabilité, on voit qu’il y a plus de personnes présentant un bon risque que de personnes présentant un mauvais risque. En fait, 70 % des demandeurs présentent un bon risque de crédit, tandis qu’environ 30 % présentent un mauvais risque de crédit.

Créons ensuite un graphique qui illustre rapidement ces proportions. Nous aurons besoin du package ggplot2 et bien sur un data frame qui sera utilisé pour ce graphique;

german %>% 
  count(credit_risk) 
A data.frame: 2 × 2
credit_riskn
<fct><int>
bad 300
good700
german %>% 
  count(credit_risk) %>% 
  mutate(perc = n / nrow(german))
A data.frame: 2 × 3
credit_risknperc
<fct><int><dbl>
bad 3000.3
good7000.7
Class.prop <- german %>% 
  count(credit_risk) %>% 
  mutate(perc = n / nrow(german)) 

Ici il faut être prudent, les classes ne sont pas équilibrées et, si une analyse ultérieure impliquant des modèles d’apprentissage statistique sera appliqué, la division des données en un ensemble d’apprentissage et un ensemble de test doit être effectuée à l’aide d’une méthode d’échantillonnage aléatoire stratifiée.

library(ggplot2)
options(repr.plot.width=10, repr.plot.height=6)
Class.prop %>%
 ggplot(aes(x=credit_risk,y= perc,fill=credit_risk))+
 geom_bar(stat="identity") +
 labs(title="Solvabilite des clients")
../../_images/4bf6de3dfe4ed10cdb3bd6e1bd8c6ad663a024cefc759637d6c026c042970700.png

Les variables numériques#

Pour recueillir l’information d’un ensemble de réponses, il faut utiliser le bon mécanisme d’agrégation. Pour estimer des quantités numériques, des techniques standard telles que le tracé de la distribution de fréquence et le calcul de statistiques sommaires sont appropriées. La moyenne et la médiane supposent implicitement que les erreurs sont distribuées de manière symétrique. Un rapide coup d’œil à la forme de la distribution permet généralement de confirmer ou de rejeter cette hypothèse.

La médiane est, en général, un choix plus approprié que la moyenne dans de tels problèmes d’agrégation. Elle réduit l’influence des valeurs aberrantes, ce qui est un problème particulier dans le cas d’expériences de masse où une certaine fraction de vos participants sont susceptibles d’être des abrutis.

Pour cela, nous allons analyser ce variables numérique en traçant, boxplot ou la densité pourchacune de ces varaibles numériques afin mieux comprendre certaines relations.

Âge#

summary(german$age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  19.00   27.00   33.00   35.54   42.00   75.00 

Traçons un graphique qui nous permet de comparer la médiane de l’âge sur les montants d’emprunt séparé les mauvais crédits vs de bons crédits;

Pour ce faire, nous devons nous baser sur un data frame en utilisant la fonction reshape2::melt(). Cette fonction prend une colonne de notre dataframe (dans ce cas credit_risk) et transforme cette cette colonne DEUX colonnes : Une colonne nommée variable et une colonne nommée valeur.

german %>%
    select(credit_risk, age) %>%
    head()
A data.frame: 6 × 2
credit_riskage
<fct><int>
1good21
2good36
3good23
4good39
5good38
6good48
german %>%
    select(credit_risk, age) %>%
    reshape2::melt()%>%
    head()
Using credit_risk as id variables
A data.frame: 6 × 3
credit_riskvariablevalue
<fct><fct><int>
1goodage21
2goodage36
3goodage23
4goodage39
5goodage38
6goodage48
german %>%
    select(credit_risk, age) %>%
    reshape2::melt()%>%
    ggplot(aes(x = variable, y = value, fill = credit_risk)) + 
      geom_boxplot() +
      xlab("credit risk") +
      ylab("Age")
Using credit_risk as id variables
../../_images/adb5a55497320d807670d2aaa8891540c67b475a4696956e21a57fc39883ed19.png

Durée et montant de crédit#

Regardons maintenant la durée des emprunts et le montant de crédit pour chcune des catégorie d’emprunt. Et comparons la densité de chacune de ces deux catégorie pour les deux variables.

À cette densité, nous y ajoutons la moyenne qui nous permet de comparer le mauvais risque par rapport au bon risque.

Pour ce faire, créons un data frame qui somarise la moyenne de ces deux mesures pour chacune des variable;

avg.duration <- german %>%
  select(duration, credit_risk) %>%
  group_by(credit_risk) %>%
  summarise(m=mean(duration))
avg.duration
A tibble: 2 × 2
credit_riskm
<fct><dbl>
bad 24.86000
good19.20714
avg.amount <- german %>%
  select(amount, credit_risk) %>%
  group_by(credit_risk) %>%
  summarise(m=mean(amount))

traçons maintenant les deux densité avec leurs moyennes respectives;

duration_p<-german%>% 
  ggplot(aes(duration))+
  geom_density(aes(fill=credit_risk),alpha=0.7) + 
  geom_vline(data=avg.duration,aes(xintercept= m , colour= credit_risk), lty = 4 ,size=2)+
  labs(title="Duree en mois groupes par solvabilite",            
       x="Duree",
       fill="Solvabilite")
Warning message:
“Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
 Please use `linewidth` instead.”
amount_p<-german%>% 
  ggplot(aes(amount))+
  geom_density(aes(fill=credit_risk),alpha=0.7) + 
  geom_vline(data=avg.amount,aes(xintercept= m , colour= credit_risk), lty = 4 ,size=2)+
  labs(title="Montant de credit en $ groupes par solvabilite",            
       x="Montant",
       fill="Solvabilite")
library(gridExtra)
Error in library(gridExtra): there is no package called ‘gridExtra’
Traceback:

1. library(gridExtra)
grid.arrange(duration_p,amount_p)
../../_images/e0539900b5685ee593c562cf76ef1f82475bed7be0f4b2e53afaf2251eb2bc8d.png

En traçant leur courbe de densité le long de la ligne verticale de leur valeur moyenne, nous observons que ni la durée en mois ni le montant du crédit ne sont normalement distribués. Les données ont tendance à présenter une distribution asymétrique, en particulier pour la variable Montant du crédit.

duration_bp<-german %>%
    select(duration, credit_risk) %>%
    reshape2::melt()%>%
    ggplot(aes(x = variable, y = value, fill = credit_risk)) + 
      geom_boxplot() +
      xlab("Solvabilite") +
      ylab("Duration")
Using credit_risk as id variables
montant_bp<-german %>%
    select(amount, credit_risk) %>%
    reshape2::melt()%>%
    ggplot(aes(x = variable, y = value, fill = credit_risk)) + 
      geom_boxplot() +
      xlab("credit risk") +
      ylab("Amount")
Using credit_risk as id variables
grid.arrange(duration_bp,montant_bp)
../../_images/e9ca085ba01a31faf27159d8cc03cf18de8725f633e3bbd2c5fbe17ad8fae237.png

La durée en mois ainsi que le montant du crédit, semblent montrer une valeur médiane plus élevée pour le mauvais risque par rapport au bon risque. De même, l’intervalle de ces deux variables est plus large pour les observations à mauvais risque que pour les bons.

Remboursement du prêt#

Cette variable possède 4 catégories; >= 35, 25 <= ... < 35, 20 <= ... < 25 et < 20.

table(german$installment_rate)
         >= 35 25 <= ... < 35 20 <= ... < 25           < 20 
           136            231            157            476 

Traços un diagramme en bâtons du remboursement groupé par les deux catégorie de solvabilité, soient le bon crédit et le mauvais crédit;

installment_rate_p<-german %>% 
  ggplot(aes(installment_rate, ..count..)) + 
  geom_bar(aes(fill=credit_risk), position ="dodge")+
  labs(title="Pourcentage du taux de remboursement groupé par solvabilité")
installment_rate_bp<-german %>%
    select(credit_risk, installment_rate, amount) %>%
    ggplot(aes(x=installment_rate, y=amount, fill=credit_risk)) + geom_boxplot()
grid.arrange(installment_rate_p,installment_rate_bp)
../../_images/d1504215a1c2f3658a95993b7b56507279bab0b27c0bf823bcc80dc25730bb52.png

Le diagramme en bâtons du taux de versement montre une différence significative entre les bons et les mauvais risques de crédit. Le nombre de bons dossiers semble être le double des mauvais dossiers. Le Box plot révèle que la valeur médiane des mauvais dossiers est plus élevée que celle des bons dossiers, même si les deux classes semblent avoir le même intervalle.

Nombre de crédits, Résidence et débiteurs#

number_credits_p<-german %>% 
  ggplot(aes(number_credits, ..count..)) + 
  geom_bar(aes(fill=credit_risk), position ="dodge")+
  labs(title="Credits existants groupés par solvabilité")

present_residence_p<-german %>% 
  ggplot(aes(present_residence, ..count..)) + 
  geom_bar(aes(fill=credit_risk), position ="dodge")+
  labs(title="Résidence actuelle groupés par solvabilité")

other_debtors_p<-german %>% 
  ggplot(aes(other_debtors, ..count..)) + 
  geom_bar(aes(fill=credit_risk), position ="dodge")+
  labs(title="Résidence actuelle groupés par solvabilité")
grid.arrange(number_credits_p,present_residence_p,other_debtors_p)
../../_images/0a4c70f3063eb5be094b8338336690f173317e87cd9907a45d71329b21b7b9af.png
number_credits_bp<-german %>%
    select(credit_risk, number_credits, amount) %>%
    ggplot(aes(x=number_credits, y=amount, fill=credit_risk)) + geom_boxplot()

present_residence_bp<-german %>%
    select(credit_risk, present_residence, amount) %>%
    ggplot(aes(x=present_residence, y=amount, fill=credit_risk)) + geom_boxplot()

other_debtors_bp<-german %>%
    select(credit_risk, other_debtors, amount) %>%
    ggplot(aes(x=other_debtors, y=amount, fill=credit_risk)) + geom_boxplot()
grid.arrange(number_credits_bp,present_residence_bp,other_debtors_bp)
../../_images/eb763fc56544160601b3c8e49001c88a20849f821fa07c6632c9b1f0cea67795.png

Variable catégorielles#

Exercices#

Faites une analyse de variable catégotrielles suivantes:

  1. Status

  2. Credit_history

  3. Purpose

ggplot(german, aes(status, ..count..)) + 
theme(axis.text.x = element_text(angle=65, vjust=0.6)) + 
  geom_bar(aes(fill = credit_risk), position = "dodge") +
  labs(title="bar plot", subtitle="Statut des comptes regroupés par solvabilité")
../../_images/bc1c96104d167a57271d6868e5923c79f08f9b73f5c5a648c392aedd99a57bf4.png
german %>% 
  ggplot(aes(credit_history, ..count..)) +
    theme(axis.text.x = element_text(angle=65, vjust=0.6)) + 
  geom_bar(aes(fill=credit_risk), position ="dodge") +
  labs(title="bar plot", subtitle="Antécédents de crédit regroupés par solvabilité")
../../_images/29aa1f24c491218f6dc5bc5906393ed3a96d9770f77a542cf19d3af474d43a15.png
german %>% 
  ggplot(aes(purpose)) +
  geom_bar(aes(fill=credit_risk), width = 0.5) + 
  theme(axis.text.x = element_text(angle=65, vjust=0.6)) + 
  labs(title="Histogram", 
       subtitle="Motif du crédit en fonction de la solvabilité",
       caption = "source: german credit data")
../../_images/6c2786f74c6a57f4597d8d86c0035e0b5c7e643b37afd9df705a087d1171bb09.png

L’asymétrie#

L’asymétrie est définie comme étant le troisième moment central normalisé. Vous pouvez facilement déterminer si une distribution est asymétrique par une simple visualisation. Il existe différentes façons de supprimer l’asymétrie, comme la transformation logarithmique, la racine carrée ou l’inverse. Cependant, il est souvent difficile de déterminer à partir des graphiques quelle transformation est la plus appropriée pour corriger l’asymétrie. La procédure de Box-Cox a identifié automatiquement une transformation de la famille des transformations de puissance qui sont indexées par un paramètre \(\lambda\).

Cette famille comprend :

  • la transformation logarithmique (\(\lambda=0\))

  • la transformation carrée (\(\lambda=2\))

  • racine carrée (\(\lambda=0.5\))

  • inverse (\(\lambda=-1\))

Nous avons utilisé la fonction preProcess() dans caret pour appliquer cette transformation en changeant l’argument méthode en BoxCox.

german.copy<-german
mySkew <- caret::preProcess(german.copy, method = c("BoxCox"))
mySkew
Created from 1000 samples and 21 variables

Pre-processing:
  - Box-Cox transformation (3)
  - ignored (18)

Lambda estimates for Box-Cox transformation:
0.1, -0.1, -0.7
mySkew$method
$BoxCox
  1. 'duration'
  2. 'amount'
  3. 'age'
$ignore
  1. 'status'
  2. 'credit_history'
  3. 'purpose'
  4. 'savings'
  5. 'employment_duration'
  6. 'installment_rate'
  7. 'personal_status_sex'
  8. 'other_debtors'
  9. 'present_residence'
  10. 'property'
  11. 'other_installment_plans'
  12. 'housing'
  13. 'number_credits'
  14. 'job'
  15. 'people_liable'
  16. 'telephone'
  17. 'foreign_worker'
  18. 'credit_risk'
german.copy %>% 
  ggplot(aes(x=amount)) + 
  geom_histogram(aes(y=..density..), 
                 binwidth=1000,
                 colour="black", fill="white") +
  geom_density(alpha=.5, fill="blue")
../../_images/55ea9d0eae91b0e27d3edabd098a0d56ee2f6a8fd74c146911d93beb32546f5b.png
myTransformed <- predict(mySkew, german.copy)
myTransformed %>% 
  ggplot(aes(x=amount)) + 
  geom_histogram(aes(y=..density..),
                 binwidth=.5,
                 colour="black", fill="white") +
  geom_density(alpha=.5, fill="blue")
../../_images/513100a8c04bf8e29f323acda2a0b7abfb4f876211fe17962649985e682ec52d.png