七仔的博客

七仔的博客GithubPages分博

0%

豆瓣电影分析

分析了豆瓣电影数据并进行可视化,分析的数据有评论数量、评分、时长、电影类型、评分星级

豆瓣电影分析

依据上一篇Scrapy豆瓣整站爬虫中的电影数据进行分析

首先分析时长、评分、评论数量之间的关系:

关系1

关系2

关系3

可以分析得:

当电影时长和评分越高,评论数量相对越多

但时长和评分没有什么关系

接下来是电影类型的数量分析

分析

可以看到剧情片一马当先,戏剧和动作紧随其后

最后是评分星级的比例:

星级比例

一星二星只占11.8%,其余的多评四星,或在上下浮动

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import pymysql
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']


# 从MySQL导入数据
con = pymysql.connect(host='127.0.0.1', user='root', passwd='root', db='python', charset='utf8')
cur = con.cursor()
df = pd.read_sql('SELECT * FROM doubanvideo WHERE '
'genre != "" AND '
'runtime != "" AND '
'average_count != "" '
'AND average != "" AND '
'star_1 != "" AND '
'star_2 != "" AND '
'star_3 != "" AND '
'star_4 != "" AND '
'star_5 != "";', con=con)
con.close()

# 时长和评论数量之间的关系
df['runtime'] = df['runtime'].str.replace(r'( *)分钟(.*)', "")
df['runtime'] = df['runtime'].str.replace(r'[a-zA-Z]+:( *)', "")
frame = DataFrame(df)
fig,ax = plt.subplots()
ax.scatter(frame['runtime'], frame['average_count'])
ax.set_xlabel('runtime')
ax.set_ylabel('average_count')
plt.show()
plt.close()


# 时长和评分之间的关系
df['runtime'] = df['runtime'].str.replace(r'( *)分钟(.*)', "")
df['runtime'] = df['runtime'].str.replace(r'[a-zA-Z]+:( *)', "")
frame = DataFrame(df)
fig,ax = plt.subplots()
ax.scatter(frame['runtime'], frame['average'])
ax.set_xlabel('runtime')
ax.set_ylabel('average')
plt.show()
plt.close()


# 评分和评论数量之间的关系
frame = DataFrame(df)
fig,ax = plt.subplots()
ax.scatter(frame['average'], frame['average_count'])
ax.set_xlabel('average')
ax.set_ylabel('average_count')
plt.show()
plt.close()

# 电影类型的柱形图
types = {}
frame = DataFrame(df)
for genre in frame['genre']:
strs = genre.split(" ")
for s in strs:
if types.get(s) is None:
types[s] = 1
else:
types[s] += 1
blist = [] # 定义两个列表
clist = []
list = sorted(types.items(), key=lambda item: item[1]) # 得到的是一个list,list中的元素是tuple
for i in list:
blist.append(i[0]) # 把元组中的第一个值添加到blist列表中
clist.append(i[1]) # 把元组中的第二个值添加到clist列表中
plt.rcParams['figure.figsize'] = (10.0, 4.0) # 设置figure_size尺寸
plt.bar(range(len(blist)), clist, tick_label=blist) # 第一个参数为x轴元素的个数,第二个元素为y轴的值,第三个元素为x轴各元 素的值
plt.show()


# 五个评价等级的比例,数据库星级顺序反了。。。
star_1 = DataFrame(df['star_5'].str.replace(r'%', ""), dtype='float').mean()
star_2 = DataFrame(df['star_4'].str.replace(r'%', ""), dtype='float').mean()
star_3 = DataFrame(df['star_3'].str.replace(r'%', ""), dtype='float').mean()
star_4 = DataFrame(df['star_2'].str.replace(r'%', ""), dtype='float').mean()
star_5 = DataFrame(df['star_1'].str.replace(r'%', ""), dtype='float').mean()
labels = '1 star', '2 star', '3 star', '4 star', '5 star'
sizes = [star_1, star_2, star_3, star_4, star_5]
explode = (0, 0, 0, 0, 0)
fig1, ax1 = plt.subplots()
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)
ax1.axis('equal')
plt.show()

此为博主副博客,留言请去主博客,转载请注明出处:https://www.baby7blog.com/myBlog/27.html

欢迎关注我的其它发布渠道