电子游戏销售数据分析(基于Python+Tableau)
1 项目简介
1.1 数据描述
(1)数据来源
本次分析所采用的数据来源于kaggle上的Video Game Sales数据集 ,该数据集通过爬虫从vgchartzwangz网站上获取,主要描述了全球市场上电子游戏的一个销售情况。电子游戏(Video Games,少部分学者使用Electronic Games)又称电玩游戏(简称电玩),是指所有依托于电子设备平台而运行的交互游戏。根据媒介的不同多分为五种:主机游戏(或称家用机游戏、电视游戏)、掌机游戏、电脑游戏、街机游戏和移动游戏(主要是手机游戏)。一般市场上我们所接触的游戏都是电子游戏。
(2)数据描述
首先将数据集导入Python中进行分析,观察数据集所存在的字段及属性。
#导入常用包
import numpy as np
import pandas as pd #导入数据
data=pd.read_csv('vgsales.csv')
data.info() #给出样本数据的相关信息概览
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16598 entries, 0 to 16597
Data columns (total 11 columns):
Rank 16598 non-null int64
Name 16598 non-null object
Platform 16598 non-null object
Year 16327 non-null float64
Genre 16598 non-null object
Publisher 16540 non-null object
NA_Sales 16598 non-null float64
EU_Sales 16598 non-null float64
JP_Sales 16598 non-null float64
Other_Sales 16598 non-null float64
Global_Sales 16598 non-null float64
dtypes: float64(6), int64(1), object(4)
memory usage: 1.4+ MB
可以知道数据集有16598个样本,11个字段,各个字段的主要含义如下:
1.2 分析背景及目的
根据现有的字段,可以从用户、发行商、市场三个方面去分析,得到近年来电子游戏的市场销售情况,具体关注的问题和指标如下:
(1)用户层面
最受用户喜爱的前十款游戏是什么?
用户最常玩的游戏类型是什么?
用户常用的游戏平台是什么?
(2)发行商层面
销量最好的发行商是?前十有哪些?
发行商的发布游戏数量情况?
(3)市场层面
全球市场电子游戏销售额如何变化?
四大地区市场总额如何变化?
主流游戏类型、游戏平台的变化。
(4)数据预测
预测未来两年电子游戏销售总额
1.3 分析思路
进一步,通过数据分析完成对上面问题的回答,分析思路为先采用Python进行数据清洗,再通过tableau进行数据分析及可视化。
2 数据清洗
2.1 缺失值处理
data.head()
Rank | Name | Platform | Year | Genre | Publisher | NA_Sales | EU_Sales | JP_Sales | Other_Sales | Global_Sales | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Wii Sports | Wii | 2006.0 | Sports | Nintendo | 41.49 | 29.02 | 3.77 | 8.46 | 82.74 |
1 | 2 | Super Mario Bros. | NES | 1985.0 | Platform | Nintendo | 29.08 | 3.58 | 6.81 | 0.77 | 40.24 |
2 | 3 | Mario Kart Wii | Wii | 2008.0 | Racing | Nintendo | 15.85 | 12.88 | 3.79 | 3.31 | 35.82 |
3 | 4 | Wii Sports Resort | Wii | 2009.0 | Sports | Nintendo | 15.75 | 11.01 | 3.28 | 2.96 | 33.00 |
4 | 5 | Pokemon Red/Pokemon Blue | GB | 1996.0 | Role-Playing | Nintendo | 11.27 | 8.89 | 10.22 | 1.00 | 31.37 |
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16598 entries, 0 to 16597
Data columns (total 11 columns):
Rank 16598 non-null int64
Name 16598 non-null object
Platform 16598 non-null object
Year 16327 non-null float64
Genre 16598 non-null object
Publisher 16540 non-null object
NA_Sales 16598 non-null float64
EU_Sales 16598 non-null float64
JP_Sales 16598 non-null float64
Other_Sales 16598 non-null float64
Global_Sales 16598 non-null float64
dtypes: float64(6), int64(1), object(4)
memory usage: 1.4+ MB
根据上表各字段的属性可知,年份(Year)字段和Publisher(发行商)存在缺失值,根据现有信息无法进行缺失样本的年份判断,进行缺失填补也不符合常理,因此,将年份字段存在缺失值的个案删除。
df=data.dropna(subset=['Year']) #删除Year列中存在缺失值的行
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 16327 entries, 0 to 16597
Data columns (total 11 columns):
Rank 16327 non-null int64
Name 16327 non-null object
Platform 16327 non-null object
Year 16327 non-null float64
Genre 16327 non-null object
Publisher 16291 non-null object
NA_Sales 16327 non-null float64
EU_Sales 16327 non-null float64
JP_Sales 16327 non-null float64
Other_Sales 16327 non-null float64
Global_Sales 16327 non-null float64
dtypes: float64(6), int64(1), object(4)
memory usage: 1.5+ MB
此时发行商变量还存在缺失值,考虑到所缺失的个数为36个,缺失的比例极小,可以直接将该变量缺失的个案删除。
df1=df.dropna(subset=['Publisher'])
df1.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 16291 entries, 0 to 16597
Data columns (total 11 columns):
Rank 16291 non-null int64
Name 16291 non-null object
Platform 16291 non-null object
Year 16291 non-null float64
Genre 16291 non-null object
Publisher 16291 non-null object
NA_Sales 16291 non-null float64
EU_Sales 16291 non-null float64
JP_Sales 16291 non-null float64
Other_Sales 16291 non-null float64
Global_Sales 16291 non-null float64
dtypes: float64(6), int64(1), object(4)
memory usage: 1.5+ MB
已经不存在缺失值,考虑可能存在重复个案,删除重复值。
2.2 重复值处理
df1.drop_duplicates(inplace=True) #删除列完全重复的个案
df1.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 16291 entries, 0 to 16597
Data columns (total 11 columns):
Rank 16291 non-null int64
Name 16291 non-null object
Platform 16291 non-null object
Year 16291 non-null float64
Genre 16291 non-null object
Publisher 16291 non-null object
NA_Sales 16291 non-null float64
EU_Sales 16291 non-null float64
JP_Sales 16291 non-null float64
Other_Sales 16291 non-null float64
Global_Sales 16291 non-null float64
dtypes: float64(6), int64(1), object(4)
memory usage: 1.5+ MB
没有重复值,进一步分析数据的异常值情况。
2.3 异常值处理
考虑到数据为包含时间的面板数据,查看各年份的数据分布情况。
df1.groupby('Year').count()
Rank | Name | Platform | Genre | Publisher | NA_Sales | EU_Sales | JP_Sales | Other_Sales | Global_Sales | |
---|---|---|---|---|---|---|---|---|---|---|
Year | ||||||||||
1980.0 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 |
1981.0 | 46 | 46 | 46 | 46 | 46 | 46 | 46 | 46 | 46 | 46 |
1982.0 | 36 | 36 | 36 | 36 | 36 | 36 | 36 | 36 | 36 | 36 |
1983.0 | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 17 |
1984.0 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 |
1985.0 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 |
1986.0 | 21 | 21 | 21 | 21 | 21 | 21 | 21 | 21 | 21 | 21 |
1987.0 | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
1988.0 | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 15 |
1989.0 | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 17 | 17 |
1990.0 | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
1991.0 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 |
1992.0 | 43 | 43 | 43 | 43 | 43 | 43 | 43 | 43 | 43 | 43 |
1993.0 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 |
1994.0 | 121 | 121 | 121 | 121 | 121 | 121 | 121 | 121 | 121 | 121 |
1995.0 | 219 | 219 | 219 | 219 | 219 | 219 | 219 | 219 | 219 | 219 |
1996.0 | 263 | 263 | 263 | 263 | 263 | 263 | 263 | 263 | 263 | 263 |
1997.0 | 289 | 289 | 289 | 289 | 289 | 289 | 289 | 289 | 289 | 289 |
1998.0 | 379 | 379 | 379 | 379 | 379 | 379 | 379 | 379 | 379 | 379 |
1999.0 | 338 | 338 | 338 | 338 | 338 | 338 | 338 | 338 | 338 | 338 |
2000.0 | 349 | 349 | 349 | 349 | 349 | 349 | 349 | 349 | 349 | 349 |
2001.0 | 482 | 482 | 482 | 482 | 482 | 482 | 482 | 482 | 482 | 482 |
2002.0 | 829 | 829 | 829 | 829 | 829 | 829 | 829 | 829 | 829 | 829 |
2003.0 | 775 | 775 | 775 | 775 | 775 | 775 | 775 | 775 | 775 | 775 |
2004.0 | 744 | 744 | 744 | 744 | 744 | 744 | 744 | 744 | 744 | 744 |
2005.0 | 936 | 936 | 936 | 936 | 936 | 936 | 936 | 936 | 936 | 936 |
2006.0 | 1008 | 1008 | 1008 | 1008 | 1008 | 1008 | 1008 | 1008 | 1008 | 1008 |
2007.0 | 1201 | 1201 | 1201 | 1201 | 1201 | 1201 | 1201 | 1201 | 1201 | 1201 |
2008.0 | 1428 | 1428 | 1428 | 1428 | 1428 | 1428 | 1428 | 1428 | 1428 | 1428 |
2009.0 | 1431 | 1431 | 1431 | 1431 | 1431 | 1431 | 1431 | 1431 | 1431 | 1431 |
2010.0 | 1257 | 1257 | 1257 | 1257 | 1257 | 1257 | 1257 | 1257 | 1257 | 1257 |
2011.0 | 1136 | 1136 | 1136 | 1136 | 1136 | 1136 | 1136 | 1136 | 1136 | 1136 |
2012.0 | 655 | 655 | 655 | 655 | 655 | 655 | 655 | 655 | 655 | 655 |
2013.0 | 546 | 546 | 546 | 546 | 546 | 546 | 546 | 546 | 546 | 546 |
2014.0 | 580 | 580 | 580 | 580 | 580 | 580 | 580 | 580 | 580 | 580 |
2015.0 | 614 | 614 | 614 | 614 | 614 | 614 | 614 | 614 | 614 | 614 |
2016.0 | 342 | 342 | 342 | 342 | 342 | 342 | 342 | 342 | 342 | 342 |
2017.0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2020.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
发现2017年和2020年的数据量过少,且两者之间年份不连续,存在2018、2019年数据的缺失,因此删除2017和2020年的数据再进行分析。
'''data.name.isin([筛选元素])
对dataframe的某列(name为列名)进行筛选,加负号的原因是想删除符合条件的行,不写负号是筛选出符合条件的行'''
df2=df1[-df1.Year.isin([2017])]
df2=df2[-df2.Year.isin([2020])]
df2.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 16287 entries, 0 to 16597
Data columns (total 11 columns):
Rank 16287 non-null int64
Name 16287 non-null object
Platform 16287 non-null object
Year 16287 non-null float64
Genre 16287 non-null object
Publisher 16287 non-null object
NA_Sales 16287 non-null float64
EU_Sales 16287 non-null float64
JP_Sales 16287 non-null float64
Other_Sales 16287 non-null float64
Global_Sales 16287 non-null float64
dtypes: float64(6), int64(1), object(4)
memory usage: 1.5+ MB
得到处理后的数据df2,对其进行描述性统计分析,了解数据基本情况。
df2.describe().T
count | mean | std | min | 25% | 50% | 75% | max | |
---|---|---|---|---|---|---|---|---|
Rank | 16287.0 | 8288.969853 | 4792.138597 | 1.00 | 4131.50 | 8291.00 | 12437.50 | 16600.00 |
Year | 16287.0 | 2006.402775 | 5.830382 | 1980.00 | 2003.00 | 2007.00 | 2010.00 | 2016.00 |
NA_Sales | 16287.0 | 0.265695 | 0.822525 | 0.00 | 0.00 | 0.08 | 0.24 | 41.49 |
EU_Sales | 16287.0 | 0.147768 | 0.509360 | 0.00 | 0.00 | 0.02 | 0.11 | 29.02 |
JP_Sales | 16287.0 | 0.078849 | 0.311916 | 0.00 | 0.00 | 0.00 | 0.04 | 10.22 |
Other_Sales | 16287.0 | 0.048437 | 0.190105 | 0.00 | 0.00 | 0.01 | 0.04 | 10.57 |
Global_Sales | 16287.0 | 0.541022 | 1.567520 | 0.01 | 0.06 | 0.17 | 0.48 | 82.74 |
df2.describe(include='object').T
count | unique | top | freq | |
---|---|---|---|---|
Name | 16287 | 11322 | Need for Speed: Most Wanted | 12 |
Platform | 16287 | 31 | DS | 2130 |
Genre | 16287 | 12 | Action | 3250 |
Publisher | 16287 | 576 | Electronic Arts | 1339 |
由描述统计结果可知,该数据集包括1980-2016年的电子游戏销售情况,其中涉及到11322款游戏,由576个发行商,31中游戏类型,12类游戏平台。
3 数据分析
接下来将数据导入tableau中进行分析,以期望得到前文所关注的各类问题。
3.1 用户
#将字段名重命名为中文名,便于分析
feild={'Rank':'销售排名','Name':'游戏名','Platform':'平台','Genre':'游戏类型','Publisher':'发行商','NA_Sales':'北美销售额','EU_Sales':'欧洲销售额','JP_Sales':'日本销售额','Other_Sales':'其他地区的销售额','Global_Sales':'全球总销售额'} #创建字典df2.rename(columns=feild,inplace=True) #对df2重命名
#导出数据为CSV格式
df2.to_csv('vgnew.csv')
关注的问题
最受用户喜爱的前十款游戏是什么?
用户最常玩的游戏类型是什么?
用户常用的游戏平台是什么?
由上图可知,在1980-2016年这段时间,销售量最高的10款游戏分别是Call of Duty: Black Ops II、Call of Duty: Modern Warfare 3、Grand Theft Auto V、Mario Kart Wii、New Super Mario Bros、Pokemon Red/Pokemon Blue、Super Mario Bros、Tetris、Wii Sports、Wii Sports Resort,销量最高的平台是PS2,销量最高的游戏类型是Action动作类游戏,动作类游戏比较受到玩家的喜爱。
3.2 发行商
关注的问题:
销量最好的发行商是?前十有哪些?
前十发行商的发布游戏数量情况?
上图为游戏销售额排行前十的发行商以及各个发型上对应的游戏发行数量,可以发现游戏发行数量与发行商的排名不一致,并非是发行游戏越多的厂商其销售额约好,排行第六的Take-Two Interactive 发行的游戏数量远比排名在他后面的厂商低,这表明该厂商发行的游戏质量较高或者是出现了爆款游戏。
3.3 市场
问题
全球市场电子游戏销售额如何变化?
四大地区市场总额如何变化?
市场销售额变动的主要来源是?各类游戏的销售额占比情况变化?
根据上图,对1980-2016年的电子游戏行业市场情况进一步分析。总体来看,1980-1995年电子游戏市场呈现平稳发展的趋势,1995-2007年电子游戏市场蓬勃发展,呈现爆发式提升,2007、2008年电子游戏行业达到巅峰,此后开始,电子游戏行业又逐步回落,直到2016年,全球销售总额已经低于1995年的水平,电子游戏行业市场陷入了低迷期。
分地区市场来看,1980-2016年全球的电子游戏行业总销售额中北美和欧洲占据主导,其次是日本,其他地区的总销售额均低于这三大地区,观察历年各地区的销售额情况变化,发现近年来北美和欧洲市场依旧是占据大头,而日本和其他地区的市场销售额差距不大。
观察历年来游戏类型的一个变化情况,1981-1995年占据主要市场的是Puzzle和Platform,而从1995年起至2016,Action、Misc、Sports、Shooter占据了主要市场。
观察历年来游戏平台的变化情况,主流游戏平台由PS转向PS2,进而变成PS2、DS、WII,逐步发展为PS3、DS、WII、X360,而随着市场的减弱,DS、WII、X360衰落,主流平台变成了PS4,出现了Xone新平台争抢市场。
3.4 预测分析
预测未来2017-2022年的电子游戏销售总额。
采用tableau进行预测分析,不考虑季节性,考虑趋势为累乘,得到2017-2022年的预测值,预测在未来几年里,电子游戏的销售额继续降低。
4 研究总结
本项目主要是利用Video Game Sales数据集对于1980-2016年全球电子游戏行业销售情况进行分析,了解电子游戏行业的发展情况。分析思路是先通过Python进行数据清洗,然后采用Tableau进行可视化分析。具体研究内容从用户、发行商、市场三个视角进行,在用户层面,探究了最受欢迎的游戏、游戏平台、游戏类型;在发行商层面,求出了销量最好的发行商,并分析了其历年发布游戏数量的变化;在市场层面,分析了全球市场电子游戏销售额如何变化,四大地区市场总额如何变化,并分析了历年来主流游戏类型和游戏平台的变化,最后对2017-2022年的电子游戏销售总额进行了预测。
电子游戏销售数据分析(基于Python+Tableau)相关推荐
- 天池-淘宝用户行为数据分析(python+Tableau)
天池-淘宝用户行为数据分析(python+Tableau) 一.背景 用户行为分析可以让产品更加详细.清楚地了解用户的行为习惯,从而找出网站.app.推广渠道等产品存在的问题,有助于产品发掘高转化 ...
- 2天,我把数据分析的Python+Tableau+Excel工具撸干净了!
春节回家,看到朋友晒的年终奖,我羡慕不已. 他入职腾讯一年半,拿了3个月工资作为年终奖.据他所说,这还不算什么,网易<哈利波特·魔法觉醒>项目组,所有员工奖励888888元-- 虽然说并不 ...
- 景点门票销售管理系统 基于 python实现gui界面 之 笔记
1.建立数据库.建表.加外键约束.建触发器 此处106行 CREATE DATABASE IF NOT EXISTS `景点门票销售管理系统` DEFAULT CHARACTER SET utf8;U ...
- python超市售货统计程序_零售超市项目销售数据分析(Python)
一.项目背景:现有一家零售超市2017-2020年的订单信息,2020年各销售指标持续上升,但是利润总额年增长率下滑,净利润率下滑,分析该超市的历年销售业绩表现和利润构成,探究利润总额增长速度下滑的原 ...
- 【大数据分析专业毕设之基于python的手机销售大数据分析可视化系统】
[大数据分析专业毕设之基于python的手机销售大数据分析可视化系统] https://b23.tv/FKuPbsv flask web框架,数据使用requests模块爬取https://www.j ...
- 基于python的旅游系统_基于python的去哪儿网旅游数据分析
20011 基于python的去哪儿网旅游数据分析 运行视频.代码等: 链接:https://pan.baidu.com/s/1tw4Qvtcuwt7ys36M7HvLSg 提取码:1589 复制这段 ...
- 基于python的数据分析毕业设计-基于python的Web大数据采集和数据分析
肖乐 丛天伟 严卫 摘要:该设计使用python语言作为开发语言,主要采用了两个框架:Scrapy和Django,用Scrapy来实现数据的采集技术,让数据采集效率更高,错误率低等:用Django来实 ...
- 26个数据分析案例——第一站:基于Python的HBase冠字号查询系统
26个数据分析案例--第一站:基于Python的HBase冠字号查询系统 实验所需环境 • Python: Python 3.x: • Hadoop 2.7.7环境: • HBase 1.3.5: 数 ...
- 【python】【数据分析】2022年全国大学生数据分析大赛题解-医药电商销售数据分析
文章目录 一.前言 二.题目 三.题解 1.对店铺进行分析,一共包含多少家店铺,各店铺的销售额占比如何?给出销售额占比最高的店铺,并分析该店铺的销售情况. 2.对所有药品进行分析,一共包含多少个药品, ...
最新文章
- Ext.widgets-Button,SplitButton,CycleButton
- 第三章:3.栈和队列 -- 栈与递归的实现
- 经典C语言程序100例之九九
- 51nod 1785 数据流中的算法 (方差计算公式)
- [css] 如何禁用移动的选择高亮?
- 广州交警发布路考秘籍 科目三扣分点近80项
- java9-1.类,抽象类,接口的综合小练习
- iPhone 13 mini背部新外观曝光:双摄对角线排布
- ext列表禁止滑动_后台列表设计避坑指南(下)
- Qt总结之十一:内存泄漏(汇总)
- Nginx如何实现读写限流的方法
- 智课雅思词汇---一、如何学英语
- 第2章 系统的分层结构
- 文章编辑数据结构课程设计
- ios教程,用pc开发ios游戏
- matlab传递函数带符号变量,符号传递函数matlab
- 11年艺术学习“转投”数学,他出版首本TensorFlow中文教材,成为蚂蚁金服技术大军一员...
- 服务器网页内容修改了不变动,修改服务器网页
- div rot grad
- armbian系统实现服务器重启后自动运行指令及解决rc.local和rc-local.service出现的错误