国产烂片深度揭秘

2018-08-20  本文已影响0人  xl_07

一、项目背景:

本文以豆瓣电影评分的情况进行分析,揭秘国产烂片。从五个方面入手分析,首先是从整体分析,对电影评分分布及烂片情况有个整体的把握,接着从电影题材入手,分析最不受欢迎的电影题材,其次从电影出品国入手,研究与哪个国家合拍电影最容易产出烂片,再次分析烂片的比例是否与演员有关,最后分析不同导演每年产出电影数量的情况。

二、电影评分分布及烂片情况

豆瓣评分总体分布情况

从频率分布直方图及箱型图看出,豆瓣电影评分总体分布在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)

四、和什么国家合拍更可能产生烂片

合作电影大于等于3的国家

从上表可以看出与英国,新加坡,美国合拍产出的电影烂片比例最高,尤其是英国,烂片比例高达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,本文在可视化方面的工作做的相对不足,对于更深入的信息还有待进一步去挖掘分析。

上一篇下一篇

猜你喜欢

热点阅读