-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoffres_emplois.R
248 lines (219 loc) · 10.9 KB
/
offres_emplois.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#' ---
#' title: "Analyse des données ouvertes de pôle emploi"
#' author: "Florian Gaudin-Delrieu"
#' date: "`r format(Sys.Date())`"
#' output: github_document
#' ---
#'
#' # Offres d'emploi
#' ## Récupération des données
#' Des données de pôle emploi sont
#' accessibles en open data. En particulier, les données relatives aux offres
#' d'emploi enregristrées sur pôle emploi sont [disponibles
#' ici.](http://www.pole-emploi.org/informations/open-data-pole-emploi-@/25799/view-category-25799.html?)
#'
#' Les données sont sous la forme d'un fichier excel avec 2 feuilles, dont une
#' correspond à la description des variables. Pour pouvoir lire les données dans
#' R, j'ai dû modifier dans OpenOffice le fichier et l'exporter au format csv
#' (certaines cellules étaient fusionnées, et le formattage des nombres amenait
#' des problèmes). Le fichier `offres.csv` fourni provient directement du
#' fichier Excel. Les intitulés de colonnes ont été modifiés pour être plus
#' facilement lisibles :
#'
#' * Periode (sans accent) ;
#' * OEE_A, OEE_B et OEE_C ( OEE signifie "Offres d'emploi enregistrées", pour
#' les catégories A, B, et C) ;
#' * Total_France et Total_DOM.
#' Chargeons les libraries nécessaires
library(tidyverse)
library(lubridate) # Pour la gestion des dates
library(broom) # Pour la gestion "tidy" des modèles
library(RColorBrewer) # Pour les palettes des graphes
library(GGally) # Pour la mise à l'échelle (rescale11)
options("scipen"=10, digits = 5) # pour ne pas avoir trop de notation scientifique
#' Grâce à `readr::read_csv2` les colonnes ont directement le bon format (date
#' et numérique), et sont sous forme de tibble.
offres <- read_csv2("offres.csv")
#' ## Nettoyage des données
#' Regardons les données
offres # Le tibble gère l'affichage pour ne pas remplir la console
summary(offres)
#' Nous voyons qu'il y a des données manquantes (NA), où sont-elles ?
offres[is.na(offres$OEE_A), ]
#' Elles sont sur la même ligne, décembre 2015 et correspondent à des données non
#' encore disponibles, nous pouvons supprimer la ligne sereinement.
offres <- filter(offres, !is.na(OEE_A))
#' Passons maintenant le tibble sous forme longue, plus pratique pour les
#' graphiques, à l'aide de `tidyr::gather`.
offres_long <- offres %>%
gather(categorie, nombre, -Periode)
offres_long$categorie <- as.factor(offres_long$categorie)
glimpse(offres_long)
head(offres_long)
#' Séparons des jeux de données pour les offres par catégorie, et les offres
#' totales. Nous transformons le nombre d'annonces en milliers d'annonces
offres_OEE <- offres_long %>%
filter(substr(as.character(.$categorie), 1, 3) == "OEE") %>%
droplevels() %>%
mutate(nombre = nombre / 1000)
offres_totales <- offres_long %>%
filter(substr(as.character(.$categorie), 1, 3) == "Tot") %>%
droplevels() %>%
mutate(nombre = nombre / 1000)
#' J'aime bien le thème minimal pour les graphes.
theme_set(theme_minimal())
#' ## Premières analyses
#' Regardons d'abord les données globales sur le périmètre France
#+ Graphe Total
ggplot(offres, aes(Periode, Total_France /1000)) +
geom_line(color = "tomato") +
labs(title = "Offres d'emplois en France métropolitaine",
subtitle = "De 1996 à 2015",
caption= "Source : pôle emploi",
x = NULL,
y = "Nombre d'offres d'emploi (en milliers)") +
scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
theme(axis.text.x = element_text(angle = 90))
#' Il y a une croissance des offres jusqu'en 2000, puis une baisse jusqu'en
#' 2003. Cela correspond à l'éclatement de la bulle internet, suivi du krach
#' boursier des années 2001-2002. S'ensuit une phase de reprise jusqu'en 2008 et
#' un effondrement très fort correspondant à la crise financière de 2008 (crise des subprimes).
#' Une reprise s'opère dès 2009, jusqu'à mi 2011 où une nouvelle chute importante
#' s'opère jusqu'en 2013. Cela correspond à la crise de la dette de la zone euro.
#' Depuis une timide reprise semble apparaître.
#' Regardons maintenant les offres par catégorie. D'après la notice du fichier
#' pôle emploi, voilà à quoi correspondent les catégories :
#'
#' * Catégorie A : offre d'emploi durable, pour des contrats de plus de 6 mois ;
#' * Catégorie B : offre d'emploi temporaire, pour des contrats entre 1 et 6 mois ;
#' * Catégorie C : offre d'emploi occasionnel, pour des contrats inférieurs à 1 mois.
#+ GrapheCategories
ggplot(data = offres_OEE, aes(Periode, nombre, color = categorie)) +
geom_line() +
labs(
title = "Nombre d'offres d'emplois par mois",
subtitle = "De 1996 à 2015, par catégorie\nA est une offre d'emploi de plus de 6 mois, B entre 1 et 6 mois, et C inférieur à 1 mois",
caption = "Source : pôle emploi",
x = NULL,
y = "Nombre d'offres (milliers)",
color = "Catégorie"
) +
scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
scale_color_brewer(palette = "Set1",
breaks = c("OEE_A", "OEE_B", "OEE_C"),
labels = LETTERS[1:3]) +
scale_y_continuous(breaks = seq(0, 150, by = 25)) +
theme(axis.text.x = element_text(angle = 90),
legend.position = "bottom")
#' Nous voyons que les offres d'emplois occasionnels (C) représentent un volume
#' bien moindre que les offres d'emplois dits temporaires ou durables. Ils
#' semblent moins affectés par les variations décrites dans les tendances
#' globales (crises de 2000-2002, 2008 et 2011). La tendance de ces offres est
#' orientée à la baisse depuis 2008.
#' Si en 1996 les volumes d'offres entre les catégories A et B sont sensiblement
#' différents (2 fois plus d'offres d'emploi de catégorie A que B), à partir des années 2000
#' les volumes sont du même ordre de grandeur. Les offres d'emploi de catégorie B
#' dépassent même celles des catégories A en 2003, avec un chassé croisé depuis.
#' Entre 2005 et 2008 les offres d'emploi de catégorie A progressent le plus, mais
#' seront plus touchées par la crise de 2008. Les offres de catégorie B diminuent
#' aussi assez fortement, et sont au même niveau début 2009. On constate sur les deux
#' séries une reprise jusqu'à mi 2011, puis une baisse. La baisse est plus forte
#' pour les emplois de catégorie B, et stagne depuis 2013, alors que les offres
#' de catégorie A repartent à la hausse depuis 2013.
#'
#' Regardons maintenant un peu plus précisément les offres des catégroies A et B
#' depuis 1999 (pour que les offres soient sur une échelle comparable, après
#' la progression forte entre 1996 et 1999 pour les catégories B).
#+ GrapheAetB
ggplot(
data = offres_OEE %>% filter(categorie %in% c("OEE_A", "OEE_B"),
year(Periode) >= 1999),
aes(Periode, nombre, color = categorie)
) +
geom_line() +
labs(
title = "Nombre d'offres d'emplois par mois",
subtitle = "De 1999 à 2015, par catégorie\nA est une offre d'emploi de plus de 6 mois, B entre 1 et 6 mois",
caption = "Source : pôle emploi",
x = NULL,
y = "Nombre d'offres (milliers)",
color = "Catégorie"
) +
scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
scale_color_brewer(palette = "Set1",
breaks = c("OEE_A", "OEE_B", "OEE_C"),
labels = LETTERS[1:3]) +
scale_y_continuous(breaks = seq(0, 150, by = 25)) +
theme(axis.text.x = element_text(angle = 90),
legend.position = "bottom")
#' Nous voyons mieux les variations, les catégories A subissent plus fortement
#' la crise de 2008, mais récupèrent mieux depuis 2013. Les catégories B quant à
#' elles stagnent depuis 2013, avec une variabilité qui augmente.
#'
#' ## Modélisation des OEE
#' Y a-t-il la même tendance, année par année pour toutes les catégories ? Et
#' quelles sont les années/catégories qui se distinguent des autres ?
#' Pour cela, nous allons créer des régressions linéaires pour chaque année
#' et chaque catégorie. Cela nécessitera d'utiliser :
#'
#' 1. Créer une variable annee
#' 2. `tidyr::nest` pour créer un tibble avec colonnes de listes, pour regrouper
#' les données autres que annee et catégorie ;
#' 3. `purrr::map` pour appliquer la régression linéaire `lm` pour chaque année
#' et catégorie ;
#' 4. encore `purrr::map` pour appliquer `broom::tidy` qui met sous forme de tibble
#' chaque modèle (mais toujours dans une colonne de listes) ;
#' 5. et enfin `tidyr::unnest` pour remettre le modèle sous forme de tibble.
offres_modeles <- offres_long %>%
mutate(annee = year(Periode)) %>%
nest(-annee, -categorie) %>%
mutate(models = map(data, ~ lm(nombre ~ Periode, data = .))) %>%
mutate(tidied = map(models, tidy)) %>%
unnest(tidied)
offres_modeles
#' Ce qui nous intéresse ici est le coefficient de la régression (ce qui est dans
#' la colonne term et avec la valeur `Periode`) pour savoir quelle
#' est la tendance (positive, négative, plus ou moins importante)
tendances <- offres_modeles %>%
filter(term == "Periode") %>%
select(annee, categorie, tendance = estimate)
#' Comme toutes les courbes ne sont pas sur les mêmes échelles de valeurs, nous
#' allons les remettre à l'échelle entre -1 et 1 pour chaque catégorie avec la
#' fonction `GGally::rescale11`.
tendance_echelle <- tendances %>%
group_by(categorie) %>%
mutate(tendance = rescale11(tendance))
#' Nous pouvons maintenant faire une "heatmap" pour voir ces évolutions par
#' année et par catégorie.
#+ Heatmap
ggplot(tendance_echelle,
aes(y = categorie, x = annee, fill = tendance)) +
geom_raster() +
scale_fill_gradientn(colors = brewer.pal(7, "RdYlBu"))+
scale_x_continuous(breaks = 1996:2015, labels = 1996:2015) +
scale_y_discrete(breaks = levels(tendance_echelle$categorie),
labels = c("A", "B", "C", "DOM", "Total\nFrance"))+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = "bottom",
axis.text.x = element_text(angle = 90)) +
labs(x = NULL,
y = NULL,
fill = "Evolution\n",
title = "Evolution annuelle des offres enregitrées d'emploi",
subtitle = "Rouge représente une baisse, jaune un équilibre et bleu une augmentation",
caption = "Source : pôle emploi")
#' Nous voyons que les catégories C sont en baisse continue (globalement)
#' depuis 2005 où il y a eu la chute la plus importante.
#' Les catégories B ont subi leur plus forte chute en 2012, c'est la catégorie
#' qui a le plus subi la crise de la zone euro.
#' La catégorie A a fortement reculé en 2008, et il y a un léger mieux depuis
#' 2013.
#' La variation des offres d'emploi enregistrées dans les DOM est assez différente
#' de la variation des autres variables.
#'
#' ## Conclusion
#' A partir des offres d'emploi enregistrées, nous pouvons voir les différentes
#' crises économiques. Les offres d'emploi inférieures à 1 mois sont peu
#' importantes et diminuent depuis plusieurs années. Les offres d'emploi de plus
#' de 6 mois sont en progression ces dernières années.