原始数据:20世纪90年代末到20世纪初由MovieLens用户提供的电影评分数据,包括三个表,电影评分,电影信息(年代和风格)以及用户信息(年龄,邮编,性别和职业等),数据存储类型为.dat
分析目的:
1、想知道评分排名前十和后十的电影都是什么?
2、想知道不同的年龄段喜欢的电影风格分别是什么?
3、想知道男性和女性分别最喜欢和最讨厌的电影是哪部?
数据加载:
unames = ['user_id','gender','age','occupation','zip'] rnames = ['user_id','movie_id','rating','timestamp'] mnames = ['movie_id','title','genres']
#前面三行指定将数据家加载进来以后的列名。 ratings =pd.read_table('C:/Users/yuqi/PycharmProjects/unit2/movielens/ratings.dat',sep = '::',names = rnames) users = pd.read_table('C:/Users/yuqi/PycharmProjects/unit2/movielens/users.dat',sep = '::',names = unames) movies = pd.read_table('C:/Users/yuqi/PycharmProjects/unit2/movielens/movies.dat',sep = '::',names = mnames)
#因为read_table指定的分隔符为\t(换行符),而文本中不同字符之间是用::隔开的,所以如果想用read_table加载的话,需要自己指定分隔符。
数据清理:
检查每个表中是否有重复值和空缺值。
ratings.duplicated()
users.duplicated()
movies.duplicated()
ratings.isnull()
users.isnull()
movies.isnull()
数据分析:
1、想知道排名前十和后十的电影的信息以及评分观众相关信息。
data=pd.merge(movies,pd.merge(users,ratings,on = 'user_id'),on = 'movie_id')#因为排名信息,电影信息以及用户信息是分散在三个表中的,所以需要将三个表根据它们共同的键联结,一般不用指定on和how,on表示用于联结的公共键,how表示联结方式,外联结内连接。
new_movies = data.sort_values('rating',asscending = 'False')#将这个表按照rating这一列排序,降序排列。
top_movies = new_movies[:10]#取排名前十的电影
bottom_movies = new_movies[-10:]#取排名后十的电影
2、想得到一个数据透视表,包含每一部电影男女评分的平均值,以及同一部电影的平均分,男女分别给所有电影的平均分。
mean_rating = data.pivot_table('rating',columns = 'gender',index = 'title',aggfunc = 'mean',margins = True)
#'rating'表示用于做透视表分析对象的列,一般不指定的话会将所有数值列作为分析对象 #index表示透视表的行 #columns表示透视表的列 #aggfunc表示对分析对象进行的分析,一般默认为求平均值,可以指定 #margins表示添加每行每列求和的值,默认不添加。
3、想过滤掉评分条目数不足250条的电影
ratings_by_size = data,groupby('title').size()
active_titles = ratings_by_size.index[ratings_by_size >= 250]
4、从数据透视表中过滤掉评分条数小于250条的电影
active_movies = mean_rating.ix[active_titles]
5、在数据透视表中过滤掉评分条目数小于250条的电影。
active_mean_rating = mean_rating.ix[active_titles] print(active_mean_rating) 6、因为在第1步中得到的排名前十的电影仅仅是某个用户对电影的评分,而实际上对平均分进行排名才比较可靠。
#从透视表中得到女性观众和男性最喜欢的10部电影。 female_top_movies = active_mean_rating.sort_values('F',ascending = False) print(female_top_movies[:10]) male_top_movies = active_mean_rating.sort_values('M',ascending=False) print(male_top_movies[:10])
6、得到男女评分差别最大的十部电影
active_mean_rating['diff'] = active_mean_rating['F'] - active_mean_rating['M']#要想在数据透视表中添加一列,直接用表名['列名']就可以了。 sorted_by_diff = active_mean_rating.sort_values('diff',ascending=False) print(sorted_by_diff[:10])7、找出总体评分分歧最大的十部电影,不考虑性别因素
rating_std_by_tilte = data.groupby('title')['rating'].std() print(rating_std_by_tilte) active_rating = rating_std_by_tilte.ix[active_titles] a= active_rating.sort_values(ascending=False)[:10] print(a)