一、项目概述¶
1.1 项目背景¶
哔哩哔哩(bilibili)是中国知名的ACG内容平台及线上宅文化社区,其动漫板块以季度更新的"番剧"为主要形式。
本项目通过分析B站动漫数据,探究以下方面:
- 时间空间的对比分析:不同地区/年份的番剧数量变化
- 番剧质量与口碑评价:评分分布与追番人数关系
- 热门番剧的类型演变:题材偏好随时间的变化趋势
数据特征¶
- 追番人数:反映作品热度与观众数量
- 作品评分:0-10分制,是质量的评价指标
- 番剧类型:不同番剧的题材和内容(日常/热血/漫改等)
数据来源:B站动漫番剧排行榜(以追番人数从高到低为索引):
https://www.bilibili.com/anime/index/?from_spmid=666.4.index.0#st=1&order=3&season_version=-1&spoken_language_type=-1&area=-1&is_finish=-1©right=-1&season_status=-1&season_month=-1&year=-1&style_id=-1&sort=0&page=1
1.2 可视化内容¶
地区数量分析
- 各地区每年上映番剧数量分布(对数刻度条形图)、占比分布(扇形图)
评分趋势分析
- 评分密度分布与直方图、年度平均评分趋势(折线、条形复合图)
观众行为分析
- 年度番剧数量vs追番人数趋势(双折线图)、评分与追番人数关系(气泡散点图)
类型变化分析
- 所有番剧vs高分番剧(≥9.5)类型词云对比、1980-2020期间三个时间段的类型词云对比
1.3 技术实现¶
功能模块¶
| 模块 | 描述 |
|---|---|
| 数据收集 | 使用公开合法接口、构建爬虫 |
| 数据清洗 | 缺失值处理与异常值修正等 |
| 数据分析 | 多因素统计分析与可视化呈现 |
技术支持¶
| 分析模块 | 所需库名 | 作用描述 |
|---|---|---|
| 数据采集 | requests |
封装 HTTP 请求,适配 B 站反爬机制。 |
BeautifulSoup |
解析 HTML 文档,精确查询番剧信息(标题、评分\追番人数等) | |
| 数据处理 | pandas |
基于numpy的重要工具,可高效进行数值计算 |
numpy |
用于数据清洗和数据的初步分析 | |
| 可视化 | matplotlib |
基础绘图库,可自定义配色与样式 |
seaborn |
增强图表美观性,简化复杂图表的绘制过程。 | |
wordcloud |
生成词云图,直观展示番剧类型高频词汇及主题演化 | |
missingno |
可视化缺失值分布,有助于判断数据完整性 | |
| 辅助工具 | re |
正则表达式处理文本数据 |
json |
支持与 B 站 API 交互及结果的存储。 |
二、 数据预处理¶
2.1 数据获取过程说明¶
本项主要爬取 B站动漫番剧排行榜(以追番人数从高到低为索引):
https://www.bilibili.com/anime/index/?from_spmid=666.4.index.0#st=1&order=3&season_version=-1&spoken_language_type=-1&area=-1&is_finish=-1©right=-1&season_status=-1&season_month=-1&year=-1&style_id=-1&sort=0&page=1
初始爬虫方案¶
尝试通过 Python 爬虫获取数据,具体流程有:
- 列表页爬取:获取动漫排行榜的大致信息及详情页直达链接
- 详情页抓取:访问每个动漫的独立页面获取完整数据
- 数据提取:
- 使用
requests库获取页面 HTML 中的 JSON 数据 - 通过
Beautiful Soup解析并提取关键字段
- 使用
最终数据来源¶
由于实际爬取过程中遇到大规模详情页请求的频率限制,最终采用B站动漫结构化数据集(来源:GitHub 公开项目)作为数据源,使用公开、合法的数据集有以下优势:
1.数据结构规范(与官方API一致)
2.经过社区验证的数据准确性高
完整包含 2811 条 B 站官方排行榜数据,部分数据格式为:
| 序号 | title | subTitle | score | order | time | table | area |
|---|---|---|---|---|---|---|---|
| 0 | 鬼灭之刃 刀匠村篇 | 信念锻刃,尽斩恶鬼 | 9.2 | 1564.5万追番 | 2023-06-03 20:00:00 | 漫画改 奇幻 热血 战斗 | 日本 |
| 1 | 鬼灭之刃 游郭篇 | 斩断鬼所栖身的夜 | 9.7 | 1409.3万追番 | 2022-03-05 20:00:00 | 漫画改 热血 战斗 奇幻 | 日本 |
| 2 | 鬼灭之刃 无限列车篇 | 潜入无限的梦境中 | 9.8 | 1333万追番 | 2021-11-17 20:00:00 | 漫画改 热血 战斗 奇幻 | 日本 |
| 3 | 鬼灭之刃 | 谁都斩不断的羁绊 | 9.7 | 1267.4万追番 | 2019-04-07 00:00:00 | 漫画改 战斗 热血 声控 | 日本 |
| 4 | 咒术回战 第二季 | 天上天下,唯我独尊 | 9.4 | 1242.3万追番 | 2023-08-24 20:00:00 | 漫画改 热血 战斗 奇幻 | 日本 |
缺失值处理¶
1. subTitle列(副标题)¶
df.drop(columns='subTitle', inplace=True)
- 空缺量:899条
- 决策依据:
- substitute副标题对分析数据作用不大
- subTitle为空的动漫占比约三分之一,占比影响较大;
2. score列(评分)¶
df.dropna(subset=['score'], inplace=True)
- 空缺量:136条
- 空缺原因:
- 目前还未上架
- 作品冷门,评分不足
- 决策依据:数量符合常理,可保留score列,只删除该列有NaN的行;
3. table列(类型)¶
- 空缺量:55条
- 处理方案:暂时保留,后续进行处理
- 决策依据:table为空的数据不多,且直接删去会影响较多其他列数据
数据格式处理¶
1.order列(排名)¶
- 去掉order列里的'万追番','万追剧';检查是否存在'万'字,因为排行榜追剧/追番人数必然以万字计
df['order'] = df['order'].str.replace('万追番', '')
df['order'] = df['order'].str.replace('万追剧', '')
has_wan = df['order'].str.contains('万 ', na=False)
print('包含“万”的行数:', has_wan.sum())
print(df[has_wan])
2. time列(时间)¶
- time包含年,日,月,时,分,秒以及空格和其他符号,将其表示为只含年份的纯数字
df['time'] = df['time'].str[:4]
将清洗好的数据放入excel文件中,再次统计每一列中有多少个缺失值(NaN)¶
df.to_excel('动漫数据_已处理2.xlsx')
df.isna().sum()
| Column | Missing Values |
|---|---|
| title | 0 |
| subTitle | 0 |
| score | 0 |
| order | 0 |
| time | 0 |
| table | 0 |
| area | 0 |
table为NaN数小于55,说明在清除score为NaN的行时或清除重复的title时,同时清空了table为NaN的行¶
数据清洗完成,接下来开始数据分析¶
三、数据分析¶
3.1 动漫番剧地区分布条形图¶
plt.figure(figsize=(8,5))
area_counts=area_value_counts.reset_index()
area_counts.columns=['area','count']
sns.barplot(area_counts, x='area', y='count', palette='viridis')
plt.yscale('log')
plt.title('各地区动漫番剧数量分布(对数刻度)')
plt.xlabel('地区')
plt.ylabel('动漫番剧数量(对数)')
plt.show()
3.2 动漫番剧地区分布扇形图¶
plt.figure(figsize=(6,6))
most_area=area_counts[area_counts['count']>25]
other=pd.DataFrame({
'area':['其他'],
'count':[area_counts[area_counts['count']<=25]['count'].sum()]
})
plot_data=pd.concat([most_area,other])
plt.pie(
plot_data["count"],
labels=plot_data['area'],
autopct='%.1f%%',
colors=plt.cm.Pastel1.colors,
pctdistance=0.9,
startangle=140
)
plt.title('B站动漫番剧地区分布(数量≤25的归为\'其他\')')
plt.show()
3.3 动漫番剧评分密度和直方分布图¶
plt.figure(figsize=(8,5))
sns.histplot(df['score'],bins=20,kde=True,color='steelblue')
plt.title('动漫番剧评分的密度分布和直方图')
plt.xlabel('评分')
plt.ylabel('番剧数量')
plt.show
3.4 动漫番剧数量和评分趋势图¶
grouped=df.groupby('time').agg({'title':'count','score':'mean'}).reset_index()
grouped = grouped[(grouped['time'] >= 1980) & (grouped['time'] <= 2020)]
fig,ax1=plt.subplots(figsize=(10,6))
ax2=ax1.twinx()
ax1.bar(grouped['time'],grouped['title'],color='skyblue',label='番剧数量')
ax2.plot(grouped['time'],grouped['score'],color='orange',label='平均评分',marker='o')
ax1.set_xlabel('年份')
ax1.set_ylabel('番剧数量')
ax2.set_ylabel('平均评分')
ax1.legend()
ax2.legend()
plt.title('每年动漫番剧数量与平均评分趋势')
plt.show()
grouped=df.groupby('time').agg({'title':'count','order':'sum'}).reset_index()
grouped = grouped[(grouped['time'] >= 1980) & (grouped['time'] <= 2020)]
fig,ax1=plt.subplots(figsize=(10,6))
ax2=ax1.twinx()
ax1.plot(grouped['time'],grouped['title'],color='skyblue',label='番剧数量',marker='o')
ax2.plot(grouped['time'],grouped['order'],color='coral',label='追番人数',marker='o')
ax1.set_xlabel('年份')
ax1.set_ylabel('番剧数量')
ax2.set_ylabel('追番人数')
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')
plt.title('每年动漫番剧数量与追番人数趋势')
plt.show()
plt.figure(figsize=(8,5))
sns.scatterplot(data=df,x='order',y='score',alpha=0.8,palette='Set2',hue='area',size='order',sizes=(20,200))
plt.title='评分与追番人数关系(气泡大小=追番人数)'
plt.xlabel('追番人数(万)')
plt.ylabel=('评分')
plt.legend(bbox_to_anchor=(1.05,1),loc='upper left')
plt.tight_layout()
plt.show()
动漫番剧与观众趋势分析(1980-2020)¶
产量与观众规模¶
整体发展:
- 动画产业呈现持续扩张态势,2000年后进入加速发展阶段
- 观众规模的增长存在明显滞后性,在产业扩张约十年后才出现显著提升,在2020年达到顶峰.
- 2010年是产业规模与受众群体同步爆发的关键时期
三个发展阶段:
- 萌芽期(1980-1999):产业规模有限,年产量维持在较低水平
- 扩张期(2000-2009):制作数量开始稳定增长
- 爆发期(2010-2020):产量突破历史峰值,观众规模呈指数级增长
产量与作品质量关系¶
长期趋势:
- 产量增长与平均评分存在明显负相关
- 早期(1980年代)作品普遍获得较高评价
- 2010年后随着产量激增,平均评分波动加剧且整体下降
关键点:
- 2013年前后:产量突破100部,平均评分开始持续下降
- 2019年:平均评分达到历史低位,市场出现饱和迹象
受众规模与作品质量¶
- 整体规律:
- 大众关注度与作品质量呈现正相关关系
- 高人气作品(追番人数>1000万)均保持较高评分基准
- 中低关注度区间存在明显的质量分化现象:
- 大部分番剧的追番人数在0-400万,导致该区域气泡密集,同时该区域内小部分番剧评分低于8分;
- 追番人数400-1000万的番剧大部分评分在9分以上
- 地域分布:
- 日本作品占据绝对主导地位
- 非日本产区的作品普遍关注度较低,但质量分布区间较大
3.5 动漫番剧类型词云对比¶
import re
from wordcloud import WordCloud
import pandas as pd
import matplotlib.pyplot as plt
font_path='./simhei.ttf'
def clean_type(text):
"""清洗类型内部文本,保留中英文并去除特殊符号"""
if pd.isna(text):
return ''
return re.sub(r'[^\u4e00-\u9fa5a-zA-Z]', '', str(text)).strip()
def get_type_counts(df):
types = df['table'].dropna().str.split(' ', expand=True).stack()
cleaned = types.apply(clean_type)
return cleaned[~cleaned.isin(['未知', '其他']) & (cleaned != '')].value_counts()
df['score'] = pd.to_numeric(df['score'], errors='coerce')
# 全局词云和高分词云
all_freq = get_type_counts(df)
high_freq = get_type_counts(df[df['score'] >= 9.5])
# 第一张图:所有番剧和评分≥9.5的词云
fig1, axes1 = plt.subplots(1, 2, figsize=(10, 4))
for ax, freq, title in zip(axes1, [all_freq, high_freq], ['所有番剧类型', '评分≥9.5类型']):
wc = WordCloud(width=800, height=400, background_color='black', font_path=font_path).generate_from_frequencies(freq.to_dict())
ax.imshow(wc)
ax.set_title(f'{title}词云', fontsize=16)
ax.axis('off')
plt.tight_layout()
plt.show()
time_ranges = [
('1980-1995', (1980, 1995)),
('1995-2010', (1995, 2010)),
('2010-2020', (2010, 2020))
]
# 第二张图:三个时间段的词云
fig2, axes2 = plt.subplots(1, 3, figsize=(18, 5))
for ax, (time_range, (start, end)) in zip(axes2, time_ranges):
time_df = df[(df['time'] >= start) & (df['time'] <= end)]
time_freq = get_type_counts(time_df)
wc = WordCloud(width=800, height=400, background_color='black',
font_path=font_path).generate_from_frequencies(time_freq.to_dict())
ax.imshow(wc)
ax.set_title(f'{time_range}年份番剧类型词云', fontsize=16)
ax.axis('off')
plt.tight_layout()
plt.show()
print("=== 各分组类型出现次数统计 ===")
动漫番剧类型词云图分析¶
所有番剧与高分番剧对比¶
主流类型:
主流类型奇幻、日常和热血类作品在高分番剧中仍保持稳定优势。
日常类作品在高分段占比提升最为显著,漫画改编作品的高分出现率也明显优于平均水平。
质量特征:
情感向作品整体表现优异,其中治愈、萌系、搞笑类作品更容易获得高评价。
架空、战斗等制作要求高的类型呈现精品化趋势。
不同时期类型演变¶
1980-1995黄金期特征: 科幻和热血类作品占据主导地位,传统少年向题材盛行,整体类型选择较为有限。
1995-2010过渡期变化: 日常系、治愈类作品开始崛起,热血、奇幻、科幻等传统类型仍占据主流,类型细分趋势加剧。
2010-2020新时期发展: 日常类成为最主流类型,漫画改编作品快速增长,少女、少儿类型逐渐减少,类型融合成为创作新趋势。
多维演化动因¶
市场需求:观众偏好从热血型向日常型转变,反映社会压力增大背景下对轻松内容的需求增长
技术支持:制作技术进步使得高精度类型能够实现精品化,推动行业标准提升
内容变化:漫画、小说改编等新形式的崛起改变了类型分布,带来新的创作视角
四、结论与建议¶
调查的主要发现¶
市场格局高度集中
- 日本动漫占据B站番剧总量的95.4%,形成垄断地位
- 美国(3.1%)和英国(1%)等非日本产区作品数量有限,但质量稳定
- 国产动漫在数量上仍有较大发展空间
质量与热度呈现正向关联
- 高分作品(≥9.5)具有更高的追番人数
- "马太效应":优质作品获得超量关注
- 中等热度区间(400-1000万追番)作品质量分化明显
产业演变呈现阶段性特征
- 1980-2010年:产量缓慢增长,平均评分保持高位
- 2010-2020年:产量爆发式增长,平均评分波动下降
- 观众数量增长慢于产业扩张约5-8年
类型偏好发生显著改变
- 从传统"热血/奇幻"主导转向,到"日常/治愈"迅速增长
- 漫画改编作品在高分区间的占比有极大提升
- 2010年后,多种类型融合成为新趋势
动漫行业启示¶
对平台的建议
- 建立更精确、公平的评分权重机制,减少粉丝效应对评价的影响
- 加强非日本产区优质作品的引入和推广
对制作方的建议
- 推进类型融合创新,避免同质化
- 平衡产量与质量的关系,减少过度商业化的影响
- 重视漫画/小说改编等新形式作品的开发价值
- 评估作品时应结合平台用户特点(B站的评分相较于其他平台普遍偏高)
调查的局限与展望¶
数据采集
- 仅包含B站官方排行榜数据和看完用户的评价
研究方法
- 未考虑番剧时长、制作成本等潜在影响因素
未来展望
- 引入多平台数据对比分析
- 建立跨年度、跨地区的综合评价体系