Exploration de données d'enquête en : explication du seuil de revenu

Résumé

Analyse de données extraites d'un recensement aux USA de 1994. Préparation des données, exploration élémentaire et multidimensionnelle (ACP, AFCM), classification non supervisée. L'objectif est de préparer l'étape suivante consistant à modéliser / prévoir le niveau de revenu.

Introduction

Des données publiques disponibles sur le site UCI repository sont extraites de la base de données issue du recensement réalisé aux Etats Unis en 1994. Ces données son largement utilisées et font référence comme outil de benchmark pour comparer les performances de méthodes d’apprentissage ou modélisation statistique. L’objectif est alors de prévoir la variable binaire « revenu annuel » supérieur ou inférieur à 50k$. Le travail décrit dans ce document est un préalable, il propose une exploration des données pour en appréhender les grandes structures. Il ne s’agit pas encore de données massives mais 32.561 individus sont décrits par les 14 variables du tableau ci-dessous :

Num Libellé Ensemble de valeurs
1 Age real
2 workClass Private, Self-emp-not-inc, Self-emp-inc, Federal-gov, Local-gov, State-gov, Without-pay, Never-worked
3 fnlwgt real
4 education Bachelors, Some-college, 11th, HS-grad, Prof-school, Assoc-acdm, Assoc-voc, 9th, 7th-8th, 12th, Masters, 1st-4th, 10th, Doctorate, 5th-6th, Preschool
5 educNum integer
6 mariStat Married-civ-spouse, Divorced, Never-married, Separated, Widowed, Married-spouse-absent, Married-AF-spouse
7 occup Tech-support, Craft-repair, Other-service, Sales, Exec-managerial, Prof-specialty, Handlers-cleaners, Machine-op-inspct, Adm-clerical, Farming-fishing, Transport-moving, Priv-house-serv, Protective-serv, Armed-Forces
8 relationship Wife, Own-child, Husband, Not-in-family, Other-relative, Unmarried
9 origEthn White, Asian-Pac-Islander, Amer-Indian-Eskimo, Other, Black
10 sex Female, Male
11 capitalGain real
12 capitalLoss real
13 hoursWeek real
14 nativCountry United-States, Cambodia, England, Puerto-Rico, Canada, Germany, Outlying-US(Guam-USVI-etc), India, Japan, Greece, South, China, Cuba, Iran, Honduras, Philippines, Italy, Poland, Jamaica, Vietnam, Mexico, Portugal, Ireland, France, Dominican-Republic, Laos, Ecuador, Taiwan, Haiti, Columbia, Hungary, Guatemala, Nicaragua, Scotland, Thailand, Yugoslavia, El-Salvador, Trinadad&Tobago, Peru, Hong, Holand-Netherlands
15 income >50K, <=50K

Une première étape permet de vérifier, sélectionner, recoder les données, avant d’aborder des outils plus élaborés. Les questions suivent la chronologie de ce déroulement.

La deuxième étape cherchant un meilleur modèle de prévision du dépassement de seuil de revenu est détaillée dans un scénario de la saison 3: Apprentissage.

Répondre aux questions en s'aidant des résultats des exécutions.

1 Préparation des données

La lecture et la transformation des données est obtenue directement en exécutant un code source en R. Consulter le code du programme pour comprendre les transformations qui ont été réalisées sur les données brutes. Cette étape a été largement anticipée et simplifiée par la fourniture du programe afférent. Ne pas oublier qu'elle est essentielle et occupe la plus grande partie du temps nécessaire à une analyse. Elle aurait pu être rendue plus efficace (programme plus concis et exécution plus rapide) en utilisant la librairie dplyr très adaptée à cet usage.

Charger les données et le programme dans le répertoire courant (path="") en même temps que ce tutoriel ou changer de chemin pour y accéder directement.


In [ ]:
# Chemin pour charger au moment de l'exécution:
# path="http://www.math.univ-toulouse.fr/~besse/Wikistat/programmes/"
path=""
source(paste(path,"dataPrepAdultCensus.R",sep=""))
summary(dataBase)

2 Description

Q Quelle est la population étudiée ? Quel est l’échantillon ?

Q Commenter, justifier les différentes transformations opérées. Repérer les variables quantitatives, qualitatives. Certaines (age, hoursWeek) sont présentes sous les deux types. Beaucoup de modalités on déjà été regroupées, notamment celles de nativCountry (voir le programme) certaines variables sont rendues qualitatives (capitalLoss ou Gain).


In [ ]:
# dimensions des graphiques
options(repr.plot.width=4, repr.plot.height=4)
hist(dataBase[,"LcapitalGain"],probability=T, main="",xlab="log(1+CapitalGain)")
boxplot(dataBase[,"LcapitalGain"], horizontal=TRUE,boxwex=.2,  outline=TRUE,  
        frame=F, col = "lightgrey", add = TRUE,at=0.2)

Q Quels sont ces graphiques? Que dire de la transformation opérée ? La variable CapitalLoss subit le même traitement.

Certains couples de variables posent des problèmes.


In [ ]:
table(dataBase$relationship,dataBase$sex)

In [ ]:
table(dataBase$education,dataBase$educNum)

In [ ]:
table(dataBase$mariStat,dataBase$relationship)

In [ ]:
table(dataBase$origEthn,dataBase$nativCountry)

Q Quel est ce problème général ? Qu’est-ce qui va se passer si on en calcule l’analyse des correspondances ? Quel est le problème plus spécifique des variables relationship et sex?


In [ ]:
mosaicplot(table(dataBase[,"sex"],dataBase[,"occup"]),main="")

Q Quel graphique ci-dessus? Quelle interprétation ? Quel est le test ci-dessous ? Que doit vérifier la table pour que ce test soit valide ? Quelle est l’hypothèse H0 testée ? Conclusion.


In [ ]:
chisq.test(table(dataBase[,"sex"],dataBase[,"occup"]))

Q Quel est le graphique ci-dessous? Comment interpréter? Quel test permettrait de confirmer ? Que dire de l’intérêt de cette variable fnlwgt (Final sampling weight)?


In [ ]:
boxplot(fnlwgt~income,data=dataBase,xaxis="Income",yaxis="fnlwgt")

Q Que dire dans la figure ci-dessous de la liaison entre les variables educNum et age et de la localisation des points noirs (>50k€) par rapport aux rouges (<50k€).


In [ ]:
plot(dataBase[,"age"],dataBase[,"educNum"],col=as.integer(dataBase[,"income"]),pch=16,cex=0.5)

In [ ]:
table(dataBase[,"age"],dataBase[,"educNum"])

Q Quelle est le graphe ci-dessous? Quel est le cercle? A quoi sert-il ?


In [ ]:
library(FactoMineR)
pca=PCA(dataBase[,c(1,3,5,13,16,17)],scale.unit=T,graph=F)
plot(pca, choix="var")

Q La représentation ci-dessous montre un artefact avec 3 paquets d’individus. A quoi est dû cet artéfact ? Est-il utile à la compréhension des données ?


In [ ]:
acp=prcomp(dataBase[,c(1,3,5,13,16,17)],scale=T)
biplot(acp)

4 Analyse factorielle des correspondances de la table occup vs. education

Q Que conclure du test ci-dessous sur l’intérêt d’une analyse des correspondances? Quelle est la table étudiée, ses dimensions?


In [ ]:
chisq.test(table(dataBase[,4],dataBase[,7]))

Q Quelles sont les ACPs considérées dans cette analyse des correspondances, avec quelles métriques?

Q Quelle est la matrice diagonalisée?

Q Quelle est la significaiton des valeurs (%) présentes dans les légendes?

Q Donner en une ligne une signification à l’Axe 1.


In [ ]:
options(repr.plot.width=6, repr.plot.height=6)
coresp=CA(table(dataBase[,c(4,7)]))

5 Analyse factorielle multiple des correspondances

Q La section 2 montre le peu d’intérêt de l’ACP. L’AFCM est donc utilisée. Quel prétraitement a été mis en œuvre pour y faire intervenir toutes les variables? Que faire des couples de variables posant problème (première section)?

Q Combien d’axes est-il raisonnable de retenir selon la figure ci-dessous?


In [ ]:
dataq=dataBase[,c(2,4,6,7,9,10,11,12,15,18,19)]
afcm=MCA(dataq,graph=FALSE,quali.sup=c(9))
plot(1:30,afcm$eig[1:30,1],type="h")

Q Comment interpréter les axes 1 et 2 ci-dessous? Que signifient les valeurs (%)?


In [ ]:
options(repr.plot.width=6, repr.plot.height=6)
plot.MCA(afcm,invisible=c("ind"),habillage="quali")

Q A partir de quelle AFC et donc de quelle ACP, quelle SVD le graphe ci-dessous a-t-il été obtenu? La discrimination des individus de revenus inférieurs ou supérieurs à 50k€ sera-t-elle aisée ?


In [ ]:
plot(afcm$ind$coord,type="p",pch=".",cex=2,col=as.integer(dataBase$income))

6 Classification non supervisée

Q Pourquoi la classification ascendante hiérarchique des données précédentes ne marche-t-elle pas sur un ordinateur portable basique? Quelle stratégie faudrait-il mettre en œuvre?

Q Les commandes suivantes sont plus simplement exécutées. Quelle astuce est mise en œuvre? Comment choisir le nombre de classes?


In [ ]:
ind=sample(1:nrow(dataq),5000,replace=F)
dist.ind=dist(afcm$ind$coord[ind,], method="euclidean")
hclusind=hclust(dist.ind,method="ward.D")
options(repr.plot.width=4, repr.plot.height=4)
plot(sort(hclusind$height,decreasing=T)[1:15])
Classe=kmeans(afcm$ind$coord, 5)$cluster

Représentation des classes


In [ ]:
classe=factor(as.factor(Classe),labels=c("C1","C2","C3","C4","C5"))
plot(afcm$ind$coord,type="p",pch=".",cex=2,col=as.integer(classe))

Q Expliquer comment les commandes ci-dessous permettent de construire une interprétation des classes. Interpréter ces classes.


In [ ]:
dataqw=data.frame(dataq,"Classe"=classe)
afcm=MCA(dataqw,graph=FALSE,quali.sup=c(9))
options(repr.plot.width=6, repr.plot.height=6)
plot.MCA(afcm,invisible=c("ind"),habillage="quali")