Python数据分析豆瓣电影Top250 |
您所在的位置:网站首页 › python电影数据分析报告 › Python数据分析豆瓣电影Top250 |
初学数据分析,这次就来分析一下电影信息。豆瓣电影的实战项目网上文章也不少,不过还是要自己操作一下才能理解得更深刻一点,也顺便了解一下这些电影的特点。 项目涉及的是一个特殊的电影排行榜,能上榜的想必都是非常受欢迎的电影,毕竟豆瓣上的评分还有热度都是很有参考性的。所以在这里对这个排行榜的排列标准探索一下,当然也只是粗略地分析。 豆瓣用户每天都在对“看过”的电影进行“很差”到“力荐”的评价,豆瓣根据每部影片看过的人数以及该影片所得的评价等综合数据,通过算法分析产生豆瓣电影 Top 250。 数据提取首先分析一下网页信息,排行榜地址:https://movie.douban.com/top250。 我是采用 requests 库发送请求来获取网页,然后用 BeautifulSoup 库分析页面来获取信息。 获取请求没什么限制,甚至不需要加headers头信息,只需要把链接确认好:url = ‘https://movie.douban.com/top250?start={}&filter=’,start后面是25的倍数。分析页面就有一点麻烦,难在导演、演员和年份处在同一个 标签内,而且分离这些信息的时候无法用同一个标准,因为有些电影并没有完全给出信息,所以花了些时间在这个上面。 每个页面所有电影列表是放在一个 class=‘grid_view’ 的 标签中的,这个标签下的每一个 标签就是每一部电影信息的Item。我采用的是BeautifulSoup库中的 css 选择方法,每个页面只有一个 标签: for list in range(10): movie_content = requests.get(movie_url.format(list * 25)).text soup = BeautifulSoup(movie_content, 'lxml') for li in soup.select('ol li'): movie_num = li.select('em')[0].string movie_name = li.select('.title')[0].string movie_info = li.select('.bd .')[0].get_text().lstrip().rstrip().split('\xa0/\xa0') movie_year = movie_info[0].split()[-1] movie_country = movie_info[1] movie_type = movie_info[2] movie_director = movie_info[0].split()[1] movie_assess = li.select('.star span')[-1].string[:-3] movie_score = li.select('.star span')[1].string writer.writerow([ movie_num, movie_name, movie_year, movie_country, movie_type, movie_director, movie_assess, movie_score ])只需要采用 select() 方法就可以一步步提取,只不过要注意好结果是Beautiful对象还是列表、字符串。这也是上面代码中不断出现 [ ]、string 和 [ : ] 的原因。 最后会把所有信息都存入一个 csv文件,也是为了后面数据提取得更方便。要注意的是,如果在Windows上面直接打开这个csv文件会出现乱码,因为我采用的是 UTF-8 编码,想要生成可以正常显示的信息可以在 open() 中把编码改成 gb18030。 数据分析 数据导入 import pandas as pd df = pd.read_csv('movies.csv', encoding='utf-8') print(df.head())为了看清楚,这里用表格展示出来: 0名称年份国家类型导演评价人数评分01肖申克的救赎1994美国犯罪 剧情弗兰克·德拉邦特13224319.612霸王别姬1993中国大陆 香港剧情 爱情 同性陈凯歌9765649.623这个杀手不太冷1994法国剧情 动作 犯罪吕克·贝松12111479.434阿甘正传1994美国剧情 爱情罗伯特·泽米吉斯10418969.445美丽人生1997意大利剧情 喜剧 爱情 战争罗伯托·贝尼尼6094599.5 重复值检查 print(df.duplicated().value_counts())得到: False 250 dtype: int64检查是否有重名电影: print(len(df.名称.unique()))得到: 250 分析同一上映年份的电影数量 print(df["年份"].value_counts().head())这里以表格形式展示: Name: 年份dtype: int64201014200412199411201110201310 分析制片国家有些电影由多个国家或地区联合制作的 area_split = df['国家'].str.split(' ').apply(pd.Series) print(area_split.head())这里以表格形式展示: 0123450美国NaNNaNNaNNaNNaN1中国大陆香港NaNNaNNaNNaN2法国NaNNaNNaNNaNNaN3美国NaNNaNNaNNaNNaN4意大利NaNNaNNaNNaNNaN可以看到,有些电影甚至有6个国家或地区参与制作,对于这么多的空值,可以通过先按列计数,将空值 NaN 替换为 ‘0’,再按行汇总。 all_country = area_split.apply(pd.value_counts).fillna('0')所有的 NaN 都会替换成 ‘0’,以便于后面的统计,接下来计算每个国家参与制作电影总数排名情况: all_country.columns = ['area1', 'area2', 'area3', 'area4', 'area5', 'area6'] all_country['area1'] = all_country['area1'].astype(int) all_country['area2'] = all_country['area2'].astype(int) all_country['area3'] = all_country['area3'].astype(int) all_country['area4'] = all_country['area4'].astype(int) all_country['area5'] = all_country['area5'].astype(int) all_country['area6'] = all_country['area6'].astype(int) all_country['all_counts'] = all_country['area1'] + all_country['area2']\ + all_country['area3'] + all_country['area4']\ + all_country['area5'] + all_country['area6'] all_country.sort_values(['all_counts'], inplace = True, ascending=False) # 降序 print(all_country.head())得到一个国家或地区参与制作电影数的排名总情况,这里以表格形式展示: area1area2area3area4area5area6all_counts美国122142510144日本322000034英国1515400034香港196000025法国99210021顺便根据最后的总数据画出直方图: import matplotlib import matplotlib.pyplot as plt matplotlib.rcParams['font.family'] = 'SimHei' #配置中文字体 matplotlib.rcParams['font.size'] = 15 # 更改默认字体大小 country = pd.DataFrame({'国家':all_country['all_counts']}) country.sort_values(by='国家', ascending=False).plot(kind='bar', figsize=(10,7)) plt.show()得到: 统计每个类型在这些电影中出现的次数,这里以表格形式展示: tpye1type2type3type4type5all_counts剧情16422500191爱情237180057冒险652014247喜剧242300047犯罪122363044顺便根据最后的总数据画出直方图: movie_type = pd.DataFrame({'数量':all_type['all_counts']}) movie_type.sort_values(by='数量', ascending = False).plot(kind ='bar', figsize = (10,6)) plt.show()得到: 这里以表格形式展示: Name: 导演dtype: int64克里斯托弗·诺兰7宫崎骏7史蒂文·斯皮尔伯格5王家卫5李安4可以见识一下大导演的风采,以后看他们拍的电影想必不会失望的。 评分与排名的关系既然想探索一下排名究竟与各项指标有什么联系,就要分别与排名比较一下,当然这里只是举几个例子,更多的比较方法可以自己探索一下。先看一下评分: # 评分和排名的关系散点图 plt.figure(figsize=(14,6)) plt.subplot(1,2,1) plt.scatter(df['评分'], df['0']) plt.xlabel('评分') plt.ylabel('排名') plt.gca().invert_yaxis() #修改y轴为倒序 # 评分数量直方图 plt.subplot(1,2,2) plt.hist(df['评分'], bins=14) plt.xlabel('评分') plt.ylabel('出现次数') plt.show()结果: 结果: 只做了一下初步分析,感兴趣的可以再深入探索。 代码的Github地址:https://github.com/Stevengz/Douban_movies_top250 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |