一、实验目标和要求
对墨西哥的个体死亡记录和死亡原因数据进行分析,掌握数据处理的三类主要工具:数据操作、数据可视化、数据建模。
二、实验环境
百度飞桨
三、实验内容¶
1)数据操作:读入数据文件deaths.xlsx和icd-main.xlsx,对数据进行筛选、去空值、分组统计等操作,计算出每种死因每小时死亡人数占全天死亡人数的比例与每小时死亡人数占总死亡人数的比例的距离,产生分析结果数据集。
(1)首先读取数据文件,然后用columns显示列名(行的话是rows),并换行('/n')
import pandas as pd
import numpy as np
deaths = pd.read_excel('data/deaths.xlsx')
code = pd.read_excel('data/icd-main.xlsx')
print(deaths.columns,'\n',code.columns)
(2)筛选出2008年的个体死亡数据,去空值(dropna()),并查看数据集形状(shape),用head(10)来显示前十行数据
mexico_deaths_2008 = deaths[(deaths['yod']== 2008) & (deaths['mod']!=0)& (deaths['dod']!=0)].dropna()
print(mexico_deaths_2008.shape)
# 去空值
mexico_deaths = deaths.dropna()
mexico_deaths.head(10)
(3)
-
.size()
:计算每个组的大小,即每个组合出现的次数。 -
.reset_index()
:将分组结果转换为一个新的 DataFrame,并重置索引,使得原来的分组键变为列。 -
pd.merge()
:用于合并两个 DataFrame#按小时和死亡类型对死亡人数进行分组统计 m_d = mexico_deaths.groupby(['hod','cod']).size().reset_index().rename(columns={0:'freq','cod':'code'}).dropna() m_d = pd.merge(left=m_d, right=code, on='code') m_d[:10]
(4)
-
# 计算不同原因导致的死亡人数 code_sum = mexico_deaths['cod'].dropna().value_counts() # 计算不同死亡时间的人数 hour_sum = mexico_deaths['hod'].dropna().value_counts() #查看不同原因导致的死亡人数最高的前十项 code_sum[:10] #查看不同死亡时间的人数 hour_sum
(5)
-
m_d['n']
:使用code_sum
(一个预定义的字典或 Series),查找每种代码对应的总死亡人数,并将其存储在新列n
中。 -
m_d['prop']
:计算每小时死亡人数占全天死亡人数的比例,公式为当前行的频数freq
除以对应的总死亡人数n
。 -
m_d['freq_all']
:使用hour_sum
(同样是一个预定义的字典或 Series),获取每小时的总死亡人数,存储在新列freq_all
中。 -
m_d_hour
:去重每小时的记录,得到每小时的唯一数据并按小时排序,以计算每个小时的总死亡人数。 -
m_d['prop_all']
:计算每小时的死亡人数占全天总死亡人数的比例,freq_all
除以m_d_hour['freq_all'].sum()
(所有小时的总死亡人数) -
#计算每种死因每小时死亡人数占全天死亡人数的比例prop m_d['n'] = m_d.apply(lambda row:code_sum[row['code']], axis=1) m_d['prop'] = m_d.apply(lambda row: row['freq']/row['n'], axis=1) #计算每小时死亡人数占总死亡人数的比例prop_all m_d['freq_all'] = m_d.apply(lambda row: hour_sum[row['hod']], axis=1) m_d_hour = m_d.drop_duplicates('hod').sort_values('hod') #计算总死亡人数 m_d['prop_all'] = m_d.apply(lambda row: row['freq_all']/m_d_hour['freq_all'].sum(), axis=1) #计算prop与prop_all的距离dist m_d['dist'] = m_d.apply(lambda row: (row['prop']-row['prop_all'])**2, axis=1) #查看结果数据集 m_d[:10]
2)数据可视化:绘制每小时死亡人数变化折线图
-
导入库,然后处理数据,绘制折线图,设置图表参数,显示图形
-
import matplotlib.pyplot as plt import matplotlib %matplotlib inline # 每小时死亡人数变化折线图 m_d_hour = m_d.drop_duplicates('hod').sort_values('hod') plt.plot(m_d_hour['hod'], m_d_hour['freq_all'], marker='o', mec='r', mfc='w') #plt.plot()这里的参数分别为:x轴数据、y轴数据、marker表示节点采用圆圈标记、mec设置标记边缘颜色为红色,mfc设置标记填充颜色为白色 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] =False plt.title('每小时死亡人数变化折线图') plt.xlabel('小时 (HOD)') plt.ylabel('死亡人数') plt.grid() plt.show() # plt.title()设置图标题,默认输出英文,如果输出中文,要对字体进行调整。
3)数据建模:找出个体非寻常死亡模式的死因,绘制非寻常死亡疾病死亡时间图。
1.
#【提示】根据死因筛选出总死亡人数大于50的数据
m_d_50 = m_d[m_d['n'] > 50]
m_d_50[:10]
2.
# 绘制线性空间下散点图
# x轴为每小时每种死因导致的死亡人数,y轴为prop与prop_all的距离dist
plt.figure()
axes1 = plt.subplot(1,2,1)
m_d_50.plot(x='n',y='dist',kind='scatter',s=1, c='b',marker='o',ax=axes1)
axes1.set_title('Linear scale scatter')
# 绘制log(x)-log(y)空间下的散点图
axes2 = plt.subplot(1,2,2)
x_log = np.log10(m_d_50['n'])
y_log = np.log10(m_d_50['dist'])
axes2.scatter(x_log, y_log, s=0.01, c='b', marker='o')
# 拟合线性回归曲线
# np.polyfit()可进行多项式拟合,从x,y数据中得出最接近数据的方程式
parameter = np.polyfit(x_log, y_log, 1)
y = parameter[0]*x_log + parameter[1]
plt.plot(x_log, y, c='r')
axes2.set_title('Log scale scatter & Best fit line')
plt.show()
3.
#【思路】绘制log空间下线性预测函数残差散点图
y = np.poly1d(parameter)
m_d_50['resid'] = m_d.apply(lambda row: np.log(row['dist'])-y(np.log(row['n'])), axis=1)
x_log = np.log(m_d['n'].values) # 假设 n 是输入变量
y_log = np.log(m_d['dist'].values) # 假设 dist 是输出变量
plt.scatter(x_log, y_log-y(x_log), s=0.01, c='b', marker='o')
mean_resid = 0*x_log + (y_log-y(x_log)).mean()
unusual_line = 0*x_log + 1.5
plt.plot(x_log, mean_resid)
plt.plot(x_log, unusual_line, c='r')
# 设置标题和标签
plt.title('Residuals in Log Space')
plt.xlabel('Log of n')
plt.ylabel('Residuals')
# 显示图形
plt.show()
4.
# 将与预测值偏差超过1.5的视为非寻常模式死亡
m_d_unusual = m_d_50[m_d_50['resid']>1.5]
print(m_d_unusual['code'].unique())
5.
# 以总死亡人数350为边界划分非寻常模式死亡疾病数据
m_d_unusual_bigger = m_d_unusual[m_d_unusual['n']>350]
m_d_unusual_smaller = m_d_unusual[m_d_unusual['n']<=350]
6.
# 查看总死亡人数超过350的非寻常死亡疾病
m_d_unusual_bigger['code'].unique()
7.
# 绘制总死亡人数超过350的非寻常死亡模式死亡时间图
fig = plt.figure()
for index,cod in enumerate(m_d_unusual_bigger['code'].unique()):
dise = m_d_50[m_d_50['code']==cod]
ax = fig.add_subplot(231 + index)
ax.plot(dise['hod'],dise['prop'])
ax.plot(m_d_hour['hod'], m_d_hour['prop_all'])
ax.set_title(cod)
plt.tight_layout()
print(cod,': ',code[code['code'] == cod]['disease'].item())
8.
# 查看总死亡人数超过350的非寻常死亡疾病
m_d_unusual_smaller['code'].unique()
9.
# 绘制总死亡人数小于350的非寻常死亡疾病死亡时间图
fig2 = plt.figure()
for index,cod in enumerate(m_d_unusual_smaller['code'].unique()):
dise = m_d_50[m_d_50['code']==cod]
ax = fig2.add_subplot(331 + index)
ax.plot(dise['hod'],dise['prop']) #某种病的每小时死亡比例随时间变化的曲线图
ax.plot(m_d_hour['hod'], m_d_hour['prop_all']) #总的死亡人数比例随时间变化的曲线图
ax.set_title(cod)
plt.tight_layout()
print(cod,': ',code[code['code'] == cod]['disease'].item()) #查看死亡人数不超过350的非寻常死亡死因
四、问题分析
字体设置的位置:在绘制图形之前设置字体是非常重要的。如果字体设置在 plt.show() 之后,可能会导致中文无法正常显示。
字体的可用性:确保所设置的中文字体在系统中实际存在。如果指定的字体不可用,Matplotlib 将使用默认字体,而这些默认字体通常不支持中文。
五、实验总结
正确设置字体:在调用 plt.show() 之前配置字体能够有效解决中文不显示的问题。使用如 SimHei、Microsoft YaHei 等常见中文字体,可以确保中文字符正常渲染。
确保字体存在:在运行程序之前,检查系统中是否安装了所需的字体是非常重要的。如果不确定,可以选择使用更为通用的字体,以提高兼容性。
标签:code,log,科学实验,prop,死亡,plt,人数,原因 From: https://blog.csdn.net/m0_73403731/article/details/143461364