Python案例实操3-电影数据分析

Python案例实操3-电影数据分析

本案例数据来源于 kaggle 上的
Movie数据集

,主要研究以下几个问题:

  1. 电影类型如何随着时间的推移发生变化的?
  2. 统计电影分类的情况?

  3. 电影类型与利润的关系?

  4. Universal 和 Paramount 两家影视公司的对比情况如何?
  5. 改编电影和原创电影的对比情况如何?
  6. 电影时长与电影票房及评分的关系?
  7. 分析电影关键字

实战开始:

一、读取数据

creditlist = pd.read_csv(r'E:\WorkSpaces\Python\data\tmdb\tmdb_5000_credits.csv')
movielist = pd.read_csv(r'E:\WorkSpaces\Python\data\tmdb\tmdb_5000_movies.csv')

二、数据处理

1.索引重命名


creditlist.rename(columns={'movie_id': 'id', 'crew': 'directors', 'cast': 'actors'}, inplace=True)

movielist.rename(
    columns={'original_language': 'language',
             'production_companies': 'companies', 'production_countries': 'countries'}, inplace=True)

2.合并数据集

合并数据集,注意列索引保持一致


databoth = pd.merge(creditlist, movielist, on=['id', 'title'])

3.选取子集

选取子集,选择我们需要的列


datalist = pd.DataFrame(databoth,
                        columns=['title', 'genres', 'language', 'directors', 'actors', 'release_date', 'runtime',
                                 'vote_average', 'vote_count', 'keywords', 'companies',
                                 'countries', 'budget', 'revenue', 'popularity'])

4.缺失值处理

少量缺失值可进行手动赋值处理,大量缺失值可使用dropna()删除或者fillna()替换


res_null = pd.isnull(datalist).sum()
print('缺失值检测结果:\n', res_null)

mask = datalist.loc[:, 'release_date'].isnull()
mask2 = datalist.loc[:, 'runtime'].isnull()

movie_name = datalist.loc[mask, 'title']
movie_name2 = datalist.loc[mask2, 'title']
print('缺失上映日期的电影名称为:\n', movie_name)

print('缺失电影时长的电影名称为:\n', movie_name2)

datalist.loc[mask, 'release_date'] = '2014-06-01'
datalist.iloc[2656, datalist.columns.get_indexer(['runtime'])] = 94
datalist.iloc[4140, datalist.columns.get_indexer(['runtime'])] = 81

5.数据格式转换


def data_format(datas):
"""
    数据格式转换
    :param datas: 数据
    :return: 转换之后的数据
"""
    name_list = []

    for item in datas:

        if item:
            movie_type = item['name']
            name_list.append(movie_type)

    return ','.join(name_list)

print('电影类型:\n', datalist.loc[:, 'genres'])

datalist.loc[:, 'genres'] = datalist.loc[:, 'genres'].transform(json.loads)

datalist.loc[:, 'genres'] = datalist.loc[:, 'genres'].transform(data_format)
print('电影类型 转换之后的结果:\n', datalist.loc[:, 'genres'])

三、数据分析及可视化

1.电影类型随时间变化趋势图

Python案例实操3-电影数据分析

思路

  1. 在每行数据后追加所有电影类型列,初始值为0
  2. 遍历每一部电影的’genres’列,把分类包含在该列中的值置为1
  3. 分组并按照类型求和
    Python案例实操3-电影数据分析

datalist.loc[:, 'release_date'] = pd.to_datetime(datalist.loc[:, 'release_date'])

datalist.loc[:, 'release_year'] = datalist.loc[:, 'release_date'].dt.year

temp_list = [i.split(",") for i in datalist["genres"]]

typelist = np.unique([i for j in temp_list for i in j])

typelist = np.delete(typelist, typelist == '')
for column in typelist:

    datalist.loc[:, column] = 0

    mask = datalist.loc[:, 'genres'].str.contains(column)

    datalist.loc[mask, column] = 1

res = datalist.groupby('release_year')[typelist].sum()
print(res)

plt.figure()

plt.rcParams['font.sans-serif'] = 'SimHei'

plt.rcParams['axes.unicode_minus'] = False

x = res.index
for movie_type in res.columns:

    y = res[movie_type]

    plt.plot(x, y)

plt.title('电影类型随时间变化趋势图')

plt.legend(res.columns, fontsize='x-small')

plt.ylabel('数量')

plt.xlabel('年份')

plt.grid(True, alpha=0.2)

plt.savefig('./电影类型随时间变化趋势图.jpg')

plt.show()

2.统计电影分类情况

Python案例实操3-电影数据分析

思路
1、创建一个全为0的dataframe,列索引置为电影的分类,temp_df
2、遍历每一部电影,temp_df中把分类出现的列的值置为1
3、求和

Python案例实操3-电影数据分析

temp_df = pd.DataFrame(np.zeros([datalist.shape[0], typelist.shape[0]], dtype=int), columns=typelist)

for i in range(datalist.shape[0]):

    temp_df.iloc[i, temp_df.columns.get_indexer(temp_list[i])] = 1

temp_df.sum().sort_values().plot(kind="pie", figsize=(20, 8), fontsize=10, autopct="%.2f", title='电影分类情况统计')

plt.rcParams['font.sans-serif'] = 'SimHei'
plt.savefig('电影分类情况统计.jpg')

3.电影类型与利润的关系

Python案例实操3-电影数据分析
对比 各种电影类型 的 平均利润 —柱状图
Music —> profit — sum / music 电影的数量 count ===>平均每一个music电影的利润

datalist.loc[:, 'profit'] = datalist.loc[:, 'revenue'] - datalist.loc[:, 'budget']
print('利润:\n', datalist.loc[:, 'profit'])

movie_type_profit = []

for column in typelist:

    mask = datalist.loc[:, column] == 1

    mean_profit = datalist.loc[mask, 'profit'].mean()

    movie_type_profit.append(mean_profit)

print(typelist)
print(movie_type_profit)

res_series = pd.Series(data=movie_type_profit, index=typelist).sort_values()

res_series.plot(kind="barh", figsize=(20, 8), fontsize=10, title='电影类型和利润关系图', ylabel='电影分类')

plt.rcParams['font.sans-serif'] = 'SimHei'
plt.savefig('电影类型和利润关系图.jpg')

4.Universal Pictures 和 Paramount Pictures 公司电影发行数据对比

1)Universal Pictures 和 Paramount Pictures 公司电影发行量对比

Python案例实操3-电影数据分析

对’companies’列数据进行处理,判断是否包含Universal Pictures 或 Paramount Pictures公司


datalist.loc[:, 'Universal Pictures'] = 0
datalist.loc[:, 'Paramount Pictures'] = 0

mask1 = datalist.loc[:, 'companies'].str.contains('Universal Pictures')

datalist.loc[mask1, 'Universal Pictures'] = 1

mask2 = datalist.loc[:, 'companies'].str.contains('Paramount Pictures')

datalist.loc[mask2, 'Paramount Pictures'] = 1

res_pie = datalist.loc[:, ['Universal Pictures', 'Paramount Pictures']].sum()

res_pie.plot(kind="pie", figsize=(20, 8), fontsize=10, autopct="%d", title='电影发行量对比图')

plt.rcParams['font.sans-serif'] = 'SimHei'
plt.savefig('电影发行量对比图.jpg')

2)分析 Universal Pictures 和 Paramount Pictures 两家影视公司电影发行量随时间变化的趋势

Python案例实操3-电影数据分析
按照 release_year分组,对发行数量求和

res_line = datalist.groupby(by='release_year')[['Universal Pictures', 'Paramount Pictures']].sum()
res_line.plot(figsize=(20, 8), fontsize=20, title='发行量随时间变化趋势')
plt.ylabel('发行量')
plt.xlabel('时间')
plt.savefig('发行量随时间变化趋势.jpg')

5.改编电影和原创电影的对比情况

Python案例实操3-电影数据分析

如何确定电影是改编的?还是原创的呢?
与电影相关的关键字 keywords
如果在这里是根据小说改编的 base on novel/fairy tale/…

只要出现 base on 这个字眼 就说明 是改编的


datalist.loc[:, 'not_original'] = '原创'

mask = datalist.loc[:, 'keywords'].str.contains('based on')

datalist.loc[mask, 'not_original'] = '改编'

datalist.loc[:, 'profit'] = datalist.loc[:, 'revenue'] - datalist.loc[:, 'budget']
res_not_original = datalist.groupby('not_original')[['budget', 'revenue', 'profit']].mean()
print('res_not_original\n', res_not_original)

res_not_original.plot(kind="bar", figsize=(20, 8), fontsize=20, title='原创与改编电影预算、收入、利润对比柱状图')

plt.rcParams['font.sans-serif'] = 'SimHei'
plt.ylabel('美元')
plt.xlabel('原创或改编')
plt.savefig('原创与改编电影预算、收入、利润对比柱状图.jpg')

6.电影时长与电影票房及评分的关系

Python案例实操3-电影数据分析

按照 电影时长 分组,查看不同电影时长的平均票房、平均评分
1、自定义时长分组
2、进行离散化
3、分组聚合,对票房和评分进行求均值

print('查看电影时长、票房、评分:\n', datalist.loc[:, ['runtime', 'revenue', 'vote_average']].head())

bins = [0, 60, 90, 120, 150, 180, 210, 240]

datalist.loc[:, 'runtime'] = pd.cut(x=datalist.loc[:, 'runtime'],
                                    bins=bins,
                                    include_lowest=True)

res_runtime = datalist.groupby('runtime')[['revenue', 'vote_average']].mean().sort_values(
    by=['revenue', 'vote_average'])
print('res_runtime:\n', res_runtime)

ax = res_runtime.plot(secondary_y=['vote_average'], figsize=(10, 5), title='不同时长的电影票房、评分的对比柱状图')
ax.set_xlabel('时长(分钟)')
ax.set_ylabel('票房(美元)')
ax.right_ax.set_ylabel('评分')
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.savefig('不同时长的电影票房、评分的对比柱状图.jpg')

7.电影关键词分析

Python案例实操3-电影数据分析
生成电影关键词词云
from wordcloud import WordCloud, STOPWORDS

keywords_list = []
    for x in datalist['keywords']:
        keywords_list.append(x)
    str_key = ''.join(keywords_list)
    str_key.replace('\'s', '')

    stopwords = STOPWORDS
    stopwords.update(['based', 'film'])

    wc = WordCloud(
        background_color="white",
        font_path="simkai.ttf",
        stopwords=stopwords
    )
    wc.generate_from_text(str_key)

    plt.figure(figsize=(10, 5))
    plt.imshow(wc)
    plt.axis("off")
    plt.savefig(r'电影关键词.jpg')

参考文章:https://blog.csdn.net/markshui/article/details/108214328

Original: https://blog.csdn.net/weixin_45698637/article/details/122777579
Author: Buckletime
Title: Python案例实操3-电影数据分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/700634/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球