2012年国赛高教杯数学建模C题脑卒中发病环境因素分析及干预解题全过程文档及程序

2012年国赛高教杯数学建模

C题 脑卒中发病环境因素分析及干预

  脑卒中(俗称脑中风)是目前威胁人类生命的严重疾病之一,它的发生是一个漫长的过程,一旦得病就很难逆转。这种疾病的诱发已经被证实与环境因素,包括气温和湿度之间存在密切的关系。对脑卒中的发病环境因素进行分析,其目的是为了进行疾病的风险评估,对脑卒中高危人群能够及时采取干预措施,也让尚未得病的健康人,或者亚健康人了解自己得脑卒中风险程度,进行自我保护。同时,通过数据模型的建立,掌握疾病发病率的规律,对于卫生行政部门和医疗机构合理调配医务力量、改善就诊治疗环境、配置床位和医疗药物等都具有实际的指导意义。
  数据(见Appendix-C1)来源于中国某城市各家医院2007年1月至2010年12月的脑卒中发病病例信息以及相应期间当地的逐日气象资料(Appendix-C2)。请你们根据题目提供的数据,回答以下问题:
  1.根据病人基本信息,对发病人群进行统计描述。
  2.建立数学模型研究脑卒中发病率与气温、气压、相对湿度间的关系。
  3.查阅和搜集文献中有关脑卒中高危人群的重要特征和关键指标,结合1、2中所得结论,对高危人群提出预警和干预的建议方案。

整体求解过程概述(摘要)

  本文通过建立合理的假设,对某地区2009-2010年脑卒中发病率与8种气象因素进行了相关分析,并经多元逐步回归建立了脑卒中发病率的预报模型进行了定量分析,得到了较为合理的结论。考虑到发病率与气象因素的复杂关系,在逐步线性回归模型的基础上,引进广义线性回归模型(GLM)进行推广。
  针对问题一,本文对性别、年龄段、职业和时间序列以及4年的平均发病例数进行统计和分析,在删除了一些缺失或失真数据的基础上,对数据分别进行整理分析。最后,在性别方面,得到脑卒中发病率男性比女性的高。从年龄结构看,发病人数主要集中在50~90这一年龄区间内,其所占比例达81.10%。从职业结构看,农民的发病率最大。从各年的平均发病人数看,在各年季节交替月份的患病人数较多。
  针对问题二,考虑到气温、气压和相对湿度对发病率的影响不确定,本文首先建立了Pearson相关分析模型,通过r值的大小来判断发病率与各指标是否存在着某种相关。经计算得出温度与发病率呈正相关,气压、相对湿度与发病率呈负相关,且各指标与发病率均呈弱相关,相关度并不显著。其次,考虑到发病率有可能受到多个因素的共同影响,于是用逐步线性回归模型对各因素逐步分析删除,最后得出脑卒中月平均发病率与平均气压、最大气压、最小气压、平均温度、最高温度和最高相对湿度这五个因素的一个多元回归线性预报模型,并进行了一定的定量分析。最后,考虑到逐步线性回归模型的各指标是相互独立性,而气压和温度之间存在相互作用,通过引入平均气压和平均温度交互项,对模型二进行了改进,得到了一个更优的模型。通过对模型的定量分析,本文预报模型具有实际应用价值。
  针对问题三,脑卒中高危人群的重要特征有:偏瘫、失语、精神症状等,关键指标有:高血压、吸烟醉酒、血脂异常、糖尿病等。结合问题一、二的结论,分别针对高危人群提出预警和干预的建议方案。从这两个方案中得知:减少脑卒中发病率要从提高身体素质、疾病的认知和膳食均衡这三方面去考虑。
  最后,考虑到逐步线性回归模型中脑卒中发病率与气象因素中的线性关系,而实际上,发病率与气象因素关系的复杂性线性关系并不足以充分刻画,本文在假设脑卒中发病例数与整个地区是一个小概率事件上,其实际分布接近于泊松分布,利用广义线性回归模型(GLM)进行推广,一定程度优化了逐步回归模型。

模型假设:

  1. 假设4年中年与年间气象没有发生剧烈变化
  2. 假设发病人数不存在人口迁移的巨大变化

问题分析:

  背景分析
  脑卒中(Stroke)是脑中风的学名,是一种突然起病的脑血液循环障碍性疾病。又叫脑血管意外。是指在脑血管疾病的病人,因各种诱发因素引起脑内动脉狭窄,闭塞或破裂,而造成急性脑血液循环障碍,临床上表现为一过性或永久性脑功能障碍的症状和体征.脑卒中分为缺血性脑卒中和出血性脑卒中。根据统计中国每年发生脑卒中病人达200万,发病率高达120/10万。现幸存中风病人700万,其中450万病人不同程度丧失劳动力和生活不能自理。致残率高达75%。尽管该病与高血压、心脏病等主要危险因素有关,但其发病往往受季节气候变化及其它外界因素的影响。
  气象因素的变化对脑血管病发病的影响,国内外均有报道。多数研究指出,在冬季脑卒中的发病率有明显增加,发病率与温度有很大的关联,但也有研究指出,脑卒中发病率与季节没有明显的变化,这些日渐深入的研究结果不尽一致,主要是因为各地的地理气候特点差别较大以及社会因素、人种遗传等等方面的区别。为了更好的预防这种疾病,本文对2007-2010年某地区脑卒中发病率与该地区相应的思念气象因素指标进行分析,初步验证了气象因素与脑卒中发病率之间的关系。
  问题一分析
  根据附件1-4,本文以脑卒中发病人数,分别从发病时间、性别、年龄结构和职业进行数据整理分析,得到一些初步的结论,对脑卒中发病情况进行一些简单的分析与总结。
  通过数据的初始处理发现题目所给的数据中存在空缺,对于数据的统计问题,数据的空缺是不可忽视的地方,要综合考虑空缺数据的作用以及给数据统计造成的影响大小,乔珠峰、田凤占和黄厚宽[1]等人指出:如果缺失的数据占总数据量的比例较小,认为缺失数据对原始数据的处理影响较小,可以忽略不计,如果缺失数据在总数据量中所占比例较大可能对原始数据的处理造成很大的影响,不能直接忽略,需要通过填补来完善数据才能进行计算。
  对每个部分共计多少数据,缺失多少数据,删除多少数据以及剩余多少完整数据进行研究,通过对数据的进一步处理,得到男女患病比例的扇形图,将年龄结构处理后的数据转化成柱状图,据图分析患病人群所处的年龄段,根据这一结果结合脑卒中的患病原因分析不同年龄段患病的原因;对于按月份划分的数据,做出各年中每月患病人数与年份患病总人数比值的折线图,通过图示结果分析患病人数与月份之间的关系,从而反映气候的变化对脑卒中病发的影响情况,以及对此应做出的相关防御措施。
  对于职业这一类别的数据,通过统计缺失数据所占的比例比较大,如果要对数据进行填补将会耗费很大的人力物力,对此认为获取这类缺失数据造成的代价太大,此外由于职业之一类别的数据分析没能对解题带来较大的帮助,而且职业指标的概念比较模糊无法准确描述这类数据的处理对现实生活和相关研究有何积极作用,因此本文不再对这一类别的数据进行统计分析。
  问题二分析
  本文通过统计2007-2010年间的脑卒中月平均发病人数,对应选取4年间的8个气象因子:平均气压、最高气压、最低气压、平均温度、最高温度、最低温度、平均相对湿度以及最低相对湿度,试图建立月平均发病率与气象因子之间的数学模型。通过查询资料得知发病率等于月发病人数与发病总人数的比值,但是使用发病率建立的模型所反映的变量之间的变化趋势不明显(无量纲化处理后的原因),故本文建立发病人数与气象因素之间的模型,再用发病人数除以总人数即可得到发病率与气象因子之见的数学模型。
  首先建立基于Pearson简单相关分析的模型,分析脑卒中月均患病人数与气象指标的相关关系,然后本文利用逐步回归分析建立月发病率与多项气象因素之间的预测模型,通过t值检验,逐步剔除一些对因变量影响不大的指标,直到所有指标都通过t值检验才终止计算,得到最终脑卒中月发病数与气象因素的预报模型。最后本文认为气压与温度之间存在一定的相互关系,在逐步回归模型的基础上通过引入交叉项对模型进行改进,进一步提高模型的拟合度,完善模型。
  问题三分析
  通过查阅资料得到脑卒中高危人群的重要特征和关键指标,结合问题一和问题二得到的结论,分别对高危人群提出预警和干预的建议方案。对预警方案从生活、医疗和就医三个方面提出建议;对干预方案从脑卒中高危人群和非高危人群两方面提出建议。

模型的建立与求解整体论文缩略图

在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

import pandas as pd
from pyecharts.charts import Page  #页面
from pyecharts.charts import Bar  #柱状图
from pyecharts.charts import Pie  #饼状图
from pyecharts.charts import Line #折线图
from pyecharts.charts import Scatter #散点图
from pyecharts import options as opts

# 定义日期转换函数
def convert_date(date_str):
    try:
        return pd.to_datetime(date_str, errors='coerce').strftime('%Y-%m-%d')
    except:
        return ''


def analyze():
    df1 = pd.read_excel('Appendix-C1/data1.xls', index_col=0)
    df1 = df1.reset_index()
    df2 = pd.read_excel('Appendix-C1/data2.xls', index_col=0)
    df2 = df2.reset_index()
    df3 = pd.read_excel('Appendix-C1/data3.xls', index_col=0)
    df3 = df3.reset_index()
    df4 = pd.read_excel('Appendix-C1/data4.xls', index_col=0)
    df4 = df4.reset_index()

    df = df1.append(df2, ignore_index=True)
    df = df.append(df3, ignore_index=True)
    df = df.append(df4, ignore_index=True)

    print("去除脏数据前总数据量:" + str(df.shape[0]))

    target_column = "Sex"
    df_cleanNullSex = df.dropna(subset=[target_column])
    print("去除Sex数据为空的数据量:" + str(df_cleanNullSex.shape[0]))
    df_Sex = df_cleanNullSex[df_cleanNullSex[target_column].isin([1.0, 2.0])]  # 筛选值为 1 或 2 的行
    print("去除Sex脏数据的数据量:" + str(df_Sex.shape[0]))

    target_column = "Age"  # 将列转换为数值类型,非数字值会被置为 NaN
    df_cleanNullSex = df_Sex
    df_cleanNullSex[target_column] = pd.to_numeric(df_cleanNullSex[target_column], errors='coerce')
    # 筛选值在 0 到 110 范围内的行,并删除空值和乱码
    df_cleanSex = df_cleanNullSex.dropna(subset=[target_column])  # 删除空值
    df_cleanSex = df_cleanSex[
        (df_cleanSex[target_column] >= 0) & (df_cleanSex[target_column] <= 110)]  # 筛选值在 0 到 110 范围内的行
    print("去除Age数据为空的数据量:" + str(df_cleanSex.shape[0]))

    df = df_cleanSex
    # 将Occupation列的空值替换为 9
    target_column = "Occupation"  # 替换为目标列的名称
    df[target_column] = df[target_column].fillna(9)

    # 将日期转换为日期时间类型并统一格式Report time
    df['Time of incidence'] = df['Time of incidence'].apply(convert_date)
    df['Report time'] = df['Report time'].apply(convert_date)

    # 将日期列转换为 datetime 类型
    df['Time of incidence'] = pd.to_datetime(df['Time of incidence'], format='%Y-%m-%d')
    # 筛选出2007-2010年之前的数据
    df = df[(df['Time of incidence'].dt.year > 2006) & (df['Time of incidence'].dt.year < 2011)].copy()
    df = df[df['Time of incidence'].dt.month < 13].copy()
    df = df[df['Time of incidence'].dt.month > 0].copy()
    df = df[df['Time of incidence'].dt.day < 32].copy()
    df_filtered = df[df['Time of incidence'].dt.day > 0].copy()
    # 提取日期的年月日部分
    df_filtered['Time of incidence'] = df_filtered['Time of incidence'].dt.strftime('%Y-%m-%d')

    #print(df_filtered)
    df_filtered.to_excel('Appendix-C1/clean_data.xlsx', engine='openpyxl')
    #print(df_filtered.shape[0])



#性别-患病 饼状图
def viewSexPie(df):
    # 定义性别映射字典
    gender_mapping = {1: '男', 2: '女'}

    # 统计患病人数并添加到结果列表
    gender_counts = df['Sex'].map(gender_mapping).value_counts()
    # 获取类型和数量的列表
    gender = gender_counts.index.tolist()
    counts = gender_counts.values.tolist()
    # 打印最终结果
    print(gender)
    print(counts)

    # 可视化
    # 创建柱状图对象
    sum = 0
    for sl in counts:
        data = float(sl)
        sum += data
    print(sum)

    counts_list = []
    for sl in counts:
        data1 = float(sl) / sum
        reslut = round(data1*100,2)
        counts_list.append(reslut)
    # print(counts_list)

    c = Pie()  # 饼状图
    # 设置圆环的粗细和大小,同时将年份和数量作为标签添加到饼状图中
    c.add(
        "",
        [list(z) for z in zip(gender, counts_list)],
        label_opts=opts.LabelOpts(formatter="{b}: {c}")
    )

    # 设置标题和单位
    c.set_global_opts(
        title_opts=opts.TitleOpts(
            title="脑卒中患者按性别统计人数分布比例",
            pos_left="center",  # 标题居中
            pos_bottom="bottom"
        ),
        graphic_opts=[
            opts.GraphicText(
                graphic_item=opts.GraphicItem(
                    left="82%",
                    top="10%",
                    z=100
                ),
                graphic_textstyle_opts=opts.GraphicTextStyleOpts(
                    text="单位:%",  # 添加额外的文本
                    font="13px SimSun"
                ),
            )]
    )
    return c

#性别-患病-年份 柱状图
def viewSexYearZhu(df):

    # 定义性别映射字典
    gender_mapping = {1: '男', 2: '女'}
    df['Gender'] = df['Sex'].map(gender_mapping)

    # 提取年份
    df['Year'] = pd.to_datetime(df['Time of incidence'], format='%Y-%m-%d').dt.year
    # 按照年份统计人数
    year_counts = df['Year'].value_counts().sort_index()
    counts = year_counts.values.tolist()

    # 分组并统计每个年龄段的男性和女性患病人数
    year_gender_counts = df.groupby(['Year', 'Gender']).size().unstack()
    # 获取类型和数量的列表
    # 生成year数据
    year = year_counts.index.tolist()
    # 提取female_counts数据
    female_counts = year_gender_counts['女'].tolist()
    # 生成male_counts数据
    male_counts = year_gender_counts['男'].tolist()
    # 打印最终结果
    print(year)
    print(female_counts)
    print(male_counts)

    # 可视化
    # 创建柱状图对象
    c = (
        Bar()
        .add_xaxis(year)
        .add_yaxis("女性患病人数", female_counts)
        .add_yaxis("男性患病总人数", male_counts)
        .add_yaxis("患病总人数", counts)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="脑卒中患者按年份统计人数分布",
                                      pos_left="center",
                                      pos_bottom="bottom"
                                      ),
            xaxis_opts=opts.AxisOpts(name="年份/年"),
            yaxis_opts=opts.AxisOpts(name="患病人数/人")
        )
    )
    return c

#职业-患病 饼状图
def viewOccupationPie(df):
    # 定义职业代码和职业名称的映射字典
    occupation_mapping = {
        1: '农民',
        2: '工人',
        3: '退休人员',
        4: '教师',
        5: '渔民',
        6: '医务人员',
        7: '职工',
        8: '离退人员',
        9: '其他或缺失',
    }

    # 将职业代码映射为实际的职业名称
    df['Occupation'] = df['Occupation'].map(occupation_mapping)

    # 统计各个职业的人数
    occupation_counts = df['Occupation'].value_counts()

    #print(occupation_counts)
    # 获取类型和数量的列表
    occupation = occupation_counts.index.tolist()
    counts = occupation_counts.values.tolist()
    # 打印最终结果
    print(occupation)
    print(counts)

    # 可视化
    sum = 0
    for sl in counts:
        data = float(sl)
        sum += data
    # print(sum)

    counts_list = []
    for sl in counts:
        data1 = float(sl) / sum
        reslut = round(data1 * 100, 2)
        counts_list.append(reslut)
    # print(counts_list)

    c = Pie()  # 饼状图
    # 设置圆环的粗细和大小,同时将年份和数量作为标签添加到饼状图中
    c.add(
        "",
        [list(z) for z in zip(occupation, counts_list)],
        label_opts=opts.LabelOpts(formatter="{b}: {c}")
    )

    # 设置标题和单位
    c.set_global_opts(
        title_opts=opts.TitleOpts(
            title="脑卒中患者按职业统计人数分布比例",
            pos_left="center",  # 标题居中
            pos_bottom="bottom"
        ),
        graphic_opts=[
            opts.GraphicText(
                graphic_item=opts.GraphicItem(
                    left="82%",
                    top="10%",
                    z=100
                ),
                graphic_textstyle_opts=opts.GraphicTextStyleOpts(
                    text="单位:%",  # 添加额外的文本
                    font="13px SimSun"
                ),
            )]
    )

    # 可视化
    # 创建柱状图对象
    c1 = (
        Bar()
        .add_xaxis(occupation)
        .add_yaxis("患病人数", counts)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="脑卒中患者按职业统计人数分布",
                                      pos_left="center",
                                      pos_bottom="bottom"
                                      ),
            xaxis_opts=opts.AxisOpts(name="职业"),
            yaxis_opts=opts.AxisOpts(name="患病人数/人")
        )
    )
    return c1
    return c



#年龄-患病 柱状图
def viewAgeZhu(df):
    # 将年龄列转换为整数类型
    df['Age'] = df['Age'].astype(int)
    # 打印结果
    #print(df['Age'])

    # 定义年龄段区间
    age_bins = [1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]
    labels = [
        '1–10', '11–20', '21–30', '31–40', '41–50', '51–60',
        '61–70', '71–80', '81–90', '91–100', '101–110'
    ]

    # 将年龄数据分配到对应的年龄段
    df['Age Category'] = pd.cut(df['Age'], bins=age_bins, labels=labels)
    #print(df['Age Category'])

    # 统计每个年龄段的患病人数
    age_counts = df['Age Category'].value_counts().sort_index()
    #print(age_counts)


    # 获取类型和数量的列表
    age = age_counts.index.tolist()
    counts = age_counts.values.tolist()
    # 打印最终结果
    print(age)
    print(counts)

    # 可视化
    # 创建柱状图对象
    c = (
        Bar()
        .add_xaxis(age)
        .add_yaxis("患病人数", counts)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="脑卒中患者按年龄阶段统计人数分布",
                                      pos_left="center",
                                      pos_bottom="bottom"
                                      ),
            xaxis_opts=opts.AxisOpts(name="年龄阶段"),
            yaxis_opts=opts.AxisOpts(name="患病人数/人")
        )
    )
    return c

#年龄-性别-患病 折线图
def viewSexAgeLine(df):
    # 定义性别映射字典
    gender_mapping = {1: '男', 2: '女'}
    df['Gender'] = df['Sex'].map(gender_mapping)

    # 将年龄列转换为整数类型
    df['Age'] = df['Age'].astype(int)
    # 定义年龄段区间
    age_bins = [1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]
    labels = [
        '1–10', '11–20', '21–30', '31–40', '41–50', '51–60',
        '61–70', '71–80', '81–90', '91–100', '101–110'
    ]
    # 将年龄数据分配到对应的年龄段
    df['Age Category'] = pd.cut(df['Age'], bins=age_bins, labels=labels)
    # 统计每个年龄段的患病人数
    age_counts = df['Age Category'].value_counts().sort_index()


    # 分组并统计每个年龄段的男性和女性患病人数
    age_gender_counts = df.groupby(['Age Category', 'Gender']).size().unstack()
    # 获取类型和数量的列表
    # 生成age_category数据
    age_category = age_counts.index.tolist()
    # # 提取female_counts数据
    female_counts = age_gender_counts['女'].tolist()
    # # 生成male_counts数据
    male_counts = age_gender_counts['男'].tolist()
    # 打印最终结果
    print(age_category)
    print(female_counts)
    print(male_counts)

    # 可视化
    c = (
        Line()
        .add_xaxis(age_category)
        .add_yaxis("女性患病人数", female_counts)
        .add_yaxis("男性患病总人数", male_counts)
        .add_yaxis("患病总人数", age_counts)
        .set_global_opts(xaxis_opts=opts.AxisOpts(name="年龄阶段"),
                         yaxis_opts=opts.AxisOpts(name="患病人数/人"),
                         title_opts=opts.TitleOpts(
                             title='脑卒中患者按年龄阶段统计人数分布趋势',
                             pos_left="center",
                             pos_bottom="bottom"
                         ))
    )
    return c

#年份-患病 柱状图
def viewYearZhu(df):
    # 提取年份
    df['Year'] = pd.to_datetime(df['Time of incidence'], format='%Y-%m-%d').dt.year
    # 按照年份统计人数
    year_counts = df['Year'].value_counts().sort_index()
    # 打印结果
    print(year_counts)

    # 获取类型和数量的列表
    year= year_counts.index.tolist()
    counts = year_counts.values.tolist()
    # 打印最终结果
    print(year)
    print(counts)

    # 可视化
    # 创建柱状图对象
    c = (
        Bar()
        .add_xaxis(year)
        .add_yaxis("患病人数", counts)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="脑卒中患者按年份统计人数分布",
                                      pos_left="center",
                                      pos_bottom="bottom"
                                      ),
            xaxis_opts=opts.AxisOpts(name="年份/年"),
            yaxis_opts=opts.AxisOpts(name="患病人数/人")
        )
    )
    return c

#月份-患病 折线图
def viewMonthLine(df):
    # 提取月份
    df['Month'] = pd.to_datetime(df['Time of incidence'], format='%Y-%m-%d').dt.month
    # 按照月份统计人数
    month_counts = df['Month'].value_counts().sort_index()
    # 打印结果
    #print(month_counts)

    # 获取类型和数量的列表
    month = month_counts.index.tolist()
    string_month = [str(num) for num in month]
    counts = month_counts.values.tolist()
    # 打印最终结果
    print(string_month)
    print(counts)

    # 可视化
    c = (
        Line()
        .add_xaxis(string_month)
        .add_yaxis("患病人数", counts)
        .set_global_opts(xaxis_opts=opts.AxisOpts(name="月份/月"),
                         yaxis_opts=opts.AxisOpts(name="患病人数/人"),
                         title_opts=opts.TitleOpts(
                             title='脑卒中患者按月份统计人数分布趋势',
                             pos_left="center",
                             pos_bottom="bottom"
                         ))
    )
    return c


#月份-年份-患病 柱状图
def viewYearMonthZhu(df):
    # 提取月份
    df['Month'] = pd.to_datetime(df['Time of incidence'], format='%Y-%m-%d').dt.month
    # 按照月份统计人数
    month_counts = df['Month'].value_counts().sort_index()

    # 获取类型和数量的列表
    month = month_counts.index.tolist()
    string_month = [str(num) for num in month]
    counts = month_counts.values.tolist()
    # 打印最终结果
    print(string_month)
    print(counts)

    # 提取年份
    df['Year'] = pd.to_datetime(df['Time of incidence'], format='%Y-%m-%d').dt.year
    # 按照年份统计人数
    year_counts = df['Year'].value_counts().sort_index()
    print(year_counts)

    # 分组并统计每个月份中每一年一年的患者人数
    year_month_counts = df.groupby(['Month', 'Year']).size().unstack()
    # 获取类型和数量的列表
    monthCounts = month_counts.values.tolist()

    # 提取2007数据
    counts2007 = year_month_counts[2007].tolist()
    # 生成20008数据
    counts2008 = year_month_counts[2008].tolist()
    # 提取2009数据
    counts2009 = year_month_counts[2009].tolist()
    # 生成2010数据
    counts2010 = year_month_counts[2010].tolist()

    # 打印最终结果
    print(monthCounts)
    print(counts2007)
    print(counts2008)
    print(counts2009)
    print(counts2010)

    # 可视化
    # 创建柱状图对象
    c = (
        Bar()
        .add_xaxis(string_month)
        .add_yaxis("2007患病人数", counts2007)
        .add_yaxis("2008患病人数", counts2008)
        .add_yaxis("2009患病人数", counts2009)
        .add_yaxis("2010患病人数", counts2010)
        #.add_yaxis("患病总人数", monthCounts)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="脑卒中患者按月份中的年份统计人数分布",
                                      pos_left="center",
                                      pos_bottom="bottom"
                                      ),
            xaxis_opts=opts.AxisOpts(name="月份/月"),
            yaxis_opts=opts.AxisOpts(name="患病人数/人")
        )
    )
    return c

#月份-年份-患病 折线图
def viewYearMonthLine(df):
    # 提取月份
    df['Month'] = pd.to_datetime(df['Time of incidence'], format='%Y-%m-%d').dt.month
    # 按照月份统计人数
    month_counts = df['Month'].value_counts().sort_index()

    # 获取类型和数量的列表
    month = month_counts.index.tolist()
    string_month = [str(num) for num in month]
    counts = month_counts.values.tolist()
    # 打印最终结果
    print(string_month)
    print(counts)

    # 提取年份
    df['Year'] = pd.to_datetime(df['Time of incidence'], format='%Y-%m-%d').dt.year
    # 按照年份统计人数
    year_counts = df['Year'].value_counts().sort_index()
    print(year_counts)

    # 分组并统计每个月份中每一年一年的患者人数
    year_month_counts = df.groupby(['Month', 'Year']).size().unstack()
    # 获取类型和数量的列表
    monthCounts = month_counts.values.tolist()

    # 提取2007数据
    counts2007 = year_month_counts[2007].tolist()
    # 生成20008数据
    counts2008 = year_month_counts[2008].tolist()
    # 提取2009数据
    counts2009 = year_month_counts[2009].tolist()
    # 生成2010数据
    counts2010 = year_month_counts[2010].tolist()

    # 打印最终结果
    #print(monthCounts)
    print(counts2007)
    print(counts2008)
    print(counts2009)
    print(counts2010)

    # 可视化
    c = (
        Line()
        .add_xaxis(string_month)
        .add_yaxis("2007患病人数", counts2007)
        .add_yaxis("2008患病人数", counts2008)
        .add_yaxis("2009患病人数", counts2009)
        .add_yaxis("2010患病人数", counts2010)
        .set_global_opts(xaxis_opts=opts.AxisOpts(name="月份/月"),
                         yaxis_opts=opts.AxisOpts(name="患病人数/人"),
                         title_opts=opts.TitleOpts(
                             title='脑卒中患者按月份中的年份统计人数分布趋势',
                             pos_left="center",
                             pos_bottom="bottom"
                         ))
    )
    return c

def view():
    # 读取数据
    df = pd.read_excel("Appendix-C1/clean_data1.xlsx")

    # 创建页面,将柱状图和饼状图添加到同一页中
    page = Page(layout=Page.SimplePageLayout, page_title="脑卒中发病人群的统计描述")
    page.add(viewSexPie(df), viewSexYearZhu(df), viewOccupationPie(df) ,
             viewAgeZhu(df) ,viewYearZhu(df),viewSexAgeLine(df) ,
             viewMonthLine(df) , viewYearMonthZhu(df), viewYearMonthLine(df) )
    # 渲染生成 HTML 文件
    page.render("Graph.html")


# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    analyze()
    view()
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/895122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么开发一款app软件

我们公司想要做一个app软件&#xff0c;老板就让我多了解几家&#xff0c;我就总计一下相关的市场行业。 8月份我一共了解了6家的软件开发公司&#xff0c;也见识了什么叫软件开发公司&#xff0c;6套下来我也挑花了眼&#xff0c;老板也就更不用说了。老板只差让我做选择了…

Linux操作系统切换设置系统语言

随着工作环境中变化&#xff0c;我们在使用电脑时&#xff0c;可能要使用不同的系统语言环境&#xff0c;那计算机如何切换成我们需要的系统语言呢&#xff0c;针对Linux操作系统&#xff0c;这里有两种方法。一是通过桌面图形化界面切换&#xff0c;这种方法操作起来直观、但是…

R语言复杂抽样调查数据统计描述和分析

gtsummary包中tbl_svysummary提供了统计描述&#xff1b;tableone包中的svyCreateTableOne提供了统计比较&#xff1b;原始描述和比较可以是有table1包。 #测试数据 library(survey) setwd("F://") data(Titanic) sur_des<-survey::svydesign(~1, data as.data.…

mongoDB基础知识

文章目录 为什么使用mongoDB&#xff1f;数据模型 想了解什么mongoDB首先我们得先知道什么事“三高”&#xff1f;三高什么呐&#xff1f;具体的应用场景&#xff1f;在这些应用场景中&#xff0c;数据操作方面共同特点是&#xff1a; 什么时候选择mongoDB&#xff1f;mySQL和m…

React基础知识(一) - React初体验

React是在2013年&#xff0c; 由Faceboo开源的&#xff0c;用于构建用户界面的 JavaScript 库。总所周知啊,React是前端三大框架之一啊现在前端领域最为流行的是三大框架&#xff1a; ReactVueAngular 前端三大框架 React开发的特点&#xff1a; &#xff08;1&#xff09;声明…

编程考古-计算机发展(上)

计算机/器现在是我们日常生活中的重要工具&#xff0c;它的发展历程见证了人类数学计算能力的不断提升。 什么是计算 计算的本质在于基于规则对符号串进行变换。简言之&#xff0c;从一个初始的符号串&#xff08;输入&#xff09;出发&#xff0c;依据既定的法则逐步改变这个…

NewStarCTF2024-Week2-Misc-WP

目录 1、wireshark_checkin 2、wireshark_secret 3、字里行间的秘密 4、你也玩原神吗 5、Hertas Study 6、用溯流仪见证伏特台风 7、热心助人的小明 1、wireshark_checkin 直接字符串搜 flag flag{ez_traffic_analyze_isnt_it} 2、wireshark_secret 查看原始数据 导出十…

STM32应用详解(2)GPIO之LED闪烁——学习使用寄存器操作方法编写延时函数

文章目录 前言一、笔记1.GPIO控制LED闪烁的两种方法&#xff1a;2.系统时钟3.延时函数的实现(us) 二、代码1.main函数2.延时函数3.固件库函数4.毫秒和秒延时函数5.整体函数结构 前言 学习使用寄存器操作方法编写延时函数。 一、笔记 1.GPIO控制LED闪烁的两种方法&#xff1a;…

C语言小游戏--猜数字

游戏过程&#xff1a; 由电脑随机在某个范围内生成一个数字&#xff0c;玩家猜数字并且输入&#xff0c;电脑判断是否正确&#xff0c;正确则游戏结束&#xff0c;错误则给出提示&#xff0c;直到玩家所给的答案正确为止 思路分析&#xff1a; 1.生成随机数 2.玩家可以多次…

springboot037基于SpringBoot的墙绘产品展示交易平台的设计与实现(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;墙绘产品展示交易平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本墙绘产品展示…

Golang | Leetcode Golang题解之第479题最大回文数乘积

题目&#xff1a; 题解&#xff1a; func largestPalindrome(n int) int {if n 1 {return 9}upper : int(math.Pow10(n)) - 1for left : upper; ; left-- { // 枚举回文数的左半部分p : leftfor x : left; x > 0; x / 10 {p p*10 x%10 // 翻转左半部分到其自身末尾&…

CMOS 图像传感器:像素寻址与信号处理

CMOS image sensor : pixel addressing and signal processing CMOS image sensor 对于寻址和信号处理有三种架构 pixel serial readout and processingcolumn parallel readout and processingpixel parallel readout and processing 其中&#xff0c;column parallel reado…

香港举办AIHCIR 2024国际学术会议,领先人工智能、人机交互和机器人技术

第三届人工智能、人机交互和机器人国际学术会议 &#xff08;AIHCIR 2024&#xff09;将于2024年11月在中国香港举行&#xff0c;聚焦AI、人机交互与机器人领域&#xff0c;邀请知名学者演讲&#xff0c;促进学术交流。论文经评审后提交EI检索&#xff0c;投稿需全英文&#xf…

《宗喀大慈宏觉寺——唐蕃古道上的千年古刹》新书发布会在京举行

10月18日&#xff0c;《宗喀大慈宏觉寺——唐蕃古道上的千年古刹》新书发布会在中国藏学研究中心举行 发布会现场 2024年10月18日上午&#xff0c;由中国藏学研究中心科研业务办公室主办、中国藏学出版社承办的《宗喀大慈宏觉寺——唐蕃古道上的千年古刹》新书发布会在中国藏学…

【算法】哈希表:49.字母异位词分组

目录 1、题目链接 2、题目介绍 3、解法 初始化设定--图解 步骤图解 4、代码 1、题目链接 49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 3、解法 字母异位词的本质是字符相同但排列不同。因此&#xff0c;我们可以对字符串进行排序&#xf…

Lucas带你手撕机器学习——线性回归

什么是线性回归 线性回归是机器学习中的基础算法之一&#xff0c;用于预测一个连续的输出值。它假设输入特征与输出值之间的关系是线性关系&#xff0c;即目标变量是输入变量的线性组合。我们可以从代码实现的角度来学习线性回归&#xff0c;包括如何使用 Python 进行简单的线…

Thread的基本用法

创建线程 方法一 继承Thread类 继承 Thread 来创建一个线程类. class MyThread extends Thread {Overridepublic void run() {System.out.println("这里是线程运行的代码");} } 创建 MyThread 类的实例 MyThread t new MyThread(); 调用 start 方法启动线程 t…

《深空彼岸》TXT完整版下载,知轩藏书校对版!

【内容简介】&#xff1a;   浩瀚的宇宙中&#xff0c;一片星系的生灭&#xff0c;也不过是刹那的斑驳流光。仰望星空&#xff0c;总有种结局已注定的伤感&#xff0c;千百年后你我在哪里&#xff1f;家国&#xff0c;文明火光&#xff0c;地球&#xff0c;都不过是深空中的一…

2024 年 9 月区块链游戏研报:行业回暖,Telegram 游戏引发热潮

作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;Footprint Analytics Games Research Page 9 月份&#xff0c;区块链游戏代币的市场总值增长了 29.2%&#xff0c;达到 232 亿美元&#xff0c;日活跃用户&#xff08;DAU&#xff09;数量上升了 1…

C++进阶:AVL树实现

目录 一.AVL的概念 二.AVL的实现 2.1AVL树的结构 2.2AVL树的插入 2.2.1AVL树插入一个值的大概过程 2.2.2平衡因子更新 2.2.3插入节点及更新平衡因子的实现 2.3旋转 2.3.1旋转的原则 2.3.2右单旋 2.3.3右单旋的代码实现 2.3.4左单旋 2.3.5左单旋的代码实现 2.3.6…