中国五个城市(北上广、成都、沈阳)PM 2.5含量分析

中国五个城市(北上广、成都、沈阳)PM 2.5含量分析

简介

PM2.5的检测数值通常包含在环境部门和公司的空气质量报告中。 PM2.5是指大气颗粒物(PM),其直径小于或等于2.5微米。在环境科学中,特指悬浮在空气中的固体颗粒或液滴,是空气污染的主要来源之一。

1.提出问题

在此项目中,你将以一名数据分析师的身份执行数据的探索性分析。你将了解数据分析过程的基本流程。但是在你开始查看数据前,请先思考几个你需要理解的关于PM2.5的问题,例如,如果你是一名环境工作者,你会想要获得什么类型的信息来了解不同城市的环境情况?如果你是一名生活在这个城市的普通人,你可以思考PM 2.5的变化会有什么样的周期性规律?选择什么时段出行空气质量最佳?
【问题1】小明想去北京旅游,他应该选择几月份去?
【问题2】空气湿度、温度和PM 2.5含量之间有何关系?

2.观察数据

本数据包含有中国五个城市(北京、上海、成都、广州、沈阳)从2010/1/1-2015/12/31的空气和气象数据。数据中的缺失值被标记为NaN。数据列名的含义如下:

No: 行号
year: 年份
month: 月份
day: 日期
hour: 小时
season: 季节
PM: PM2.5浓度 (ug/m^3)
DEWP: 露点 (摄氏温度) 指在固定气压之下,空气中所含的气态水达到饱和而凝结成液态水所需要降至的温度。
TEMP: Temperature (摄氏温度)
HUMI: 湿度 (%)
PRES: 气压 (hPa)
cbwd: 组合风向
Iws: 累计风速 (m/s)
precipitation: 降水量/时 (mm)
Iprec: 累计降水量 (mm)

shanghai_df = pd.read_csv('E:\DA\pm25-data-of-five-chinese-cities\ShanghaiPM20100101_20151231.csv')
shanghai_df.info()
shanghai_df.describe()

在这里插入图片描述
可以看到上海市的数据总共有52584条,17列。使用以下代码查看某列缺失数据的个数:

shanghai_df.isnull().sum()

可以看到PM_US_Post的缺失数据较少(相对于另外两个观测站)
在这里插入图片描述
No列对数据分析作用不大,后面考虑删除该列。

3.数据整理(数据整理(合并、修改字段、增加字段)

(由于五个城市中只有一个观测站PM_US Post是相同的,为了合并,只取PM_US Post观测站的数据

df_all_cities = pd.DataFrame()
out_columns = ['year','month','day','hour','season','PM_US Post','HUMI','TEMP'] #这里只取了能够解决前面提出两个问题的列
file_path = 'E:\DA\pm25-data-of-five-chinese-cities' #文件位置
Beijing = file_path + '\BeijingPM20100101_20151231.csv'
Shanghai = file_path + '\ShanghaiPM20100101_20151231.csv'
Guangzhou = file_path + '\GuangzhouPM20100101_20151231.csv'
Chengdu = file_path + '\ChengduPM20100101_20151231.csv'
Shenyang = file_path + '\ShenyangPM20100101_20151231.csv'

file_names = [Beijing,Shanghai,Guangzhou,Chengdu,Shenyang]
for inx,val in enumerate(file_names): #用for循环,将df_all_cities填充各个子df
    df = pd.read_csv(val)
    f_name = val[len(file_path)+1:] 
    df = df[out_columns]
    df['city'] = f_name.split('P')[0] #增加一列‘city’
    df['season'] = df['season'].map({1:'Spring',2:'Summer',3:'Autumn',4:'Winter'}) 
    df_all_cities = df_all_cities.append(df)    
df_all_cities.columns = [c.replace(' ','_') for c in df.columns] #将变量名中的空格字符换成下划线
df_all_cities.head() #查看下处理后数据

df_all_cities.head()如下:
在这里插入图片描述

4.数据清洗

1).异常值处理
再查看下处理后的df_all_cities数据的统计信息。发现湿度的最小值为-9999.0,显然是异常数据,湿度范围为0-100.0,考虑去掉。
在这里插入图片描述
df_all_cities.info()

获取df_all_cities中HUMI值小于0的行索引,并删掉这些行

temp_list = df_all_cities[df_all_cities.HUMI < 0].index.tolist()
df_all_cities.drop(axis=0,labels=temp_list,inplace= True)
#再次查看数据信息,发现数据的确少了很多行
df_all_cities.info()
df_all_cities.describe()

数据少了20条
在这里插入图片描述
可以看到HUMI的最小值是0.000000
在这里插入图片描述

2).缺失值用平均值填充

df_all_cities['PM_US_Post'].fillna(df_all_cities['PM_US_Post'].mean(),inplace=True)
df_all_cities['HUMI'].fillna(df_all_cities['HUMI'].mean(),inplace=True)
df_all_cities['TEMP'].fillna(df_all_cities['TEMP'].mean(),inplace=True)
df_all_cities.info()
df_all_cities.isnull().sum()

在这里插入图片描述
在这里插入图片描述

5.数据可视化—>得出结论**

1.对PM2.5含量分别进行按月和按季节统计(均值),然后绘制柱状图。
法一:利用seaborn库绘制barplot

#数据可视化
df_PM25_month = df_all_cities.groupby('month',as_index=False).mean().sort_values(['PM_US_Post'],ascending=False).reset_index()
df_PM25_season = df_all_cities.groupby('season',as_index=False).mean().sort_values(['PM_US_Post'],ascending=False).reset_index()
#绘制画布
t,[ax1,ax2]= plt.subplots(figsize=(30,15)) #这里的返回值的逗号前的t我也不知道干啥用的啊!(**有大佬给指出吗?跪谢!!!**)
#按月统计
sns.barplot(x='month',y='PM_US_Post',data=df_PM25_month,palette='Greens_d',ax=ax1,errwidth=0.8)
ax1.set_title('PM 2.5含量 各月份对比图',fontsize=40,color='g')
ax1.set_xlabel('month',fontsize=32,color='g')
ax1.set_ylabel('PM 2.5含量 ug/cm^3',fontsize=32,color='g')
ax1.tick_params(axis='x',labelsize=20)
ax1.tick_params(axis='y',labelsize=20)
#按季节统计
sns.barplot(x='season',y='PM_US_Post',data=df_PM25_season,palette='Blues_d',ax=ax2,errwidth=0.3)
ax2.set_title('PM 2.5含量 各季节对比图',fontsize=40,color='b')
ax2.set_xlabel('season',fontsize=32,color='b')
ax2.set_ylabel('PM 2.5含量 ug/cm^3',fontsize=32,color='b')
ax2.tick_params(axis='x',labelsize=20)
ax2.tick_params(axis='y',labelsize=20)
plt.show()

在这里插入图片描述
在这里插入图片描述

小插曲(matlab 中文显示小方块问题)

上面的两幅图是我敲完代码后直接运行后的结果,可是等我上过一节课之后回来再重新运行,就出现了小方块,我明明记得我以前按照博客一点一点修改过配置文件啊,MD!
网上找了几篇博客,这里附上链接。matplot中文编码问题解决https://blog.csdn.net/pengzhisen123/article/details/79122825
我是使用加一行代码解决中文显示问题(原来觉得敲代码费劲),现在比起改配置文件,我还是喜欢敲代码,哈哈!

法二:直接使用matplotlib里面的plot函数

def univariate_plot(data, key = '', color = ''):
    """
    Plot average PM 2.5 readings, given a feature of interest
    """
    
    # Check if the key exists
    if not key:
        raise Exception("No key has been provided. Make sure you provide a variable on which to plot the data.")
    if key not in data.columns.values :
        raise Exception("'{}' is not a feature of the dataframe. Did you spell something wrong?".format(key))

    # Create plot
    plt.figure(figsize=(8,6))
    data.groupby(key)['PM_US_Post'].mean().plot(kind = 'bar', color = color)
    plt.ylabel('PM 2.5 (ug/m^3)')
    plt.title('Average PM 2.5 Reading by {:s}'.format(key), fontsize =14)
    plt.show()
    return None

调用该函数

univariate_plot(df_all_cities, 'month', 'red')`
univariate_plot(df_all_cities, 'season', 'blue')`

在这里插入图片描述
在这里插入图片描述
至此,通过对比不同季节的PM2.5含量,已能够回答第一个问题:小明最好选择夏季里的8月份出行。

【探究温度、湿度和PM 2.5 含量之间的关系】

**#探究湿度即温度和PM2.5含量之间的关系**
import matplotlib
import matplotlib.pyplot as plt
myfont = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simkai.ttf',size=16)#解决中文编码问题(小方块)
X1=df_all_cities['HUMI']
X2=df_all_cities['TEMP']
Y=df_all_cities['PM_US_Post']

plt.scatter(X1,Y)
plt.title(u'PM 2.5 含量与湿度关系 ',fontproperties=myfont)
plt.xlabel(u'湿度',fontproperties=myfont)
plt.ylabel(u'PM 2.5 含量',fontproperties=myfont)

plt.scatter(X2,Y,color='r')
plt.title(u'PM 2.5 含量与温度关系 ',fontproperties=myfont)
plt.xlabel(u'温度',fontproperties=myfont)
plt.ylabel(u'PM 2.5 含量',fontproperties=myfont)

plt.show()

在这里插入图片描述
在这里插入图片描述
从以上两幅图中可以看出:湿度与PM 2.5含量呈正相关,但相关性不大;温度与PM 2.5含量呈负相关,但相关性不大。
下图为散点图的相关性说明。
在这里插入图片描述
至此,第二个问题已经解决完啦,对于matplot这个强大的可视化工具,真的只有想不到。没有它办不到的,一时半会我是学不完的,后面再学一些箱线图、琴图之类的。

就到此结束啦,本文中只考虑的HUMI、TEMP两列,后面还可以使用机器学习模型对进行PM 2.5含量进行预测。
最后附上数据链接,供大家练练手~~
数据集下载地址:https://www.kaggle.com/uciml/pm25-data-for-five-chinese-cities

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值