Freakonometrics

To content | To menu | To search

Tag - données

Entries feed - Comments feed

Tuesday, October 30 2012

Créer sa propre base de données

Pour répondre à plusieurs questions, pour constituer sa propre base, il est important d'avoir différentes variables pour un même individu. Un individu peut être une entité plus large, comme une région, ou un quartier. Supposons que l'on s'intéresse aux votes lors d’élections. Désolé de reprendre des votes en France, mais les données sont faciles d'accès. Par exemple, pour Paris, on a les données de l'élection présidentielle de 2012, sur http://opendata.paris.fr/

> baseE=read.csv(
+ "http://freakonometrics.blog.free.fr/public/
data/election-paris-quartiers.csv",
+ header=TRUE,sep=";")

J'ai mes les données sur mon blog car c'est plus simple pour les lire. Les données ressemblent à ça,

> baseE[1:6,1:5]
ARR              QUARTIERS GRD_QUART INSCRITS EMARGEMENTS
1   1 SAINTGERMAINLAUXERROIS   7510101     1075         854
2   1                 HALLES   7510102     5667        4529
3   1            PALAISROYAL   7510103     1986        1610
4   1           PLACEVENDOME   7510104     1762        1427
5   2                GAILLON   7510205      799         613
6   2               VIVIENNE   7510206     1929        1485

Les données sont "par arrondissement et par quartier" comme on le lit dans le descriptif. Une ligne est un quartier. Maintenant, si on veut expliquer le taux de vote, ou le taux obtenu par tel ou tel candidat, il faut des variables explicatives. 

Pour cela, on peut aller sur http://www.recensement.insee.fr/ qui met en ligne beaucoup de données. En particulier, avec le même niveau de granularité, par quartier !

> base1=read.table(
+ "http://freakonometrics.blog.free.fr/public/
data/IRIS-PARIS-ACTIV.csv",
+ header=TRUE,sep=";")
Si on regarde dans la base,
> base1[1:15,c(1,2,3,4,5,7,8)]
IRIS REG DEP UU2010   COM TRIRIS GRD_QUART
1  751010101  11  75    851 75101 750011   7510101
2  751010102  11  75    851 75101 750011   7510101
3  751010103  11  75    851 75101 750011   7510101
4  751010104  11  75    851 75101 750011   7510101
5  751010105  11  75    851 75101 750011   7510101
6  751010199  11  75    851 75101 750011   7510101
7  751010201  11  75    851 75101 750021   7510102
8  751010202  11  75    851 75101 750021   7510102
9  751010203  11  75    851 75101 750021   7510102
10 751010204  11  75    851 75101 750021   7510102
11 751010205  11  75    851 75101 750021   7510102
12 751010206  11  75    851 75101 750021   7510102
13 751010301  11  75    851 75101 750011   7510103
14 751010302  11  75    851 75101 750011   7510103
15 751010303  11  75    851 75101 750011   7510103
En fait, le niveau d'agrégation est encore plus fin que les quartiers utilisés pour les élections. Mais on peut faire des sous-totaux, par quartier,
> base1t=aggregate(base1[,-(1:11)],
+ by=list(GRD_QUART=base1$GRD_QUART), FUN=sum)
> base1t[1:5,c(1,4,5,7,8)]
GRD_QUART P08_POP1564 P08_POP1524 P08_POP5564 P08_H1564
1   7510101        1278         222         250       662
2   7510102        7420        1187        1061      3987
3   7510103        2305         475         392      1171
4   7510104        2111         376         308      1010
5   7510205         875         111         136       426
On a enfin des bases construites sur les mêmes individus. Reste à fusionner,
> baseT=merge(baseE,base1t,by="GRD_QUART")
On a bien d'autres bases que cette base de population,
> base2=read.table(
+ "http://freakonometrics.blog.free.fr/public/
data/IRIS-PARIS-POPUL.csv",
+ header=TRUE,sep=";")
> base3=read.table(
+ "http://freakonometrics.blog.free.fr/public/
data/IRIS-PARIS-LOGEMENT.csv",
+ header=TRUE,sep=";")
> base4=read.table(
+ "http://freakonometrics.blog.free.fr/public/
data/IRIS-PARIS-FORMATION.csv",
+ header=TRUE,sep=";")
qu'il faut encore agréger par quartier,
> base2t=aggregate(base2[,-(1:11)],
+ by=list(GRD_QUART=base2$GRD_QUART), FUN=sum)
(etc) que l'on fusionne avec les autres bases
> baseT=merge(baseT,base2t,by="GRD_QUART")
On a alors enfin une base avec des données individuelles pour modéliser le taux de vote, par exemple,
> plot((baseT$P08_FNSCOL15P_SUP/baseT$P08_POP),
+ (baseT$VOTANTS/baseT$INSCRITS))
On notera qu'il est possible d'extraire une sous-base, avec les variables d’intérêt,
> base=data.frame(
+ Thollande=(baseT$HOLLANDE/baseT$INSCRITS),
+ Tsarkozy=(baseT$SARKOZY/baseT$INSCRITS),
+ T5pieces=(baseT$P08_RP_5PP/baseT$P08_RP),
+ Tfemmes=(baseT$P08_POPF/baseT$P08_POP),
+ Tpop2554=(baseT$P08_POP2554/baseT$P08_POP1564),
+ Tenfants018=((baseT$P08_POP0002+baseT$P08_POP0305
+ +baseT$P08_POP1117+baseT$P08_POP0610)/baseT$P08_POP),
+ Tpop5564=(baseT$P08_POP5564/baseT$P08_POP1564),
+ Tactifs=(baseT$P08_ACT5564/baseT$P08_POP1564),
+ Tchomeur=(baseT$P08_CHOM1564/baseT$P08_POP1564),
+ Tetudiant=(baseT$P08_ETUD1564/baseT$P08_POP1564),
+ T65ansplus=(baseT$P08_POP65P/baseT$P08_POP),
+ Npop=baseT$INSCRITS)
et c'est parti pour faire un modèle de régression...

Friday, October 12 2012

Données pour le premier devoir de régression

Comme annoncé en cours mardi dernier, pour le premier devoir, je laisse le choix pour la constitution de la base de données, et sur la problématique. Les devoirs sont à faire par binôme, exceptionnellement seuls. Vous pouvez

  • utiliser une base que je mettrais à disposition sur le site,

  • chercher vous même les données sur lesquelles vous allez travailler. Dans ce cas, un bonus substantiel sera accordé.

Pour ceux qui veulent chercher des données, je rappelle qu'il doit s'agir de données individuelles, éventuellement agrégées (on évoquera ce point en cours). Plusieurs sites mettent à disposition des données. Le principe est toujours le même,

  • Les données de StatCan

Un premier site pour constituer des bases est le site http://www.statcan.gc.ca/estat/ . Par exemple dans la section e-stats, il est possible de constituer des données (agrégées) pour divers recensements

Par exemple, on peut sélectionner les 144 régions métropolitaines (i.e. 144 observations)

On sélectionner ensuite des variables d'intérêt, par exemple le salaire

mais il faut aussi retenir des variables possiblement explicatives, comme la population par tranche d'âge,

et des variables de revenu,

On peut alors tout récupérer, sous forme html, avec les 144 lignes, ou mieux, sous forme csv. Mieux vaut prendre trop de variables explicatives que pas assez...

  • Les données de l'INSEE (France)

Plusieurs bases de données sont mises à disposition sur le site. Par exemple ici les données de l'enquête histoire de vie, datant de 2003, avec 8400 observations et plus de 800 variables.

Il y aussi des données d'enquêtes sur les conditions de vie des ménages, avec les données de l'étude éducation et famille, avec plus de 4000 ménages et 269 variables. Par exemple

Les données zippés sont (le plus souvent) au format dbf. Sous R, l'importation se fait simplement en utilisant
> base=read.dbf("hdv1.dbf")
Tous les sites se présentent de la même manière, soit avec des requêtes à faire pour constituer ses propres bases, soit des bases mises à disposition.
  • Les divers sites de données
Plusieurs sites collectent des données, et parfois mettent en ligne des informations, comme World Bank, Speed Data, OMS, CPII, Penn World Table, UniData World Information, IMF, Fed Saint-Louis, ESDS International, Center for System Peace, UNICA Brazil, USDA, Food and Agriculture Organization of the United Nations ou encore Energy Informations Dataset (j'en oublie probablement). Attention, les données économiques sont souvent des données temporelles! Il faut chercher des données par pays, par exemple.
Sinon une autre source possible sont les sites d'open data, comme data-publica, data.gov, donnees.ville.montreal.qc.ca ou montrealouvert, voire les données mises en ligne sur des sites comme le guardian. Il y a beaucoup de sites qui hébergent des données (cf #opendata), mais la plupart du temps, il y a uniquement une série de chiffres, assez rarement des bases complètes.
  • La base de données
Une fois constituée la base de données, il faut bien comprendre qu'il y a plusieurs types de variables dedans, afin de poser la problématique: compte tenu du contenu du cours, je demande de modéliser une variable continue. Par exemple, dans la base suivante, on a pour quelques milliers d'étudiants dans une faculté de Sciences Économiques, on a des informations sur les étudiants (âge, sexe, parcours), sur leurs résultats scolaires (sur les deux dernières sessions) et le nombre de livres empruntés à la bibliothèque. C'est cette dernière variable que l'on va essayer de modéliser.
> base=read.table(
+ "http://freakonometrics.free.fr/biblivres.csv",
+ header=TRUE,sep=";",dec=",")
> tail(base)
DIPLOME AGE SEXE REGIME STATUT
3005 SC.ECO. PASSAGERS  31    M      5      6
3006 SC.ECO. PASSAGERS  31    F      5      6
3007 SC.ECO. PASSAGERS  50    F      5      6
3008 SC.ECO. PASSAGERS  30    F      5      6
3009 SC.ECO. PASSAGERS  31    M      5      6
3010                    NA          NA     NA
RESUL_SES_1 NOT_SES_1 MENTION_1 RESUL_SES_2
3005                    NA
3006                    NA
3007                    NA
3008                    NA
3009                    NA
3010                    NA
NOT_SES_2 MENTION_2 NB.EMPRUNTS NB_CLASSE
3005        NA                     0     AUCUN
3006        NA                     0     AUCUN
3007        NA                     0     AUCUN
3008        NA                     0     AUCUN
3009        NA                     0     AUCUN
3010        NA                    NA   
Notons qu'il va falloir nettoyer un peu la base: enlever la dernière ligne, qui ne sert à rien
> base=base[-nrow(base),]
Enlever les valeurs manquantes, i.e. enlever les lignes où on a des valeurs manquantes, pour les notes par exemple
> I=which((is.na(base$NOT_SES_1)==FALSE)&
+        (is.na(base$NOT_SES_2)==FALSE))
> base=base[I,]
(les notes sont entre 0 et 20). Notre variable d'intérêt est le nombre de livres empruntés (par an). Comme il faut une variable continue, on va supprimer les valeurs nulles, i.e. les personnes qui n'empruntent pas de livres.
> I=which(base$NB.EMPRUNTS>0)
> base=base[I,]
Cette fois, on a une base propre sur laquelle on peut se lancer, avec une variable continue à modéliser (le nombre de livres empruntés pour les étudiants qui ont déjà emprunté un livre) et plusieurs variables explicatives, certaines qualitatives (parcours, sexe) d'autres quantitatives, comme l'âge ou les résultats scolaires.
> hist(log(base$NB.EMPRUNTS))
> boxplot(base[,c(7,10)],horizontal=TRUE)


  • Et ensuite ?
Ensuite, il s'agit de proposer un modèle permettant de prédire votre variable d'intérêt, conditionnellement aux variables explicatives. Je demanderais d'enlever quelques observations de la base, afin de faire de la prévision, ensuite: on va tirer au hasard les observations qui permettront de faire un test
> nb.enleve=10
> k=sample(1:nrow(base),nb.enleve,replace=FALSE)
ensuite on met de côté les observations, pour la fin,
> base.test=base[k,]
et enfin, on constitue la base sur laquelle on va construire le modèle
> base=base[-k,]
Ce que je vais demander, c'est un rapport d'une quinzaine de pages maximum, avec une page de garde comportant les noms des élèves et envoyé par courriel avant la date limite (au format pdf, et uniquement), et une description de la méthodologie adoptée pour arriver à un (ou plusieurs) modèles. La conclusion devra

  • présenter le modèle retenu (ou les modèles si vous n'avez pu trancher)

  • proposer une prévision pour les individus qui avaient enlevé de la base (avec une comparaison avec la vraie valeur)

Sur la méthodologie, il s'agira de (re)faire ce que l'on fera en cours tout au long de la première partie du cours.

Monday, October 1 2012

Premier cours de régression

Mercredi aura lieu le premier cours ACT6420 méthodes de prévisions de cette nouvelle session. Le plan de cours est d'ailleurs en ligne. Le nombre d’étudiants inscrits ayant plus que doublé (plus d'une centaines d'étudiants inscrits), la forme changera probablement un peu. En particulier, je pense que je serais obligé d'utiliser des transparents (autant que faire se peu). Je mettrais en ligne les transparents du cours, au fur et à mesure. Sinon je continuerais à illustrer, en R, les différents aspects que nous aborderons.  D'autres informations seront en ligne sur la page ACT6420.

  • données de régression
La première partie du cours portera sur la régression sur des données individuelles.
Parmi les bases utilisées dans les premiers transparents, il y a des données sur la taille père-fils
> library(UsingR)
> data(father.son)
> father.son$fcm=father.son$fheight*2.54
> father.son$scm=father.son$sheight*2.54
> head(father.son)
fheight  sheight      fcm      scm
1 65.04851 59.77827 165.2232 151.8368
2 63.25094 63.21404 160.6574 160.5637
3 64.95532 63.34242 164.9865 160.8897
4 65.75250 62.79238 167.0113 159.4926
5 61.13723 64.28113 155.2886 163.2741
6 63.02254 64.24221 160.0773 163.1752
> attach(father,son)
> plot(fcm,scm,cex=.7)
> boxplot(father.son[,3:4],horizontal=TRUE)
Sinon j'ai aussi des données sur le prestige des métiers, au Canada,
> prestige = read.table("http://freakonometrics.free.fr/
prestige.txt",header=TRUE)
> head(prestige)
education income women prestige census type
GOV.ADMINISTRATORS      13.11  12351 11.16     68.8   1113 prof
GENERAL.MANAGERS        12.26  25879  4.02     69.1   1130 prof
ACCOUNTANTS             12.77   9271 15.70     63.4   1171 prof
PURCHASING.OFFICERS     11.42   8865  9.11     56.8   1175 prof
CHEMISTS                14.62   8403 11.68     73.5   2111 prof
PHYSICISTS              15.64  11030  5.13     77.6   2113 prof
La base que j'utiliserais probablement le plus, pour expliquer la régression simple sera une petite base contenant deux variables, une vitesse de véhicule au moment de freiner, et la distance de freinage.
> data(cars)
> head(cars)
speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10
Par mes données préférées, il y a aussi cette base avec la taille et le poids d'individus,
> TP = read.table("http://freakonometrics.free.fr/
taillepoids.txt"
,header=TRUE,sep=";") > head(TP) indice sexe poids1 taille1 poids2 taille2 1 1 M 77 182 77 180 2 2 F 58 161 51 159 3 3 F 53 161 54 158 4 4 M 68 177 70 175 5 5 F 59 157 59 155 6 6 M 76 170 76 165
Pour aborder la régression multiple, on aura besoin de plus de variables. En particulier, on dipose de données par quartiers, à Chicago
> chicago=read.table("http://freakonometrics.free.fr/
chicago.txt",header=TRUE,sep=";")
> head(chicago)
Fire   X_1 X_2    X_3
1  6.2 0.604  29 11.744
2  9.5 0.765  44  9.323
3 10.5 0.735  36  9.948
4  7.7 0.669  37 10.656
5  8.6 0.814  53  9.730
6 34.1 0.526  68  8.231

X_1: proportion d'habitations anciennes
X_2: nombre de délits (ou de vols) commis
X_3: revenu médian dans le quartier
Fire
: nombre annuel d'incendies d'appartement (pour 1000 ménages)
Le but sera de modéliser le nombre d'incendies.
Enfin, on va aussi s'intéresser au nombre d'homicides aux États-Unis, à partir de la base
> US=read.table("http://freakonometrics.free.fr/US.txt",
+ header=TRUE,sep=";")

(je renvoie sur le précédant billet pour un descriptif précis). On pourra consulter aussi un ancien billet pour faire de la cartographie, et visualiser les différents états.

  • séries temporelles
Enfin, la seconde partie du cours portera sur la modélisation et la prévision de séries temporelles. Par exemple, on travaillera sur la fréquentation de l'autoroute A7, en France, entre Lyon et Marseille (appelé aussi autoroute du soleil)
> autoroute=read.table(
+ "http://freakonometrics.blog.free.fr/public/data/autoroute.csv",
+ header=TRUE,sep=";")
> a7=autoroute$a007
> A7=ts(a7,start = c(1989, 9), frequency = 12)
> A7
Jan   Feb   Mar   Apr   May   Jun   Jul   Aug
1989
1990 21421 25147 24264 41525 35118 42142 62099 65203
1991 22481 22801 29504 34225 44090 40767 61298 71567
1992 23203 24966 27008 40362 40985 40247 49724 72425
1993 25220 26773 27137 43147 42889 39830 66531 74559
1994 25063 27566 29909 42906 44010 41052 70949 72441
1995 25375 28523 29429 43042 41595 44800 69251 70671
1996 25323 28825 30899 42833 40943 44187 64291 74163
Sep   Oct   Nov   Dec
1989 40236 28874 23874 26545
1990 41830 28462 24957 26415
1991 43894 29799 26534 28489
1992 43086 31670 25571 30551
1993 43979 33113 26378 29959
1994 44447 33277 29176 21328
1995 43874 32676 27334 33004
1996 43275
> plot(A7,col="blue",lwd=2)
On travaillera aussi sur le nombre de ventes de voitures au Québec,

X=read.table( "http://freakonometrics.blog.free.fr/public/
data/car-sales-quebec.csv"
, header=TRUE,sep=";",nrows=108) Xt=ts(X[,2],start=c(1960,1),frequency=12)

Tuesday, August 3 2010

Importer une base SAS sous R

Depuis pas mal de temps, je reçois des bases envoyées par différentes personnes, pour faire des stats, et si la plupart ont la bonne idée de me les envoyer directement en format csv, malheureusement, je reçois parfois des bases sas dont je ne sais trop que faire (car je n'ai pas sas).
La library(foreign) de R propose d'importer des bases SAS qui sont au format xport (ici). Mais généralement, les données SAS sont au format sas7bdat. Pendant l'année, j'avais l'habitude d'aller squatter la salle informatique qui dispose de SAS, pour ouvrir SAS et exporter les données en csv. Mais avec la fermeture estivale de la faculté, j'ai été un peu bloqué. J'ai alors découvert la version online de SAS sur l'ent de l'université. Malheureusement, il faut que les données soient dans un répertoire sur le réseau, ce qui nécessite au préalable d'envoyer des données sur le réseau au lieu de pointer sur un répertoire local (ce qui peut être loin, voir impossible si la base est trop grosse). Fort heureusement, l'autre jour, j'ai découvert,

On peut en effet télécharger gratuitement sur le site de www.sas.com un lecteur de base, qui permet ensuite d'exporter la base en csv... et ensuite de l'importer facilement sous R... Trop facile !