一、导入库
1.1导入数据处理包
import numpy as np
import pandas as pd
1.2导入数据可视化包
import matplotlib.pyplot as plt
import missingno as msno
import seaborn as sns
sns.set()
sns.set_style('whitegrid', {'font.sans-serif':['simhei', 'Arial']})
#解决seaborn中文乱码问题
%matplotlib inline
%config InlineBackend.figure_format="retina" #提高图片分辨率
二、读取数据
data = pd.read_csv(r"D:\work\database\game\vgsales.csv") #读取数据
三、数据集探索
3.1查看数据集的大小
#1.查看数据集的大小
data.shape
共有16598行数据,11个字段
3.2查看前几行,随便几行
data.head(5)
data.sample(5) #随便几行
可以看到数据大体上是完善的,但也存在一些空值,一会儿需要进行数据清洗
3.3查看数据类型
data.dtypes
可以看到Year(年份)字段的数据类型是float,但我们需要int类型,一会需要进行数据类型转换
3.4数据集描述
data.describe()
可以观察到年份的最大值为2020,但我们数据集的年份范围是1980-2017年的数据,所以存在数据谬误。
3.5数据集的基础信息
data.info()
可以看到存在一些数据缺失
四、数据清洗
4.1数据重复值处理
data.duplicated()
data.duplicated().sum()
可以看到没有重复值
4.2数据异常值处理
#刚看到数据年份字段存在异常值,进一步查看
data['Year'].unique()
可以看出存在超出2017的年份,对其进行删除处理
data.drop(data[data.Year>2017].index,inplace=True)
#删除大于2017年的数据
data_year = data.groupby(['Year'])['Global_Sales'].sum()
#先按年份分组,选择全球销售额这一列,然后分组加总,即可得出年份与全球销售额的关系
data_year = data_year.reset_index() #重置索引
print(data_year)
观察数值,可发现2017年全球销售额异常,经过分析,发现2017年数据有大量遗漏,决定去除2017年数据。
data.drop(data[data.Year>2016].index,inplace=True) #删除2016年以上的数据
4.3数据缺失值处理
msno.bar(data,figsize=(12,5)) #用missingno库查看是否存在缺失值
可见Year(年份)和Publisher(发行公司)存在缺失值
data.isnull().sum().sort_values(ascending=False)
#进一步查看缺失值情况,并降序排列
#把缺失值全部剔除掉
data.dropna(how='any',inplace=True)
data.info() #查看剔除缺失值后的情况
剔除缺失值后,还有16287行数据,不影响数据分析
3.4数据类型转换
#把年份的float类型转换为int类型
data.Year = data.Year.astype(int)
四、数据分析和可视化
4.1玩家角度分析
4.1.1玩家最喜爱的5款游戏
#数据集中共有多少游戏
data['Name'].unique
共有16287款游戏
#最火热的5款游戏(销售额最大)
top_game_sale = data.head(5)
top_game_sale=top_game_sale[['Name','Year','Genre','Global_Sales']]
#选择游戏名、年份、游戏类型、全球销售额
top_game_sale=top_game_sale.sort_values(by=['Global_Sales'],ascending=False)
#按全球销售额进行倒序排列
top_game_sale
将数据复制到excel表中加工,并求出该游戏占发行年总销售额的比重。
市场上共有16287款主机游戏,其中,最受玩家欢迎的5款游戏是Wii运动、超级马里奥、马里奥赛车、Wii运动度假胜地、精灵宝可梦。这5款游戏销售总额为223.17百万美元;WII运动这款游戏的销售额几乎占到它的发行年(2006年)总销售额的1/5,而第二款游戏超级马里奥兄弟更是占到发行年的74.52%,可见开发高品质爆款游戏的重要性。
4.1.2 玩家喜欢的游戏类型
data['Genre'].unique()
共有12种游戏,分别是:Sports(运动)、Platform(平台)、Racing(竞技)、Role-Playing(角色扮演)、Puzzle(智力)、Misc(混杂)、Shooter(射击)、Simulation(模拟)、Action(动作)、Fighting(格斗)、Adventure(冒险)、Strategy(策略)。
#每种游戏类型的全球销售额
data_genre = data.groupby(by=['Genre'])['Global_Sales'].sum()
#按游戏类型分组,取全球销售额,全年加总
data_genre = data_genre.reset_index() #重新索引
data_genre = data_genre.sort_values(by=['Global_Sales'],
ascending=False) #按全球销售量排序
data_genre
#画图表示
plt.figure(figsize=(15,10))
sns.barplot(x='Genre',y='Global_Sales',data=data_genre)
plt.xticks(rotation=90)
从各个主机游戏类型的销售额图表可以看出,最受玩家喜爱的游戏类型为:动作、运动、射击类,这类热血刺激的游戏更受到玩家欢迎,销售额是最高的,而益智类、冒险类、策略类游戏则销量不佳。推测主机游戏玩家中,男性玩家占比较高。
4.1.3 最流行的三种主机游戏类型词云
from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator #导入词云
from PIL import Image #导入图片库
stopwords = set(STOPWORDS)
for x in data.Genre.unique():
wc = WordCloud(background_color="white",max_words=1500,
stopwords=stopwords,max_font_size=40,
random_state=42)
wc.generate(data.Name[data.Genre == x].to_string())
plt.imshow(wc)
plt.title(x)
plt.axis('off')
plt.show()
我们选取了动作、运动、射击这三种最受玩家喜爱的主机游戏类型,作出这三种游戏类型的词频词云。
从动作类游戏词云可以看到,Resident Evil(生化危机)、Harry Potter(哈利波特)、Spider Man(蜘蛛侠)、Star Wars(星球大战)最受欢迎,这些游戏都是依托广为人知的电影、小说IP,进行再创作,既有故事情节,也有刺激的动作场面,所以受到玩家喜爱。
从运动类游戏词云可以看到,Madden NFL/NHL(疯狂橄榄球/冰球)、Pro Yakyuu(职业棒球)、NBA最受欢迎,可知这类需要技巧的多人参与的球类游戏最受玩家偏好。
从射击类游戏词云可以看到,Call of Duty(使命召唤)、Medal Honor(荣耀勋章)、Star Wars(星际争霸)最受欢迎,这些都是军事类枪战类游戏;而Tom Clancy(汤姆·克兰西)也是高频词,他是反恐惊悚小说家,由他创作的大量畅销小说被改编为游戏大作。如果能够依据知名的IP改编成游戏,更容易受到玩家喜爱。
4.1.4 不同地区的玩家喜欢的游戏类型差异
comp_genre = data[['Genre','NA_Sales','EU_Sales','JP_Sales','Other_Sales']]
#comp_genre
#选取游戏类型和各地的销售额
comp_map = comp_genre.groupby(by=['Genre']).sum()
#按游戏类型分组,加总
comp_map
#画出游戏类型和地区销售额关系的热力图
plt.figure(figsize=(15,10))
sns.set(font_scale=1)
sns.heatmap(comp_map,annot=True,fmt = '.1f')
#annot默认是False,如果是True会在格子内传入数据,fmt把数字约为一位小数
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()
#画各个游戏类型销售额的区域差异条形图
comp_table = comp_map.reset_index()
comp_table = pd.melt(comp_table,id_vars=['Genre'],
value_vars =['NA_Sales','EU_Sales','JP_Sales','Other_Sales'],
var_name='Sale_Area',value_name='Sale_Price')
#melt做透视表 列转行,id_vars不需要转换的列名,
#value_vars需要转换的列名,value_name自定义列名
plt.figure(figsize=(15,10))
sns.barplot(x='Genre',y='Sale_Price',hue='Sale_Area',
data = comp_table)
#hue 按sale_Area不同颜色分条显示,图例
从这两张图表可以看到,在欧美地区,玩家喜欢的前三种游戏类型是:动作、运动、射击类游戏,最没有吸引力的游戏是策略、冒险、益智类游戏,可见欧美玩家有相同的游戏偏好,普遍喜欢刺激、激情类游戏,而对烧脑类游戏缺乏兴趣。结合上面关于动作、运动、射击的词云,我们发现欧美玩家更偏好太空、高科技、英雄主义题材的游戏。
而在日本,最受玩家喜爱的游戏是角色扮演类,这种类型的游戏所占比重很大,是第二喜欢的游戏类型(动作类)的两倍有余。从角色扮演类游戏词云可以看到,Final Fantasy(最后幻想)、Dragon Quest(勇者斗恶龙系列)、Pokemon(宝可梦)、Shin Megami(真女神转生)是最受玩家欢迎的角色扮演类游戏,而且这几款游戏都是日本公司开发的;反而射击类游戏竟然在日本玩家中吸引力最弱,与欧美地区玩家的偏好正好相反。这可能与日本地区女性游戏玩家占比较高有关,女性对运动刺激类游戏偏好更低。另外,这几款角色扮演类游戏和动漫密切相关,它们的流行很明显契合了日本高度发达ACG文化和宅文化。
可见不同地区的游戏文化有一定区别,需对各个区域玩家的游戏类型偏好有一定了解后,再开发相应的游戏。
4.1.5 用户喜爱的游戏类型变化趋势
这一部分用SQL语言实现,在excel中完善。
从图表中可以看到,动作、射击这两类游戏这几十年来快速增长,动作类游戏从10.89%增长到26.72%,射击类游戏从5.39%增长到18.36%,这两类游戏现在几乎占到了整个游戏市场的半壁江山;而竞技、平台、格斗类游戏则所占比重急剧下降,失去了玩家的钟爱;冒险、策略、益智类游戏本来就占比不高,这些年更是进一步萎缩。可以看到游戏市场出现集聚效应和极化,热门游戏更热门,而冷门游戏更冷门。
4.1.6用户喜欢的游戏平台
data['Platform'].unique()
目前市场上共有31种游戏设备
from collections import Counter
#前20个平台
platform_count = Counter(data.Platform)
#counter函数,用来计数,计算每个游戏设备出现的次数
most_platform = platform_count.most_common(20)
platform_name,count = zip(*most_platform) #解压缩,把两列数拆开
platform_name,count = list(platform_name),list(count)
#把两列数 转换为列表格式
#可视化
plt.figure(figsize=(15,10))
ax = sns.barplot(x=platform_name,y=count,palette = 'rocket')
plt.xlabel('Platform',fontsize=20,fontweight='bold')
plt.ylabel('Frequency',fontsize=20,fontweight='bold')
plt.title('Most common 20 of Platform',fontsize=20,fontweight='bold')
plt.show()
目前市场上共有31种游戏设备,从图中可以看出,前十大游戏平台中除DS、PS2两款游戏平台销售额很突出,其他8种差别不大; 其中DS、Wii、GBA是任天堂公司推出的游戏机,PS2、PS3、PSP、PS是索尼公司推出的,Xbox360、Xbox是微软公司推出的。总体来看,索尼,微软,任天堂三家日本/美国公司占据了主机市场绝大部分的份额,依据近些年实际情况来说也是如此。其中任天堂一直是最为优秀的第一方游戏开发公司,独有大量的优秀游戏资源,是三家公司中研发能力最强的,而微软稍显弱势,第一方独占大作质量市场接受度相对较低,同时数量和类型上也不够丰富。
不同于网络游戏和移动游戏,主机游戏是很依赖于游戏设备的,游戏设备本身利润不高,利润更依赖于游戏,游戏热卖也会带动游戏设备的销售,两者具有很大的相关性,所以很多公司会同时制造游戏设备和发行游戏(如任天堂和索尼)。
4.2发行商角度分析
4.2.1销售额前十的发行商
len(data['Publisher'].unique())
输出:576
市场中共有576家游戏发行商
#全世界哪个公司上的游戏销售额最高
sale_pbl = data[['Publisher','Global_Sales']]
#选取发行商、全球销售额两列
sale_pbl = sale_pbl.groupby('Publisher')['Global_Sales'].sum().sort_values(ascending=False).head(20)
#按发行商分组,选取全球销售额,加总,倒序排列,选取前20行
sale_pbl = pd.DataFrame(sale_pbl).reset_index()
#放进表格里
sale_pbl
#用上面的数据,画条形图
plt.figure(figsize=(15,10))
sns.barplot(x='Publisher',y='Global_Sales',data=sale_pbl)
plt.xticks(rotation=90,fontsize=20,fontweight='bold')
市场中共有576家主机游戏发行商,任天堂、艺电公司、动视公司是前三名,三家发行商总销售额为3600百万美元,占比43.9%;前10家游戏公司的销售额为6222百万美元,占比70.6%;前20家游戏公司的销售额为7553百万美元,占比75.7%,可以看到电子游戏市场是一个寡头垄断市场,集中度很高,有很大的进入壁垒。世界前十大发行商中,Nintendo(任天堂)、Sony Computer Entertainment(索尼)、Konami(科乐美)、Sega(世嘉)、Namco(南梦宫)是日本公司;Ubisoft(育碧)是欧洲公司;Take-Two、THQ是美国公司。可见主机游戏发行主要是日美欧三大发达国家公司垄断。
4.2.2每年发行游戏款数最多的公司
#每年最高发行商
top_publisher = data[['Year','Publisher']]
top_publisher_df=top_publisher.groupby(by=['Year','Publisher']).size().reset_index(name='Count')
#按年份,发行商分组,计算数
top_publisher_idx = top_publisher_df.groupby(by=['Year'])['Count'].transform(max) == top_publisher_df['Count']
#按年份分组,取Count列,取每年最大的发行商
top_publisher_count = top_publisher_df[top_publisher_idx].reset_index(drop=True)
top_publisher_count =top_publisher_count.drop_duplicates(subset=['Year','Count'],keep='last').reset_index(drop=True)
top_publisher_count
publisher = top_publisher_count['Publisher']
plt.figure(figsize=(30,15))
g = sns.barplot(x='Year',y='Count',
data=top_publisher_count)
index = 0
for value in top_publisher_count['Count'].values:
g.text(index,value+5,str(publisher[index]+'---'+str(value)),
color='black',size=14,rotation=90,ha='center',fontsize=20,fontweight='bold')
index +=1
plt.xticks(rotation=90,fontsize=20,fontweight='bold')
plt.yticks(fontsize=20,fontweight='bold')
plt.title('The largest number of games released each year ',fontsize=25,fontweight='bold')
plt.rcParams['savefig.dpi'] = 300 #图片像素
plt.rcParams['figure.dpi'] = 300 #分辨率
plt.show()
从每年发行游戏款数最多的公司的数据来看,大致可分为6个阶段,1981、1982两年,雅达利公司是行业龙头,也是早期电子游戏的拓荒者,占据了发展先机。但随后受到家用电脑冲击和大量仓促开发的劣质游戏影响,1983年美国经历了雅达利大崩溃,游戏市场萧条,大量北美游戏公司破产。
1983-1993这11年,任天堂吸取了雅达利公司的教训,建立权利保证金制度,开发高质量游戏,成为发行游戏款数最大的公司,被称为任天堂的世代,游戏发行款数并不多,只有个数款,但质量精良,且成功地控制游戏内容,有效防止暴力,色情,赌博等信息出现在游戏中,赢得家长的欢迎,主机游戏生产中心由北美转移到日本。
1995-2000这6年,索尼公司开发以光盘为游戏载体的PS系列游戏机,大幅降低权利保证金,吸引游戏开发商为PS制作游戏,占据发行游戏款数的榜首,大约每年制作三十多款游戏。
2001-2008这8年,美国艺电公司是发行游戏款数最多的公司,这也是主机游戏发展的黄金时期,艺电公司每年大约发行80-120款游戏;
2009年、2010年动视暴雪公司,2011年育碧公司是发行游戏款数公司的王者,这时主机游戏热开始大幅退潮,只能发行大约80款游戏;
2012-2016这五年,占据榜首的是南梦宫,每年发行游戏款数回落到60款左右。
4.3市场角度分析
4.3.1游戏市场的总体发展趋势
data_year = data.groupby(['Year'])['Global_Sales'].sum()
#先按年份分组,选择全球销售额这一列,然后分组加总,即可得出年份与全球销售额的关系
data_year = data_year.reset_index() #重置索引
print(data_year)
在excel作图
从全球游戏销售额图可以看出,电子游戏从1980年开始到1995年前后,增长比较缓慢,1995年以后伴随着互联网和技术革命的浪潮,电子游戏开始蓬勃发展,在2009年前后达到顶峰,之后受经济危机影响开始大幅回落,到近些年来电子游戏的发展大幅下降一部分内因是因为本世代主机平台慢慢到了末期,市场热度在降温,还有一部分是因为受到外部因素的冲击,其他娱乐方式在挤占原本的电子游戏市场,如移动端游戏等。
4.3.2游戏市场的地区分布
top_sale_reg = data[['NA_Sales','EU_Sales','JP_Sales','Other_Sales']]
#取四个地区的营收列
#pd.DataFrame(top_sale_reg.sum(),columns=['a','b'])
top_sale_reg = top_sale_reg.sum().reset_index()
top_sale_reg = top_sale_reg.rename(columns={'index':'region',0:'sale'})
top_sale_reg
#画图
plt.figure(figsize=(12,8))
sns.barplot(x='region',y='sale',data = top_sale_reg)
#各地区营收饼图
labels = top_sale_reg['region']
sizes = top_sale_reg['sale']
sizes
#画图
plt.figure(figsize=(19,8))
plt.pie(sizes,labels=labels,autopct='%1.1f%%',shadow=True,startangle=90)
#sizes各块比例,labels每一块饼图显示的文字,autopct百分比设置,
#shadow饼图下的阴影,startangle起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
可以看到,电子游戏的销售市场主要在北美、欧洲和日本这三大发达国家市场,特别是北美市场几乎占到电子游戏销售的半壁江山,应继续面向这三个市场,并可以尝试开发中国、韩国、印度、中东等新兴市场。
五、应用机器学习预测
5.1运用决策树回归算法预测
from sklearn.model_selection import train_test_split
#train_test_split是sklearn中用于划分数据集,即将原始数据集划分成测试集和训练集两部分的函数。
from sklearn.metrics import mean_absolute_error
#绝对差值(Mean absolute error):这个指标用于评判预测值与实际值之间的差异度。
from sklearn.tree import DecisionTreeRegressor #导入决策树回归算法库
features = ['NA_Sales','EU_Sales','JP_Sales','Other_Sales']
cop = data.copy()
X = cop[features]
y = cop.Global_Sales
train_X,val_X,train_y,val_y = train_test_split(X,y,test_size=0.25,random_state=1)
#test_size若为None时,test size自动设置成0.25
#random_state 为整数,则每次生成的数据都相同
model = DecisionTreeRegressor(random_state=1)
model.fit(train_X,train_y)
#模型拟合
输出:DecisionTreeRegressor(random_state=1)
predictions = model.predict(val_X)
mae = mean_absolute_error(predictions,val_y)
#平均绝对值误差
print('Mean absolute error '+str(mae))
输出:Mean absolute error 0.040702470622376793
df = pd.DataFrame({'Actual':val_y,'Predicted':predictions})
#将实际值和预测值放入DataFrame中
df
df1 = df.head(80)
df1.plot(kind='bar',figsize=(15,8))
plt.show()#画图看一下
5.2运用多元线性回归算法预测
#保留最有效的信息,我们发现决定全球销售额的最有用的特征是北美销售额、日本销售额、欧洲销售额、其他地区销售额。
x = data.iloc[:,6:-1].values #取出这个数据集的
print(x[0])
输出:[41.49 29.02 3.77 8.46]
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,
random_state=0)
#在训练集上训练多元线性回归
from sklearn.linear_model import LinearRegression
regressor_MultiLinear = LinearRegression()
regressor_MultiLinear.fit(x_train,y_train)
输出:LinearRegression()
#预测结果
y_pred = regressor_MultiLinear.predict(x_test)
#计算r2 值
from sklearn.metrics import r2_score
r2_MultiLinear = r2_score(y_test,y_pred) #测试值和预测值之间的拟合优度
print(r2_MultiLinear)
输出:0.99998698585513