Main

Main.TutoStat History

Show minor edits - Show changes to output

Changed line 19 from:
data = pkl.load(f)
to:
data = pkl.load(f, encoding='latin1') # option encoding pour le passage py2 => py3
June 26, 2017, at 04:04 PM EST by 132.227.202.156 -
Changed lines 102-103 from:
!!! Distributions de probabilités
to:
!!!%part% Distributions de probabilités
Changed lines 127-128 from:
!!! Tracer un histogramme
to:
!!!%part% Tracer un histogramme
Changed lines 147-148 from:
!!! Calcul et tracé d'une probabilité conditionnelle
to:
!!!%part% Calcul et tracé d'une probabilité conditionnelle
Changed line 174 from:
!!! Tracer la population des stations
to:
!!!%part% Tracer la population des stations
June 26, 2017, at 04:02 PM EST by 132.227.202.156 -
Added lines 1-3:
%define=part apply=block bgcolor=#e6d8c0%

Changed lines 9-10 from:
!!! Récupération des données
to:
!!!%part% Récupération des données
Changed line 23 from:
'''Solution 2: les API rest'''
to:
'''Solution 2: les API rest''' [Pour jouer '''A LA MAISON''']
Changed lines 38-39 from:
keyG = "GGG" # facultatif
to:
Changed line 41 from:
   alt = requests.get(urlGoogleAPI+position+"&key="+keyG)
to:
   alt = requests.get(urlGoogleAPI+position)
Changed line 44 from:
   time.sleep(0.2) # pour ne pas se faire bannir par Google
to:
   time.sleep(0.1) # pour ne pas se faire bannir par Google
Changed line 225 from:
* Les challenges Kaggle: www.kaggle.com
to:
* Les challenges Kaggle: http://www.kaggle.com
Changed lines 218-225 from:
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
to:
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?

----
!!! Pour s'amuser avec d'autres données:

* Beaucoup de choses sur Paris: http://opendata.paris.fr
* Les données classique UCI: https://archive.ics.uci.edu/ml/datasets.html
* Les challenges Kaggle: www.kaggle.com
Added lines 197-198:
!!!! Disponibilité:
Added lines 204-209:

!!!! Moyenne, Médiane...

