觀影大數據分析


王 S 聰想要在海外開拓萬 D 電影的市場,這次他在考慮:怎么拍商業電影才
能賺錢?畢竟一些制作成本超過 1 億美元的大型電影也會失敗。這個問題對電影
業來說比以往任何時候都更加重要。 所以,他就請來了你(數據分析師)來幫
他解決問題,給出一些建議,根據數據分析一下商業電影的成功是否存在統一公
式?以幫助他更好地進行決策。
解決的終極問題是: 電影票房的影響因素有哪些?
接下來我們就分不同的維度分析:
• 觀眾喜歡什么電影類型?有什么主題關鍵詞?
• 電影風格隨時間是如何變化的?
• 電影預算高低是否影響票房?
• 高票房或者高評分的導演有哪些?
• 電影的發行時間最好選在啥時候?
• 拍原創電影好還是改編電影好?
本次使用的數據來自於 Kaggle 平台(TMDb 5000 Movie Database)。收錄了
美國地區 1916-2017 年近 5000 部電影的數據,包含預算、導演、票房、電影評
分等信息。原始數據集包含 2 個文件:
• tmdb_5000_movies:電影基本信息,包含 20 個變量
• tmdb_5000_credits:演職員信息,包含 4 個變量
請使用 Python 編程,完成下列問題:
(1)使用附件中的 tmdb_5000_movies .csv 和 tmdb_5000_credits .csv 數據集,進
行數據清洗、數據挖掘、數據分析和數據可視化等,研究電影票房的影響因素有
哪些?從不同的維度分析電影,討論並分析你的結果。
(2)附件 tmdb_1000_predict.csv 中包含 1000 部電影的基本信息,請你選擇
合適的指標,進行特征提取,建立機器學習的預測模型,預測 1000 部電影的
vote_average 和 vote_count,並保存為 tmdb_1000_predicted.csv。

 

首先是數據清洗:在愛數科上進行

2.數據清洗
1.導入數據
2.缺失值處理
缺失記錄僅 3941條,采取網上搜索,補全信息。

2.1 補全 release_date

缺失記錄的電影標題為《America Is Still the Place》,日期為  2014-06-01。

2.2 補全 runtime

1. Chiamatemi Francesco - Il Papa della gente

2. To Be Frank, Sinatra at 100

缺失記錄的電影 runtime 分別為94min 和81min。

3 重復值處理

運行結果:有0個不重復的 id,可以認為沒有重復數據。

4 日期值處理

將release_date列轉換為日期類型:(兩種方式)

def changeRelease_date():
    df['release_date'] = pd.to_datetime(df['release_date'])

5 篩選數據

使用數據分析師最喜歡的一個語法:

票房、預算、受歡迎程度、評分為負數或者0的數據應該去除;

 

       五個不為負數或者0篩選條件,進行篩選

評分人數過低的電影,評分不具有統計意義,篩選評分人數大於178的數據。

此時剩余___2422___條數據,包含___20___個字段。

6 json 數據轉換

**說明:**genres,keywords,production_companies,production_countries,cast,crew 這6列都是json 數據,需要處理為列表進行分析。

處理方法:

json 本身為字符串類型,先轉換為字典列表,再將字典列表轉換為,以’,'分割的字符串

json_column = ['genres', 'keywords', 'production_companies', 'production_countries', 'cast', 'crew']
for i in json_column:
    df[i] = df[i].apply(json.loads)
def get_name(x):
    return ','.join([i['name'] for i in x])
df['cast'] = df['cast'].apply(get_name)
def get_director(x):
    for i in x:
        if i['job'] == 'Director':
            return i['name']
df['crew'] = df['crew'].apply(get_director)
for j in json_column[0:4]:
    df[j] = df[j].apply(get_name)
rename_dict = {'cast': 'actor', 'crew': 'director'}
df.rename(columns=rename_dict, inplace=True)
df.info()
print(df.head(5).genres)
print(df.head(5).keywords)
print(df.head(5).production_companies)
print(df.head(5).production_countries)
print(df.head(5).actor)
print(df.head(5).director)

