数据分析实例——气象数据

本实例将对意大利北部沿海地区的气象数据进行分析与可视化。首先会运用 Python 中 matplotlib 库对数据进行图表化处理,然后调用 scikit-learn 库当中的的 SVM 库对数据进行回归分析,最终在图表分析的支持下得出我们的结论。

气象数据是在网上很容易找到的一类数据。很多网站都提供以往的气压、气温、湿度和降雨量等气象数据。只需指定位置和日期,就能获取一个气象数据文件。这些测量数据是由气象站收集的。气象数据这类数据源涵盖的信息范围较广。数据分析的目的是把原始数据转化为信息,再把信息转化为知识,因此拿气象数据作为数据分析的对象来讲解数据分析全过程再合适不过。

问题:海洋对一个地区的气候有何影响?

意大利是一个被海洋包围的半岛国家。为什么要把自己的选择局限在意大利呢?因为我们所研究的问题刚好和意大利人的一种典行为相关,也就是夏天我们喜欢躲在海边,以躲避内陆的酷热。意大利是半岛国家,找到可研究的海域不是问题,但是如何衡量海洋对其远近不同的地方的影响?这就引出了一个大问题。意大利其实多山地,离海差不多远,可以彼此作为参照的内陆区域较少。为了衡量海洋对气候的影响,我排除了山地,因为山地也许会引入其他很多因素,比如海拔。

意大利波河流域这块区域就很适合研究海洋对气候的影响。这一片平原东起亚得里亚海,向内陆延伸数百公里(见图1)。它周边虽不乏群山环绕,但由于它很宽广,削弱了群山的影响。此外,该区域城镇密集,也便于选取一组离海远近不同的城市。我们所选的几个城市,两个城市间的最大距离约为 400 公里。

第一步,选 10 个城市作为参照组。选择城市时,注意它们要能代表整个平原地区(见图2)。

如图2所示,我们选取了 10 个城市。随后将分析它们的天气数据,其中 5 个城市在距海 100 公里范围内,其余 5 个距海 100~400 公里。

选作样本的城市列表如下:

接下来,我们需要计算这些城市离海有多远。这里使用 TheTimeNow 网站提供的服务,以海滨城市 Comacchio 作为基点,计算其他城市与它之间的距离:

现在获取该网站数据需要注册后取得APPID才能使用API(百度所知,未验证),这里直接下载本次实验所需的数据集:

查看DataFrame内部结构:

从数据可视化入手分析收集到的数据是常见的做法。前面讲过,matplotlib 库提供一系列图表生成工具,能够以可视化形式表示数据。数据可视化在数据分析阶段非常有助于发现研究系统的一些特点。

导入必要的库:

非常简单的分析方法是先分析一天中气温的变化趋势。以城市米兰为例。

由图4可见,气温走势接近正弦曲线,从早上开始气温逐渐升高,最高温出现在下午两点到六点之间,随后气温逐渐下降,在第二天早上六点时达到最低值。

我们进行数据分析的目的是尝试解释是否能够评估海洋是怎样影响气温的,以及是否能够影响气温趋势,因此我们同时来看几个不同城市的气温趋势。这是检验分析方向是否正确的唯一方式。因此,我们选择三个离海最近以及三个离海最远的城市。

离海最近的三个城市的气温曲线使用红色,而离海最远的三个城市的曲线使用绿色。

结果分析:离海最近的三个城市的最高气温比离海最远的三个城市低不少,而最低气温看起来差别较小。

我们可以沿着这个方向做深入研究,收集10个城市的最高温和最低温,用线性图表示气温最值点和离海远近之间的关系。

先把最高温画出来。

如图所示,海洋对气象数据具有一定程度的影响这个假设是正确的(至少一天内如此)。而且从图中可以发现,海洋的影响衰减的很快,离海60~70公里开外,气温就已攀升到高位。

用线性回归算法(scikit-learn库的SVR)得到两条直线,分别表示两种不同的气温趋势。

然后绘图:

如上所见,离海 60 公里以内,气温上升速度很快,从 28 度陡升至 31 度,随后增速渐趋缓和(如果还继续增长的话),更长的距离才会有小幅上升。这两种趋势可分别用两条直线来表示,直线的表达式为:

考虑将这两条直线的交点作为受海洋影响和不受海洋影响的区域的分界点,或者至少是海洋影响较弱的分界点。

