…
Une agence bancaire est un point de contact important entre les
clients et la banque. En plus de fournir des services bancaires
traditionnels tels que les dépôts, les retraits et les prêts, les
agences bancaires peuvent également jouer un rôle crucial dans la
gestion des relations avec les clients et la promotion des produits et
services bancaires.
Dans le contexte actuel, la majorité des firmes
importantes analyse la “data” et quel que soit le secteur (sport,
économique, social…). Les banques gèrent des données importantes sur les
clients, les transactions et les activités financières. La collecte,
l’analyse et l’utilisation de ces données peuvent fournir de précieuses
informations aux banques pour mieux comprendre les besoins de leurs
clients, leurs comportements, améliorer leur expérience utilisateur, et
à optimiser leurs opérations et leur rentabilité.
Les banques
utilisent ces données pour créer des modèles d’analyse prédictive qui
leur permettent d’anticiper les besoins des clients et de développer des
produits et des services personnalisés en conséquence.
Dans cette
étude, nous allons utiliser des techniques d’analyse multivariée
(analyses en composantes principales et classification) pour explorer
les relations entre les variables disponibles.
Lors de cette étude, nous allons essayer de comprendre et
expliqué en fonction de l’analyse de plusieurs variables les différences
similitude de clientèle dans les agences de la région PACA.
Ainsi,
cette étude sera accès sur un individu moyen (explication dans la partie
2.1) de chaque agence bancaire “Crédit Agricole” de la région PACA. Ce
choix permettra, les analyses statistiques de regroupé, de comparer, de
classifier, d’identifier des profils, et faire des hypothèses plus
facilement.
Afin d’effectuer une analyse multivariée répondant le plus justement
à l’objectif ci-dessus, j’ai pris la décision de supprimer quelques
variables et valeur (explication dans le points 2.1). J’ai aussi fait le
choix de prendre une base de données que je connais et où j’ai fait
plusieurs sae avec (explication dans la partie 1.1).
Enfin, j’ai
importé les données sur PHPGadmin (application Web réalisée en langage
PHP destinée à faciliter la gestion du SGBD PostgreSQL), et requêter les
données que j’avais besoin pour l’analyse.
J’ai choisi une base de données portant sur les banques et sa
clientèle puisque :
• J’ai toujours aimé le domaine des banques,
l’économie en général et analyser / comprendre leurs actions
• Dans
le monde professionnel, le secteur des banques recherche beaucoup de
“data Analystes” où ils peuvent être amener à faire ce type d’analyse,
ainsi, je me familiarise avec ces demandes qui pourraient m’arriver dans
le monde professionnel.
• Je connais bien cette base de données
puisque lorsque nos tuteurs nous laissent le choix de la base de données
je prends souvent celle-ci pour les raisons citée.
L’objectif de cette analyse multivariée est d’expliquer, comprendre
et trouvé des similitudes (à des fins décisionnelles) entre les banques
de la région paca en fonction de plusieurs variables (ancienneté,
catégorie socioprofessionnelle, …) pour que les décisions soient
optimales (pour les clients) et bénéfiques (pour la société).
Les
résultats de cette analyse pourraient aider les banques à améliorer et
optimiser leur compréhension des facteurs qui influencent la rentabilité
de leurs agences bancaires et à développer des stratégies pour améliorer
leurs performances.
La base est composée de 88 058 individus, et de 28 variables, donc
beaucoup trop d’individu et de variables.
Ainsi, avec l’accord de
mes tuteurs, nous avons pris la décision d’une part de faire un
“individu moyen” pour chaque agence bancaire et d’autre part de
supprimer des variables “inutiles” dans l’analyse pouvant fausser
certaines conclusions (plus d’explication dans la partie 2.1).
De
cette manière, la compréhension et la lisibilité seront beaucoup plus
simples.
Mais avant de commencer toute analyse, il me semble primordial de
comprendre le sujet.
Ainsi, je vous dans cette partie vous
présenter les principales données étudiées, leur définition, l’origine
de la base de données…
L’origine de la base de données:
Comme expliqué rapidement ci-dessus, notre professeur
Pierre-Michel Bousquet nous a transmis cette base de données pour un
autre projet. Elle fait partie d’un ensemble de données structurées et
organisées, sur les clients de l’entreprise “Crédit Agricole” s’appelant
« base_clts » datant du 31 janvier 2019.
Téléchargement des données :
https://guacamole.univ-avignon.fr/nextcloud/index.php/s/wZ9P3kop4dKqmAt
Definition des principales varialbles selon l’insee:
Le « age » est l’âge du client.
Le terme « li_regrp_csp » désigne la catégorie
professionnelle du client, ici il y en a 8: • Agriculteurs exploitants/
agr
• Artisants, commerçants et chefs d’entreprise / art
•
Autres personnes sans activité professionnelle / sans_act
• Cadres
et professions intellectuelles supérieures / cadres
• Employés /
employes
• Ouvriers / ouvrier
• Professions Intermédiaires /
prof_intermediaires
• Retraités / retraites
Le « classe risque » est indicateur du risque lié au client (16 niveaux).
Le « tp assurance » signifie si le clients oui (1) ou non (0) à une Assurance en cours.
Le « tp epargne » signifie si le clients oui (1) ou non (0) à une Epargne en cours.
Le « mt rentabilite » est le montant de rentabilité du client.
Le « mt epargne disponible » est le montant d’épargne disponible du client.
Le « identifiant » est le nombre de client dans l’agence.
Une fois ces étapes passée, l’analyse peut enfin commencer.
Après vous avoir présenté les principaux termes spécifiques de l’étude, nous allons vous présenter une première approche graphique des données afin d’appuyer votre compréhension et d’avancer petit à petit dans l’analyse.
Avant de pouvoir comparer et en entrer concrètement dans l’analyse,
nous devons procéder à quelques étapes.
En effet, mon jeu de
données est composé de 88 058 individus et de 28 variables. J’ai donc
dût réduire le nombre de variables (12 variable maximum) et le nombre
d’individus.
Ainsi, j’ai choisi les variables les plus permanentes
selon moi (celles-ci sont présentées plus en détaille dans la partie
1.4) et de créer un individu moyen pour chaque agence bancaire (donc
chaque agence a un individu qui a la moyenne de tous les clients de
cette banque pour chaque variable.), cependant en faisant un individu
moyen il est impossible de faire une ANOVA ce qui explique cette analyse
abscente dans ce compte rendu.
Par ailleurs, certaines variables
sont qualitatives, comme les catégories socio-professionnelles ou la
classe risque par exemple, cependant pour faire une analyse multivariée,
nous devons avoir que des variables quantitatives (des nombres). Pour
contourner ce problème, j’ai utilisé deux méthodes :
Pour a
premiere (pour la variable classe risque), j’ai dût remplacer chaque
categorie (A, B, C…) par des chiffres (1, 2, 3…), pour cette variables
cette méthode ne posé pas problème puisque (comme expliqué dans la
partie 1.4) je suis partie du postulat que chaque la différence entre
les classes sont équivalent (donc la classe 1 et 3 fois moins riqué que
la classe 3); Et vous avez donc compris que pour la variable des
catégories socioprofessionnelles, il fallait une autre méthode.
Ainsi, j’ai utilisé la méthode ACM. Disjonctif utilisable à partir du
packages ade4 qui permet de modifier une variable qualitative en
qualitative en créant chaque catégorie (ici ouvrier, agriculteur, …) en
variable a par entière, et il a un “1” dans la colonne qui convient a ça
csp et “0” pour les autres csp.
c=dbConnect(RPostgreSQL::PostgreSQL(),dbname="iut2203125")
query='SELECT * FROM "S4_enquete"."pred_variable"'
X <- dbGetQuery(c,query)
V = acm.disjonctif(data.frame(X$li_regrp_csp))
#dim(V)
#head(V,15)
colnames(V)=c("agr","art","sans_act","cadres","employes","ouvriers","prof_intermediaires","retraites")
X=data.frame(X[,-4],V)
X=na.omit(X)
gr=as.numeric(table(X$groupe))
Après avoir supprimé toutes les valeurs manquantes et une
agences abérrantes (“Agence directe” (qui par déduction devais être les
clients n’étant pas rattachés à une banque dans la région PACA)).
Nous obtenons ce tableau (dataframe), où chaque ligne représente une
agence et les valeurs sur cette ligne sont les moyennes des individus
reliés à cette agence. Pour la suite de l’analyse, je l’appellerais
l’individu ou individu moyen.
X=aggregate(X[,c(2,3,5,9,10,11,14,29,30,31,32,33,34,35,36)],list(X$groupe),mean)
X$identifiants=gr
rownames(X)=X[,1]
X=X[,-1]
X=X[-7,]#direct EXPLIQUER genre c internet
XX=X
#head(X,10)
Maintenant nous pouvons passer à l’analyse multivarié
Pour analyser le lien entre nos variables je choisis de faire un
tableau de corrélation.
Les corrélations sont des mesures
statistiques qui indiquent comment deux variables sont liées ou
associées entre elles. En d’autres termes, elles mesurent le degré de
relation entre deux variables.
Il existe différents types de
corrélations, mais l’une des plus courantes et celle que je vous
présenterais est la corrélation de Pearson, qui mesure la relation
linéaire entre deux variables. Elle varie de -1 à 1, où -1 indiquent une
relation négative parfaite (c’est-à-dire que lorsque la valeur d’une
variable augmente, la valeur de l’autre variable diminue), 1 indique une
relation positive parfaite (lorsque la valeur d’une variable augmente,
la valeur de l’autre variable augmente également), et 0 indique
l’absence de corrélation (c’est-à-dire que les variables ne sont pas
liées linéairement).
Cependant, il est important de noter que la
corrélation n’implique pas nécessairement une relation de cause à effet
entre les variables. Il est possible que les deux variables soient
influencées par un autre facteur commun ou que la corrélation soit
simplement une coïncidence.
Ainsi voici ce que nous obtenons avec
nos données (avec R)
corrplot(cor(X[,c(1,2,3,4,5,6,7)]), method = 'number', order = 'AOE', type = 'lower')
Dans notre cas notre tableau est un tableau à double. Si une case
reliant deux variables est supérieure à 70% alors on peut dire qu’il y a
un lien entre les deux variables. Si cette valeur dépasse 85% on peut
conclure qu’il y a une très grosse corrélation. Même cas avec les
valeurs négatives. Effectivement si une valeur est inférieure à -0.70
cela veut dire qu’il existe une corrélation significative négative.
Étant donné que cette corrélation est négative cela veut dire que plus
la variable 1 est grande plus la variable 2 est petite.
Ainsi, nous
remarquons rapidement qu’il y a une importante corrélation entre l’âge
et l’ancienneté de l’individu dans l’agence (0,90) et que le niveau de
risque de l’individu est corrélé négativement à l’ancienneté, l’age et
le montant de l’épargne disponible (-0,75; -0,72 et -0,73
respectivement).
Enfin, nous pouvons remarquer que le montant
d’épargne disponible de l’individu est corrélé à l’âge (0,79),
l’ancienneté mois (0,71) et à l’épargne. (0,73)
Pour le tableau
de corrélation avec sas, nous trouvons les mêmes valeurs.
Ce que
l’on peut ajouter est que l’on peut voire une importante corrélation
positive entre les retraités et l’age (logique), l’ancienneté mois, et
le montant d’épargne disponible.
Maintentant nous allons regarder
le résumé de chaque variables afin de faire des premières observations.
On va prendre un de nos résultats trouvé sur SAS.
N’oublions pas que l’analyse
ce fais sur les individu moyen de chaque agence. Ce graphique nous
permier deja de tirer quelque affirmation.
Premièrement, lorsqu’on
regarde la derniere variable “identifiants” nous remarquons une enorme
différnece entre le l’agence ayant le moins de clients et celle ayant le
plus de clients.
Ensuite, nous pouvons remarqué pour la variable
“montant rentabilité” il y prés de 80 € de difference entre le minimum
et maximum (oublions pas que c’est sur les individu moyens donc
approximativement chaque clients d’une agences gagne 282€ alors qu’une
autre gagne 205€) et que la mediane est plus faible que la moyenne et
est d’environ 230€ ce qui signifie que les clients etant dans l’agence
ayant 282 € de montant de rentabilité est bien supérieur à la
moyenne.
On peut aussi tirer la meme conclusion pour le montant
disponible. Enfin on peut remarqué qu’en générale les clients de
n’importe qu’elle agence ne sont pas assuré (0,36) et on une
épargne(0,84)
v=as.matrix(X)
X=v
XX=X
############################################################################
#
# - entree : X (ne doit contenir que des nombres)
# - pas besoin de centrer-reduire le fichier. C'est fait ci-dessous.
# - genere un fichier 'cor_var_init_cp.csv' sur le repertoire de travail
#
############################################################################
X=as.matrix(X)
if (sum(ls()=="L")==0) L=2
n=nrow(X)
p=ncol(X)
X=scale(X)
V=cor(X)
d=eigen(V,symmetric=T)
# all equal
for (j in 1:p) d$vectors[,j]=ifelse(d$vectors[1,j]>0,1,-1)*d$vectors[,j]
cp=X%*% d$vectors
colnames(cp)=paste("cp",1:p,sep="")
contributions=d$values
Dans l’ACP, l’objectif est de réduire la dimensionnalité d’un
ensemble de variables corrélées en créant de nouvelles variables non
corrélées appelées composantes principales. Ces composantes principales
expliquent la plupart de la variabilité des données initiales.
Pour continuer l’analyse nous devons centrer et réduire nos
données afin d’éliminer toutes les unités de mesures. Le centrage et la
réduction de données sont des techniques couramment utilisées en
statistique pour normaliser les données. Le centrage consiste à
soustraire la moyenne de chaque variable de la base de données, tandis
que la réduction consiste à diviser chaque variable par son écart type
(ce qui deviens le centrage reduction et on parle de donnée
centrée-réduite) . L’objectif principal de la normalisation des données
est de rendre les variables comparables et de minimiser l’impact des
écarts de mesure entre les variables.
La normalisation des données
peut être utile pour plusieurs raisons. Tout d’abord, cela peut
permettre de faciliter la comparaison des variables entre elles en leur
donnant des échelles comparables. Cela peut également faciliter
l’interprétation des coefficients dans les modèles statistiques en
réduisant les problèmes de colinéarité et en augmentant la stabilité des
estimations. Enfin, cela peut améliorer l’efficacité de certaines
techniques statistiques, comme la classification ou la régression, en
réduisant la complexité des données.
En somme, la normalisation des
données permet de faciliter l’analyse statistique en éliminant les biais
potentiels causés par les différences d’échelle entre les variables, ce
qui permet de mieux interpréter les résultats et de prendre des
décisions plus éclairées. Pour centrée reduire les données j’ai utilisé
la fonction “scale”.
Plus concretment il faut soustraire la moyenne
de la variable (colonne) à la valeur de la case puis la diviser par
l’écart-type de la colonne.
Pour vérifier notre calcul on regarde
que la moyenne de chaque variable soit 0 et que l’écart-type de chaque
variable vaut 1.
apply(X,2,mean)
## age anciennete_mois classe_risque
## 1.695053e-15 -5.275684e-16 2.805368e-16
## mt_rentabilite mt_epargne_disponible tp_assurance
## -6.469610e-16 8.376977e-17 -6.525520e-16
## tp_epargne agr art
## 1.122246e-15 3.058622e-17 -4.051986e-17
## sans_act cadres employes
## 3.904827e-16 1.706651e-16 2.880872e-16
## ouvriers prof_intermediaires retraites
## -7.166576e-17 3.406204e-16 -2.093126e-16
## identifiants
## 2.900314e-17
apply(X,2,sd)
## age anciennete_mois classe_risque
## 1 1 1
## mt_rentabilite mt_epargne_disponible tp_assurance
## 1 1 1
## tp_epargne agr art
## 1 1 1
## sans_act cadres employes
## 1 1 1
## ouvriers prof_intermediaires retraites
## 1 1 1
## identifiants
## 1
Donc c’est bon, et nous pouvons continuer l’analyse.
Dans
ce contexte, une “supervariable” est une une Composantes Principales
lorsque sa variance est supérieure à 1 car on sait que les variances
initiales ont une variance de 1, puisqu’elles sont centrées et réduites
autrement dit une supervariables et une “variable” resumant plus que
seulement elle.
g=barplot(contributions,main="Graphique des contributions",
names.arg=round(contributions,2),col=rainbow(p),cex.names = 0.8)
text(g,contributions,paste(round(100*contributions/p),"%"),pos=3,cex=0.8,xpd=NA)
abline(v=3.7,lty=2)
Ce graphique nous permet d’avoir une visualisation sur les
composantes principales et de voir leurs contributions.
Ainsi, Il
nous permet donc de savoir avec quelles composantes principales nous
pouvons analyser Ici, je prends toutes les composantes principale qui
résume plus qu’une variable (on a cette information en abscisse, par
exemple, la 3ème variable représente 1,77 fois plus que la variable
initiale.).
Ainsi, on retient les 3 premières composantes
principales (jusqu’au trait en pointillé), qui contiennent environ 79 %
de l’information initiale (49+19+11=79).
On regarde ensuite le
tableau des corrélations entre les variables initiales et les
composantes principales. Ce tableau se lit de la même façon que la
matrice des corrélations. Sauf qu’ici on regarde le lien entre les
variables initiale et les CP. On retient souvent comme pour la matrice
de corrélation les valeurs supérieures à 0.70 ou inférieure à -0.70.
cor_var_init_cp= d$vectors %*% diag(sqrt(d$values))
rownames(cor_var_init_cp)=colnames(X)
colnames(cor_var_init_cp)=paste("cp",1:p,sep="")
data.frame(round(cor_var_init_cp,2))[1:5]
## cp1 cp2 cp3 cp4 cp5
## age 0.91 0.17 0.04 0.19 0.16
## anciennete_mois 0.96 -0.13 0.11 0.04 0.01
## classe_risque -0.73 -0.24 -0.54 -0.04 0.16
## mt_rentabilite -0.47 0.36 -0.66 0.20 0.07
## mt_epargne_disponible 0.81 0.51 -0.04 -0.03 -0.16
## tp_assurance -0.67 0.05 -0.29 -0.45 0.08
## tp_epargne 0.69 0.15 -0.13 -0.42 -0.50
## agr 0.82 -0.13 -0.26 -0.05 0.05
## art 0.85 0.20 -0.11 -0.14 0.17
## sans_act -0.44 -0.66 -0.39 0.14 -0.34
## cadres -0.58 0.64 -0.04 0.29 -0.28
## employes -0.70 0.36 0.28 -0.39 0.19
## ouvriers 0.37 -0.86 0.05 0.02 0.12
## prof_intermediaires -0.59 0.50 0.51 0.14 0.01
## retraites 0.88 0.20 -0.17 0.06 0.09
## identifiants -0.32 -0.62 0.57 0.00 -0.14
La composante principale, qui représente près de la moitié de
l’information totale (49 %), est une opposition entre : Le groupe de
variable : age, ancienneté mois, montant épargne, agriculteur, artisans,
épargne en cours (on acceptera ici la valeur 0,69.) et la classe risque.
La 2 eme composante principale qui représente 19 % de l’information
totale, la variable sans activité est négativement corrèle
significativement (on accepte la valeur -0,66, limite du seuil -0,70,
cette variable étant la seule à apparaître presque significative sur
cette composante.).
Enfin pour la dernière et 3 eme composante qui
représente 11 % de l’information totale, comme pour la composante 2 nous
acceptons la variable montant rentabilité puisque c’est la seule
variable “proche” du seuil.
Nous obtenons les mêmes résultats sur
sas (voire en annexe)
Afin de mieux visualiser les variables initiales représentées
par les supervariables nous avons décidé de réaliser le graphique
ci-dessous.
#plot(cor_var_init_cp)
#arrows(0,0,cor_var_init_cp[,1]*L,cor_var_init_cp[,2]*L,col="red",length=0.1)
#text(cor_var_init_cp[,1]*L*1.1,cor_var_init_cp[,2]*L*1.1,colnames(X),cex=0.8,col="red",xpd=NA)
plot(cor_var_init_cp[,1],cor_var_init_cp[,2],asp=1,main="Cercle des correlations",xlim=c(-1,1),ylim=c(-1,1),xlab="cp1",ylab="cp2")
abline(h=0,v=0)
symbols(0,0,circles=c(1),add=TRUE,inches=FALSE)
symbols(0,0,circles=c(0.70),add=TRUE,inches=FALSE)
arrows(0,0,cor_var_init_cp[,1],cor_var_init_cp[,2],col="red",length=0.1)
text(cor_var_init_cp[,1]*1.1,cor_var_init_cp[,2]*1.15,colnames(X),cex=0.8,col="red",xpd=NA)
text(x=1, y=-0.5, "2")
text(x=0.6, y=-0.5, "1")
Ainsi, ce graphique concerne la composantes principales 1 et
composantes principales 2, resumant de maniere graphique ce que j’ai
resumé ci dessus.
Ce qui faut regardé ici sont les variables entre
le cercle 1 et 2 (variables corrélées a la cp en fonction de l’axe) Nous
voyons donc que la variable agr (agriculteur) et ancienneté années on
exactement le meme comportement (c’est à dire extremement corréle à la
cp 1 et moyennes à la cp 2) contrairement au montant épargen disponible
et classe risque.
Nous pouvons faire cela pour toute les
combinaison de cp (1/3 et 2/3) mais cela redit ce que j’ai expliqué ci
dessus donc voit pouvais retrouver les autres representation en annexe.
Les représentations qui suivent nous permettent d’avoir une première
idée des tendances et des caractéristiques des agences.
Les
interprétations pour les cp 2 et cp 3, ne sont pas nécessairement
vérifié puisque (comme présenté ci-dessus) l’explication de celle-ci
reste faible et on été prises par défaut (Puisqu’elles sont inférieures
au seuil : 0,70).
plot(cp[,1],cp[,2],
xlab=paste("CP 1 - ",round(100*contributions[1]/p,2)," %",sep=""),
ylab=paste("CP 2 - ",round(100*contributions[2]/p,2)," %",sep=""),asp=1)
abline(h=0,v=0)
# symbols(0,0,circles=c(1),add=TRUE,inches=FALSE)
text(cp[,1],cp[,2],rownames(X),pos=3,cex=0.7,xpd=NA)
#text(x=0,y=4, labels="text",col="blue", cex=4)
#mtext(c("Magic function"), side=3)
mtext("+ Age", side = 4, line =0 , cex = .5)
mtext("+ Ancienneté mois", side = 4, line =.5 , cex = .5)
mtext("+ montant épargne dispo", side = 4, line =1 , cex = .5)
mtext("+ agriculteur/ artisant", side = 4, line =1.5 , cex = .5)
mtext("+ épargne en cours", side = 4, line =2.5 , cex = .5)
mtext("- classe risque", side = 4, line =2 , cex = .5)
mtext("- Age", side = 2, line =0 , cex = .5)
mtext("- Ancienneté mois", side = 2, line =.5 , cex = .5)
mtext("- montant épargne dispo", side = 2, line =1 , cex = .5)
mtext("- agriculteur/ artisant", side = 2, line =1.5 , cex = .5)
mtext("- épargne en cours", side = 4, line =2.5 , cex = .5)
mtext("+ classe risque", side = 2, line =2 , cex = .5)
mtext("- sans activité", side = 3, line =.5 , cex = .5)
mtext("+ sans activité", side = 1, line =1.5 , cex = .5)
Ainsi, sur cette représentation montrant la composante principale 1
en abscisse et la composante principale 2 en ordonnées, nous pouvons
affirmer que dans l’agence d’EMBRUN l’individu moyen et l’individu ayant
l’âge, l’ancienneté, montant épargne disponible, agriculteur, artisans
et client en activité (pas/peu de sans-emploi) le plus importante, mais
la classe risque la plus faible. Inversement pour l’agence MARSEILLE
RÉPUBLIQUE.
On peut aussi prendre l’exemple de l’agence de
CAVAILLON où l’individu moyen et dans la moyenne pour la composante 1
(age, ancienneté, montant épargne disponible, …) cependant, c’est
l’agence ayant le plus de clients sans activité contrairement à l’agence
de MARTIGUES.
plot(cp[,1],cp[,3],
xlab=paste("CP 1 - ",round(100*contributions[1]/p,2)," %",sep=""),
ylab=paste("CP 3 - ",round(100*contributions[3]/p,2)," %",sep=""),asp=1)
abline(h=0,v=0)
# symbols(0,0,circles=c(1),add=TRUE,inches=FALSE)
text(cp[,1],cp[,3],rownames(X),pos=3,cex=0.7,xpd=NA)
mtext("+ Age", side = 4, line =0 , cex = .5)
mtext("+ Ancienneté mois", side = 4, line =.5 , cex = .5)
mtext("+ montant épargne dispo", side = 4, line =1 , cex = .5)
mtext("+ agriculteur/ artisant", side = 4, line =1.5 , cex = .5)
mtext("+ épargne en cours", side = 4, line =2.5 , cex = .5)
mtext("- classe risque", side = 4, line =2 , cex = .5)
mtext("- Age", side = 2, line =0 , cex = .5)
mtext("- Ancienneté mois", side = 2, line =.5 , cex = .5)
mtext("- montant épargne dispo", side = 2, line =1 , cex = .5)
mtext("- agriculteur/ artisant", side = 2, line =1.5 , cex = .5)
mtext("- épargne en cours", side = 4, line =2.5 , cex = .5)
mtext("+ classe risque", side = 2, line =2 , cex = .5)
mtext("- montant rentabilité", side = 3, line =.5 , cex = .5)
mtext("+ montant rentabilité", side = 1, line =1.5 , cex = .5)
Sur cette représentation montrant la composante principale 1 en
abscisse et la composante principale 3 en ordonnées, nous pouvons dire
que dans l’agence de MARSEILLE RÉPUBLIQUE l’individu moyen est
l’individu ayant l’âge, l’ancienneté, montant épargne disponible,
agriculteur, artisans le plus faible, mais la classe risque et le
montant rentabilité le plus importante.
On peut aussi dire que dans
l’agence de MARIGNANE l’individu moyen présente l’age, l’ancienneté,
montant épargne disponible, agriculteur, artisan moyen, mais un montant
rentabilité le plus faible.
plot(cp[,2],cp[,3],
xlab=paste("CP 2 - ",round(100*contributions[2]/p,2)," %",sep=""),
ylab=paste("CP 3 - ",round(100*contributions[3]/p,2)," %",sep=""),asp=1)
abline(h=0,v=0)
# symbols(0,0,circles=c(1),add=TRUE,inches=FALSE)
text(cp[,2],cp[,3],rownames(X),pos=3,cex=0.7,xpd=NA)
mtext("- montant rentabilité", side = 3, line =.5 , cex = .5)
mtext("+ montant rentabilité", side = 1, line =1.5 , cex = .5)
mtext("+ sans activité", side = 2, line =1.5 , cex = .5)
mtext("- sans activité", side = 4, line =0.5 , cex = .5)
Enfin sur le dernier graphique représentant la composante
principale 2 en abscisse et la composante principale 3 en ordonnées,
nous pouvons remarquer de manière générale que les agences sont beaucoup
plus concentré au niveau du centre. Nous pouvons dire que dans l’agence
de CARPENTRAS et de CAVAILLON, le montant de rentabilité de l’individu
est moyen, cependant, ce sont les agences ayant le plus de clients sans
activité / sans emploi.
On peut aussi dire que dans l’agence
d’ARLES LICES l’individu moyen est dans la moyenne au niveau de
l’emploi, cependant sont la montante rentabilité est très important,
contrairement à l’individu moyen de l’agence de PAYS D’AIX.
Ces graphiques nous on permis dors et déjà de remarqué quelques agences “hors normes” et de remarque des tendances et des possibilités de regroupement (agence à Marseille ensemble par exemple).
La classification est une méthode couramment utilisée en analyse
multivariée pour regrouper des observations similaires dans des groupes
distincts appelés classes. Cette technique est particulièrement utile
lorsqu’il y a une grande quantité de données et que la recherche de
structures ou de relations entre les variables devient difficile. La
classification peut aider à réduire la complexité des données et à mieux
comprendre les relations entre les variables.
Pour faire une bonne classification il faut surtout choisir le bon
nombre de classes. Pour cela j’ai fais le choix de faire plusieurs
representation graphique pour etre sur de mon choix
La premiere
representation graphique (graphique en arbre) est uen représentation au
purement au juger de la personne (une personne vera 3 classe et l’autre
6,…)
X=scale(X)
# Verif : nouvelles moyennes et nouveaux ecarts-type
#apply(X,2,mean)
#apply(X,2,sd)
res.hc <- eclust(X, "hclust", k = 3,
method = "ward.D2", graph = F)
fviz_dend(res.hc, rect =F, show_labels = F, cex = 0.5)
Sur ce graphique, nous pouvons remarquer assez facilement que le
nombre de classe optimale est 3 (représente par les couleurs.).
En
effet, tous les sauts entre les agences avais une distance faible
(valeur en ordonnée), cependant la liaison 34 à 35 (liaison du bloc vert
et du bloc bleu), nous remarquons une importante distance.
Nous
pouvons voir ci-dessous une représentation graphique des classes (avec
les agences associées à ça classe), entourés en pointillé.
fviz_dend(res.hc, rect = TRUE, show_labels = TRUE, cex = 0.5)
Afin d’être sur du nombre de classes choisi, nous allons regarder
plus précisément la distance annulée par la fusion des agences/groupes.
cah = hclust(dist(X),method = "ward.D2")
plot(rev(cah$height),type="b")
Sur cette representation (graphique du coudes), nous pouvons
trouver en abcisses le nombres de classes et en ordonnées les sauts
(autrement la distance annulé par la fusion de 2 classes).
Ici
l’objectif est de localiser à quel moment le saut est trop important et
signifie donc le nombre de classes optimale.
plot(rev(cah$height),type="b")
plot(rev(cah$height)[1:20],type="b")
Dans cette partie nous allons analyser les principales mesures
des classes
#---------------------------------
# choix du nombre de classes et classification
#--------------------------------
q=3
classif=cutree(cah,q)
# afficher les villes par classe
#sort(classif)
#---------------------------------
# Profil classes : 1. analyse spatiale (dispersion classes)
#---------------------------------
# Effectifs des classes
# Variances des Ecarts-type des classes
n=length(classif)
variance_totale=sum(diag(var(X)))*(n-1)/n
variances_classes=rep(0,q)
for (k in 1:q) {
n=sum(classif==k)
variances_classes[k] = sum(diag(var(X[classif==k,])))*(n-1)/n
}
#round(variances_classes,2)
#round(variance_totale,2)
# et donc ecarts-type des classes
round(sqrt(variances_classes),2)
## [1] 3.02 2.58 2.91
round(sqrt(variance_totale),2)
## [1] 3.95
Ici sont représenté les écart-type des classe, autrement dit la
distance intra-classes. Par exemple, 3,02 est la dispersion des agences
de la classe 1 et ainsi de suite. La valeur 3,95 est la dispersion de
toutes les agences.
Nous pouvons dire que les écart-types ne sont
pas aberrants et il n’y pas de classes qui sortent du lot (au maximum
une différence d’environ 0,40).
### Distances inter-classes (sur centres de gravite)
# i. calcul des individus moyens (= moyennes, centres de gravite, centroids)
moyennes=aggregate(X,list(classif),mean)[,-1]
#round(moyennes,2)
# ii. matrice des distances entre individus moyens
round(dist(moyennes),2)
## 1 2
## 2 7.55
## 3 4.38 4.34
Ici, est représentée la distance entre chaque classe (autrement
dit la distance inter-classe.). Le calcul a pris pour base la moyenne
des points de chaque classe et les a comparées.
Par exemple, la
distance entre la classes 1 et 2 est de 7,55. Ce qu’on peut retenir de
ces distances est que la classe 3 est “entre” la classe 1 d’un côté et
la classe 2 de l’autre (puisque la distance est similaire entre la
classe 1, 3 et 2, 3, mais 1,2 et la plus grande distance).
barplot(table(classif), main="nombre d'agences dans chaque classes", xlab="classe", ylab="effectif", col = c("black", "red", "green"))
Enfin, ce graphique en barres verticale nous permet de savoir le
nombre d’agences dans chaque classe. Cette information est très
importante puisqu’une classe peut avoir une agence et cela peut fausser
notre analyse (agence aberrante à supprimer).
Dans notre cas, nous
voyons qu’en général il n’y a pas de classe qui est aberrante (juste une
importante représentation de la classe 3).
Dans cette 4eme et dernière partie de l’analyse, nous allons
essayer de définir quel type d’individu sont dans les différentes
classes grâce à des représentations graphiques.
La première représentation graphique (barplot/barres
verticales), nous donne une vue d’ensemble de chaque variable dans les
différentes classes.
XX %>%
scale() -> arrest.scale
arrest.scale %>%
get_dist(upper = TRUE, diag = TRUE) -> arrest.dist
km.arrest <- kmeans(arrest.scale, centers = 3, nstart = 25)
centers<-as.data.frame(km.arrest$centers)
centers$cluster <- c("classe 1","classe 3","classe 2")
centers %>%
gather(type, value, -cluster) %>%
ggplot() +
geom_bar(aes(x = type, y = value, fill = type), position = "dodge", stat = "identity", colour = "black") +
facet_wrap(~cluster) +
theme_classic() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
theme(legend.position = "none")
Ainsi, nous remarquons 3 ayant des représentations totalement
différentes.
En effet, la classe 1 et 2 sont les 2 opposés sur
chaque variable (par exemple, dans la classe 1 les variables ages,
agriculteur, ancienneté mois et artisans sont très peu représente alors
que la classe 2, ils sont très bien représentés…).
Ici, vais vous présenter le “profil des classes”. Cette
représentation en lignes synthétise les mêmes informations que le
graphique en barres verticale.
#---------------------------------
# Profil classes : 2. individus moyens
#---------------------------------
# graphique general
#profil classe
matplot(t(moyennes),type = "b")
abline(h=0)
abline(h=c(-1,1),lty=2)
text(1:ncol(X),max(moyennes)*1.1,colnames(X),xpd=NA,srt=-20)
Ainsi, nous tirons les mêmes conclusions que pour le graphique en
barres verticale.
Ce dernier groupe de graphique (boxplot/boite à
moustache) permet d’avoir une visualisation plus précise (valeur
extrême, médiane, borne inférieure est supérieur, répartition…) de
chaque classe en fonction des variables.
par(mfrow=c(2,4))
for (j in 1:ncol(X)){
boxplot(X[,j]~classif, main=colnames(X)[j])
abline(h=0)
abline(h=c(-1,1),lty=2)
}
j=1
Ces résultats sont cohérents avec les affirmations faites dans
la partie 3.2 et nous, on permit d’identifier quel genre d’agences (et
donc de clients) a ton à faire dans chaque classe :
• La classe 1
represente l’agence où les clients plutôt jeunes, majoritairement actif,
voulant faire fructifier leur argent, ayant une assurance
•La
classe 2 représente l’agence où à l’inverse les clients plutôt agées
(retraités), fidèle à l’agences/banque, ce reposant sur l’argent
engrangé (épargne) dans leur vie (donc pas d’assurance et de volonté de
faire fructifier leur argent)
• La classe 3 représente l’agence où
les clients sans caractéristique particulière, autrement dit, ce sont
les agences ayant des clients “sans objectif”.
Dans cette partie nous allons faire une synthèse des observation
est relevé les elements à retenir,
Dans cette partie nous verrons des representations obtenu à partir de l’acp et de la classification.
km.res <- eclust(X, "hclust", k = 3,
nstart = 25, graph = FALSE)
h=fviz_cluster(km.res, frame.type = "norm", frame.level = 0.77)
h+
scale_colour_manual(values = c("black", "red", "green")) +
scale_fill_manual(values = c("black", "red", "lightgreen")) +
theme_minimal()
Ainsi, nous obtenons cette représentation pour la composante
principale 1 et la composante principales 2. Nous remarquons clairement
que les 3 classes sont démarquées, la partie gauche par la classe 1
(donc les agences ayant des clients plutôt jeunes, actifs, …), sont des
agences dans de grandes villes ou alentour de celle-ci (Marseille, Aix,
Ciotat, …) la partie du milieu par la classe 3 (donc les agences sans
caractéristique), sont des agences de ville ou petite ville (Avignon,
Cavaillon, Orange) et enfin la partie droite par la classe 2 (donc les
agences ayant des clients plutôt agés, qui ont une épargne, …) dans des
villes plus petite (ou similaire) et à tendance de villes calme.
Nous remarquons aussi que cercle rouge (regroupant toutes les agences de
la classe 2) est le plus petit que les autres, ce qui pourrait signifier
que par exemple une offre pour ces agences, les clients aurait
approximative le même comportement (contrairement aux deux autres
classes).
col=classif
clusplot(X, classif, label = 2, col.p = col, col.clus = c("black","red","green"),xlab = "composantes principales 1", ylab = "composantes principales 3", s.x.2d=list(x=cp[, c(1,3)],labs=rownames(X), var.dec=NA))
legend("bottomright",c("classe 1", "classe2", "classe 3"),pch=19, col=c("black","red","green"), text.col=c("black","red","green"))
Ainsi, nous obtenons cette représentation pour la composante
principale 1 et la composante principales 3.
Ici, nous remarquons
encore une tendance de démarcation, cependant elle est plus légère que
sur le graphique ci-dessus. Nous voyons que certaines l’agence s’écarte
de leurs classes (Marseille République pour la classe 1, Avignon
République et Arles Lices pour la classe 3, Briançon Sainte-Catherine).
Ces observations sont dues à des informations que nous ne pouvons savoir
avec les données que nous avons. (peut etre une organisation
differentes, une fermeture de l’agences qui a dut arrêter leur gestion,
une licenciement,…)
J’ai fait le choix de ne pas représenter pour la composante
principale 2 et la composante principales 3, puisque la lecture était
très difficile et nous ne pouvais tirer des conclusions dessus.
Pour conclure cette analyse, nous avons dû passer par plusieurs
étapes pour pouvoir commencer l’analyse (création individu moyen,
conversion variable qualitative en quantitatives, …).
Ensuite, nous
sommes passées à la corrélation entre les variables afin de comprendre
dors et déjà quelques variables reliées naturellement (variable retraité
avec l’âge, age avec ancienneté mois ou plus complexe, mais logique
comme retraités et épargne ou jeunes et assurances, …). Cependant, le
problème est que nous ne savons pas quelle agence il faut mettre cette
campagne en place.
Cette première partie peut déjà entre
décisionnelle, puisque prenons pour exemple que la banque veut faire une
campagne de publicité pour promouvoir leur assurance, mais veulent faire
passer cela sous forme d’exclusivité pour une tranche d’âge. Grâce à ces
explications, la direction sera que les personnes jeunes sont plus
consommateurs des assurances que les personnes âgées.
Ensuite, nous
avons créé des “super variables” qui nous ont permis de localiser les
agences où les clients sont plus des jeunes, actifs, … (Marseille) que
des personnes âgées sans assurances,…(Embrun)
La encore cela peux
être décisionnel cependant plus coûteux puisque l’analyse est au cas par
cas.
Alors pour lier les deux (la précision et la décision) nous
avons fait une classification ayant pour but de regroupé les agences
similaires ensemble. Grace a cette méthode nous somme passer (en quelque
sortes) de 37 agences en 3 classes d’agences avec leur caractéristique
chacune.
Ainsi, cela nous a permis de caractériser des groupes
d’agences en agences plutôt de jeunes (agences de la classe 1, volonté
de fructifiés leurs argents) ou agé (classe 2 ayant une épargne et
“fait” de l’argent avant. ) ou neutre (classe 3 sans “objectif”
concrètement.).
Maintenant, les décisions seront plus précises,
moins coûteuses, optimales, rentables (pour la banque/agences et pour
les clients, …).
SCRIPT SAS
#script sass
#%web_drop_table(BASE);
#FILENAME REFFILEE '/home/u62403666/data (5).csv';
#PROC IMPORT DATAFILE=REFFILEE
# DBMS=CSV
# OUT=BASEE;
# GETNAMES=YES;
# delimiter=",";
#RUN;
#PROC CONTENTS DATA=BASEE;
#RUN;
#proc standard data=BASEE;
#run;
#PROC STANDARD DATA=BASEE
# OUT=BASESTANDART (label="Id") mean=0 std=1;
# var age anciennete_mois classe_risque mt_rentabilite mt_epargne_disponible tp_assurance tp_epargne agr art sans_act #cadres employes ouvriers prof_intermediaires retraites identifiants;
#RUN;
#proc print data=BASEE;
#run;
#proc univariate data=BASEE noprint;
# var age anciennete_mois classe_risque mt_rentabilite mt_epargne_disponible tp_assurance tp_epargne agr art sans_act #cadres employes ouvriers prof_intermediaires retraites identifiants;
#output out= outliers pctlpre=lo pctlpre=1,99.5,99.9;
#run;
#/* erreur normale puisuq'il n'y a pas de valeur aberrantes*/
#proc corr data=BASEE;
# var age anciennete_mois classe_risque mt_rentabilite mt_epargne_disponible tp_assurance tp_epargne agr art sans_act #cadres employes ouvriers prof_intermediaires retraites identifiants;
#run;
#proc princomp data= BASEE out= ACPCIC prefix=ACP OUTSTAT=ACPCIC2 PLOTS=PATTERN (VECTOR);
# var age anciennete_mois classe_risque mt_rentabilite mt_epargne_disponible tp_assurance tp_epargne agr art sans_act #cadres employes ouvriers prof_intermediaires retraites identifiants;
#run;
#proc cluster data=BASESTANDART(label="Id")
# method=ward ccc
# outtree=tree;
#run;
#proc tree
# data=tree
# n=4
# out=tree_out;
#run;
#proc print data=ACPCIC;
#title "coordinates and quality of representation of individuals on the axes";
#run;
#proc print data=ACPCIC2;
#run;
#PROC GPLOT DATA=ACPCIC;
#PLOT ACP2*ACP1=ID_VINE_LEAF / frame href=0 vref=0;
#symbol1 i=none c=red v=dot h=2;symbol2 i=none c=blue v=star h=2;
#run;
CERCLE DE CORRELATION CP1 ET CP3
CERCLE DE CORRELATION CP2 ET CP3
GRAPHIQUE EN ARBRE
TABLEAU
ANALYSE DISTANCE MINIMALE
TABLEAU DES CP
: