{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":31254,"databundleVersionId":3103714,"sourceType":"competition"}],"dockerImageVersionId":30839,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:14.356409Z","iopub.execute_input":"2025-01-24T16:59:14.356851Z","iopub.status.idle":"2025-01-24T16:59:16.521051Z","shell.execute_reply.started":"2025-01-24T16:59:14.356809Z","shell.execute_reply":"2025-01-24T16:59:16.51971Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Importer les bibliothèques nécessaires\nimport pandas as pd  # Pour manipuler les données\nimport numpy as np  # Pour les calculs numériques\nimport matplotlib.pyplot as plt  # Pour les visualisations simples\nimport seaborn as sns  # Pour des visualisations avancées\n\n# Désactiver les avertissements (optionnel)\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# Importer les datasets\narticles = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/articles.csv')\ncustomers = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/customers.csv')\ntransactions = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/transactions_train.csv')\nsample_submission = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/sample_submission.csv')\n\n# Afficher un aperçu de chaque dataset\nprint(\"Aperçu des articles :\")\nprint(articles.head(), \"\\n\")\n\nprint(\"Aperçu des clients :\")\nprint(customers.head(), \"\\n\")\n\nprint(\"Aperçu des transactions :\")\nprint(transactions.head(), \"\\n\")\n\nprint(\"Aperçu de la soumission :\")\nprint(sample_submission.head(), \"\\n\")\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Importer les bibliothèques nécessaires\nimport os\nfrom PIL import Image  # Pour manipuler les images\nimport matplotlib.pyplot as plt  # Pour afficher les images\n\n# Définir le chemin vers le dossier contenant les images\nimage_path = '/kaggle/input/h-and-m-personalized-fashion-recommendations/images/'\n\n# Parcourir récursivement le dossier pour collecter tous les chemins d'images\nimage_files = []\nfor root, dirs, files in os.walk(image_path):\n    for file in files:\n        # Vérifier si le fichier est une image (extensions courantes)\n        if file.lower().endswith(('.png', '.jpg', '.jpeg')):\n            image_files.append(os.path.join(root, file))\n\n# Vérifier le nombre d'images trouvées et afficher un aperçu\nprint(f\"Nombre total d'images trouvées : {len(image_files)}\")\nprint(\"Aperçu des chemins des images :\")\nprint(image_files[:5])\n\n# Charger et afficher une image en exemple\nif len(image_files) > 0:\n    sample_image = Image.open(image_files[0])  # Charger la première image trouvée\n    plt.imshow(sample_image)\n    plt.axis('off')\n    plt.title(\"Exemple d'image\")\n    plt.show()\nelse:\n    print(\"Aucune image n'a été trouvée dans le dossier spécifié.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T17:01:58.766114Z","iopub.execute_input":"2025-01-24T17:01:58.767371Z","iopub.status.idle":"2025-01-24T17:03:21.809886Z","shell.execute_reply.started":"2025-01-24T17:01:58.767314Z","shell.execute_reply":"2025-01-24T17:03:21.808154Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Vérifier les dimensions des datasets :\n\nprint(f\"Articles : {articles.shape}\")\nprint(f\"Clients : {customers.shape}\")\nprint(f\"Transactions : {transactions.shape}\")\nprint(f\"Soumission : {sample_submission.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T17:03:21.822766Z","iopub.execute_input":"2025-01-24T17:03:21.82312Z","iopub.status.idle":"2025-01-24T17:03:21.849109Z","shell.execute_reply.started":"2025-01-24T17:03:21.823094Z","shell.execute_reply":"2025-01-24T17:03:21.847695Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Explorer les colonnes et les types de données :\n\nprint(customers.info())\nprint(transactions.info())\nprint(articles.info())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.374579Z","iopub.status.idle":"2025-01-24T16:59:12.375019Z","shell.execute_reply":"2025-01-24T16:59:12.374863Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Traiter les valeurs manquantes\n\nprint(articles.isnull().sum())\nprint(customers.isnull().sum())\nprint(transactions.isnull().sum())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.375918Z","iopub.status.idle":"2025-01-24T16:59:12.376255Z","shell.execute_reply":"2025-01-24T16:59:12.376129Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(articles.head())\n\n# Obtenir un résumé statistique des données numériques\nprint(articles.describe())\n\n# Examiner les types de données et vérifier les valeurs manquantes\nprint(articles.info())\n\n# Compter les catégories uniques dans les colonnes importantes comme \"product_type_id\", \"product_group_name\", etc.\nprint(articles['product_type_no'].nunique())  # Nombre de types de produits\nprint(articles['product_group_name'].value_counts())  # Distribution des groupes de produits","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.376997Z","iopub.status.idle":"2025-01-24T16:59:12.377281Z","shell.execute_reply":"2025-01-24T16:59:12.377167Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Explorer les premières lignes de customers.csv\nprint(customers.head())\n\n# Obtenir un résumé statistique des données numériques pour les clients\nprint(customers.describe())\n\n# Examiner les types de données et vérifier les valeurs manquantes\nprint(customers.info())\n\n# Compter les clients par \"age\", \"club_member_status\", etc.\nprint(customers['age'].describe())  # Statistiques sur l'âge des clients\nprint(customers['club_member_status'].value_counts())  # Nombre de clients par statut de membre","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.377922Z","iopub.status.idle":"2025-01-24T16:59:12.378219Z","shell.execute_reply":"2025-01-24T16:59:12.378096Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Explorer les premières lignes de transactions_train.csv\nprint(transactions.head())\n\n# Vérifier les valeurs manquantes et types de données\nprint(transactions.info())\n\n# Compter le nombre d'achats par client et les articles les plus populaires\npurchases_by_customer = transactions['customer_id'].value_counts()\nmost_popular_items = transactions['article_id'].value_counts()\n\n# Afficher quelques statistiques importantes\nprint(f\"Nombre total d'achats par client (exemples) :\\n{purchases_by_customer.head()}\")\nprint(f\"Articles les plus populaires :\\n{most_popular_items.head()}\")\n\n# Analyser la distribution des achats au fil du temps\ntransactions['purchase_date'] = pd.to_datetime(transactions['t_dat'])\ntransactions['month'] = transactions['purchase_date'].dt.month\ntransactions['weekday'] = transactions['purchase_date'].dt.weekday\n\n# Afficher les tendances mensuelles et hebdomadaires des achats\nplt.figure(figsize=(12, 6))\ntransactions.groupby('month')['article_id'].count().plot(kind='bar', color='skyblue')\nplt.title('Nombre d\\'achats par mois')\nplt.xlabel('Mois')\nplt.ylabel('Nombre d\\'achats')\nplt.show()\n\n# Afficher les achats par jour de la semaine\nplt.figure(figsize=(12, 6))\ntransactions.groupby('weekday')['article_id'].count().plot(kind='bar', color='orange')\nplt.title('Nombre d\\'achats par jour de la semaine')\nplt.xlabel('Jour de la semaine')\nplt.ylabel('Nombre d\\'achats')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.379122Z","iopub.status.idle":"2025-01-24T16:59:12.37957Z","shell.execute_reply":"2025-01-24T16:59:12.379354Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Fréquence d'achat par client\npurchase_frequency = transactions['customer_id'].value_counts().reset_index()\npurchase_frequency.columns = ['customer_id', 'purchase_count']\nprint(purchase_frequency.head())\n\n# Articles les plus achetés par client\ntop_articles_by_customer = transactions.groupby('customer_id')['article_id'].apply(lambda x: x.mode()[0]).reset_index()\ntop_articles_by_customer.columns = ['customer_id', 'most_purchased_article']\nprint(top_articles_by_customer.head())\n\n# Dernier achat par client\nlast_purchase_date = transactions.groupby('customer_id')['purchase_date'].max().reset_index()\nlast_purchase_date.columns = ['customer_id', 'last_purchase_date']\nprint(last_purchase_date.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.380741Z","iopub.status.idle":"2025-01-24T16:59:12.38114Z","shell.execute_reply":"2025-01-24T16:59:12.380962Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Produits les plus populaires\npopular_products = transactions['article_id'].value_counts().reset_index()\npopular_products.columns = ['article_id', 'purchase_count']\nprint(popular_products.head())\n\n# Produits les moins populaires\nunpopular_products = popular_products.tail(10)\nprint(unpopular_products)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.381814Z","iopub.status.idle":"2025-01-24T16:59:12.382133Z","shell.execute_reply":"2025-01-24T16:59:12.382004Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Distribution des achats par mois\ntransactions['purchase_date'] = pd.to_datetime(transactions['t_dat'])\ntransactions['month'] = transactions['purchase_date'].dt.month\nmonthly_sales = transactions.groupby('month')['article_id'].count()\n\n# Affichage\nplt.figure(figsize=(10, 5))\nmonthly_sales.plot(kind='bar', color='lightblue')\nplt.title('Ventes par mois')\nplt.xlabel('Mois')\nplt.ylabel('Nombre de ventes')\nplt.show()\n\n# Distribution des achats par jour de la semaine\ntransactions['weekday'] = transactions['purchase_date'].dt.weekday\nweekday_sales = transactions.groupby('weekday')['article_id'].count()\n\n# Affichage\nplt.figure(figsize=(10, 5))\nweekday_sales.plot(kind='bar', color='lightgreen')\nplt.title('Ventes par jour de la semaine')\nplt.xlabel('Jour de la semaine')\nplt.ylabel('Nombre de ventes')\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.382887Z","iopub.status.idle":"2025-01-24T16:59:12.383255Z","shell.execute_reply":"2025-01-24T16:59:12.383132Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Fusionner les transactions avec les informations des articles pour ajouter des informations supplémentaires sur les produits\ntransactions_with_articles = transactions.merge(articles[['article_id', 'product_group_name', 'product_type_name']], on='article_id', how='left')\n\n# Vérifier les premières lignes du DataFrame fusionné\nprint(transactions_with_articles.head())\n\n# Segmenter les clients en fonction de leur fréquence d'achat\npurchase_frequency['purchase_segment'] = pd.cut(purchase_frequency['purchase_count'], bins=[0, 5, 10, 20, 100], labels=['Occasionnels', 'Modérés', 'Fréquents', 'VIP'])\nprint(purchase_frequency[['customer_id', 'purchase_segment']].head())\n\n# Comportements d'achat par segment de produit\nsegment_purchase = transactions_with_articles.groupby(['product_group_name', 'customer_id']).size().reset_index(name='purchase_count')\nprint(segment_purchase.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.384506Z","iopub.status.idle":"2025-01-24T16:59:12.385057Z","shell.execute_reply":"2025-01-24T16:59:12.38488Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Extraire les saisons\ntransactions['season'] = transactions['purchase_date'].dt.month % 12 // 3 + 1\nseasonal_sales = transactions.groupby(['season', 'article_id'])['article_id'].count().reset_index(name='purchase_count')\n\n# Affichage des produits populaires par saison\nprint(seasonal_sales.head(10))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.386026Z","iopub.status.idle":"2025-01-24T16:59:12.386414Z","shell.execute_reply":"2025-01-24T16:59:12.386227Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Création de la matrice d'interaction client-article\ninteraction_matrix = transactions.pivot_table(index='customer_id', columns='article_id', aggfunc='size', fill_value=0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T16:59:12.387361Z","iopub.status.idle":"2025-01-24T16:59:12.38791Z","shell.execute_reply":"2025-01-24T16:59:12.387766Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Échantillonner un sous-ensemble de clients\nsampled_customers = transactions['customer_id'].drop_duplicates().sample(500, random_state=42)\n\n# Échantillonner un sous-ensemble d'articles\nsampled_articles = transactions['article_id'].drop_duplicates().sample(200, random_state=42)\n\n# Filtrer les transactions pour ne conserver que l'échantillon\nfiltered_transactions = transactions[\n    (transactions['customer_id'].isin(sampled_customers)) &\n    (transactions['article_id'].isin(sampled_articles))\n]\n\n# Création de la matrice d'interaction réduite\ninteraction_matrix_sampled = filtered_transactions.pivot_table(index='customer_id', columns='article_id', aggfunc='size', fill_value=0)\n\n# Vérifier la taille de la matrice échantillonnée\nprint(interaction_matrix_sampled.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T17:18:12.101454Z","iopub.execute_input":"2025-01-24T17:18:12.101913Z","iopub.status.idle":"2025-01-24T17:18:21.241289Z","shell.execute_reply.started":"2025-01-24T17:18:12.101869Z","shell.execute_reply":"2025-01-24T17:18:21.239897Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Identifier les 100 articles les plus populaires\ntop_articles = transactions['article_id'].value_counts().head(100).index\n\n# Filtrer les transactions pour ne garder que les articles les plus populaires\nfiltered_transactions_top = transactions[transactions['article_id'].isin(top_articles)]\n\n# Créer la matrice d'interaction pour ces articles\ninteraction_matrix_top = filtered_transactions_top.pivot_table(index='customer_id', columns='article_id', aggfunc='size', fill_value=0)\n\n# Vérifier la taille de la matrice\nprint(\"Taille de la matrice d'interaction : \", interaction_matrix_top.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T17:20:29.030034Z","iopub.execute_input":"2025-01-24T17:20:29.030402Z","iopub.status.idle":"2025-01-24T17:20:34.837232Z","shell.execute_reply.started":"2025-01-24T17:20:29.030378Z","shell.execute_reply":"2025-01-24T17:20:34.835671Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Identifier les clients VIP (ceux ayant le plus grand nombre de transactions)\nvip_customers = transactions['customer_id'].value_counts().head(500).index\n\n# Filtrer les transactions pour ne conserver que celles des clients VIP\nfiltered_transactions_vip = transactions[transactions['customer_id'].isin(vip_customers)]\n\n# Création de la matrice d'interaction pour les clients VIP\ninteraction_matrix_vip = filtered_transactions_vip.pivot_table(index='customer_id', columns='article_id', aggfunc='size', fill_value=0)\n\n# Calcul et visualisation de la matrice de corrélation pour les clients VIP\ncorrelation_matrix_vip = interaction_matrix_vip.corr()\nplt.figure(figsize=(12, 8))\nsns.heatmap(correlation_matrix_vip, cmap='coolwarm', annot=False)\nplt.title('Matrice de corrélation des articles (clients VIP)')\nplt.show()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Identifier les clients VIP (par exemple, les 500 clients ayant effectué le plus d'achats)\nvip_customers = transactions['customer_id'].value_counts().head(500).index\n\n# Filtrer les transactions pour ne conserver que celles des clients VIP\nfiltered_transactions_vip = transactions[transactions['customer_id'].isin(vip_customers)]\n\n# Vérifier les premières lignes des transactions des clients VIP\nprint(filtered_transactions_vip.head())\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Création d'une matrice d'interaction pour les clients VIP\ninteraction_matrix_vip = filtered_transactions_vip.pivot_table(index='customer_id', columns='article_id', aggfunc='size', fill_value=0)\n\n# Vérifier la taille de la matrice\nprint(\"Taille de la matrice d'interaction : \", interaction_matrix_vip.shape)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Définir une période pour séparer les données d'entraînement et de validation\ncutoff_date = \"2020-09-15\"  # Exemple de date de coupure\n\n# Diviser les données en deux périodes : entraînement et validation\ntrain_data = filtered_transactions_vip[filtered_transactions_vip['t_dat'] <= cutoff_date]\ntest_data = filtered_transactions_vip[filtered_transactions_vip['t_dat'] > cutoff_date]\n\n# Créer des cibles : articles achetés dans la période de test\ntest_targets = test_data.groupby('customer_id')['article_id'].apply(list).reset_index()\ntest_targets.columns = ['customer_id', 'target_articles']\nprint(test_targets.head())\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Construire un modèle de prédiction","metadata":{}},{"cell_type":"code","source":"# Créer une feature : nombre d'achats d'un article par client\ntrain_features = train_data.groupby(['customer_id', 'article_id']).size().unstack(fill_value=0)\n\n# Ajouter d'autres features si nécessaire (par exemple, catégories de produits)\ntrain_features['total_purchases'] = train_features.sum(axis=1)\n\n# Vérifier les premières lignes\nprint(train_features.head())\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import precision_score\n\n# Diviser les données en train et validation\nX_train, X_val, y_train, y_val = train_test_split(train_features, test_targets['target_articles'], test_size=0.2, random_state=42)\n\n# Entraîner un modèle (Random Forest ici)\nmodel = RandomForestClassifier(n_estimators=100, random_state=42)\nmodel.fit(X_train, y_train)\n\n# Prédire sur le set de validation\ny_pred = model.predict(X_val)\n\n# Évaluer la précision\nprint(\"Précision : \", precision_score(y_val, y_pred, average='micro'))\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Importance des features (articles les plus significatifs)\nimportances = model.feature_importances_\nfeature_names = X.columns\nimportance_df = pd.DataFrame({'Feature': feature_names, 'Importance': importances}).sort_values(by='Importance', ascending=False)\n\n# Afficher les 10 features les plus importantes\nprint(\"Top 10 articles les plus importants pour la prédiction :\\n\", importance_df.head(10))\n\n# Visualisation\nplt.figure(figsize=(10, 6))\nsns.barplot(x='Importance', y='Feature', data=importance_df.head(10), palette='viridis')\nplt.title(\"Top 10 articles les plus importants\")\nplt.show()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}