Introduction

Le jeu de données contient des données issu de questionnaires de recensement américain des années 1994 et 1995. Notre variable d’intérêt (outcome) est binaire, c’est le résultat qu’on cherchera pour la prédiction. Il n’y a aucun manquant sur notre jeu de données « data_train » pour cette variable. Elle est considérée comme une valeur, c’est en fait une variable qualitative à 2 modalités.Les autres variables se répartissent en 28 variables qualitatives et 13 variables quantitatives. Notre objectif final est de construire un modèle permettant de prédire si le revenu d’un citoyen américain aléatoire est inférieur ou supérieur à 50000$ en fonction de caractéristiques données, telles que l’âge, le niveau de scolarité, la profession, le sexe, la race, etc.
Dans la première partie du projet, nous nettoyons et explorons le jeu de données en effectuant une analyse préliminaire de l’impact de chaque variable prédictive(appelée aussi variable variable explicative ou covariable indépendante) sur le “revenu” de la variable réponse (appelée aussi variable dépendante).

Dans la deuxième partie, nous utilisons différentes techniques de pré-traitement pour regrouper les variables et les modalités. Ensuite nous faisons une reduction du jeu de données afin de pouvoir faire correctement les predictions.

Dans la troisième partie du projet, nous construisons des modèles prédictifs utilisant différents algorithmes. Nous appliquons les reseaux de neurones, k plus proche voisins, les forêts aléatoires, l’arbre de décision etc … Nous testerons la précision des modèles construits à la fois sur des données d’apprentissage et des données de test-validation.

1.Chargement des données et modification de type ou de libellé

Cette première partie comporte des analyses statistiques et elle nous aide à comprendre les données. Nous allons explorer ce jeu de données.

Nous effectuons le chargement des données et des packages nécessaires à nos travaux.

Voici la liste exhaustive des variables explicatives :

 [1] "age"                                      
 [2] "class of worker"                          
 [3] "detailed industry recode "                
 [4] "detailed occupation recode"               
 [5] "education"                                
 [6] "wage per hour"                            
 [7] "enroll in edu inst last wk"               
 [8] "marital stat"                             
 [9] "major industry code"                      
[10] "major occupation code"                    
[11] "race"                                     
[12] "hispanic origin"                          
[13] "sex"                                      
[14] "member of a labor union"                  
[15] "reason for unemployment"                  
[16] "full or part time employment stat"        
[17] "capital gains"                            
[18] "capital losses"                           
[19] "from stocks"                              
[20] "tax filer stat"                           
[21] "region of previous residence"             
[22] "state of previous residence"              
[23] "detailed household and family stat"       
[24] "detailed household summary in household"  
[25] "migration code-change in msa"             
[26] "migration code-change in reg"             
[27] "migration code-move within reg"           
[28] "live in this house 1 year ago"            
[29] "migration prev res in sunbelt"            
[30] "num persons worked for employer"          
[31] "family members under 18"                  
[32] "country of birth father"                  
[33] "country of birth mother"                  
[34] "country of birth self"                    
[35] "citizenship"                              
[36] "business or self employed"                
[37] "fill inc questionnaire for veteran's admi"
[38] "veterans benefits"                        
[39] "weeks worked in year"                     
[40] "year"                                     
[41] "outcome"                                  

Pour éviter des risques avec la présence d’espaces dans les noms de variables, nous préférons renommer nos variables avec des noms sans espace. Dans notre espace de travail, nous appellerons désormais “Census” le jeu de données correspondant à “data_train” pour conserver l’intégrité de data_train.

1.1 Aperçu général

La dimension de notre tableau est :

[1] 199526     41

soit, 41 colonnes (variables) et 199526 lignes.

Les types de variables sont :


 factor integer 
     29      12 

Comme nous pouvons le voir, nous avons 29 colonnes qui sont qualitatives et 12 qui sont quantitatives. Afin de voir quels sont les modalités de chaque variable factorielle, nous écrivons la fonction levels_factors(), qui prend comme argument une trame de données, et que nous appliquons à notre jeu de données Census (Voir Annexes)

Le nombre de modalités pouvant être très important et rendant difficile l’analyse, nous serons certainement amenés à regrouper des modalités de certaines variables, ou des variables entre elles.

1.2 Remarques sur les types de variables

Nous observons que certaines variables reconnues comme quantitatives sont en fait des variables qualitatives (ce sont des codes pour désigner l’appartenance à une classe) :

  • detailed industry recode

  • detailed occupation recode

  • business or self employed

  • veterans benefits

La variable “year” constitue un cas un peu particulier, puisque c’est une variable temporelle, ici reconnue comme une variable quantitative alors qu’on devrait elle aussi la considérer comme une variable qualitative avec deux modalités. Nous allons changer les types de ces variables.

Pour les autres variables quantitatives, le choix de discrétiser ou non est plus ouvert, nous expliquerons plus loin nos choix.

après ces transformations, nous avons désormais :


 factor integer 
     34       7 

soit 34 colonnes qui sont catégorielles (qualitatives) et 7 qui sont entières (quantitatives).

1.2 Distribution de la variable “outcome” et distribution des manquants

1.2.1 Variable “outcome”

Voici la distribution des données pour la variable outcome

  • nombre de colonne: 41

  • nombre de ligne: 199526

  • proportion de high salary: 6.2%

  • proportion de low salary: 93.8%

La proportion de salaire faible (-50 000$) est très importante, nos données ne sont pas équilibrées par rapport à cette variable outcome. Ce constat est important et nous en tiendrons compte lorsque nous formerons nos modèles.

1.2.2 Données manquantes

Nous allons analyser les données manquantes, et les variables les plus concernées par ces manquants. Voici le nombre total de valeurs manquantes :

Nombre de données manquantes:  415836 
[ 415836 / ( 199526 x 41 ) ] = 5.083218 %

Ce nombre de cellules vides dans notre jeu de données est assez faible si on le compare au nombre total de cellules.

Mesurons le nombre de ligne avec au moins une données manquantes :


 FALSE   TRUE 
104452  95074 
Nous avons 52.35007 % de lignes avec une valeur manquante

Soit 104452 lignes fausse avec au moins une valeur manquante et 95074 lignes sans valeur manquante. Ce qui est très important.

Observons la répartition de ces manquants par variables :

Nombre de valeurs uniques par variable
x
age 91
class_of_worker 9
detailed_industry_recode 52
detailed_occupation_recode 47
education 17
wage_per_hour 1224
enroll_in_edu_inst_last_wk 3
marital_stat 7
major_industry_code 24
major_occupation_code 15
race 5
hispanic_origin 10
sex 2
member_of_a_labor_union 3
reason_for_unemployment 6
full_or_part_time_employment_stat 8
capital_gains 130
capital_losses 112
from_stocks 1479
tax_filer_stat 6
region_of_previous_residence 6
state_of_previous_residence 51
detailed_household_and_family_stat 38
detailed_household_summary_in_household 8
migration_code_changeinmsa 10
migration_code_change_in_reg 9
migration_code_move_with_in_reg 10
live_int_his_house_1_year_ago 3
migration_prevres_in_sunbelt 4
num_persons_worked_for_employer 7
family_members_under_18 5
countryofbirthfather 43
country_of_birthmother 43
country_of_birthself 43
citizenship 5
business_or_selfemployed 3
fill_inc_questionnaire_for_veterans_admi 3
veterans_benefits 3
weeks_worked_in_year 53
year 2
outcome 2

Voici les variables comportant des valeurs manquantes et le nombre de valeurs manquantes pour chacunes d’elles :

On a donc 8 variables avec des données manquantes.

  • 99665 valeurs pour chaques variables “migration_prevres_in_sunbelt”,“migration_code_changeinmsa”, “migration_code_move_with_in_reg”,“migration_code_move_with_in_reg”. En cherchant à comprendre pourquoi on observe exactement le même nombre de manquants sur ces 4 variables, on observe que toutes les données de l’année 1995 sont manquantes pour ces variables.

  • 686 valeurs pour la variable “state_of_previous_residence” soit (686/ 199526) soit 0.34% des donneées de la variable state_of_previous_residence

  • 6821 valeurs pour la variable countryofbirthfather

  • 6170 valeurs pour la variable country_of_birthmother

  • 3499 valeurs pour la variable country_of_birthself

A ce stade, nous nous limitons à coder les NA en “inconnu”. A part pour les 4 premières variables citées ci dessous, c’est une proportion de manquants relativement faible, et nous pouvons en faire une modalité. Par la suite, on verra comment gérer la modalité Inconnu par rapport à notre objectif de prédiction d’outcome.

2.Exploration

2.1 Variables quantitatives

2.1.1 Indicateurs statistiques


=============================================================================================
Statistic                          N    Min Pctl(25) Median  Mean   Pctl(75)  Max   St. Dev. 
---------------------------------------------------------------------------------------------
age                             199,526  0     15      33   34.502     50      90    22.351  
wage_per_hour                   199,526  0     0       0    54.948     0     9,999   274.167 
capital_gains                   199,526  0     0       0    430.726    0     99,999 4,666.440
capital_losses                  199,526  0     0       0    36.389     0     4,608   268.271 
from_stocks                     199,526  0     0       0    198.124    0     99,999 1,965.004
num_persons_worked_for_employer 199,526  0     0       1     1.951     4       6      2.364  
weeks_worked_in_year            199,526  0     0       8    23.106     52      52    24.399  
---------------------------------------------------------------------------------------------

On peut remarquer qu’aucune des variables n’est constante. De telles variables n’auraient aucun intérêt pour l’analyse. Par ailleurs, les 4 variables “wage_per_hour”, “capital_gains”, “capital_losses” et “from_stock” sont distribuées de façon très déséquilibrée avec premier quartile = 3ème quartile = 0. Ce qui signifie un très grand nombre de valeur à 0. On peut supposer que les valeurs max à 9999, ou 99999 ne sont pas de vrais max mais des maxs autorisés par le nombre de digit disponibles.

2.1.2 Représentations graphiques

