Python数据分析案例 | 台风最喜欢在我国哪个省市登陆

Python数据分析案例 | 台风最喜欢在我国哪个省市登陆

【前言】

每年夏季,台风就如期而至。今年八月份,“风王”利奇马真的如脱缰野马,让大家见识到台风的可怕之处。

这次收集到1945~2015年在中国登陆的所有台风数据,并通过Python对这些数据进行可视化分析,希望能得到一些有意思的结论。

【数据来源】

该数据集来自于上海追风团队,在其官网台风数据中心下载。

网站提到某些数据年代久远,会有缺失和误差,请甄别使用。所以这里无法对数据的精确性和完整性做保证,主要是想运用python对数据做分析展示,看看台风在等级、地点、时间上的分布。杠精勿扰~

部分数据展示

【分析工具】

本文使用python及其第三方库做分析展示,分析平台是Jupyter notebook,用到爬虫、词云、可视化、地理空间分析等技术。

主要工具:Python 3.6、pandas、numpy、matplotlib、seaborn、urllib、geopandas、wordcloud


【分析流程】

1、导入相关库

# 导入相关库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import geopandas 
import seaborn as sns
from urllib import request
import re
from shapely.geometry import LineString,Point
from urllib import parse
from urllib.request import urlopen
import hashlib
import json
from wordcloud import WordCloud
import warnings
warnings.filterwarnings('ignore')
# 显示中文标签
plt.rc('font', family='SimHei', size=18)
sns.set()
%matplotlib inline

2、加载数据集

# 加载台风数据
data = pd.read_excel(r'case\taifeng.xlsx')
# 数据规格
data.shape
# 输出:(715, 7)

3、查看数据集

# 查看后10行
data.tail(10)

4、数据整理

我们可以看到数据集里只有登陆地址,没有确切的经纬度信息 。

这里需要通过地理编码的方式获取经纬度,使用的是百度地图API。

# 地理编码,通过登陆地址信息得到经、纬度
def get_coor(address):
    # 需填入自己申请应用后生成的ak
    ak = 'mcH6sBNaAfsbkSndFI5zO90j9wUpRMFy1'
    url = 'http://api.map.baidu.com/geocoder/v2/?address='
    output = 'json'
    add = parse.quote(address)  # 本文城市变量为中文,为防止乱码,先用quote进行编码
    url2 = url + add + '&output=' + output + "&ak=" + ak
    req = urlopen(url2)
    response = req.read().decode()
    #将返回的数据转化成json格式
    responseJson = json.loads(response)
    # 获取经纬度
    lon = responseJson.get('result')['location']['lng']
    lat = responseJson.get('result')['location']['lat']
    return (lat,lon)

# 添加经、纬度字段
data['coor'] = data['登陆地点'].apply(lambda x:get_coor(x))
data['lat'] = data['coor'].apply(lambda x: list(x)[0])
data['lon'] = data['coor'].apply(lambda x: list(x)[1])

获取到登陆经纬度信息后,再通过地理逆编码的方式获取省、市、区县三级信息 。

有人可能会觉得“登陆地点”字段已经有地址信息,为什么不直接截取字段?往往地址信息比较复杂,没有办法用简单的正则表达式去截取,而地理逆编码的方式却能很好的捕捉省、市、区县三级信息。

# 地理逆编码,通过经纬度获取省、市、县区三级单位
def get_address(lon,lat):
    # 输入你的秘钥,获取地址http://lbsyun.baidu.com/apiconsole/key/create
    your_ak = 'mcH6sBNaAfsbkSndFI5zO90j9wUpRMFy1'
    url = 'http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&extensions_town=true&location={},{}&output=json&pois=1&latest_admin=1&ak={}'.format(lat,lon,your_ak)
    rp = request.urlopen(url).read().decode('utf-8')
    rp = re.findall(r"\((.*)\)",rp)[0]
    rpjson= json.loads(rp)
    # 省份
    province = rpjson['result']['addressComponent']['province']
    # 城市
    city = rpjson['result']['addressComponent']['city']
    # 区县
    district = rpjson['result']['addressComponent']['district']
    data = (province, city, district)
    return data

# 添加省、市、区县字段
data['area'] = data['coor'].apply(lambda x:get_address(x[1],x[0]))
data['省'] = data['area'].apply(lambda x:x[0])
data['市'] = data['area'].apply(lambda x:x[1])
data['区县'] = data['area'].apply(lambda x:x[2])

5、台风登陆地点分布

使用geopandas将台风登陆点放到地图上,这里会用到经、纬度数据。

# 使用shapely库的Point方法,将经、纬度数据转换地理几何点
xy = [Point(xy) for xy in zip(data.lon,data.lat)]
# 将data数据读取为GeoDataFrame格式,这是geopandas库用于地理空间可视化的专有数据格式
geo_data = geopandas.GeoDataFrame(data,geometry=xy)
# 读取已经下载好的中国地图shapefile格式底图
gdf = geopandas.read_file(r"case\exportedBoundaries_shp_single_land_20190911_031017\Taiwan_AL2-AL4.shp")
# 展示中国地图
ax = gdf.plot(figsize=(20, 20), alpha=0.5, edgecolor='white',color='g',linewidth=1)
# 在中国地图底图上展示台风登陆点
geo_data.plot(ax=ax,color='red',markersize=7)
plt.rc('font', family='SimHei', size=18)
plt.title('1945-2015 全国沿海省份台风登陆地点分布图',size=30)
plt.show()

6、台风登陆地点词云展示

词云字体越大代表登陆该地点的台风数量越多。

  • 登录省份分布
# 词云展示 台风登陆的省份分布
words = ','.join(data['省'].values.tolist())
wc = WordCloud(
    background_color="white", #背景颜色
    max_words=300, #显示最大词数
    font_path='./fonts/simhei.ttf',#显示中文
    min_font_size=5,
    max_font_size=100,
    width=500  #图幅宽度
    )
x = wc.generate(words)
image = x.to_image()
image
  • 登陆城市分布
# 词云展示 台风登陆的城市分布
words = ','.join(data['市'].values.tolist())
wc = WordCloud(
    background_color="white", #背景颜色
    max_words=300, #显示最大词数
    font_path='./fonts/simhei.ttf',#显示中文
    min_font_size=5,
    max_font_size=100,
    width=500  #图幅宽度
    )
x = wc.generate(words)
image = x.to_image()
image
  • 登陆区县分布
# 词云展示 台风登陆的区县分布
words = ','.join(data['区县'].values.tolist())
wc = WordCloud(
    background_color="white", #背景颜色
    max_words=300, #显示最大词数
    font_path='./fonts/simhei.ttf',#显示中文
    min_font_size=5,
    max_font_size=100,
    width=500  #图幅宽度
    )
x = wc.generate(words)
image = x.to_image()
image

7、数据可视化分析

准备数据

# 新建data_1
data_1 = data[['登陆时间','登陆强度','巅峰强度','省']].dropna()
data_1['登陆等级'] = data_1['登陆强度'].apply(lambda x:int(re.match('\d+',str(x).split(',')[0]).group()))
data_1['巅峰等级'] = data_1['巅峰强度'].apply(lambda x:int(re.match('\d+',str(x).split(',')[0]).group()))
data_1['登陆年份'] = data_1['登陆时间'].apply(lambda x:x.year)
data_1['登陆月份'] = data_1['登陆时间'].apply(lambda x:x.month)
  • 看看在各省登陆的台风等级是怎样的
# 各省台风等级分类散点图
plt.figure(figsize=(18,6))
sns.swarmplot(x='省',y='登陆等级',data=data_1,palette='Set1')
plt.title("1945-2015 各省台风登陆等级分类散点图(点数多少代表台风数量)",size=20)
plt.show()
  • 1945~2015每年登陆台风数量变化
# 每年台风数量
year_counts = data['登陆时间'].apply(lambda x:x.year).value_counts().sort_index()
plt.figure(figsize=(15,6))
plt.plot(year_counts,lw=2)
plt.plot(year_counts,'ro',color='b')
x = year_counts.index.tolist()
y_mean = [year_counts.mean()]*year_counts.shape[0]
plt.plot(x,y_mean,'--')
plt.xlabel('年份')
plt.ylabel('次数')
plt.rc('font', family='SimHei', size=18) 
plt.title('1945-2015 全国每年台风登陆数量',size=20)
plt.show()
  • 台风登陆次数热力图,横坐标代表登陆月份,纵坐标代表登陆等级,颜色代表登录次数
# 不同月份台风登陆时的强度等级
data_3 = data_1.groupby(['登陆月份','登陆等级'],as_index=False)['登陆时间'].count()
data_3 = data_3.rename(columns={'登陆时间':'登录次数'})
# data_2.sort_values(['登陆等级','登陆月份'])
data_3_pivot = data_3.pivot('登陆等级','登陆月份','登录次数')
# data_2_pivot
plt.figure(figsize=(8,6))
sns.heatmap(data_3_pivot)
plt.title('1945-2015 全国台风登陆次数热力图(按月份-登陆等级)',size=20)
plt.show()
  • 台风登陆等级箱图,看看每个月的台风强度变化
plt.figure(figsize=(8,6))
sns.boxplot(x='登陆月份',y='登陆等级',data=data_3)
plt.title('1945-2015 全国台风登陆等级分布箱图',size=20)
plt.show()
  • 台风登陆次数热力图,横坐标代表登陆月份,纵坐标代表巅峰等级,颜色代表登录次数
# 不同月份台风登陆时的强度等级
data_2 = data_1.groupby(['登陆月份','巅峰等级'],as_index=False)['登陆时间'].count()
data_2 = data_2.rename(columns={'登陆时间':'登录次数'})
data_2_pivot = data_2.pivot('巅峰等级','登陆月份','登录次数')
plt.figure(figsize=(8,6))
sns.heatmap(data_2_pivot)
plt.title('1945-2015 全国台风登陆次数热力图(按月份-巅峰等级)',size=20)
plt.show()
  • 台风巅峰等级箱图,看看每个月的台风强度变化
plt.figure(figsize=(8,6))
sns.boxplot(x='登陆月份',y='巅峰等级',data=data_2)
plt.title('1945-2015 全国台风巅峰等级箱图',size=20)
plt.show()

【结论】

从地理位置上看,1945-2015 台风主要登陆地点集中在广东省、海南省、台湾省,在台湾省登陆的台风等级较高,广东省数量最多。湛江市和台东县是台风最喜欢登陆的市、县。

从时间上看,年平均登陆台风数量9次左右,主要集中在8、9月份,8月份的台风等级中位数较高,并且强台风主要出现在9月份前后。

编辑于 2019-09-12

文章被以下专栏收录