7 數據備份

df_copy = df.copy()
df.reset_index().to_csv("copy.csv")

 

數據清洗over


 

5 數據分析

5.1 why

想要探索影響票房的因素,從電影市場趨勢,觀眾喜好類型,電影導演,發行時間,評分與

關鍵詞等維度着手,給從業者提供合適的建議。

5.2 what

5.2.1 電影類型:定義一個集合,獲取所有的電影類型

genre = set()
for i in df['genres'].str.split(','): 
    genre = set().union(i,genre)    
print(genre)

注意到集合中存在多余的元素:空的單引號,所以需要去除。

5.2.1.1 電影類型數量(繪制條形圖)

采用pyecharts畫圖

def MovieType():
    movie_genres = []
    genres = df['genres'].values.tolist()
    for genre in genres:
        genre_list = genre.split(',')
        for i in genre_list:
            movie_genres.append(i)
    movie_type = pd.DataFrame(movie_genres, index=None, columns=['type'])
    df_grp = movie_type.apply(pd.value_counts)
    diary_type = dict(zip(df_grp.index.values.tolist(), df_grp['type'].tolist()))
    d_order = sorted(diary_type.items(), key=lambda x: x[1], reverse=False)
    keys = []
    values = []
    for key, value in d_order:
        keys.append(key)
        values.append(value)
    bar = Bar(init_opts=opts.InitOpts(width="100%"))
    bar.add_xaxis(keys)
    bar.add_yaxis("電影類型數量", values)
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position='right'))
    bar.reversal_axis()
    bar.set_global_opts(title_opts=opts.TitleOpts(title="電影類型數量"))
    page.add(bar)

5.2.1.2 電影類型占比(繪制餅圖)

def MovieTypePie():
    movie_genres = []
    genres = df['genres'].values.tolist()
    for genre in genres:
        genre_list = genre.split(',')
        for i in genre_list:
            movie_genres.append(i)
    movie_type = pd.DataFrame(movie_genres, index=None, columns=['type'])
    df_grp = movie_type.apply(pd.value_counts)
    pie = Pie(init_opts=opts.InitOpts(width="100%", height="700px"))
    pie.add("", [list(z) for z in zip(df_grp.index.values.tolist(),
                                      df_grp['type'].tolist())])  # zip函數兩個部分組合在一起list(zip(x,y))-----> [(x,y)]
    pie.set_global_opts(title_opts=opts.TitleOpts(title="電影類型占比"))  # 標題
    pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))  # 數據標簽設置

    pie.render('first_bar.html')
    page.add(pie)

5.2.1.3 電影類型變化趨勢(繪制折線圖)

def MovieTrend():
    genre = set()
    for i in df['genres'].str.split(','):
        genre = set().union(i, genre)
    print(genre)
    genre_list = list(genre)
    genre_df = pd.DataFrame()
    for i in genre_list:
        genre_df[i] = df['genres'].str.contains(i).apply(lambda x: 1 if x else 0)
    df['release_year'] = pd.to_datetime(df.release_date, format='%Y-%m-%d', errors='coerce').dt.year
    genre_df.index = df['release_year']
    gen_year_sum = genre_df.sort_index(ascending=False).groupby('release_year').sum()
    year = []
    for i in df['release_year'].sort_values().drop_duplicates().tolist():
        year.append(str(i))
    line = Line(init_opts=opts.InitOpts(width="100%"))
    line.add_xaxis(xaxis_data=year)
    y1 = [100, 200, 300, 400, 100, 400, 300]
    for i in genre_list:
        line.add_yaxis(series_name=i, y_axis=gen_year_sum[i])
    line.set_global_opts(title_opts=opts.TitleOpts(title="電影類型變化趨勢", ))
    line.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    line.render_notebook()
    page.add(line)

5.2.1.4 不同電影類型預算/利潤(繪制組合圖)

