Правильная группировка и агрегирование во избежание проблемы случайных эффектов - PullRequest
0 голосов
/ 05 августа 2020

Я работаю с набором данных Movielens 100k (он содержит информацию о фильмах - жанре и пользователях - пол, возраст и т. Д. c.), Который выглядит примерно так:

  item_id              title release_date  video_release_date  \
0        1   Toy Story (1995)  01-Jan-1995                 NaN   
1        4  Get Shorty (1995)  01-Jan-1995                 NaN  

  Adventure  Animation  Childrens  ...  Thriller  War  Western  user_id  \
0          0          1          1  ...         0    0        0      308   
1          0          0          0  ...         0    0        0      308   

   rating  timestamp  age  gender  occupation  zip_code  
0       4  887736532   60       M     retired     95076  
1       5  887737890   60       M     retired     95076  

Я хотел бы сравнить средние рейтинговые баллы двух полов (мужской и женский) для каждого жанра mov ie. Однако недостаточно просто рассчитать средний рейтинг всех пользователей-женщин по сравнению со всеми пользователями-мужчинами, поскольку пользователей-мужчин гораздо больше, чем пользователей-женщин. В этом отношении я должен как-то решить эту проблему, о которой я читал, под названием модель случайных эффектов.

Я думал, как-то правильно сгруппировать или применить агрегацию, чтобы вычислить средний рейтинг, который дал каждый пользователь. для каждого mov ie этого жанра.

Код до сих пор, но он неправильно фиксирует и решает проблему:

males = data.query("gender == ['M']")
male_movie_genre = males.iloc[:, 6:24]

movie_genre_labels = ['Action', 'Adventure' , 'Animation' , 'Childrens' , 'Comedy' , 'Crime' , 'Documentary' , 'Drama' , 'Fantasy' , 'Film-Noir' , 'Horror' , 'Musical' , 'Mystery' , 'Romance' , 'Sci-Fi' , 'Thriller' , 'War' , 'Western']
males['genre'] = pd.Series(male_movie_genre[labels].columns[np.where(male_movie_genre[labels]!=0)[1]])

avg_rating_per_genre_male_users = males.groupby(['user_id', 'genre'])['rating'].mean().reset_index()

mean_rating_values_male_users = avg_rating_per_genre_male_users.groupby(['genre'])['rating'].mean()

Или есть лучший способ сделать это статистически корректно?

Заранее большое спасибо!

...