On commence par visualiser les distributions des variables via des diagrammes en barres et des histogrammes. Pour les variables ayant un grand nombre de valeurs distinctes, on les représentera via des histogrammes formant des classes. Les variables “Age” et “num_persons_worked_for_employer” ont une distribution relaitvement équilibrée. Les variables “wage_per_hour”, “capital_gains”, “capaital_losses”, “from_stocks” sont très déséquilibrées, avec énormément d’individu à 0, par rapport au nombre d’individu avec des valeurs supérieures à 0. Enfin, la variable “weeks_worked_in_year” présente beaucoup d’individu à 0 et à 52, et une proportion beaucoup plus faible se répartissant entre ces deux bornes. Pour terminer sur l’analyse univariée sur variable quantitative, nous proposons les boites à moustaches mais elles n’apportent pas grand chose par rapport à ce qui a déjà été dit.

2.2 Variables qualitatives

Nous avons vu plus haut que certaines variables ont beaucoup de modalités, on va voir ici les modalités rares via des diagrammes en barres (on pourrait de façon équivalente visualiser cette information sous forme de tableaux). Les modalités rares pouvant avoir un impact défavorable sur l’efficacité de certains modèles, il est important de les identifier (en vue d’éventuels regroupements par la suite).

Mais nous ne pouvons envisager des regroupements qu’après avoir vérifié que ces regroupements sont pertinents vis à vis de notre variable réponse outcome, ce que nous abordons dans l’analyse bivariée. A ce stade, nous en restons donc aux constats : il y a des variables avec beaucoup de modalités et certaines modalités rares, on devra en tenir compte (traitement éventuels) si on veut utiliser ces variables pour la prédiction.

2.3 Analyse bivariée

Dans le cadre de notre objectif de prédiction, il convient prioritairement d’étudier le lien entre les variables explicatives et la réponse, mais on cherchera aussi par la suite à identifier des liens entre les variables explicatives

2.3.1 Lien entre variables explicatives et variable réponse “outcome”

2.3.1.1 Lien entre outcome et les variable quantitatives

Nous pouvons comparer les boites à moustaches de nos données quantitatives en fonction d’outcome. Commençons par les variables dont on a vu plus haut qu’elles étaient très déséquilibrées (“wage_per_hour”, “capital_gains”, “capaital_losses”, “from_stocks”). Il est dificile de conclure sur la base de cette représentation, il est en de même pour les autres (“capital_gains”, “capaital_losses”, “from_stocks”) dont nous ne donnons pas la représentation.La valeur “0”, est très fortement représentée, que cela soit pour outcome “-50000” et pour outcome “+50000”.

Avec les variables “Age”,“weeks_worked_in_year” et “num_persons_worked_for_employer” qui ont une distribution relaitvement équilibrée, on a une meilleure lisibilité :

Ainsi, pour l’age, on observe un écart qui semble significatif entre les individus avec outcome “-50000” et avec outcome “+50000”. On voit qu’en moyenne les individus ont un peu plus de 30 ans (33,7) avec outcome “-50000” etun peu moins de 50 ans (46,4)avec outcome “+50000”.

Pour “num_persons_worked_for_employer”, le lien semble marqué mais on ne pourra conclure sur la force de ce lien qu’après un calcul statistique.

Parmi les individus avec outcome = +50000, il y en a une très forte proportion avec “weeks_worked_in_year” = 52. Dès maintenant, on peut supposer que cette variable jouera un rôle dans la prédiction. La présentation suivante est complémentaire à la boxplot :

Nous pouvons imaginer une explication logique à cette distribution. Les individus avec outcome à +50000 sont très majoritairement des individus travaillant 52 semaines. Mais il y a aussi beaucoup de personnes travaillant 52 semaines et qui ont un outcome <50000. Ils ont surement un travail peu qualifié et peu rémunérateur. Les individus travaillant 0 semaine par an ont très majoritairement un outcome inférieur à 50k, mais il en existe qui ont un outcome > 50000. Ces derniers pourraient être des rentiers.

Les boites à moustache ne permettant pas de conclure quant à la force des éventuelles liaisons, voici les rapport de corrélation entre les variables quantitatives et outcome :

Nous trouvons la variable “weeks_worked_in_year” comme ayant le lien le plus fort avec outcome, suivi de “capital_gains”, “num_persons_worked_for_employer”, et “from_stocks”. Une ACP complétera ultérieurement cette approche, mais cela permet de pointer des variables pouvant jouer un rôle dans la prédiction.

“Capital_losses” et “wage_per_hour” sont moins liés à “outcome”.

Etudions un peu plus le cas de “Age” avec un graphique “proportion de outcome +50K = f(age)” :

On a traité jusqu’ici l’âge comme une variable quantitative mais son traitement implique souvent de la passer en classes. Par ailleurs, dans beaucoup de domaines, l’age ne réagit pas de façon corrélée à la mesure (vitesse de course faible pour enfants et vieillards). Et dans le domaine médical, les âges faibles et très grands constituent des populations exposées à certains risques et sont regroupés. Notre courbe montre un peu la même choses, et cela nous dit que nous avons tout intérêt à réaliser des classes :

  • probabilité nulle à quasi nulle d’observer outcome +50K pour les âges compris dans [0,18]

  • probabilité intermédiaire d’observer outcome +50K pour les âges compris dans [19,33] et [63,90]

  • probabilité forte (en comparaison à l’ensemble des données) d’observer outcome +50K pour les âges compris dans [34,62]

Cette transformation de données est une transformation “métier”, on réalise un découpage à la lumière de notre lecture du lien entre la variable “age” et la variable “outcome” et de notre objectif.On ajoute donc une variable qualitative “groupedeage”.

[1] "jusqu'à 18 ans" "19 à 33 ans"    "34 à 62 ans"    "63 ans et plus"

2.3.1.2 Lien entre outcome et les variable qualitatives

Mesurons le lien entre les variables qualitatives (auxquelles nous avons donc ajouté “groupedeage” et “outcome” avec le V de Cramer (pour information, nous préférons le V de Cramer au test du Khi-deux car il est plus approprié avec un très grand nombre d’individus) :

Resultats V de CRAMER
x
year 0.0143384
live_int_his_house_1_year_ago 0.0259757
migration_prevres_in_sunbelt 0.0270173
region_of_previous_residence 0.0274515
fill_inc_questionnaire_for_veterans_admi 0.0280491
reason_for_unemployment 0.0282018
state_of_previous_residence 0.0316417
migration_code_move_with_in_reg 0.0364233
migration_code_change_in_reg 0.0364775
migration_code_changeinmsa 0.0375418
citizenship 0.0427754
country_of_birthself 0.0585756
race 0.0601518
enroll_in_edu_inst_last_wk 0.0648959
hispanic_origin 0.0681777
country_of_birthmother 0.0707903
countryofbirthfather 0.0720188
member_of_a_labor_union 0.0776977
business_or_selfemployed 0.0786842
veterans_benefits 0.1443710
full_or_part_time_employment_stat 0.1583704
sex 0.1583786
family_members_under_18 0.1592051
marital_stat 0.1993344
detailed_household_summary_in_household 0.2278732
tax_filer_stat 0.2314396
detailed_household_and_family_stat 0.2417388
class_of_worker 0.2593977
major_industry_code 0.2804275
detailed_industry_recode 0.2945807
major_occupation_code 0.3665681
education 0.3897944
detailed_occupation_recode 0.4380730

Voyons le graphique Parmi les variables qualitatives, les variables les plus liées à outcome (on donne ici celles pour lesquelles le V de cramer est supérieur à 0,19) sont : detailled_occupation_recode, education, major_occupation_code, detailed_industry_recode, major_industry_code, class_of_worker, detaille_household_and_family_stat, groupedeage, tax_filler_stat, detailled_household_summary_in_household, marital_stat.

Inversement, des variables comme year, live_int_his_house_1_year_ago (par exemple) sont très peu lièes à outcome.

Ces analyses pourront être utiles en vue d’une réduction du nombre de colonnes, les variables les moins liées à outcome pourront être écartées sans impact ou avec un impact négligeable sur la qualité de la prédiction d’outcome.

2.3.2 Lien entre variables explicatives

2.3.2.1 Variables quantitatives

Des liaisons trop fortes entre variables explicatives peuvent conduire à de grande instabilité dans les modèles. L’analyse des liaisons entre variables explicatives permettra de détecter les couples de variables les plus liées. Nous concervons la variable “age” comme valeur numérique, même si nous avons montré que pour la modélisation, la variable “groupedeage” sera plus pertinente.

Voici la matrice des corrélations :

Nous n’observons pas de fortes corrélations, si ce n’est pour le couple “weeks_worked_in_year” et “num_persons_worked_for_employer”. Ci dessous, avec les coefficients de Spearman (plus adpaté si nos variables ne suivent pas une loi normale, ce qui est le cas), nous concluons de la même manière.

Voici la matrice des corrélations avec coefficient de spearman :

2.3.2.2 Variables qualitatives entre elles

De la même façon, on détermine les V de Cramer entre les variables explicatives qualitatives.

Nous observons de très fortes liaisons entre :

  • detailed_industry_recode et major_industry code : c’est normal, par construction, ces données sont liées par une arborescence. On peut donc considérer qu’il y a redondance.

  • idem entre major_occupation_code et detailled_occupation_code et pour region_of_previous_residence et state_of_previous_residence

  • year et les 4 variables commençant par migration… : nous avons vu plus haut que cela s’explique par l’absence de données pour une valeur de year, et la présence pour l’autre valeur de year.

et des liaisons fortes entre :

  • les variables commençant par migration… et live_in_this_house_previous_year

  • country_birth_self avec country of birth_mother et father

ce qui est logique dans les deux cas, et qui dénote aussi une forme de redondance dans l’information.

Ces éléments nous donnent des indications pour supporter nos analyses ACM à venir.

2.4 Analyse multivariée

2.4.1 ACP sur les données quantitatives

Nous effectuons une ACP sur les données quantitatives (hormis l’age) en considérant outcome comme une variable supplémentaire quantitative.

On voit que la modalité -50000 est plus lié à la dimension 1

Les éléments les plus intéressants qui ressortent de l’ACP nous montre que :

  • la première composante est essentiellement liée à num_persons_worked_for_employer, et weeks_worked_in_year

  • la deuxième à capital_gains et from_stocks

  • la troisème à capital_losses

Enfin, sur chacune de ces trois composantes, les modalités d’outcome ont des coordonnées significativement différentes, respectivement (-0.099, -0.070, -0.018) pour -50k et (1.496, 1.059, 0.278) pour +50ke. Les cos2 des deux premières composantes sont assez élevés (0.64 et 0.321), mais faible pour la troisième.

Nous pouvons conclure pour notre prédiction que les 4 variables quantitatives num_persons_worked_for_employer, et weeks_worked_in_year,capital_gains et from_stocks sont les plus susceptibles de contribuer à la qualité d’un modèle de prédiction.

wage_per_hours et capital_losses contribuent peu à la variable réponse outcome mais capital_losses est proche de outcome. C’est une variable rare qui correspond à une perte de capital et qui necessite d’avoir un capital financier.En majorité, ce sont les individus avec un revenu confortable qui possèdent un capital financier.

Nous pouvons envisager, si la modélisation nous contraint dans le nombre de variables, de :

  • choisir entre num_persons_worked_for_employer, et weeks_worked_in_year, puisque ces deux variables sont très liées,

  • créer une variable composite (capital_gains + from_stocks) puisque ces deux variables correspondent à des revenus et agissent dans le même sens vis à vis d’outcome.

2.4.2 ACM sur les données qualitatives

On réalise l’ACM en mettant la variable outcome en variable illustrative.

On gère les modalités rares (fréquence relative <5%) en effectuant de la ventilation.

Voici le graphe des individus

Voici le graphe des variables avec outcome Voici le graphe avec les modalités avec “-50000” et “+50000”

L’exploitation visuelle n’est pas facile du fait du nombre important de variables et du nombre important de modalités. Néanmoins, et en s’appuyant sur les détails que nous mettrons en annexe et des labels en rouge qui contribuent le plus, on fait apparaître un écart important sur la dimension 1 entre outcome +50k et outcome -50k.

Les contributions les plus fortes à cette dimension viennent de :

  • l’age via groupedeage,
  • un groupe de variables lié au type de travail (class_of_worker,detailed_industry_recode, detailed_occupation_recode, major_industry_code, major_occupation_code )
  • le niveau d’éducation (education)
  • la composition du foyer (detailed_household_and_family_stat, detailed_household_summary_in_household, family_members_under_18)
  • le statut par rapport à des pensions ou des taxes (tax_filer_stat,veterans_benefits).

On peut noter que la dimension 2 est liée à des variables peu liées à outcome. On retrouve ce qu’on a déjà vu plus haut : forte liaison entre les variables en migration… et year, du à des manquants sur une année. Il y a d’autres variables liées elles aussi à un changement de lieu (region et state of previous residence, live_in_this_house_one_year_ago).

La faible repréentativité des premières dimensions limite la portée de cette acm, mais couplée avec les résultats trouvés sur les liaisons plus haut, on peut conclure que, en vue d’une modélisation, on peut retenir parmi les variables qualitatives :

  • la variable “groupedeage”
  • la variable “education” des variables liés au type de travail :

-la variable “detailled_occupation_recode”et nous n’utiliserons pas major_occupation_code du fait de leur liaison -la variable “detailed_industry_recode”, et nous n’utiliserons pas major_industry_code du fait de leur liaison -la variable “class_of_worker”

  • la variable “tax_filler_stat”
  • la variable “detailled_household_and_family_stat”, et nous n’utiliserons pas “detailled_household_summary_in_household” du fait de leur liaison.
  • la variable “marital_stat”.

Si notre modèle doit être amélioré, des variables comme : “veterans_benefits”, “full_or_part_time_employment_stat”, “family_members_under_18” et “sex” pourront dans un deuxième temps être envisagés.

Pour les besoins de l’étude et pour illustrer des regroupements de modalités, nous continuons de travailler sur la modalité “country_of_birth_self”. Nous avons vu qu’elle était fortement liée à country_of_birth_mother et father. On peut choisir d’utiliser “country_of_birth_self” uniquement, sans impacter ou de façon négligeable la modélisation.

Ces variables sont plutôt logique car il est très rare d’avoir un revenu élevé avant 24 ans et sans un diplome universitaire. La classe de travail et le secteur sont aussi important car il est moins rare d’avoir un revenu supérieur à +50k$ dans le domaine de la finance que dans le batiment. De même il est logique de prendre en compte le statuts marital,full_or_part_time_employment_stat,“full_or_part_time_employment_stat”, "family_members_under_18 ou le sexe qui sont des sources d’inégalités salariales entre hommes et femmes, mères célibataires et couples sans enfants, travail à temps partiel…

Notons que les variables pour lesquels nous avions des manquants semblent avoir un intérêt limité par rapport à notre objectif de modélisation.

3.Pré-traitement

3.1 Simplifications des données

3.1.1 Analyses en vue d’éventuelles transformations des données qualitatives / regroupement de modalités

Afin de faciliter les analyses, nous effectuons des regroupements de modalités. Nous proposons de travailler sur quelques variables seulement On choisit des variables où il y a une logique apparente de regroupement (approche “métier”). On s’assure au préalable que ces regroupements ne vont pas nous faire perdre de l’information, et que la distribution d’outcome est homogène parmi les différentes modalités qu’on souhaite regrouper.

La variable “country_of_birthself”

Dans le cas de la variable “country of birth self” par exemple, on peut représenter le pourcentage de outcome +50 K pour s’assurer qu’on fait des regroupements pertinents :

                     
                          -50000     +50000      Total
   Cambodia            98.130841   1.869159 100.000000
   Canada              90.275762   9.724238 100.000000
   China               92.494929   7.505071 100.000000
   Columbia            96.551724   3.448276 100.000000
   Cuba                92.210767   7.789233 100.000000
   Dominican-Republic  98.670606   1.329394 100.000000

Nous observons que les groupes au sens géographique sont relativement homogènes concernant la variable outcome. On peut donc procéder au regroupement avec pas ou peu de perte d’information (Asie de l’est, Asie Centrale, Amérique centrale, Amérique du sud, Europe de l’est et Europe de l’ouest).

Création de nouveaux labels

[1] " Central-America" " Central-Asia"    " East-Asia"      
[4] " Europe-East"     " Europe-West"     " Outlying-US"    
[7] " South-America"   " United-States"  

La variable “educ_level”

De la même manière, nous effectuons des regroupements sur le niveau d’education, pour limiter fortement le nombre de modalités avec pas ou peu de perte d’informations.

Création de nouveaux labels

[1] "CC-grad"     "College"     "grad-school" "HS-grad"     "no-HS"      

Nous pouvons analyser plus finement la distribution de outcome selon le niveau d’éducation avec un graph de type mosaïc plot :

On trouve une sur-représentation de +50K pour les niveaux d’éducation CC-grad, College et Grad-school (et une sous représentation pour les HS-grad et les no-HS). Une liaison entre les variables outcome et edcu_level semble évidente, c’est quelque chose qu’on a déjà vu plus haut, mais avec ce graphique, on valide facilement des regroupements de modalités.

La variable “extra_outcome”

On peut définir une variable “extra_income” comme étant le montant des gains de capitaux (capital_gains) et des actions(from_stock), et discrétiser cette variable en s’intéressant uniquement aux trois modalités suivantes : extra_income inférieur à 0, nul, ou supèrieur à 0. Regardons la répartition outcome +50K/-50K pour ces trois modalités :

Création de nouveaux labels

[1] "none"     "positive"

En fait, nous n’observons que des gains nuls ou positif, ce qui est assez logique puisque nous n’avions pas de valeur négative pour les deux composantes de cette nouvelle variable.

Cette répartition nous dit que les gens qui ont des revenus de capitaux, ont plus souvent des revenus du travail supérieurs à 50K$ que les gens qui n’ont pas de revenus de capitaux.

3.1.2 Reduction des données en colonnes

Sur le choix des variable quantitatives, nous pouvons conclure pour notre prédiction que nous garderons 4 variables quantitatives:

-num_persons_worked_for_employer

-weeks_worked_in_year

-capital_gains et from_stocks transformées en variable qualitative “extra_outcome”

Sur le choix des variables quantitatives, nous pouvons conclure pour notre prédiction que nous garderons 13 variables qualitatives :

  • la variable “groupedeage”

  • la variable “education” qui sera transformée en “educlevel”
  • la variable “detailled_occupation_recode”

  • la variable “detailed_industry_recode”
  • la variable “class_of_worker”
  • la variable “tax_filer_stat”
  • la variable “detailled_household_and_family_stat”
  • la variable “marital_stat”

Si notre modèle doit être amélioré, les variables ci-dessous pourront venir en supplément des variables ci dessus : - “veterans_benefits” - “full_or_part_time_employment_stat” - “family_members_under_18” - “sex” - “country_of_birth_self” transformée en “native_region”

Nous gardons finalement 16 variables explicatives et outcome, donc 17 variables pour commencer la modélisation.

Nous avons créé un nouveau jeu de donnée data_Census

La dimension de notre tableau est :

199526 17

soit 17 variables et 199526 lignes

Les types de variables sont :


 factor integer 
     15       2 

Nonbre de haut et faible salaires :

12380 lignes avec outcome = +50 000$ pour data_Census
187146 lignes avec outcome = -50 000$ pour data_Census

4.Modelisation

4.1 Découpage des jeux de données apprentissage et Test

Pour détecter un sur-apprentissage, nous allons diviser les données en deux sous-ensembles, données apprentissage et test-validation. Pour cela, il suffit de découper notre jeu de données en deux (soit 30% pour les données de test-validation et 70% pour l’apprentissage).

Nous allons vérifier les colonnes avec des valeurs manquantes NA

[1] 0

Ici, nous avons aucune lignes avec des valeurs manquantes.

Ensuite, nous divisons l’ensemble de données apprentissage et Test.

Avant nous avions 199526 lignes. Maintenant, nous avons pour les données small_train_data:

155145 lignes pour la partie données d'apprentissage

Nous avons pour les données validation_data:

44381 lignes  pour la partie données de test

Regardons en détail le jeu de donnée small_train_data et validation_data

9661 lignes avec outcome = +50 000$ pour small_train_data
2719 lignes avec outcome = +50 000$ pour validation_data
145484 lignes avec outcome = -50 000$ pour small_train_data
41662 lignes avec outcome = -50 000$ pour validation_data

4.1.1 Reduction des données en lignes

Nous allons créer une petit ensemble de donnée pour reduire le nombre de lignes afin de minimiser les temps d’exécution pour plusieurs modèles. Le plus petit ensemble de données d’apprentissage “balanced_small_train_data” est échantillonné de façon aléatoire.

Nous avons 19322 lignes sur ce jeu de donnée.

Nous avons 9661 lignes avec outcome -50 000$ sur ce jeu de donnée.

Nous avons 9661 lignes avec outcome +50 000$ sur ce jeu de donnée.

Maintenant on va choisir quel algorithme est le plus précis pour prédire la variable réponse outcome dont les modalités sont “-50000” et “+50000”. Outcome indique que le citoyen gagne plus ou moins de 50K$ par an. On va utiliser 8 algorithmes et comparer les performances de ces modèles.

1.Stochastic Gradient Boosting

2.Random Forests

3.Decision Trees CART

4.Naives Bayes

5.Support vector machine lineaire

6.Support vector machine radial

7.K Plus proche voisins KNN

8.Neural Networks

4.2 Modélisation de la variable réponse Outcome

Nous allons utiliser Le Grid search avec traincontrol. La fonction traincontrol va diviser l’échantillon original en k échantillons et le répeter k fois l’apprentissage du modèle en faisant des combinaisons de façon aléatoire.

La méthode sera le Grid search qui permet l’optimisation avec des hyperparameters de la prédiction. Le Grid search permet de tester une série d’hyperparamètres et de comparer les performances de prédiction pour déduire le meilleur paramétrage.

4.2.1 Stochastic Gradient Boosting

Le Stochastic Gradient Boosting utilise une méthode d’agrégation de modèles avec le boosting. Cet algorithme utilise le gradient de la fonction de perte pour le calcul des poids des individus lors de la construction de chaque nouveau modèle.

Stochastic Gradient Boosting

method = ‘gbm’

Type: Regression, Classification

Tuning parameters:

  • n.trees (# Boosting Iterations)

    • interaction.depth (Max Tree Depth)

    • shrinkage (Shrinkage)

    • n.minobsinnode (Min. Terminal Node Size)

Required packages: gbm, plyr

A model-specific variable importance metric is available.

Apply model to the test set

Voici le resultat de la validation :

 Accuracy     Kappa 
0.9520516 0.4716073 
Confusion Matrix and Statistics

          Reference
Prediction -50000 +50000
    -50000  41212   1678
    +50000    450   1041
                                       
               Accuracy : 0.9521       
                 95% CI : (0.95, 0.954)
    No Information Rate : 0.9387       
    P-Value [Acc > NIR] : < 2.2e-16    
                                       
                  Kappa : 0.4716       
                                       
 Mcnemar's Test P-Value : < 2.2e-16    
                                       
            Sensitivity : 0.9892       
            Specificity : 0.3829       
         Pos Pred Value : 0.9609       
         Neg Pred Value : 0.6982       
             Prevalence : 0.9387       
         Detection Rate : 0.9286       
   Detection Prevalence : 0.9664       
      Balanced Accuracy : 0.6860       
                                       
       'Positive' Class : -50000       
                                       

Nous avons une faible taux d’erreur de validation et elle est équivalant à l’erreur d’apprentissage.

Le kappa est modéré donc accord modéré sur la prédiction par rapport à une prédiction au hasard.

Confusion Table

Confusion Table Stochastic Gradient Boosting
-50000 +50000
-50000 41212 1678
+50000 450 1041

Notre classificateur est testé avec un jeu de 155145 lignes outcome, dont 145484 sont des outcome avec “- 50 000” et et les 9661 autres sont des outcome avec “+50 000”.

Pour cela, on veut savoir :

  • combien de outcome avec “- 50 000” seront faussement estimés comme des outcome avec "+50 000 et
  • combien de outcome avec “+50 000 ne seront pas estimés comme tels non détectés et classifiés à tort comme outcome avec”- 50 000"

La matrice de confusion suivante se lit alors comme suit :

  • horizontalement, sur les 41662 données outcome “- 50 000” ,41662 ont été estimés par le système de classification comme “-50 000” et 373 ont été estimés comme “+ 50 000” (faux-négatifs),

  • horizontalement, sur les 1491 données outcome “+ 50 000” , 450 ont été estimés comme “-50 000” (faux-positifs) et 1041 ont été estimés comme “+ 50 000”

  • verticalement, sur les 41662 outcome estimés par le système comme “- 50 000”, 450 sont en fait des outcome “+ 50 000”,

  • verticalement, sur les 2719 outcome estimés par le système comme “+ 50 000”, 1041 sont en fait des outcome “- 50 000”.

Resultat de la prédiction

Resultats GBM
Durée Accuracy Taux.Erreur Recall Precision
Stochastic Gradient Boosting 31.22752 mins 0.9520516 0.0479484 0.9891988 0.9608767

Nous avons une bonne performance de prediction pour ce modèle.

4.2.2 Classification Tree CART

On va utiliser les fonctions sélectionnées dans le modèle rpart pour l’algorithme CART car il est facile d’utilisation pour un arbre binaire. Et pour la variable outcome la prédiction est binaire.

CART

method = ‘rpart2’

Type: Regression, Classification

Tuning parameters:

  • maxdepth (Max Tree Depth)

Required packages: rpart

Apply model to the test set

Voici le resultat de la validation:

 Accuracy     Kappa 
0.9468692 0.3542823 
Confusion Matrix and Statistics

          Reference
Prediction -50000 +50000
    -50000  41311   2007
    +50000    351    712
                                          
               Accuracy : 0.9469          
                 95% CI : (0.9447, 0.9489)
    No Information Rate : 0.9387          
    P-Value [Acc > NIR] : 1.562e-13       
                                          
                  Kappa : 0.3543          
                                          
 Mcnemar's Test P-Value : < 2.2e-16       
                                          
            Sensitivity : 0.9916          
            Specificity : 0.2619          
         Pos Pred Value : 0.9537          
         Neg Pred Value : 0.6698          
             Prevalence : 0.9387          
         Detection Rate : 0.9308          
   Detection Prevalence : 0.9760          
      Balanced Accuracy : 0.6267          
                                          
       'Positive' Class : -50000          
                                          

Nous avons une faible taux d’erreur de validation et elle est équivalant à l’erreur d’apprentissage.

Le kappa est faible donc accord faible sur la prédiction par rapport à une prédiction au hasard.

Confusion Table

Confusion Table Classification Tree CART
-50000 +50000
-50000 41311 2007
+50000 351 712

La matrice de confusion suivante se lit alors comme suit :

  • horizontalement, sur les 43318 données outcome “- 50 000” , 41311 ont été estimés par le système de classification comme “-50 000” et 2007 ont été estimés comme “+ 50 000” (faux-négatifs),

  • horizontalement, sur les 1063 données outcome “+ 50 000” , 351 ont été estimés comme “-50 000” (faux-positifs) et 712 ont été estimés comme “+ 50 000”

  • verticalement, sur les 41662 outcome estimés par le système comme “- 50 000”, 351 sont en fait des outcome “+ 50 000”,

  • verticalement, sur les 2719 outcome estimés par le système comme “+ 50 000”, 712 sont en fait des outcome “- 50 000”.

Resultat de la prédiction

Resultats Classification Tree CART
Durée Accuracy Taux.Erreur Recall Precision
Classification Tree CART 8.034623 mins 0.9468692 0.0531308 0.9536682 0.9915751

L’arbre de classification possède un temps d’exécution rapide avec bon taux de précison de la prédiction.

4.2.3 Random Forest

Nous allons utiliser random Forest qui utilise le bagging et donc prend en compte la majorité des variables.

Random Forest

method = ‘rf’

Type: Classification, Regression

Tuning parameters:

  • mtry (#Randomly Selected Predictors)

Required packages: randomForest

A model-specific variable importance metric is available

Fine-Tuning Hyperparameters avec Cross Validation et Grid Search

Nous utilisons le paramètre number=2.

Time difference of 14.98683 mins

Voici le resultat de l’apprentissage :

Random Forest 

19322 samples
   16 predictor
    2 classes: '-50000', '+50000' 

No pre-processing
Resampling: Cross-Validated (2 fold) 
Summary of sample sizes: 9661, 9661 
Resampling results across tuning parameters:

  mtry  Accuracy   Kappa    
   8    0.8564848  0.7129695
  12    0.8566919  0.7133834
  16    0.8559155  0.7118308
  20    0.8549840  0.7099677

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 12.

Nous avons une plus grande erreur d’apprentissage sur ce modèle par rapport aux premiers.

Voici les paramètres choisis :

Best parameter pour mtry est : 12 

Apply model to the test set

 Accuracy     Kappa 
0.8341407 0.3370920 
Confusion Matrix and Statistics

          Reference
Prediction -50000 +50000
    -50000  34563    262
    +50000   7099   2457
                                          
               Accuracy : 0.8341          
                 95% CI : (0.8306, 0.8376)
    No Information Rate : 0.9387          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.3371          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.8296          
            Specificity : 0.9036          
         Pos Pred Value : 0.9925          
         Neg Pred Value : 0.2571          
             Prevalence : 0.9387          
         Detection Rate : 0.7788          
   Detection Prevalence : 0.7847          
      Balanced Accuracy : 0.8666          
                                          
       'Positive' Class : -50000          
                                          

Nous avons une faible taux d’erreur de validation et elle est équivalant à l’erreur d’apprentissage.

Le kappa est faible donc accord faible sur la prédiction par rapport à une prédiction au hasard.

Confusion Table

Confusion Table Random Forest
-50000 +50000
-50000 34563 262
+50000 7099 2457

La matrice de confusion suivante se lit alors comme suit :

  • horizontalement, sur les 34825 données outcome “- 50 000” , 34563 ont été estimés par le système de classification comme “-50 000” et 262 ont été estimés comme “+ 50 000” (faux-négatifs),

  • horizontalement, sur les 9556 données outcome “+ 50 000” , 7099 ont été estimés comme “-50 000” (faux-positifs) et 2457 ont été estimés comme “+ 50 000”

  • verticalement, sur les 41662 outcome estimés par le système comme “- 50 000”, 7099 sont en fait des outcome “+ 50 000”,

  • verticalement, sur les 2719 outcome estimés par le système comme “+ 50 000”, 2457 sont en fait des outcome “- 50 000”.

Resultat de la prédiction

Resultats Random Forest
Durée Accuracy Taux.Erreur Recall Precision
Random Forest 14.98683 mins 0.8341407 0.1658593 0.9924767 0.8296049

Nous avons une bonne accuracy pour la prédiction mais le temps d’excution est long.

4.2.4 Naive Bayes

On va utiliser l’algorithme naïf bayésien qui est l’une des méthodes les plus simples en apprentissage supervisé basée sur le théorème de Bayes. Il est peu utilisé par rapport aux arbres de décision ou les régressions logistiques mais il est facile d’estimer des paramètres et il est rapide.

Naive Bayes

method = ‘nb’

Type: Classification

Tuning parameters:

  • fL (Laplace Correction)

    • usekernel (Distribution Type) = TRUE, FALSE

    • adjust (Bandwidth Adjustment)

Required packages: klaR

Fine-Tuning Hyperparameters avec Cross Validation et Grid Search

Nous utilisons le paramètre number=10.

Time difference of 5.327326 mins

Voici le resultat de l’apprentissage :

Naive Bayes 

19322 samples
   16 predictor
    2 classes: '-50000', '+50000' 

No pre-processing
Resampling: Cross-Validated (10 fold) 
Summary of sample sizes: 17389, 17390, 17390, 17390, 17390, 17390, ... 
Resampling results across tuning parameters:

  usekernel  Accuracy  Kappa
  FALSE      NaN       NaN  
   TRUE      0.5         0  

Tuning parameter 'fL' was held constant at a value of 0
Tuning
 parameter 'adjust' was held constant at a value of 1
Accuracy was used to select the optimal model using the largest value.
The final values used for the model were fL = 0, usekernel = TRUE
 and adjust = 1.

Nous avons un faible résultat d’apprentissage.

Voici les paramètres choisis :

Best parameter pour fL est : 0 
Best parameter pour usekernel est : TRUE 
Best parameter pour adjust est : 1 

Nous regardons quelle covariable influnce le plus le modèle.

La variable qui influence le plus est educ_level et weeks_worked_in_year

Apply model to the test set

Accuracy    Kappa 
0.938735 0.000000 
Confusion Matrix and Statistics

          Reference
Prediction -50000 +50000
    -50000  41662   2719
    +50000      0      0
                                          
               Accuracy : 0.9387          
                 95% CI : (0.9365, 0.9409)
    No Information Rate : 0.9387          
    P-Value [Acc > NIR] : 0.5051          
                                          
                  Kappa : 0               
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 1.0000          
            Specificity : 0.0000          
         Pos Pred Value : 0.9387          
         Neg Pred Value :    NaN          
             Prevalence : 0.9387          
         Detection Rate : 0.9387          
   Detection Prevalence : 1.0000          
      Balanced Accuracy : 0.5000          
                                          
       'Positive' Class : -50000          
                                          

Nous avons une faible taux d’erreur de validation et elle est équivalant à l’erreur d’apprentissage.

Le kappa est null donc désaccord sur la prédiction par rapport à une prédiction au hasard.

La spécificité (la capacité du test à prédire une admission quand celle-ci a réellement eu lieu) est à 0. Le modèle a prédit 0 valeurs outcome +50000.

Confusion Table

Confusion Table Naives bayes
-50000 +50000
-50000 41662 2719
+50000 0 0

Il n’y a aucune prédiction correcte pour le outcome +50000.

La matrice de confusion suivante se lit alors comme suit :

  • horizontalement, sur les 44381 données outcome “- 50 000” , 41662 ont été estimés par le système de classification comme “-50 000” et 2719 ont été estimés comme “+ 50 000” (faux-négatifs),

  • horizontalement, sur les 0 données outcome “+ 50 000” , 0 ont été estimés comme “-50 000” (faux-positifs) et 0 ont été estimés comme “+ 50 000”

  • verticalement, sur les 41662 outcome estimés par le système comme “- 50 000”, 0 sont en fait des outcome “+ 50 000”,

  • verticalement, sur les 2719 outcome estimés par le système comme “+ 50 000”, 0 sont en fait des outcome “- 50 000”.

Resultat de la prédiction

Resultats Naives bayes
Durée Accuracy Taux.Erreur Recall Precision
Naives bayes 5.327326 mins 0.938735 0.061265 1 0.938735

Il est rapide et très performant mais il ne prédit pas les outcome +50000 ce qui est un gros désavantage.

4.2.5 Support vector machine linéaire

Nous allons utiliser un modèle SVM de type linéaire.

Support Vector Machines with Linear Kernel

method = ‘svmLinear’

Type: Regression, Classification

Tuning parameters:

  • C (Cost)

Required packages: kernlab

Apply the tree to test set

Voici le resultat de la validation :

 Accuracy     Kappa 
0.8370474 0.3424217 
Confusion Matrix and Statistics

          Reference
Prediction -50000 +50000
    -50000  34688    258
    +50000   6974   2461
                                          
               Accuracy : 0.837           
                 95% CI : (0.8336, 0.8405)
    No Information Rate : 0.9387          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.3424          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.8326          
            Specificity : 0.9051          
         Pos Pred Value : 0.9926          
         Neg Pred Value : 0.2608          
             Prevalence : 0.9387          
         Detection Rate : 0.7816          
   Detection Prevalence : 0.7874          
      Balanced Accuracy : 0.8689          
                                          
       'Positive' Class : -50000          
                                          

L’erreur est faible et le kappa est faible avec un accord faible sur la prédiction

Confusion Table

Confusion Table SVM
-50000 +50000
-50000 34688 258
+50000 6974 2461

La matrice de confusion suivante se lit alors comme suit :

  • horizontalement, sur les 34946 données outcome “- 50 000” , 34688 ont été estimés par le système de classification comme “-50 000” et 258 ont été estimés comme “+ 50 000” (faux-négatifs),

  • horizontalement, sur les 9435 données outcome “+ 50 000” , 6974 ont été estimés comme “-50 000” (faux-positifs) et 2461 ont été estimés comme “+ 50 000”

  • verticalement, sur les 41662 outcome estimés par le système comme “- 50 000”, 6974 sont en fait des outcome “+ 50 000”,

  • verticalement, sur les 2719 outcome estimés par le système comme “+ 50 000”, 2461 sont en fait des outcome “- 50 000”.

Resultat de la prédiction

Resultats SVM Linear
Durée Accuracy Taux.Erreur Recall Precision
Support vector machine linéaire 20.34367 mins 0.8370474 0.1629526 0.8326053 0.9926172

Le temps d’execution est long et la prédiction est bonne

4.2.6 Support vector machine à noyau

Nous allons utilisé SVM de type Radial Basis Function Kernel

method = ‘svmRadialSigma’

Type: Regression, Classification

Tuning parameters:

  • sigma (Sigma)
    • C (Cost)

Required packages: kernlab

Nous utilisons le paramètre number=2.

Apply model to the test set

 Accuracy     Kappa 
0.5627633 0.1155063 
Confusion Matrix and Statistics

          Reference
Prediction -50000 +50000
    -50000  22367    110
    +50000  19295   2609
                                          
               Accuracy : 0.5628          
                 95% CI : (0.5581, 0.5674)
    No Information Rate : 0.9387          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.1155          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.5369          
            Specificity : 0.9595          
         Pos Pred Value : 0.9951          
         Neg Pred Value : 0.1191          
             Prevalence : 0.9387          
         Detection Rate : 0.5040          
   Detection Prevalence : 0.5065          
      Balanced Accuracy : 0.7482          
                                          
       'Positive' Class : -50000          
                                          

Nous avons une grande erreur de validation et il est pls grand que l’ erreur d’apprentissage. Nous avons un problème de sur apprentissage. Le kappa est faible avec un accord faible de prédiction

Confusion Table

Confusion Table SVM radial
-50000 +50000
-50000 22367 110
+50000 19295 2609

La matrice de confusion suivante se lit alors comme suit :

  • horizontalement, sur les 22477 données outcome “- 50 000” , 22367 ont été estimés par le système de classification comme “-50 000” et 110 ont été estimés comme “+ 50 000” (faux-négatifs),

  • horizontalement, sur les 21904 données outcome “+ 50 000” , 19295 ont été estimés comme “-50 000” (faux-positifs) et 2609 ont été estimés comme “+ 50 000”

  • verticalement, sur les 41662 outcome estimés par le système comme “- 50 000”, 19295 sont en fait des outcome “+ 50 000”,

  • verticalement, sur les 2719 outcome estimés par le système comme “+ 50 000”, 2609 sont en fait des outcome “- 50 000”.

Resultat de la prédiction

Resultats SVM Radial
Durée Accuracy Taux.Erreur Recall Precision
Support vector machine Radial 27.54678 mins 0.5627633 0.4372367 0.5368681 0.9951061

Le temps d’execution est très long par rapport aux autres modèles et pour un résultat de la prédiction faible.

4.2.7 K Plus proche voisins KNN

Le k Nearest Neighbors (KNN) est un algorithme qui peut servir autant pour la classification que la régression. L’algorithme Le plus proches voisins consiste à choisir les k données les plus proches du point étudié afin d’en prédire sa valeur.

k-Nearest Neighbors

method = ‘knn’

Type: Classification, Regression

Tuning parameters:

  • k (#Neighbors)

Nous utilisons le paramètre number=10 et pas de répétitions car le temps d’execution est trop long.

Apply the tree to test set

Voici le resultat de la validation:

 Accuracy     Kappa 
0.8125099 0.3027596 
Confusion Matrix and Statistics

          Reference
Prediction -50000 +50000
    -50000  33610    269
    +50000   8052   2450
                                          
               Accuracy : 0.8125          
                 95% CI : (0.8088, 0.8161)
    No Information Rate : 0.9387          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : 0.3028          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.8067          
            Specificity : 0.9011          
         Pos Pred Value : 0.9921          
         Neg Pred Value : 0.2333          
             Prevalence : 0.9387          
         Detection Rate : 0.7573          
   Detection Prevalence : 0.7634          
      Balanced Accuracy : 0.8539          
                                          
       'Positive' Class : -50000          
                                          

Nous avons une erreur de validation plus élevé que l’erreur d’apprentissage. Le kappa est faible avec un accord faible de prédiction.

Confusion Table

Confusion Table KNN
-50000 +50000
-50000 33610 269
+50000 8052 2450

La matrice de confusion suivante se lit alors comme suit :

  • horizontalement, sur les 33879 données outcome “- 50 000” , 33610 ont été estimés par le système de classification comme “-50 000” et 269 ont été estimés comme “+ 50 000” (faux-négatifs),

  • horizontalement, sur les 10502 données outcome “+ 50 000” , 8052 ont été estimés comme “-50 000” (faux-positifs) et 2450 ont été estimés comme “+ 50 000”

  • verticalement, sur les 41662 outcome estimés par le système comme “- 50 000”, 8052 sont en fait des outcome “+ 50 000”,

  • verticalement, sur les 2719 outcome estimés par le système comme “+ 50 000”, 2450 sont en fait des outcome “- 50 000”.

Resultat de la prédiction

Resultats KNN
Durée Accuracy Taux.Erreur Recall Precision
K nearest neighbors KNN 13.29267 mins 0.8125099 0.1874901 0.8067304 0.99206

Nous avons trouver une stratégie pour avoir une valeur optimale pour le paramètre k. Le niveau de prediction est bon avec un temps d’exécution correcte.

4.2.8 Neural Networks

Les réseaux neuronaux sont l’un des modèles d’apprentissage machine les plus fascinants car leur structure est inspirée par le cerveau.

Neural Network

method = ‘nnet’

Type: Classification, Regression

Tuning parameters:

  • size (#Hidden Units)

    • decay (Weight Decay)

Required packages: nnet

A model-specific variable importance metric is available.

Fine-Tuning recherche des Hyperparameters avec Cross validation et grid search

Voici le resultat de l’apprentissage :

Neural Network 

155145 samples
    16 predictor
     2 classes: '-50000', '+50000' 

No pre-processing
Resampling: Cross-Validated (2 fold) 
Summary of sample sizes: 77572, 77573 
Resampling results across tuning parameters:

  size  decay  Accuracy   Kappa    
  2     0.2    0.9489832  0.4507088
  2     0.5    0.9490154  0.4468607
  2     0.8    0.9489961  0.4404776
  2     1.0    0.9433111  0.2273694
  3     0.2    0.9484676  0.4380545
  3     0.5    0.9494408  0.4358074
  3     0.8    0.9491508  0.4469613
  3     1.0    0.9490090  0.4366423
  4     0.2    0.9487769  0.4399896
  4     0.5    0.9480937  0.4046013
  4     0.8    0.9492604  0.4475999
  4     1.0    0.9494151  0.4476317

Accuracy was used to select the optimal model using the largest value.
The final values used for the model were size = 3 and decay = 0.5.

Nous avons une faible erreur d’apprentissage. Le kappa est modéré avec un accord modéré de prédiction

Voici les paramètres choisis :

Best parameter pour size est : 3 
Best parameter pour decay  est : 0.5 

Nous regardons quelle covariable influnce le plus le modèle.

nnet variable importance

  only 20 most important variables shown (out of 184)

                                                                         Overall
detailed_occupation_recode7                                               100.00
sex Male                                                                   92.78
tax_filer_stat Nonfiler                                                    78.33
family_members_under_18 Not in universe                                    71.20
extra_outcomepositive                                                      68.42
tax_filer_stat Joint both under 65                                         62.35
detailed_household_and_family_stat Child <18 never marr not in subfamily   57.73
detailed_occupation_recode39                                               53.07
detailed_occupation_recode2                                                51.62
educ_levelno-HS                                                            50.62
detailed_occupation_recode11                                               50.10
detailed_industry_recode20                                                 46.54
detailed_household_and_family_stat Secondary individual                    45.48
detailed_occupation_recode26                                               41.78
marital_stat Married-civilian spouse present                               40.73
detailed_industry_recode33                                                 40.26
detailed_occupation_recode5                                                40.25
detailed_industry_recode44                                                 40.06
detailed_occupation_recode27                                               38.71
detailed_occupation_recode25                                               38.58

Nous avons detailed_occupation_recode7, detailed_occupation_recode11 et educ_levelHS-grad qui influencent beaucoup le modèle.

Le graphe plotnet du réseau de neurones:

Apply the tree to test set

Voici le resultat de la validation:

 Accuracy     Kappa 
0.9515333 0.4697091 
Confusion Matrix and Statistics

          Reference
Prediction -50000 +50000
    -50000  41184   1673
    +50000    478   1046
                                          
               Accuracy : 0.9515          
                 95% CI : (0.9495, 0.9535)
    No Information Rate : 0.9387          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.4697          
                                          
 Mcnemar's Test P-Value : < 2.2e-16       
                                          
            Sensitivity : 0.9885          
            Specificity : 0.3847          
         Pos Pred Value : 0.9610          
         Neg Pred Value : 0.6864          
             Prevalence : 0.9387          
         Detection Rate : 0.9280          
   Detection Prevalence : 0.9657          
      Balanced Accuracy : 0.6866          
                                          
       'Positive' Class : -50000          
                                          

Nous avons une faible erreur de validation et elle est équivalant à l’erreur d’apprentissage.

Le kappa est modéré avec un accord modéré de prédiction.

Confusion Table

Confusion Table NNET
-50000 +50000
-50000 41184 1673
+50000 478 1046

La matrice de confusion suivante se lit alors comme suit :

  • horizontalement, sur les 42857 données outcome “- 50 000” , 41184 ont été estimés par le système de classification comme “-50 000” et 1673 ont été estimés comme “+ 50 000” (faux-négatifs),

  • horizontalement, sur les 1524 données outcome “+ 50 000” , 478 ont été estimés comme “-50 000” (faux-positifs) et 1046 ont été estimés comme “+ 50 000”

  • verticalement, sur les 41662 outcome estimés par le système comme “- 50 000”, 478 sont en fait des outcome “+ 50 000”,

  • verticalement, sur les 2719 outcome estimés par le système comme “+ 50 000”, 1046 sont en fait des outcome “- 50 000”.

Resultat de la prédiction

Resultats Neuronal Network
Durée.Execution Accuracy Taux.Erreur Recall Precision
Neural Networks 28.59946 mins 0.9515333 0.0484667 0.9885267 0.9609632

Nous avons une très bonne accuracy pour la prédiction mais le temps d’excution est très long.

Conclusion

Nous avons construit plusieurs modèles de classification pour prédire si un citoyen américain gagne plus ou moins de 50 000 $ par an. Nous avons utilisé le Stochastic Gradient Boosting ,la forêt aléatoire utilisant le bagging, les machines à vecteurs de support linéaire et à noyau, les arbres de décisions, les naives Bayes, kNN et Reseau de neurones. Dans le tableau ci-dessous, nous résumons l’accuracy, le taux d’erreur, le recall, la precision et le temps d’execution pour tous les modèles .

Le modèle le plus précis est le modèle Stochastic Gradient Boosting. En revanche, le modèle de Naives Bayes a la meilleure durée d’exécution avec seulement 5 min pour la modélisation avec les covariables mais il ne prédit pas les outcome “+50000”. Concernant le modèle SVM radial, il a un problème de sur-apprentissage d’où le faible score accuracy.

En termes de temps de calcul et précision, le meilleur modèle est l’arbre de décision CART.

En conclusion, après avoir pris en compte tous les indicateurs de performance, le modèle de l’arbre de décision semblent être le choix le plus approprié pour prédire la valeur outcome du dataset Census.

Resultats des 8 Algorithmes
Accuracy Taux.Erreur Durée.Execution Recall Precision
Stochastic Gradient Boosting 0.9520516 0.0479484 31.227520 mins 0.9891988 0.9608767
Classification Tree CART 0.9468692 0.0531308 8.034623 mins 0.9536682 0.9915751
Random Forest 0.8341407 0.1658593 14.986826 mins 0.9924767 0.8296049
Naives Bayes 0.9387350 0.0612650 5.327326 mins 1.0000000 0.9387350
SVM linéaire 0.8370474 0.1629526 20.343674 mins 0.8326053 0.9926172
SVM radial 0.5627633 0.4372367 27.546775 mins 0.5368681 0.9951061
K nearest neighbors KNN 0.8125099 0.1874901 13.292672 mins 0.8067304 0.9920600
Neural Networks 0.9515333 0.0484667 28.599459 mins 0.9885267 0.9609632

Annexes

Nous avons les Covariables de * class_of_worker * avec comme factor levels:
[1] " Federal government"             " Local government"              
[3] " Never worked"                   " Not in universe"               
[5] " Private"                        " Self-employed-incorporated"    
[7] " Self-employed-not incorporated" " State government"              
[9] " Without pay"                   
Nous avons un total de 9 covariables pour la variable *class_of_worker*
Nous avons les Covariables de * detailed_industry_recode * avec comme factor levels:
 [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13"
[15] "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27"
[29] "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41"
[43] "42" "43" "44" "45" "46" "47" "48" "49" "50" "51"
Nous avons un total de 52 covariables pour la variable *detailed_industry_recode*
Nous avons les Covariables de * detailed_occupation_recode * avec comme factor levels:
 [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13"
[15] "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27"
[29] "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41"
[43] "42" "43" "44" "45" "46"
Nous avons un total de 47 covariables pour la variable *detailed_occupation_recode*
Nous avons les Covariables de * education * avec comme factor levels:
 [1] " 10th grade"                            
 [2] " 11th grade"                            
 [3] " 12th grade no diploma"                 
 [4] " 1st 2nd 3rd or 4th grade"              
 [5] " 5th or 6th grade"                      
 [6] " 7th and 8th grade"                     
 [7] " 9th grade"                             
 [8] " Associates degree-academic program"    
 [9] " Associates degree-occup /vocational"   
[10] " Bachelors degree(BA AB BS)"            
[11] " Children"                              
[12] " Doctorate degree(PhD EdD)"             
[13] " High school graduate"                  
[14] " Less than 1st grade"                   
[15] " Masters degree(MA MS MEng MEd MSW MBA)"
[16] " Prof school degree (MD DDS DVM LLB JD)"
[17] " Some college but no degree"            
Nous avons un total de 17 covariables pour la variable *education*
Nous avons les Covariables de * enroll_in_edu_inst_last_wk * avec comme factor levels:
[1] " College or university" " High school"          
[3] " Not in universe"      
Nous avons un total de 3 covariables pour la variable *enroll_in_edu_inst_last_wk*
Nous avons les Covariables de * marital_stat * avec comme factor levels:
[1] " Divorced"                        " Married-A F spouse present"     
[3] " Married-civilian spouse present" " Married-spouse absent"          
[5] " Never married"                   " Separated"                      
[7] " Widowed"                        
Nous avons un total de 7 covariables pour la variable *marital_stat*
Nous avons les Covariables de * major_industry_code * avec comme factor levels:
 [1] " Agriculture"                        
 [2] " Armed Forces"                       
 [3] " Business and repair services"       
 [4] " Communications"                     
 [5] " Construction"                       
 [6] " Education"                          
 [7] " Entertainment"                      
 [8] " Finance insurance and real estate"  
 [9] " Forestry and fisheries"             
[10] " Hospital services"                  
[11] " Manufacturing-durable goods"        
[12] " Manufacturing-nondurable goods"     
[13] " Medical except hospital"            
[14] " Mining"                             
[15] " Not in universe or children"        
[16] " Other professional services"        
[17] " Personal services except private HH"
[18] " Private household services"         
[19] " Public administration"              
[20] " Retail trade"                       
[21] " Social services"                    
[22] " Transportation"                     
[23] " Utilities and sanitary services"    
[24] " Wholesale trade"                    
Nous avons un total de 24 covariables pour la variable *major_industry_code*
Nous avons les Covariables de * major_occupation_code * avec comme factor levels:
 [1] " Adm support including clerical"       
 [2] " Armed Forces"                         
 [3] " Executive admin and managerial"       
 [4] " Farming forestry and fishing"         
 [5] " Handlers equip cleaners etc "         
 [6] " Machine operators assmblrs & inspctrs"
 [7] " Not in universe"                      
 [8] " Other service"                        
 [9] " Precision production craft & repair"  
[10] " Private household services"           
[11] " Professional specialty"               
[12] " Protective services"                  
[13] " Sales"                                
[14] " Technicians and related support"      
[15] " Transportation and material moving"   
Nous avons un total de 15 covariables pour la variable *major_occupation_code*
Nous avons les Covariables de * race * avec comme factor levels:
[1] " Amer Indian Aleut or Eskimo" " Asian or Pacific Islander"  
[3] " Black"                       " Other"                      
[5] " White"                      
Nous avons un total de 5 covariables pour la variable *race*
Nous avons les Covariables de * hispanic_origin * avec comme factor levels:
 [1] " All other"                 " Central or South American"
 [3] " Chicano"                   " Cuban"                    
 [5] " Do not know"               " Mexican-American"         
 [7] " Mexican (Mexicano)"        " NA"                       
 [9] " Other Spanish"             " Puerto Rican"             
Nous avons un total de 10 covariables pour la variable *hispanic_origin*
Nous avons les Covariables de * sex * avec comme factor levels:
[1] " Female" " Male"  
Nous avons un total de 2 covariables pour la variable *sex*
Nous avons les Covariables de * member_of_a_labor_union * avec comme factor levels:
[1] " No"              " Not in universe" " Yes"            
Nous avons un total de 3 covariables pour la variable *member_of_a_labor_union*
Nous avons les Covariables de * reason_for_unemployment * avec comme factor levels:
[1] " Job leaver"            " Job loser - on layoff"
[3] " New entrant"           " Not in universe"      
[5] " Other job loser"       " Re-entrant"           
Nous avons un total de 6 covariables pour la variable *reason_for_unemployment*
Nous avons les Covariables de * full_or_part_time_employment_stat * avec comme factor levels:
[1] " Children or Armed Forces"          
[2] " Full-time schedules"               
[3] " Not in labor force"                
[4] " PT for econ reasons usually FT"    
[5] " PT for econ reasons usually PT"    
[6] " PT for non-econ reasons usually FT"
[7] " Unemployed full-time"              
[8] " Unemployed part- time"             
Nous avons un total de 8 covariables pour la variable *full_or_part_time_employment_stat*
Nous avons les Covariables de * tax_filer_stat * avec comme factor levels:
[1] " Head of household"            " Joint both 65+"              
[3] " Joint both under 65"          " Joint one under 65 & one 65+"
[5] " Nonfiler"                     " Single"                      
Nous avons un total de 6 covariables pour la variable *tax_filer_stat*
Nous avons les Covariables de * region_of_previous_residence * avec comme factor levels:
[1] " Abroad"          " Midwest"         " Northeast"      
[4] " Not in universe" " South"           " West"           
Nous avons un total de 6 covariables pour la variable *region_of_previous_residence*
Nous avons les Covariables de * state_of_previous_residence * avec comme factor levels:
 [1] " Abroad"               " Alabama"             
 [3] " Alaska"               " Arizona"             
 [5] " Arkansas"             " California"          
 [7] " Colorado"             " Connecticut"         
 [9] " Delaware"             " District of Columbia"
[11] " Florida"              " Georgia"             
[13] " Idaho"                " Illinois"            
[15] " Indiana"              " Iowa"                
[17] " Kansas"               " Kentucky"            
[19] " Louisiana"            " Maine"               
[21] " Maryland"             " Massachusetts"       
[23] " Michigan"             " Minnesota"           
[25] " Mississippi"          " Missouri"            
[27] " Montana"              " Nebraska"            
[29] " Nevada"               " New Hampshire"       
[31] " New Jersey"           " New Mexico"          
[33] " New York"             " North Carolina"      
[35] " North Dakota"         " Not in universe"     
[37] " Ohio"                 " Oklahoma"            
[39] " Oregon"               " Pennsylvania"        
[41] " South Carolina"       " South Dakota"        
[43] " Tennessee"            " Texas"               
[45] " Utah"                 " Vermont"             
[47] " Virginia"             " West Virginia"       
[49] " Wisconsin"            " Wyoming"             
[51] "Inconnu"              
Nous avons un total de 51 covariables pour la variable *state_of_previous_residence*
Nous avons les Covariables de * detailed_household_and_family_stat * avec comme factor levels:
 [1] " Child <18 ever marr not in subfamily"           
 [2] " Child <18 ever marr RP of subfamily"            
 [3] " Child <18 never marr not in subfamily"          
 [4] " Child <18 never marr RP of subfamily"           
 [5] " Child <18 spouse of subfamily RP"               
 [6] " Child 18+ ever marr Not in a subfamily"         
 [7] " Child 18+ ever marr RP of subfamily"            
 [8] " Child 18+ never marr Not in a subfamily"        
 [9] " Child 18+ never marr RP of subfamily"           
[10] " Child 18+ spouse of subfamily RP"               
[11] " Child under 18 of RP of unrel subfamily"        
[12] " Grandchild <18 ever marr not in subfamily"      
[13] " Grandchild <18 never marr child of subfamily RP"
[14] " Grandchild <18 never marr not in subfamily"     
[15] " Grandchild <18 never marr RP of subfamily"      
[16] " Grandchild 18+ ever marr not in subfamily"      
[17] " Grandchild 18+ ever marr RP of subfamily"       
[18] " Grandchild 18+ never marr not in subfamily"     
[19] " Grandchild 18+ never marr RP of subfamily"      
[20] " Grandchild 18+ spouse of subfamily RP"          
[21] " Householder"                                    
[22] " In group quarters"                              
[23] " Nonfamily householder"                          
[24] " Other Rel <18 ever marr not in subfamily"       
[25] " Other Rel <18 ever marr RP of subfamily"        
[26] " Other Rel <18 never marr child of subfamily RP" 
[27] " Other Rel <18 never marr not in subfamily"      
[28] " Other Rel <18 never married RP of subfamily"    
[29] " Other Rel <18 spouse of subfamily RP"           
[30] " Other Rel 18+ ever marr not in subfamily"       
[31] " Other Rel 18+ ever marr RP of subfamily"        
[32] " Other Rel 18+ never marr not in subfamily"      
[33] " Other Rel 18+ never marr RP of subfamily"       
[34] " Other Rel 18+ spouse of subfamily RP"           
[35] " RP of unrelated subfamily"                      
[36] " Secondary individual"                           
[37] " Spouse of householder"                          
[38] " Spouse of RP of unrelated subfamily"            
Nous avons un total de 38 covariables pour la variable *detailed_household_and_family_stat*
Nous avons les Covariables de * detailed_household_summary_in_household * avec comme factor levels:
[1] " Child 18 or older"                   
[2] " Child under 18 ever married"         
[3] " Child under 18 never married"        
[4] " Group Quarters- Secondary individual"
[5] " Householder"                         
[6] " Nonrelative of householder"          
[7] " Other relative of householder"       
[8] " Spouse of householder"               
Nous avons un total de 8 covariables pour la variable *detailed_household_summary_in_household*
Nous avons les Covariables de * migration_code_changeinmsa * avec comme factor levels:
 [1] " Abroad to MSA"    " Abroad to nonMSA" " MSA to MSA"      
 [4] " MSA to nonMSA"    " Nonmover"         " NonMSA to MSA"   
 [7] " NonMSA to nonMSA" " Not identifiable" " Not in universe" 
[10] "Inconnu"          
Nous avons un total de 10 covariables pour la variable *migration_code_changeinmsa*
Nous avons les Covariables de * migration_code_change_in_reg * avec comme factor levels:
[1] " Abroad"                         " Different county same state"   
[3] " Different division same region" " Different region"              
[5] " Different state same division"  " Nonmover"                      
[7] " Not in universe"                " Same county"                   
[9] "Inconnu"                        
Nous avons un total de 9 covariables pour la variable *migration_code_change_in_reg*
Nous avons les Covariables de * migration_code_move_with_in_reg * avec comme factor levels:
 [1] " Abroad"                       " Different county same state" 
 [3] " Different state in Midwest"   " Different state in Northeast"
 [5] " Different state in South"     " Different state in West"     
 [7] " Nonmover"                     " Not in universe"             
 [9] " Same county"                  "Inconnu"                      
Nous avons un total de 10 covariables pour la variable *migration_code_move_with_in_reg*
Nous avons les Covariables de * live_int_his_house_1_year_ago * avec comme factor levels:
[1] " No"                               " Not in universe under 1 year old"
[3] " Yes"                             
Nous avons un total de 3 covariables pour la variable *live_int_his_house_1_year_ago*
Nous avons les Covariables de * migration_prevres_in_sunbelt * avec comme factor levels:
[1] " No"              " Not in universe" " Yes"            
[4] "Inconnu"         
Nous avons un total de 4 covariables pour la variable *migration_prevres_in_sunbelt*
Nous avons les Covariables de * family_members_under_18 * avec comme factor levels:
[1] " Both parents present"   " Father only present"   
[3] " Mother only present"    " Neither parent present"
[5] " Not in universe"       
Nous avons un total de 5 covariables pour la variable *family_members_under_18*
Nous avons les Covariables de * countryofbirthfather * avec comme factor levels:
 [1] " Cambodia"                     " Canada"                      
 [3] " China"                        " Columbia"                    
 [5] " Cuba"                         " Dominican-Republic"          
 [7] " Ecuador"                      " El-Salvador"                 
 [9] " England"                      " France"                      
[11] " Germany"                      " Greece"                      
[13] " Guatemala"                    " Haiti"                       
[15] " Holand-Netherlands"           " Honduras"                    
[17] " Hong Kong"                    " Hungary"                     
[19] " India"                        " Iran"                        
[21] " Ireland"                      " Italy"                       
[23] " Jamaica"                      " Japan"                       
[25] " Laos"                         " Mexico"                      
[27] " Nicaragua"                    " Outlying-U S (Guam USVI etc)"
[29] " Panama"                       " Peru"                        
[31] " Philippines"                  " Poland"                      
[33] " Portugal"                     " Puerto-Rico"                 
[35] " Scotland"                     " South Korea"                 
[37] " Taiwan"                       " Thailand"                    
[39] " Trinadad&Tobago"              " United-States"               
[41] " Vietnam"                      " Yugoslavia"                  
[43] "Inconnu"                      
Nous avons un total de 43 covariables pour la variable *countryofbirthfather*
Nous avons les Covariables de * country_of_birthmother * avec comme factor levels:
 [1] " Cambodia"                     " Canada"                      
 [3] " China"                        " Columbia"                    
 [5] " Cuba"                         " Dominican-Republic"          
 [7] " Ecuador"                      " El-Salvador"                 
 [9] " England"                      " France"                      
[11] " Germany"                      " Greece"                      
[13] " Guatemala"                    " Haiti"                       
[15] " Holand-Netherlands"           " Honduras"                    
[17] " Hong Kong"                    " Hungary"                     
[19] " India"                        " Iran"                        
[21] " Ireland"                      " Italy"                       
[23] " Jamaica"                      " Japan"                       
[25] " Laos"                         " Mexico"                      
[27] " Nicaragua"                    " Outlying-U S (Guam USVI etc)"
[29] " Panama"                       " Peru"                        
[31] " Philippines"                  " Poland"                      
[33] " Portugal"                     " Puerto-Rico"                 
[35] " Scotland"                     " South Korea"                 
[37] " Taiwan"                       " Thailand"                    
[39] " Trinadad&Tobago"              " United-States"               
[41] " Vietnam"                      " Yugoslavia"                  
[43] "Inconnu"                      
Nous avons un total de 43 covariables pour la variable *country_of_birthmother*
Nous avons les Covariables de * country_of_birthself * avec comme factor levels:
 [1] " Cambodia"                     " Canada"                      
 [3] " China"                        " Columbia"                    
 [5] " Cuba"                         " Dominican-Republic"          
 [7] " Ecuador"                      " El-Salvador"                 
 [9] " England"                      " France"                      
[11] " Germany"                      " Greece"                      
[13] " Guatemala"                    " Haiti"                       
[15] " Holand-Netherlands"           " Honduras"                    
[17] " Hong Kong"                    " Hungary"                     
[19] " India"                        " Iran"                        
[21] " Ireland"                      " Italy"                       
[23] " Jamaica"                      " Japan"                       
[25] " Laos"                         " Mexico"                      
[27] " Nicaragua"                    " Outlying-U S (Guam USVI etc)"
[29] " Panama"                       " Peru"                        
[31] " Philippines"                  " Poland"                      
[33] " Portugal"                     " Puerto-Rico"                 
[35] " Scotland"                     " South Korea"                 
[37] " Taiwan"                       " Thailand"                    
[39] " Trinadad&Tobago"              " United-States"               
[41] " Vietnam"                      " Yugoslavia"                  
[43] "Inconnu"                      
Nous avons un total de 43 covariables pour la variable *country_of_birthself*
Nous avons les Covariables de * citizenship * avec comme factor levels:
[1] " Foreign born- Not a citizen of U S "        
[2] " Foreign born- U S citizen by naturalization"
[3] " Native- Born abroad of American Parent(s)"  
[4] " Native- Born in Puerto Rico or U S Outlying"
[5] " Native- Born in the United States"          
Nous avons un total de 5 covariables pour la variable *citizenship*
Nous avons les Covariables de * business_or_selfemployed * avec comme factor levels:
[1] "0" "1" "2"
Nous avons un total de 3 covariables pour la variable *business_or_selfemployed*
Nous avons les Covariables de * fill_inc_questionnaire_for_veterans_admi * avec comme factor levels:
[1] " No"              " Not in universe" " Yes"            
Nous avons un total de 3 covariables pour la variable *fill_inc_questionnaire_for_veterans_admi*
Nous avons les Covariables de * veterans_benefits * avec comme factor levels:
[1] "0" "1" "2"
Nous avons un total de 3 covariables pour la variable *veterans_benefits*
Nous avons les Covariables de * year * avec comme factor levels:
[1] "94" "95"
Nous avons un total de 2 covariables pour la variable *year*
Nous avons les Covariables de * outcome * avec comme factor levels:
[1] "-50000" "+50000"
Nous avons un total de 2 covariables pour la variable *outcome*
Nous avons les Covariables de * groupedeage * avec comme factor levels:
[1] "jusqu'à 18 ans" "19 à 33 ans"    "34 à 62 ans"    "63 ans et plus"
Nous avons un total de 4 covariables pour la variable *groupedeage*
Nous avons les Covariables de * native_region * avec comme factor levels:
[1] " Central-America" " Central-Asia"    " East-Asia"      
[4] " Europe-East"     " Europe-West"     " Outlying-US"    
[7] " South-America"   " United-States"  
Nous avons un total de 8 covariables pour la variable *native_region*
Nous avons les Covariables de * educ_level * avec comme factor levels:
[1] "CC-grad"     "College"     "grad-school" "HS-grad"     "no-HS"      
Nous avons un total de 5 covariables pour la variable *educ_level*
Nous avons les Covariables de * extra_outcome * avec comme factor levels:
[1] "none"     "positive"
Nous avons un total de 2 covariables pour la variable *extra_outcome*

Call:
PCA(X = data_acp, quali.sup = 7, graph = FALSE) 


Eigenvalues
                       Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6
Variance               1.866   1.123   1.001   0.910   0.850   0.251
% of var.             31.103  18.711  16.679  15.161  14.163   4.183
Cumulative % of var.  31.103  49.814  66.493  81.654  95.817 100.000

Individuals (the 10 first)
                                    Dist    Dim.1    ctr   cos2    Dim.2
284829                          |  2.100 |  1.825  0.001  0.755 | -0.257
21187                           |  1.287 | -1.267  0.000  0.970 | -0.028
64649                           |  1.287 | -1.267  0.000  0.970 | -0.028
12643                           |  1.287 | -1.267  0.000  0.970 | -0.028
21863                           |  1.287 | -1.267  0.000  0.970 | -0.028
169260                          |  2.056 |  0.973  0.000  0.224 | -0.343
258087                          |  1.287 | -1.267  0.000  0.970 | -0.028
164023                          |  5.086 |  0.251  0.000  0.002 | -0.843
18464                           |  2.188 |  1.906  0.001  0.759 |  0.222
148883                          |  1.493 |  1.267  0.000  0.719 | -0.205
                                   ctr   cos2    Dim.3    ctr   cos2  
284829                           0.000  0.015 | -0.141  0.000  0.005 |
21187                            0.000  0.000 | -0.020  0.000  0.000 |
64649                            0.000  0.000 | -0.020  0.000  0.000 |
12643                            0.000  0.000 | -0.020  0.000  0.000 |
21863                            0.000  0.000 | -0.020  0.000  0.000 |
169260                           0.000  0.028 | -0.493  0.000  0.058 |
258087                           0.000  0.000 | -0.020  0.000  0.000 |
164023                           0.000  0.027 | -1.228  0.001  0.058 |
18464                            0.000  0.010 | -0.342  0.000  0.024 |
148883                           0.000  0.019 | -0.115  0.000  0.006 |

Variables
                                   Dim.1    ctr   cos2    Dim.2    ctr
wage_per_hour                   |  0.405  8.779  0.164 | -0.168  2.526
capital_gains                   |  0.154  1.279  0.024 |  0.713 45.267
capital_losses                  |  0.195  2.030  0.038 |  0.068  0.413
from_stocks                     |  0.048  0.123  0.002 |  0.759 51.299
num_persons_worked_for_employer |  0.902 43.609  0.814 | -0.065  0.382
weeks_worked_in_year            |  0.908 44.181  0.825 | -0.036  0.114
                                  cos2    Dim.3    ctr   cos2  
wage_per_hour                    0.028 | -0.236  5.556  0.056 |
capital_gains                    0.508 | -0.282  7.968  0.080 |
capital_losses                   0.005 |  0.921 84.734  0.848 |
from_stocks                      0.576 |  0.127  1.605  0.016 |
num_persons_worked_for_employer  0.004 | -0.031  0.094  0.001 |
weeks_worked_in_year             0.001 | -0.020  0.042  0.000 |

Supplementary categories
                                      Dist      Dim.1     cos2   v.test  
-50000                          |    0.124 |   -0.099    0.640 -125.844 |
+50000                          |    1.870 |    1.496    0.640  125.844 |
                                   Dim.2     cos2   v.test      Dim.3
-50000                            -0.070    0.321 -114.847 |   -0.018
+50000                             1.059    0.321  114.847 |    0.278
                                    cos2   v.test  
-50000                             0.022  -31.958 |
+50000                             0.022   31.958 |