bigger changes

parent 192f258b
...@@ -12,10 +12,10 @@ vector = c( ...@@ -12,10 +12,10 @@ vector = c(
``` ```
```{r} ```{r}
mean(vector)
min(vector) plot(vector, type = "l", main = "Line Plot", xlab = "Index", ylab = "Value")
max(vector)
median(vector)
sd(vector)
``` ```
```{r}
hist(vector)
```
\ No newline at end of file
---
title: "Exo 5.1"
author: "Sergio Castro"
date: "2025-06-30"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Préparation des données
Les données de l'incidence du syndrome grippal sont disponibles du site Web du [Réseau Sentinelles](http://www.sentiweb.fr/). Nous les récupérons sous forme d'un fichier en format CSV dont chaque ligne correspond à une semaine de la période demandée. Nous téléchargeons toujours le jeu de données complet, qui commence en 1984 et se termine avec une semaine récente. L'URL est:
```{r}
library(dplyr)
files = list.files()
if("flu_data_france.csv" %in% files ){
data = read.csv("flu_data_france.csv")
} else{
data_url = "http://www.sentiweb.fr/datasets/incidence-PAY-3.csv"
data=read.csv(data_url, skip=1, na.strings=c("-"))
write.csv(data,"flu_data_france.csv")
}
```
Mais mon url peut disparaitre un jour donc
```{r}
```
Regardons ce que nous avons obtenu:
```{r}
head(data)
tail(data)
```
Y a-t-il des points manquants dans nos données ?
```{r}
na_records = apply(data, 1, function (x) any(is.na(x)))
data[na_records,]
```
Les deux colonnes qui nous intéressent sont week et inc. Vérifions leurs classes:
```{r}
class(data$week)
class(data$inc)
```
Ce sont des entiers, tout va bien !
Conversion des numéros de semaine
La gestion des dates est toujours un sujet délicat. Il y a un grand nombre de conventions différentes qu'il ne faut pas confondre. Notre jeux de données utilise un format que peu de logiciels savent traiter: les semaines en format ISO-8601. En R, il est géré par la bibliothèque parsedate:
```{r}
library(parsedate)
```
Pour faciliter le traitement suivant, nous remplaçons ces semaines par les dates qui correspondent aux lundis. Voici une petite fonction qui fait la conversion pour une seule valeur:
```{r}
convert_week = function(w) {
ws = paste(w)
iso = paste0(substring(ws, 1, 4), "-W", substring(ws, 5, 6))
as.character(parse_iso_8601(iso))
}
```
Nous appliquons cette fonction à tous les points, créant une nouvelle colonne date dans notre jeu de données:
```{r}
data$date = as.Date(convert_week(data$week))
```
Vérifions qu'elle est de classe Date:
```{r}
class(data$date)
```
Les points sont dans l'ordre chronologique inverse, il est donc utile de les trier:
```{r}
data = data[order(data$date),]
```
C'est l'occasion pour faire une vérification: nos dates doivent être séparées d'exactement sept jours:
```{r}
all(diff(data$date) == 7)
```
Inspection
Regardons enfin à quoi ressemblent nos données !
```{r}
plot(data$date, data$inc, type="l", xlab="Date", ylab="Incidence hebdomadaire")
```
Un zoom sur les dernières années montre mieux la localisation des pics en hiver. Le creux des incidences se trouve en été.
```{r}
with(tail(data, 200), plot(date, inc, type="l", xlab="Date", ylab="Incidence hebdomadaire"))
```
# L'incidence annuelle
## Calcul
Étant donné que le pic de l'épidémie se situe en hiver, à cheval entre deux années civiles, nous définissons la période de référence entre deux minima de l'incidence, du 1er août de l'année NNN au 1er août de l'année N+1. Nous mettons l'année N+1N+1N+1 comme étiquette sur cette année décalée, car le pic de l'épidémie est toujours au début de l'année N+1. Comme l'incidence de syndrome grippal est très faible en été, cette modification ne risque pas de fausser nos conclusions.
L'argument na.rm=True dans la sommation précise qu'il faut supprimer les points manquants. Ce choix est raisonnable car il n'y a qu'un seul point manquant, dont l'impact ne peut pas être très fort.
```{r}
pic_annuel = function(annee) {
debut = paste0(annee-1,"-08-01")
fin = paste0(annee,"-08-01")
semaines = data$date > debut & data$date <= fin
sum(data$inc[semaines], na.rm=TRUE)
}
```
Nous devons aussi faire attention aux premières et dernières années de notre jeux de données. Les données commencent en octobre 1984, ce qui ne permet pas de quantifier complètement le pic attribué à 1985. Nous l'enlevons donc de notre analyse. Par contre, pour une exécution en octobre 2018, les données se terminent après le 1er août 2018, ce qui nous permet d'inclure cette année.
```{r}
annees = 1986:2018
```
Nous créons un nouveau jeu de données pour l'incidence annuelle, en applicant la fonction pic_annuel à chaque année:
```{r}
inc_annuelle = data.frame(annee = annees,
incidence = sapply(annees, pic_annuel))
```
Inspection
Voici les incidences annuelles en graphique:
```{r}
plot(inc_annuelle, type="p", xlab="Annee", ylab="Incidence annuelle")
```
Identification des épidémies les plus fortes
Une liste triée par ordre décroissant d'incidence annuelle permet de plus facilement repérer les valeurs les plus élevées:
```{r}
head(inc_annuelle[order(-inc_annuelle$incidence),])
```
Enfin, un histogramme montre bien que les épidémies fortes, qui touchent environ 10% de la population française, sont assez rares: il y en eu trois au cours des 35 dernières années.
```{r}
hist(inc_annuelle$incidence, breaks=10, xlab="Incidence annuelle", ylab="Nb d'observations", main=""
```
This source diff could not be displayed because it is too large. You can view the blob instead.
---
title: "Exo 5.1"
author: "Sergio Castro"
date: "2025-06-30"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Préparation des données
Les données de l'incidence du syndrome grippal sont disponibles du site Web du [Réseau Sentinelles](http://www.sentiweb.fr/). Nous les récupérons sous forme d'un fichier en format CSV dont chaque ligne correspond à une semaine de la période demandée. Nous téléchargeons toujours le jeu de données complet, qui commence en 1984 et se termine avec une semaine récente.
LE URL pour télécharger est ""http://www.sentiweb.fr/datasets/incidence-PAY-3.csv". Je vais le faire une fois et puis garder en local.
```{r}
library(dplyr)
files = list.files()
if("pox_data_france.csv" %in% files ){
data = read.csv("pox_data_france.csv")
} else{
data_url = "https://www.sentiweb.fr/datasets/all/inc-7-PAY-ds2.csv"
data=read.csv(data_url, skip=1, na.strings=c("-"))
write.csv(data,"pox_data_france.csv")
}
```
Regardons ce que nous avons obtenu:
```{r}
head(data)
tail(data)
```
Y a-t-il des points manquants dans nos données ?
```{r}
na_records = apply(data, 1, function (x) any(is.na(x)))
data[na_records,]
```
Les deux colonnes qui nous intéressent sont week et inc. Vérifions leurs classes:
```{r}
class(data$week)
class(data$inc)
```
Ce sont des entiers, tout va bien !
Conversion des numéros de semaine
La gestion des dates est toujours un sujet délicat. Il y a un grand nombre de conventions différentes qu'il ne faut pas confondre. Notre jeux de données utilise un format que peu de logiciels savent traiter: les semaines en format ISO-8601. En R, il est géré par la bibliothèque parsedate:
```{r}
library(parsedate)
```
Pour faciliter le traitement suivant, nous remplaçons ces semaines par les dates qui correspondent aux lundis. Voici une petite fonction qui fait la conversion pour une seule valeur:
```{r}
convert_week = function(w) {
ws = paste(w)
iso = paste0(substring(ws, 1, 4), "-W", substring(ws, 5, 6))
as.character(parse_iso_8601(iso))
}
```
Nous appliquons cette fonction à tous les points, créant une nouvelle colonne date dans notre jeu de données:
```{r}
data$date = as.Date(convert_week(data$week))
```
Vérifions qu'elle est de classe Date:
```{r}
class(data$date)
```
Les points sont dans l'ordre chronologique inverse, il est donc utile de les trier:
```{r}
data = data[order(data$date),]
```
C'est l'occasion pour faire une vérification: nos dates doivent être séparées d'exactement sept jours:
```{r}
all(diff(data$date) == 7)
```
Inspection
Regardons enfin à quoi ressemblent nos données !
```{r}
plot(data$date, data$inc, type="l", xlab="Date", ylab="Incidence hebdomadaire")
```
Un zoom sur les dernières années montre mieux la localisation des pics en hiver. Le creux des incidences se trouve en été.
```{r}
with(tail(data, 200), plot(date, inc, type="l", xlab="Date", ylab="Incidence hebdomadaire"))
```
# L'incidence annuelle
## Calcul
Étant donné que le pic de l'épidémie se situe en hiver, à cheval entre deux années civiles, nous définissons la période de référence entre deux minima de l'incidence, du 1er août de l'année NNN au 1er août de l'année N+1. Nous mettons l'année N+1N+1N+1 comme étiquette sur cette année décalée, car le pic de l'épidémie est toujours au début de l'année N+1. Comme l'incidence de syndrome grippal est très faible en été, cette modification ne risque pas de fausser nos conclusions.
L'argument na.rm=True dans la sommation précise qu'il faut supprimer les points manquants. Ce choix est raisonnable car il n'y a qu'un seul point manquant, dont l'impact ne peut pas être très fort.
```{r}
pic_annuel = function(annee) {
debut = paste0(annee-1,"-09-01")
fin = paste0(annee,"-09-01")
semaines = data$date > debut & data$date <= fin
sum(data$inc[semaines], na.rm=TRUE)
}
```
Nous devons aussi faire attention aux premières et dernières années de notre jeux de données. Les données commencent en octobre 1984, ce qui ne permet pas de quantifier complètement le pic attribué à 1985. Nous l'enlevons donc de notre analyse. Par contre, pour une exécution en octobre 2018, les données se terminent après le 1er août 2018, ce qui nous permet d'inclure cette année.
```{r}
annees = 2016:2025
```
Nous créons un nouveau jeu de données pour l'incidence annuelle, en applicant la fonction pic_annuel à chaque année:
```{r}
inc_annuelle = data.frame(annee = annees,
incidence = sapply(annees, pic_annuel))
```
Inspection
Voici les incidences annuelles en graphique:
```{r}
plot(inc_annuelle, type="p", xlab="Annee", ylab="Incidence annuelle")
```
Identification des épidémies les plus fortes
Une liste triée par ordre décroissant d'incidence annuelle permet de plus facilement repérer les valeurs les plus élevées:
```{r}
head(inc_annuelle[order(-inc_annuelle$incidence),])
```
Enfin, un histogramme montre bien que les épidémies fortes, qui touchent environ 10% de la population française, sont assez rares: il y en eu trois au cours des 35 dernières années.
```{r}
hist(inc_annuelle$incidence, breaks=10, xlab="Incidence annuelle", ylab="Nb d'observations", main=""
```
This diff is collapsed.
--- ---
title: "Votre titre" title: "Le pouvoir d'achat des ouvriers anglais du XVIe au XIXe siècle"
author: "Votre nom" author: "Sergio Castro"
date: "La date du jour" date: "30/6/2025"
output: html_document output: html_document
--- ---
```{r}
library(dplyr)
library(ggplot2)
library(scales)
```
# Introduction
Dans ce document, j'explore un jeu de données historiques contenant des informations sur les prix du blé et les salaires entre 1565 et 1830 (en supposant des pas de 5 ans sur 53 observations).
Voici les données de William Playfair que j'ai trouve sur le MOOC
```{r}
data <- read.csv("C:/Users/CASTRO PACHECO/mooc-rr/module3/exo3/playfairdata.csv")
```
Je verifie la structure.
```{r}
# Structure du jeu de données
str(data)
```
# Données manquantes et plages de valeurs
Je fais un résumé rapide
```{r}
# Statistiques descriptives de base
summary(data)
```
Maintenant je vais voir s'il y a des données manquantes. J'en vois trois sur la colonne des salaires.
```{r}
# Vérification des valeurs manquantes
colSums(is.na(data))
```
# Q1: Rapport entre le prix du blé et le salaire moyen
Pour répondre à la consigne, j'ai reproduit un graphique dans l'esprit de celui de Playfair. Le prix du blé est représenté par des barres verticales, tandis que les salaires sont illustrés par une surface bleue délimitée par une courbe rouge. Ces deux séries sont superposées dans un même graphique afin de visualiser leur évolution conjointe, tout en conservant l’impression générale du graphique original.
```{r}
ggplot(data, aes(x = Year)) +
geom_col(aes(y = Wheat), fill = "black",
color = "black", width = 3)+
# Ligne rouge pour les salaires, taille un peu plus épaisse
geom_line(aes(y = Wages ), color = "red", size = 2) +
# Titres et thème
labs(
title = "Prix d'un quart de boisseau de ble (barres noires) et salaires (ligne rouge)",
x = "Annee", y = "Shillings"
) +
theme(
panel.grid.major = element_line(color = "grey80"),
panel.grid.minor = element_blank(),
axis.title.y.left = element_text(color = "black", size = 12),
axis.text.y.left = element_text(color = "black")
)
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
``` ```
## Quelques explications
Ceci est un document R markdown que vous pouvez aisément exporter au format HTML, PDF, et MS Word. Pour plus de détails sur R Markdown consultez <http://rmarkdown.rstudio.com>.
Lorsque vous cliquerez sur le bouton **Knit** ce document sera compilé afin de ré-exécuter le code R et d'inclure les résultats dans un document final. Comme nous vous l'avons montré dans la vidéo, on inclue du code R de la façon suivante: # Q2: Rapport entre le prix du blé et le salaire moyen (version améliorée)
Ce graphique présente l’évolution conjointe du prix du blé et des salaires des travailleurs. Le prix du blé est affiché en barres noires, avec son échelle indiquée sur l’axe droit, tandis que les salaires hebdomadaires sont représentés par une courbe rouge, avec leur échelle sur l’axe gauche. L’utilisation de deux axes y distincts permet de comparer ces deux variables aux unités différentes sur un même graphique.
```{r}
# Calcul du facteur de mise à l'échelle pour que Wheat et Wages cohabitent
# On met Wheat à l'échelle de Wages
scale_factor <- max(data$Wages, na.rm = TRUE) / max(data$Wheat, na.rm = TRUE)
ggplot(data, aes(x = Year)) +
geom_col(aes(y = Wheat * scale_factor), fill = "black", color = "black", width = 3) +
geom_line(aes(y = Wages), color = "red", size = 1.5) +
scale_y_continuous(
name = "Salaires (shillings par semaine)",
sec.axis = sec_axis(~ . / scale_factor, name = "Prix du ble (prix d'un quart de boisseau)")
) +
labs(
title = "Prix du ble (barres noires) et salaires (ligne rouge)",
x = "Annee"
) +
theme_minimal() +
theme(
axis.title.y.left = element_text(color = "red", size = 12),
axis.text.y.left = element_text(color = "red"),
axis.title.y.right = element_text(color = "black", size = 12),
axis.text.y.right = element_text(color = "black")
)
```{r cars}
summary(cars)
``` ```
Et on peut aussi aisément inclure des figures. Par exemple:
```{r pressure, echo=FALSE} # Q3: Rapport entre le prix du blé et le salaire moyen (version améliorée)
plot(pressure)
## Augmentation du pouvoir d'achat.
Il nous faut mainentant montrer que le pouvoir d'achat des ouvriers a monté au fil des années. Pour cela, on calculer la quantité de boisseaux de blé qu'un salarié peut acheter par semaine.
```{r}
data$wheat_bags_per_wage = data$Wages / (data$Wheat*4)
ggplot(data, aes(x = Year)) +
geom_col(aes(y = wheat_bags_per_wage), fill = "black", color = "black", width = 3) +
labs(
title = "Boisseaux de ble qui peuvent etre achetes avec un salaire hebdomadaire",
x = "Annee", y = "Boisseaux de ble qui peuvent etre \n achetes avec un salaire hebdomadaire"
) +
theme_minimal() +
theme(
axis.title.y.right = element_text(color = "black", size = 12),
axis.text.y.right = element_text(color = "black")
)
``` ```
Vous remarquerez le paramètre `echo = FALSE` qui indique que le code ne doit pas apparaître dans la version finale du document. Nous vous recommandons dans le cadre de ce MOOC de ne pas utiliser ce paramètre car l'objectif est que vos analyses de données soient parfaitement transparentes pour être reproductibles.
Comme les résultats ne sont pas stockés dans les fichiers Rmd, pour faciliter la relecture de vos analyses par d'autres personnes, vous aurez donc intérêt à générer un HTML ou un PDF et à le commiter. ## Relation entre le prix du blé et les salaires.
Ce graphique présente la relation entre le prix du blé et les salaires des travailleurs. Chaque point correspond à une année, dont la progression est indiquée par un dégradé de couleur allant des années les plus anciennes (en clair) aux plus récentes (en foncé). Cette représentation permet d’apprécier simultanément l’évolution conjointe des deux variables et leur lien au fil du temps, sans utiliser l’axe temporel classique.
```{r}
ggplot(data, aes(x = Wheat, y = Wages, color = Year)) +
geom_point(size = 3) +
scale_color_gradient(low = "lightblue", high = "darkblue") +
labs(
title = "Relation entre prix du ble et salaires selon les annees",
x = "Prix du ble (prix d'un quart de boisseau)",
y = "Salaires (shillings par semaine)",
color = "Annee"
) +
theme_minimal()
```
Maintenant, à vous de jouer! Vous pouvez effacer toutes ces informations et les remplacer par votre document computationnel.
This diff is collapsed.
rownames,Year,Wheat,Wages
1,1565,41,5
2,1570,45,5.05
3,1575,42,5.08
4,1580,49,5.12
5,1585,41.5,5.15
6,1590,47,5.25
7,1595,64,5.54
8,1600,27,5.61
9,1605,33,5.69
10,1610,32,5.78
11,1615,33,5.94
12,1620,35,6.01
13,1625,33,6.12
14,1630,45,6.22
15,1635,33,6.3
16,1640,39,6.37
17,1645,53,6.45
18,1650,42,6.5
19,1655,40.5,6.6
20,1660,46.5,6.75
21,1665,32,6.8
22,1670,37,6.9
23,1675,43,7
24,1680,35,7.3
25,1685,27,7.6
26,1690,40,8
27,1695,50,8.5
28,1700,30,9
29,1705,32,10
30,1710,44,11
31,1715,33,11.75
32,1720,29,12.5
33,1725,39,13
34,1730,26,13.3
35,1735,32,13.6
36,1740,27,14
37,1745,27.5,14.5
38,1750,31,15
39,1755,35.5,15.7
40,1760,31,16.5
41,1765,43,17.6
42,1770,47,18.5
43,1775,44,19.5
44,1780,46,21
45,1785,42,23
46,1790,47.5,25.5
47,1795,76,27.5
48,1800,79,28.5
49,1805,81,29.5
50,1810,99,30
51,1815,78,
52,1820,54,
53,1821,54,
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment