首页 > 其他分享 >数据科学实验三 死亡原因分析

数据科学实验三 死亡原因分析

时间:2024-11-03 21:45:34浏览次数:5  
标签:code log 科学实验 prop 死亡 plt 人数 原因


一、实验目标和要求

对墨西哥的个体死亡记录和死亡原因数据进行分析,掌握数据处理的三类主要工具:数据操作、数据可视化、数据建模。

二、实验环境

百度飞桨

三、实验内容

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)

  1. .size():计算每个组的大小,即每个组合出现的次数。

  2. .reset_index():将分组结果转换为一个新的 DataFrame,并重置索引,使得原来的分组键变为列。

  3. 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)数据可视化:绘制每小时死亡人数变化折线图

  1. 导入库,然后处理数据,绘制折线图,设置图表参数,显示图形

  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

相关文章

  • 车载诊断协议 --- DTC状态位0x20的原因
    我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。人就应该满脑子......
  • Etsy又被封号了!这次我终于搞懂了原因...
    你是否真的了解在Etsy开店有哪些红线不能踩?你是否真的知道Etsy被封号后如何解决?本文我将探讨Etsy账号被封的常见原因,以及卖家可以采取的应对策略,以期减轻对跨境业务的伤害程度,感兴趣的商家速速码住,不要再踩坑啦!一、Etsy的审核机制及防封启示首先,我们得先搞懂Etsy的审核机......
  • 《动物园之星》加载libcurl.dll文件丢失处理办法:原因与解决指南
    当您在尝试启动《动物园之星》(PlanetZoo)时遇到“libcurl.dll文件丢失”错误,这通常意味着游戏所需的某个动态链接库文件缺失。这种情况可能是由多种原因造成的,包括不完全的安装、损坏的文件、系统路径问题等。以下是一些解决这个问题的方法:重新安装游戏•彻底卸载:首先,确保完......
  • Etsy又被封号了!这次我终于搞懂了原因...
    你是否真的了解在Etsy开店有哪些红线不能踩?你是否真的知道Etsy被封号后如何解决?本文我将探讨Etsy账号被封的常见原因,以及卖家可以采取的应对策略,以期减轻对跨境业务的伤害程度,感兴趣的商家速速码住,不要再踩坑啦!一、Etsy的审核机制及防封启示首先,我们得先搞懂Etsy的审核机......
  • Idea上Git仓库不见了是什么原因
    在使用IntelliJIDEA进行项目开发时,Git仓库突然消失是开发者常遇到的问题。该问题可能由多个因素引起,包括:1.环境配置问题;2.软件或插件更新;3.目录结构变更;4.用户权限问题;5.其他软件干扰。理解这些因素并采取相应的解决措施,不仅能快速恢复Git仓库,还能避免类似问题的再次出现。1.......
  • Qt5.9使用QWebEngineView加载网页速度慢 ,卡顿,原因是默认开启了代理
     Qt5.9使用QWebEngineView加载网页速度慢,卡顿,原因是默认开启了代理https://blog.csdn.net/zhanglixin999/article/details/131161944 BUG单下的留言讲明了问题发生的原因,那就是系统默认设置为自动寻找代理,而使用代理后延迟会变得非常大。(1)关闭自动代理接的pro文件内添......
  • 微信用不了零钱支付是什么原因
    微信用不了零钱支付可能是由多个因素引起的,包括:1.账户安全问题;2.余额不足或者超过限额;3.网络或系统故障;4.地区性限制;5.支付行为异常等。了解这些因素不仅有助于解决问题,还能提醒我们在日常使用中更加注意账户安全和合规使用。1.账户安全问题账户安全是影响微信零钱支付功能......
  • 织梦上传文章缩略图显示时提示:上传文件失败请检查原因
    检查文件夹权限确保 /uploads 文件夹存在且具有写入权限(建议权限为755或777)。检查后台设置确认后台设置的上传图片文件夹是否正确,如果不是 uploads,请在后台修改。检查网站空间确保网站空间未满,清理不必要的文件和目录。检查文件类型确认上传的图片格式是......
  • VM+ubuntu,编译huawei EC6109 SDK 报错"[u-boot.bin] Error 1" ,未找到原因
    环境:ubuntu14,内核3.13.0-24-generic源代码:https://kgithub.com/tegzwn/HiSTBLinuxV100R005C00SPC050编译问题如下:make-C/home/andy1224/Downloads/HiSTBLinuxV100R005C00SPC050-master/out/hi3798mv200/hi3798mv2dmg/obj/source/boot/fastboot/arch/arm/cpu/hi3798mv2x/u-......
  • NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备在内网播放WebRTC流,显示一直加载中是
    在科技日新月异的今天,各行各业都在经历着前所未有的变革。视频监控技术,作为安全防范体系的重要组成部分,更是随着技术的演进不断升级,以适应更加复杂多变的安全需求。NVR录像机汇聚管理EasyNVR,作为一款集视频流处理、录像存储、分发管理等功能于一体的综合性视频监控云平台,正是这......