目录
一、前言
近年来全国数学建模竞赛,参赛的队伍逐渐扩大。专科组也在扩张,而在E题方面则需要一些简单的数据预处理和数据分析。测试环境 Windows11、jupyter Notebook、python3.0,在开始之前我们还需下载 Anaconda里面有我们所需要的大部分库。
二、数据预处理
1.1数据读取
一般情况下数学竞赛的数据文件多为_csv文件与_excel文件,我们若要用python进行分析则需要的导入库才能读取文件,一般读取数据文件多用pandas库,而在安装Anaconda已自带库,不用再另外下载。
我们运行程序时也需要声明导入所需库。
import pandas as pd
import numpy as np
利用pandas读取excel文件
以2023年全国大学数学建模竞赛E题附件1-2016年的数据(数据格式为excel)为例进行演示
导入数据
data=pd.read_excel('附件1.xlsx')
读取出“附件1.xlsx”的数据
利用pandas读取-csv文件
data1= pd.read_csv('附件1.csv')
在导入数据时可能会因为我们的数据文档读取失败的状态,出现以下状态,
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 45: invalid continuation byte
在出现上面这种状态时,我们可以告诉他我们的文件格式
data= pd.read_csv('附件1.csv',encoding='gbk',engine='python')
读取出“附件1.csv”文件数据
1.2数据缺失值的查看与处理
对于缺失值的填补计算有很多方法,例如:
- 平均,中位数,众数
- kNN
- 零或常数等
# 通过序列对象isnull方法
data2=data1#复制表格
print('isnull方法返回值:\n',data2.isnull())
print('每一列的缺失值计数:\n',data2.isnull().sum())
通过isnull方法我们可以看出每一列的空缺值
对于空缺值,建模时候我们要想办法将数据进行填充或删除 ,根据题目要求考虑是否符合我们所做。
删除缺失值
print('情形1:\n',data2.dropna(subset=['月'],how='any'))#根据月空缺值删除
print('情形2:\n',data2.dropna(subset=['年','月'],how='any'))#根据年或月删除
print('情形3:\n',data2.dropna(subset=['年','月'],how='all'))#根据年与月删除
当然在此数据中不需要删除,以上为例子。那么除了删除以外我们也可以利用均值、方差、众数等进行填充
数据填充在表格为null的情况下我们用“2016”进行空值填充(以下为演示进行)。
print('填充数据后:\n',data2.fillna(value='2016'))
当然我们也可以根据不同列填充不同的值,例如我们将年这一列填充2016。
data4 = data1.copy() # 复制一个表格对象
print('表格对象为:\n',data4)
data4['年'].fillna('2016',inplace=True) # inplace设置对原表格data3生效
print('表格对象为:\n',data4)
1.3重复值处理
数据集中的重复值包括以下两种情况:
(1)数据值完全相同的多条数据记录;
(2)数据主体相同但匹配到的唯一属性值不同。
去重是帮助我们避免同一个对象在系统中到处都被保存一份副本,而冗余是在完全受我们控制的情况下增加这个对象数据的稳定性。
在建模竞赛中我们发现有不合理重复的数据也要进行删除
根据数据进行去重处理
import pandas as pd
data1= pd.read_excel('书籍评论数据.xls',na_values=None)
data4 = pd.DataFrame(data4, columns=['评论作者', '评论分数', '评论时间', '电影评论'])
data5 = data4.drop_duplicates(subset=['评论作者', '评论分数', '评论时间','电影评论'], keep='first')
根据他们的列名查找重复值,并对其进行删除只保留一条数据。
1.4异常值处理
常见的异常值检测方法
- 简单统计
- 3σ原则
- 箱线图法
常见的异常值处理方法
- 删除
- 视为缺失值——用缺失值处理方法处理(填充,插值等)异常值
数模竞赛中所给的数据有一些较大有一些较小,那么我们就可以当做异常数据进行处理,避免对我们所做的内容有影响。对其原数据 进行删除或进行另外的填充。异常值我们可以根据箱线图进行分析,偏离箱线图的便为异常值。
在这里我们就只用箱线图展示,四分位距(IQR)就是上四分位与下四分位的差值。而我们通过IQR的1.5倍为标准,规定:超过上四分位+1.5倍IQR距离,或者下四分位-1.5倍IQR距离的点为异常值。
以下为核心代码:
# 算出上限和下线
q1 = data["列名"].quantile(0.25)
q3 = data["列名"].quantile(0.75)
iqr = q3 - q1
bottom = q1 - 1.5*iqr
upper = q3 + 1.5*iqr
# 筛选异常值
data[(data['列名'] >= bottom) & (data['列名'] <= upper)]
(如有侵权请联系本人)
参考文献: