基于Python的2013-2018全国城市空气质量分析
基于Python的2013-2018全国城市空气质量分析
项目摘要
本项目使用pandas/numpy工具包对557424条空气质量数据进行导入及清洗,并使用matplotlib/seaborn/pyecharts工具包可视化分析全国主要省市的空气质量情况,对空气质量最差及最好的省市进行排名,利用相关性分析省市的主要污染物,从不同层面给出污染物指标控制方案。
主要结论如下:
- 中国北部内陆地区以及西北部地区空气质量较差,沿海地区及高原地区空气质量较好;
- 全国空气质量最差的10个省份(排名分先后,差-好):河北省、北京、河南省、天津、新疆、山东、山西、陕西、江苏、湖北;
- 全国空气质量最好的10个省份(排名分先后,好-差):海南、云南、福建、贵州、西藏、广东、广西、黑龙江、江西、青海;
- 全国空气质量最差的10个城市/地区(排名分先后,差-好):和田地区、喀什地区、保定、邢台、阿克苏地区、石家庄、克牧勒苏州、衡水、邯郸;
- 全国空气质量最好的10个城市/地区(排名分先后,好-差):三亚、迪庆州、海口、丽江、黔西南州、怒江州、阿坝州、楚雄州、大理州、普洱;
- 空气质量最差省份的主要污染物是pm10、so2、no2。so2与no2两者正相关;
- 空气质量最差城市的主要污染物是pm2.5、pm10、so2、no2。so2与no2之间、pm2.5与pm10、so2、no2之间有较强的正相关关系;
- 全国空气质量冬季时最差,平均AQI为101.6(轻度污染),夏季时最好,平均AQI为71.9(良好);
- 2015年后全国空气质量有很大改善,特别是2016年~2018年,平均AQI约为80,较2013年下降40%;
- 广东省最主要的污染物是pm2.5、pm10,其次是so2、no2、co;
- 广东省21个城市中,佛山、东莞、广州空气质量最差,AQI分别为73、73.5、74.2,空气质量均为良;
- 广东省冬季AQI较高,空气质量较差,夏季AQI较低,空气质量较好; 广东省空气质量全国排名第6;
- 深圳市主要的污染物是pm2.5、pm10、so2、co; 深圳市空气质量在全国城市空气质量排名38位。
1.项目背景
本项目以2013-2018年的全国城市空气质量历史数据作为依据,探究全国空气质量与各污染物之间的联系。
2.数据集介绍
数据集地址:https://tianchi.aliyun.com/dataset/dataDetail?dataId=2881
数据来自阿里天池,作者通过PythonSpider从真气网获取数据。以下为各字段描述:
3.项目分析
3.1 提出问题
全国范围:
- 全国哪些城市污染较严重,那些省份污染较严重?(AQI作为判断依据)
- 污染较严重省份的主要污染物是什么?
- 污染较严重城市的主要污染物是什么?
- 全国哪个季节的污染最严重?
- 2013年-2018年全国整体空气质量如何变化
全省范围(广东省):
- 广东省的主要污染物是什么?
- 全省哪些城市污染较严重?(AQI作为判断依据)
- 全省哪个季节的污染最严重?
- 广东省的控制质量在全国的排名?
全市范围(深圳市):
- 深圳市的主要污染物是什么?
- 深圳空气质量在全国的排名?
- 深圳哪个季节的污染最严重?
3.2 理解数据
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()
<class 'pandas.core.frame.DataFrame'>
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
3.3 数据清洗
根据以上简单查看数据,得出以下数据清洗思路:
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列的数据类型
<class 'pandas.core.frame.DataFrame'>
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().indexb = []
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().indexd = []
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() # 全部清洗完后,再查看一次数据整体情况
<class 'pandas.core.frame.DataFrame'>
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
3.4 构建模型
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。
1.全国范围:
问题1.1:全国哪些城市污染较严重,那些省份污染较严重?(AQI作为判断依据)
# 使用pyecharts模块导入地图,在地图上显示城市空气质量
from pyecharts import Geokeys = df.groupby('cityname').aqi.mean().index
values = df.groupby('cityname').aqi.mean().valuesgeo = 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个省份(排名分先后,好-差):
海南、云南、福建、贵州、西藏、广东、广西、黑龙江、江西、青海
问题1.2:污染较严重省份的主要污染物是什么?
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两者也表现出较强的正相关关系。
问题1.3:污染较严重城市的主要污染物是什么?
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的升高。
问题1.4:全国哪个季节的污染最严重?
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(良好)。
问题1.5:2013年-2018年全国整体空气质量如何变化?
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'][_].montha.append(month)
df['month'] = ab = []
for i in range(times):year = df['time'][i].yearb.append(year)
df['year'] = bdf.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%。
2.全省范围(广东省为例):
问题2.1:广东省的主要污染物是什么?
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个污染物指标之间它们互相影响,都有较强的正相关关系。
问题2.2:全省哪些城市污染较严重?(AQI作为判断依据)
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,空气质量均为良。
问题2.3:全省哪个季节的污染最严重?
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较低,空气质量较好。
问题2.4:广东省空气质量在全国的排名??
df_gd[['省份', '所属省份空气质量排名']].head(1)
省份 | 所属省份空气质量排名 | |
---|---|---|
53971 | 广东省 | 6 |
广东省空气质量全国排名第6
3.全市范围(深圳市为例):
问题3.1:深圳市的主要污染物是什么?
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三个指标有较强的正相关关系。
问题3.2:深圳空气质量在全国的排名?
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次中度污染,没有重度污染和重污染。
问题3.3:深圳哪个季节的污染最严重?
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月全国空气质量数据得出以下结论:
- 中国的北部内陆地区以及西北部地区空气质量较差,沿海地区及高原地区空气质量较好;
- 全国空气质量最差的10个省份(排名分先后,差-好):河北省、北京、河南省、天津、新疆、山东、山西、陕西、江苏、湖北;
- 全国空气质量最好的10个省份(排名分先后,好-差):海南、云南、福建、贵州、西藏、广东、广西、黑龙江、江西、青海;
- 全国空气质量最差的10个城市/地区(排名分先后,差-好):和田地区、喀什地区、保定、邢台、阿克苏地区、石家庄、克牧勒苏州、衡水、邯郸;
- 全国空气质量最好的10个城市/地区(排名分先后,好-差):三亚、迪庆州、海口、丽江、黔西南州、怒江州、阿坝州、楚雄州、大理州、普洱;
- 空气质量最差省份的主要污染物是pm10、so2、no2。so2与no2两者正相关;
- 空气质量最差城市的主要污染物是pm2.5、pm10、so2、no2。so2与no2之间、pm2.5与pm10、so2、no2之间有较强的正相关关系;
- 全国空气质量冬季时最差,平均AQI为101.6(轻度污染),夏季时最好,平均AQI为71.9(良好);
- 2015年后全国空气质量有很大改善,特别是2016年~2018年,平均AQI约为80,较2013年下降40%;
- 广东省最主要的污染物是pm2.5、pm10,其次是so2、no2、co;
- 广东省21个城市中,佛山、东莞、广州空气质量最差,AQI分别为73、73.5、74.2,空气质量均为良;
- 广东省冬季AQI较高,空气质量较差,夏季AQI较低,空气质量较好;
- 广东省空气质量全国排名第6;
- 深圳市主要的污染物是pm2.5、pm10、so2、co;
- 深圳市空气质量在全国城市空气质量排名38位;
- 深圳平均AQI为55,接近优级水平。2013年~2018年空气质量有871次优,745次良好,79次轻度污染,8次中度污染,没有重度污染和重污染;
- 深圳冬季空气质量相对较差,平均AQI约为65,夏季空气质量较好,空气质量优级。
4. 建议
关于空气污染物的控制:
- 在省级层面上建议注重控制pm10、so2、no2
- 在市级层面上建议注重控制pm2.5、pm10、so2、no2
- 对于广东省,建议主要控制pm2.5和pm10,适当关注so2、no2、co的排放
- 对于深圳市,建议主要控制pm2.5、pm10、so2、co,适当关注no2的排放
基于Python的2013-2018全国城市空气质量分析相关推荐
- Python爬取国家数据中心环境数据(全国城市空气质量小时报)并导入csv文件
1.开发环境: python 3.5 + fiddler 4 (抓包工具)+ 火狐浏览器 + idea 2.分析要爬取的页面 2.1 首页 数据中心 点击 全国城市空气质量小时报 查看 ...
- python空气质量分析与预测_干货!如何用 Python+KNN 算法实现城市空气质量分析与预测?...
原标题:干货!如何用 Python+KNN 算法实现城市空气质量分析与预测? 作者 | 李秋键 责编 | 伍杏玲 封图 | CSDN 付费下载自东方 IC 出品 | CSDN(ID:CSDNnews) ...
- 全国城市空气质量实时发布平台数据抓取采集获取
全国城市空气质量实时发布平台(https://air.cnemc.cn:18007/ 原http://106.37.208.233:20035/)数据抓取采集获取,数据处理方法 import or ...
- 全国城市空气质量查询,PM2.5查询
一.接口介绍 提供全国城市空气质量实时数据,每小时更新.目前支持全国300+城市,可查询监测点数据.实时查询空气质量.小时粒度.实时给出空气质量AQI指数,并给出空气质量级别和首要污染物.广泛应用于交 ...
- 全国城市空气质量查询 PM2.5查询
一.接口介绍 提供全国城市空气质量实时数据,每小时更新.目前支持全国300+城市,可查询监测点数据.实时查询空气质量.小时粒度.实时给出空气质量AQI指数,并给出空气质量级别和首要污染物. 二.功能体 ...
- 城市空气质量分析与预测
城市空气质量分析与预测 一.AQI分析与预测 1.背景信息 2.任务说明 3.数据集描述 二.数据分析流程 基本流程 三.读取数据 1.导入相关的库 2.加载数据集 四.数据清洗 1.缺失值 1.1. ...
- 全国城市空气质量实时数据(PM2.5)实时下载
国家公布了"http://113.108.142.147:20035/emcpublish/"空气质量实时发布平台,WCF服务地址为"http://113.108.142 ...
- 全国主要城市空气质量
效果: 代码: <!DOCTYPE html> <head> <meta charset="utf-8"> <title>全国城市空 ...
- 城市空气质量(AQI)数据爬虫
全国各城市(网页上有的)空气质量爬虫,包括城市名称,AQI等信息,保存为.csv文件格式 网址首页:https://www.aqistudy.cn/historydata/index.php 首先是获 ...
最新文章
- [教程]MongoDB 从入门到进阶 (概要 以及 高级索引篇 TimeToLive GeoNear)
- React学习(1)——JSX语法与React组件
- 链表反转2(Reverse Linked List II)
- 局部页面切换url为什么不变_python爬虫 - 翻页url不变网页的爬虫探究
- 吉他谱----see you again
- pagecontrol
- python替换txt指定内容_python 实现类似sed命令的文件内容替换
- socket可以写成单例嘛_精读设计模式 Singleton 单例模式
- 程序员的算法课(8)-贪心算法:理解霍夫曼编码
- block引用c语言数组,Block在ARC和MRC下的使用分析
- matlab r2016a破解版安装
- 国产图形化的msf——Viper初体验
- 网络安全——Burpsuite
- java零基础学习第七天
- Ubuntu 修改DNS
- 微信退款服务器系统失败怎么办,微信缴费失败怎么退款?能退回吗?
- 震惊!为了欣赏后宫的3000佳丽,我竟然用Python做出了一面墙?
- 怎么把cad的图导入ps_CAD图纸导入Photoshop的方法有哪些?
- mysql excel 数据处理_将excel的数据进行sql处理
- echarts 时间曲线图_web前端显示设备实时温度,ECharts实现温度折线图,实时动态温度曲线图生成...
热门文章
- 计算机专业进铁路工资待遇,铁道通信信号工资一般是多少
- python模拟报数游戏有n个人围成一圈,从0到n-1按顺序编号,从第一个人开始从1到k报数,报到k的人推出圈子,然后圈子缩小,从下个人继续游戏,问最后留下来的是几号?
- iPhone越狱开发--Cydia起源篇
- LeetCode刷题之路:11. 盛最多水的容器
- .DS_Store文件
- 微信小程序——短链接详解
- 域名备案与空间备案有什么关系吗,域名备案又是怎么回事?
- 密码学安全强随机数生成器_强密码学简介
- 实现移动曲面拟合法的数字高程模型内插,数据格式X、Y、Z,数据量大,使用C++语言实现...
- 关于ElasticSearch新建文档的姿势