本项目使用pandas/numpy工具包对557424条空气质量数据进行导入及清洗,并使用matplotlib/seaborn/pyecharts工具包可视化分析全国主要省市的空气质量情况,对空气质量最差及最好的省市进行排名,利用相关性分析省市的主要污染物,从不同层面给出污染物指标控制方案。
主要结论如下:
本项目以2013-2018年的全国城市空气质量历史数据作为依据,探究全国空气质量与各污染物之间的联系。
数据集地址:https://tianchi.aliyun.com/dataset/dataDetail?dataId=2881
数据来自阿里天池,作者通过PythonSpider从真气网获取数据。以下为各字段描述:
全国范围:
全省范围(广东省):
全市范围(深圳市):
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_csv('aqi_data_u.csv')
df.head() # 查看表格
time | cityname | aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | primary_pollutant | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2014-12-31 | 阿坝州 | 53 | 33 | 55 | 3 | 23 | 1.0 | 35.0 | PM10 |
1 | 2015-01-31 | 阿坝州 | 31 | 18 | 29 | 7 | 10 | 0.5 | 45.0 | NaN |
2 | 2015-01-30 | 阿坝州 | 34 | 19 | 30 | 7 | 13 | 0.6 | 48.0 | NaN |
3 | 2015-01-29 | 阿坝州 | 31 | 18 | 31 | 7 | 15 | 0.5 | 32.0 | NaN |
4 | 2015-01-28 | 阿坝州 | 29 | 18 | 29 | 7 | 14 | 0.6 | 27.0 | NaN |
df1 = pd.read_csv('city.csv')
df1.head() # 查看表格。此表为坐标表格,本项目后续改进时增加地图显示城市空气质量
city | lat | lng | |
---|---|---|---|
0 | 阿坝州 | 31.905763 | 102.228565 |
1 | 安康 | 32.704370 | 109.038045 |
2 | 阿克苏地区 | 41.171731 | 80.269846 |
3 | 阿里地区 | 30.404557 | 81.107669 |
4 | 阿拉善盟 | 38.843075 | 105.695683 |
df1.rename(columns={'city': 'cityname'}, inplace=True) # 重命名city列,以对应df表的列名
df1.head()
cityname | lat | lng | |
---|---|---|---|
0 | 阿坝州 | 31.905763 | 102.228565 |
1 | 安康 | 32.704370 | 109.038045 |
2 | 阿克苏地区 | 41.171731 | 80.269846 |
3 | 阿里地区 | 30.404557 | 81.107669 |
4 | 阿拉善盟 | 38.843075 | 105.695683 |
df = pd.merge(df, df1, on='cityname', how='inner') # 两个表格合并
df.head()
time | cityname | aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | primary_pollutant | lat | lng | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014-12-31 | 阿坝州 | 53 | 33 | 55 | 3 | 23 | 1.0 | 35.0 | PM10 | 31.905763 | 102.228565 |
1 | 2015-01-31 | 阿坝州 | 31 | 18 | 29 | 7 | 10 | 0.5 | 45.0 | NaN | 31.905763 | 102.228565 |
2 | 2015-01-30 | 阿坝州 | 34 | 19 | 30 | 7 | 13 | 0.6 | 48.0 | NaN | 31.905763 | 102.228565 |
3 | 2015-01-29 | 阿坝州 | 31 | 18 | 31 | 7 | 15 | 0.5 | 32.0 | NaN | 31.905763 | 102.228565 |
4 | 2015-01-28 | 阿坝州 | 29 | 18 | 29 | 7 | 14 | 0.6 | 27.0 | NaN | 31.905763 | 102.228565 |
df.shape # 查看数据数量
(557424, 12)
共557424行,12列数据。
df.describe()
aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | lat | lng | |
---|---|---|---|---|---|---|---|---|---|
count | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 211516.000000 | 557424.000000 | 557424.000000 |
mean | 82.604734 | 48.958870 | 84.865831 | 22.943201 | 31.041986 | 1.309690 | 77.638103 | 33.320514 | 112.931476 |
std | 49.948024 | 235.684284 | 74.218273 | 25.620462 | 18.087321 | 49.111775 | 62.773975 | 6.583132 | 9.278219 |
min | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 18.257776 | 75.992973 |
25% | 52.000000 | 23.000000 | 44.000000 | 9.000000 | 18.000000 | 0.700000 | 42.000000 | 28.668283 | 108.069948 |
50% | 71.000000 | 37.000000 | 68.000000 | 15.000000 | 27.000000 | 0.900000 | 69.000000 | 32.929499 | 114.351807 |
75% | 99.000000 | 60.000000 | 106.000000 | 27.000000 | 40.000000 | 1.200000 | 102.000000 | 37.661160 | 119.455835 |
max | 1210.000000 | 65535.000000 | 12060.000000 | 1495.000000 | 574.000000 | 9999.900000 | 11281.000000 | 51.991789 | 131.171402 |
df.info()
Int64Index: 557424 entries, 0 to 557423
Data columns (total 12 columns):
time 557424 non-null object
cityname 557424 non-null object
aqi 557424 non-null int64
pm2_5 557424 non-null int64
pm10 557424 non-null int64
so2 557424 non-null int64
no2 557424 non-null int64
co 557424 non-null float64
o3 211516 non-null float64
primary_pollutant 528587 non-null object
lat 557424 non-null float64
lng 557424 non-null float64
dtypes: float64(4), int64(5), object(3)
memory usage: 55.3+ MB
print('数据中的城市数量为:', df.cityname.value_counts().count())
数据中的城市数量为: 367
根据以上简单查看数据,得出以下数据清洗思路:
1.o3、primary_pollutant存在缺失值。o3使用所在城市平均值填充,primary_pollutant统计数据较混乱且与项目问题无关,删除此列;
2.AQI、pm2_5、pm10、so2、no2、co、o3目前存在0值,可理解为该部分数据缺失,可用对应城市的平均值进行填充;
3.时间数据格式需要进行转换,创建季节列;
4.创建空气质量等级列;
5.列出每个城市所属的省份;
6.创建省份空气质量排名列(以AQI为基础);
7.创建城市空气质量排名列(以AQI为基础)。
# 1.o3、primary_pollutant存在缺失值。o3使用所在城市平均值填充,
# primary_pollutant统计数据较混乱且与项目问题无关,删除此列;
for city in df.cityname.value_counts().index:
'''
for循环计算每个城市污染物的平均值后替换NaN值
'''
df.loc[(df['cityname'] == city) & (df['o3'].isnull()), 'o3'] = df[df['cityname'] == city]['o3'].mean()
df['o3'].isnull().sum()
0
填充后缺失值为0
df.drop(['primary_pollutant'], axis=1, inplace=True)
df.head() #查看调整后的表格
time | cityname | aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | lat | lng | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014-12-31 | 阿坝州 | 53 | 33 | 55 | 3 | 23 | 1.0 | 35.0 | 31.905763 | 102.228565 |
1 | 2015-01-31 | 阿坝州 | 31 | 18 | 29 | 7 | 10 | 0.5 | 45.0 | 31.905763 | 102.228565 |
2 | 2015-01-30 | 阿坝州 | 34 | 19 | 30 | 7 | 13 | 0.6 | 48.0 | 31.905763 | 102.228565 |
3 | 2015-01-29 | 阿坝州 | 31 | 18 | 31 | 7 | 15 | 0.5 | 32.0 | 31.905763 | 102.228565 |
4 | 2015-01-28 | 阿坝州 | 29 | 18 | 29 | 7 | 14 | 0.6 | 27.0 | 31.905763 | 102.228565 |
df.isnull().any() # 确认表格中是否还有缺失值
time False
cityname False
aqi False
pm2_5 False
pm10 False
so2 False
no2 False
co False
o3 False
lat False
lng False
dtype: bool
# 2.AQI、pm2_5、pm10、so2、no2、co、o3目前存在0值,可理解为该部分数据缺失,可用对应城市的平均值进行填充;
df[['aqi', 'pm2_5', 'pm10', 'so2', 'no2', 'co', 'o3']] = df[['aqi', 'pm2_5', 'pm10', 'so2',
'no2', 'co', 'o3']].replace(0, np.NaN)
df.isnull().sum() # 将0值替换后缺失值的数量
time 0
cityname 0
aqi 4199
pm2_5 6817
pm10 4817
so2 1631
no2 1621
co 3493
o3 2342
lat 0
lng 0
dtype: int64
cities = df.cityname.value_counts().index
for city in cities:
'''
for循环计算每个城市污染物的平均值后替换NaN值
'''
for pollutant in ['aqi', 'pm2_5', 'pm10', 'so2', 'no2', 'co', 'o3']:
df.loc[(df['cityname'] == city) & (df[pollutant].isnull()), pollutant] = df[df['cityname'] == city][pollutant].mean()
df.isnull().sum() # 再次检查缺失值
time 0
cityname 0
aqi 0
pm2_5 0
pm10 0
so2 0
no2 0
co 0
o3 0
lat 0
lng 0
dtype: int64
# 3.时间数据格式需要进行转换,创建季节列;
df['time'] = pd.to_datetime(df['time'])
df.info() #查看time列的数据类型
Int64Index: 557424 entries, 0 to 557423
Data columns (total 11 columns):
time 557424 non-null datetime64[ns]
cityname 557424 non-null object
aqi 557424 non-null float64
pm2_5 557424 non-null float64
pm10 557424 non-null float64
so2 557424 non-null float64
no2 557424 non-null float64
co 557424 non-null float64
o3 557424 non-null float64
lat 557424 non-null float64
lng 557424 non-null float64
dtypes: datetime64[ns](1), float64(9), object(1)
memory usage: 51.0+ MB
# 根据月份创建季节列
seasons = {12: 'Winter',
1: 'Winter',
2: 'Winter',
3: 'Spring',
4: 'Spring',
5: 'Spring',
6: 'Summer',
7: 'Summer',
8: 'Summer',
9: 'Autumn',
10: 'Autumn',
11: 'Autumn'
}
df['season'] = df['time'].apply(lambda x : seasons [x.month])
df.head()
time | cityname | aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | lat | lng | season | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014-12-31 | 阿坝州 | 53.0 | 33.0 | 55.0 | 3.0 | 23.0 | 1.0 | 35.0 | 31.905763 | 102.228565 | Winter |
1 | 2015-01-31 | 阿坝州 | 31.0 | 18.0 | 29.0 | 7.0 | 10.0 | 0.5 | 45.0 | 31.905763 | 102.228565 | Winter |
2 | 2015-01-30 | 阿坝州 | 34.0 | 19.0 | 30.0 | 7.0 | 13.0 | 0.6 | 48.0 | 31.905763 | 102.228565 | Winter |
3 | 2015-01-29 | 阿坝州 | 31.0 | 18.0 | 31.0 | 7.0 | 15.0 | 0.5 | 32.0 | 31.905763 | 102.228565 | Winter |
4 | 2015-01-28 | 阿坝州 | 29.0 | 18.0 | 29.0 | 7.0 | 14.0 | 0.6 | 27.0 | 31.905763 | 102.228565 | Winter |
# 4.创建空气质量等级列
bin_edges = [0, 50, 100, 150, 200, 300, 1210] # 根据AQI的划分等级设置标签
bin_names = ['优级', '良好', '轻度污染', '中度污染', '重度污染', '重污染']
df['空气质量'] = pd.cut(df['aqi'], bin_edges, labels=bin_names)
df.head()
time | cityname | aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | lat | lng | season | 空气质量 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014-12-31 | 阿坝州 | 53.0 | 33.0 | 55.0 | 3.0 | 23.0 | 1.0 | 35.0 | 31.905763 | 102.228565 | Winter | 良好 |
1 | 2015-01-31 | 阿坝州 | 31.0 | 18.0 | 29.0 | 7.0 | 10.0 | 0.5 | 45.0 | 31.905763 | 102.228565 | Winter | 优级 |
2 | 2015-01-30 | 阿坝州 | 34.0 | 19.0 | 30.0 | 7.0 | 13.0 | 0.6 | 48.0 | 31.905763 | 102.228565 | Winter | 优级 |
3 | 2015-01-29 | 阿坝州 | 31.0 | 18.0 | 31.0 | 7.0 | 15.0 | 0.5 | 32.0 | 31.905763 | 102.228565 | Winter | 优级 |
4 | 2015-01-28 | 阿坝州 | 29.0 | 18.0 | 29.0 | 7.0 | 14.0 | 0.6 | 27.0 | 31.905763 | 102.228565 | Winter | 优级 |
# 5.列出每个城市所属的省份;
city_province={'即墨': '山东省', '阿坝州': '四川省', '安康': '陕西省', '阿克苏地区': '新疆维吾尔自治区',
'阿里地区': '西藏区', '阿拉善盟': '内蒙古自治区', '安庆': '安徽省', '安顺': '贵州省', '鞍山': '辽宁省',
'克孜勒苏州': '新疆维吾尔自治区', '安阳': '河南省', '蚌埠': '安徽省', '白城': '吉林省',
'北海': '广西壮族自治区', '宝鸡': '陕西省', '毕节': '贵州省', '白山': '吉林省', '百色': '广西壮族自治区',
'保山': '云南省', '包头': '内蒙古自治区', '本溪': '辽宁省', '巴彦淖尔': '内蒙古自治区',
'白银': '甘肃省', '巴中': '四川省', '滨州': '山东省', '亳州': '安徽省', '昌都': '西藏区',
'常德': '湖南省', '赤峰': '内蒙古自治区', '昌吉州': '新疆维吾尔自治区', '五家渠': '新疆维吾尔自治区',
'楚雄州': '云南省', '朝阳': '辽宁省', '长治': '山西省', '潮州': '广东省', '郴州': '湖南省',
'池州': '安徽省', '崇左': '广西壮族自治区', '滁州': '安徽省', '丹东': '辽宁省', '德宏州': '云南省',
'大理州': '云南省', '大庆': '黑龙江', '大同': '山西省', '定西': '甘肃省', '大兴安岭地区': '黑龙江',
'德阳': '四川省', '东营': '山东省', '黔南州': '贵州省', '达州': '四川省', '德州': '山东省',
'鄂尔多斯': '内蒙古自治区', '恩施州': '湖北省', '鄂州': '湖北省', '防城港': '广西壮族自治区',
'抚顺': '辽宁省', '阜新': '辽宁省', '阜阳': '安徽省', '抚州': '江西省', '广安': '四川省',
'贵港': '广西壮族自治区', '桂林': '广西壮族自治区', '果洛州': '青海省', '甘南州': '甘肃省',
'广元': '四川省', '甘孜州': '四川省', '赣州': '江西省', '海北州': '青海省', '鹤壁': '河南省',
'淮北': '安徽省', '河池': '广西壮族自治区', '海东地区': '青海省', '鹤岗': '黑龙江', '黄冈': '湖北省',
'黑河': '黑龙江', '红河州': '云南省', '怀化': '湖南省', '呼伦贝尔': '内蒙古自治区', '葫芦岛': '辽宁省',
'哈密地区': '新疆维吾尔自治区', '淮南': '安徽省', '黄山': '安徽省', '黄石': '湖北省',
'和田地区': '新疆维吾尔自治区', '海西州': '青海省', '河源': '广东省', '衡阳': '湖南省',
'汉中': '陕西省', '菏泽': '山东省', '贺州': '广西壮族自治区', '吉安': '江西省', '金昌': '甘肃省',
'晋城': '山西省', '景德镇': '江西省', '西双版纳州': '云南省', '九江': '江西省', '吉林': '吉林省',
'荆门': '湖北省', '佳木斯': '黑龙江', '济宁': '山东省', '酒泉': '甘肃省', '湘西州': '湖南省',
'鸡西': '黑龙江', '揭阳': '广东省', '嘉峪关': '甘肃省', '焦作': '河南省', '锦州': '辽宁省',
'晋中': '山西省', '荆州': '湖北省', '开封': '河南省', '黔东南州': '贵州省',
'克拉玛依': '新疆维吾尔自治区', '喀什地区': '新疆维吾尔自治区', '六安': '安徽省',
'来宾': '广西壮族自治区', '聊城': '山东省', '临沧': '云南省', '娄底': '湖南省', '临汾': '山西省',
'漯河': '河南省', '丽江': '云南省', '吕梁': '山西省', '陇南': '甘肃省', '六盘水': '贵州省',
'乐山': '四川省', '凉山州': '四川省', '莱芜': '山东省', '辽阳': '辽宁省', '辽源': '吉林省',
'临沂': '山东省', '龙岩': '福建省', '洛阳': '河南省', '林芝': '西藏区', '柳州': '广西壮族自治区'
, '泸州': '四川省', '马鞍山': '安徽省', '牡丹江': '黑龙江', '茂名': '广东省', '眉山': '四川省',
'绵阳': '四川省', '梅州': '广东省', '南充': '四川省', '宁德': '福建省', '内江': '四川省',
'怒江州': '云南省', '南平': '福建省', '那曲地区': '西藏区', '南阳': '河南省', '平顶山': '河南省',
'盘锦': '辽宁省', '平凉': '甘肃省', '莆田': '福建省', '萍乡': '江西省', '濮阳': '河南省', '攀枝花':
'四川省', '曲靖': '云南省', '齐齐哈尔': '黑龙江', '七台河': '黑龙江', '黔西南州': '贵州省', '清远':
'广东省', '庆阳': '甘肃省', '钦州': '广西壮族自治区', '泉州': '福建省', '日喀则': '西藏区', '日照':
'山东省', '韶关': '广东省', '绥化': '黑龙江', '石河子': '新疆维吾尔自治区', '商洛': '陕西省', '三明':
'福建省', '三门峡': '河南省', '山南': '西藏区', '遂宁': '四川省', '四平': '吉林省', '商丘': '河南省',
'上饶': '江西省', '汕头': '广东省', '汕尾': '广东省', '三亚': '海南省', '邵阳': '湖南省', '十堰':
'湖北省', '松原': '吉林省', '双鸭山': '黑龙江', '朔州': '山西省', '宿州': '安徽省', '随州': '湖北省',
'泰安': '山东省', '塔城地区': '新疆维吾尔自治区', '铜川': '陕西省', '通化': '吉林省', '铁岭': '辽宁省',
'通辽': '内蒙古自治区', '铜陵': '安徽省', '吐鲁番地区': '新疆维吾尔自治区', '铜仁地区': '贵州省',
'天水': '甘肃省', '潍坊': '山东省', '威海': '山东省', '乌海': '内蒙古自治区', '芜湖': '安徽省',
'乌兰察布': '内蒙古自治区', '渭南': '陕西省', '文山州': '云南省', '武威': '甘肃省', '梧州':
'广西壮族自治区', '兴安盟': '内蒙古自治区', '许昌': '河南省', '宣城': '安徽省', '孝感': '湖北省',
'迪庆州': '云南省', '锡林郭勒盟': '内蒙古自治区', '咸宁': '湖北省', '湘潭': '湖南省', '新乡':
'河南省', '咸阳': '陕西省', '新余': '江西省', '信阳': '河南省', '忻州': '山西省', '雅安': '四川省',
'延安': '陕西省', '延边州': '吉林省', '宜宾': '四川省', '宜昌': '湖北省', '宜春': '江西省', '运城':
'山西省', '伊春': '黑龙江', '云浮': '广东省', '阳江': '广东省', '营口': '辽宁省', '榆林': '陕西省',
'玉林': '广西壮族自治区', '阳泉': '山西省', '玉树州': '青海省', '烟台': '山东省', '鹰潭': '江西省',
'玉溪': '云南省', '益阳': '湖南省', '岳阳': '湖南省', '永州': '湖南省', '淄博': '山东省', '自贡':
'四川省', '湛江': '广东省', '张家界': '湖南省', '周口': '河南省', '驻马店': '河南省', '昭通': '云南省',
'张掖': '甘肃省', '资阳': '四川省', '遵义': '贵州省', '枣庄': '山东省', '漳州': '福建省', '株洲':
'湖南省', '深圳': '广东省', '福州': '福建省', '舟山': '浙江省', '青岛': '山东省', '无锡': '江苏省',
'湖州': '浙江省', '成都': '四川省', '石家庄': '河北省', '苏州': '新疆维吾尔自治区', '连云港': '江苏省',
'徐州': '江苏省', '廊坊': '河北省', '常州': '江苏省', '宿迁': '江苏省', '衡水': '河北省', '兰州':
'甘肃省', '邢台': '河北省', '沧州': '河北省', '哈尔滨': '黑龙江', '济南': '山东省', '昆明': '云南省',
'扬州': '江苏省', '杭州': '浙江省', '海口': '海南省', '南京': '江苏省', '广州': '广东省', '长沙':
'湖南省', '厦门': '福建省', '秦皇岛': '河北省', '张家口': '河北省', '宁波': '浙江省', '南宁':
'广西壮族自治区', '盐城': '江苏省', '邯郸': '河北省', '贵阳': '贵州省', '衢州': '浙江省', '承德':
'河北省', '南通': '江苏省', '沈阳': '辽宁省', '呼和浩特': '内蒙古自治区', '中山': '广东省', '武汉':
'湖北省', '合肥': '安徽省', '长春': '吉林省', '嘉兴': '浙江省', '大连': '辽宁省', '台州': '浙江省',
'拉萨': '西藏区', '肇庆': '广东省', '西安': '陕西省', '保定': '河北省', '江门': '广东省', '西宁':
'青海省', '乌鲁木齐': '新疆维吾尔自治区', '绍兴': '浙江省', '淮安': '江苏省', '温州': '浙江省', '郑州':
'河南省', '惠州': '广东省', '泰州': '新疆维吾尔自治区', '珠海': '广东省', '南昌': '江西省', '唐山':
'河北省', '金华': '浙江省', '佛山': '广东省', '东莞': '广东省', '丽水': '浙江省', '太原': '山西省',
'镇江': '江苏省', '阿勒泰地区': '新疆维吾尔自治区', '北京': '北京', '博州': '新疆维吾尔自治区',
'常熟': '江苏省', '富阳': '浙江省', '固原': '宁夏回族自治区', '海门': '江苏省', '海南州': '青海省',
'黄南州': '青海省', ' 即墨': '山东省', '胶南': '山东省', '句容': '江苏省', '金坛': '江苏省', '江阴':
'江苏省', '胶州': '山东省', '库尔勒': '新疆维吾尔自治区', '昆山': '江苏省', '临安': '浙江省',
'莱西': '山东省', '临夏州': '甘肃省', '溧阳': '江苏省', '莱州': '山东省', '平度': '山东省', '普洱':
'云南省', '蓬莱': '山东省', '荣成': '山东省', '乳山': '山东省', '寿光': '山东省', '石嘴山':
'宁夏回族自治区', '太仓': '江苏省', '文登': '山东省', '瓦房店': '辽宁省', '吴江': '江苏省', '吴忠':
'宁夏回族自治区', '襄阳': '湖北省', '伊犁哈萨克州': '新疆维吾尔自治区', '义乌': '浙江省', '宜兴':
'江苏省', '诸暨': '浙江省', '张家港': '江苏省', '章丘': '山东省', '中卫': '宁夏回族自治区', '招远':
'山东省', '天津': '天津市', '重庆': '重庆市', '银川': '甘肃省', '上海': '上海市'}
df['省份'] = df['cityname'].map(city_province)
df.head()
time | cityname | aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | lat | lng | season | 空气质量 | 省份 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014-12-31 | 阿坝州 | 53.0 | 33.0 | 55.0 | 3.0 | 23.0 | 1.0 | 35.0 | 31.905763 | 102.228565 | Winter | 良好 | 四川省 |
1 | 2015-01-31 | 阿坝州 | 31.0 | 18.0 | 29.0 | 7.0 | 10.0 | 0.5 | 45.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 |
2 | 2015-01-30 | 阿坝州 | 34.0 | 19.0 | 30.0 | 7.0 | 13.0 | 0.6 | 48.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 |
3 | 2015-01-29 | 阿坝州 | 31.0 | 18.0 | 31.0 | 7.0 | 15.0 | 0.5 | 32.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 |
4 | 2015-01-28 | 阿坝州 | 29.0 | 18.0 | 29.0 | 7.0 | 14.0 | 0.6 | 27.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 |
# 6.创建省份空气质量排名列(以AQI平均值为基础);
a = df.groupby('省份').mean().aqi.sort_values().index
b = []
for _ in range(1, a.shape[0]+1):
b.append(_)
pro_rank_dic = dict(zip(a, b))
pro_rank_dic
{'海南省': 1,
'云南省': 2,
'福建省': 3,
'贵州省': 4,
'西藏区': 5,
'广东省': 6,
'广西壮族自治区': 7,
'黑龙江': 8,
'江西省': 9,
'青海省': 10,
'内蒙古自治区': 11,
'四川省': 12,
'湖南省': 13,
'浙江省': 14,
'吉林省': 15,
'甘肃省': 16,
'重庆市': 17,
'上海市': 18,
'辽宁省': 19,
'安徽省': 20,
'宁夏回族自治区': 21,
'湖北省': 22,
'江苏省': 23,
'陕西省': 24,
'山西省': 25,
'山东省': 26,
'新疆维吾尔自治区': 27,
'天津市': 28,
'河南省': 29,
'北京': 30,
'河北省': 31}
# 匹配省名,增加排名列
df['所属省份空气质量排名'] = df['省份'].map(pro_rank_dic)
df.head()
time | cityname | aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | lat | lng | season | 空气质量 | 省份 | 所属省份空气质量排名 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014-12-31 | 阿坝州 | 53.0 | 33.0 | 55.0 | 3.0 | 23.0 | 1.0 | 35.0 | 31.905763 | 102.228565 | Winter | 良好 | 四川省 | 12 |
1 | 2015-01-31 | 阿坝州 | 31.0 | 18.0 | 29.0 | 7.0 | 10.0 | 0.5 | 45.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 |
2 | 2015-01-30 | 阿坝州 | 34.0 | 19.0 | 30.0 | 7.0 | 13.0 | 0.6 | 48.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 |
3 | 2015-01-29 | 阿坝州 | 31.0 | 18.0 | 31.0 | 7.0 | 15.0 | 0.5 | 32.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 |
4 | 2015-01-28 | 阿坝州 | 29.0 | 18.0 | 29.0 | 7.0 | 14.0 | 0.6 | 27.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 |
# 7.创建城市空气质量排名列(以AQI为基础)。
c = df.groupby('cityname').mean().aqi.sort_values().index
d = []
for _ in range(1, c.shape[0]+1):
d.append(_)
city_rank_dic = dict(zip(c, d))
city_rank_dic
{'三亚': 1,
'迪庆州': 2,
'海口': 3,
'丽江': 4,
'黔西南州': 5,
'怒江州': 6,
'阿坝州': 7,
'楚雄州': 8,
'大理州': 9,
'普洱': 10,
....
'德州': 357,
'安阳': 358,
'邯郸': 359,
'衡水': 360,
'克孜勒苏州': 361,
'石家庄': 362,
'阿克苏地区': 363,
'邢台': 364,
'保定': 365,
'喀什地区': 366,
'和田地区': 367}
# 匹配城市名,增加排名列
df['城市空气质量全国排名'] = df['cityname'].map(city_rank_dic)
df.head()
time | cityname | aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | lat | lng | season | 空气质量 | 省份 | 所属省份空气质量排名 | 城市空气质量全国排名 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014-12-31 | 阿坝州 | 53.0 | 33.0 | 55.0 | 3.0 | 23.0 | 1.0 | 35.0 | 31.905763 | 102.228565 | Winter | 良好 | 四川省 | 12 | 7 |
1 | 2015-01-31 | 阿坝州 | 31.0 | 18.0 | 29.0 | 7.0 | 10.0 | 0.5 | 45.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 | 7 |
2 | 2015-01-30 | 阿坝州 | 34.0 | 19.0 | 30.0 | 7.0 | 13.0 | 0.6 | 48.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 | 7 |
3 | 2015-01-29 | 阿坝州 | 31.0 | 18.0 | 31.0 | 7.0 | 15.0 | 0.5 | 32.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 | 7 |
4 | 2015-01-28 | 阿坝州 | 29.0 | 18.0 | 29.0 | 7.0 | 14.0 | 0.6 | 27.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 | 7 |
df.info() # 全部清洗完后,再查看一次数据整体情况
Int64Index: 557424 entries, 0 to 557423
Data columns (total 16 columns):
time 557424 non-null datetime64[ns]
cityname 557424 non-null object
aqi 557424 non-null float64
pm2_5 557424 non-null float64
pm10 557424 non-null float64
so2 557424 non-null float64
no2 557424 non-null float64
co 557424 non-null float64
o3 557424 non-null float64
lat 557424 non-null float64
lng 557424 non-null float64
season 557424 non-null object
空气质量 557424 non-null category
省份 557424 non-null object
所属省份空气质量排名 557424 non-null int64
城市空气质量全国排名 557424 non-null int64
dtypes: category(1), datetime64[ns](1), float64(9), int64(2), object(3)
memory usage: 68.6+ MB
df.describe()
aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | lat | lng | 所属省份空气质量排名 | 城市空气质量全国排名 | |
---|---|---|---|---|---|---|---|---|---|---|---|
count | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 | 557424.000000 |
mean | 83.352753 | 49.858352 | 85.839185 | 23.012129 | 31.140534 | 1.320357 | 78.645854 | 33.320514 | 112.931476 | 16.795900 | 191.178832 |
std | 49.496925 | 235.709794 | 73.957719 | 25.595366 | 18.015186 | 49.113311 | 40.107875 | 6.583132 | 9.278219 | 8.716008 | 106.081159 |
min | 3.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 0.100000 | 1.000000 | 18.257776 | 75.992973 | 1.000000 | 1.000000 |
25% | 52.000000 | 23.000000 | 44.000000 | 9.000000 | 18.000000 | 0.700000 | 63.000000 | 28.668283 | 108.069948 | 9.000000 | 100.000000 |
50% | 72.000000 | 38.000000 | 69.000000 | 16.000000 | 27.000000 | 0.900000 | 75.364005 | 32.929499 | 114.351807 | 16.000000 | 195.000000 |
75% | 100.000000 | 61.000000 | 107.000000 | 27.000000 | 40.000000 | 1.200000 | 90.000000 | 37.661160 | 119.455835 | 25.000000 | 284.000000 |
max | 1210.000000 | 65535.000000 | 12060.000000 | 1495.000000 | 574.000000 | 9999.900000 | 11281.000000 | 51.991789 | 131.171402 | 31.000000 | 367.000000 |
plt.figure(figsize=(25,5))
sns.heatmap(df.corr(), vmax=1, square=False, annot=True, linewidth=1)
plt.yticks(rotation=0);
[外链图片转存失败(img-iX160M0q-1565960643261)(output_36_0.png)]
与全国空气质量有较大关系的污染物指标是pm10、so2、no2。
# 使用pyecharts模块导入地图,在地图上显示城市空气质量
from pyecharts import Geo
keys = df.groupby('cityname').aqi.mean().index
values = df.groupby('cityname').aqi.mean().values
geo = Geo("全国主要城市空气质量图", "data from AQI", title_color="#fff",title_pos="left", width=800, height=600,background_color='#404a59')
geo.add("全国城市空气质量图", keys, values, visual_range=[38.072282, 193.755892], type='effectScatter',visual_text_color="#fff", symbol_size=15,is_visualmap=True, is_roam=True) # type有scatter, effectScatter, heatmap三种模式可选,可根据自己的需求选择对应的图表模式
geo.render(path="全国主要城市空气质量图.html")
从地图上可以看出,中国的北部内陆地区以及西北部地区空气质量较差,沿海地区及高原地区空气质量较好。
pd.DataFrame(df.groupby('cityname').aqi.mean().sort_values().tail(10)).plot.barh(figsize=(20,10))
plt.xlim(125,200)
plt.style.use('dark_background')
plt.title('全国空气质量最差城市')
plt.xlabel('AQI')
plt.ylabel('城市名')
plt.legend('AQI')
plt.grid(linestyle=':', color='w')
plt.show();
全国空气质量最差的10个城市/地区(排名分先后,差-好):
和田地区、喀什地区、保定、邢台、阿克苏地区、石家庄、克牧勒苏州、衡水、邯郸、安阳
pd.DataFrame(df.groupby('cityname').aqi.mean().sort_values(ascending=False).tail(10)).plot.barh(figsize=(20,10))
plt.style.use('dark_background')
plt.title('全国空气质量十佳城市')
plt.xlabel('AQI')
plt.ylabel('城市名')
plt.xlim(37,47)
plt.legend('AQI')
plt.grid(linestyle=':', color='w')
plt.show();
全国空气质量最好的10个城市/地区(排名分先后,好-差):
三亚、迪庆州、海口、丽江、黔西南州、怒江州、阿坝州、楚雄州、大理州、普洱
pd.DataFrame(df.groupby('省份').aqi.mean().sort_values().tail(10)).plot.barh(figsize=(20,10))
plt.style.use('dark_background')
plt.title('全国空气质量最差省份')
plt.xlabel('AQI')
plt.ylabel('省份')
plt.xlim(85, 120)
plt.legend('AQI')
plt.grid(linestyle=':', color='w')
plt.show();
全国空气质量最差的10个省份(排名分先后,差-好):
河北省、北京、河南省、天津、新疆、山东、山西、陕西、江苏、湖北
pd.DataFrame(df.groupby('省份').aqi.mean().sort_values(ascending=False).tail(10)).plot.barh(figsize=(20,10))
plt.style.use('dark_background')
plt.title('全国空气质量十佳省份')
plt.xlabel('AQI')
plt.ylabel('省份')
plt.xlim(40, 75)
plt.legend('AQI')
plt.grid(linestyle=':', color='w')
plt.show();
全国空气质量最好的10个省份(排名分先后,好-差):
海南、云南、福建、贵州、西藏、广东、广西、黑龙江、江西、青海
df_top10_polluted = []
df_top10_polluted = pd.DataFrame(df_top10_polluted)
for _ in range(0, 10):
'''
提取空气质量最严重的省份信息
'''
temp = df[df['省份'] == df.groupby('省份').aqi.mean().sort_values().tail(10).index[_]]
df_top10_polluted = pd.concat([df_top10_polluted, temp])
# 这里只关注轻度污染以上时的污染物情况
df_overpolluted = df_top10_polluted[df_top10_polluted['aqi'] >= 100][['aqi', 'pm2_5', 'pm10', 'so2', 'no2', 'co', 'o3']]
sns.regplot(x='pm2_5', y='aqi', data=df_overpolluted);
sns.regplot(x='pm10', y='aqi', data=df_overpolluted);
sns.regplot(x='so2', y='aqi', data=df_overpolluted);
sns.regplot(x='no2', y='aqi', data=df_overpolluted);
sns.regplot(x='co', y='aqi', data=df_overpolluted);
sns.regplot(x='o3', y='aqi', data=df_overpolluted);
plt.figure(figsize=(15,5))
sns.heatmap(df_overpolluted.corr(), vmax=1, square=False, annot=True, linewidth=1)
plt.yticks(rotation=0);
由线性关系图和热点图可知,这十个空气质量最差省份的主要污染物是pm10、so2、no2,这三种物质的高低对AQI值有较大影响,与AQI成正相关关系。此外,so2与no2两者也表现出较强的正相关关系。
df_top10_polluted_city = []
df_top10_polluted_city = pd.DataFrame(df_top10_polluted_city)
for _ in range(0, 10):
'''
提取空气质量最严重的城市信息
'''
temp = df[df['cityname'] == df.groupby('cityname').aqi.mean().sort_values().tail(10).index[_]]
df_top10_polluted_city = pd.concat([df_top10_polluted_city, temp])
# 这里只关注轻度污染以上时的污染物情况
df_overpolluted_city = df_top10_polluted_city[df_top10_polluted_city['aqi'] >= 100][['aqi', 'pm2_5', 'pm10',
'so2', 'no2', 'co', 'o3']]
sns.regplot(x='pm2_5', y='aqi', data=df_overpolluted_city);
sns.regplot(x='pm10', y='aqi', data=df_overpolluted_city);
sns.regplot(x='so2', y='aqi', data=df_overpolluted_city);
sns.regplot(x='no2', y='aqi', data=df_overpolluted_city);
sns.regplot(x='co', y='aqi', data=df_overpolluted_city);
sns.regplot(x='o3', y='aqi', data=df_overpolluted_city);
plt.figure(figsize=(15,5))
sns.heatmap(df_overpolluted_city.corr(), vmax=1, square=False, annot=True, linewidth=1)
plt.yticks(rotation=0);
同样,由线性关系图和热点图可知,十个空气质量最差城市的主要污染物是pm2.5、pm10、so2、no2,四种物质的高低对AQI值有较大影响,与AQI成正相关关系。其中值得注意的是pm2.5与城市空气质量密切相关,但与省空气质量相关性不是非常大。so2与no2之间、pm2.5与pm10、so2、no2之间表现出了较强的正相关关系,也就是说pm10、so2、no2三个指标中的某一指标的升高都会伴随着pm2.5的升高。
pd.DataFrame(df.groupby('season').aqi.mean().sort_values()).plot.barh(figsize=(15,10))
plt.title('全国不同季节空气质量情况')
plt.xlabel('AQI')
plt.ylabel('季节')
plt.xlim(60)
plt.legend('AQI')
plt.grid(linestyle=':', color='w')
plt.show();
df.groupby('season').aqi.mean().sort_values()
season
Summer 71.911104
Autumn 76.040072
Spring 82.730394
Winter 101.647808
Name: aqi, dtype: float64
全国空气质量冬季时最差,平均AQI为101.6(轻度污染),夏季时最好,平均AQI为71.9(良好)。
f, ax= plt.subplots(figsize = (14, 10))
sns.relplot(x='time', y='aqi', kind = 'line', data=df, ax=ax);
2013-2014年整体AQI较2015~2018年高。
# 提取年和月进一步分析整体AQI情况
times = df['time'].shape[0]
a = []
for _ in range(times):
month = df['time'][_].month
a.append(month)
df['month'] = a
b = []
for i in range(times):
year = df['time'][i].year
b.append(year)
df['year'] = b
df.head()
time | cityname | aqi | pm2_5 | pm10 | so2 | no2 | co | o3 | lat | lng | season | 空气质量 | 省份 | 所属省份空气质量排名 | 城市空气质量全国排名 | month | year | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014-12-31 | 阿坝州 | 53.0 | 33.0 | 55.0 | 3.0 | 23.0 | 1.0 | 35.0 | 31.905763 | 102.228565 | Winter | 良好 | 四川省 | 12 | 7 | 12 | 2014 |
1 | 2015-01-31 | 阿坝州 | 31.0 | 18.0 | 29.0 | 7.0 | 10.0 | 0.5 | 45.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 | 7 | 1 | 2015 |
2 | 2015-01-30 | 阿坝州 | 34.0 | 19.0 | 30.0 | 7.0 | 13.0 | 0.6 | 48.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 | 7 | 1 | 2015 |
3 | 2015-01-29 | 阿坝州 | 31.0 | 18.0 | 31.0 | 7.0 | 15.0 | 0.5 | 32.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 | 7 | 1 | 2015 |
4 | 2015-01-28 | 阿坝州 | 29.0 | 18.0 | 29.0 | 7.0 | 14.0 | 0.6 | 27.0 | 31.905763 | 102.228565 | Winter | 优级 | 四川省 | 12 | 7 | 1 | 2015 |
plt.figure(figsize=(30,10))
sns.barplot(x='month', y='aqi', hue='year', data=df)
plt.style.use('dark_background')
plt.ylim(50)
plt.title('2013年~2108年全国空气质量1~12月对比')
plt.show();
按每月AQI进行对比,2013年AQI比后面几年的数据都要高出很多,特别是8月12月的AQI数据。20152018年的AQI明显比前两年有所降低。高AQI的月份主要在12月2月,低AQI的月份主要在8月10月。
df.groupby('year').aqi.mean().plot.bar(figsize=(15 ,10))
plt.title('全国空气质量年变化')
plt.xticks(rotation=0)
plt.xlabel('年')
plt.ylabel('AQI')
plt.ylim(60)
plt.legend('AQI')
plt.grid(linestyle=':', color='w')
plt.show();
上图以年份为单位进行对比,可以明显看出2015年后全国空气质量有很大改善,特别是2016年~2018年,平均AQI约为80,较2013年下降40%。
df_gd = df[df['省份'] == '广东省']
df_gd_pollutant = df_gd[df_gd['aqi'] >= 100][['aqi', 'pm2_5', 'pm10', 'so2', 'no2', 'co', 'o3']]
sns.regplot(x='pm2_5', y='aqi', data=df_gd_pollutant);
sns.regplot(x='pm10', y='aqi', data=df_gd_pollutant);
sns.regplot(x='so2', y='aqi', data=df_gd_pollutant);
sns.regplot(x='no2', y='aqi', data=df_gd_pollutant);
sns.regplot(x='co', y='aqi', data=df_gd_pollutant);
sns.regplot(x='o3', y='aqi', data=df_gd_pollutant);
plt.figure(figsize=(15,5))
sns.heatmap(df_gd_pollutant.corr(), vmax=1, square=False, annot=True, linewidth=1)
plt.yticks(rotation=0);
由线性关系图和热点图可知广东省最主要的污染物是pm2.5、pm10,其次是so2、no2、co。与全国空气质量和污染物指标关系不同的是,广东省的pm2.5、pm10、so2、no2、co5个污染物指标之间它们互相影响,都有较强的正相关关系。
print('广东省的城市数量为:', df_gd.groupby('cityname').aqi.mean().shape[0])
广东省的城市数量为: 21
df_gd.groupby('cityname').aqi.mean().sort_values().tail(3) # 得出污染较严重的3个城市
cityname
佛山 73.004110
东莞 73.461992
广州 74.189665
Name: aqi, dtype: float64
广东省21个城市中,佛山、东莞、广州空气质量最差,AQI分别为73、73.5、74.2,空气质量均为良。
pd.DataFrame(df_gd.groupby('season').aqi.mean().sort_values()).plot.barh(figsize=(15,10))
plt.title('广东省不同季节空气质量情况')
plt.xlabel('AQI')
plt.ylabel('季节')
plt.xlim(50)
plt.legend('AQI')
plt.grid(linestyle=':', color='w')
plt.show();
广东省冬季AQI较高,空气质量较差,夏季AQI较低,空气质量较好。
df_gd[['省份', '所属省份空气质量排名']].head(1)
省份 | 所属省份空气质量排名 | |
---|---|---|
53971 | 广东省 | 6 |
广东省空气质量全国排名第6
df_sz = df[df['cityname'] == '深圳']
df_sz_pollutant = df_sz[df_sz['aqi'] >= 100][['aqi', 'pm2_5', 'pm10', 'so2', 'no2', 'co', 'o3']]
sns.regplot(x='pm2_5', y='aqi', data=df_sz_pollutant);
sns.regplot(x='pm10', y='aqi', data=df_sz_pollutant);
sns.regplot(x='so2', y='aqi', data=df_sz_pollutant);
sns.regplot(x='no2', y='aqi', data=df_sz_pollutant);
sns.regplot(x='co', y='aqi', data=df_sz_pollutant);
sns.regplot(x='o3', y='aqi', data=df_sz_pollutant);
plt.figure(figsize=(15,5))
sns.heatmap(df_sz_pollutant.corr(), vmax=1, square=False, annot=True, linewidth=1)
plt.yticks(rotation=0);
深圳市主要的污染物是pm2.5、pm10、so2、co。与广东省主要污染物不同的是,深圳市的no2对空气质量的影响不大,但no2与pm2.5、pm10、co三个指标有较强的正相关关系。
df_sz[['cityname', '城市空气质量全国排名']].head(1)
cityname | 城市空气质量全国排名 | |
---|---|---|
433042 | 深圳 | 38 |
深圳市空气质量在全国城市空气质量排名38位
df_sz.groupby('空气质量').time.count().plot.bar(figsize=(10,5))
plt.xticks(rotation=0)
plt.ylabel('次数')
plt.title('2013-2018深圳空气质量次数图')
plt.show();
print('平均AQI为:%.f\n\n' % (df_sz.aqi.mean()), df_sz.groupby('空气质量').time.count())
平均AQI为:55
空气质量
优级 871
良好 745
轻度污染 79
中度污染 8
重度污染 0
重污染 0
Name: time, dtype: int64
深圳平均AQI为55,接近优级水平。2013年~2018年空气质量有871次优,745次良好,79次轻度污染,8次中度污染,没有重度污染和重污染。
pd.DataFrame(df_sz.groupby('season').aqi.mean().sort_values()).plot.barh(figsize=(15,10))
plt.title('深圳不同季节空气质量情况')
plt.xlabel('AQI')
plt.ylabel('季节')
plt.xlim(40)
plt.legend('AQI')
plt.grid(linestyle=':', color='w')
plt.show();
深圳冬季空气质量相对较差,平均AQI约为65,夏季空气质量较好,空气质量优级。
3.5 分析结果
根据2013年6月~2018年7月全国空气质量数据得出以下结论:
关于空气污染物的控制: