某地环境空气质量分析(1)

本文是主要对某地2017年环境空气质量整体状况进行评价、分析。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
%matplotlib inline
plt.style.use("ggplot")
path="air_quality_2016_2017.csv"
data=pd.read_csv(path)
#将DateTime列转为日期格式
data['DateTime']=pd.to_datetime(data['DateTime'])
#将DateTime列设为索引
data=data.set_index('DateTime')
data.head()
SO2 NO2 CO O38 PM10 PM2.5
DateTime
2017-01-01 11.25 76.50 1.05825 96.25 92.50 54.00
2017-01-02 16.50 114.50 1.29700 157.00 132.25 72.00
2017-01-03 13.00 125.25 1.32525 80.25 129.50 85.25
2017-01-04 10.50 84.50 0.88750 106.00 90.75 46.75
2017-01-05 14.00 136.75 1.14225 101.25 153.75 81.50
#将2016年和2017年数据分开
data_2016=data['2016']
data_2017=data['2017']

1 总体情况

1.1 定义评价用函数

#AQI计算相关函数
def iaqi_SO2(a):
    '''计算SO2的分指数'''
    iaqi=0
    #iaqi分段
    n=[0,50,100,150,200,300,400,500]
    #24小时平均值分段
    c=[0,50,150,475,800,1600,2100,2620]
    if a>=c[0] and a<=c[1]:
        iaqi=n[0]+(a-c[0])*(n[1]-n[0])/(c[1]-c[0])
        return iaqi
    elif a>=c[1] and a<=c[2]:
        iaqi=n[1]+(a-c[1])*(n[2]-n[1])/(c[2]-c[1])
        return iaqi
    elif a>=c[2] and a<=c[3]:
        iaqi=n[2]+(a-c[2])*(n[3]-n[2])/(c[3]-c[2])
        return iaqi
    elif a>=c[3] and a<=c[4]:
        iaqi=n[3]+(a-c[3])*(n[4]-n[3])/(c[4]-c[3])
        return iaqi
    elif a>=c[4] and a<=c[5]:
        iaqi=n[4]+(a-c[4])*(n[5]-n[4])/(c[5]-c[4])
        return iaqi
    elif a>=c[5] and a<=c[6]:
        iaqi=n[5]+(a-c[5])*(n[6]-n[5])/(c[6]-c[5])
        return iaqi
    elif a>=c[6] and a<=c[7]:
        iaqi=n[6]+(a-c[6])*(n[7]-n[6])/(c[7]-c[6])
        return iaqi
    
def iaqi_NO2(a):
    '''计算NO2的分指数'''
    iaqi=0
    #iaqi分段
    n=[0,50,100,150,200,300,400,500]
    #24小时平均值分段
    c=[0,40,80,180,280,565,750,940]
    if a>=c[0] and a<=c[1]:
        iaqi=n[0]+(a-c[0])*(n[1]-n[0])/(c[1]-c[0])
        return iaqi
    elif a>=c[1] and a<=c[2]:
        iaqi=n[1]+(a-c[1])*(n[2]-n[1])/(c[2]-c[1])
        return iaqi
    elif a>=c[2] and a<=c[3]:
        iaqi=n[2]+(a-c[2])*(n[3]-n[2])/(c[3]-c[2])
        return iaqi
    elif a>=c[3] and a<=c[4]:
        iaqi=n[3]+(a-c[3])*(n[4]-n[3])/(c[4]-c[3])
        return iaqi
    elif a>=c[4] and a<=c[5]:
        iaqi=n[4]+(a-c[4])*(n[5]-n[4])/(c[5]-c[4])
        return iaqi
    elif a>=c[5] and a<=c[6]:
        iaqi=n[5]+(a-c[5])*(n[6]-n[5])/(c[6]-c[5])
        return iaqi
    elif a>=c[6] and a<=c[7]:
        iaqi=n[6]+(a-c[6])*(n[7]-n[6])/(c[7]-c[6])
        
def iaqi_PM10(a):
    '''计算PM10的分指数'''
    iaqi=0
    #iaqi分段
    n=[0,50,100,150,200,300,400,500]
    #24小时平均值分段
    c=[0,50,150,250,350,420,500,600]
    if a>=c[0] and a<=c[1]:
        iaqi=n[0]+(a-c[0])*(n[1]-n[0])/(c[1]-c[0])
        return iaqi
    elif a>=c[1] and a<=c[2]:
        iaqi=n[1]+(a-c[1])*(n[2]-n[1])/(c[2]-c[1])
        return iaqi
    elif a>=c[2] and a<=c[3]:
        iaqi=n[2]+(a-c[2])*(n[3]-n[2])/(c[3]-c[2])
        return iaqi
    elif a>=c[3] and a<=c[4]:
        iaqi=n[3]+(a-c[3])*(n[4]-n[3])/(c[4]-c[3])
        return iaqi
    elif a>=c[4] and a<=c[5]:
        iaqi=n[4]+(a-c[4])*(n[5]-n[4])/(c[5]-c[4])
        return iaqi
    elif a>=c[5] and a<=c[6]:
        iaqi=n[5]+(a-c[5])*(n[6]-n[5])/(c[6]-c[5])
        return iaqi
    elif a>=c[6] and a<=c[7]:
        iaqi=n[6]+(a-c[6])*(n[7]-n[6])/(c[7]-c[6])
        
def iaqi_CO(a):
    '''计算CO的分指数'''
    iaqi=0
    #iaqi分段
    n=[0,50,100,150,200,300,400,500]
    #24小时平均值分段
    c=[0,2,4,14,24,36,48,60]
    if a>=c[0] and a<=c[1]:
        iaqi=n[0]+(a-c[0])*(n[1]-n[0])/(c[1]-c[0])
        return iaqi
    elif a>=c[1] and a<=c[2]:
        iaqi=n[1]+(a-c[1])*(n[2]-n[1])/(c[2]-c[1])
        return iaqi
    elif a>=c[2] and a<=c[3]:
        iaqi=n[2]+(a-c[2])*(n[3]-n[2])/(c[3]-c[2])
        return iaqi
    elif a>=c[3] and a<=c[4]:
        iaqi=n[3]+(a-c[3])*(n[4]-n[3])/(c[4]-c[3])
        return iaqi
    elif a>=c[4] and a<=c[5]:
        iaqi=n[4]+(a-c[4])*(n[5]-n[4])/(c[5]-c[4])
        return iaqi
    elif a>=c[5] and a<=c[6]:
        iaqi=n[5]+(a-c[5])*(n[6]-n[5])/(c[6]-c[5])
        return iaqi
    elif a>=c[6] and a<=c[7]:
        iaqi=n[6]+(a-c[6])*(n[7]-n[6])/(c[7]-c[6])
    
def iaqi_O38(a):
    '''计算O38的分指数'''
    iaqi=0
    #iaqi分段
    n=[0,50,100,150,200,300]
    #21小时平均值分段
    c=[0,100,160,215,265,800]
    if a>=c[0] and a<=c[1]:
        iaqi=n[0]+(a-c[0])*(n[1]-n[0])/(c[1]-c[0])
        return iaqi
    elif a>=c[1] and a<=c[2]:
        iaqi=n[1]+(a-c[1])*(n[2]-n[1])/(c[2]-c[1])
        return iaqi
    elif a>=c[2] and a<=c[3]:
        iaqi=n[2]+(a-c[2])*(n[3]-n[2])/(c[3]-c[2])
        return iaqi
    elif a>=c[3] and a<=c[4]:
        iaqi=n[3]+(a-c[3])*(n[4]-n[3])/(c[4]-c[3])
        return iaqi
    elif a>=c[4] and a<=c[5]:
        iaqi=n[4]+(a-c[4])*(n[5]-n[4])/(c[5]-c[4])
        return iaqi  
        
def iaqi_PM25(a):
    '''计算PM25的分指数'''
    iaqi=0
    #iaqi分段
    n=[0,50,100,150,200,300,400,500]
    #21小时平均值分段
    c=[0,35,75,115,150,250,350,500]
    if a>=c[0] and a<=c[1]:
        iaqi=n[0]+(a-c[0])*(n[1]-n[0])/(c[1]-c[0])
        return iaqi
    elif a>=c[1] and a<=c[2]:
        iaqi=n[1]+(a-c[1])*(n[2]-n[1])/(c[2]-c[1])
        return iaqi
    elif a>=c[2] and a<=c[3]:
        iaqi=n[2]+(a-c[2])*(n[3]-n[2])/(c[3]-c[2])
        return iaqi
    elif a>=c[3] and a<=c[4]:
        iaqi=n[3]+(a-c[3])*(n[4]-n[3])/(c[4]-c[3])
        return iaqi
    elif a>=c[4] and a<=c[5]:
        iaqi=n[4]+(a-c[4])*(n[5]-n[4])/(c[5]-c[4])
        return iaqi
    elif a>=c[5] and a<=c[6]:
        iaqi=n[5]+(a-c[5])*(n[6]-n[5])/(c[6]-c[5])
        return iaqi
    elif a>=c[6] and a<=c[7]:
        iaqi=n[6]+(a-c[6])*(n[7]-n[6])/(c[7]-c[6])
        return iaqi
     
def quality_level(aqi):
    level=''
    if aqi>0 and aqi<=50:
        level='优'
        return level
    elif aqi>50 and aqi<=100:
        level='良'
        return level
    elif aqi>100 and aqi<=150:
        level='轻度污染'
        return level
    elif aqi>150 and aqi<=200:
        level='中度污染'
        return level
    elif aqi>200 and aqi<=300:
        level='重度污染'
        return level
    elif aqi>300:
        level='严重污染'
        return level

1.2 评价

#计算AQI,划分空气质量级别
data_2017['IAQI_SO2']=data_2017['SO2'].apply(iaqi_SO2)
data_2017['IAQI_NO2']=data_2017['NO2'].apply(iaqi_NO2)
data_2017['IAQI_PM10']=data_2017['PM10'].apply(iaqi_PM10)
data_2017['IAQI_CO']=data_2017['CO'].apply(iaqi_CO)
data_2017['IAQI_O38']=data_2017['O38'].apply(iaqi_O38)
data_2017['IAQI_PM2.5']=data_2017['PM2.5'].apply(iaqi_PM25)
data_2017['AQI']=data_2017.loc[:,'IAQI_SO2':'IAQI_PM2.5'].max(axis=1)
data_2017['AQ_level']=data_2017['AQI'].apply(quality_level)

data_2016['IAQI_SO2']=data_2016['SO2'].apply(iaqi_SO2)
data_2016['IAQI_NO2']=data_2016['NO2'].apply(iaqi_NO2)
data_2016['IAQI_PM10']=data_2016['PM10'].apply(iaqi_PM10)
data_2016['IAQI_CO']=data_2016['CO'].apply(iaqi_CO)
data_2016['IAQI_O38']=data_2016['O38'].apply(iaqi_O38)
data_2016['IAQI_PM2.5']=data_2016['PM2.5'].apply(iaqi_PM25)
data_2016['AQI']=data_2016.loc[:,'IAQI_SO2':'IAQI_PM2.5'].max(axis=1)
data_2016['AQ_level']=data_2016['AQI'].apply(quality_level)

#统计空气质量级别天数
aq_level_2016=pd.DataFrame(data_2016['AQ_level'].value_counts(),index=['优','良','轻度污染','中度污染']).rename(columns={'AQ_level':'2016年'})
aq_level_2017=pd.DataFrame(data_2017['AQ_level'].value_counts(),index=['优','良','轻度污染','中度污染']).rename(columns={'AQ_level':'2017年'})
aq_level_concat=pd.concat([aq_level_2016,aq_level_2017],axis=1)
aq_level_concat
2016年 2017年
124 119
195 188
轻度污染 39 46
中度污染 8 12
for i in aq_level_concat.columns:
    rate=(aq_level_concat.loc['优',i]+aq_level_concat.loc['良',i])/aq_level_concat.loc[:,i].sum()
    print("{}环境空气质量优良率为".format(i)+"{:.1%}。".format(rate))
2016年环境空气质量优良率为87.2%。
2017年环境空气质量优良率为84.1%。
fig,ax=plt.subplots(figsize=(8,6),dpi=100)
total_width=0.6
n=2
width=total_width/n
x=np.arange(len(aq_level_concat))
x=x-(total_width-width)/2
y1=aq_level_concat['2016年']
y2=aq_level_concat['2017年']
tick_label=aq_level_concat.index

ax.bar(x,y1,width,label='2016年')
ax.bar(x+width,y2,width,label='2017年',tick_label=tick_label)
ax.set_title('2016-2017年环境空气质量级别天数对比',fontsize=15)
for x,y1,y2 in zip(x,y1,y2):
    ax.text(x,y1+2,y1,ha='center')
    ax.text(x+width,y2+2,y2,ha='center')
ax.legend()

某地环境空气质量分析(1)

该地区2017年空气质量情况比2016年略差,优良天数307天,同比减少12天,其中优减少5天,良减少7天。优良率84.1%,同比下降2.9个百分点。

#按月统计超标天数
aq_level_month=data_2017[['AQI']]
aq_level_month['month']=aq_level_month.index.month
aq_level_month_count=aq_level_month[aq_level_month['AQI']>100].groupby('month').count().rename(columns=dict(AQI='超标天数'))
aq_level_month_count.loc[6]=0
aq_level_month_count=aq_level_month_count.sort_index()
fig,ax=plt.subplots(figsize=(8,5),dpi=100)
x=range(len(aq_level_month_count))
y=aq_level_month_count['超标天数'].values
labels=aq_level_month_count.index
ax.bar(x,y,width=0.6,tick_label=labels,color='#57c3c2')
ax.set_ylim(0,10)
ax.set_title('2017年各月空气质量超标天数')
ax.set_xticklabels(['{}月'.format(i) for i in range(1,13)])#设置x轴刻度标签
ax.set_ylabel('超标天数')
for x,y in enumerate(y):
    ax.text(x,y+0.15,'{}'.format(y),ha='center')

某地环境空气质量分析(1)

空气质量整体最好的是6月,超标天数为0。其次为3月和2月,分别超标1天和2天。超标天数最多的是5月和10月,超标9天。

2 主要污染物

2.1 确定主要污染物

环境空气质量分指数IAQI大于100,则当天该污染物超标。统计各污染物的超标天数。

exceeding_count_2017=data_2017.loc[:,'IAQI_SO2':'IAQI_PM2.5'][data_2017.loc[:,'IAQI_SO2':'IAQI_PM2.5']>100].count().sort_values(ascending=False)
exceeding_count_2017.rename(index={'IAQI_SO2':'SO2','IAQI_NO2':'NO2','IAQI_PM10':'PM10','IAQI_CO':'CO','IAQI_O38':'O38','IAQI_PM2.5':'PM2.5'},inplace=True)
exceeding_count_2017=pd.DataFrame(exceeding_count_2017,columns=['2017年'])
exceeding_count_2016=data_2016.loc[:,'IAQI_SO2':'IAQI_PM2.5'][data_2016.loc[:,'IAQI_SO2':'IAQI_PM2.5']>100].count().sort_values(ascending=False)
exceeding_count_2016.rename(index={'IAQI_SO2':'SO2','IAQI_NO2':'NO2','IAQI_PM10':'PM10','IAQI_CO':'CO','IAQI_O38':'O38','IAQI_PM2.5':'PM2.5'},inplace=True)
exceeding_count_2016=pd.DataFrame(exceeding_count_2016,columns=['2016年'])
exceeding_count=pd.concat([exceeding_count_2016,exceeding_count_2017],axis=1)
exceeding_count
2016年 2017年
O38 24 45
NO2 20 17
PM2.5 12 13
PM10 3 5
CO 0 0
SO2 0 0
fig,ax=plt.subplots(figsize=(8,5),dpi=100)
width=0.5
#只对超标天数大于0的污染物作图
x=np.arange(len(exceeding_count['2016年'][exceeding_count['2016年']>0]))
y1=exceeding_count['2016年'][exceeding_count['2016年']>0]
y2=exceeding_count['2017年'][exceeding_count['2017年']>0]
tick_label=exceeding_count['2016年'][exceeding_count['2016年']>0].index

