Tous les articles par icnisnboissy

Projet : Chance de survivre au naufrage du Titanic ?


Présentation du projet :

Vous allez travailler sur le jeu de données suivant (à télécharger): 

Ce jeu de données contient des informations sur une partie des passagers (plus exactement sur 891 passagers) du Titanic. Pour un petit rappel historique, vous pouvez consulter la page Wikipédia consacrée à ce paquebot : ici

Ouvrez le fichier « titanic.csv » à l’aide d’un tableur.

Vous devriez obtenir quelque chose qui ressemble à ceci :

Trouvez la signification des différents descripteurs : « PassengerId », « Survived », « Pclass »… Aide : 

L’objectif de ce projet est d’utiliser l’algorithme des k plus proches voisins afin de déterminer si les passagers ci-dessous auraient survécus au naufrage du Titanic.

PclassNameSexAgeSibSpParchTicketFareEmbarked
2Mr. Bidochon Robertmale371424437721.075C
2Mrs. Bidochon Raymondefemale361424437920.2175C
2Mrs. Bidochon Gisèlefemale113224438215.045C
2Mr. Bidochon René.male83224438312.945C
2Mr. Bidochon Eugène.male43213738310.17C
2Mr. Bidochon Louis.male132373811.13C

PARTIE 1 : Analyse des données (Data scientist)

Un travail de préparation des données va être nécessaire , vous allez donc devoir passer par quelques étapes que voici :

– Pour ceux qui ne souhaitent pas poursuivre la spécialité N.S.I vous pouvez opérer les changements directement avec le tableur.

– Pour ceux qui souhaitent poursuivre la spécialité N.S.I vous devez opérer les changements directement avec python.
Le fichier python ci-dessous, vous aidera faire les manipulations nécessaires).

Analyser ce fichier, combien y a t’il de fonctions,que font elles?

Pour la suite du projet vous pouvez travailler soit avec la liste de dictionnaire créé avec le programme, soit avec le fichier csv.

Toutes les colonnes ne vont pas forcement être pertinentes, par exemple, d’après vous, lors du naufrage, le nom du passager a-t-il eu une quelconque importance sur le fait qu’il ait ou non survécu ? (nous ne tiendrons pas compte du fait que certaines personnes aient pu être privilégié au vu de leur nom de famille, sur les 891 passagers présents dans le fichier titanic.csv, ce phénomène est négligeable).

Solution 1 avec le tableur:

En analysant le contenu du fichier titanic.csv (par exemple à l’aide d’un tableur), choisissez les descripteurs ( c’est à dire les colonnes) qui vous paraissent les plus pertinents. Vous effacerez les colonnes qui vous semblent inutiles directement dans le tableur ou avec python pour obtenir soit une liste de dictionnaire (comme Data dans le fichier donné ci dessus), soit un nouveau fichier titanic_V2.csv

Solution 2, avec python :

Nettoyer la liste de dictionnaire, en ne gardant pour chaque dictionnaire que les clés que vous jugez nécessaire.
Enregistrer votre fichier python.

Pour certains passagers, il manque des données. Par exemple, l’âge de certains passagers n’est pas renseigné. Une solution est de supprimer du fichier les passagers ayant des données incomplètes.

Supprimer du fichier les passagers ayant des données incomplètes pour obtenir un nouveau fichier titanic_V3.csv ou une nouvelle liste de dictionnaire avec les données incomplètes supprimées.


L’utilisation de l’algorithme des k plus proches voisins nous oblige à proscrire les données non numériques.
Par exemple, la colonne « Sex » ne peut pas être utilisée telle quelle, l’algorithme n’est pas capable de traiter les « male » et « female ».

Proposer une alternative pour remplacer les chaines de caracteres « male » et « female ».
Modifier certaines colonnes directement dans le tableur ou avec un script python pour obtenir un nouveau fichier titanic_V4.csv ou une nouvelle liste de dictionnaire.


Avec l’algorithme des k plus proches voisins nous sommes amenés à calculer des distances.
Comparer l’amplitude des valeurs de la colonne Pclass avec l’amplitude des valeurs de la colonne Age.

Amplitude des valeurs de la colonne Pclass :
Amplitude des valeurs de la colonne Age :

Code python pour obtenir cette amplitude à partir de titanic_V4.csv ou avec la liste de dictionnaire :
Une des conséquence de l’observation précédente est que le calcul de la distance ne va pas traiter de facon égalitaire les colonnes.
Pour rétablir l’équité nous allons procéder ainsi :
Pour chaque colonne :

  1. On repère la valeur minimale (v_min) et la valeur maximale ( v_max)
  2. On va diviser chacune des valeurs de la colonne par la diffrence v_max-v_min
    Exemple : Si une colonne contient les valeurs [5,4,1,11,7]
    v_min=1 et v_max=11
    Alors on divise toutes les valeurs par 8 ce qui donne [0.5,0.4,0.1,1.1,0.7]

Remarque :
Toutes les valeurs de toutes les colonnes seront comprises entre 0 et 1.
Cela nous garantie un traitement équitable entre les colonnes.

Faire les modifications nécessaires au fichier titanic_V4.csv pour garantir un équitable entre les colonnes. On nommera titanic_V5.csv le nouveau fichier obtenu. Vous devriez avoir un fichier comme celui-ci:

Partie 2: Graphique 3D

A l’aide du TP sur les k plus proches voisins, construire le graphique 3D à partir du fichier titanicV5.csv

Les survivants devront être en vert et les disparus en rouge, les personnes que vous testerez seront en bleu.

voici quelques liens ou faire des recherches:

1 er lien Les fiches CPGE

2 éme lien Machine learnia

Partie 3: Utilisation de l’algorithme des K plus proche voisins

A l’aide du TP sur les k plus proches voisins, (avec k=5) prédire quel(s) membre(s) de la famille Bidochons aurait(ent) survécu(s) au naufrage du Titanic ?

En utilisant l’algorithme proposé par scikit-learn
des k plus proches voisins établir votre programme python et donnez la liste des survivants en faisant varier k de 3 à 19 ( valeur impaire).

( c’est la ligne : from sklearn.neighbors import KNeighborsClassifier qui charge l’algorithme)

Compresser des fichiers pour envoi sur dépôt pronote

Pour compresser des fichiers et les déposer sur pronote, ouvrir le dossier contenant les fichiers à compresser afin de ne faire qu’un seul fichier avec l’extension .zip.

Pour les sélectionner, faire un cliquer-glisser ou appuyer sur CTRL+A.

Cliquer alors avec le bouton droit et sélectionner : « Envoyer vers » – >  » Fichier compressé« 

Changer éventuellement le nom du fichier, et vous pouvez le déposer dans le dépôt Prononte !

Outils en ligne

Environnement de développement Python en ligne pour travailler la programmation sur n’importe quel appareil sans installation

Replit.com

Environnement Linux (Debian) en ligne :

  • Cocalc (l’enregistrement est facultatif mais vous permettra de retrouver votre travail).
  • Webminal est une alternative très intéressante mais l’enregistrement est obligatoire et nécessite une adresse mail.

Recherche

def recherche_mot_boyer(texte, mot):
    """Recherche un mot dans un texte avec l'algo de boyer-moore

    Arguments
    ---------
    texte: str
        le texte dans lequel on effectue la recherche
    mot: str
        le mot recherché

    Returns
    -------
    bool
        renvoie True si le mot est trouvé
    """
    N = len(texte)
    n = len(mot)
    
    # création de notre dictionnaire de décalages
    décalages = pre_traitement(mot)
    
    # on commence à la fin du mot
    i = n - 1
    while i < N:
        lettre = texte[i]
        if lettre == mot[-1]:
            # On vérifie que le mot est là avec un slice sur texte
            # On pourrait faire un while
            if texte[i-n+1:i+1] == mot:
                return True
        # on décale
        if lettre in décalages.keys():
            i += décalages[lettre]
        else:
            i += n
        
    return False

# Quelques tests
assert recherche_mot_boyer('abracadabra', 'dab')
assert recherche_mot_boyer('abracadabra', 'abra')
assert recherche_mot_boyer('abracadabra', 'obra') == False
assert recherche_mot_boyer('abracadabra', 'bara') == False
assert recherche_mot_boyer('maman est là', 'maman')
assert recherche_mot_boyer('bonjour maman', 'maman')
assert recherche_mot_boyer('bonjour maman', 'papa') == False

Pré-traitement

def pre_traitement(mot):
    """Renvoie un dictionnaire avec pour clé la lettre et pour valeur le décalage

    Arguments
    ---------
    mot: str
    
    Returns
    -------
    dict
    """
    n = len(mot)
    décalages = {}
    # Il n'est pas nécéssaire d'inclure la dernière lettre
    for i, letter in enumerate(mot[:-1]):
        décalages[letter] = n - i -1
    return décalages

# tests
assert pre_traitement("dab") == {'d': 2, 'a': 1}
assert pre_traitement("maman") == {'m': 2, 'a': 1}

Recherche naive

def recherche_mot(texte, mot):
    """Recherche un mot dans un texte

    Arguments
    ---------
    texte: str
        le texte dans lequel on effectue la recherche
    mot: str
        le mot recherché

    Return
    -------

    renvoie True si le mot est trouvé et False si le mot n'est pas trouvé

        Test:

    recherche_mot("abcbcdcabbabc","abb") renvoie True
    recherche_mot("abcbcdcabbabc","toto")   renvoie False
    recherche_mot("abcbcdcabbabc","ac")   renvoie False
    """

    N = len(texte)#taille du texte
    n = len(mot)#taille du mot
    i=0#indice pour le texte
    k=0#indice pour le mot
    if n>N:
        print("erreur le mot est plus long que le texte")
        #return


    recherche=True#on mets à True la variable recherche
    for i in range(N-n+1):# boucle pour i variant de 0 à taille de la chaine-taille du mot +1
        while recherche and k+1 < n:#☺boucle tant que recherche est vraie (True) ET k+1 < taille du mot
            if mot[k] != texte[i+k]:
                recherche = False
            k += 1
        if recherche:
            return True#on sort avec renvoie de True
    return False#on sort avec renvoie de False

Recherche textuelle

Programme officiel

ContenusCapacités attenduesCommentaires
Recherche textuelle.Étudier l’algorithme de Boyer- Moore pour la recherche d’un motif dans un texte.L’intérêt du prétraitement du motif est mis en avant.L’étude du coût, difficile, ne peut être exigée
fiche sur eduscol

La recherche d’une sous-chaine a des applications importantes en informatiques, par exemple dans les moteurs de recherche. Nous commencerons par une application naïve puis nous verrons qu’il est bien plus efficace de faire la recherche en sens inverse en partant du dernier caractère du mot pour ne pas tester toutes les positions.

Nous allons visualiser la vidéo ci-dessous et effectuer les implémentation sous python en mettent la vidéo en pause, les solutions des programme python sont données plus loin dans l’article.

Algorithme naïf

Nous allons appliquer une méthode itérative brute pour rechercher une sous-chaine dans une chaine de caractères.

Nous allons avancer dans le texte caractère par caractère, puis si le caractère considéré correspond au premier caractère du mot, nous comparerons les caractères suivants à ceux du mot. si la recherche s’avère fructueuse on renvoie True.

implémentation algorithme naïf python corrigé

L’exécution est relativement lente, la fonction doit tester N-n positions dans texte et pour chacune effectuer jusqu’à N-n comparaisons, soit jusqu’à (Nnn.

La complexité de cet algorithme est dans le pire des cas O ((Nnn), c’est une complexité quadratique O(N2) car souvent  N>>n.

Nous allons voir qu’il est beaucoup plus efficace de faire la recherche à l’envers à partir de la fin du mot.

L’algorithme de Boyer-Moore : version simplifiée de Horspool

Nous allons étudier une version simplifiée du meilleur algorithme connu : l’algorithme de Boyer-Moore qui a été proposé par Nigel Horspool.

Cet algorithme repose sur deux idées :

  1. On compare le mot de droite à gauche à partir de sa dernière lettre.
  2. On n’avance pas dans le texte caractère par caractère, mais on utilise un décalage dépendant de la dernière comparaison effectuée.

Déroulement de l’algorithme

Nous considérons ici la recherche du motif mot = 'dab' dans le texte texte = 'abracadabra'.

On commence la recherche à l’index 2 :

abracadabra
dab

Il n’y a pas de correspondance à la fin du mot : 'r' != 'b', donc on avance, mais de combien de caractères avance-t-on. Pour le décider, on utilise le fait que le caractère 'r' n’apparait pas dans le mot cherché, donc on peut avancer de n = len(mot) = 3 caractères sans crainte de rater le mot.

On recherche donc à l’indice 2 + 3 = 5 :

abracadabra
   dab

Il n’y a pas de correspondance à la fin du mot : 'a' != 'b', donc on avance, cependant, cette fois, comme le caractère 'a' apparait pas dans le mot cherché en avant-dernière position, on ne peut avancer que de une case pour faire une comparaison en alignant les 'a'.

On recherche donc à l’indice 5 + 1 = 6 :

abracadabra
    dab

Il n’y a pas de correspondance à la fin du mot : 'd' != 'b', donc on avance, cependant, cette fois, comme le caractère 'd' apparait dans le mot cherché en avant-avant-dernière position(première position, mais on doit lire à l’envers !), on avance de deux cases pour faire une comparaison en alignant les 'd'.

On recherche donc à l’indice 6 + 2 = 8 :

abracadabra
      dab

Maintenant lorsqu’on effectue les comparaisons à l’envers : les 'b', puis les 'a', puis les 'd' correspondent. On a trouvé le mot on renvoie VRAI.

Implémentation en Python

Pour implémenter efficacement cet algorithme, on va passer par un pré-traitement du nom pour facilement accéder au décalage à effectuer. On utilise un dictionnaire pour cela.

Implémentation du pré-traitement python corrigé.

Maintenant la fonction de recherche :

Implémentation recherche en python corrigé.