Evaluation Python année 2016-2017 - solution

Le répertoire data contient deux fichiers csv simulés aléatoirement dont il faudra se servir pour répondre aux 10 questions qui suivent. Chaque question vaut deux points. Le travail est à rendre pour le lundi 20 février sous la forme d'un notebook envoyé en pièce jointe d'un mail.

1

Deux fichiers sont extraits de la base de données d'un médecin. Un fichier contient des informations sur des personnes, un autre sur les rendez-vous pris par ces personnes. Quels sont-ils ?

Le second fichier est plus volumineux et contient une variable price qui ne peut pas être reliée aux personnes. Le premier fichier est celui des personnes, le second celui des rendez-vous. La variable idc est présente dans les deux tables. C'est elle qui identifie les personnes dans les deux tables.

2

On souhaite étudier la relation entre le prix moyen payé par une personne, son âge et son genre. Calculer le prix moyen payé par une personne ?

La table des rendez-vous contient toutes l'information nécessaire. La question était un peu ambiguë. On peut déterminer le prix moyen payé par personne, ou le prix moyen des prix moyens... On va répondre à la première option car la seconde n'a pas beaucoup d'intérêt et c'est très proche du prix moyen par rendez-vous, ce que la question aurait sans doute formulé dans ce sens si telle avait été son intention. On groupe par idc et on fait la moyenne.

3

Faire la jointure entre les deux tables.

Cette jointure est assez simple puisque la colonne partagée porte le même nom dans les deux tables. On peut néanmoins se poser la question de savoir s'il y a des personnes qui n'ont pas de rendez-vous associé et réciproquement.

Visiblement, ce n'est pas le cas puisqu'une jointure incluant les éléments sans correspondances dans les deux tables n'ajoute pas plus d'éléments à la jointure.

4

Tracer deux nuages de points (age, prix moyen) et (genre, prix moyen) ?

On peut aussi utiliser un module comme seaborn qui propose des dessins intéressants pour un statisticatien.

On ne voit pas grand chose sur ce second graphe. Une option est d'ajouter un bruit aléatoire sur le genre pour éclater le nuage.

Il n'y a rien de flagrant. On peut faire un graphe moustache.

C'est mieux. Un dernier. Le diagramme violon, plus complet que le précédent.

5

Calculer les coefficients de la régression $prix\_moyen \sim age + genre$.

Une régression. Le premier réflexe est scikit-learn.

On utilise maintenant statsmodels qui est plus complet pour toute ce qui est un modèle linéaire.

Ou encore (après avoir ajouté une constante).

On peut aussi définir la régression sous la forme de formule avec le module patsy.

6

On souhaite étudier le prix d'une consultation en fonction du jour de la semaine. Ajouter une colonne dans la table de votre choix avec le jour de la semaine.

On convertit d'abord la colonne date (chaîne de caractères au format date) avec la fonction to_datetime.

Et on récupère le jour de la semaine avec weekday.

7

Créer un graphe moustache qui permet de vérifier cette hypothèse.

On réutilise le code d'une question précédente.

C'est clairement plus cher le dimanche.

8

Ajouter une colonne dans la table de votre choix qui contient 365 si c'est le premier rendez-vous, le nombre de jour écoulés depuis le précédent rendez-vous. On appelle cette colonne $delay$. On ajoute également la colonne $1/delay$.

Pour commencer, on convertit la date en nombre de jours depuis la première date.

On convertit en entier.

On trie par patient et jour puis on effectue la différence.

Il reste à traiter le premier jour ou plutôt le premier rendez-vous. On le récupère pour chaque patient.

Puis on fait une jointure.

Il ne reste plus qu'à remplacer les NaN par jouri.

Finalement, il faut ajouter une colonne $1/delay$. Comme des patients ont parfois deux rendez-vous le même jour, pour éviter les valeurs nulles, on ajoute la colonne $1/(1+delay)$. On aurait pu également pour éviter les valeurs nulles considérer le temps en secondes et non en jour entre deux rendez-vous.

8 - réponse plus courte

On garde l'idée de la fonction diff et on ajoute la fonction shift.

9

Calculer les coefficients de la régression $prix \sim age + genre + delay + 1/delay + jour\_semaine$.

L'âge ne fait pas partie de la table tout. Il faut faire une jointure pour le récupérer.

Ensuite retour à scikit-learn et plutôt le second statsmodels pour effectuer des tests sur les coefficients du modèle. On regarde d'abord les corrélations.

Si le jeu de données n'est pas trop volumineux.

Un dernier pour la route.

Régression

10

Comment comparer ce modèle avec le précédent ? Implémentez le calcul qui vous permet de répondre à cette question.

Nous pourrions comparer les coefficients $R^2$ (0.57, 0.61) des régressions pour savoir quelle est la meilleur excepté que celle-ci ne sont pas calculées sur les mêmes données. La comparaison n'a pas de sens et il serait dangeraux d'en tirer des conclusions. Les valeurs sont de plus très proches. Il faut comparer les prédictions. Dans le premier cas, on prédit le prix moyen. Dans le second, on prédit le prix d'une consultation. Il est alors possible de calculer une prédiction moyenne par patient et de comparer les erreurs de prédiction du prix moyen. D'un côté, la prédiction du prix moyen, de l'autre la prédiction du prix d'une consultation agrégé par patient.

On calcule l'erreur.

On agrège les secondes prédictions.

Le second modèle est clairement meilleur.

La seconde régression utilise une information dont on ne dispose pas au niveau agrégé : le jour de la semaine et un précédent graphe a clairement montré que c'était une variable importante. Un dernier graphe pour comparer les deux prédictions en montrant les prédictions triées par prix à prédire.