<jupyter_start><jupyter_text>Analyse exploratoire---<jupyter_code>import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np<jupyter_output><empty_output><jupyter_text>Implémentation des données---<jupyter_code>df_lookup = pd.read_csv('./Datasets/dataset/ydata-ymusic-artist-names-v1_0.txt', sep='\t',header=None, encoding="ISO-8859-1", names=['artist_id', 'artist_name'])
df_lookup.set_index('artist_id', inplace=True)
df_lookup
df_ratings = pd.read_csv('./Datasets/dataset/ydata-ymusic-user-artist-ratings-v1_0.txt', sep='\t',header=None, encoding="ISO-8859-1", names=['user_id', 'artist_id','ratings'])
df_ratings.head()<jupyter_output><empty_output><jupyter_text>Analyse des données--- Regardons la répartition des notes par utilisateur et par artiste.     Notons que la note 255 est donnée lorsque l'utilisateur ne souhaite plus du tout écouter cet artiste et peut donc être remplacée par la note minimale.<jupyter_code>sns.set(style='whitegrid', palette="deep", font_scale=1.1, rc={"figure.figsize": [8, 5]})
sns.distplot(
    df_ratings['ratings'], bins=25, norm_hist=True, kde=False, hist_kws={"alpha":1}
).set(xlabel='notes des utilisateurs', ylabel='proportion des notes')
# Nombre de 255
df_ratings[df_ratings.ratings == 255].shape[0]
total_ratings = df_ratings.shape[0]
total_ratings
df_ratings.describe()
df_ratings['ratings'].isna().sum()<jupyter_output><empty_output><jupyter_text>Etant donnée la proportion de 0 dans les notes attribuées on peut en déduire que ce sont des notes non attribuées.Les vrais 0 correspondent aux 255.<jupyter_code>df_ratings.replace(0, np.nan, inplace=True)
df_ratings.replace(255, 0, inplace=True)
sns.distplot(
    df_ratings['ratings'], bins=20, norm_hist=True, kde=False, hist_kws={"alpha":1}
).set(xlabel='notes des utilisateurs', ylabel='proportion des notes')<jupyter_output><empty_output><jupyter_text>Interessons nous maintenant a la proportion d'artistes notée et aux artistes les plus notés.<jupyter_code># Il ya 98213 artistes
total_items = df_ratings.artist_id.nunique()
total_items
# 30% des données ne sont pas notées
df_ratings.isna().sum() / total_ratings
df_ratings.groupby('artist_id').count().head()
df_ratings = df_ratings[df_ratings.artist_id != -100]
df_ratings = df_ratings.query('artist_id != -99')
df_artists = df_ratings.groupby('artist_id').count().sort_values(by='ratings', ascending=False)
df_artists.drop('user_id', axis='columns', inplace=True)
df_artists_rated = df_artists.query('ratings != 0')
df_artists_rated.reset_index(inplace=True)
df_artists_rated
sns.distplot(
    df_artists_rated['ratings'], bins=100, norm_hist=False, kde=False, hist_kws={"alpha":1}
).set(xlabel='artist_id', ylabel='# notes')<jupyter_output><empty_output><jupyter_text>La majeure partie des artistes n'est notée que par une poignée d'utilisateurs avec une moyenne de 1626 notes par artiste<jupyter_code>df_artists_rated.mean().ratings
df_artists_rated_most = df_artists.query(' 0 < ratings < 100').sort_values(by='ratings', ascending=False)
sns.distplot(
    df_artists_rated_most['ratings'], bins=100, norm_hist=False, kde=False, hist_kws={"alpha":1}
).set(xlabel='nombre de notes', title='Distribution du nombre de notes')<jupyter_output><empty_output><jupyter_text>Regardons la répartition au sein des artistes les plus notés<jupyter_code>df_artists_pop = df_artists.query('ratings > 35')
df_artists_pop
sns.distplot(
    df_artists_pop['ratings'], bins=50, norm_hist=False, kde=True, hist_kws={"alpha":1}
).set(xlabel='nombre de notes', title='Distribution du nombre de notes')
df_artists_pop.reset_index(inplace=True)
df_artists_rated_most.reset_index(inplace=True)
sns.jointplot(x='artist_id', y='ratings', data=df_artists_pop)<jupyter_output><empty_output><jupyter_text>L'id de l'artiste n'a pas de réelle corrélation avec sa popularité ce qui est assez rassurant On déduit également de cette analyse de distribution que l'algorithme de recommendation devra être adapté pour ne pas recommender que les artistes ayant recu le plus de notes.           Il s'agira d'optimiser son **taux de couverture** des différents items.<jupyter_code>df_user = df_ratings.groupby('user_id').count()
df_user.drop('artist_id', axis='columns', inplace=True)
df_user.reset_index(inplace=True)
df_user.sort_values(by='ratings', ascending=False, inplace=True)
sns.distplot(
    df_user['ratings'], bins=200, norm_hist=False, kde=False, hist_kws={"alpha":1}
).set(xlabel='Nombre de notes', title='Distribution des notes')
# 8632 utilisateurs n'ont noté aucun artiste, ce qui représente 0.44%
df_user.query('ratings == 0').shape[0]
total_users = df_user.shape[0]
total_users<jupyter_output><empty_output><jupyter_text>Encore une fois la majeure partie des utilisateurs ont noté une poignée d'artistes<jupyter_code>df_user.max()
df_user.query('ratings >2').shape[0]/total_users
total_items, total_users<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1292558613659531, 'fraction_numerical': 0.019367991845056064, 'mean_word_length': 8.051660516605166, 'pattern_counts': {'":': 7, '<': 39, '<?xml version=': 0, '>': 39, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '232508', 'license': 'MIT', 'n_tokens_mistral': 1869, 'n_tokens_neox': 1798, 'n_words': 371, 'path': 'notebooks/EDA.ipynb', 'repo_name': 'EvolveArt/rec_sys_workshop', 'size': '4905'}