def Budget():
    df["type"] = df["genres"].str.split(",")
    df_explode = df.explode("type")
    df_all = df_explode.groupby(['type']).mean()  # 求平均值
    budget = df_all['budget'].round(2)
    revenue = df_all['revenue'].round(2)
    bili = list((revenue / budget).round(2))
    bud = list(budget)
    rev = list(revenue)
    budg = []
    reve = []
    for i in bud:
        budg.append(round(i / 100000000, 2))
    for i in rev:
        reve.append(round(i / 100000000, 2))
    diary_budget = dict(zip(df_all.index.values.tolist(), bili))
    d_order = sorted(diary_budget.items(), key=lambda x: x[1], reverse=False)
    keys = []
    values = []
    for key, value in d_order:
        keys.append(key)
        values.append(value)
    line = (
        Line(init_opts=opts.InitOpts(width="100%", theme=ThemeType.LIGHT))  # 這里可以選擇主題
            .add_xaxis(df_all.index.values.tolist())
            .add_yaxis("利潤/預算", bili, stack="stack1", yaxis_index=1)
            .extend_axis(
            yaxis=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(formatter="{value}%")
            )
        )
            .set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='right'))
            .set_global_opts(
            title_opts=opts.TitleOpts(title="不同電影類型預算/利潤"),
            yaxis_opts=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(formatter="{value}/千萬")
            ),
            tooltip_opts=opts.TooltipOpts(
                is_show=True, trigger="axis", axis_pointer_type="cross"
            ),
            xaxis_opts=opts.AxisOpts(
                type_="category",
                axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
                axislabel_opts=opts.LabelOpts(rotate=-15)
            )

        )
    )
    bar = Bar()
    bar.add_xaxis(df_all.index.values.tolist()).add_yaxis("平均預算", budg, stack="stack1").add_yaxis("平均利潤", reve,
                                                                                                  stack="stack1")
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='left'))
    line.overlap(bar)
    page.add(line)

5.2.2 電影關鍵詞(keywords 關鍵詞分析,繪制詞雲圖)

def KeywordsWordcloud():
    movie_keywords = []
    genres = df['keywords'].values.tolist()
    for genre in genres:
        genre_list = str(genre).split(',')
        for i in genre_list:
            item = changeStr(i)
            if item:  # 為空列表  濾掉
                movie_keywords.append(item)
    movie_type = pd.DataFrame(movie_keywords, index=None, columns=['type'])
    df_grp = movie_type.apply(pd.value_counts)
    diary_type = dict(zip(df_grp.index.values.tolist(), df_grp['type'].tolist()))
    d_order = sorted(diary_type.items(), key=lambda x: x[1], reverse=False)
    mywordcloud = WordCloud(init_opts=opts.InitOpts(width="100%"))
    mywordcloud.add('', d_order, shape='circle')
    page.add(mywordcloud)

5.3 when

查看 runtime 的類型,發現是 object 類型,也就是字符串,所以,先進行數據轉化。

print(df.runtime)

先將其轉換為數值類型,int

df.runtime = df.runtime.astype(int)
print(df.runtime))

5.3.1 電影時長(繪制電影時長直方圖)

直方圖pyecharts畫不了

所以使用matplotlib畫

def RunTime():
    df.runtime = df.runtime.astype(float)
    sns.set_style('white')
    movie_duration = df.runtime
    plt.figure(figsize=(20, 8), dpi=100)
    # 設置組距
    distance = 5
    group_num = int((max(movie_duration) - min(movie_duration)) / distance)
    # 計算組數
    # 繪制直方圖用 數據、組數 兩個參數
    plt.hist(movie_duration, bins=group_num)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.xticks(range(int(min(movie_duration)), int(max(movie_duration)))[::5])
    plt.grid(linestyle='--', alpha=0.5)
    plt.xlabel('電影時長大小')
    plt.ylabel('電影的數據量')
    plt.savefig('img/電影時長直方圖.png')
    plt.show()

5.3.2 發行時間(繪制每月電影數量和單片平均票房)

def MonthAnalyse():
    df['release_month'] = pd.to_datetime(df.release_date, format='%Y-%m-%d', errors='coerce').dt.month
    df_revenue = df.groupby(['release_month']).revenue.mean()
    df_number = df.groupby(['release_month']).size()
    x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
    y2 = []
    for k in df_revenue.tolist():
        y2.append(round(k / 1000000, 2))
    bar = Bar(init_opts=opts.InitOpts(width="100%", theme=ThemeType.MACARONS))
    bar.add_xaxis(x)
    bar.add_yaxis("電影數量", df_number.values.tolist())
    bar.add_yaxis("單片平均票房/百萬", y2)
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='right'))
    bar.set_global_opts(title_opts=opts.TitleOpts(title="每月電影數量和單片平均票房"))
    page.add(bar)

5.4 where

本數據集收集的是美國地區的電影數據,對於電影的制作公司以及制作國家,在本次的故事背景下不作分析。

5.5 who

5.5.1 分析票房分布及票房 Top10 的導演

def RevenueSpread():
    # dr['name'] = dr['name'].apply(lambda x: ',' + x)
    # dr1 = dr.groupby(by='movie_id').sum()
    #
    # dr1['name'] = dr1['name'].apply(lambda x: x[1:])
    # dr1.to_csv("dire.csv")
    # print(dr1)
    sns.set_style('white')
    movie_duration = df['revenue']
    ss = []
    for i in movie_duration.values.tolist():
        ss.append(round(i / 100000000, 2))
    print(ss)
    plt.figure(figsize=(20, 8), dpi=100)
    # 設置組距
    distance = 5
    group_num = int(max(ss) - min(ss))
    # 計算組數
    # 繪制直方圖用 數據、組數 兩個參數
    plt.hist(ss, bins=group_num)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.xticks(range(int(min(ss)), int(max(ss)))[::1])
    plt.grid(linestyle='--', alpha=0.5)
    plt.xlabel('電影票房/億')
    plt.ylabel('電影的數據量')
    plt.savefig('img/票房分布.png')
    plt.show()

    dr_sort = dr.groupby('name').sum().sort_values(by='revenue', ascending=False)
    dr_top10 = dr_sort.head(10).sort_values(by='revenue', ascending=True)
    piaofang = []
    for i in dr_top10['revenue'].values.tolist():
        piaofang.append(round(i / 100000000, 2))
    bar = Bar(init_opts=opts.InitOpts(width="100%"))
    bar.add_xaxis(dr_top10.index.values.tolist())
    bar.add_yaxis("總票房/億", piaofang)
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position='right'))
    bar.reversal_axis()
    bar.set_global_opts(title_opts=opts.TitleOpts(title="Top10導演"))
    page.add(bar)

 

 

 

5.5.2 分析評分分布及評分 Top10 的導演

def VoteSpread():
    sns.set_style('white')
    movie_average = df['vote_average']
    print(movie_average)
    plt.figure(figsize=(20, 8), dpi=100)
    # 設置組距
    distance = 5
    group_num = int((max(movie_average) - min(movie_average)))
    # 計算組數
    # 繪制直方圖用 數據、組數 兩個參數
    plt.hist(movie_average, bins=group_num)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.xticks(range(0, 10)[::1])
    plt.grid(linestyle='--', alpha=0.5)
    plt.xlabel('電影評分')
    plt.ylabel('電影的數據量')
    plt.savefig('img/評分分布.png')
    plt.show()

    dr_sort = dr.groupby('name').mean().sort_values(by=['vote_average', 'vote_count'], ascending=False)
    print(dr_sort['vote_average'].head(10))
    dr_top10 = dr_sort.head(10).sort_values(by='vote_average', ascending=True)
    bar = Bar(init_opts=opts.InitOpts(width="100%", theme=ThemeType.LIGHT))
    bar.add_xaxis(dr_top10.index.values.tolist())
    bar.add_yaxis("評分", dr_top10['vote_average'].values.tolist())
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position='right'))
    bar.reversal_axis()
    bar.set_global_opts(title_opts=opts.TitleOpts(title="評分Top10導演"))
    page.add(bar)

發現數據中大多數電影都是8分,沒有小數位,導致統計結果出現相同情況,所以按照在評分為8的前提下,根據popularity又進行了一次排序

 

 

 

5.6 how

5.6.1 原創 VS 改編占比(餅圖)

def getBaseOnNovel():
    count = 0
    for i in df['keywords'].values.tolist():
        print(i)
        if "based on novel" in str(i):
            count = count + 1
    print((len(df.values.tolist()) - count) / len(df.values.tolist()))
    pie = Pie(init_opts=opts.InitOpts(width="100%", height="700px"))
    name = ["原創", "改編"]
    value = [len(df.values.tolist()) - count, count]

    pie.add("", [list(z) for z in zip(name, value)])  # zip函數兩個部分組合在一起list(zip(x,y))-----> [(x,y)]
    pie.set_global_opts(title_opts=opts.TitleOpts(title="原創 VS 改編"))  # 標題
    pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))  # 數據標簽設置

    pie.render('first_bar.html')
    page.add(pie)

5.6.2 原創 VS 改編預算/利潤率(組合圖)

def getLilv():
    count = 0
    var = df[df['keywords'].str.contains('based on novel', na=True)]
    df_based = var.sum()
    df_all = df.sum()
    based_budg = df_based['budget']
    based_reve = df_based['revenue']
    ori_budg = df_all['budget'] - df_based['budget']
    ori_reve = df_all['revenue'] - df_based['revenue']
    yusuan = [round(ori_budg / (df.shape[0] - var.shape[0]) / 10000000, 2),
              round((based_budg / var.shape[0]) / 10000000, 2)]
    lirun = [round(ori_reve / (df.shape[0] - var.shape[0]) / 10000000, 2),
             round((based_reve / var.shape[0]) / 10000000, 2)]
    lilv = [round(ori_reve / ori_budg, 2), round(based_reve / based_budg, 2)]
    line = (
        Line(init_opts=opts.InitOpts(width="50%", theme=ThemeType.LIGHT))  # 這里可以選擇主題
            .add_xaxis(['原創', '改編'])
            .add_yaxis("利潤率", lilv, stack="stack1", yaxis_index=1)
            .extend_axis(
            yaxis=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(formatter="{value}%")
            )
        )
            .set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='right'))
            .set_global_opts(
            title_opts=opts.TitleOpts(title="原創 VS 改編預算/利潤率"),
            yaxis_opts=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(formatter="{value}/千萬")
            ),
            tooltip_opts=opts.TooltipOpts(
                is_show=True, trigger="axis", axis_pointer_type="cross"
            ),
            xaxis_opts=opts.AxisOpts(
                type_="category",
                axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
            )

        )
    )
    bar = Bar()
    bar.add_xaxis(['原創', '改編']).add_yaxis("平均預算", yusuan, stack="stack1").add_yaxis("平均利潤", lirun, stack="stack1")
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='left'))
    line.overlap(bar)
    page.add(line)

5.7 how much

5.7.1 計算相關系數(票房相關系數矩陣)

def RelatedNumber():
    df.drop(columns=['id', 'ids'], inplace=True)
    print(df)
    dfData = df.corr()
    plt.subplots(figsize=(9, 9))  # 設置畫面大小
    sns.heatmap(dfData, annot=True, vmax=1, square=True, cmap="Oranges")
    plt.savefig('img/相關系數矩陣.png')
    plt.show()

5.7.2 票房影響因素散點圖

def sandiantu():
    scatter = Scatter(init_opts=opts.InitOpts(width="100%", theme=ThemeType.LIGHT))
    scatter.add_xaxis(df['budget'])
    scatter.add_yaxis("利潤", df['revenue'])
    scatter.set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="value",
            name="預算",
        ),
        yaxis_opts=opts.AxisOpts(
            name="利潤"
        )
    )
    scatter.set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='left'))
    scatter.set_global_opts(title_opts=opts.TitleOpts(title="預算對利潤的影響散點圖"))

    scatter1 = Scatter(init_opts=opts.InitOpts(width="100%", theme=ThemeType.LIGHT))
    scatter1.add_xaxis(df['runtime'])
    scatter1.add_yaxis("利潤", df['revenue'])
    scatter1.set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="value",
            name="電影時長",
        ),
        yaxis_opts=opts.AxisOpts(
            name="利潤"
        )
    )
    scatter1.set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='right'))
    scatter1.set_global_opts(title_opts=opts.TitleOpts(title="電影時長對利潤的影響散點圖"))

    scatter2 = Scatter(init_opts=opts.InitOpts(width="100%", theme=ThemeType.LIGHT))
    scatter2.add_xaxis(df['vote_average'])
    scatter2.add_yaxis("利潤", df['revenue'])
    scatter2.set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="value",
            name="評分",
        ),
        yaxis_opts=opts.AxisOpts(
            name="利潤"
        )
    )
    scatter2.set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='right'))
    scatter2.set_global_opts(title_opts=opts.TitleOpts(title="評分對利潤的影響散點圖"))

    scatter3 = Scatter(init_opts=opts.InitOpts(width="100%", theme=ThemeType.LIGHT))
    scatter3.add_xaxis(df['vote_count'])
    scatter3.add_yaxis("利潤", df['revenue'])
    scatter3.set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="value",
            name="評分人數",
        ),
        yaxis_opts=opts.AxisOpts(
            name="利潤"
        )
    )
    scatter3.set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='right'))
    scatter3.set_global_opts(title_opts=opts.TitleOpts(title="評分人數對利潤的影響散點圖"))

    scatter4 = Scatter(init_opts=opts.InitOpts(width="100%", theme=ThemeType.LIGHT))
    scatter4.add_xaxis(df['popularity'])
    scatter4.add_yaxis("利潤", df['revenue'])
    scatter4.set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="value",
            name="受歡迎度",
        ),
        yaxis_opts=opts.AxisOpts(
            name="利潤"
        )
    )
    scatter4.set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='right'))
    scatter4.set_global_opts(title_opts=opts.TitleOpts(title="受歡迎度對利潤的影響散點圖"))

    scatter5 = Scatter(init_opts=opts.InitOpts(width="100%", theme=ThemeType.LIGHT))
    #range(1950, 2020, 1)
    scatter5.add_xaxis(df['release_year'])
    scatter5.add_yaxis("利潤", df['revenue'])
    scatter5.set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="value",
            name="上映年份",
            min_=1900
        ),
        yaxis_opts=opts.AxisOpts(
            name="利潤"
        )
    )
    scatter5.set_series_opts(label_opts=opts.LabelOpts(is_show=False, position='right'))
    scatter5.set_global_opts(title_opts=opts.TitleOpts(title="上映年份對利潤的影響散點圖"))
    page.add(scatter, scatter1, scatter2, scatter3,scatter4,scatter5)

6 對附件的 tmdb_1000_predicted.csv 的預測結果

使用sklearn對tmdb_1000_predicted.csv進行預測

from sklearn.cross_decomposition import PLSCanonical
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, RidgeCV, Lasso, ElasticNet, BayesianRidge, \
    LogisticRegression
from sklearn.metrics import mean_squared_error
import joblib
import pandas as pd
from sklearn.svm import SVR
import numpy as np
def dump_load_demo():
    # 1.獲取數據
    df = pd.read_csv('total_2431.csv', sep=',', engine='python', header=[0])
    feature_arr = df[['budget', 'popularity', 'revenue', 'runtime']].values
    tag_arr = df['vote_count'].values
    print(len(tag_arr))
    # 2.數據基本處理
    # 2.1 數據集划分
    x_train, x_test, y_train, y_test = train_test_split(feature_arr,tag_arr[:,np.newaxis], random_state=350, test_size=0.2)

    # 3.特征工程 --標准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)

    # 4.機器學習(線性回歸)
    # 4.1 模型訓練
    estimator =Ridge()

    estimator.fit(x_train, y_train)
    print("這個模型的偏置是:\n", estimator.intercept_)

    # 4.2 模型保存
    joblib.dump(estimator, "save/test.pkl")

    # 4.3 模型加載
    estimator = joblib.load("save/test.pkl")

    # 5.模型評估
    # 5.1 預測值和准確率
    y_pre = estimator.predict(x_test)
    print("預測值是:\n", y_pre)
    score = estimator.score(x_test, y_test)
    print("准確率是:\n", score)
    ret = mean_squared_error(y_test, y_pre)
    print("均方誤差是:\n", ret)

if __name__ == '__main__':
    dump_load_demo()

 正確率75%,很難再往上調了。

預測支持人數:

 預測評分:

綜上所述,我們可以得到如下結論:

1.劇情類,喜劇類,驚悚類,動作類電影類型量較多,占據所有類型的50%,且這些類型數量也在不斷增長,因此電影類型可以向這四類靠攏。

2.根據關鍵詞詞雲,可以發現based on novel數量較多,電影可以着手嘗試小說改編,同時,violence、murder,revenge,sequel,prison,police也不少,可以拍攝監獄犯罪、暴力對抗,不斷復仇,且有續集的電影。

3.根據預算與利潤我們可以分析出來:

① 總體來說,這些電影類型都是盈利的,不同的是利潤率

② 還有預算的投入

③ 雖然Documentary類型電影的利潤率最高,但是預算低,它的利潤相對來說也低,如果是小成本電影公司的話,可以嘗試此類電影,如果事大公司可以嘗試高預算且高利潤的電影,比如Animation,Family,Fantasy,Advanture等等,都有着相對較高的利潤

4.根據每月電影數量和單片平均票房,發現電影數量在6、9、12月數量較多,而電影票房在5月份最高,其次是6、11、12,因此,可以嘗試在5月發行電影,有着數量較少的電影,可以減少競爭力,還有着不錯的票房收入。

5.根據電影時長分布,電影控制在98~108分鍾是最好的選擇。

6.根據電影票房分布,發現總體票房集中在1~2億美元之間

7.根據票房Top10導演,票房最高為史蒂芬·斯皮爾伯格,第二彼得·傑克遜,第三詹姆斯·卡梅隆,第四邁克爾·貝,可以嘗試找這些導演拍攝影片,這些都是電影票房的保障,可以獲得許多利潤。

8.根據評分分布,發現大部分電影評分集中在7~8分之間

9.根據評分Top10導演,可以選擇詹姆斯·馬什,丹·吉爾羅伊,約什·布恩等等導演,這些導演的影片評分都很不錯,可以留下較好的名譽。

10.根據原創VS改編,發現還是原創居多,可以嘗試原創,但是改編也是不錯的選擇。根據原創VS改編的利潤率,發現改編要比原創高,所以可以嘗試改編,畢竟還有很多原著黨。

11.根據相關系數矩陣,可以發現電影影響因素有很多,期間相互影響也是甚多,比如vote_count與票房就有很大的關系,vote_count和popularity有着71%的聯系,預算與票房也達到了69%的關系,但是也從中看出,評分對票房的影響並不大,呈現負數,可能是跟數據本身有關。

12.根據散點圖,得到以下分析:

    ①預算對票房的影響是逐步上升的,想要提高票房可以適當提高預算。

    ②電影時長集中在100-150分鍾可以有更高的票房

    ③評分人數越多,會有更高的票房

    ④受歡迎度對票房的影響是逐步上升的,受歡迎度越高,票房也就越高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM