Séries temporelles: Variations des températures par pays, par année et par mois
Cette page montre une fonction relativement complexe. On a ciblé un fichier -régulièrement mis à jour par la NASA- qui fournit les température en celsius (fois 10 pour éviter les décimales). L'information est donnée par mois et par station:un pays peut compter plusieurs (États-Unis) ou quelques stations seulement (Belgique, une seule). Le code de chaque station commence par un code de pays (trois digits), à partir de 101. On trouvera ici le lien vers la base de données permettant de repérer le code de chaque pays. On trouve deux fonctions`: une première permettant d'agréger les moyennes des stations d'un même pays, par mois pour des années différentes. On peut ainsi, pour chaque mois, comparer l'évolution de la température et repérer assez aisément le réchauffement de la planète. Une des difficultés méthodologiques renvoie à la fidélité des données. Plus précisément, le nombre de stations variant d'une année à l'autre, la moyenne des stations peut donc être causée par une variation des stations (donc de l'instrument) et non une variation de l'objet étudié (la température)!. Par exemple, au Canada, on a vu le nombre de stations se multiplier dans le nord du pays. Cet ajout des stations nordiques peut ainsi provoqué une variation trompeuse, laissant croire une refroidissement des températures. La fonction ici décrite ne retient que les stations qui sont présentes au moins 50 des 55 ans, réduisant le problème méthodologique. Par contre, cela réduit l'amélioration de la couverture de l'observation du phénomène.
Importation des données

library(sets)

#Données: http://data.giss.nasa.gov/gistemp/station_data/
#Liste des stations:  http://data.giss.nasa.gov/gistemp/station_data_v2/v2.temperature.inv.txt

#ajout des titres des colonnes
base=read.csv("http://dimension.usherbrooke.ca/voute/nasatemperatureavecNA.csv", header=TRUE)

Création du tableau liant les codes des pays et le nom des pays

#liste des codes des pays: cette commande est superflue puisque la condification a déjà été faite, mise dans un tableau.
codePaysPasUtilise=read.csv("http://dimension.usherbrooke.ca/voute/GHCNcountrycodes.txt", header=TRUE)


#création du tableau
tableauPays=array(0, dim=c(177,3))

#GHCN country codes
#remplissage du tableau

tableauPays[1,]=c("United Arab Emirates","ARE", 230)
tableauPays[2,]=c("Afghanistan","AFG", 201)
tableauPays[3,]=c("Algeria","DZA", 101)
tableauPays[4,]=c("Azerbaijan","AZE", 604)
tableauPays[5,]=c("Albania","ALB", 601)
tableauPays[6,]=c("Armenia","ARM", 602)
tableauPays[7,]=c("Angola","AGO", 102)
tableauPays[8,]=c("Argentina","ARG", 301)
tableauPays[9,]=c("Australia","AUS", 501)
tableauPays[11,]=c("Austria","AUT", 603)
tableauPays[12,]=c("Bahrain","BHR", 202)
tableauPays[13,]=c("Botswana","BWA", 104)
tableauPays[14,]=c("Belgium","BEL", 606)
tableauPays[15,]=c("Bangladesh","BGD", 203)
tableauPays[16,]=c("Bosnia andHerzegovina","BIH", 607)
tableauPays[17,]=c("Bolivia","BOL", 302)
tableauPays[18,]=c("Myanmar","MMR", 216)
tableauPays[19,]=c("Benin","BEN", 103)
tableauPays[20,]=c("Belarus","BLR", 605)
tableauPays[21,]=c("Brazil","BRA", 303)
tableauPays[22,]=c("Bhutan","BTN", 999)
tableauPays[23,]=c("Bulgaria","BGR", 608)
tableauPays[24,]=c("Brunei","BRN", 999)
tableauPays[25,]=c("Burundi","BDI", 106)
tableauPays[26,]=c("Cambodia","KHM", 204)
tableauPays[27,]=c("Chad","TCD", 110)
tableauPays[28,]=c("Sri Lanka","LKA", 224)
tableauPays[29,]=c("Congo","COG", 112)
tableauPays[30,]=c("Democratic Congo","COD", 154)
tableauPays[31,]=c("China","CHN", 205)
tableauPays[32,]=c("Chile","CHL", 304)
tableauPays[33,]=c("Cameroon","CMR", 107)
tableauPays[34,]=c("Comoros","COM", 999)
tableauPays[35,]=c("Colombia","COL", 305)
tableauPays[36,]=c("Costa Rica","CRI", 405)
tableauPays[37,]=c("Central African","CAF", 109)
tableauPays[38,]=c("Cuba","CUB", 406)
tableauPays[39,]=c("Cape Verde","CPV", 108)
tableauPays[40,]=c("Cyprus","CYP", 610)
tableauPays[41,]=c("Czech Republic","CZE", 611)
tableauPays[42,]=c("Denmark","DNK", 612)
tableauPays[43,]=c("Djibouti","DJI", 114)
tableauPays[44,]=c("Dominica","DMA", 999)
tableauPays[45,]=c("Dominican Republic","DOM", 407)
tableauPays[46,]=c("Ecuador","ECU", 306)
tableauPays[47,]=c("Egypt","EGY", 115)
tableauPays[48,]=c("Ireland","IRL", 621)
tableauPays[49,]=c("Equatorial Guinea","GNQ", 999)
tableauPays[50,]=c("Estonia","EST", 613)
tableauPays[51,]=c("Eritrea","ERI", 116)
tableauPays[52,]=c("El Salvador","SLV", 408)
tableauPays[53,]=c("Ethiopia","ETH", 117)
tableauPays[54,]=c("Finland","FIN", 614)
tableauPays[55,]=c("France","FRA", 615)
tableauPays[56,]=c("Gambia","GMB", 150)
tableauPays[57,]=c("Gabon","GAB", 118)
tableauPays[58,]=c("Georgia","GEO", 616)
tableauPays[59,]=c("Ghana","GHA", 119)
tableauPays[60,]=c("Grenada","GRD", 999)
tableauPays[61,]=c("Germany","DEU", 617)
tableauPays[62,]=c("Greece","GRC", 618)
tableauPays[63,]=c("Guatemala","GTM", 410)
tableauPays[64,]=c("Guinea","GIN", 120)
tableauPays[65,]=c("Guyana","GUY", 307)
tableauPays[66,]=c("Palestinian a.","PSE", 999)
tableauPays[67,]=c("Haiti","HTI", 411)
tableauPays[68,]=c("Hong Kong","HKG", 999)
tableauPays[69,]=c("Honduras","HND", 412)
tableauPays[70,]=c("Croatia","HRV", 609)
tableauPays[71,]=c("Hungary","HUN", 619)
tableauPays[72,]=c("Iceland","ISL", 620)
tableauPays[73,]=c("Indonesia","IDN", 503)
tableauPays[74,]=c("India","IND", 207)
tableauPays[75,]=c("Iran","IRN", 208)
tableauPays[76,]=c("Israel","ISR", 622)
tableauPays[77,]=c("Italy","ITA", 623)
tableauPays[78,]=c("Côte d'Ivoire","CIV", 113)
tableauPays[70,]=c("Iraq","IRQ", 209)
tableauPays[80,]=c("Japan","JPN", 210)
tableauPays[81,]=c("Jamaica","JAM", 413)
tableauPays[82,]=c("Jordan","JOR", 624)
tableauPays[83,]=c("Kenya","KEN", 122)
tableauPays[84,]=c("Kyrgyzstan","KGZ", 213)
tableauPays[85,]=c("North Korea","PRK", 206)
tableauPays[86,]=c("Kiribati","KIR", 504)
tableauPays[87,]=c("Korea\, Republic of","KOR", 221)
tableauPays[88,]=c("Kuwait","KWT", 212)
tableauPays[89,]=c("Kazakhstan","KAZ", 211)
tableauPays[90,]=c("Lao","LAO", 214)
tableauPays[91,]=c("Lebanon","LBN", 627)
tableauPays[92,]=c("Latvia","LVA", 626)
tableauPays[93,]=c("Lithuania","LTU", 628)
tableauPays[94,]=c("Liberia","LBR", 123)
tableauPays[95,]=c("Slovakia","SVK", 641)
tableauPays[96,]=c("Lesotho","LSO", 162)
tableauPays[97,]=c("Luxembourg","LUX", 629)
tableauPays[98,]=c("Libya","LBY", 124)
tableauPays[99,]=c("Madagascar","MDG", 125)
tableauPays[100,]=c("Moldova","MDA", 631)
tableauPays[101,]=c("Mongolia","MNG", 215)
tableauPays[102,]=c("Malawi","MWI", 126)
tableauPays[103,]=c("Macedonia","MKD", 648)
tableauPays[104,]=c("Mali","MLI", 127)
tableauPays[105,]=c("Morocco","MAR", 130)
tableauPays[106,]=c("Mauritius","MUS", 129)
tableauPays[107,]=c("Mauritania","MRT", 128)
tableauPays[108,]=c("Oman","OMN", 218)
tableauPays[109,]=c("Montenegro","MON", 632)
tableauPays[110,]=c("Mexico","MEX", 414)
tableauPays[111,]=c("Malaysia","MYS", 505)
tableauPays[112,]=c("Mozambique","MOZ", 131)
tableauPays[113,]=c("Niger","NER", 133)
tableauPays[114,]=c("Nigeria","NGA", 134)
tableauPays[115,]=c("Netherlands","NLD", 633)
tableauPays[116,]=c("Norway","NOR", 634)
tableauPays[117,]=c("Nepal","NPL", 217)
tableauPays[118,]=c("Suriname","SUR", 312)
tableauPays[119,]=c("Nicaragua","NIC", 415)
tableauPays[120,]=c("New Zealand","NZL", 507)
tableauPays[121,]=c("Paraguay","PRY", 308)
tableauPays[122,]=c("Peru","PER", 309)
tableauPays[123,]=c("Pakistan","PAK", 219)
tableauPays[124,]=c("Poland","POL", 635)
tableauPays[125,]=c("Panama","PAN", 416)
tableauPays[126,]=c("Portugal","PRT", 636)
tableauPays[127,]=c("Papua New Guinea","PNG", 508)
tableauPays[128,]=c("Guinea-Bissau","GNB", 121)
tableauPays[129,]=c("Qatar","QAT", 220)
tableauPays[130,]=c("Romania","ROM", 637)
tableauPays[131,]=c("Philippines","PHL", 509)
tableauPays[132,]=c("Russian Federation","RUS", 222)
tableauPays[133,]=c("Rwanda","RWA", 999)
tableauPays[134,]=c("Saudi Arabia","SAU", 223)
tableauPays[135,]=c("South Africa","ZAF", 141)
tableauPays[136,]=c("Senegal","SEN", 137)
tableauPays[137,]=c("Slovenia","SVN", 999)
tableauPays[138,]=c("Sierra Leone","SLE", 139)
tableauPays[140,]=c("Singapore","SGP", 511)
tableauPays[141,]=c("Somalia","SOM", 140)
tableauPays[142,]=c("Spain","ESP", 643)
tableauPays[143,]=c("Serbia","YUG", 639)
tableauPays[144,]=c("Sudan","SDN", 148)
tableauPays[145,]=c("Sweden","SWE", 645)
tableauPays[146,]=c("Syrian Arab Republic","SYR", 647)
tableauPays[147,]=c("Switzerland","CHE", 646)
tableauPays[148,]=c("Trinidad and Tobago","TTO", 999)
tableauPays[150,]=c("Thailand","THA", 228)
tableauPays[151,]=c("Tajikistan","TJK", 227)
tableauPays[152,]=c("Togo","TGO", 151)
tableauPays[153,]=c("Tunisia","TUN", 152)
tableauPays[154,]=c("Turkey","TUR", 649)
tableauPays[155,]=c("Taiwan","TWN", 236)
tableauPays[156,]=c("Turkmenistan","TKM", 229)
tableauPays[157,]=c("Tanzania","TZA", 149)
tableauPays[158,]=c("Uganda","UGA", 153)
tableauPays[159,]=c("United Kingdom","GBR", 651)
tableauPays[160,]=c("Ukraine","UKR", 650)
tableauPays[161,]=c("Burkina Faso","BFA", 105)
tableauPays[162,]=c("Uruguay","URY", 313)
tableauPays[163,]=c("Uzbekistan","UZB", 231)
tableauPays[164,]=c("Venezuela","VEN", 314)
tableauPays[165,]=c("Viet Nam","VNM", 232)
tableauPays[166,]=c("Namibia","NAM", 132)
tableauPays[167,]=c("Palestinian a.","PSE", 999)
tableauPays[168,]=c("Samoa","WSM", 999)
tableauPays[169,]=c("Swaziland","SWZ", 999)
tableauPays[170,]=c("Yemen","YEM", 233)
tableauPays[171,]=c("Zambia","ZMB", 155)
tableauPays[172,]=c("Zimbabwe","ZWE", 156)
tableauPays[173,]=c("United States","USA", 425)
tableauPays[174,]=c("Canada","CAN", 403)
tableauPays[175,]=c("Kosovo","KSV", 999)
tableauPays[176,]=c("Soudan du Sud","SSD", 999)
tableauPays[177,]=c("Timor oriental","TMP", 999)
Vérification des données de la base

#Voir le haut de la base
head(base)

#Voir la listes des variables
names(base)

#création de la variable code pays, par l'extraction dans le code initial
base$pays=substr(base$code, 1, 3)

#Extaction des années supérieures à 1960
base=subset(base, base$annee>1960)
Travail sur un pays


#Travail sur un pays en particulier: ici le Canada
base3=subset(base, base$pays==403)
baseTemp=subset(base, base$pays==403)
baseValide=table(baseTemp$code)
baseValideEtape1=data.frame(baseValide)
baseValideEtape2=subset(baseValideEtape1,baseValideEtape1$Freq>50)
baseValideEtape3=baseValideEtape2$Var1
baseValideEtape4=subset(baseTemp,baseTemp$code %in%  baseValideEtape3 )
tp=tapply(baseValideEtape4[,2+7],baseValideEtape4$annee, mean, na.rm=T)/10
mean(tp, na.rm=T)
plot(tp)
Travail sur plusieurs pays pour créer une table mysql interrogée dans Perspective monde




#Boucle d'insertion des requêtes en vue de créer un fichier pour «peupler» la table mysql.
#création d'un contenant texte pour recevoir les requêtes mysql d'insertion
sink("c:\\nssr\\temperatureNASASQLv2.txt")

tryCatch({
	#la plus grande boucle est sur les pays
	for(k in 1:dim(tableauPays)[1]){
	#On élimine les pays ou zones qui n'ont pas d'équivalents dans Perspective monde
		if(tableauPays[k,3]!=999){
	#On fait une base avec un pays
			baseTemp=subset(base, base$pays==as.numeric(tableauPays[k,3]))
			#On crée une base des codes des stations disponibles pour le pays
			baseValide=table(baseTemp$code)
			#On transforme ce résultat en un data.frame
			baseValideEtape1=data.frame(baseValide)
			#On fait un sous ensemble en ne retenant que les bases qui ont plus de 50 contributions annuelles valides
			baseValideEtape2=subset(baseValideEtape1,baseValideEtape1$Freq>50)
			#On fait un vecteur avec l'information précédente
			baseValideEtape3=baseValideEtape2$Var1
			#On fait un subset en ne retenant que les stations qui remplissent la condition précédente
			baseValideEtape4=subset(baseTemp,baseTemp$code %in%  baseValideEtape3 )
			#On rebaptise la base pour conformité avec le code antérieur
			base3=baseValideEtape4

			#On boucle sur les mois de l'années qui correspondent aux colonnes 3...
			for(j in 1:12){
				#On extrait les moyennes mensuelles pour toutes les stations retenues: on divise par dix puisque celle-ci est formatée 221 pour 22.1 degré celsius
				tp=tapply(base3[,2+j],base3$annee, mean, na.rm=T)/10

				#on bloucle sur les années récupérées
				for(i in 1:length(tp)){
				#première condition: le rséultat doit être numérique
				if(is.numeric((tp[i]))){
					#deuxième condition: le string de l'année doit être supérieur à 3; on élimine les NA
					if(length(names(tp)[i]>3)){
						#troisième conditionL on élimine les Not a number provoqués par R pour les valeurs
					    if(tp[i]!="NaN"){
						#On procède à l'insertion dans le fichier
						cat(paste("INSERT INTO temperaturenasa (codestat, codepays, annee, valeur) Values(","\"TemperatureNASA","Mois",j,"\"",
			           ",","\"",tableauPays[k,2], "\"",
			           ",","\"",names(tp)[i],"\"",
			           ",","\"",round(as.numeric((tp[i])),1),"\"",
			           ")",sep=''))
						#On ferme la ligne correctement
						cat(";\n")
  						}
					}
				}
			}
			}
		}
	}
}, error=function(e){})
#On ferme le fichier
sink()
#selon les paramètres, création de plus de 60 000 requêtes pour le traitement dans mysql.