Un truc de mentaliste expliqué à l’aide de Python

Un truc de mentaliste expliqué à l’aide de Python

Voici une vidéo qui circule sur les réseaux sociaux:

Un mentaliste faisant son tour

Me concernant, cela a fonctionné et d’après les témoignages, c’est le cas de beaucoup de personnes… Étonnant ? Nous allons voir cela…

Première étape : le prénom féminin

Sir la page https://www.data.gouv.fr/fr/datasets/liste-de-prenoms/, nous pouvons télécharger le fichier CSV des prénoms. Il y a beaucoup de nationalités et nous allons trier cela. Nous allons sélectionner ceux qui sont de nationalité “french” et féminins.

first_line = True
filles = dict()

with open("Prenoms.csv" , "r") as fic:
    for line in fic:
        if first_line == True:
            first_line = False
        else:
            L = line.split(';')
            if L[1] == 'f' and 'french' in L[2]:
                filles[ L[0] ] = float(L[3].replace('\n',''))
                
d = sorted(filles.items() , key = lambda c: c[1] , , reverse = True)              
for i in d:
    print('{} : {}' . format(i[0],i[1]))

On arrive à la liste suivante:

marie : 122.52
blanche : 103.25
rose : 67.06
victoire : 63.4
claire : 49.67
anne : 45.59
louise : 45.05
marine : 40.49
reine : 36.8
virginie : 35.71
vienne : 30.61
solange : 28.96
avril : 28.83
jolie : 28.77
marguerite : 28.29
suzanne : 27.14
paule : 25.87
adèle : 25.33
catherine : 24.66
thérèse : 23.26
nadine : 21.19
françoise : 20.13
hélène : 20.13
agathe : 20.01
lucie : 18.8
gabrielle : 17.87
sylvie : 17.33
julie : 16.53
madeleine : 16.28
juliette : 16.25
charlotte : 16.22
lucile : 15.96
adélaïde : 15.48
inès : 15.36
geneviève : 15.23
jeanne : 15.13
aimée : 14.85
josette : 14.72
marthe : 14.4
romaine : 12.97
céleste : 12.49
yvonne : 12.3
nicole : 12.17
véronique : 11.82
aurore : 11.02
nathalie : 10.42
alice : 10.07
antoinette : 9.37
sarah : 9.02
diane : 8.82
sophie : 8.47
violette : 8.25
rosette : 8.09
clarisse : 7.93
béatrice : 7.9
isabelle : 7.68
lucienne : 7.07
constance : 6.85
michèle : 6.82
christine : 6.75
berthe : 6.69
lucille : 6.63
aude : 6.31
rachel : 6.31
laure : 6.02
carole : 5.93
monique : 5.93
frédérique : 5.8
alexandrie : 5.54
cécile : 5.51
gilberte : 5.48
francine : 5.42
brigitte : 5.38
germaine : 5.32
aurélie : 4.91
jeannette : 4.91
élodie : 4.84
sabine : 4.84
chantal : 4.71
mathilde : 4.71
mignon : 4.71
chanté : 4.68
joséphine : 4.59
odette : 4.59
giselle : 4.43
caroline : 4.36
marceline : 4.36
renée : 4.33
claudine : 4.17
eugénie : 4.11
albertine : 4.08
mariette : 4.08
agnès : 3.95
pauline : 3.95
colette : 3.79
ambre : 3.76
esther : 3.73
fifi : 3.66
odile : 3.6
micheline : 3.5
barbara : 3.41
mélanie : 3.38
placide : 3.38
gisèle : 3.09
céline : 3.03
mireille : 3.03
julienne : 2.96
jacqueline : 2.9
delphine : 2.84
rochelle : 2.8
désirée : 2.77
clémence : 2.68
judith : 2.68
manon : 2.68
martine : 2.68
valérie : 2.61
ariane : 2.45
cerise : 2.45
flavie : 2.45
hortense : 2.39
denise : 2.36
élise : 2.36
paulette : 2.29
hermine : 2.23
yvette : 2.2
fabienne : 2.07
adrienne : 2.01
héloïse : 2.01
luce : 1.88
sylviane : 1.88
georgette : 1.75
jeanine : 1.72
danièle : 1.62
irène : 1.62
amélie : 1.59
édith : 1.59
olympe : 1.56
bénédicte : 1.53
roxane : 1.53
stéphanie : 1.53
henriette : 1.5
vivienne : 1.47
annette : 1.37
salomé : 1.37
fernande : 1.31
isabel : 1.31
marcelle : 1.31
adeline : 1.27
emma : 1.21
zoé : 1.18
bernadette : 1.15
raymonde : 1.15
léonie : 1.02
liane : 1.02
corinne : 0.99
pénélope : 0.99
christiane : 0.96
esmée : 0.96
margot : 0.92
myriam : 0.92
rolande : 0.89
danielle : 0.86
hyacinthe : 0.86
rosalie : 0.86
lisette : 0.83
andrée : 0.8
angèle : 0.8
arlette : 0.8
michelle : 0.8
amarante : 0.76
justine : 0.76
natalie : 0.76
muriel : 0.73
émilie : 0.7
léontine : 0.7
sibylle : 0.7
arnaude : 0.67
aline : 0.61
rosine : 0.61
dorothée : 0.57
perrine : 0.57
elisabeth : 0.54
ninon : 0.51
éliane : 0.48
océane : 0.48
yolande : 0.48
yseult : 0.48
pascale : 0.41
sandrine : 0.41
célestine : 0.38
honorine : 0.38
irénée : 0.38
lydie : 0.38
mirabelle : 0.38
sidonie : 0.38
félicie : 0.35
régine : 0.35
jacinthe : 0.29
morgane : 0.29
suzette : 0.29
toinette : 0.25
anastasie : 0.22
apolline : 0.22
chloé : 0.22
eve : 0.22
josiane : 0.22
nicolette : 0.22
edwige : 0.19
eulalie : 0.19
ghislaine : 0.19
pascaline : 0.19
carine : 0.16
josèphe : 0.16
ninette : 0.16
rébecca : 0.16
benjamine : 0.13
jeannine : 0.13
marielle : 0.13
noémie : 0.13
oriane : 0.13
rosemonde : 0.13
alphonsine : 0.1
cosette : 0.1
fabiola : 0.1
gigi : 0.1
hannah : 0.1
léa : 0.1
philippine : 0.1
emmanuelle : 0.06
laurette : 0.06
victorine : 0.06
anaïs : 0.03
angeline : 0.03
angelique : 0.03
claudette : 0.03
donatienne : 0.03
doriane : 0.03
eléonore : 0.03
faustine : 0.03
josée : 0.03
marcelline : 0.03
marise : 0.03
ouida : 0.03
sébastienne : 0.03
arianne : 0.0
arienne : 0.0
armelle : 0.0
axelle : 0.0
benoite : 0.0
bernardine : 0.0
charline : 0.0
christelle : 0.0
christianne : 0.0
clarice : 0.0
clementine : 0.0
clothilde : 0.0
cunégonde : 0.0
dianne : 0.0
dieudonnée : 0.0
éloise : 0.0
emeline : 0.0
evette : 0.0
felicienne : 0.0
florette : 0.0
florianne : 0.0
gaetane : 0.0
georgine : 0.0
gervaise (2) : 0.0
gisselle : 0.0
gwenaelle : 0.0
joceline : 0.0
joelle : 0.0
juliane : 0.0
laurence (2) : 0.0
laurentine : 0.0
léonne : 0.0
lucinde : 0.0
lucrece : 0.0
lunete : 0.0
madeline : 0.0
marcellette : 0.0
marianne (1) : 0.0
maximilienne : 0.0
mélissa : 0.0
morgaine : 0.0
nadia (1) : 0.0
nina (1) : 0.0
noella : 0.0
noelle : 0.0
olivie : 0.0
orianne : 0.0
roselle : 0.0
roxanne : 0.0
seraphine : 0.0
sévérine : 0.0
simone (1) : 0.0
sybille : 0.0
sylvaine : 0.0
sylvianne : 0.0
tatienne : 0.0
valentine (2) : 0.0
zephyrine : 0.0

Il y a beaucoup de prénoms qui finissent pas “e”:

first_line = True
filles = dict()

with open("Prenoms.csv" , "r") as fic:
    for line in fic:
        if first_line == True:
            first_line = False
            nb , nb_e = 0 , 0
        else:
            L = line.split(';')
           if L[1] == 'f' and 'french' in L[2]:
                if '(' in L[0]:
                    L[0] = L[0].replace(' (1)','').replace(' (2)','')
                filles[ L[0] ] = float(L[3].replace('\n',''))
                nb += 1
                if L[0][-1] == 'e':
                    nb_e += 1

print(nb_e/nb)
0.8807947019867549

88% pour être exact. Mais pour être complet, regardons toutes les lettres finales des prénoms:

first_line = True
lettres_finales = dict()

with open("Prenoms.csv" , "r") as fic:
    for line in fic:
        if first_line == True:
            first_line = False
        else:
            L = line.split(';')
            if L[1] == 'f' and 'french' in L[2]:
                if '(' in L[0]:
                    L[0] = L[0].replace(' (1)','').replace(' (2)','')
                if L[0][-1] in lettres_finales:
                    lettres_finales[ L[0][-1] ] += 1
                else:
                    lettres_finales[ L[0][-1] ] = 1
T = sorted(lettres_finales.items() , key = lambda c: c[1] , reverse = True)                     
for i in T:
    print('{} : {}' . format(i[0],i[1]))
