自学内容网 自学内容网

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名片即可

原文地址:https://blog.csdn.net/weixin_43292788/article/details/142909393

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!