电子游戏销售之缺失值检测与处理
文章目录
- 电子游戏销售之缺失值检测与处理
- 0、写在前面
- 1、数据缺失值预处理
- 1.1 表的形状
- 1.2 原始数据每个特征缺失和非缺失的数目
- 1.3 每个特征缺失的率
- 1.4 处理后各特征缺失值的数目
- 1.5 删除缺失值后的数据展示
- 2、替换法处理缺失值
- 2.1 替换法
- 2.2 替换法处理缺失值后的数据
0、写在前面
该篇文章的任务包括以下3个方面
检测与处理缺失值
建立回归模型
数据可视化
实验环境
- Python版本:
Python3.9
- Numpy版本:
Python1.22.3
- Pandas版本:
Pandas1.5.0
- scikit-learn版本:
scikit-learn1.1.2
- Matplotlib版本:
Matplotlib3.5.2
原始数据
- 数据来源:
https://www.kaggle.com/datasets/gregorut/videogamesales?resource=download
https://tianchi.aliyun.com/dataset/92584
数据字段
- Name - 游戏名称
- Platform - 游戏的开发平台
- Year_of_Release - 游戏发行年份
- Genre - 游戏类别
- Publisher - 游戏的发布者
- NA_Sales - 北美销售量
- EU_Sales - 欧洲销售量
- JP_Sales - 日本销售量
- Other_Sales - 其他地区的销售量
- Global_Sales - 全球销售量
- Criticscore - 评判游戏的得分
- Critic_Count - 评判游戏的人数
- User_Score - 用户对于游戏的得分
- Usercount - 给予游戏User_Score的用户人数
- Developer - 游戏开发者
- Rating - 评级
前置准备
提前将csv数据导入到MySQL中,以便数据预处理
1、数据缺失值预处理
1.1 表的形状
使用
create_engine
连接MySQL,读取MySQL中的数据,并输出表的形状
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
# TODO 创建数据库连接
conn = create_engine('mysql+pymysql://root:123456@localhost:3307/dataAnalysis?charset=utf8')
# TODO 读取数据
detail = pd.read_sql('video_games_sales',conn)
print('表的形状为:', detail.shape) # 表的形状为: (16719, 16)
1.2 原始数据每个特征缺失和非缺失的数目
使用
detail.isnull().sum()
和detail.notnull().sum()
即可
print('detail每个特征缺失的数目为:\n',detail.isnull().sum())
print('detail每个特征非缺失的数目为:\n',detail.notnull().sum())
1.3 每个特征缺失的率
使用
detail.isnull().sum() / detail.shape[0] * 100
即可计算出缺失率
naRate = (detail.isnull().sum() / detail.shape[0] * 100).astype('str')+'%'
print('detail每个特征缺失的率为:\n',naRate)
1.4 处理后各特征缺失值的数目
先使用
删除法
删除掉缺失值,然后统计处理后各个特征值的缺失数目
detail.dropna(axis = 1, how = 'all', inplace = True)
print('经过缺失值删除处理各特征缺失值的数目为:\n', detail.isnull().sum())
1.5 删除缺失值后的数据展示
使用
detail.shape
查看删除法预处理后的数据
print('去除缺失的列前detail的形状为:', detail.shape)
print('去除(any)缺失的列后detail的形状为:',detail.dropna(axis = 1,how ='any').shape)
print('去除(all)缺失的列后detail的形状为:',detail.dropna(axis = 1,how ='all').shape)
2、替换法处理缺失值
本次实验使用
替换法
预处理缺失值数据
2.1 替换法
operate()
print('detail使用替换法处理后每个特征缺失的数目为:\n',detail.isnull().sum())
print('缺失值处理后的数据为:')
print(detail)
Note:其中,operate()方法是用于替换缺失值操作的
对于数值字段,如果是缺失值,使用
-1
代替;如果不是,则根据字段的含义(xxx),将缺失值替换为未知xxx
;对于rank字段,缺失值使用’Z’代替
operate()方法代码如下:
def operate() :
for i in range(0, len(detail)):
if i == 1 :
print(detail.iloc[i][10], "---------")
name = detail.iloc[i][0]
genre = detail.iloc[i][3]
critic_score = detail.iloc[i][10]
critic_count = detail.iloc[i][11]
user_score = detail.iloc[i][12]
user_count = detail.iloc[i][13]
developer = detail.iloc[i][14]
rating = detail.iloc[i][15]
if name == None:
detail._set_value(i, "Name", '未知游戏')
if genre == None:
detail._set_value(i, "Genre", '未知类别')
if critic_score == None:
cs = int (-1)
detail._set_value(i, "Critic_Score", cs)
if critic_count == None:
cc = int(-1)
detail._set_value(i, "Critic_Count", cc)
if user_score == None:
us = int (-1)
detail._set_value(i, "User_Score", us)
if user_count == None:
uc = int (-1)
detail._set_value(i, "User_Count", uc)
if developer == None:
detail._set_value(i, "Developer", '未知开发者')
if rating == None:
detail._set_value(i, "Rating", 'Z')
detail.to_csv('../out/vgs1.csv', index=False)
2.2 替换法处理缺失值后的数据
缺失值处理后的数据展示:
结束!