J'ai récemment tenté une petite expérience sur Facebook en postant ceci :
Hello ! J'ai besoin de votre sens moral pour une expérience (fictive).
Imaginons que nous (impersonnel) chassions des animaux pour les empailler (de toutes sortes : insectes, mammifères, éponges, etc). Ensuite ces animaux pourraient servir à différentes choses
Pouvez vous juger de (absolument immoral) 1 à 5 (très moral) les 6 cas suivants :
- A. Créer une collection pour des étudiants qui apprendront un peu de biologie animale (et ça ne sera pas spécialement très utile pour leurs examens)
- B. Créer une collection pour des étudiants qui apprendront un peu de biologie animale (et ça sera essentiel à la réussite de leurs examens)
- C. Créer une collection pour des étudiants qui apprendront un peu de biologie animale (et ça sera essentiel pour la réussite de leur futur travail : admettons ce seront des vétérinaires d'animaux sauvages)
- D. Rendre une personne plus heureuse que jamais car c'est son rêve le plus sincère. Il sera satisfait jusqu'à la fin de ses jours.
- E. Rendre plus joli le salon d'une personne qui aime les animaux empaillés mais ne veut pas les empailler ni les chasser.
- F. Permettre à la personne qui tue les animaux et ensuite les empaille de s'adonner à ses deux passions : la chasse et la taxidermie. Il en tire une grande satisfaction et un bonheur personnel sincère.
Si assez de gens répondent je fais un graphique et j'aime les graphiques !
Chose promise... Des graphiques!
Pour obtenir ces graphes j'utilise du code python
. Rien de foufou mais si jamais ça vous intéresse les bonnes ressources sont importées là dessous (en cliquant sur montrer le code)...
Je tiens à dire que si vous voulez à changer vos réponses après avoir lu ce petit blog dites le moi, ça m'intéresse beaucoup (en MP ou dans les commentaires Facebook directement) !
import plotly as py
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
from matplotlib import cm
from sklearn.decomposition import PCA as sklearnPCA
from sklearn.preprocessing import StandardScaler
import pandas as pd
plt.style.use("seaborn")
Là dessous ce sont les résultats brut de notre mini-expérience ! Vous êtes 18 (+ moi) à avoir répondu à toutes les questions !
Personnes | P0 | P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 | P10 | P11 | P12 | P13 | P14 | P15 | P16 | P17 | P18 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Question A | 3 | 3 | 2 | 1 | 3 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 3 |
Question B | 4 | 4 | 3.5 | 2 | 3 | 1 | 1 | 1 | 1 | 3 | 1 | 4 | 1 | 2 | 1 | 2 | 1 | 2 | 4 |
Question C | 5 | 4 | 4 | 3 | 5 | 1 | 1 | 1 | 1 | 5 | 3 | 5 | 3 | 3 | 3 | 4 | 3 | 3 | 4 |
Question D | 1 | 1 | 2 | 1 | 4 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 3 | 1 | 1 | 4 |
Question E | 1 | 1 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 1 | 1 | 2 | 1 | 1 | 3 |
Question F | 1 | 1 | 1.5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 2 |
J'ai encodé ce tableau dans python. J'utilise le code caché ci-dessous pour encoder le tableau et préparer les données à faire ce qu'on appelle une Analyse en Composante Principale (aka une ACP).
data = {"Nom":["P01", "P02", "P03", "P04", "P05", "P06", "P07", "P08", "P09", "P10",
"P11", "P12", "P13", "P14", "P15", "P16", "P17", "P18", "P19"],
"Genre":["F", "M", "M", "F", "F", "M", "F", "F", "M", "M", "F", "M", "F", "M","M", "M", "M", "M", "M"],
"A":[3, 3, 2, 1, 3, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3],
"B":[4, 4, 3.5, 2, 3, 1, 1, 1, 1, 3, 1, 4, 1, 2, 1, 2, 1, 2, 4],
"C":[5, 4, 4, 3, 5, 1, 1, 1, 1, 5, 3, 5, 3, 3, 3, 4, 3, 3, 4],
"D":[1, 1, 2, 1, 4, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 3, 1, 1, 4],
"E":[1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 3],
"F":[1, 1, 1.5, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2]
}
df = pd.DataFrame(data)
for i in ["A", "B", "C", "D", "E", "F"] :
df[i] = df[i].astype(float)
X = df.iloc[:,2:].values
y = df.iloc[:,1].values
variables = list(df.columns[2:])
X_fit = StandardScaler().fit(X)
X_std = X_fit.transform(X)
sklearn_pca = sklearnPCA(n_components=2)
Y_sklearn = sklearn_pca.fit_transform(X_std)
values = [round(x*100, 1) for x in sklearn_pca.explained_variance_ratio_]
y2 = df.iloc[:,0].values
L'idée de l'ACP est simple : imaginons que nous avions seulement 2 questions A et B. Je pourrais représenter les réponses de chaque personne sur un graphique avec deux axes X et Y qui représenteraient en un seul point la réponse de chaque personne.
Un petit exemple ci dessous : imaginons que 4 personnes répondent aux 2 questions A et B. Voici leurs réponses brutes (avec une couleur préférée parce que c'est plus sympa):
- Matthieu : A = 4 et B = 2 brun
- Marc : A = 4 et B = 3 vert flashy
- Luc : A = 5 et B = 4 gris pierre
- Jean : A = 1 et B = 1 violet foncé
Personne | Matthieu | Marc | Luc | Jean |
---|---|---|---|---|
Question A | 4 | 4 | 5 | 1 |
Question B | 3 | 3 | 4 | 1 |
Je ne sais pas pour vous mais, personnellement, je ne vois pas directement (et il n'y a que 4 personnes) ce que chacun pense par rapport aux autres : c'est quoi la distance entre eux, est ce qu'il y a un groupe majoritaire et un groupe minoritaire ?
C'est plus facile avec un graphique :
fig, ax = plt.subplots(figsize=(6,6))
ax.scatter(x=[4,5,4,1], y=[2,4,3,1], marker="o", lw=1.2, s=100, edgecolor="k", color=["#9e4621","#afafaf","#0df704","#a91eea"])
ax.set_ylabel("Question A", fontsize=16)
ax.set_xlabel("Question B", fontsize=16)
ax.set_ylim(0.9,5.1); ax.set_xlim(0.9,5.1)
ax.set_xticks([1,2,3,4,5])
ax.set_yticks([1,2,3,4,5])
plt.show()
Alors là tout de suite on voit que Jean (violet foncé) n'a pas du tout le même avis que ses petits camarades... Ok c'est simple, je sais bien qu'on aurait pu le deviner juste en voyant les nombres des 4 compères mais imaginons qu'ils sont 19! C'est déjà pas mal plus difficile de dire juste en voyant le tableau qui pense à quoi! Et en plus ils ont répondu chacun à 6 questions. Et moi je n'ai que 2 axes sur mon graphique : X et Y... Du coup, je ne peux pas attribuer un axe par question... |
Bref...
C'est à ça que sert l'ACP : réduire mes 6 questions en seulement 2 axes X et Y qui résumeront chacun la variabilité de toutes les questions en cherchant les relations entre vos réponses. Cela me permettra de voir s'il y a des groupes, des personnes aux jugements très différents, s'il y a des relations entre les réponses, s'il y a des groupes de pensées, etc.
Bon, je vais pas vous faire un cours sur l'ACP, c'est moyennement intéressant (et je suis pas qualifié :o ) donc let's go sur les résultats directement!
Avant de faire l'ACP je vais quand même faire une moyenne de vos réponses sur chaque questions :
colors = [cm.viridis(x) for x in np.linspace(0.0, 1.0, 6)]; col = ['#{:02x}{:02x}{:02x}'.format(int(x[0]*255), int(x[1]*255), int(x[2]*255)) for x in colors]
fig = go.Figure(data=[go.Bar(x=["A", "B", "C", "D", "E", "F"], y=df[["A", "B", "C", "D", "E", "F"]].apply(np.mean), marker_color=col, marker=dict(line=dict(color = 'black', width = 1)))])
fig.update_yaxes(title = "Note sur 5", tickvals=[1,2,3,4,5], ticktext=["Absolument immoral: 1", "2", "Neutre: 3", "4", "Très moral: 5"])
fig.update_xaxes(title = "Questions")
fig.update_layout(width=800, height=500, yaxis=dict(range=[1,5]), title_text='Moyenne des réponses')
strings = py.offline.plot(fig, include_plotlyjs="directory", output_type='div')
fig.show()
On peut remarquer plusieurs choses. D'après vos réponses :
- Il est absolument immoral d'avoir des comportements égoïstes : en témoignent les réponses aux questions D, E et F
- Et son inverse: il est moins immoral (plus moral) que le comportement aie une motivation non-égoïste. Qu'il ait des conséquences positives pour la communauté et pas seulement l'individu (#LesEtudiants)
- Autre chose qui saute moins aux yeux: d'après vous, c'est presque un peu moral de le faire si en plus ça a une utilité concrète sur la réussite et sur le travail des gens (Question C).
Maintenant on fait l'ACP :
data = []
for name, col in zip(('M', 'F'), ["orange", "green"]):
trace = dict(type='scatter', x=Y_sklearn[y==name,0], y=Y_sklearn[y==name,1], mode='markers', name=name, marker=dict(color=col, size=12, line=dict(color='black', width=1.0), opacity=0.5))
data.append(trace)
layout = dict(xaxis=dict(title='Composante 1 {}% de variance'.format(values[0]), showline=False), yaxis=dict(title='Composante 2 {}% de variance'.format(values[1]), showline=False))
fig = go.Figure(data=data, layout=layout)
fig.add_shape(type="line", x0=0, y0=-4, x1=0, y1=4, line=dict(color="black", width=1))
fig.add_shape(type="line", x0=-4, y0=0, x1=4, y1=0, line=dict(color="black", width=1))
fig.add_shape(dict(type="circle", xref="x", yref="y", x0=0.8, y0=0.3, x1=2.4, y1=2.7, line_color="#1b9e77"))
fig.add_shape(dict(type="circle", xref="x", yref="y", x0=-2.5, y0=-1.3, x1=0.2, y1=1.8, line_color="#d95f02"))
fig.add_shape(dict(type="circle", xref="x", yref="y", x0=1.0, y0=-1.1, x1=3.2, y1=-0.1, line_color="#7570b3"))
fig.update_layout(width=750, height=700, xaxis=dict(range=[-4,4]), yaxis=dict(range=[-4,4]), title_text='Analyse en Composantes Principales')
fig.show()
Ci-dessous vous pouvez voir un graphe avec deux axes qui résument votre positionnement moral dans le cadre de cette expérience (je vais les appeler les axes de la moralité parce que c'est très stylé comme nom pour des axes et que c'est vraiment plus court). On verra comment interpréter les axes un peu plus loin. Pour l'instant, on peut remarquer avec nos axes ceci :
- Il n'y a pas de groupes Homme/Femme : bravo à tous, vos réponses ne sont pas (ou pas assez pour être détecté) expliquées par votre genre (je me demande ce que ça aurait donné sur un questionnement moral sur des questions de genre maintenant).
- Plus la couleur est intense, plus il y a de gens qui se situent au même endroit sur les axes de la moralité. On peut voir que beaucoup de gens sont quasiment à 0 sur l'axe Y (Composante 2).
On ne comprend rien à l'ACP si on ne sait pas ce que chaque axe signifie!
Pas de problème, on va appeler le cercle des corrélations pour déterminer ce que chaque axe signifie.
Tout d'abord, on voit qu'il y a 3 groupes :
- Ceux qui sont à 0 sur la composante 2 (axe Y) (cercle orange)
- Ceux qui sont en négatif sur la composante 2 (axe Y) et en positif sur la composante 1 (axe X) dans le quadrant en bas à droite (cercle mauve)
- Ceux qui sont en positif sur sur la composante 2 (axe Y) et en négatif sur la composante 1 (axe X) dans le quadrant en haut à droite (cercle vert)
À quoi ces 3 groupes correspondent ?
Ci dessous le cercle des corrélations vous réponds
ebouli = pd.Series(sklearn_pca.explained_variance_ratio_)
coef = np.transpose(sklearn_pca.components_)
cols = ['PC-'+str(x) for x in range(len(ebouli))]
pc_infos = pd.DataFrame(coef, columns=cols, index=variables)
fig, ax = plt.subplots(figsize=(10,10))
an = np.linspace(0, 2 * np.pi, 100)
ax.plot(np.cos(an), np.sin(an), color="k") # Add a unit circle for scale
for idx in range(len(pc_infos["PC-0"])):
x = pc_infos["PC-0"][idx]
y = pc_infos["PC-1"][idx]
ax.plot([0.0,x],[0.0,y],lw=0.8,color="k")
ax.plot(x, y)
ax.annotate(pc_infos.index[idx], xy=(x,y), fontsize=14)
ax.set_xlabel("Composante 1 ({}%)".format(round(ebouli[0]*100,2)), fontsize=14)
ax.set_ylabel("Composante 2 ({}%)".format(round(ebouli[1]*100,2)), fontsize=14)
ax.set_xlim((-1.01,1.01))
ax.set_ylim((-1.01,1.01))
ax.axhline(y=0, lw=1.0, color="k")
ax.axvline(x=0, lw=1.0, color="k")
ax.set_title("Cercle des corrélations", fontsize=16)
plt.show()
C'est gentil mais comment on le lit ?
Les vecteurs au centre du cercle indiquent, par leur orientation et leur longueur dans le cercle, à quel point ils contribuent à chaque axe. Si le vecteur est le long de l'axe et à 90° avec l'autre axe, il contribue à 100% à un axe et à 0% à l'autre axe. Au contraire s'il est pile à 45° de chaque axe, il contribue à 50% à chaque axe. Sa longueur indique son poids dans le système d'axe final.
Ici on peut voir que tous les vecteurs A, B, ..., F contribuent tous dans le même sens à l'axe X. Par contre A, B et C sont opposés à D, E et F sur l'axe Y.
Donc, si vous avez bien suivi, la phrase va être logique. L'axe X (Composante 1) explique seul 60% de la variabilité de notre petit jeu de données. Comme vous le voyez, tous les vecteurs vont dans le même sens. Cela signifie que les valeurs sont corrélées positivement entres elles : si vous avez mis un score faible à la question A vous avez aussi pas mal de chance d'avoir mis un score faible à toutes les autres questions et inversement (un score élevé à la question A indique aussi un score plus élevé pour toutes les autres questions). En termes de graphique, cela signifie que votre point sera probablement placé plus à droite sur le graphe si vous avez mis des valeurs élevées et plutôt à gauche si vous avez mis des valeurs faibles. Et en termes de moralité : plus vous avez tendance à trouver un comportement moral, plus vous attribuez facilement de la valeur morale aux autres comportements (ici aux autres propositions).
Et l'axe Y, la composante 2, elle résume quoi ? Et bien elle est intéressante aussi parce qu'elle semble séparer les vecteurs des questions ABC et les questions DEF. Cela signifie que les questions ABC sont corrélées positivement entres elles et négativement avec les questions DEF. Si vous avez mis un score élevé à ABC, vous avez probablement mis un score faible à DEF et inversement. En terme de morale, c'est l'axe Y qui exprime comment votre sens moral réagit face à la question d'un bonheur égoïste, qui ne concerne qu'un seul individu : est-il immoral de commettre un acte potentiellement chargé de souffrance animale pour des raisons égoïstes ? Si vous pensez que c'est très immoral, vous avez des chances d'être placé plutôt en haut du graphe (dans le sens opposé aux vecteurs DEF). Au contraire, si vous pensez que c'est plutôt moral alors vous serez placé plutôt en bas du graphe (dans le sens des vecteurs DEF).
Bon fini les maths ! Conclusions :
Disclaimer : je ne suis pas expert et c'est mon interprétation qui est informée par mes diverses lectures mais en rien ça n'est un résultat "scientifique", rien que la manière de poser les questions est biaisée. Si vous avez des connaissances en psycho, en neuro, en philo morale ou en éthique et que vous voulez critiquer ouvertement ce post faites-le et je publierai ces critiques en dessous de l'article.
Bref, je remarque quelques trucs intéressants : prêt pour une analyse de votre intuition morale ?
Il y a deux grands groupes de réflexion qu'on peut diviser sur notre graphe en la droite et la gauche (mais que je ne vais pas évoquer sous ces termes ici pour des raisons évidentes d'hygiène !). Le premier groupe, de loin le plus nombreux (sujet oblige) est le groupe qui a répondu : 1 partout sans hésiter ! Ces personnes (oui vous, oui toi ;) ) ont un raisonnement qu'on appelle déontologique. Qu'on pourrait facilement résumer comme ceci :
Tuer des animaux c'est mal point-barre.
Qu'elle que soit la raison, même si elle produit de l'utilité et du bonheur humain (autant collectif qu'individuel). C'est un positionnement philosophique qu'on rapproche des personnalités comme Emmanuel Kant (allez jeter un oeil avide sur la série The Good Place pour comprendre beaucoup de choses sur un personnage kantien mais aussi pour beaucoup rigoler !). Parmi vous, les Kantiens sont situés dans le cercle orange.
Si vous avez atteint un des deux autres cercles (vert ou mauve) alors vous avez un raisonnement plutôt conséquentialiste. Vous estimez probablement la moralité de chaque proposition en fonction des conséquences que vous êtes en mesure d'attendre de chaque proposition. Un raisonnement qui sera peut être quelque chose comme ceci : un cours qui aidera des étudiants à sauver plein d'animaux plus tard va faire quelques animaux malheureux pour permettre d'en sauver beaucoup plus par la suite.
La différence entre les deux cercles (mauve et vert) est que dans un cas vous attribuez une valeur morale au bonheur d'une personne et dans l'autre pas du tout. Cette posture a l'air raisonnable mais elle entraîne beaucoup de variabilité dans les résultats attendus et si vous avez eu un raisonnement conséquentialiste vous avez probablement suivi plusieurs conclusions qui ont menées à des résultats différents. Un exemple de réflexion pourrait être ceci : cette personne sera plus heureuse et vivra sa meilleure vie, elle va probablement générer un maximum de bonheur autour d'elle et permettre à plusieurs personnes de vivre mieux. Ou ceci : ces étudiants doivent apprendre sur des schémas et des images qui ne représentent rien de concret donc il faut qu'ils puissent apprendre à partir d'autre chose. Il y a autant de raisonnements possibles que de personnes ayant raisonnés ces propositions. Un dernier pour la route, vous avez peut être suivi une route de conséquences qui vous a mené à une conclusion déontologique, de ce genre là : "on peut tuer des animaux dans certaines situations sauf si la raison est égoïste, dans ce cas on ne peut jamais tuer des animaux.
Il y a peu de gens qui ont eu une préférence pour les propositions égoïstes par rapport à la masse des propositions collectives (et ce sont tous des mecs... Bravo! Et j'en fais peut être partie !? :o vous ne saurez pas sauf si vous gérez les stats ;).
Ces 3 personnes peuvent donner une plus grande valeur morale à la meilleure vie d'un humain qu'à celle d'un animal (sans parfois s'en rendre compte). Pour départager ces cas, il faudrait étendre le questionnaire.
Ici dessous, je vais ajouter 3 propositions. Si vous avez suivi un raisonnement conséquentialiste, vous vous rendrez compte que la partie "en fonction des conséquences que vous êtes en mesure d'attendre de chaque proposition" est extrêmement importante pour juger. Je suppose que votre jugement changera a posteriori (si c'est le cas dites-moi !)
- Rendre une personne plus heureuse que jamais car c'est son rêve le plus sincère. Il sera satisfait jusqu'à la fin de ces jours. Mais il continuera à chasser pour agrandir sa collection.
- Rendre une personne plus heureuse que jamais car c'est son rêve le plus sincère. Il sera satisfait jusqu'à la fin de ces jours. Il reversera tout son argent inutile à des sociétés protectrices des animaux. On ne connaît pas sa fortune.
- Rendre une personne plus heureuse que jamais car c'est son rêve le plus sincère. Il sera satisfait jusqu'à la fin de ces jours. Il arrêtera de manger de la viande et tout produit provenant de l'exploitation animale.
Votre jugement moral a probablement fais des 360° à la lecture de ses propositions. L'information est pertinente et importante pour faire un jugement moral. Si vous attribuez le même score qu'auparavant alors je pense que la seule alternative possible est que vous avez effectivement une préférence explicite pour le bonheur humain au dessus du bien-être animal.
En conclusion et pour mot de la fin : faites attention aux conséquences que vous pouvez anticiper mais souvenez vous qu'il y en a que vous ne connaissez pas !
Proposition A :
Proposition B :
Proposition C :
Proposition D :
Proposition E :
Proposition F :
Comments powered by CComment