对Netflix影视剧的分析总结
目的:
对2000-2020年间Netflix影视剧进行分析
数据预处理
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as snsplt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = Falsedf = pd.read_csv('netflix_titles.csv')
df.head(3)
各字段说明:
- show_id 编号
- type 类型(Movie/TV Show)
- title 名称
- director 导演
- cast 演员
- country 国家或地区
- date_added 播放日期
- release_year 发行年份
- rating 限制级别
- duration 时长
- listed_in 类别
- description 描述
观察影视剧数量分布
data = df['release_year'].value_counts().sort_index(ascending=False)
fig,ax = plt.subplots(figsize=(16,6))
ax.bar(data.index, data.values)
plt.show()
2000年以前数据非常少,对分析没有价值,故只分析2000-2020年间的数据
处理空值、重复值
df = df.loc[(df.release_year <= 2020) & (df.release_year >= 2000)]
# 查看是否含有空值
df.isnull().sum()
# director 和 cast 两列空值数据过多,不去管
# 由于Netflix是美国成立并且节目在美国放映,因此使用‘United States’填充‘country’空值数据
df['country'] = df['country'].fillna('United States')# date_added 和 rating 两列空值数据只有21行,直接删除空行
df.dropna(subset=['date_added','rating'], axis=0, inplace=True)
# 重设索引
df.reset_index(drop=True, inplace=True)# 查看是否含有重复数据
df.duplicated().sum()
返回0,没有重复值
处理文本类字段
# country列取第一个国家
df['country'] = df['country'].apply(lambda x: x.strip().split(',')[0])# 添加month列
df['month'] = pd.to_datetime(df['date_added']).dt.month_name()# listed_in列提取第一个类型
ls = []
for x in (np.arange(0,len(df))):ls.append(df['listed_in'][x].split(',')[0])
# 新增列“影视剧分类”
df['categories'] = ls
df['categories']# 电影的duration列去掉字符串转为int型
df.loc[df['type']=='Movie', 'duration'] = df['duration'].apply(lambda x: int(x.split(' ')[0]))# 查看处理完的表
df.head(3)
数据分析
将电视节目和电影分成两表分别分析
tv_table = df[df['type'] == 'TV Show']
mv_table = df[df['type'] == 'Movie']
电影&电视节目发布量随年份的变化趋势
tv = tv_table['release_year'].value_counts()
mv = mv_table['release_year'].value_counts()
pubNum = pd.concat([tv, mv], axis=1, keys=['tv','mv'])fig, ax = plt.subplots(figsize=(16,6))
ax.plot(pubNum.index, pubNum['tv']+pubNum['mv'], label='总量', marker='o', color='black')
ax.plot(pubNum.index, pubNum['mv'], label='电影', marker='o', color='red')
ax.plot(pubNum.index, pubNum['tv'], label='电视节目', marker='o', color='blue')
ax.legend(fontsize=14)
ax.set_xticks(range(2000,2021))
plt.tick_params(labelsize=14)
ax.grid(alpha=0.3)
ax.set_ylim(0,1200)
ax.set_title('每年发布量变化趋势', y=1.02, fontsize=18)
ax.set_xlabel('', fontsize=16)
ax.set_ylabel('', fontsize=16)
plt.show
- 从2013年开始电影发布量呈上升趋势,其速度高于电视剧,在2015年增长速度最快。自2017达到最高后开始持续下降;
- 从2013年开始电视剧发布量稳步上升,在2017年速度最快,之后其上升速度低于电影量下降速度;
- 整体发行量趋势同电影,在2015年增速最大,到2018年后开始下降
电影&电视节目发布量随月份的变化趋势
month_order = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
tv_m = tv_table['month'].value_counts()[month_order].reset_index()
tv_m = tv_m.rename(columns={'month': 'count', 'index':'month'})
mv_m = mv_table['month'].value_counts()[month_order].reset_index()
mv_m = mv_m.rename(columns={'month': 'count', 'index':'month'})
All_m = df['month'].value_counts()[month_order].reset_index()
All_m = All_m.rename(columns={'month': 'count', 'index':'month'})plt.figure(figsize=(16,8))
plt.plot(All['month'], All['count'], label='总量', marker='o', color='black')
plt.plot(mv_m['month'], mv_m['count'], label='电影', marker='o', color='red')
plt.plot(tv_m['month'], tv_m['count'], label='电视节目', marker='o', color='blue')
plt.grid(alpha=0.3)
plt.xticks(rotation=45, fontsize=14)
plt.yticks(fontsize=14)
plt.xlabel('', fontsize=18)
plt.ylabel('', fontsize=18)
plt.legend(fontsize=16)
plt.title('每月发布量变化趋势', fontsize=18, y=1.02)
- 电影在10月、12月和1月发行量最多,2月份发行量骤减到最少
- 电视剧呈现缓慢上升,相对平稳,也是2月份最少
- 月份对电影的影响较电视剧更大
电影&电视节目总发布数量对比
mvtv = df['type'].value_counts()
fig,ax = plt.subplots(figsize=(6,6))
ax.pie(mvtv, labels=['电影','电视节目'], autopct='%.2f%%', explode=[0,0.1], pctdistance = 0.7, colors=['red', 'blue'],\textprops={'fontsize':16, 'color':'white'}, wedgeprops={'width':1,'edgecolor':'white'})
ax.legend(bbox_to_anchor=(1, 0, 0, 1), fontsize=14)
ax.set_title('电影 & 电视节目的占比', fontsize=16)
plt.show()
- 2000-2020年,电影的产出是电视剧的两倍多
不同限制级别的发行量分布
影视剧分级规则:
儿童
- G:大众级,任何人都可观看
- TV-G:普遍级的电视节目,适合所有年龄层观看
- TV-Y:适合包括2-6岁幼童在内的所有儿童观看的节目
- TV-Y7:可能含有年龄7岁以下儿童不宜观看内容的电视节目
- TV-Y7-FV:是TV-Y7的替代版本。当电视节目中含有相较于TV-Y7级别来说更多的虚构暴力画面时,会被评为TV-Y7-FV
青少年
- PG:辅导级,电影中的一些内容可能不适合儿童观看
- TV-PG:指“建议家长提供指引”的电视节目。有些内容可能不适合儿童,可能有少量的暴力、性题材和不当行为
- PG-13:特别辅导级,建议13岁后儿童观看
- TV-14:可能不适合于14岁以下未成年人收看
成人
- R:限制级,建议17岁以上观看
- TV-MA:电视节目可能含有不适合17岁以下未成年人或只适合成年观众收看的内容
- NC-17:17岁及以内禁止观看
未经定级
- NR
- UR
# 美国电影、电视节目按限制年龄从小到大排序的限制级别
rating_order_mv = ['G', 'TV-G', 'TV-Y', 'TV-Y7', 'TV-Y7-FV','PG', 'TV-PG', 'PG-13', 'TV-14', 'R', 'TV-MA', 'NC-17', 'NR', 'UR']
rating_order_tv = ['TV-G', 'TV-Y', 'TV-Y7', 'TV-Y7-FV', 'TV-PG', 'TV-14', 'R', 'TV-MA', 'NR']tv_r = tv_table['rating'].value_counts()[rating_order_tv]
mv_r = mv_table['rating'].value_counts()[rating_order_mv]
rating = pd.concat([mv_r, tv_r], axis=1, keys=['mv_r', 'tv_r']).fillna(0).astype('int')plt.figure(figsize=(16,8))
plt.bar(np.arange(0,len(rating))-0.2, height=rating['mv_r'], width=0.4, label = '电影', color='red')
plt.bar(np.arange(0,len(rating))+0.2, height=rating['tv_r'], width=0.4, label = '电视节目',color='blue')
plt.bar(np.arange(0, 5), height=1900, width=1, alpha=0.2, color='pink')
plt.bar(np.arange(5, 9), height=1900, width=1, alpha=0.2)
plt.bar(np.arange(9, 12), height=1900, width=1, alpha=0.2, color='yellow')
plt.bar(np.arange(12, len(rating)), height=1900, width=1, alpha=0.2, color='green')
plt.text(0.5, 1700, '儿童', fontsize=20)
plt.text(5, 1700, '青少年', fontsize=20)
plt.text(9, 1700, '成人', fontsize=20)
plt.text(12, 1700, '未定级', fontsize=20)
plt.grid(axis='y', ls='-.', alpha=0.5)
plt.legend(fontsize=16, bbox_to_anchor=(1,0.9))
plt.xticks(np.arange(0,len(rating)), labels=rating.index, rotation=45, fontsize=14)
plt.yticks(fontsize=14)
plt.ylim([0,1850])
plt.xlim([-0.5,len(rating)+0.5])
plt.xlabel('', fontsize=22)
plt.ylabel('', fontsize=22)
plt.title('不同限制级别的发布数量', fontsize=22, y=1.02)
ax = plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['bottom'].set_color('none')
plt.show()
- 过去20年, 不论是电影还是电视剧,面向青少年和成人的节目较于儿童更多些
- TC-MA、TV-14、R级别的电影发布数量较多(>500)
- TC-MA、TV-14级别的电视剧发布数量较多(>500)
不同分类的发布量
# 电视节目各分类作品数量
tv_ctg = tv_table['categories'].value_counts()
tv_ctg = pd.DataFrame({'categories': tv_ctg.index, 'count': tv_ctg.values}).head(10)
# 电影各分类作品数量
mv_ctg = mv_table['categories'].value_counts()
mv_ctg = pd.DataFrame({'categories': mv_ctg.index, 'count': mv_ctg.values}).head(10)plt.figure(figsize=(14,6))
plt.subplot(121)
sns.barplot(x=mv_ctg['categories'], y=mv_ctg['count'], color='red')
plt.title('电影各类别发布数量', fontsize=16, y=1.02)
plt.xticks(rotation=60, fontsize=12)
plt.xlabel('', fontsize=16)
plt.ylabel('', fontsize=16)
plt.grid(axis='y', alpha=0.3)
plt.ylim([0,1350])
plt.subplot(122)
sns.barplot(x=tv_ctg['categories'], y=tv_ctg['count'], color='blue')
plt.title('电视节目各类别发布数量', fontsize=16, y=1.02)
plt.xticks(rotation=60, fontsize=12)
plt.xlabel('', fontsize=16)
plt.ylabel('', fontsize=16)
plt.grid(axis='y', alpha=0.3)
plt.ylim([0,1350])
plt.show()
- 电影类别中剧情类、喜剧类发布数量最多,超过1000;纪录、动作冒险类发布量超500
- 电视节目类别中国际电视节目放映数量最多,是其他类别的两倍之多;犯罪、儿童类发布量超300
不同国家地区的发布数量分布
# 电视节目各国家发布量
tv_c = tv_table['country'].value_counts()
tv_c = pd.DataFrame({'country': tv_c.index, 'count': tv_c.values}).head(10)
# 电影各国家发布量
mv_c = mv_table['country'].value_counts()
mv_c = pd.DataFrame({'country': mv_c.index, 'count': mv_c.values}).head(10)
# 各国家发布总量
all_c = df['country'].value_counts()
all_c = pd.DataFrame({'country': all_c.index, 'count': all_c.values}).head(10)plt.figure(figsize=(16,6))
plt.subplot(131)
sns.barplot(x=all_c['country'], y=all_c['count'], color='black')
plt.title('不同国家发布数', fontsize=20, y=1.02)
plt.xticks(rotation=70, fontsize=16)
plt.yticks(fontsize=16)
plt.xlabel('', fontsize=18)
plt.ylabel(all_c.columns[1], fontsize=18)
plt.grid(axis='y', alpha=0.3)
plt.ylim([0,3300])
plt.subplot(132)
sns.barplot(x=mv_c['country'], y=mv_c['count'], color='red')
plt.title('不同国家发布电影数', fontsize=20, y=1.02)
plt.xticks(rotation=70, fontsize=16)
plt.yticks(fontsize=16)
plt.xlabel('', fontsize=18)
plt.ylabel(ylabel='', fontsize=18)
plt.grid(axis='y', alpha=0.3)
plt.ylim([0,3300])
plt.subplot(133)
sns.barplot(x=tv_c['country'], y=tv_c['count'], color='blue')
plt.title('不同国家发布电视节目数', fontsize=20, y=1.02)
plt.xticks(rotation=70, fontsize=16)
plt.yticks(fontsize=16)
plt.xlabel('', fontsize=18)
plt.ylabel('', fontsize=18)
plt.grid(axis='y', alpha=0.3)
plt.ylim([0,3300])
plt.show()
- 由于Netflix成立于美国,所以出自美国的影视剧数量远超其他国家
- 印度电影发布数量较多,英国电影、电视节目发布量比较平均
电影时长分布
plt.figure(figsize=(14,8))
sns.distplot(mv_table['duration'])
plt.xticks(np.arange(0,350,10), fontsize=14)
plt.yticks(fontsize=14)
plt.xlim(0,220)
plt.xlabel(xlabel='电影时长', fontsize=14)
plt.title('电影时长分布图', fontsize=18, y=1.02)
plt.show()
查看各导演作品数量
len(tv_table['director'])
tv_table['director'].isnull().sum()
电视节目表中一共2332条数据,有2152条导演值缺失
len(tv_table['director'])
mv_table['director'].isnull().sum()
电影节目表中一共4958条数据,导演列缺失153条数据
电视剧导演的缺失太多,这里只分析电影的导演作品数量
director = mv_table['director'].value_counts().head(10)
director = pd.DataFrame({'director': director.index, 'count': director.values})
director
plt.figure(figsize=(16,8))
sns.barplot(x=director['count'],y=director['director'], orient="h")
plt.xlabel('')
plt.ylabel('',fontsize=16)
plt.yticks(fontsize=16)
plt.xticks(fontsize=16)
plt.title('电影导演发布数量排名', y=1.02, fontsize=20)
- Raúl Campos, Jan Suter导演发布量最多,20年发布18部电影,平均大约一年一部
关键词
from wordcloud import WordCloud
text = str(list(df['description'])).replace(',', '').replace("'", '')plt.rcParams['figure.figsize'] = (15, 15)
wordcloud = WordCloud(background_color = 'white', width = 900, height = 500, max_words = 121).generate(text)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
- 影视剧更多地围绕生活、寻找、家庭、世界、朋友、爱等相关标签展开
总结:
- 2000-2020过去20年里,电影的发布量是电视节目的两倍多;从2013年发布量迅速增多,到2017年电影发行量大幅下降,而电视节目却稳步上升;说明Netflix越来越关注电视节目的放映;
- 电影在10月、12月、1月放映量较多,可能是大学生放寒假以及12月底的圣诞节全国假期导致,2月份的骤减可能由于大学生开学引起;可以得出在长假期下放映电影会有更多人观看,也能看出电影的受众大多是青少年及成年人;电视节目相比之下不那么受假期的影响;
- 从不同限制级别的放映量可以证实电影和电视节目的内容更适合青少年和成年人观看,因为Netflix有移动端、PC端及TV等载体,成年人和青少年更倾向于移动端而儿童会倾向于TV,所以电视节目相比于电影会更多面向儿童;
- 人们更倾向于剧情、喜剧类的电影和国际类的电视节目;
- 电影时长大多分布在90-110min间,可知人们观影最佳时长应该是90-110min,在这个时间段内观影体验和效果最好;
- 人们更倾向于生活、寻找、家庭、世界、朋友、爱等相关主题的电影和电视节目。
对Netflix影视剧的分析总结相关推荐
- Netflix Movies and TV Shows(Netflix影视剧数据集)
原文: Netflix Movies and TV Shows Movies and TV Shows listings on Netflix TV Shows and Movies listed o ...
- Python数据分析案例12——网飞影视剧数据分析及其可视化
背景介绍 Netflix是最受欢迎的媒体和视频流平台之一.他们的平台上有超过 8000 部电影或电视节目.截至 2021 年年中,他们在全球拥有超过 2 亿订阅者. 博主看美剧也较为多,像<怪奇 ...
- Linux 入门必看:如何60秒内分析Linux性能
作者:helightxu,腾讯 IEG 开发工程师 本文来自公众号:黑光技术 当你登陆一台 Linux 服务器之后,因为一个问题要做性能分析时:你会在第 1 分钟内做哪些检测呢? 在 Netflix, ...
- 通过数据分析找出Netflix最适合学习英语的电影和电视剧
分析Netflix的1500部电视剧和电影找出哪一部最适合学习英语. 截至2020年,Netflix上大约有3712部电影和1845部电视节目.如果你正在学习英语,有很多内容可以选择,但你可能没有时间 ...
- 中国影视IP制作行业投资规划动态及发展趋向分析报告2022-2028年版
中国影视IP制作行业投资规划动态及发展趋向分析报告2022-2028年版 [报告目录]: 第1章:影视IP制作基本概念及分类1.1 IP的基本概念 1.1.1 IP概念的提出 1.1.2 泛娱 ...
- Linux 性能分析
当你登陆一台 Linux 服务器之后,因为一个问题要做性能分析时:你会在第 1 分钟内做哪些检测呢? 在 Netflix,我们有很多 EC2 的 Linux 机器,并且也需要很多性能分析工具来监控和检 ...
- 数据分析36计(21):Uber、Netflix 常用倍差法模型量化营销活动、产品改版影响效果...
1 案例背景 目前 Uber.Netflix 在商业分析中的因果推断常用模型主要是倍差法(Difference in Difference)和匹配(Matching),目前已在其平台中建立相关方法的自 ...
- python支持向量机框架_Netflix 内部 Python 框架 Metaflow 正式开源,可加速机器学习模型部署...
近日,美国视频流媒体平台及视频出版制作公司 Netflix 网飞的数据科学团队宣布正式开源其 Python 库 Metaflow,以帮助更多数据科学家与工程师构建.管理相关的数据科学项目. Metaf ...
- 111个Python数据分析实战项目,代码已跑通,数据可下载
写在前面: 这里整理了111个数据分析的案例,每一个都进行了严格的筛选,筛选标准如下: 1. 有干货:杜绝纯可视化.统计性分析,有一定比例的讲解性文字 2. 可跑通:所有代码均经过测试,(大概率)可以 ...
最新文章
- 电商直播团队,管理好团队就成功了一半
- “比特币耶稣”:看好比特币现金,比特币大势已去
- AX2009报表打印固定长度Barcode条码
- leetcode算法题--从尾到头打印链表
- 使MySQL 支持繁体字
- v-if、v-for、v-model、v-on
- PHPer的水平区分 (转)
- oracle resetlog与noresetlog的作用(转载)
- 广发基金总经理林传辉:深耕资产管理本源做投资者的资产配置专家
- 自动化测试框架[Cypress概述]
- 联想ThinkPad笔记本Fn键关闭与启用方法
- 127.0.0.1 zxt.php_shmilyzxt/
- 基于子类的动态代理(使用CBl工具)
- GAMLSS代码示例
- 牛客网 2018校招真题 爱奇艺 最后一位
- 开发者如何创建搭搭云应用
- 腐蚀、膨胀、开运算、闭运算
- 使用requests库和lxml解析爬取电影天堂电影信息
- 插入排序算法(Java代码实现)
- 关于PROFIBUS:生产工厂的通信骨干网