DEV Community

el houssine el malki
el houssine el malki

Posted on

Mon aventure avec le projet Vivino : transformer des données en recommandations 🍷

Le point de départ : pourquoi Vivino ?

Tout a commencé par une question simple :
comment transformer des données brutes en recommandations utiles et intelligentes ?
Le cas de Vivino s’est imposé naturellement. Les données sur le vin — composition chimique, qualité, évaluations — offrent un terrain idéal pour explorer les concepts clés de la data science et des systèmes de recommandation.
Le notebook my_vivino.ipynb est alors devenu le journal de cette aventure : un espace d’exploration, d’erreurs, d’itérations et d’apprentissage.

Comprendre avant d’agir : l’exploration des données

La première étape a été d’explorer le dataset. Avant toute ligne de modèle, j’ai pris le temps de :
comprendre la structure des données,
identifier les types de variables,
repérer les valeurs manquantes ou incohérentes,
analyser la distribution générale des données.
Cette phase m’a rappelé une règle essentielle :
un projet data solide commence toujours par une bonne compréhension des données.

def Résumer_le_jeu_de_données(dataset):
    print("Les 10 premières lignes :")
    print(dataset.head(10))
    print("Dimension du jeu de données :")
    print(dataset.shape)
    print("Résumé statistique :")
    print(dataset.describe())
    print("Distribution des qualité :")
    print(dataset.groupby("quality").size())
Résumer_le_jeu_de_données(dataset)
Enter fullscreen mode Exit fullscreen mode

Nettoyage des données : une étape souvent sous-estimée

Le nettoyage a constitué une part centrale du projet.
J’ai mis en place une fonction dédiée dont le rôle était de :
supprimer les valeurs non pertinentes (comme 0 ou 0.0),
corriger ou éliminer les anomalies,
masquer la colonne quality lorsque nécessaire afin d’éviter toute fuite d’information.
Cette étape, bien que moins “visible”, a largement conditionné la qualité des résultats finaux.

"fixed acidity";"volatile acidity";"citric acid";"residual sugar";"chlorides";"free sulfur dioxide";"total sulfur dioxide";"density";"pH";"sulphates";"alcohol";"quality"
7.4;0.7;0;1.9;0.076;11;34;0.9978;3.51;0.56;9.4;5
7.8;0.88;0;2.6;0.098;25;67;0.9968;3.2;0.68;9.8;5
7.8;0.76;0.04;2.3;0.092;15;54;0.997;3.26;0.65;9.8;5
11.2;0.28;0.56;1.9;0.075;17;60;0.998;3.16;0.58;9.8;6
7.4;0.7;0;1.9;0.076;11;34;0.9978;3.51;0.56;9.4;5
7.4;0.66;0;1.8;0.075;13;40;0.9978;3.51;0.56;9.4;5
7.9;0.6;0.06;1.6;0.069;15;59;0.9964;3.3;0.46;9.4;5
7.3;0.65;0;1.2;0.065;15;21;0.9946;3.39;0.47;10;7
Enter fullscreen mode Exit fullscreen mode

Visualisation : quand les données racontent une histoire

Pour aller plus loin, j’ai utilisé la visualisation afin de mieux comprendre le comportement du dataset :
histogrammes pour observer la distribution de la qualité,
analyse visuelle des déséquilibres,
validation des choix de nettoyage.
La visualisation n’était pas seulement esthétique, elle m’a aidé à prendre de meilleures décisions techniques.

Mise à l’échelle (Scaling) : préparer le terrain

Avant de comparer les vins entre eux, il était indispensable d’harmoniser les échelles des variables.
Les caractéristiques comme l’alcool, l’acidité ou la densité n’ont pas la même unité, et les comparer sans normalisation aurait biaisé les résultats.
Le scaling a donc permis de rendre les comparaisons justes et cohérentes.

def appliquer_scaling(dataset):
    scaler = MinMaxScaler()
    dataset_scaler = scaler.fit_transform(dataset)
    dataset_scaler = pd.DataFrame(dataset_scaler , index=dataset.index , columns=dataset.columns)
    return dataset_scaler
dataset_scaling = appliquer_scaling(dataset_clean)
Enter fullscreen mode Exit fullscreen mode

Similarité cosinus : le cœur du système de recommandation

Une fois les données prêtes, j’ai calculé la similarité cosinus entre les vins.
Cette méthode permet de mesurer la proximité entre deux vins en fonction de leurs caractéristiques.
C’est à ce moment-là que le projet a réellement pris vie :
les données se sont transformées en relations,
chaque vin a trouvé ses “voisins” les plus proches,
la base du système de recommandation était posée.

def calculer_similarite_cosinus(dataset):
    matrice_de_similarité = cosine_similarity(dataset)
    similarite_dataset = pd.DataFrame(matrice_de_similarité , index=dataset.index , columns=dataset.index)
    return similarite_dataset
similarite_dataset = calculer_similarite_cosinus(dataset_clean)
Enter fullscreen mode Exit fullscreen mode

Recommander intelligemment

À partir de la matrice de similarité, j’ai implémenté une fonction de recommandation :
l’utilisateur fournit un identifiant de vin,
le système retourne les vins les plus similaires.
J’ai également exploré des recommandations orientées vers les vins de meilleure qualité, tout en conservant une logique basée sur la similarité et non uniquement sur la note.

def meilleure_qualité(vins_ID, Top_N = 5):
    meilleure = dataset[dataset["quality"] >= 7]
    meilleure = meilleure.drop(columns=["quality"])
    meilleure_scaling = appliquer_scaling(meilleure)
    meilleure_similarite = calculer_similarite_cosinus(meilleure_scaling)
    meilleure_ID = meilleure_similarite[vins_ID]
    meilleure_ID = meilleure_ID.sort_values(ascending=False)
    meilleure_ID = meilleure_ID.drop(vins_ID)
    return meilleure_ID.head(Top_N)
meilleure_qualité(7)
Enter fullscreen mode Exit fullscreen mode

Ce que ce projet m’a appris

Ce projet my_vivino.ipynb m’a permis de comprendre que :
-la qualité des données est plus importante que la complexité du modèle,
-le nettoyage et la visualisation sont des étapes clés,
-un système de recommandation est avant tout une chaîne de décisions réfléchies.
À l’image du parcours raconté dans les blogs Kubernetes, cette aventure montre qu’un projet technique n’est pas qu’un résultat final, mais surtout un processus d’apprentissage continu.

Top comments (1)

Collapse
 
el_houssine_elmalki profile image
el houssine el malki

Blog de 🍷🍇