得到交点的坐标 [x,y] = [53,30]

因此,可以说海洋对气温产生影响的平均距离为53公里(当天的情况)。

显然,图中显示夜间或早上6点左右的最低气温与海洋无关。

考察当天三个近海城市和三个内陆城市的湿度趋势。

从图中看好像近海城市湿度要大于内陆城市,全天湿度差距在20%左右。我们再来看一下湿度的极值和离海远近之间的关系,是否跟我们的第一印象相符。

最大湿度:

最小湿度

由最大湿度和最小湿度图可知,近海城市无论是最大还是最小湿度都要高于内陆城市。然而由于采集的数据点太少,还不能说湿度和距离之间存在线性关系或者其他能用曲线表示的关系。

在采集的每个城市的气象数据中,下面两个与风有关:

对于风力数据,将其制作成线性图不是最佳选择。这里试着做一个散点图:

很显然该图表现力也不足。

要表示360度分布的数据点,最好使用另一种可视化方法:极区图。先创建一个直方图,也就是将360度分为八个面元,每个面元为45度,把所有的数据点分到这八个面元中。

histogram() 函数返回结果中的数组 hist 为落在每个面元的数据点数量。

[0 5 11 1 0 1 0 0]

返回结果中的数组 bins 定义了 360 度范围内各面元的边界。

[0. 45. 90. 135. 180. 225. 270. 315. 360.]

要想正确定义极区图,离不开这两个数组。我们将创建一个函数来绘制极区图,其中部分代码在第 7 章已讲过。我们把这个函数定义为 showRoseWind(),它有三个参数:values 数组,指的是想为其作图的数据,也就是这里的 hist 数组;第二个参数 city_name 为字符串类型,指定图表标题所用的城市名称;最后一个参数 max_value 为整型,指定最大的蓝色值。

你需要修改变量colors存储的颜色表。这里,扇形的颜色越接近蓝色,值越大。

调用函数:

由图可见,整个 360 度的范围被分成八个区域(面元),每个区域弧长为 45 度,此外每个区域还有一列呈放射状排列的刻度值。在每个区域中,用半径长度可以改变的扇形表示一个数值,半径越长,扇形所表示的数值就越大。为了增强图表的可读性,我们使用与扇形半径相对应的颜色表。半径越长,扇形跨度越大,颜色越接近于深蓝色。

定义好 showRoseWind() 函数之后,查看其他城市的风向情况也非常简单。

定义 RoseWind_Speed 函数,计算将 360 度范围划分成的八个面元中每个面元的平均风速。

这里 df_city[(df_city['wind_deg']>(deg-46)) & (df_city['wind_deg']<deg)] 获取的是风向大于'deg-46' 度和风向小于'deg' 的数据。

RoseWind_Speed() 函数返回一个包含八个平均风速值的 NumPy 数组。该数组将作为先前定义的 showRoseWind() 函数的第一个参数,这个函数是用来绘制极区图的。

如图所示的风向频率玫瑰图表示风速在 360 度范围内的分布情况。

本章主要目的是演示如何从原始数据获取信息。其中有些信息无法给出重要结论,而有些信息能够验证假设,增加我们对系统状态的认识,而找出这种信息也就意味着数据分析取得了成功。

THE END
0.【焦点复盘】创业板涨停数量增加,关注风向能否成功切换另一方面,路通视信成功连板,早盘的华鹏飞、大烨智能K线组合上都是N字型的涨停,午后有机硅板块的硅宝科技、润禾材料均是创业板标的,再加上新洁能、捷捷微电的尾盘修复动作,资金回流创业板以及科技股的倾向已经比较明显,可以继续留意是否能够切换成功。 今日涨停分析图:jvzquC41o0imu7hp1fkucrq183>18?
1.北京城市通量足迹及源区分布特征分析通量观测中,通量贡献区域通常分布在观测点盛行风向一侧(马迪等,2009)。关注观测点的通量变化时,首先要满足实际风向的需要,以便整体了解城市复杂系统通量的时空变异情况。图3给出了以气象塔为中心,22.5°步长,7层高度上全年风向频率统计的玫瑰图,同时按照风速大小分类,统计出每个子集中风速发生的频率。为方便分析,右下jvzq<84yyy4est}sm0gd0ls1fsqy1lm1jvsm1;5362<157mvo