Skip to content

Instantly share code, notes, and snippets.

@arnaudgodin
Created July 11, 2016 15:43
Show Gist options
  • Select an option

  • Save arnaudgodin/8382e3cdb2b1bb8743bd24e77500c9fe to your computer and use it in GitHub Desktop.

Select an option

Save arnaudgodin/8382e3cdb2b1bb8743bd24e77500c9fe to your computer and use it in GitHub Desktop.
#Étude sur l'Enquête nationale auprès des ménages de 2011: Indices de Gini et Courbes de Lorenz
#Par Arnaud Godin
#Travail présenté à Vincent Boucher
#Été 2016
#Version R
###################################################################################################
library(foreign)
enm<-read.csv("enm-99M0002-F-2011-hierarchique_F1.csv", stringsAsFactors=FALSE)
#On génère les différentes variables nécessaires pour étudier les inégalités de revenu par l'indice de Gini et la courbe de Lorenz
#Revenu de marché:
revmarche<-enm$MRKINC[enm$MRKINC!=9999999 & enm$MRKINC!=8888888, drop=TRUE]
#Revenu après impôts:
revimpot<-enm$TOTINC_AT[enm$TOTINC_AT!=999999 & enm$TOTINC_AT!=888888, drop=TRUE]
#Revenu total avant impôt:
revtotal<-enm$TOTINC[enm$TOTINC!=9999999 & enm$TOTINC!=8888888, drop=TRUE]
#Revenu disponible:
revdisp<-enm$EFDIMBM[enm$EFDIMBM!=999999 & enm$EFDIMBM!=888888, drop=TRUE]
#On définit une variable de poids plus facilement manipulable:
poid<-enm$WEIGHT
#Il faut installer le package permettant de réaliser les traitements sur les inégalités
#Reldist permet de calculer les indices de Gini pondérés ou non
#install.packages("reldist")
library(reldist)
#On calcule d'abord les indices de Gini sans qu'il n'y ait de pondération pour la population
revenu<-list(revmarche, revtotal, revimpot, revdisp)
Gini<-vapply(revenu,gini,numeric(1))
#On se penche ensuite du côté de indices de Gini pondérés pour la population, pas les familles économiques
Gini_Pondere<-vapply(revenu, gini, weights=(1/poid), numeric(1))
#On assigne des noms pour la matrice des résultats
Revenus<-c("Revenu de marché", "Revenu total", "Revenu après impôts", "Revenu disponible")
typerevenus<-data.frame(Gini, Gini_Pondere, row.names=Revenus)
tableaufinal<-format(typerevenus, digits=4, justifiy="right")
repeat{
presentation_gini<-readline(prompt="Quels indices de Gini voudriez-vous voir (m, t, i, d, tous, aucun)?:")
if (presentation_gini=="m"){
print(tableaufinal["Revenu de marché",])
} else if (presentation_gini=="t"){
print(tableaufinal["Revenu total",])
} else if (presentation_gini=="i"){
print(tableaufinal["Revenu après impôts",])
} else if (presentation_gini=="d"){
print(tableaufinal["Revenu disponible",])
} else if (presentation_gini=="tous") {
print(tableaufinal)
} else if (presentation_gini=="aucun"){
print("Parfait, passons aux courbes de Lorenz")
} else {
print("Invalide, il faut choisir entre 'Marche', 'Total', 'Disponible', 'tous' ou 'aucun'")
}
if (presentation_gini=="aucun"){
break
}
}
##################################################################################################
#On se penche maintenant du côté de la famille économique pour considérer les économies d'échelles
fam<-enm$EF_ID #Les identifiants des familles économiques
#Revenu de marché des familles économiques:
revmarche1<-enm$MRKINC[enm$MRKINC!=9999999 & enm$MRKINC!=8888888 & enm$EF_RP!=3, drop=TRUE]
famrep1<-fam[enm$MRKINC!=9999999 & enm$MRKINC!=8888888 & enm$EF_RP!=3, drop=TRUE]
revmarchefam<-tapply(revmarche1, famrep1, FUN=sum)
#Revenu après impôts des familles économiques:
revimpot1<-enm$TOTINC_AT[enm$TOTINC_AT!=999999 & enm$TOTINC_AT!=888888 & enm$EF_RP!=3, drop=TRUE]
famrep2<-fam[enm$TOTINC_AT!=999999 & enm$TOTINC_AT!=888888 & enm$EF_RP!=3, drop=TRUE]
revimpotfam<-tapply(revimpot1, famrep2, FUN=sum)
#Revenu total avant impôts des familles économiques:
revtotal1<-enm$TOTINC[enm$TOTINC!=9999999 & enm$TOTINC!=8888888 & enm$EF_RP!=3, drop=TRUE]
famrep3<-fam[enm$TOTINC!=9999999 & enm$TOTINC!=8888888 & enm$EF_RP!=3, drop=TRUE]
revtotalfam<-tapply(revtotal1, famrep3, FUN=sum)
#Revenu disponible des familles économiques:
revdisp1<-enm$EFDIMBM[enm$EFDIMBM!=999999 & enm$EFDIMBM!=888888 & enm$EF_RP!=3, drop=TRUE]
famrep4<-fam[enm$EFDIMBM!=999999 & enm$EFDIMBM!=888888 & enm$EF_RP!=3, drop=TRUE]
revdispfam<-tapply(revdisp1, famrep4, FUN=sum)
#famrep4 correspond à la véritable taille des familles économiques, car pour les autres types de revenus
# ils n'y avait pas d'objet pour certains membres de famille et donc ils ont été retirés du calcul du revenu
# total de la famille. Par contre, sous le revenu disponible, ces individus obtenait un certain revenu et apparaissaient.
# Après vérification, c'est bien cette taille de famille qu'il importe d'utiliser dans les calculs
#####################################################################################################
#IL FAUT TROUVER UNE MANIÈRE DE CALCULER LE POIDS DE CHAQUE FAMILLE ÉCONOMIQUE
T<-factor(famrep4) #Ici, je fais sortir les identifiants des familles économiques
f<-as.numeric(levels(T)) #Je créé un vecteur numérique plus facilement manipulable de ces identifiants
taillef<-function(x){
sqrt(sum(famrep4==x))
}
#Cette fonction indique que si l'identifiant de famrep4 équivaut à la valeur x (eg. famrep4=21), alors elle doit
#faire la somme de tous les identifiants égaux à cette valeur et donner la racine carrée de cette somme.
taille<-vapply(f, taillef, numeric(1))
#Ici, pour chaque valeur x du vecteur f, on applique la fonction taillef et on retourne un vecteur numérique
#(eg. si f[1]=21, alors on fait taillef(21) et on place le résultat dans taille à la position taille[1]). On
#obtient le vecteur de la racine carrée de la taille de toutes la familles économiques étudiées.
revenu1<-list(revmarchefam, revtotalfam, revimpotfam, revdispfam)
#On fait une liste avec les différents types de revenus
super<-function(s){
s/taille
}
#La fonction ci-haut permet de diviser chaque revenu par la taille du ménage appropriée. Ainsi si s=revmarchefam
#alors revmarchefam[1] est divisé par taille[1]. Cela permet donc d'évaluer les économies d'échelle au sein d'une famille
#économique.
revenu2<-lapply(revenu1, super)
#Ce nouvel objet contient les quatre distributions de revenus des familles économiques (Une liste de vecteurs)
######################################################################################################
#On calcule maintenant les indices au niveau de la famille économique
Gini1<-vapply(revenu2, gini, numeric(1))
#On se penche ensuite du côté de indices de Gini pondérés pour les familles économiques
#C'est ici que l'indice de gini ne fonctionne plus avec les familles
Gini_Pondere1<-vapply(revenu2, gini, weights=(1/poid), numeric(1))
#On assigne les différents indices de Gini à des vecteurs pour ensuite les faire entrer dans une matrice
Revenus1<-c("Revenu de marché familles économiques", "Revenu total familles économiques", "Revenu après impôt familles économiques", "Revenu disponible familles économiques")
typerevenus1<-data.frame(Gini1, Gini_Pondere1, row.names=Revenus1)
tableaufinal1<-format(typerevenus1, digits=4, justifiy="right")
print(tableaufinal1)
repeat{
presentation_gini_famille<-readline(prompt="Quels indices de Gini pour les familles économiques voudriez-vous voir (m, t, i, d, tous, aucun)?:")
if (presentation_gini=="m"){
print(tableaufinal1["Revenu de marché familles économiques",])
} else if (presentation_gini=="t"){
print(tableaufinal1["Revenu total familles économiques",])
} else if (presentation_gini=="i"){
print(tableaufinal1["Revenu après impôt familles économiques",])
} else if (presentation_gini=="d"){
print(tableaufinal1["Revenu disponible familles économiques",])
} else if (presentation_gini=="tous") {
print(tableaufinal1)
} else if (presentation_gini=="aucun"){
print("Parfait, passons aux courbes de Lorenz")
} else {
print("Invalide, il faut choisir entre 'Marche', 'Total', 'Disponible', 'tous' ou 'aucun'")
}
if (presentation_gini=="aucun"){
break
}
}
##########################################################################################################
#Maintenant, c'est les courbes de Lorenz qui nous intéressent
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment