目录
1 项目背景与分析说明
1.1 项目背景
AQI(Air Quality Index),指空气指数,用来衡量空气清洁或污染的程度,值越小,表示空气质量越好。由于空气污染问题,近年来空气质量越来越受人们的重视。
1.2 数据说明
本数据集总记录了全国主要地区城市共325地,使用的字段有12列包括:
· City:城市名
· AQI:空气质量指数
· Precipitation:降雨量
· GDP:城市生产总值
· Temperature:湿度
· Longitude:经度
· Latitude:纬度
· Altitude:海拔高度
· PopulationDensity:人口密度
· Coastal:是否沿海
· GreenCoverageRate:绿化覆盖率
· Incineration(10,000ton):焚烧量(10,000吨)
1.3 分析说明
本次我们期望能够运用线性回归模型算法以及相关的模型优化来对全国城市空气质量进行分析,希望能够解决一下疑问:
· 临海城市的空气质量是否有别于内陆城市?
· 空气质量主要受哪些因素影响?
· 全国城市空气质量普遍处于何种水平?
· 怎样预测一个城市的空气质量?
2 数据预处理
2.1 导入相关库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
sns.set(style='darkgrid')
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
warnings.filterwarnings('ignore')
2.2 导入数据
data = pd.read_csv('./data.csv')
data.head(10)
数据集展示如下:
2.3 数据预处理
2.3.1 缺失值
数据集中缺失值常见处理方式
查看数据缺失情况,发现在Precipitation列中存在少量缺失
# data.info()
data.isnull().sum(axis=0)
通过数据的偏度判断数据是否左偏或是右偏,从而判断缺失值应该用均值还是用中值填充
#数据偏度
print('Precipitation列数据偏度:',data['Precipitation'].skew())
#数据分布
sns.distplot(data['Precipitation'].dropna())
结果如下:
由结果可知数据右偏,那我们在后续的填充缺失值时选用中值填充
data.fillna({
'Precipitation':data['Precipitation'].median()},inplace=True)
data.isnull().sum(axis=0)
结果如下:
2.3.2 异常值
- 异常值查看常见方式:
- 通过describe()查看数据信息
- 通过3σ原则判断
- 使用箱线图辅助
- 相关异常检测算法
(1)通过describe()查看数据信息,虽然提供的信息全面,但异常值也不够直观,仅作为概览数据的简单方式
data.describe()
结果如下
(2)通过3σ原则判断,根据正态分布的特性,我们可以将3σ之外的数据视为异常值,此处以GDP这一列为例
sns.distplot(data["GDP"])
print(data["GDP"].skew())
可见GDP此列存在严重的右偏情况,即存在很多极大的异常值
mean, std = data["GDP"].mean(), data["GDP"].std()
lower, upper = mean - 3 * std, mean + 3 * std
print("均值:", mean)
print("标准差:", std)
print("下限:", lower)
print("上限:", upper)
data["GDP"][(data["GDP"] < lower) | (data["GDP"] > upper)]
结果如下
(3)使用箱线图辅助,由箱线图也可得到如上的结论,存在许多极大的异常值
sns.boxplot(data=data["GDP"])
- 异常值处理常见方式:
- 删除异常值
- 视为缺失值处理
- 对数转换
- 使用临界值填充
- 使用分箱离散化处理
(1)对数转换
如果数据中存在较大的异常值,我们可以通过取对数来进行转化,这样可以得到一定程度的缓解
fig, ax = plt.subplots(1, 2)
fig.set_size_inches(15, 5)
sns.distplot(data["GDP"], ax=ax[0])
sns.distplot(np.log(data["GDP"]), ax=ax[1])
如图,取对数后的分布图比原分布图显得更加正态
取对数的方式比较简单,不过也存在一些局限:
- 取对数只能针对正数操作,不过我们可以通过如下方式进行转换:
np.sign(X)*np.log(np.abs(X