Sur différentes cartes, afficher les stations suivantes:
* stations dont l'altitude est inférieure à la moyenne (en conservant le code couleur précédent)
* stations dont l'altitude est supérieure à la médiane (en conservant le code couleur précédent)
Changed line 156 from:
### Calculer {$P[Vd=1|Al]$} [={$P[Vd=1|Al]*1 + P[Vd=0|Al]*0$}estimation de l'espérance conditionnelle]
to:
### Tracer {$P[Vd=1|Al]$} [={$P[Vd=1|Al]*1 + P[Vd=0|Al]*0$}estimation de l'espérance conditionnelle]
Changed line 147 from:
On s'intéresse à  {$P[Vd | Al]$}, c'est à dire, la probabilité d'avoir un vélo disponible en fonction de l'altitude.
to:
On s'intéresse à  {$E[P[Vd | Al]]$}, c'est à dire, la probabilité d'avoir un vélo disponible en fonction de l'altitude.
Changed lines 152-155 from:
# Pour chaque altitude
## Chercher les stations concernées [=réduction
de l'univers pour les probas conditionnelles]
## Calculer la moyenne des Vd [=estimation de l'espérance conditionnelle]
to:
## Construire la table à 2 lignes et 30 colonnes de {$P[Vd | Al]$} en cherchant pour chaque altitude:
### Chercher les stations concernées
[=réduction de l'univers pour les probas conditionnelles]
### Calculer la fréquence de Vd=1
### Calculer la fréquence de Vd=0
### Calculer {$P[Vd=1|Al]$} [={$P[Vd=1|Al]*1 + P[Vd=0|Al]*0$}
estimation de l'espérance conditionnelle]
Changed line 210 from:
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
to:
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
Changed lines 109-110 from:
* Au moins 3 vélos disponibles (variable binaire) (Vd) [comme il y a souvent des vélos en panne, on considère qu'il faut 3 vélos dans une stations pour être sûr de pouvoir en prendre un.]
to:
* Au moins 2 vélos disponibles (variable binaire) (Vd) [comme il y a souvent des vélos en panne, on considère qu'il faut 2 vélos dans une stations pour être sûr de pouvoir en prendre un.]
Deleted lines 143-144:

Changed lines 145-148 from:
!!! Tracer la population des stations

!!!! Sanity check: affichage des arrondissements pour vérifier que tout est OK:

to:
!!! Calcul et tracé d'une probabilité conditionnelle

On s'intéresse à  {$P[Vd | Al]$}, c'est à dire, la probabilité d'avoir un vélo disponible en fonction de l'altitude.
Voici les étapes à respecter
# calculer pour toutes les stations
## Vd = 1 si au moins 2 vélos dispos, Vd = 0 sinon
## Al = [0,...,29] catégorie d'altitude (cf aide ci-dessous pour ce calcul)
# Pour chaque altitude
## Chercher les stations concernées [=réduction de l'univers pour les probas conditionnelles]
## Calculer la moyenne des Vd [=estimation de l'espérance conditionnelle]

Added lines 157-174:
# retrouver les catégories
# première colonne de station = altitude
# intervalle = largeur d'un intervalle
catAlt = np.floor((stations[:,1]-stations[:,1].min()) / intervalle)

# le début du code suivant peut-être
pDispoSAlt = np.zeros(np.unique(catAlt).shape[0])
for a in np.unique(catAlt): # fonction pratique pour isoler les valeurs uniques
    [...]
(:sourceend:)


----
!!! Tracer la population des stations

!!!! Sanity check: affichage des arrondissements pour vérifier que tout est OK:

(:source lang=python:)
Added lines 200-208:


----
!!! Tests de corrélation

* Calculer les corrélations entre les variables ''Altitude'' et ''Vélo disponible''
* Calculer les corrélations entre les variables ''Arrondissement'' et ''Vélo disponible''

Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
Added lines 169-171:
%width=500px% Attach:2014_velibArrond.png
Tout est OK, on peut passer à l'exercice!

Deleted line 176:
Added lines 149-169:
!!!! Sanity check: affichage des arrondissements pour vérifier que tout est OK:

(:source lang=python:)
x1 = stations[:,3] # recuperation des coordonnées
x2 = stations[:,2]
# définition de tous les styles (pour distinguer les arrondissements)
style = [(s,c) for s in "o^+*" for c in "byrmck" ]

# tracé de la figure
plt.figure()
for i in range(1,21):
    ind, = np.where(stations[:,0]==i)
    # scatter c'est plus joli pour ce type d'affichage
    plt.scatter(x1[ind],x2[ind],marker=style[i-1][0],c=style[i-1][1],linewidths=0)

plt.axis('equal') # astuce pour que les axes aient les mêmes espacements
plt.legend(range(1,21), fontsize=10)
plt.savefig("carteArrondissements.pdf")
(:sourceend:)

Afin de réviser les usages de @@np.where@@
Deleted line 174:
Utiliser la méthode scatter.
Changed lines 143-154 from:
%width=200px% Attach:2014_histAlt.png
to:
%width=500px% Attach:2014_histAlt.png


----
!!! Tracer la population des stations

Projeter les stations sur la carte en mettant en:
* rouge les stations pleines,
* jaune les vides,
* verte les autres.

Utiliser la méthode scatter.
Changed line 143 from:
%center width=200px% Attach:2014_histAlt.png
to:
%width=200px% Attach:2014_histAlt.png
Added line 143:
%center width=200px% Attach:2014_histAlt.png
Changed lines 127-141 from:
Tracer l'histogramme correspondant à la distribution {$P[Al]$}
to:
Tracer l'histogramme correspondant à la distribution {$P[Al]$}.\\
'''Attention:''' pour faire un tracé correct, il faut que l'aire de l'histogramme somme à 1. Il est donc nécessaire de réfléchir à la hauteur et largeur des différentes barres.

(:source lang=python:)
# stocker les altitudes + définir la largeur des intervalles:
alt = res[1]
intervalle = alt[1]-alt[0]
# définir la fréquence de répartition de la population dans les intervalles
pAlt = res[0]/res[0].sum()
# puis diviser la fréquence par la base de l'intervalle pour que ça somme à 1
pAlt /= intervalle
[...] # créer une figure
plt.bar((alt[1:]+alt[:-1])/2,pAlt, alt[1]-alt[0])
# NB: dans bar, on donne: abscisse, ordonnées, largeur des barres
(:sourceend:)
Changed lines 100-103 from:
!!! Questions

!
!!! Distributions de probabilités
to:
!!! Distributions de probabilités
Added lines 114-119:
(:source lang=python:)
nItervalles = 30
res = plt.hist(altitudes, nIntervalles)
print res[0] # effectif dans les intervalles
print res[1] # definition des intervalles (ATTENTION: 31 valeurs)
(:sourceend:)
Changed lines 122-128 from:
* {$P[Vd | Ar]$}
to:
* {$P[Vd | Ar]$}

----
!!! Tracer un histogramme

Tracer l'histogramme correspondant à la distribution {$P[Al]$}

Changed line 91 from:
Mise en forme:
to:
'''Mise en forme et élimination du bruit'''
Changed line 52 from:
>>block color="ffbbbb"<<
to:
>>block bgcolor=#ffbbbb<<
Changed lines 14-17 from:
to:
fname = "nomDeFichier.pkl"
f= open(fname,'rb')
data = pkl.load(f)
f.close()
Changed line 52 from:
>>block color="ffbbbbb"<<
to:
>>block color="ffbbbb"<<
Added lines 13-16:
(:source lang=python:)

(:sourceend:)

Added line 46:
f.close()
Added lines 49-56:
>>block color="ffbbbbb"<<
'''Réflexe pickle:''' chaque fois que vous avez effectué des opérations coûteuses, penser à sauver le résultat! Le module pickle offre la possibilité de le faire en très peu de ligne!
(:source lang=python:)
f= open('coordVelib.pkl','wb')
pkl.dump(data,f) # penser à sauver les données pour éviter de refaire les opérations
f.close()
(:sourceend:)
>><<
Changed line 10 from:
Le fichier suivant regroupe les informations sur les stations velib au 11/09/2014 à 16h enrichi avec les altitudes (API Google)
to:
Le fichier suivant regroupe les informations sur les stations Vélib enrichies avec les altitudes (API Google)
Added line 5:
----
Added line 44:
----
Added line 83:
----
Changed lines 1-3 from:
! Quelques exercices sur des données réelles

!! Velib
to:
! Quelques exercices sur des données réelles (Vélib)

Nous faisons l'hypothèse que les étudiants ont les connaissances de base en @@numpy@@ et @@matplotlib@@. Dans le cas contraire, se référer au premier tutoriel [[Main.TutoPython|lien]]
Changed lines 30-31 from:
keyG = "GGG"
to:
keyG = "GGG" # facultatif
Changed line 35 from:
   assert(alt.json()['status'] == "OK")
to:
   assert(alt.json()['status'] == "OK") # verification de la réussite
Changed line 39 from:
f= open('coordVelib.pkl','w')
to:
f= open('coordVelib.pkl','wb')
Added lines 73-80:
Mise en forme:

Les données ne sont pas toutes correctes (comme la plupart des données réelles). Nous souhaitons aussi les mettre en forme dans un tableau.
* Faire défiler les stations
* Extraire l'arrondissement [Champ 'number' / 1000 en division entière] et vérifier qu'il est compris entre 1 et 20
* Eliminer les autres stations
* Définir une matrice du bon nombre de lignes avec les colonnes contenant: 3 coordonnées géographiques, Arrondissement, Places totales, Places dispo.

Changed line 87 from:
* Arrondissement (Ar) [Premiers chiffres du champ 'number'
to:
* Arrondissement (Ar)
Changed lines 29-31 from:
urlG = "http://maps.googleapis.com/maps/api/elevation/json?locations="
to:
urlGoogleAPI = "https://maps.googleapis.com/maps/api/elevation/json?locations="
keyG = "GGG"

Changed lines 34-35 from:
   alt = requests.get(urlGoogleAPI+position)
to:
   alt = requests.get(urlGoogleAPI+position+"&key="+keyG)
    assert(alt.json()['status'] == "OK"
)
Changed lines 87-88 from:
* {$P{Vd | Al]$}
* {$P{Vd | Ar]$}
to:
* {$P[Vd | Al]$}
* {$P[Vd | Ar]$}
Changed lines 78-80 from:
* Places totales (Ps)
* Places dispo (Pd)
* Borne pleine (Bp)
to:
%comment% * Places totales (Ps)
%comment% * Places dispo (Pd)
* Station pleine (Sp) [variable binaire: valeur 1 si la station est pleine]
Changed lines 86-88 from:
*
to:
* {$P[Sp | Al]$}
* {$P{Vd | Al]$}
* {$P{Vd | Ar]$}
Added line 74:
Dans notre population, les individus sont des stations, qui ont différents caractères.
Changed lines 80-82 from:
to:
* Borne pleine (Bp)
* Au moins 3 vélos disponibles (variable binaire) (Vd) [comme il y a souvent des vélos en panne, on considère qu'il faut 3 vélos dans une stations pour être sûr de pouvoir en prendre un.]

Changed lines 84-86 from:
{$P$}
to:
* {$P[Ar]$}
* {$P[Al]$} nous utiliserons une discrétisation de l'altitude en 100 intervalles de mêmes tailles
*
Added lines 69-81:

!!! Questions

!!!! Distributions de probabilités

Nous allons étudier les variables aléatoires suivantes:
* Arrondissement (Ar) [Premiers chiffres du champ 'number'
* Altitude (Al)
* Places totales (Ps)
* Places dispo (Pd)

Construire les matrices suivantes:
{$P$}
Changed lines 55-68 from:
*'status': u'OPEN'}
to:
*'status': u'OPEN'}

Pour faire défiler les stations dans la structure @@data@@:
(:source lang=python:)
for station in data:
    ...
(:sourceend:)

Pour accéder à un champ d'une station:
(:source lang=python:)
for station in data:
    nbVeloDispo = station['available_bikes']
    ...
(:sourceend:)
Changed lines 38-55 from:
(:sourceend:)
to:
(:sourceend:)

!!! Structure des données

Les données sont dans une liste de dictionnaire (ie chaque station est un dictionnaire python). Les champs du dictionnaire sont:
*'address': u"57 RUE DU CHATEAU D'EAU - 75010 PARIS",
*'alt': 35.79555130004883,
*'available_bike_stands': 2,
*'available_bikes': 17,
*'banking': True,
*'bike_stands': 19,
*'bonus': False,
*'contract_name': u'Paris',
*'last_update': 1410442143000,
*'name': u"10007 - CHATEAU D'EAU",
*'number': 10007,
*'position': {u'lat': 48.87242997325711, u'lng': 2.355489390173873},
*'status': u'OPEN'}
Changed lines 37-38 from:
pkl.dump(data,f)(:sourceend:)
to:
pkl.dump(data,f) # penser à sauver les données pour éviter de refaire les opérations
(:sourceend:) 
Added lines 19-22:
import requests
import pickle as pkl
import time

Changed line 37 from:
pkl.dump(data,f)(:sourceend:)
to:
pkl.dump(data,f)(:sourceend:)
Changed lines 22-33 from:
(:sourceend:)
to:
(:sourceend:)
# enrichissement avec l'altitude à partir de l'API Google:
(:source lang=python:)
urlG = "http://maps.googleapis.com/maps/api/elevation/json?locations="
for s in data:
    position = "%f,%f"%(s['position']['lat'],s['position']['lng'])
    alt = requests.get(urlGoogleAPI+position)
    s[u'alt'] = alt.json()['results'][0]['elevation'] # enrichissement
    time.sleep(0.2) # pour ne pas se faire bannir par Google

f= open('coordVelib.pkl','w')
pkl.dump(data,f)
(:sourceend:)
Added lines 6-13:

'''Solution 1: télécharger un fichier'''

Le fichier suivant regroupe les informations sur les stations velib au 11/09/2014 à 16h enrichi avec les altitudes (API Google)
[[(Attach:)dataVelib.pkl]]

'''Solution 2: les API rest'''

Added line 5:
!!! Récupération des données
Changed lines 8-14 from:
# récupération d'une clé
to:
# récupération d'une clé (XXX)
#Début du code:
(:source lang=python:)
url = "https://api.jcdecaux.com/vls/v1/stations?contract=Paris&apiKey=XXX"
dataStation = requests.get(url)
data = dataStation.json()
(:sourceend:)
Changed lines 6-7 from:
# première étape: récupération des données, création d'un compte sur: [[https://developer.jcdecaux.com/#/signup]]
to:
# première étape: récupération des données, création d'un compte sur: [[https://developer.jcdecaux.com/#/signup]]
# récupération d'une clé
Added lines 1-6:
! Quelques exercices sur des données réelles

!! Velib

Nous proposons de tracer quelques courbes de probabilité sur des données velib récupérée directement sur le web.
# première étape: récupération des données, création d'un compte sur: [[https://developer.jcdecaux.com/#/signup]]