基于对数据分析的兴趣,撰写本次的数据分析案例展示(非教学),若数据分析过程中,存在技术或思路问题,欢迎大家在评论中指出讨论。本文的撰写思路主要包括三大部分:
- 数据集简单描述与来源展示
- 数据分析过程
- 明确分析问题与理解数据
- 数据清洗
- 数据分析及可视化展示
- 数据分析总结
数据集简单描述与来源
数据集是Kaggle平台上公开的数据集:Video Games Sales数据。Video Games Sales With Ratings
数据包含1980年到2020年的电子游戏数据信息,如销售额排名、游戏名称、所属平台、发布年份等。(数据最晚的更新年份是4年前,数据的收集过程根据作者描述,也是从基于对http://vgchartz.com的数据爬取,如何整合到2020年也是令人迷惑,猜测是对预售数据也一并爬取到数据集中了,不过在后续的分析中可以发现从17年到20年的数据存在缺失较多,这也需要在分析过程中进行清洗)
数据分析过程
数据分析过程包括3个部分:明确分析问题与理解数据、数据清洗与数据分析及可视化
一、明确分析问题与理解数据
1.1 明确分析问题
数据分析问题是数据分析的关键,数据分析不是炫技的过程,像日常的数据分析工作中,往往是产品或需求端存在业务问题,需要数据分析工作提供定量分析并根据分析结果指导业务部门解决业务问题,提供科学可行的改进思路与方法。所以在此需要明确数据分析的分析问题。初步提出以下几个分析问题:
- 电子游戏行业的发展情况。
- 哪些发行公司更受玩家的喜爱?
- 哪些类型的游戏更受欢迎?
- 能否通过现有数据,估计出16年的全球销售额?
1.2 理解数据
从Kaggle上下载的数据为csv格式的文本文件,通过Navicat将数据导入到mysql数据库中便可以进行接下来的数据分析操作。其中,导入过程主要有:新建数据表vgsales,并导入csv文件。完成数据导入(导入操作略)。
vgsales为原始数据,为了增加数据分析的容错率,我们新建数据表vgsales1为vgsale的备份数据集,进行后续的数据分析工作。数据字段名称也比较简洁就不进行更改替换了。
-- 新建数据表vgsales1,并复制vgsales表格数据
CREATE TABLE vgsales1
SELECT
*
FROM
vgsales;
接着,查看数据集数据集包含16600条数据记录,共11个数据字段。
-- 查看理解数据
SELECT
*
FROM
vgsales1;
根据字段内容,可以将数据概括分为三类:游戏基本信息、游戏发行信息、游戏销售数据。
二、数据清洗
2.1 清洗重复值
本以为Name字段是游戏名称是辨别重复值的标准,因此通过Name字段查询重复值。
-- 用Name分组,并输出记录大于1条的分组,取出的组便是重复值。
SELECT
Name
FROM
vgsales1
GROUP BY
Name
Having
count(Name)>1;
结果发现有2775条记录被筛选出来,观察结果数据,发现同名游戏存在多平台发售的情况,因此Name字段并不能筛选出重复字段。
于是可以通过Name与Platform作为评判标准,如Name与Platform同时重复出现便是重复记录值。结果表明确实存在重复值,且重复值存在5组,通过子查询
-- 查看是否存在重复值
SELECT
*
FROM
vgsales1
GROUP BY
Name,Platform
Having
count(*)>1;
-- 通过子查询,展示重复值
SELECT
*
FROM
vgsales1
WHERE
(Name,Platform)
in (
SELECT
Name,Platform
FROM
vgsales1
GROUP BY
Name,Platform
Having
count(*)>1
)
ORDER BY
Name,Platform
;
通过网络信息比对,发现极品飞车:最高通缉(Need for Speed most wanted)在PC与X360端的重复记录是由于12年的游戏重置版导致的重复。这是数据源头命名未区分导致的错误,因此在vgsales数据集中我们给12年发布的极品飞车:最高通缉游戏增加后缀(Remastered)便于区分。其他重复数据的销量数据并不相同,数据量也较少只有6条记录,我们选择将其删除。
-- 重新命名 12年发布的极品飞车:最高通缉 为 Need for Speed: Most Wanted Remastered
UPDATE
vgsales1
SET
Name = 'Need for Speed: Most Wanted Remastered'
WHERE
(Name,Year) = ('Need for Speed: Most Wanted','2012')
-- 将重复数据删除(避免MySQL出现,无法同时对同一张表,进行更新与SELECT操作的错误 多加一层SELECT操作)
DELETE
FROM
vgsales1
WHERE
(Name,Platform)
in
(
SELECT
*
FROM
(
SELECT
Name,Platform
FROM
vgsales1
GROUP BY
Name,Platform
HAVING
COUNT(*)>1
)as a
)
;
2.2 处理缺漏值
-- 查询各个字段,是否存在缺失数据
SELECT
COUNT(*) as '总记录数'
COUNT(Name)as 'Name记录数',
COUNT(Platform)as 'Platfrom记录数',
COUNT(Year)as 'Year记录数',
COUNT(Genre)as 'Genre记录数',
COUNT(Publisher)as 'Publisher记录数',
COUNT(NA_Sales)as 'NA销售记录数',
COUNT(EU_Sales)as 'EU销售记录数',
COUNT(JP_Sales)as 'JP销售记录数',
COUNT(Other_Sales)as '其他地区销售记录数',
COUNT(Global_Sales)as '全球销量记录数'
FROM
vgsales1
;
-- 查看Year字段的缺失值
SELECT
*
FROM
vgsales1
WHERE
Year is null;
根据查询结果显示,总记录数16592条,仅有Year字段存在268条缺失值。Publisher字段部分存在Unknown或N/A。268条记录中,不乏具有统计意义的字段,其记录仍具有统计与分析价值,因此将Year中null值填充为0,Publisher中N/A改为‘Unknown’。
-- Year为int类型,因此填充 Null 值为 0
UPDATE
vgsales1
SET
Year = 0
WHERE
Year is NULL;
-- Publisher为varchar(255),填充 N/A 值为 Unknown
UPDATE
vgsales1
SET
Publisher = 'Unknown'
WHERE
Publisher = 'N/A';
2.3 处理异常值与不需要的数据
数据型数据只有,销售数据与发行年份。因此在核对完,销售数据不存在小于0的值后,开始对年份异常进行查询。已知数据记录时间跨度为1980-2020年份,因此在此年份区间外的数据需要清洗。且数据记录时间2016年,因此16年之后的数据可能存在不全的问题,会影响后续的分析。因此,将数据按年份分组后查询各年份对应的记录数,并基于此结果对数据进行清洗。
-- 查询字段Year对应的记录,便于处理异常值
SELECT
Year,
COUNT(*)as '记录数'
FROM
vgsales1
GROUP BY
Year
ORDER BY
COUNT(*) DESC
;
为了更清晰地展示不同年份存在的记录,将输出数据导入excel文件中,并运用直方图可视化展示数据分布。(未用记录为‘0’的缺失值)
结果中可以看到,记录的年份数据均属于合理范围1980-2020之间,不存在异常值,2017年-2020年数据确实较少,且这些数据为2016年记录的,其真实性不高,删除17-20年数据。就得到了最终清洗完的数据集。
-- 删除17-20 数据记录
DELETE
FROM
vgsales1
WHERE
Year > 2016;
三、数据分析与可视化
完成了数据清洗与数据预处理的工作,就能开始后续数据分析的工作了,具体的分析过程按分析问题进行具体操作与分析。
3.1 电子游戏行业的发展情况
行业分析常用的模型有PEST分析,但数据有限,无法进行系统和全面的分析。现有数据集中由于缺乏政治、经济、技术等内容的相关特征值,无法从这些角度展开分析,数据集只包含市场类数据。
从市场角度看,数据集中便有具有市场特性的两项指标便是销售额(需求方)与发行数量(供给方),这两项指标能反映市场供方对市场的预期与需求方对产品的需求程度。
本数据集中还可以根据年份分组得到发行公司首次进入市场的年份,从而得到每年新入行业的发行公司数,也象征着行业的发展与对市场的预期程度(从已有特征提取)。
- 行业总体发展
-- 按年份分组,提取行业销售总额(以及各地区数据)、提取数据发行数量
SELECT
Year,
SUM(Global_sales)as'全球销售额度',
COUNT(*)as'发行数量',
SUM(NA_sales)as'北美销售额度',
SUM(EU_sales)as'欧洲销售额度',
SUM(JP_sales)as'日本销售额度',
SUM(Other_sales)as'其他地区销售额度'
FROM
vgsales1
WHERE
Year <> 0
GROUP BY
Year
ORDER BY
Year DESC
;
-- 按发行公司分组,取最早年份记录,得到每年的新增发行商个数(发行商中‘Unknown只影响某一年的1个计数,可忽略不计’)
SELECT
Year,
COUNT(*)AS'新增发行商'
FROM
(SELECT
Publisher,Year
FROM
vgsales1
WHERE
Year <>0
GROUP BY
Publisher
HAVING MIN(Year)
ORDER BY
Year
)as a
GROUP BY
Year
;
数据为了展示整体趋势,因此选择折线图进行可视化。
结合图7与图8中可以看出
1980-1992年为电子游戏行业萌芽期,游戏发行数量较为稳定(图8)保持在年均20份左右,而全球的游戏销售量则稳定攀升(图7)(图7中销售数据呈锯齿状,个人判断是由于按年度划分过于精细,小于游戏佳作的发行间隔导致的。若将统计年份按2-3年为一个记录点,进行统计,那么80-92年期间,销售额是呈平稳增长的线条形态),说明游戏消费者市场总量在增加。若要更具体的描述,可能是更多的玩家接触到电子游戏,又或者是游戏制作水平与游戏质量提升吸引到更多消费群体(需要更为精确的数据进行分析)。综上,此阶段中,消费群体增加,产品供给较为平稳,发行商少量进入市场。
1993-2009年为电子游戏行业的高速发展阶段,游戏发行公司开始大量涌入市场(图9),从1993年的新增6个发行商,到98年新增31个的局部峰值,(98年可能受到金融危机的影响,没有进一步上涨)经过几年的曲折后,于08年到达最高值,当年有46个发行公司加入电子游戏行业。高速发展期间,发行数呈井喷式发展,总体与年份增长呈高度正相关。至于消费群体,可以反证式分析,如果消费群体没有增加即消费群体消费总额存在阈值,则销售额会随发行量增长至某一阈值后不再增加,因此消费群体要么是在80年之前就已经有很大基数,否则也是在行业高速发展阶段在平稳的增加(因销售额与发行数增长率相近,所以不应该是爆发式增长)。而80年,电子游戏行业还是萌芽阶段,因此更倾向于消费群体在平稳增加。
2009-2015年为电子游戏行业的成熟阶段,从销售数据、发行游戏数、新增发行商三个角度看,其数值都存在一定程度的回落。(此处应忽略16年数据,数据集在16年完成上传,因此16年数据不完成,存在缺漏值。)但从数据上看,行业整体没有数据显示的那么悲观,总体而言,此阶段销售额下降61%,发行数下降57%,市场小幅度收缩趋于平稳(发行数下降是导致销售额下降的主要原因,因总体看发行数与销售额高度相关性)。
3.2 哪些游戏发行公司更受玩家的喜爱?
受喜爱的发行公司,可以从多个维度来评判,如某一年最喜欢,或总体受众最多等等。因此需要对于分析问题及维度进行定义。
定义时间维度,如果以每年作为维度难免出现大量相同的排名信息量较散无法突出重点,因此我们将分析的时间按发展阶段进行划分,萌芽期游戏发行数量有限整体作为一个分析区间(80-93),高速发展阶段有大量游戏发行分为4个分析区间(94-09),成熟期分为两个分析区间(10-15)。
定义喜爱维度,我认为市场对产品的喜爱程度应该由消费者群体数量来衡量更为贴切(销售数量受到发行数的影响不能表现欢迎程度),根据二八原理,公司受喜爱的玩家大多来自公司最受欢迎的头部游戏。因此,我们选取发行公司最畅销的1款游戏销售额,作为发行公司某年受欢迎程度的代理变量。
3.2.1 按时间分区,对发行公司受欢迎程度分析
-- 将数据按区间分组,并创建视图便于反复使用
CREATE VIEW Section_View
AS
SELECT
Name,Publisher,Global_Sales,NA_Sales,EU_Sales,JP_Sales,Other_Sales,
(CASE WHEN Year <1994 THEN '第一分区'
WHEN Year<1998 THEN '第二分区'
WHEN Year<2002 THEN '第三分区'
WHEN Year<2006 THEN '第四分区'
WHEN Year<2010 THEN '第五分区'
WHEN Year<2013 THEN '第六分区'
ELSE '第七分区' END
)区间
FROM
vgsales1
;
接着按区间进行数据提取
-- 第一区间,前10的发行商、代表作品及销量
SELECT
Publisher,Name AS'代表作',Global_Sales AS '全球销量'
FROM
section_view
WHERE
`区间` = '第一分区'
GROUP BY
Publisher
HAVING
MAX(Global_Sales)
LIMIT 10
;
-- 其他区间只需要更换 where语句中的条件,不过多陈列。
以上操作得到各区间内发行商的受欢迎程度排名数据,由于数据涉及多个图表可视化为了方便操作使用tableau进行可视化。
以上4张图中能看到具体分区内的游戏受欢迎程度排名,但表格信息过多有点无法精练,适合感兴趣的读者按分区阅读,为了方便得出精练的结论,我们用excel表格进行统计整理。
3.2.2 综合受欢迎程度发行公司排名前10
任天堂从1980-2009年一直是最受玩家欢迎的发行公司,在2010-2015年也屈居第二。不可否认是最受玩家喜爱的发行公司,表中2的排名,也与我们对游戏发行商的认知较为匹配。
3.3 哪些类型的游戏更受欢迎?
在分析之前需要了解有哪些游戏类型
-- 挑选出游戏类型及所属类型游戏数
SELECT
Genre,COUNT(*)AS '游戏数'
FROM
vgsales1
GROUP BY
Genre
ORDER BY
COUNT(*) DESC
;
-- 挑选出游戏平台以及所属的游戏数
SELECT
Platform,COUNT(*)AS '游戏数'
FROM
vgsales1
GROUP BY
Platform
ORDER BY
COUNT(*) DESC
;
游戏类型包括12种,动作、运动、混合、角色扮演、射击类等,而游戏平台则是由24种,其中PS2上发行的游戏数最高已经达到2161款。
之后可以同样使用时间分区来筛选出不同分区内受喜爱的游戏类型与游戏平台。
-- 同样先创立视图 Section_View1
CREATE VIEW Section_View1
AS
SELECT
Name,Genre,Platform,Global_Sales,
(CASE WHEN Year <1994 THEN '第一分区'
WHEN Year<1998 THEN '第二分区'
WHEN Year<2002 THEN '第三分区'
WHEN Year<2006 THEN '第四分区'
WHEN Year<2010 THEN '第五分区'
WHEN Year<2013 THEN '第六分区'
ELSE '第七分区' END
)区间
FROM
vgsales1
;
-- 挑选出不同游戏类型以及其对应的销售额与游戏数量并求出平均销售额(只展示第一分区,其他分区换where条件即可)
SELECT
Genre,COUNT(*),SUM(Global_sales),AVG(Global_sales),区间
FROM
section_view1
WHERE
区间 = '第一分区'
GROUP BY
Genre
;
1980-1997年期间平台型游戏最受玩家欢迎,以最高销售额度与平均销售额度稳居第一,玩家更倾向游玩平台型的游戏。除此之外,93年之前解密类游戏也受到市场高度认可,但在之后时期,解密慢慢淡出玩家的视线(很大可能是解密成为游戏内元素而不适合单独作为一类游戏),在这两个阶段其他热门游戏有动作类、运动类、角色扮演类等。
动作类、和运动类游戏随着游戏行业的发展,逐渐占据了市场销售额的主导地位。图中不难看出,98-05年各类游戏综合排名较为相似,热门的六大游戏类型为:动作、运动、竞赛、平台、角色扮演、大杂烩类(Misc)。
大体不变,解密类与策略类逐渐垫底,部分玩家开始热衷于射击类游戏。
玩家偏好几乎没有变化。
综合而言,总期玩家喜爱平台游戏、动作游戏、解密类游戏、运动类游戏、随着游戏行业发展,动作类、运动类游戏一直占据玩家心目中较高的位置,而解密游戏被部分玩家遗忘,射击类与角色扮演类游戏则稳步发展。
3.4 能否通过现有数据,估计出16年全年的全球销售额?(此部分该用python进行数据分析)
对于时间序列数据的预测,我们采取较常用的ARIMA模型进行销售额的预测。因此,我们不需要过多的特征值来辅助模型的拟合,只需要提取出必要的时间数据、全球销量数据用于预测。
-- 提取需要的输出,并导出为csv文本文件
SELECT
Year,
sum(Global_sales)
FROM
vgsales1
WHERE
Year>0 AND Year<2016
GROUP BY
Year
ORDER BY
Year DESC
;
接下来用python进行后续的建模与分析
#导入数据模块
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels as sm
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
# 导入数据、理解数据
Game_sales_data = pd.read_csv('./VG_Sales_by_Year.csv',names = ['Year','Sales'])
print('数据结构为:n',Game_sales_data.shape)
print('数据预览:n',Game_sales_data.head(10))
# 数据清洗、拆分数据集
data_cleaner = Game_sales_data.copy()
data_cleaner = data_cleaner.set_index(['Year'])
data_cleaner = data_cleaner.sort_index()
# 拆分数据集
n_train = round(data_cleaner.shape[0]*0.9)
data_train = data_cleaner.iloc[:n_train]['Sales']
data_test = data_cleaner.iloc[n_train+1:]['Sales']
print('训练集数据集结构如下:n',data_train.shape)
print('测试集数据集结构如下:n',data_test.shape)
#返回结果:(32,) (3,),即1980-2012年数据为训练集,而13-15年三年数据归为测试集。
# 用于模型拟定后的测试,反应模型的泛化能力,以及是否存在过拟合现象。
# 模型建立与分析
# 第1步:对现有时间序列数据进行平稳性检验(画图、单位根检验)
plt.figure(figsize = (10,6))
data_train.plot()
plt.show()
#画自相关图
plot_acf(data_train,lags = 20).show()
# 平稳性检验(单位根检验)
print('测试集数据的单位根检验结果为:',sm.tsa.stattools.adfuller(data_train))
#单位根检验中 p值为0.91,检验不显著,接受原假设,因此训练集数据为非平稳时间序列数据。
自相关图中,训练集数据的滞后值相关系数呈发散状态,没有收敛趋势,训练集数据在时间序列上呈非平稳状态,数据具有一定的趋势性,需要对数据进行差分处理,较少数据中的趋势信息量,使数据到达平稳,能使用ARIMA模型进行预测。
# 对数据进行一阶差分,并将差分后的值进行平稳性检验,(趋势图,自相关图,单位根检验)
train_dif1 = data_train.diff(periods=1).dropna()
# 一阶差分画折线图
plt.figure(figsize = (10,6))
train_dif1.plot()
plt.show()
# 自相关图
plot_acf(train_dif1,lags = 25).show()
# 单位根检验
print('一阶差分的ADF检验为:n',sm.tsa.stattools.adfuller(train_dif1))
#单位根检验结果显示:p值为0.0004 <0.001 在0.001的水平上显著,因此拒绝原假设。
#一阶差分数据为平稳时间序列数据
时间趋势平稳、自相关图1阶后趋于收敛,与单位根检验结果一直,一阶差分数据为平稳的时间序列数据。
#白噪声检验
# 第2步:对差分后数据进行 序列数据进行白噪声检验
print('白噪声检验结果为:n',acorr_ljungbox(train_dif1,lags = 1))
/*
白噪声结果:p值为0.8826,p值不显著,接受原假设,因此一阶差分数据,
在差分的过程中将原数据中能够预测自身变化的相关信息给过滤了,1阶差分后的信息为随意波动的白噪声数据
无法预测之后的时间序列数据。
因此ARIMA 模型失效
此处可用ARFIMA模型 对数据进行分数级的差分,从而减少信息的过滤程度,并能通过差分后的数据进行预测
但ARFIMA模型过于复杂,我仍在学习中,此次实践分析分享就不做进一步预测实践。
*/
数据分析总结
本次实践,完成了对电子游戏行业的发展分析,受欢迎的发行公司统计分析,受欢迎的游戏类型的分析,而由于ARIMA模型的失效,没有完成对于16年及之后销售量的估计与预测。
在电子游戏行业分析中,将游戏的整个发展阶段,总结为:萌芽期、高速发展期、成熟期,对应着游戏行业的起步、飞速发展、市场趋于饱和的三个阶段现象,但现有分析中由于数据有限,对市场的具体发展轨迹无法进一步分析,上面分析中也只是基于现有数据特征对市场变化做出了大致的逻辑推理。如果需要对市场规模、消费者群体变化有更清楚的了解与掌握,需要进一步收集数据。如,游戏具体销量(份),游戏每年的具体销售额,游戏玩家人均消费额度等。因此这部分,分析可以通过收集数据进行进一步的分析工作。其实上述分析中,将游戏发售的年份用于衡量销售额产生的年份,会使销售额趋势图较实际中的发展呈左侧集中,现实中游戏行业增长与回落会更平缓,峰值也可能更小。
受欢迎的发行公司统计分析,受欢迎的游戏类型的分析,两个分析中,都对时间进行了离散化,把时间化为了7个区间,主要是为了使最终结果更有结论性与富有意义。分析存在的缺陷主要有两个部分,一是对时间离散化依据不够严谨,主要是通过对发行游戏数量口头估计进行的划分(其实还综合了不同发展阶段,年份是否能被整除、均分);另外,估计受欢迎程度的主流方法,较多的是通过模型整合特征值来拟定喜爱指数,通过模型优化,使指数更拟合现实,这样的分析方法会更为严谨,同样也是受限于特征值数量不足,无法展开分析。
最后,就是逃课的ARFIMA模型,网络的相关学习资料也不丰富,ARFIMA模型更多被使用于学术研究中,例如,预测金融时间序列的发展。模型背后的理论推导也十分复杂,并且与我期望学习方向有差异,因此暂时搁下了,要是有时间再回来补上。