呆瓜半小時入門python數據分析(博主錄製)
(微信二維碼掃一掃報名)
作者介紹
Plotly教程
本次Notebook的目的主要是爲了學習Plotly相關圖表使用,更多官網教程可以查看:
https://www.kaggle.com/kanncaa1/plotly-tutorial-for-beginners
!pip install plotly==4.14.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import seaborn as sns
import plotly.express as px
import plotly.graph_objs as go
import matplotlib.pyplot as plt
from scipy import stats
from collections import Counter
from plotly.offline import iplot
# 查看當前掛載的數據集目錄
!ls /home/kesci/input/vaccinations5919
數據描述
背景描述
數據說明
國家數據 locations.csv
- location:國家(或一個國家內的地區)的名稱。
- iso_code:ISO 3166-1 alpha-3 –三個字母的國家/地區代碼。
- vaccines:截至目前爲止在該國管理的疫苗清單。
- last_observation_date:我們數據中最後一次觀察的日期。
- source_name:我們數據收集來源的名稱。
- source_website:我們來源的網址。如果在給定頁面上一致地報告數字,則可以是標準URL;否則,它可以是標準URL。否則它將成爲最後一個數據點的源。
疫苗接種數據 vaccinations.csv
全球COVID-19疫苗接種的國家/地區數據
- location:國家(或一個國家內的地區)的名稱。
- iso_code:ISO 3166-1 alpha-3 –三個字母的國家/地區代碼。
- date:觀察日期。
- total_vaccinations:給藥的總次數。根據特定的劑量方案(例如,人們接受多次劑量),這被視爲一次劑量,並且可能不等於總接種人數。如果某人接種一劑疫苗,則該指標增加1。如果他們接種第二劑,則該指標再次增加1。
- total_vaccinations_per_hundred:total_vaccinations全國總人口中的每100人。
- daily_vaccinations_raw:每日總劑量變化。僅連續幾天計算。這是爲數據檢查和透明度提供的原始指標,但是我們強烈建議您daily_vaccinations改用每日疫苗接種率的任何分析方法。
- daily_vaccinations:每天服用新劑量(7天平滑)。對於不每天報告數據的國家,我們假設在沒有報告數據的任何時期內每天劑量的變化均等。這將產生完整的每日數字系列,然後將其在7天的滾動窗口中進行平均。在此處可以找到我們如何執行此計算的示例。
- daily_vaccinations_per_million:daily_vaccinations該國總人口中的每1百萬人。
- people_vaccinated:接受至少一劑疫苗的總人數。如果某人接種了第一劑2劑疫苗,那麼該指標將增加1。如果他們接種了第二劑,則該指標將保持不變。
- people_vaccinated_per_hundred:people_vaccinated全國總人口中的每100人。
- people_fully_vaccinated:接受疫苗接種方案規定的所有劑量的總人數。如果某人接種了第一劑2劑疫苗,則該指標保持不變。如果他們接受第二劑,則該指標會增加1。
- people_fully_vaccinated_per_hundred:people_fully_vaccinated全國總人口中的每100人。
美國疫苗接種數據 us_state_vaccinations.csv
美國COVID-19疫苗接種的數據。數據來自美國疾病控制與預防中心每天更新的數據。
- location:州或聯邦實體的名稱。
- date:觀察日期。
- total_vaccinations:給藥的總次數。根據特定的劑量方案(例如,人們接受多次劑量),這被視爲一次劑量,並且可能不等於總接種人數。如果某人接種一劑疫苗,則該指標增加1。如果他們接種第二劑,則該指標再次增加1。
- total_vaccinations_per_hundred:total_vaccinations該州總人口中的每100人。
- daily_vaccinations_raw:每日總劑量變化。僅連續幾天計算。這是爲數據檢查和透明度提供的原始指標,但是我們強烈建議您daily_vaccinations改用每日疫苗接種率的任何分析方法。
- daily_vaccinations:每天服用新劑量(7天平滑)。對於不每天報告數據的國家,我們假設在沒有報告數據的任何時期內每天劑量的變化均等。這將產生完整的每日數字系列,然後將其在7天的滾動窗口中進行平均。在此處可以找到我們如何執行此計算的示例。
- daily_vaccinations_per_million:daily_vaccinations該州總人口中的每100萬人。
- people_vaccinated:接受至少一劑疫苗的總人數。如果某人接種了第一劑2劑疫苗,那麼該指標將增加1。如果他們接種了第二劑,則該指標將保持不變。
- people_vaccinated_per_hundred:people_vaccinated該州總人口中的每100人。
- people_fully_vaccinated:接受疫苗接種方案規定的所有劑量的總人數。如果某人接種了第一劑2劑疫苗,則該指標保持不變。如果他們接受第二劑,則該指標會增加1。
- people_fully_vaccinated_per_hundred:people_fully_vaccinated該州總人口中的每100人。
- total_distributed:CDC的疫苗跟蹤系統中記錄的COVID-19疫苗劑量累積計數。
- total_distributed_per_hundred:該州總人口中,每100人CDC疫苗追蹤系統中記錄的COVID-19疫苗劑量累積計數。
- share_doses_used:在CDC疫苗追蹤系統中記錄的已交付疫苗中所接種疫苗的劑量份額。
數據來源
https://ourworldindata.org/covid-vaccinations
問題描述
- 哪個國家在使用什麼疫苗?
- 哪個國家的疫苗接種計劃更先進?
- 每天在哪裏接種疫苗的人更多?但是,以總人口的百分比計算呢?
國家數據-locations
import pandas as pd
import os
data_dir='/home/kesci/input/vaccinations5919'
locations_df=pd.read_csv(os.path.join(data_dir,'locations.csv'))
locations_df
locations_df.describe()
locations_df.info()
locations_df.shape[0]-locations_df.count()
世界各國是指世界上各個國家,世界上共有233個國家和地區,其中共有197個國家(主權國家195個,準主權國家2個,這裏只有90個國家,有62%的國家地區尚未有接種數據
數據來源統計
locations_df['source_name'].nunique()
locations_df['source_name'].value_counts()[:10]
我們可以看到有54個不同的數據來源,其中來自約佔有30%數據來自Ministry of Health
values = locations_df['source_name'].value_counts(dropna=False)[:10].keys().tolist()
counts = locations_df['source_name'].value_counts(dropna=False)[:10].tolist()
value_dict = dict(zip(values, counts))
import plotly.graph_objects as go
colors = ['gold', 'mediumturquoise', 'darkorange', 'lightgreen']
fig = go.Figure(data=[go.Pie(labels=values,
values=counts)])
fig.update_traces(hoverinfo='label+percent', textinfo='value', textfont_size=20,
marker=dict(colors=colors, line=dict(color='#000000', width=2)))
fig.update_layout(
title="國家接種數據的前10來源", # 標題文本 不設置位置的話 默認在左上角,下面有設置位置和顏色的講解
xaxis_title="X Axis Title", # X軸標題文本
yaxis_title="X Axis Title", # Y軸標題文本
legend_title="Legend Title", # 圖例標題文本
font=dict(
family="Courier New, monospace", # 所有標題文字的字體
size=18, # 所有標題文字的大小
color="RebeccaPurple" # 所有標題的顏色
),
xaxis_title_font_family='Times New Roman', # 額外設置x軸標題的字體
yaxis_title_font_color = 'red' # 額外將y軸的字體設置爲紅色
)
fig.show()
我們也可以統計下接種數據來源分佈的柱狀圖,如下所示:
cols_data = []
total_data = []
df_by_country = []
for country in np.unique(locations_df['location']):
df_by_country.append(locations_df[locations_df['location']==country])
def bars(data, x, y, title, figsize=(20, 12), rotation=75, size=8, width=None, height=None, colour=None):
count = pd.DataFrame({x:data[x], y:data[y]}).sort_values(ascending=False, by=y)
if not colour == None:
c = count[colour]
else:
c = None
fig = px.bar(count, x=x, y=y, title=title, width=width, height=height, color=c)
fig.show()
count = Counter(locations_df['source_name'])
{'name':count.keys(), 'value':count.values()}
count = pd.DataFrame({'name':list(count.keys()), 'value':list(count.values())})
count = count[count['value']>1]
bars(count, x='name', y='value', title='sources', width=800, height=600, colour='value')
通過以上數據分析,我們可以看到絕大部分數據來源爲Ministry of Health (衛生部)
疫苗接種數據-vaccinations
疫苗接種數據 vaccinations.csv
全球COVID-19疫苗接種的國家/地區數據
vaccinations_df=pd.read_csv(os.path.join(data_dir,'vaccinations.csv'))
vaccinations_df.head()
cols_data = []
total_data = []
df_by_country = []
for country in np.unique(vaccinations_df['location']):
df_by_country.append(vaccinations_df[vaccinations_df['location']==country])
def last_item(col):
total_vaccs = []
for country in df_by_country:
total_vaccs.append(np.array(country[col])[-1])
data = dict(zip(np.unique(vaccinations_df['location']), total_vaccs))
return data
data = last_item('total_vaccinations')
data = pd.DataFrame({'countries':list(data.keys()), 'total_vaccinations':list(data.values())})
data = data[data['total_vaccinations']>130000]
bars(data, 'countries', 'total_vaccinations', '每個國家疫苗接種人數', height=700, colour='total_vaccinations')
從上圖可以看到,我們美國和中國以及歐盟地區的疫苗總接種量最大,排在其次的是英國 英格蘭 印度等國家
疫苗閉環接種人數
data = last_item('people_fully_vaccinated')
data = pd.DataFrame({'countries':list(data.keys()), 'people_fully_vaccinated':list(data.values())})
data = data[data['people_fully_vaccinated']>50000]
bars(data, 'countries', 'people_fully_vaccinated', 'people_fully_vaccinated per country',
width=800, height=650, colour='people_fully_vaccinated')
新冠滅活疫苗接種部位在上臂三角肌,免疫程序爲2針,2針之間間隔14-28天。
納尼,爲什麼沒有我們中國的數據,估摸着是因爲這些數據來源沒有收納中國的數據?因爲我們看到最高的閉環接種地區爲“World”,我們可以理解爲China的閉環接種數量爲:
美國、中國和英國的疫苗接種總數
之後,我們將仔細研究一些領先國家 美國,中國和英國 的總疫苗接種變化趨勢
for country in ['United States', 'China', 'United Kingdom']:
df_temp = vaccinations_df[vaccinations_df['location']==country]
fig = go.Figure()
fig.add_trace(go.Scatter(x=df_temp['date'], y=df_temp['total_vaccinations'],
mode='markers+lines'))
fig.update_layout(title_text=country)
fig.update_xaxes(title='Date')
fig.update_yaxes(title='Total vaccinations')
fig.show()
以上三張圖片爲美國 中國 英國的疫苗接種總人數的變化趨勢,從圖片我們可以看出:
- 美國,中國,英國三國新冠疫苗接種總人數從2020年12月13日左右開始逐步增長,並且趨勢大致相同
- 其中美國和英國的數據記錄相對完整,中國疫苗接種數據存在部分日期缺失,這個也可能由於該數據主要來自外國有關吧
- 截止到2021年2月14日左右,美國和中國的疫苗接種總數分別在50M和40M,英國相對較少在14M左右
全球疫苗接種進度
def nulls(name, threshold, length):
countries = np.array([])
usable = 0
for i in df_by_country:
i = i.reset_index(drop=True)
col = i[name]
num_null = col.isnull().sum()
col_len = len(col.index)
usability = round(num_null/col_len*100, 2)<threshold
if usability and col_len>length:
usable += 1
countries = np.append(countries, i['location'][0])
return countries, name
def scatter(countries, col, threshold):
i = 0
fig = go.Figure()
for country in countries:
if list(vaccinations_df[vaccinations_df['location']==country][col])[-1]<threshold:
if i % 2 == 0:
i += 1
continue
i += 1
df_temp = vaccinations_df[vaccinations_df['location']==country]
trace = go.Scatter(x=df_temp['date'], y=df_temp[col],
name=country,
mode='markers+lines')
fig.add_trace(trace)
fig.update_layout(legend_title=dict(text='Countries', font=dict(family="sans-serif",
size=18)))
fig.update_xaxes(title='date')
fig.update_yaxes(title=col)
fig.show()
for i in [['total_vaccinations', 10, 15, 1000000],
['total_vaccinations_per_hundred', 10, 15, 11],
['daily_vaccinations', 2.5, 20, 200000],
['daily_vaccinations_per_million', 2.05, 20, 0],
['people_fully_vaccinated', 60, 20, 500000],
['people_fully_vaccinated_per_hundred', 60, 20, 4]]:
countries, title = nulls(i[0], i[1], i[2])
scatter(countries, title, i[3])
以上爲6張圖片,分別從不同角度反映了從2020年12月至2021年2月的全球疫苗接種進度變化:
- total_vaccinations:代表給藥的總次數,意思是如果某人接種一劑疫苗,則該指標增加1。如果他們接種第二劑,則該指標再次增加1,這個數量可以反映出一些國家的疫苗儲備量以及總體醫療水平,第一張圖片中,
我們可以居於高位的曲線爲World,但是沒有美國,中國,英國等強國的數據,那麼可以理解爲“World”代表三個國家的疫苗接種接種總人數,是遠遠高於其他國家水平的
. - people_vaccinated_per_hundred這個代表某個國家全國總人口中的每100人中有多少人接受了疫苗接種,從第二張圖片我們可以看出來,以色列(Israel),直布羅陀(Gibraltar),阿拉伯聯合酋長(united arab)這三個國家每100接種人數覆蓋率最高,後來瞭解下以色列作爲中東地區唯一一個自由民主制國家和發達國家,其經濟、科技等總體實力較強,競爭力居世界先列。 這個指標比較客觀地拋出人口基數因素的疫苗接種指標。
- daily_vaccinations:每天疫苗接種人數,可以看出隨着新冠疫苗的順利研發與不同國家輸送,全世界的每日疫苗接種人數正在逐步上漲,第三張圖片也可以反映出美國和中國的日疫苗接種人數要大於其他國家
- daily_vaccinations_per_million:某個國家全國總人口中的每1百萬人中疫苗接種人數,從第四張圖片可以看出來是以色列,蘇格蘭,威爾士等經濟發展水平,人口數量較少的國家每日疫苗接種效率比較高,是不是因爲人口少,資源配置均衡,容易管理?
還有兩張圖片,留下啦給你解讀了,奧利給~
相關性係數
相關係數矩陣
通常,樣本是由多維特徵的構成的,把每個特徵維度都看成一個隨機變量,爲了考查兩兩特徵間的關係,可以藉助隨機變量的協方差。
從下圖我們可以看出:
- total_vaccinations,people_vaccinated,people_fully_vaccinated,daily_vaccinations_raw,daily_vaccinations這幾個特徵都是強正相關的,很瞭然,如果每日數據完整的話, total_vaccinations是可以由其他變量推斷出來的
- total_vaccinations_per_hundred,people_vaccinated_per_hundred,people_fully_vaccinated_per_hundred等去除人口基數的統計量是弱相關的,因爲不代表人口越多,這些值就會越大,但是這幾個變量之間是強相關的
- 這張圖片非常好:
https://www2.deloitte.com/content/dam/Deloitte/cn/Documents/life-sciences-health-care/deloitte-cn-lshc-embrace-healthcare-revolution-zh-180601.pdf
fig, ax = plt.subplots(1, 1, figsize=(10, 6))
sns.heatmap(vaccinations_df.corr(), annot=True)
plt.show()
轉https://www.kesci.com/mw/project/602e2e1d891f960015cd0a0b/content
歡迎訪問博主教學主頁: