004-中国五个城市PM 2.5数据分析

简介

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

项目完成指南

本项目中的数据分析流程和分析中使用的函数已经给出,如果你对Python不是很熟悉,通过前面课程对数据类型和函数的简单掌握,你也可以完成本项目,请不要担心!请将你的重心放到观察数据、提出问题和解答问题上。
 

提出问题

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

观察数据

本数据包含有中国五个城市(北京、上海、成都、广州、沈阳)从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)

其中与PM2.5浓度相关的数据包含有多列,其中PM_US Post 的数据来源是US Department of State Air Quality Monitoring Program。其他PM相关的数据来源于中国生态环境部在五个城市设置的不同站点,比如PM_Xuhui位于上海市徐汇区,PM_Dongsihuan位于北京市的东四环。

本项目中的数据可以从Kaggle网站上下载到,该数据也被收录于UCI Machine Learning Repository

由于项目难度设定的问题,在后面的分析中我们暂时没有对气象数据的处理和分析,如果同学感兴趣的话可以自行探索。如果你有足够的能力,我们也欢迎你不采用项目模板中的代码,对数据自行进行分析~

问题 1:至少写下两个你感兴趣的问题,请确保这些问题能够由现有的数据进行回答。

(问题示例:1. 2012年-2015年上海市PM 2.5的数据在不同的月份有什么变化趋势?2. 哪个城市的PM 2.5的含量较低?)

答案

第一个问题北京哪一年的PM 2.5平均值最高?

第二个问题2015年各季节北京的平均PM 2.5是多少?

数据评估

现在是时候由你自己来探索数据了。我们已经将数据文件提供给你,你无需自己进行下载任何其他文件。此数据由五个文件组成,分别为:

BeijingPM20100101_20151231.csv,
ChengduPM20100101_20151231.csv,
GuangzhouPM20100101_20151231.csv,
ShanghaiPM20100101_20151231.csv,
ShenyangPM20100101_20151231.csv

首先我们先运行下面的代码单元格来加载你将在分析中使用的所有数据包和函数。这些都是在数据分析中常用的第三方库,我们会在后面的正式课程中进行更加细致的教学。

如果处理的数据量特别大时,最好先从数据样本开始。这样更容易检查我们的数据整理步骤是否有效,因为我们完成代码所需的时间将更少。如果我们对整个过程的进展较为满意,那就可以着手整理整个数据集。(注:本数据集的数量并不是特别大,例如50 MB以上,因此我们并未从中提取样本,而是直接对整个数据集进行的分析。)

import csv
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn
%matplotlib inline

以上海数据为例,我们先使用Pandas的read_csv函数导入第一个数据集,并使用head、info、describe方法来查看数据中的基本信息。

Shanghai_data = pd.read_csv('ShanghaiPM20100101_20151231.csv')
Shanghai_data.head()
No year month day hour season PM_Jingan PM_US Post PM_Xuhui DEWP HUMI PRES TEMP cbwd Iws precipitation Iprec
0 1 2010 1 1 0 4 NaN NaN NaN -6.0 59.48 1026.1 1.0 cv 1.0 0.0 0.0
1 2 2010 1 1 1 4 NaN NaN NaN -6.0 59.48 1025.1 1.0 SE 2.0 0.0 0.0
2 3 2010 1 1 2 4 NaN NaN NaN -7.0 59.21 1025.1 0.0 SE 4.0 0.0 0.0
3 4 2010 1 1 3 4 NaN NaN NaN -6.0 63.94 1024.0 0.0 SE 5.0 0.0 0.0
4 5 2010 1 1 4 4 NaN NaN NaN -6.0 63.94 1023.0 0.0 SE 8.0 0.0 0.0

从运行结果可以看出,除了上面提到的数据列之外,上海数据中还包含有PM_JinganPM_Xuhui两个观测站点的数据。并且数据中PM2.5的这三列包含有缺失值“NaN”。

接下来我们可以查看一下数据的缺失情况,以及数据的类型:

Shanghai_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 52584 entries, 0 to 52583
Data columns (total 17 columns):
No               52584 non-null int64
year             52584 non-null int64
month            52584 non-null int64
day              52584 non-null int64
hour             52584 non-null int64
season           52584 non-null int64
PM_Jingan        24700 non-null float64
PM_US Post       34039 non-null float64
PM_Xuhui         25189 non-null float64
DEWP             52571 non-null float64
HUMI             52571 non-null float64
PRES             52556 non-null float64
TEMP             52571 non-null float64
cbwd             52572 non-null object
Iws              52572 non-null float64
precipitation    48575 non-null float64
Iprec            48575 non-null float64
dtypes: float64(10), int64(6), object(1)
memory usage: 6.8+ MB

通过数据中的打印,我们可以看出本数据中包含有整型(int)、浮点型(float)、字符串型(str)等数据的格式。

# print type of python object
print(type(Shanghai_data['cbwd'][0]))
<class 'str'>

变量名PM_US Post中包含空格,这也可能对我们后续的分析造成一定的困扰。因为大多数命令中,都是默认以空格做为值与值之间的分隔符,而不是做为文件名的一部分。因此我们需要将变量名中的空格改为下划线:

Shanghai_data.columns = [c.replace(' ', '_') for c in Shanghai_data.columns]
Shanghai_data.head()
No year month day hour season PM_Jingan PM_US_Post PM_Xuhui DEWP HUMI PRES TEMP cbwd Iws precipitation Iprec
0 1 2010 1 1 0 4 NaN NaN NaN -6.0 59.48 1026.1 1.0 cv 1.0
1 2 2010 1 1 1 4 NaN NaN NaN -6.0 59.48 1025.1 1.0 SE 2.0 0.0
2 3 2010 1 1 2 4 NaN NaN NaN -7.0 59.21 1025.1 0.0 SE 4.0 0.0
3 4 2010 1 1 3 4 NaN NaN NaN -6.0 63.94 1024.0 0.0 SE 5.0 0.0
4 5 2010 1 1 4 4 NaN NaN NaN -6.0 63.94 1023.0 0.0 SE 8.0 0.0

其中season的数据类型为int,但实际上season并不是一个数字,而是一个分类变量,我们可以将season中的数值1,2,3,4转换为对应的季节(可以使用Pandas的map方法来实现):

Shanghai_data['season'] = Shanghai_data['season'].map({
   1:'Spring', 2:'Summer', 3:'Autumn'
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值