一、项目背景:
本文以豆瓣电影评分的情况进行分析,揭秘国产烂片。从五个方面入手分析,首先是从整体分析,对电影评分分布及烂片情况有个整体的把握,接着从电影题材入手,分析最不受欢迎的电影题材,其次从电影出品国入手,研究与哪个国家合拍电影最容易产出烂片,再次分析烂片的比例是否与演员有关,最后分析不同导演每年产出电影数量的情况。
二、电影评分分布及烂片情况
从频率分布直方图及箱型图看出,豆瓣电影评分总体分布在4-8分的范围,总体评价均值约为5.7分,说明观众对电影的好评率较低。
附代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
os.chdir('C:\\***\\国产烂片深度揭秘')
data=pd.read_excel('moviedata.xlsx')
data=data[data['豆瓣评分']>0]
fig=plt.figure(figsize=(10,6))
plt.subplots_adjust(hspace=0.3)
ax1=fig.add_subplot(2,1,1)
data['豆瓣评分'].plot.hist(stacked=True,bins=50,color='green',alpha=0.5)
plt.title('豆瓣评分数据分布直方图')
ax2=fig.add_subplot(2,1,2)
color=dict(boxes='DarkGreen',whiskers='DarkOrange',medians='DarkBlue',caps='Gray')
data['豆瓣评分'].plot.box(color=color,vert=False)
plt.title('豆瓣评分数据分布箱线图')
三、最不受欢迎的电影题材
图中点的大小代表样本数量,点越大代表该题材的电影样本数量越大,纵轴表示烂片比例。从图中可看出情色,恐怖及惊悚的题材烂片比例居高,拍电影进行选题材的时候需慎重;从样本数量可以看出,以喜剧及爱情为题材的电影数量居多,随着生活水平的提高,人们越来越追求高水平的生活,在工作压力及其他压力下,看喜剧也是一种较好的解压方式。喜剧及爱情为题材的电影数量虽较受欢迎,但总体来看烂片占30%多,在电影投入的时候需要了解观众的需求,从观众的角度出发。
附代码如下:
data['豆瓣评分'].describe()
#由描述性数据统计可以看出,处于25%分位数的评分数为4.3,由‘烂片标准'可得低于4.3分的都被评为烂片
from scipy import stats
u=data['豆瓣评分'].mean()
std=data['豆瓣评分'].std()
stats.kstest(data['豆瓣评分'],'norm',(u,std))
data_bad=data[data['豆瓣评分']<4.3]
data_bad.sort_values(by='豆瓣评分',ascending=True,inplace=True)
#烂片top20
data_bad[:20]
data_q2=data[data['类型'].notnull()]
type=[]
for i in data_q2['类型'].str.replace(' ',''):
a=i.split('/')
type.extend(a)
types=list(set(type))
lst_type_lp=[]
df_type=data[data['类型'].notnull()][['电影名称','豆瓣评分','类型']]
def frames(data,typei):
data_typelp={}
datai=data[data['类型'].str.contains(typei)]
prec=len(datai[datai['豆瓣评分']<4.3])/len(datai)
data_typelp['typename']=typei
data_typelp['typecount']=len(datai)
data_typelp['type_lp_pre']=prec
return (data_typelp)
for i in types:
dici=frames(df_type,i)
lst_type_lp.append(dici)
df_type_lp=pd.DataFrame(lst_type_lp)
df_type_lp20=df_type_lp.sort_values(by='type_lp_pre',ascending=False).iloc[:20]
from bokeh.plotting import figure,show,output_file
from bokeh.models import HoverTool
from bokeh.models import ColumnDataSource
source=ColumnDataSource(df_type_lp20)
hover=HoverTool(tooltips=[('数据量:','@typecount'),('烂片比例:','@type_lp_pre')])
df_type_lp20['size']=df_type_lp20['typecount']**0.5*2
p=figure(plot_height=400,plot_width=600,x_range=df_type_lp20['typename'].tolist(),tools=[hover,'reset,xwheel_zoom,pan,box_select'],title='不同电影题材烂片比例')
p.circle(x=df_type_lp20['typename'],y=df_type_lp20['type_lp_pre'],size=df_type_lp20['size'],fill_color='red',line_dash=[6,4],
source=source,fill_alpha=0.6)
show(p)
四、和什么国家合拍更可能产生烂片
从上表可以看出与英国,新加坡,美国合拍产出的电影烂片比例最高,尤其是英国,烂片比例高达75%.
附代码:
data_q3=data[data['制片国家/地区'].notnull()][['制片国家/地区','类型','豆瓣评分']]
data_q3=data[data['制片国家/地区'].str.replace(' ','').str.contains('中国大陆')]
country=[]
for i in data_q3['制片国家/地区'].str.replace(' ','').str.split('/'):
country.extend(i)
countrys=list(set(country))
countrys.remove('中国大陆')
countrys.remove('香港')
countrys.remove('台湾')
countrys.remove('中国')
lst_data=[]
def country_frame(data,country):
q3={}
datai=data[data['制片国家/地区'].str.contains(country)]
q3['loc_lp_pre']=len(datai[datai['豆瓣评分']<4.3])/len(datai)
q3['loccount']=len(datai)
q3['loc']=country
return (q3)
for i in countrys:
data3=country_frame(data_q3,i)
lst_data.append(data3)
dataq3=pd.DataFrame(lst_data)
#筛选合作电影大于等于3部以上的国家
q_3=dataq3[dataq3['loccount']>3]
q_3.sort_values(by='loc_lp_pre',ascending=False)
五、卡司数量是否和烂片有关
从上表可看出主演人数在1-2的电影烂片比例最低,其次是3-4人,说明一部电影的好评率还与电影主角人数有关,主演越多,关系越复杂,突显不了重点,显得杂乱。
代码如下:
d4=data[data['主演'].notnull()][['电影名称','主演','豆瓣评分']]
lt=[]
for i in d4['主演']:
a=len(i.replace(' ','').split('/'))
lt.append(a)
d4['主演人数']=lt
ranges=[]
for i in d4['主演人数']:
if i<3:
a='1-2人'
elif i<5:
a='3-4人'
elif i<7:
a='5-6人'
elif i<10:
a='7-9人'
else:
a='10人以上'
ranges.append(a)
d4['主演人数范围']=ranges
def data4_frame(data,zyrs):
q_4={}
data4=data[data['主演人数范围'].str.contains(zyrs)]
q_4['主演人数分布']=zyrs
q_4['烂片数量']=len(data4[data4['豆瓣评分']<4.3])
q_4['烂片比例']=(len(data4[data4['豆瓣评分']<4.3]))/len(data4)
q_4['电影数量']=len(data4)
return (q_4)
q4_lp=[]
for i in d4['主演人数范围'].unique().tolist():
lp=data4_frame(d4,i)
q4_lp.append(lp)
q4_end=pd.DataFrame(q4_lp)
data_rolelp=data[(data['主演'].notnull())&(data['豆瓣评分']<4.3)]
role=[]
for i in data_rolelp['主演'][data_rolelp['主演'].notnull()].str.replace(' ','').str.split('/'):
role.extend(i)
roles=list(set(role))
data_roles=data[data['主演'].notnull()]
data_q42=[]
for i in roles:
datai=data_roles[data_roles['主演'].str.contains(i)]
if len(datai)>2:
data_role_lp={}
data_role_lp['role']=i
data_role_lp['rolecount']=len(datai)
data_role_lp['lppre']=len(datai[datai['豆瓣评分']<4.3])/len(datai)
data_q42.append(data_role_lp)
role_lp=pd.DataFrame(data_q42)
role_lptop20=role_lp.sort_values(by=['lppre'],ascending=False)[:20]
六、不同导演每年电影产量情况
邓衍成出品的电影数量在2006年期间最多,其次是2009年和2010年期间,在09年产出的电影好评均分达7.7分,然后是06年产出的电影均分达7分。10年之后出品的电影数量越来越少,评分也越来越低,这里需要进一步分析原因。
上表得出的数据已排除电影产量在10次以下的导演,由表得出王晶导演的烂片比例最高,高达21.05%。
附代码:
data51=data[data['上映日期'].notnull()][['电影名称','导演','豆瓣评分','上映日期']]
data51=data51[data51['导演'].notnull()]
data51['年份']=data51['上映日期'].str.replace(' ','').str[:4]
data51=data51.drop(data51['年份']=='不详')
data51=data51.drop(data51['年份']=='暂无')
data51['年份']=data51['年份'].astype(int)
#② 查看不同导演的烂片比例、这里去除掉拍过10次电影以下的导演
lst_director=[]
for i in data51['导演'].str.replace(' ','').str.split('/'):
lst_director.extend(i)
director=list(set(lst_director))
direct_lp=data51[data51['豆瓣评分']<4.3]
l_p=[]
for i in director:
datai=data51[data51['导演'].str.contains(i)]
if len(datai)>10:
dirlp={}
dirlp['导演']=i
dirlp['count']=len(datai)
dirlp['lp_pre']=len(datai[datai['豆瓣评分']<4.3])/len(datai)
l_p.append(dirlp)
data52=pd.DataFrame(l_p)
#③ 查看不同导演每年的电影产量制作散点图 → 横坐标为年份,纵坐标为每年电影平均分,点大小该
def dirt(data,direct):
datai=data[data['导演'].str.contains(direct)]
group1=datai[['年份','电影名称']].groupby(by=['年份']).count()
group2=datai[['年份','豆瓣评分']].groupby(by=['年份']).mean()
data53=pd.merge(group1,group2,left_index=True,right_index=True)
data53.columns=['count','score']
data53['size']=data53['count']*5
return(data53)
dirt1=dirt(data51,'王晶')
dirt2=dirt(data51,'周伟')
dirt3=dirt(data51,'徐克')
dirt4=dirt(data51,'邓衍成')
from bokeh.plotting import figure,show,output_file
from bokeh.models import HoverTool
from bokeh.models import ColumnDataSource
hover=HoverTool(tooltips=[('该年电影均分','@score'),
('该年电影产量','@count')])
p=figure(plot_width=600,plot_height=400,tools=[hover,'reset,xwheel_zoom,pan'])
source=ColumnDataSource(dirt1)
p.circle(x='年份',y='score',source=source,color='red',legend='王晶',size='size',fill_alpha=0.5)
source1=ColumnDataSource(dirt2)
p.circle(x='年份',y='score',source=source1,color='blue',legend='周伟',size='size',fill_alpha=0.5)
source2=ColumnDataSource(dirt3)
p.circle(x='年份',y='score',source=source2,color='gray',legend='徐克',size='size',fill_alpha=0.5)
source3=ColumnDataSource(dirt4)
p.circle(x='年份',y='score',source=source3,color='green',legend='邓衍成',size='size',fill_alpha=0.5)
show(p)
本文纯属练手文章,旨在通过项目的练习提高数据分析的技能,更熟练的掌握Python,本文在可视化方面的工作做的相对不足,对于更深入的信息还有待进一步去挖掘分析。