Я работаю с набором данных 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()
Или есть лучший способ сделать это статистически корректно?
Заранее большое спасибо!