e : 266
a : 10
l : 5
h : 5
é : 4
s : 3
n : 3
i : 2
t : 2
r : 1
m : 1

Deuxième étape : le pays

Vous l’avez sans doute deviné, il ne reste pas beaucoup de choix pour le pays car seuls 11 initiales sont possibles.

J’ai téléchargé la liste des pays du monde sur la page https://sql.sh/514-liste-pays-csv-xml. Ce fichier est composé de plusieurs lignes à 6 champs : seul le 5ème nous intéresse (le nom français des pays). Je vais donc construire une liste des pays dont l’initiale se trouve parmis celles retenues précédemment:

pays = list()
initiales = [ 'e' , 'a' , 'l' , 'h' , 'é' , 's' , 'n' , 'i' , 't' , 'r' , 'm' ]

with open ('sql-pays.csv' , 'r' , encoding = 'utf8') as fic:
    for ligne in fic:
        L = ligne.split(',')
        if L[4][1].lower() in initiales:
            pays += [ L[4].replace('"','') ]
            
for i in pays:
    print(i)
Afghanistan
Albanie
Antarctique
Algérie
Samoa Américaines
Andorre
Angola
Antigua-et-Barbuda
Azerbaïdjan
Argentine
Australie
Autriche
Arménie
Territoire Britannique de l'Océan Indien
Myanmar
République Centrafricaine
Sri Lanka
Tchad
Taïwan
Mayotte
République du Congo
République Démocratique du Congo
République Tchèque
République Dominicaine
Équateur
El Salvador
Éthiopie
Érythrée
Estonie
Terres Australes Françaises
Territoire Palestinien Occupé
Allemagne
Haïti
Saint-Siège (état de la Cité du Vatican)
Honduras
Hong-Kong
Hongrie
Islande
Inde
Indonésie
République Islamique d'Iran
Iraq
Irlande
Israël
Italie
République Populaire Démocratique de Corée
République de Corée
République Démocratique Populaire Lao
Liban
Lesotho
Lettonie
Libéria
Liechtenstein
Lituanie
Luxembourg
Macao
Madagascar
Malawi
Malaisie
Maldives
Mali
Malte
Martinique
Mauritanie
Maurice
Mexique
Monaco
Mongolie
République de Moldova
Montserrat
Maroc
Mozambique
Namibie
Nauru
Népal
Antilles Néerlandaises
Aruba
Nouvelle-Calédonie
Nouvelle-Zélande
Nicaragua
Niger
Nigéria
Niué
Norvège
États Fédérés de Micronésie
Timor-Leste
Réunion
Roumanie
Rwanda
Sainte-Hélène
Saint-Kitts-et-Nevis
Anguilla
Sainte-Lucie
Saint-Pierre-et-Miquelon
Saint-Vincent-et-les Grenadines
Saint-Marin
Sao Tomé-et-Principe
Arabie Saoudite
Sénégal
Seychelles
Sierra Leone
Singapour
Slovaquie
Slovénie
Somalie
Afrique du Sud
Espagne
Sahara Occidental
Soudan
Suriname
Svalbard etÎle Jan Mayen
Swaziland
Suède
Suisse
République Arabe Syrienne
Tadjikistan
Thaïlande
Togo
Tokelau
Tonga
Trinité-et-Tobago
Émirats Arabes Unis
Tunisie
Turquie
Turkménistan
Tuvalu
L'ex-République Yougoslave de Macédoine
Égypte
Royaume-Uni
République-Unie de Tanzanie
États-Unis
Samoa
Serbie-et-Monténégro

Là encore, regardons les dernières lettres possibles:

pays = list()
initiales = [ 'e' , 'a' , 'l' , 'h' , 'é' , 's' , 'n' , 'i' , 't' , 'r' , 'm' ]

with open ('sql-pays.csv' , 'r' , encoding = 'utf8') as fic:
    for ligne in fic:
        L = ligne.split(',')
        if L[4][1].lower() in initiales:
            pays += [ L[4].replace('"','') ]

lettres_finales = dict()

nbtotal , nb_e = 0 , 0
for i in pays:
    nbtotal += 1
    if i[-1] == ')':
        lettres_finales[ 'e' ] += 1
        nb_e += 1
    else:
        if i[-1] in lettres_finales:
            lettres_finales[ i[-1] ] += 1
        else:
            lettres_finales[ i[-1] ] = 1
        if i[-1] == 'e':
            nb_e +=1
        
T = sorted(lettres_finales.items() , key = lambda c: c[1] , reverse = True)                     
for i in T:
    print('{} : {}' . format(i[0],i[1]))
    
print('{} % de "e"'.format( round(nb_e*100/nbtotal,2) ))
e : 61
n : 14
a : 12
s : 10
o : 9
r : 6
i : 4
l : 4
d : 3
u : 3
é : 2
g : 2
q : 1
t : 1
c : 1
45.86 % de "e"

Là encore, il y a une majorité de “e”.

À ce stade, la probabilité d’arriver à un “e” ou un “é” est assez importante (j’avoue que j’ai eu la flemme de la calculer mais c’est un simple arbre de probabilités conditionnelles au final! C’est juste qu’il comporte au maximum 1463 branches et, comme disait Pierre Fermat : “je n’ai pas la place”).

Sur ces statistiques, on peut être presque assurés que le “e” est obtenu à cette étape, tout en ayant en tête que le “n”, le “a” et le “s” le talonnent.

Troisième étape : l’animal

Je n’ai pas pu obtenir de liste d’animaux exhaustive. Alors, je me suis appuyé sur mes connaissances personnelles (très limitées).

EUn animal dont le nom commence par un “e”… à part l’éléphant, il n’y a rien qui me vient à l’esprit immédiatement. Si j’étais un sibérien, j’aurais peut-être pensé à l’élan… (en Amérique du Nord, on appelle cela un orignal donc je n’en parle pas). J’aurais pu penser à un escargot ou un écureuil… mais je ne sais pour quelles raisons obscures, les gens n’y pensent pas immédiatement. Bon, pour l’escargot, je peux comprendre car on peut ne pas le percevoir comme un animal mais comme un délicieux met, mais l’écureuil… Quoi que ! Il est vrai qu’en France, les écureuils sont discrets (contrairement aux éléphants!). À vrai dire, après quelques recherches, il y en a peu:

  • éléphant
  • élan
  • esturgeon
  • écureuil
  • écrevisse
  • étourneau
  • églefin
  • étoile de mer

Vous ne remarquez rien ? Dans l’inconscient des gens, il est fort à parier que seul l’éléphant est perçu comme un animal (car animal est associé à mammifère…).

NLes animaux qui commencent par “n”… Là, comme ça, rien ne m’est venu! Pourtant, il y en a. Ce ne sont pas des animaux qui sautent à l’esprit quand-même! Il a fallu que je cherche sur l’Internet…

  • NAJA: Serpent à lunettes.
  • NANDINIE: Mammifère carnivore d’Afrique tropicale.
  • NANDOU: Oiseau coureur.
  • NARVAL : (Narvals) Cétacé arctique.
  • NASIQUE : Singe à nez long et mou, c’est aussi une couleuvre de l’Inde.
  • NATICE : Mollusque des plages de l’Europe occidentale.
  • NAUTILE : Mollusque des mers chaudes.
  • NDAMA : Race bovine d’Afrique. Ne pas oublier de pastiller devant DAMA.
  • NEMERTE : Ver plat marin.
  • NEREIDE : Ver marin vivant dans la vase.
  • NEREIS : Pareil que NEREIDE.
  • NERITE : Mollusque gastéropode.
  • NILGAUT : Antilope d’Asie à courtes cornes.
  • NOCTULE : Chauve-souris.
  • NOVILLO : Jeune taureau.
  • NUDIBRANCHE : Allez de temps en temps un mot très long, mollusque gastropode marin.
  • NYCTALE : Petit rapace nocture, chouette boréale.

Source : http://legardemots.canalblog.com/archives/2011/06/13/21387634.html

On est d’accord ? Il n’y en a pas un qui saute à l’esprit immédiatement hein?

AQuant aux animaux dont l’initiale est le “a”, c’est peut-être plus simple. Il y a bien sûr l’âne, l’abeille, l’araignée, l’anaconda… Donc concernant cette lettre, ce n’est pas très difficile.

Dernière étape : la fleur

Bon, là, à ce stade, “éléphant” est presque assuré d’être en tête… On cherche donc une fleur dont l’initiale est un “t”. La première fleur qui vient à l’esprit est bien entendu “tulipe”, même si le tournesol est une fleur (mais ça, ce n’est pas immédiat), de même que le trèfle (pas très connu pour être une fleur mais si!) et le tussilage (ouais, ça existe!). Et c’est tout ! Autant dire que “tulipe” est sans doute la seule chose qui vient à l’esprit…

Bilan

Ce genre de “tour” s’appuie sur des statistiques comme celles que nous venons de voir, mais aussi sur les présumées connaissances du public, que l’on estime en général très limitées.

Si cette vidéo est vu par des millions de gens, il est fort à parier que cela ne fonctionnera pas toujours car il y a tout de même des gens cultivés (plus que moi!). Mais en général, elle produit l’effet escompté.

Stéphane Pasquet
Stéphane Pasquet

Laissez votre message

Supportscreen tag