Python⾼级应⽤课程设计作业——疫情⼤数据分析与可视化
⼀、选题背景
  2020年1⽉23⽇武汉宣布封城,武汉⾝为全世界第⼀个报道发现新冠的地区,从封锁开始,这个城市承受了⾮      常⼤的压⼒和痛苦。直到4⽉8号宣布解封,这座城市才展开双臂,成为全世界最安全的地⽅!对于这座城市,我有⽆以⾔说的感激。在疫情常态化的当下,要对疫情有更多的了解和反思!疫情数据的可视化能呈现出更直观的疫情信息。
⼆、⼤数据分析
  1.分析的数据集:
数据的列名分别为:date:⽇期,country:国家,countryCode:国家简写,province:省级地区,provinceCode:省级地区,city:城市,cityCode:城市,confirmed:确诊病例,suspected:疑似病例,cured:治愈病例,dead:死亡病例。从纵向来看:数据以时间为轴,记录了全世界疫情情况,总共229061条数据。数据从可追溯的2019.12.1的第⼀个病例开始到2020.12.8
  2.数据分析课程设计⽅案概述:
制作武汉的包含确诊病例、疑似病例、治愈病例、死亡病例的折线图。
制作全国疫情区域地图、饼图、确诊病例、疑似病例、治愈病例、死亡病例柱状图。
制作制全世界确诊⼈数图、世界死亡率图。
三、数据分析步骤
⼀、数据集
  1.数据源:github/caly5144/shu-s-project/tree/master/covid  该数据集由国内第三⽅从卫健委公布的数据中提取出来的数据集。
  2.导⼊包,导⼊数据集。
1import numpy as np
2import pandas as pd
3import matplotlib.pyplot as plt
4import seaborn as sns
5from datetime import datetime
6
7#图⽚中显⽰中⽂
8from pylab import *
Params['font.sans-serif'] = ['SimHei']
10
11#读取数据集
12 filename = 'Wuhan-2019-nCoV.csv'
13 df = pd.read_csv(filename)
⼆、数据清洗
  1.现在进⾏初步的数据清洗。
(1)⾸先添加3⾏关键数据,分别为:
现存确诊⼈数(now):确诊⼈数(confirmed)-治愈⼈数(cured)-死亡⼈数(dead)
死亡率(death_ratio):死亡⼈数(dead)/确诊⼈数(confirmed)
治愈率(cure_ratio):治愈⼈数(cured)/确诊⼈数(confirmed)。
(2)由于该数据集中出现了国家-省份-城市这种⾏政级别划分,并且再低⼀级的⾏政区下⾯为NAN值,为了区分数据的⾏政级别,⽤region_class存储:1为国家级别、2为省级别、3为市级别
(3)将数据中的“data”列的数据格式转化为“datetime64”
(4)删除对本次实验不需要的列:、城市、国家简写、疑似病例(该数据集没有收⼊疑似病例)
(5)删除重复数据
(6)空格处理
1#数据清洗
2
3#添加⼏⾏关键数据
4 df['now'] = df.confirmed-df.cured-df.dead#现存确诊
5 df['death_ratio'] = df['dead']/df['confirmed']#死亡率
6 df['cure_ratio'] = df['cured']/df['confirmed']#治愈率
7
8#添加⼀列,region_class,判断⾏政级别的数据
9 df['region_class'] = 0 # 国家
10 df.loc[pd.isnull(df.province) == False , 'region_class' ] = 1 # 省
11 df.loc[pd.isnull(df.city) == False , 'region_class' ] = 2 # 市
12
13#将date格式转化为datetime
14 df['date'].astype('datetime64')
15
16#将时间作为标签
17#df = df.set_index('date')#暂时不需要
18
19 df.drop('provinceCode',axis=1,inplace=True)#删除列,对本次实验⽆⽤数据
20 df.drop('cityCode',axis=1,inplace=True)#删除城市列,对本次实验⽆⽤数据
21 df.drop('countryCode',axis=1,inplace=True)#删除国家简写列,对本次实验⽆⽤数据
22 df.drop('suspected',axis=1,inplace=True)#删除疑似病例列,该数据集没有录⼊疑似病例
23
24#删除重复数据
25 df = df.drop_duplicates()
26
27#空值处理:由于本数据集的空值表⽰最低地区级别,即城市为空则为省级数据,省级为空则为国家级数据,都是有意义的,所以不处理空值28
29#空格处理
30 df['date']=df['date'].map(str.strip)
31 df['country']=df['country'].map(str.strip)
32#now列和region_class列是新增列,不⽤进⾏空格处理
33
34 df.head(10)
  2.进⼀步数据清理:查询⽆⽤数据
1#数据清洗查询⽆⽤数据
2 df['confirmed'].isnull().value_counts()#查询是否有确诊⼈数为0的异常值
3 df['date'].isnull().value_counts()#查询是否有⽆⽇期的异常⾏数据
4 df['country'].isnull().value_counts()#查询是否有⽆国家名的异常⾏
没有异常值
  3.进⼀步数据清理:通过describe()函数查询异常值
1#异常值处理
2 df.describe()
这时出现了⾮常多的异常值。⾸先是现存病例的最⼩值竟然出现了负数,还有⼀些死亡率和治愈率的异常值。
开始处理这些异常,⾸先查看现存⼈数⼩于0的情况
1#发现问题:在现存⼀栏中发现最⼩值出现-7.330000e+02,对此进⾏排查
2 df[df['now']<0]#显⽰现存⼈数为负数值的⾏
由此我发现了有待确认、和所属地待确认两种异常情况,还有出现确诊⼈数⼩于治愈⼈数的情况,属于异常数据,由于我⽆法对现存数据进⾏判断,所以决定将现存确诊⼈数为负数的值替换为0,这样他对整个实验的影响最⼩。
1#经过对数据的分析和查阅资料后了解到有些病例治愈了未公布来源
2#还有个别地区出现数据错误,外国苏⾥南也出现了数据错误,对此将对这些负数值赋为0
3 df.loc[df[df['now']<=0].index,['now']]=0
4
5 df['death_ratio'] = df['dead']/df['confirmed']#死亡率
6 df['cure_ratio'] = df['cured']/df['confirmed']#治愈率
当然,重新赋值会打乱死亡率和治愈率,所以重新对死亡率和治愈率进⾏赋值,再次查看
1#再次查看
2 df.describe()
三、数据可视化
  1.制作武汉的疫情数据可视化
  选取的时间段为该数据集中最早的⽇期到4⽉8⽇武汉市解封。由于主要为了了解数据的变化,所以选择了折线图进⾏绘制。
#折线图最能直观的表现出数据的变化
wuhan_df = df[df['city'] == '武汉市']#提取出武汉市数据
wuhan_df = wuhan_df[wuhan_df['date'] < '2020-04-08']#提取出武汉市解封前的数据
#提取数据
wuhan_date = np.array(wuhan_df['date'])#提取时间
wuhan_confirmed = np.array(wuhan_df['confirmed'])#提取所有新冠病例
wuhan_cured = np.array(wuhan_df['cured'])#提取治愈病例
wuhan_dead = np.array(wuhan_df['dead'])#提取死亡病例
wuhan_now = np.array(wuhan_df['now'])#提取现存病例
#绘制死亡病例、治愈病例、所有病例、现存病例的折线图
plt.figure(figsize=(100,30))
plt.xlabel("⽇期")
plt.ylabel("⼈数")
plt.plot(wuhan_date,wuhan_dead,linewidth=5.0,c='k',label="死亡病例")
plt.show()
plt.figure(figsize=(100,30))
plt.xlabel("⽇期")
plt.ylabel("⼈数")
plt.plot(wuhan_date,wuhan_cured,linewidth=5.0,c='r',label="治愈病例")
plt.show()
plt.figure(figsize=(100,30))
plt.xlabel("⽇期")
plt.ylabel("⼈数")
plt.plot(wuhan_date,wuhan_confirmed,linewidth=5.0,c='b',label="所有病例") plt.show()
#图⽚显⽰,在该数据的后半段程直线,代表着武汉疫情的基本结束
#为4⽉8号解封武汉提供了实际基础
plt.figure(figsize=(100,30))
plt.xlabel("⽇期")
plt.ylabel("⼈数")
plt.plot(wuhan_date,wuhan_now,linewidth=5.0,c='y',label="现存病例")
plt.show()
为了更直观的看这四个折线的关系,将4个图融汇在⼀个图中
1#将4个图融汇在⼀个图中
2 plt.figure(figsize=(100,30))
3 plt.xlabel("⽇期")
4 plt.ylabel("⼈数")
5 plt.plot(wuhan_date,wuhan_dead,linewidth=5.0,c='k',label="死亡病例")
6 plt.plot(wuhan_date,wuhan_cured,linewidth=5.0,c='r',label="治愈病例")
7 plt.plot(wuhan_date,wuhan_confirmed,linewidth=5.0,c='b',label="所有病例")
8 plt.plot(wuhan_date,wuhan_now,linewidth=5.0,c='y',label="现存病例")
9 plt.show()
从图中可以明显看出,在4⽉8⽇武汉解封前,确诊⼈数已经是很长的⼀段直线了,⾮常感谢武汉⼈民! 
  2.制作全国疫情地图
通过pyecharts来制作中国疫情地图,⾸先提取改数据集最新的数据:2020-12-8
1#制作全国疫情地图
2 df_index_date = df.set_index('date')#将时间作为标签
3
4 date20201208 = df_index_date['2020-12-08':'2020-12-08']#取出该数据集最后⼀⽇的数据(2020年12⽉8⽇)
5
6 China_data = date20201208[date20201208['country'] == '中国']#提取出中国的数据
7 China_data = date20201208[date20201208['region_class'] == 1]
8 province_data = China_data[["province","confirmed"]]
9
10print(province_data)
接下来制作地图
1from pyecharts.charts import Map
2import pyecharts.options as opts
3from pyecharts.globals import ChartType
4
5#制作⼀张中国地图疫情图
6
7 (
8    Map()
9    .add("",[list(z) for z in zip(list(province_data["province"]), list(province_data["confirmed"]))], "china",is_map_symbol_show=False)数据可视化设计案例
10    .set_global_opts(title_opts=opts.TitleOpts(title="2019_nCoV中国各地区总确诊⼈数地图"),visualmap_opts=opts.VisualMapOpts(is_piecewise=True,
11                pieces = [
12
13                        {"min": 5000 , "label": '>5000',"color": "#893448"}, #不指定 max,表⽰ max 为⽆限⼤
14                        {"min": 1000, "max": 4999, "label": '1000-4999',"color" : "#ff585e" },
15                        {"min": 500, "max": 999, "label": '500-1000',"color": "#fb8146"},
16                        {"min": 101, "max": 499, "label": '101-499',"color": "#ffA500"},
17                        {"min": 10, "max": 100, "label": '10-100',"color": "#ffb248"},
18                        {"min": 0, "max": 9, "label": '0-9',"color" : "#fff2d1" }]))
19
20 ).render_notebook()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。