Visualisations

Tableau de fréquence

Ou tableau des effectifs. (frequency table en anglais)
Un tableau de fréquence affiche chacune des valeurs possibles, associée au nombre de fois qu’elle apparaît.

Ex: On la liste des âges des enfants dans une colonne de vacances:
  5,7,5,9,7,7,6,9,9,9,10,12,12,7
Dresser le tableau des effectifs pour cette liste

| Âge | Effectifs
| 5   | 2
| 6   | 1
| 7   | 4
| 8   | 0
| 9   | 4
| 10  | 1
| 11  | 0
| 12  | 2

Tableau croisé

Ou tableau de contingence voire tableau à double-entrée.
Un tableau croisé affiche les effectifs de deux caractéristiques associées.

Ex: Suite à un sondage, on a récolté les données suivantes:

         | Chat | !Chat |
| Chien  | 2    | 4     |
| !Chien | 11   | 12    |

- 2 personnes ont un chat et un chien
- 4 ont un chien et pas de chat
- 11 ont un chat et pas de chien
- 12 non ni chien ni chat

Graphique en barres

Ou diagramme en bâtons. (bar chart en anglais)
Un diagramme en barres utilise le nombre d’effectifs pour déterminer la hauteur des barres.
Permet de comparer les quantités entre différents groupes (en comparant la hauteur des barres au lieu de regarder des chiffres bruts).

python

X = [5,7,5,9,7,7,6,9,9,9,10,12,12,7]

values,count = np.unique(X, return_counts=True)
plt.bar(values, count)
plt.yticks(np.arange(0,5))
plt.xlabel('Âge')
plt.ylabel('Effectifs')


Graphique à points

(dot plot en anglais)
Remplace les barres pleines par des points, on peut donc les compter pour connaître la fréquence des différentes valeurs.

python

X = [5,7,5,9,7,7,6,9,9,9,10,12,12,7]

pos = []
keys = {}
for num in X: 
   if num not in keys:
      keys[num] = 1
      pos.append(1)
   else:
      keys[num] += 1
      pos.append(keys[num])

plt.scatter(X, np.array(pos)-0.5, s=20**2)
plt.yticks(np.arange(0,6))
plt.xlabel('Âge')
plt.ylabel('Effectifs')


Graphique à tige & feuilles

(stem & leaf plot en anglais)
Un graphique à tige & feuilles permet d’afficher la fréquence, groupée par dizaine. Dans l’exemple ci-dessous, il y a deux valeurs dans la catégorie 140: 141 et 146.

python

X = [
    12, 127, 28, 42, 39, 113, 42, 18, 44, 118, 44, 37, 113, 124, 37, 48, 127, 36, 29, 31,
    125, 139, 131, 115, 105, 132, 104, 123, 35, 113, 122, 42, 117, 119, 58, 109, 23, 105,
    63, 27, 44, 105, 99, 41, 128, 121, 116, 125, 32, 61, 37, 127, 29, 113, 121, 58, 114,
    126, 53, 114, 96, 25, 109, 7, 31, 141, 46, 13, 27, 43, 117, 116, 27, 7, 68, 40, 31, 115,
    124, 42, 128, 52, 71, 118, 117, 38, 27, 106, 33, 117, 116, 111, 40, 119, 47, 105, 57,
    122, 109, 124, 115, 43, 120, 43, 27, 27, 18, 28, 48, 125, 107, 114, 34, 133, 45, 120,
    30, 127, 31, 116, 146
]

s = sorted(X)
s = pd.Series(s) \
      .groupby([int(float(i) // 10 * 10) for i in s]) \
      .apply(lambda group: "".join((str(x)[-1] for x in group))) \
      .reset_index()

print("\n".join(
    s['index'].astype('str').str.rjust(3, ' ')
    + ' | '
    + s[0]
))


Graphique en camembert

Ou graphique circulaire. (pie chart en anglais)
Un graphique en camembert utilise la fréquence relative (effectifs en pourcentage du nombre total d’effectif) pour répartir les différentes catégories dans un cercle.

python

X = [5,7,5,9,7,7,6,9,9,9,10,12,12,7]

plt.figure(figsize=(5,10))
values,count = np.unique(X, return_counts=True)
total = np.sum(count)
plt.pie(
    count,
    labels=np.char.add(values.astype('str'), ' ans'),
    autopct=lambda p: '{:.1f}%\n ({:.0f})'.format(p,p*total/100.0)
)


Pictogramme

Ou diagramme à images. (pictograph en anglais)
Un pictogramme représente les effectifs avec des images.


Graphique en courbe

(line plot en anglais)
Permet de visualiser la tendance des données en fonction de l’évolution d’une autre variable (typiquement la date).
Plusieurs lignes peuvent être utilisées pour comparer la tendance de différents groupe.

python

plt.plot(k_list, scores)
plt.xlabel("k")
plt.ylabel("Accuracy")


Histogramme

(histogram en anglais)
Sembable au diagramme à barres mais pour des valeurs continues. Les barres sont accolées puiqu’il n’y a pas de séparation entre les valeurs.
Permet de vérifier la distribution des données.

python

from matplotlib.ticker import FuncFormatter
formatter = FuncFormatter(lambda x,pos: '$%.0fk' % (x * 1e-3))

plt.hist(df.MonthlyIncome, bins=8)
plt.gca().xaxis.set_major_formatter(formatter)
plt.xlabel('Salaire')
plt.ylabel('Effectifs')

On peut modifier le nombre d’intervalles utilisés (bins en anglais), entre lesquelles le nombre de données est compté, pour plus ou moins de précision.

python

from matplotlib.ticker import FuncFormatter
formatter = FuncFormatter(lambda x,pos: '$%.0fk' % (x * 1e-3))

values, bins, patches = plt.hist(df.MonthlyIncome, bins=20)
plt.xticks(bins, rotation=90)
plt.gca().xaxis.set_major_formatter(formatter)
plt.xlabel('Salaire')
plt.ylabel('Effectifs')


Estimation par noyau

(kernel density estimate en anglais, souvent abbregé KDE)
Version lissée de l’histogramme.

python

import seaborn as sns

X = df.MonthlyIncome

#Histogram
plt.hist(X, bins=20, density=True, alpha=0.3)

#Density plot
sns.kdeplot(data=X, linewidth=2)

plt.ylabel('Frequence %')
plt.xlabel('Salaire')


Boîte à moustaches

Ou diagramme en boîte. (boxplot ou box and whiskers plot en anglais)
Une boîte à moustache met en évidence la distribution des données:

python

X = [0,7,9,10,11,13,20]

plt.figure(figsize=(6,2))
plt.boxplot(X, vert=False, widths=0.5)
plt.xticks(np.arange(0,21))
plt.grid(alpha=0.3)
plt.title(X)


Nuage de points

(scatterplot en anglais)
Permet de mettre en évidence une relation entre deux variables continues.

python

url = "https://raw.githubusercontent.com/ingledarshan/DL_dataset/master/moore.csv"
df  = pd.read_csv(url, header=None)

plt.scatter(df[0], df[1])
plt.xlabel('Année')
plt.ylabel('# transistors')


Graphique hexagonal

(hexagonal bin plot en anglais)
Solution alternative au nuage de points si les données sont trop denses pour tracer chaque point individuellement.

python

df = sns.load_dataset('iris')

plt.hexbin(df['sepal_length'], df['sepal_width'],
           gridsize=(30,15),
           cmap='Blues')

plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

On peut obtenir un résultat similaire avec un nuage de point avec canal alpha:

python

plt.scatter(df['sepal_length'],df['sepal_width'],alpha=0.3)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')


Diagramme de Venn

Un diagramme de Venn utilise des cercles pour représenter différents ensembles. Ces cercles se croisent lorsqu’il existe des intersections entre les ensembles.


Carte de fréquentation

(heatmap en anglais)
Une carte de fréquentation consiste à donner un code-couleur aux nombres suivant leur position dans l’intervalle (ex: bleu pour les valeurs inférieures à la médiane, rouge pour les valeurs supérieures).
Permet de vérifier si les données suivent un motif.

python

df = sns.load_dataset('flights')
data = df.pivot_table(index='month', columns='year', values='passengers')

plt.figure(figsize=(8,6))
sns.heatmap(data, annot=True, fmt='')


from sklearn.metrics import accuracy_score, confusion_matrix

cm = confusion_matrix(y_test, y_pred)
labels = LABELS[y_var] if y_var in LABELS else sorted(y_test.unique())

ax = plt.subplot()
sns.heatmap(cm, annot=True, fmt='d', cmap=plt.cm.Blues, ax=ax)
ax.set_xlabel('Predicted labels')
ax.set_ylabel('True labels')
ax.set_title("{0:s}\nAccuracy: {1:.3f}".format(y_var, score))
ax.xaxis.set_ticklabels(labels)
ax.yaxis.set_ticklabels(labels)
plt.show()


Pour aller plus loin: