Je travaille sur un système de recommandation de produits en Python (voir réponse de Mohsin Hasan).
Le script prend simplement deux variables (UserId, ItemId) en entrée, et donne en sortie le score d'affinité entre deux produits.
Cependant, j'ai ajouté une troisième colonne (pays). Je veux faire l'analyse séparément, par pays (pas l'ensemble du jeu de données).
À l'origine, j'utilisais R, où la fonction 'group_by' de dplyr devrait aider. Mais actuellement, je suis bloqué (voir mes tentatives ci-dessous). Avez-vous une idée de comment je pourrais réaliser cette analyse par pays? (J'ai l'impression que 'pandas.DataFrame.groupby' pourrait résoudre cela, au lieu de ma tentative d'utiliser une boucle for).
Données d'exemple (veuillez noter : la seule différence est que j'ai ajouté la colonne pays) :
UserId ItemId Pays
1 Babyphone Pays-Bas
1 Babyphone Pays-Bas
1 Machine à café Pays-Bas
2 Machine à café Pays-Bas
2 Rasoir Pays-Bas
3 Rasoir Pays-Bas
3 Machine à café Pays-Bas
4 Machine à café Pays-Bas
4 Rasoir Pays-Bas
4 Blender Pays-Bas
5 Blender Pays-Bas
5 Babyphone Pays-Bas
5 Rasoir Pays-Bas
6 Rasoir Pays-Bas
7 Machine à café Pays-Bas
7 Machine à café Pays-Bas
8 Babyphone Pays-Bas
9 Blender Pays-Bas
9 Blender Pays-Bas
1 Babyphone Allemagne
1 Babyphone Allemagne
1 Machine à café Allemagne
2 Machine à café Allemagne
2 Rasoir Allemagne
3 Rasoir Allemagne
3 Machine à café Allemagne
4 Machine à café Allemagne
4 Rasoir Allemagne
4 Blender Allemagne
5 Blender Allemagne
5 Babyphone Allemagne
5 Rasoir Allemagne
6 Rasoir Allemagne
7 Machine à café Allemagne
7 Machine à café Allemagne
8 Babyphone Allemagne
9 Blender Allemagne
9 Blender Allemagne
Code fonctionnant -original- (fonctionnant avec UserId et ItemId, sans Pays)
# main est notre jeu de données.
# obtenir les articles uniques
articles = set(main.productId)
n_users = len(set(main.userId))
# créer un dictionnaire des articles et des utilisateurs ayant acheté cet article
utilisateurs_article = main.groupby('productId')['userId'].apply(set).to_dict()
# itérer sur les combinaisons d'article1 et d'article2 et stocker les scores
resultat = []
for article1, article2 in itertools.combinations(articles, 2):
score = len(utilisateurs_article[article1] & utilisateurs_article[article2]) / n_users
tuples_article = [(article1, article2), (article2, article1)]
resultat.append((article1, article2, score))
resultat.append((article2, article1, score)) # stocker également le score pour l'ordre inverse
# convertir les résultats en un dataframe
resultat = pd.DataFrame(resultat, columns=["item1", "item2", "score"])
Ma tentative (avec le pays, mais cela ne fonctionne pas). Qu'ai-je essayé ?
- Filtrer le jeu de données par pays (oui, c'est nul car ce n'est pas dynamique)
- Boucler sur les dataframes (chaque pays a un dataframe)
- Essayer d'insérer la solution (voir ci-dessus), et l'appliquer aux dataframes séparément.
-
Comme vous pouvez le voir, malheureusement ça ne fonctionne pas...
Pays-Bas = df.loc[df['Country'] == 'Pays-Bas'] Allemagne = df.loc[df['Country'] == 'Allemagne'] resultats = [] for jeu_de_donnees in (Pays-Bas, Allemagne): for index, ligne in jeu_de_donnees.iterrows(): Pays = ligne['Country'] # Besoin de lier le nom du dataframe aux résultats articles = set(jeu_de_donnees.ItemId) # Obtenir les articles uniques par pays n_users = len(set(jeu_de_donnees.UserId) # Obtenir le nombre d'utilisateurs uniques par pays utilisateurs_article = jeu_de_donnees.groupby('ItemId'['UserId'].apply(set).to_dict() # J'ai essayé d'ajouter le pays ici, mais sans résultats for article1, article2 in itertools.combinations(articles, 2): print("article1", article1) print("article2", article2) score = len(utilisateurs_article[article1] & utilisateurs_article[article2]) / n_users tuples_article = [(article1, article2), (article2, article1)] resultats.append((article1, article2, score)) resultats.append((article2, article1, score)) # stocker également le score pour l'ordre inverse resultats = pd.DataFrame(resultats, columns=["item1", "item2", "score"])
Édition 1 : Sortie attendue
Édition 2 Comment le score est-il calculé ? Le score représente : Combien de clients achètent une combinaison de produits ensemble.
Par exemple, dans les données, vous voyez que Rasoir & Machine à café = 0,333 (car 3 personnes, sur les 9 personnes, ont acheté cette combinaison PAR PAYS). Dans le premier code, le score fonctionne parfaitement. Mais je ne parviens pas à le faire fonctionner par pays (c'est là que réside le problème clé).
Merci d'avance !