美文网首页web服务器
数据分析案例(MovieLens)

数据分析案例(MovieLens)

作者: GHope | 来源:发表于2018-11-17 17:27 被阅读157次

    MovieLens 1M数据集

    MovieLens 1M数据集含有来自6000名用户对4000部电影的100万条评分数据。它分为三个表:评分、用户信息和电影信息。

    pd.options.display.max_rows = 10
    
    unames = ['user_id', 'gender', 'age', 'occupation', 'zip'] 
    users = pd.read_table('datasets/movielens/users.dat', sep='::',
                           header=None, names=unames, engine='python')
    rnames = ['user_id', 'movie_id', 'rating', 'timestamp'] 
    ratings = pd.read_table('datasets/movielens/ratings.dat', sep='::',
                            header=None, names=rnames, engine='python')
    mnames = ['movie_id', 'title', 'genres'] 
    movies = pd.read_table('datasets/movielens/movies.dat', sep='::',                       
                            header=None, names=mnames, engine='python')
    
    数据加载

    查看每个DataFrame的前几行即可验证数据加载工作是否一切顺利:

    users[:5] 
    
    ratings[:5] 
    
    movies[:5] 
    
    ratings
    
    验证数据加载

    想要根据性别和年龄计算某部电影的平均得分,如果将所有数据都合并到一个表中的话问题就简单多了。我们先用pandas的merge函数将ratings跟users合并到一起,然后再将movies也合并进去。pandas会根据列名的重叠情况推断出哪些列是合并(或连接)键

    data = pd.merge(pd.merge(ratings, users), movies)
    
    自动合并

    按性别计算每部电影的平均得分,我们可以使用pivot_table方法(也可以用groundby对'title'和'gendef'分组之后unstack可以得到相同的结果)

    mean_ratings = data.pivot_table('rating', index='title', columns='gender', aggfunc='mean')
    
    按性别计算每部电影的平均得分

    过滤掉评分数据不够250条的电影(随便选的一个数字)。为了达到这个目的,先对title进行分组,然后利用size()得到一个含有各电影分组大小的Series对象

    ratings_by_title = data.groupby('title').size()
    
    active_titles = ratings_by_title.index[ratings_by_title >= 250]
    
    分组过后根据分组大小过滤不满足条件的数据

    标题索引中含有评分数据大于250条的电影名称,然后我们就可以据此从前面的mean_ratings中选取所需的行了:

    mean_ratings = mean_ratings.loc[active_titles]
    
    选取所需数据

    为了了解女性观众喜欢的电影,我们可以对F列降序排列:

    top_female_ratings = mean_ratings.sort_values(by='F', ascending=False)
    
    了解女性观众喜欢的电影

    计算评分分歧

    要找出男性和女性观众分歧大的电影。一个办法是给mean_ratings加上一个用于存放平均得分之差的列,并对其进行排序

    mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F']
    

    按”diff”排序即可得到分歧大且女性观众更喜欢的电影

    sorted_by_diff = mean_ratings.sort_values(by='diff')
    
    分歧大且女性观众更喜欢的电影

    对排序结果反序并取出前10行,得到的则是男性观众更喜欢的电影

    男性观众更喜欢的电影

    如果只是想要找出分歧⼤的电影(不考虑性别因素),则可以计算得分数据的方差或标准差, 在统计描述中,方差用来计算每一个变量(观察值)与总体均数之间的差异。

    # Standard deviation of rating grouped by title
    rating_std_by_title = data.groupby('title')['rating'].std()
    
    # Filter down to active_titles
    rating_std_by_title = rating_std_by_title.loc[active_titles]
    
    # Order Series by value in descending order 
    rating_std_by_title.sort_values(ascending=False)[:10] 
    
    分歧⼤的电影

    相关文章

      网友评论

      • 海子1964:技术专业性的文章发在csdn和cnblogs上比较好
        GHope:@链克玩家 嗯嗯

      本文标题:数据分析案例(MovieLens)

      本文链接:https://www.haomeiwen.com/subject/odllfqtx.html