ax.barh(x,-y1,width,label='2016年')
ax.barh(x,y2,width,label='2017年',tick_label=tick_label)
ax.set_title('2016-2017年污染物超标天数对比',fontsize=15)
for x,y1,y2 in zip(x,y1,y2):
    ax.text(-y1-2,x,y1,ha='center',va='center')
    ax.text(y2+2,x,y2,ha='center',va='center')
ax.legend()
#ax.set_xticks([])
#ax.get_xaxis().set_visible(False)
ax.set_xlim(-50,50)
ax.set_xticklabels([60,40, 20, 0, 20, 40])

某地环境空气质量分析(1)

exceeding_prec=exceeding_count['2017年'][exceeding_count['2017年']>0]/58
fig,ax=plt.subplots(dpi=100)
x=range(len(exceeding_prec))
y=exceeding_prec.values
labels=exceeding_prec.index
ax.bar(x,y,width=0.6,tick_label=labels)
ax.set_ylim(0,0.9)
ax.set_title('污染物天数占总超标天数比例情况')
for x,y in enumerate(y):
    ax.text(x,y+0.02,'{:.1%}'.format(y),ha='center')

某地环境空气质量分析(1)

存在超标的污染物有O3、NO2、PM2.5、PM10。与2016年相比,O3、PM2.5和PM10的超标天数增加,分别增加21天、1天和2天;NO2的超标天数减少3天。
O3超标天数最多,达45天,占总超标天数的77.6%,是引起空气质量超标的主要原因。

2.2 主要污染物同比分析

fig=plt.figure(figsize=(16,12),dpi=100)
ax1=fig.add_subplot(221)
O38_2016=data_2016['O38']
O38_2017=data_2017['O38']
ax1=sns.distplot(O38_2016,rug=True,label='2016年')
ax1=sns.distplot(O38_2017,rug=True,label='2017年')
ax1.set_title('臭氧8小时滑动平均浓度分布')
ax1.legend()

ax2=fig.add_subplot(222)
NO2_2016=data_2016['NO2']
NO2_2017=data_2017['NO2']
ax2=sns.distplot(NO2_2016,rug=True,label='2016年')
ax2=sns.distplot(NO2_2017,rug=True,label='2017年')
ax2.set_title('NO2浓度分布')
ax2.legend()

ax3=fig.add_subplot(223)
PM10_2016=data_2016['PM10']
PM10_2017=data_2017['PM10']
ax3=sns.distplot(PM10_2016,rug=True,label='2016年')
ax3=sns.distplot(PM10_2017,rug=True,label='2017年')
ax3.set_title('PM10浓度分布')
ax3.legend()

ax4=fig.add_subplot(224)
PM25_2016=data_2016['PM2.5']
PM25_2017=data_2017['PM2.5']
ax4=sns.distplot(PM25_2016,rug=True,label='2016年')
ax4=sns.distplot(PM25_2017,rug=True,label='2017年')
ax4.set_title('PM2.5浓度分布')
ax4.legend()

某地环境空气质量分析(1)

污染物浓度分布均为正偏,低浓度天数居多。2017年NO2浓度分布与2016年十分接近。其他三种污染物均是在中低浓度的频率有所降低,中高浓度频率有所增加。

fig=plt.figure(figsize=(12,10),dpi=100)
ax1=fig.add_subplot(221)
O38=pd.DataFrame([data_2016['O38'].values,data_2017['O38'].values]).T.rename(columns={0:2016,1:2017})
ax1=sns.boxplot(data=O38,showmeans=True)
ax1.set_title('臭氧八小时滑动平均')

ax2=fig.add_subplot(222)
NO2=pd.DataFrame([data_2016['NO2'].values,data_2017['NO2'].values]).T.rename(columns={0:2016,1:2017})
ax2=sns.boxplot(data=NO2,showmeans=True)
ax2.set_title('NO2')

ax3=fig.add_subplot(223)
PM10=pd.DataFrame([data_2016['PM10'].values,data_2017['PM10'].values]).T.rename(columns={0:2016,1:2017})
ax3=sns.boxplot(data=PM10,showmeans=True)
ax3.set_title('PM10')

ax4=fig.add_subplot(224)
PM25=pd.DataFrame([data_2016['PM2.5'].values,data_2017['PM2.5'].values]).T.rename(columns={0:2016,1:2017})
ax4=sns.boxplot(data=PM25,showmeans=True)
ax4.set_title('PM2.5')

某地环境空气质量分析(1)

从箱线图也可以看出,2016年和2017年的NO2浓度分布十分接近。其他三种污染物在2017年的浓度分布的四分位距、内限与2016年相比存在不同程度变大。

2.2.1 年内分布特征

2.2.1.1 日变化曲线

fig=plt.figure(figsize=(12,18),dpi=100)
x=data_2017.index

ax1=fig.add_subplot(411)
y11=data_2017['O38']
y12=[160]*365
ax1.plot(x,y11,linewidth=1.5,marker='.',color='green',label='臭氧8小时滑动平均浓度')
ax1.plot(x,y12,linewidth=1.5,linestyle='--',color='red',label='二级标准')
ax1.set_ylabel('臭氧8小时滑动平均浓度(微克/立方米)')
ax1.set_title('2017年臭氧8小时滑动平均浓度日变化曲线')
ax1.legend(loc=0)

ax2=fig.add_subplot(412)
y21=data_2017['NO2']
y22=[80]*365
ax2.plot(x,y21,linewidth=1.5,marker='.',color='green',label='NO2浓度')
ax2.plot(x,y22,linewidth=1.5,linestyle='--',color='red',label='二级标准')
ax2.set_ylabel('NO2浓度(微克/立方米)')
ax2.set_title('2017年NO2浓度日变化曲线')
ax2.legend(loc=0)

ax3=fig.add_subplot(413)
y31=data_2017['PM10']
y32=[150]*365
ax3.plot(x,y31,linewidth=1.5,marker='.',color='green',label='PM10浓度')
ax3.plot(x,y32,linewidth=1.5,linestyle='--',color='red',label='二级标准')
ax3.set_ylabel('PM10浓度(微克/立方米)')
ax3.set_title('2017年PM10浓度日变化曲线')
ax3.legend(loc=0)

ax4=fig.add_subplot(414)
y41=data_2017['PM2.5']
y42=[75]*365
ax4.plot(x,y41,linewidth=1.5,marker='.',color='green',label='PM2.5浓度')
ax4.plot(x,y42,linewidth=1.5,linestyle='--',color='red',label='二级标准')
ax4.set_ylabel('PM2.5浓度(微克/立方米)')
ax4.set_title('2017年PM2.5浓度日变化曲线')
ax4.legend(loc=0)

某地环境空气质量分析(1)

整体来看,NO2、PM10、PM2.5三种污染物的日变化曲线较为类似,大体呈现年初和年末较高、6-8月浓度较低且波动较小的规律,超标也大多发生在年初和年末。
O3则是年中浓度较低、波动较小,其余月份波动均较大,超标多发生在5月和9月前后。

2.2.1.2 月均浓度

#采用重采样的方法获得污染物月均浓度
data_2017_month=data_2017.loc[:,'SO2':'PM2.5'].resample('M').mean()

fig=plt.figure(figsize=(16,12),dpi=100)
label=['{}月'.format(i) for i in range(1,13)]#一次性生成12个月的列表

ax1=fig.add_subplot(221)
x1=np.arange(len(data_2017_month))
y1=data_2017_month['O38']
ax1.bar(x1,y1,tick_label=label,width=0.6,color='#36ADA4',alpha=0.8)
ax1.set_ylim(0,135)
ax1.set_title('2017年臭氧八小时滑动平均月均浓度',fontsize=15)
ax1.set_ylabel('臭氧八小时滑动平均浓度(微克/立方米)')
for a,b in zip(x1,y1):
    ax1.text(a,b+1.5,'{:.2f}'.format(b),ha='center')
    
ax2=fig.add_subplot(222)
x2=np.arange(len(data_2017_month))
y2=data_2017_month['NO2']
ax2.bar(x2,y2,tick_label=label,width=0.6,color='#36ADA4',alpha=0.8)
ax2.set_ylim(0,60)
ax2.set_title('2017年NO2月均浓度',fontsize=15)
ax2.set_ylabel('NO2浓度(微克/立方米)')
for a,b in zip(x2,y2):
    ax2.text(a,b+1,'{:.2f}'.format(b),ha='center')    

ax3=fig.add_subplot(223)
x3=np.arange(len(data_2017_month))
y3=data_2017_month['PM10']
ax3.bar(x3,y3,tick_label=label,width=0.6,color='#36ADA4',alpha=0.8)
ax3.set_ylim(0,110)
ax3.set_title('2017年PM10月均浓度',fontsize=15)
ax3.set_ylabel('PM10浓度(微克/立方米)')
for a,b in zip(x3,y3):
    ax3.text(a,b+1.5,'{:.2f}'.format(b),ha='center')

ax4=fig.add_subplot(224)
x4=np.arange(len(data_2017_month))
y4=data_2017_month['PM2.5']
ax4.bar(x4,y4,tick_label=label,width=0.6,color='#36ADA4',alpha=0.8)
ax4.set_ylim(0,60)
ax4.set_title('2017年PM2.5月均浓度',fontsize=15)
ax4.set_ylabel('PM2.5浓度(微克/立方米)')
for a,b in zip(x4,y4):
    ax4.text(a,b+1.5,'{:.2f}'.format(b),ha='center')

某地环境空气质量分析(1)

污染物月均浓度分布大体呈U型,PM10和PM2.5最为明显。
月均浓度最低的均为6月,且从5月到6月均出现“跳水式”下降。可能原因为6月起雨水频繁,大气污染物随着雨水共同沉降。
浓度最高月份不一致,O3为5月,NO2为3月,PM10和PM2.5均为12月。可能原因是不同污染物的来源和影响因素存在差别。

2.3 主要污染物之间相关性分析

main_pollution_2017=data_2017.loc[:,'NO2':'PM2.5']
del main_pollution_2017['CO']
corr=main_pollution_2017.corr()
corr
NO2 O38 PM10 PM2.5
NO2 1.000000 0.374063 0.723303 0.721505
O38 0.374063 1.000000 0.651855 0.622847
PM10 0.723303 0.651855 1.000000 0.944356
PM2.5 0.721505 0.622847 0.944356 1.000000
sns.pairplot(main_pollution_2017,diag_kind="hist",dropna=True)

某地环境空气质量分析(1)

不同污染物之间存在一定相关性。
PM10和PM2.5是不同粒径的颗粒物,因此相关性很强。
颗粒物与O3、NO2的相关系数在0.6-0.73之间,具较强的相关性。可能原因是颗粒物具有吸附能力,是多种污染物的载体。
O3和NO2的相关性较弱。

3 小结

(1)该地区2017年空气质量优良天数为数307天,同比减少12天,其中优减少5天,良减少7天。优良率84.1%,同比下降2.9个百分点。

(2)6月是一年之中空气质量较好的时候,无污染物超标,各种污染物浓度均较低。

(3)存在超标的污染物为O3、NO2、PM2.5、PM10,其中O3超标天数最多,占比最高,是造成空气质量超标的主要污染物。

(4)污染物大体呈现两头高中间低的规律。但O3是个例外,除6月外其余月份波动均较大,5月和10月浓度较高。

(5)不同污染物之间存在一定的相关性。两种颗粒物与其他污染物的相关系数均较高,原因可能是颗粒物具有较强的吸附能力,能作为污染物的载体。

(6)空气污染的影响因素众多,工业废气、汽车尾气、气象条件、区域大气传输乃至污染物之间的相互作用都有可能影响空气环境质量。需要比较深入分析环境空气质量还需要扩充收集较多数据资料。