城市空气质量分析与预测
一、AQI分析与预测
1、背景信息
AQI指的是空气质量指数,用来衡量一个城市的空气清洁或污染的程度,数值越小则空气质量越好。近年来,空气污染问题备受关注,现收集不同城市的数据,运用数据分析的方法来对不同城市的空气质量进行分析与预测。
2、任务说明
我们期望能够运用数据分析的相关技术,对全国城市的空气质量进行分析与预测,同时会根据分析结果来解决一些常见问题,例如:
- 哪些城市的空气质量比较好?哪些比较差?
- 空气质量在地理上的分布,是否存在着一定的规律?
- 沿海城市与内陆城市的空气质量是否存在不同?
- 空气质量主要受到哪些因素的影响?
- 全国空气质量的整体情况是怎样的?
- 怎么来预测一个城市的空气质量?
3、数据集描述
我们现在获取了2015年的空气质量数据集,该数据集包含的是全国主要城市的相关数据及空气质量指数,数据情况如下:
列名 | 含义 |
---|---|
City | 城市名 |
AQI | 空气质量指数 |
Precipitation | 降雨量 |
GDP | 城市生产总值 |
Temperature | 温度 |
Longitude | 纬度 |
Latitude | 经度 |
Altitude | 海拔高度 |
PopulationDensity | 人口密度 |
Coastal | 是否沿海 |
GreenCoverageRate | 绿化覆盖率 |
Incineration(10000ton) | 焚烧量(10000吨) |
二、数据分析流程
基本流程
在进行数据分析之前,我们清楚整个分析流程,每个流程所对应的步骤与使用的相关分析技术:
- 明确任务需求与分析目标
- 数据收集:
- 内部数据、购买数据、爬取数据、调查问卷、其他收集
- 数据预处理:
- 数据整合(横向整合、纵向整合)
- 数据清洗(缺失值、异常值、重复值)
- 数据转换
- 数据分析:
- 描述性分析
- 推断分析
- 数据建模(特征方程、超参数调整)
- 数据可视化
- 编写报告
三、读取数据
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、加载数据集
data=pd.read_csv('data.csv')
print(data.shape)
(325,12)
加载后,可以使用head/tail/sample等方法查看数据的大致情况:
data.head()
四、数据清洗
1、缺失值
1.1、缺失值探索
我们可以用以下方法来查看缺失值:
- info
- is null
#data.info()
data.isnull().sum(axis=0)
1.2、缺失值处理
对于缺失值,我们可以使用以下处理方式:
- 删除缺失值:仅适合于缺失值很少的情况
- 填充缺失值:
- 数值变量:
- 均值填充
- 中值填充
- 类别变量:
- 众数填充
- 单独作为一个类别
- 额外处理说明:
- 缺失值小于20%,直接填充
- 缺失值在20%-80%,填充变量后,同时增加一列,标记该列是否缺失,参与后续建模
- 缺失值大于80%,不用原始列,而是增加一列,标记该列是否缺失,参与后续建模
- 数值变量:
1、数据分布
print(data['Precipitation'].skew())
sns.distplot(data['Precipitation'].dropna())
2、填充数据
data.fillna({
'Precipitation':data['Precipitation'].median()},inplace=True)
data.isnull().sum()
2、异常值
2.1、异常值探索
我们可以如下方法来发现缺失值:
- describe查看数值信息
- 正态分布3个标准差外(3σ)的方式
- 使用箱线图辅助
- 相关异常检测算法
1、describe方法
调用DataFrame对象的describe方法,可以显示数据的统计信息,但仅为一种简单的异常探索方式,不够直观,局限性强。
2、3σ的方式
根据正态分布的特性,我们可以将3个标准差外(3σ)的数据,视为异常值。现在我们以GDP为例,首先先绘制GDP的分布图
sns.distplot(data['GDP'])
print(data['GDP'].skew())
由图看出数据呈现严重右偏分布,也就是存在很多极大异常值,我们先获取这些异常值。
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'])
2.2、异常值处理
对于异常值,我们可以用以下的方式来处理:
- 删除异常值
- 视为缺失值
- 对数转换
- 使用临界值填充
- 使用分箱法离散化处理
1、对数转换
如果数据中存在较大的异常值,可以通过采用对数来进行转化,能得到一定的缓解。例如GDP变量呈现右偏分布
import matplotlib.pyplot as plt
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)+1)
-
适合右偏分布,不适合左偏分布,不过现实中大多数的数据一般的呈右偏分布较多。
2、使用边界值替换
对异常值进行‘截断’处理,即使用临界值替换异常值。例如在3σ与箱线图可以这样处理
3、分箱离散化
有时候特征对目标值存在一定的影响,可能未必是线性的增加,这时可以使用分箱方式,对特征进行离散化处理。
分箱离散化分为两个阶段:
- 分箱:比如将不同年龄段的人进行分化区间,例如0-18岁、18岁-30岁、30岁-40岁、40岁以上。
- 离散化:可以将不同年龄段依次对应为1、2、3、4,作为离散化处理。最后输入模型中进行分析
3、重复值
3.1、重复值的探索
使用duplicate检查重复值,可配合keep参数进行调整
#发现重复值
print(data.duplicated().sum())
#查看哪些记录出现重复值
data[data.duplicated(keep=False)]
3.2、重复值处理
重复值对数据分析通常没有作用,直接删除即可
data.drop_duplicates(inplace=True)
data.duplicated().sum()
五、数据分析
1、空气质量最好/最差的5个城市
1.1、空气质量最好的5个城市
t=data[['City','AQI']].sort_values('AQI')
display(t.iloc