Main

Main.TutoStat History

Show minor edits - Show changes to markup

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:

Distributions de probabilités

Changed lines 127-128 from:

Tracer un histogramme

to:

Tracer un histogramme

Changed lines 147-148 from:

Calcul et tracé d'une probabilité conditionnelle

to:

Calcul et tracé d'une probabilité conditionnelle

Changed line 174 from:

Tracer la population des stations

to:

Tracer la population des stations

June 26, 2017, at 04:02 PM EST by 132.227.202.156 -
Added lines 1-3:
Changed lines 9-10 from:

Récupération des données

to:

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:
  1. Calculer {$P[Vd=1|Al]$} [={$P[Vd=1|Al]*1 + P[Vd=0|Al]*0$}estimation de l'espérance conditionnelle]
to:
  1. 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:
  1. Pour chaque altitude
    1. Chercher les stations concernées [=réduction de l'univers pour les probas conditionnelles]
    2. Calculer la moyenne des Vd [=estimation de l'espérance conditionnelle]
to:
  1. Construire la table à 2 lignes et 30 colonnes de {$P[Vd | Al]$} en cherchant pour chaque altitude:
    1. Chercher les stations concernées [=réduction de l'univers pour les probas conditionnelles]
    2. Calculer la fréquence de Vd=1
    3. Calculer la fréquence de Vd=0
    4. 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

  1. calculer pour toutes les stations
    1. Vd = 1 si au moins 2 vélos dispos, Vd = 0 sinon
    2. Al = [0,...,29] catégorie d'altitude (cf aide ci-dessous pour ce calcul)
  2. Pour chaque altitude
    1. Chercher les stations concernées [=réduction de l'univers pour les probas conditionnelles]
    2. Calculer la moyenne des Vd [=estimation de l'espérance conditionnelle]
Added lines 157-174:
  1. retrouver les catégories
  2. première colonne de station = altitude
  3. intervalle = largeur d'un intervalle

catAlt = np.floor((stations[:,1]-stations[:,1].min()) / intervalle)

  1. 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:

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]

  1. définition de tous les styles (pour distinguer les arrondissements)

style = [(s,c) for s in "o^+*" for c in "byrmck" ]

  1. 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:
to:

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:
to:
Added line 143:
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:)

  1. stocker les altitudes + définir la largeur des intervalles:

alt = res[1] intervalle = alt[1]-alt[0]

  1. définir la fréquence de répartition de la population dans les intervalles

pAlt = res[0]/res[0].sum()

  1. 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])

  1. 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:
to:
Changed lines 14-17 from:
to:

fname = "nomDeFichier.pkl" f= open(fname,'rb') data = pkl.load(f) f.close()

Changed line 52 from:
to:
Added lines 13-16:

(:source lang=python:)

(:sourceend:)

Added line 46:

f.close()

Added lines 49-56:

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 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:

* Places totales (Ps) * 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:)

  1. 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"%(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) dataVelib.pkl

Solution 2: les API rest

Added line 5:

Récupération des données

Changed lines 8-14 from:
  1. récupération d'une clé
to:
  1. récupération d'une clé (XXX)
  2. 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:
  1. première étape: récupération des données, création d'un compte sur: https://developer.jcdecaux.com/#/signup
to:
  1. première étape: récupération des données, création d'un compte sur: https://developer.jcdecaux.com/#/signup
  2. 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.

  1. première étape: récupération des données, création d'un compte sur: https://developer.jcdecaux.com/#/signup