Python
¶Nous allons utiliser dans ce TP le module pandas
permettant l'analyse de données avec Python. La première instruction est d'installer le module, à faire dans un terminale de commande. Nous devons aussi installer les modules matplotlib
et scipy
.
{bash}
pip3 install pandas
pip3 install matplotlib
pip3 install scipy
pip3 install numpy
Une fois ces modules installée, nous pouvons lancer un notebook
pour commencer notre programme.
Il faut tout d'abord importer ces modules. La dernière ligne permettra de voir le résultat des graphiques dans le document.
import matplotlib.pyplot
import pandas
import scipy.stats
import numpy
%matplotlib inline
# Lecture d'un fichier texte
tips = pandas.read_csv("donnees/tips.csv",
header = 0, sep = ",")
Sur ces données, il est bien évidemment possible de voir quelques informations classiques.
type(tips)
# informations diverses
tips.shape
tips.count()
tips.info()
list(tips.columns)
list(tips)
La fonction describe()
permet de décrire toutes les variables quantitatives d'un jeu de données directement.
# résumé basique
tips.describe()
tips.describe().round(2)
Il est possible de sélectionner les variables soit via les crochets []
, soit par un point .
.
Les fonctions ci-dessous permettent de décrire une variable quantitative (ici "total_bill"
).
tips.total_bill.describe()
tips["total_bill"].describe()
tips.total_bill.mean()
tips.total_bill.std()
tips.total_bill.var()
tips.total_bill.min()
tips.total_bill.max()
tips.total_bill.median()
tips.total_bill.quantile([.01, .1, .9, .99])
scipy.stats.normaltest(tips.total_bill)
scipy.stats.shapiro(tips.total_bill)
Pour représenter graphiquement cette variable, pandas
met à disposition (via le module matplotlib
utilisé par pandas
) des fonctions graphiques.
Pour réaliser un histogramme, nous utilisons la fonction hist()
. Celle-ci peut prendre des options. La fonction plot()
avec le paramètre kind
avec la valeur "hist"
revient au même résultat.
tips.plot.hist()
tips.total_bill.hist()
tips.total_bill.hist(bins = 20)
tips.total_bill.plot(kind = "hist")
tips.total_bill.plot(kind = "hist", normed = True)
tips.total_bill.plot(kind = "kde")
Pour avoir la densité et l'histogramme sur le même graphique, il est nécessaire de compiler les deux lignes suivantes ensemble.
tips.total_bill.plot(kind = "hist", normed = True, color = "lightgrey")
tips.total_bill.plot(kind = "kde")
Enfin, pour les boîtes à moustaches, il faut passer par le DataFrame
pour l'afficher, et choisir une variable spécifiquement éventuellement.
tips.boxplot()
tips.boxplot(column = "total_bill")
tips.boxplot(column = "total_bill", grid = False)
Pour les variables qualitatives, il y a plusieurs façons de faire pour obtenir la table d'occurences (ou des effectifs), ainsi que la table des proportions des modalités.
tips.sex.describe()
tips.sex.unique()
tips.sex.value_counts()
pandas.crosstab(tips.sex, "freq")
pandas.crosstab(tips.sex, "freq", normalize=True)
scipy.stats.chisquare(t)
Ensuite, pour réaliser un diagramme en barres, nous utilisons le type "bar"
pour plot()
. Les calculs de proportions précédents nous permettent d'afficher une représentation des proportions plutôt que des effectifs.
t = pandas.crosstab(tips.sex, "freq")
t.plot.bar()
t.plot(kind = "bar")
t = pandas.crosstab(tips.sex, "freq", normalize=True)
t.plot(kind = "bar")
(t * 100).plot(kind = "bar")
Et pour un diagramme circulaire, seul le tableau des effectifs produit par value_counts()
nous permet de le réaliser.
t = pandas.crosstab(tips.sex, "freq")
t.plot.pie(subplots=True, figsize = (6, 6))
tips.corr()
tips.total_bill.corr(tips.tip)
tips.total_bill.cov(tips.tip)
scipy.stats.pearsonr(tips.total_bill, tips.tip)
scipy.stats.kendalltau(tips.total_bill, tips.tip)
tips.plot.scatter("total_bill", "tip")
pandas.scatter_matrix(tips)
pandas.crosstab(tips.sex, tips.smoker)
pandas.crosstab(tips.sex, tips.smoker, margins=True)
pandas.crosstab(tips.sex, tips.smoker, normalize = True)
pandas.crosstab(tips.sex, tips.smoker, normalize = "index")
pandas.crosstab(tips.sex, tips.smoker, normalize = "index", margins=True)
pandas.crosstab(tips.sex, tips.smoker, normalize = "columns")
pandas.crosstab(tips.sex, tips.smoker, normalize = "columns", margins=True)
t = pandas.crosstab(tips.sex, tips.smoker)
scipy.stats.chi2_contingency(t)
t = pandas.crosstab(tips.sex, tips.smoker)
t.plot.bar()
t = pandas.crosstab(tips.sex, tips.smoker, normalize=True)
t.plot.bar()
t = pandas.crosstab(tips.sex, tips.smoker, normalize="index")
t.plot.bar(stacked=True)
t = pandas.crosstab(tips.sex, tips.smoker)
t.plot.pie(subplots=True, figsize = (12, 6))
tips.groupby("sex").mean()
tips.groupby("sex")["total_bill"].agg([numpy.mean, numpy.std, numpy.median, numpy.min, numpy.max])
billFemale = tips.total_bill[tips.sex == "Female"]
billMale = tips.total_bill[tips.sex == "Male"]
scipy.stats.ttest_ind(billFemale, billMale)
billGrouped = [tips.total_bill[tips.sex == s] for s in list(tips.sex.unique())]
scipy.stats.f_oneway(*billGrouped)
tips.hist(column = "total_bill", by = "sex")
tips.boxplot(by = "sex")
tips.boxplot(column = "total_bill", by = "sex")
A partir du fichier diamonds.csv
(voir l'aide ici), analyser les données suivant le déroulement classique
price
) et les autres variables