A题 影响城市居民身体健康的因素分析
以心脑血管疾病、糖尿病、恶性肿瘤以及慢性阻塞性肺病为代表的慢性非传染性疾病(以下简称慢性病)已经成为影响我国居民身体健康的重要问题。随着人们生活方式的改变,慢性病的患病率持续攀升。众所周知,健康状况与年龄、饮食习惯、身体活动情况、职业等都有密切的关系。如何通过合理地安排膳食、适量的身体运动、践行健康的生活方式,从而达到促进身体健康的目的,这是全社会普遍关注的问题。附件A1是某市卫生健康研究部门对部分居民所做的“慢性非传染性疾病及其相关影响因素流行病学”调查问卷表,附件A2是相应的调查数据结果,附件A3是中国营养学会最新修订的《中国居民膳食指南》中为平衡居民膳食提出的八条准则。
请你们团队研究解决下面问题:
问题1 参考附件A3,分析附件A2中居民的饮食习惯的合理性,并说明存在的主要问题。
问题2 分析居民的生活习惯和饮食习惯是否与年龄、性别、婚姻状况、文化程度、职业等因素相关。
问题3 根据附件A2中的数据,深入分析常见慢性病(如高血压、糖尿病等)与吸烟、饮酒、饮食习惯、生活习惯、工作性质、运动等因素的关系以及相关程度。
问题4 依据附件A2中居民的具体情况,对居民进行合理分类,并针对各类人群提出有利于身体健康的膳食、运动等方面的合理建议。
摘要
本文主要研究了附件A2中居民的饮食习惯和生活习惯与常见慢性病的相关性,同时也探讨了居民的年龄、性别、婚姻状况、文化程度和职业等因素与其生活习惯和饮食习惯的关系。基于这些分析,我们构建了一个适应居民健康管理的分类模型,并根据模型结果,为不同类别的居民提出了有利于身体健康的饮食和运动建议。
在问题一中,我们分析了居民的饮食习惯的合理性,并指出了存在的主要问题。通过统计分析,我们发现居民的饮食习惯存在一定的不合理性,例如高盐饮食、高脂肪饮食等问题。
在问题二中,我们研究了居民的生活习惯和饮食习惯与其个人特征的关联性。结果显示,年龄、性别、婚姻状况、文化程度和职业等因素均对居民的生活习惯和饮食习惯有一定影响。
在问题三中,我们进一步探讨了常见慢性病与吸烟、饮酒、饮食习惯、生活习惯、工作性质、运动等因素的关系。通过逻辑回归模型,我们发现了各因素对常见慢性病的影响程度,为健康风险预测提供了重要依据。
在问题四中,我们构建了一个适用于居民健康管理的分类模型,对居民进行了合理的分类,并为每个类别的居民提出了有利于身体健康的饮食和运动建议。通过K-Means聚类算法,我们将居民分为健康、一般和较差三类,并根据每一类居民的特点给出了具体的健康管理建议。
关键词:饮食习惯,生活习惯,常见慢性病,健康管理,分类模型,健康建议。
在当前社会中,以心脑血管疾病、糖尿病、恶性肿瘤及慢性阻塞性肺病等为代表的慢性非传染性疾病(简称慢性病)已经变成了影响我国居民健康的重要问题。由于生活方式的改变,这类疾病的患病率也在持续增加。我们普遍认为,健康状况受到年龄、饮食习惯、身体活动水平、职业等多方面的影响。如何通过合理地安排饮食、进行适量的运动、和实行健康的生活方式,以促进居民的身体健康,成为了全社会普遍关注的问题。
此外,我们还收到了一些附件:附件A1是一份由某市卫生健康研究部门针对部分居民进行的“慢性非传染性疾病及其相关影响因素流行病学”调查问卷;附件A2是该调查的数据结果;附件A3是中国营养学会最新修订的《中国居民膳食指南》,其中提出了八条用于平衡居民饮食的准则。
根据这个背景,我们需要进行数学建模,分析影响慢性病患病率的多种因素,并探索通过合理膳食、适量运动和健康生活方式等措施对改善健康状况的潜在影响。
问题1 根据中国营养学会的《中国居民膳食指南》(附件A3),我们需要对附件A2中的居民饮食习惯进行详尽的分析。这需要涉及到的问题包括但不限于:居民的膳食是否达到了营养均衡?是否有过度的食物类型?蔬菜、水果、谷物、肉类等食物摄入是否符合指南建议?通过这种方式,我们可以指出目前居民饮食习惯存在的主要问题。
问题2 我们需要理解居民的生活习惯和饮食习惯与他们的年龄、性别、婚姻状况、教育水平、职业等社会人口学因素是否存在关联。例如,年轻人和老年人的饮食习惯是否存在明显的区别?受教育程度是否影响了人们的生活习惯?这些因素如何影响了人们的健康?
问题3 根据附件A2中的数据,我们需要更深入地理解和分析常见慢性病(如高血压、糖尿病等)与吸烟、饮酒、饮食习惯、生活习惯、工作性质、运动等生活方式因素之间的关联。我们需要找出哪些行为或习惯与慢性病的发病率有较强的相关性。
问题4 我们需要根据附件A2中居民的具体情况进行分类。然后,我们需要为每个类别的人群提供适合他们的饮食和运动建议,这些建议应能有助于改善他们的健康状况,预防慢性疾病的发生。
针对本文题目,提出以下假设建模思路:
• 独立性假设:我们假设数据中的每一个观测(每一个受访者)都是独立的,也就是说,一个人的饮食习惯、生活方式、社会人口学特征和慢性病发病情况与其他人是独立的。
• 线性假设:在分析各因素与慢性病发病率之间的关系时,我们假设这些关系在一定范围内可以被视为线性的,也就是说,这些因素的增加或减少将导致慢性病发病率的线性增加或减少。
• 稳定性假设:我们假设在数据收集期间,受访者的生活习惯和健康状况是相对稳定的,没有发生重大的变化。
• 完整性假设:我们假设调查数据(附件A2)是完整的,即所有重要的影响慢性病发病率的因素都被收集了,且所有受访者都真实、完整地回答了所有问题。
符号 |
说明 |
foods_day |
居民每天食用各类食物的频率总和 |
foods_week |
居民每周食用各类食物的频率总和 |
foods_month |
居民每月食用各类食物的频率总和 |
BMI |
身体质量指数,体重(kg)除以身高(m)的平方 |
sport |
锻炼量,体育锻炼的强度乘以平均每天体育锻炼时间 |
total_vagetable_day |
每天食用蔬菜的总量 |
total_fruit_day |
每天食用水果的总量 |
total_muilk_day |
每天食用奶类的总量 |
total_mut_day |
每天食用鱼、禽、蛋、瘦肉的总量 |
total_oil_day |
每天食用油类的总量 |
total_yan_day |
每天食用盐的总量 |
total_jiu_day |
每天饮用酒的总量 |
smoke |
平均每周吸烟天数乘以一天吸烟支数 |
ill |
疾病指数,包括高血压、冠心病、脑血管疾病、糖尿病、慢性呼吸系统疾病、恶性肿瘤等 |
4.1 问题一分析
饮食习惯的合理性分析:对于此问题,首先需要理解并解析附件A3中的《中国居民膳食指南》。我们需要确定指南中提出的具体饮食建议和要求,例如每日需要摄入的各类营养素比例、食物种类和份量等。然后,我们将使用这些信息,对照附件A2中的调查数据,评估居民的饮食习惯是否达到了指南的要求,以及哪些方面存在偏差。
4.2 问题二分析
生活习惯与社会人口学因素的关联性分析:这个问题的分析涉及到多变量关联分析,如逻辑回归、协方差分析或者皮尔森相关性分析等。我们需要分析附件A2中的数据,查看生活习惯(如饮食习惯、运动习惯等)和社会人口学因素(如年龄、性别、婚姻状况、教育水平、职业等)之间是否存在显著的关联。
4.3 问题三分析
慢性病与生活方式因素的关联性分析:这一问题的分析依旧需要使用相关性分析,或者可能需要使用更复杂的统计学方法,如多元逻辑回归,来探究多个因素与慢性病发病率之间的关系。此过程中,我们会考虑吸烟、饮酒、饮食习惯、生活习惯、工作性质、运动等因素,并尝试找出它们与慢性病(如高血压、糖尿病等)发病率的关联性和相关程度。
4.4 问题四分析
居民分类和健康建议:首先,我们需要依据附件A2中居民的特征,如年龄、性别、生活习惯、职业等进行居民分类。这可能需要使用一些机器学习的无监督学习算法,如K-means聚类。然后,根据不同类别的居民的特点和风险,结合膳食指南和疾病预防原则,制定出有利于身体健康的膳食、运动等方面的合理建议。
在处理以下问题的之前,需要先对题目中提供的数据进行处理,正常的数据是保障模型效果的重要因素,可以发现数据中存在重复值和控制,因此本文先对这些数据进行处理,对异常值和重复值利用pandas的drop_duplicates函数进行删除,接着对空值进行填充处理。
(1)构建评价指标:根据附件A2中的居民数据,首先定义了多个评价指标,其中包括食物多样性与合理搭配、吃动平衡、多吃蔬果、奶类、全谷、大豆、适量吃鱼、禽、蛋、瘦肉、少盐少油、控糖限酒等方面的指标。
(2)单位转换:在构建评价指标时,对数据进行了单位转换,确保指标具有相同的量纲。
(3)数据处理:对每个指标按天、周、月进行了汇总计算,得到对应的数据。
这个模型的指标建立包含以下几个主要步骤:
食物种类的计算:
每日食物种类 = Σ食物的每日食用次数
每周食物种类 = Σ食物的每周食用次数
每月食物种类 = Σ食物的每月食用次数
BMI的计算:
BMI = 体重(kg) / (身高(m))^2
运动强度的计算:
每日运动强度 = 体育锻炼的强度 * 平均每天体育锻炼时间
食品摄入量的计算:**
每日蔬菜摄入量 = 食用新鲜蔬菜的频率/天 * 平均每次食用量 * 折算系数
每日水果摄入量 = 食用水果的频率/天 * 平均每次食用量 * 折算系数
每日奶类摄入量 = (食用鲜奶的频率/天 + 食用奶粉的频率/天 + 食用酸奶的频率/天) * 平均每次食用量 * 折算系数
4. **适量吃鱼、禽、蛋、瘦肉**:通过计算每天鱼、禽、蛋和瘦肉的总摄入量,这些食物都是优质蛋白质的重要来源。
每日肉类摄入量 = (食用禽肉的频率/天 + 食用水产的频率/天 + 食用蛋类的频率/天 + 食用牛羊肉的频率/天 + 食用猪肉的频率/天) * 平均每次食用量 * 折算系数
5. **少盐少油,控糖限酒**:计算每天的油、盐和酒的总摄入量。过量的油和盐摄入可能增加心血管疾病的风险,而过量的酒精摄入也对健康有害。
摄入盐油量的计算:
每日油摄入量 = (植物油摄入量 + 动物油摄入量) * 折算系数
每日盐摄入量 = 盐摄入量 * 折算系数
每日酒精摄入量 = Σ(饮用频率 * 每次饮用量) * 折算系数
以上所有的数据都被整合到一个pandas DataFrame中,每个指标作为一个列,行是每个人的数据。每个指标都可以单独分析,也可以与其他指标一起分析,以得到更全面的健康饮食评估。
这个模型的主要目标是对每个人的饮食习惯进行全面的量化评估,并找出可能的问题,例如摄入的食物种类是否足够多样,是否有足够的运动,是否摄入了足够的蔬果和奶类,是否过量摄入油、盐和酒等。这样,我们可以对每个人的饮食习惯给出具体的改进建议。
可以看到大部分的量化指标的指标值较小,可以看到在水果,牛奶,以及身体健康指标方面,所采样的居民的指标差距差距不大,差距较大的量化指标有运动量、蔬菜摄入数量、酒的摄入量以及每日的食用油油摄入量存在差异较大。
(5)绘制散点图:对每个指标绘制了散点图,并在图中添加了标准线,以帮助比较不同指标的取值情况。标准线可能代表一些阈值或标准,用于判断数据是否合理。
在上图中,散点图中的散点代表每个采样的城市居民指标值,红色横线,代表《中国居民膳食指南》所建议的一些指标阈值,通过可视化可以得到如下结论:
1.大部分人摄入食物种类数量/天(摄入食物种类数量/月)都偏少,达不到指标阈值数量;
2.整体的居民BMI指数偏高,BMI是用来衡量一个人是否处于健康的体重范围,偏高的BMI指标值代表的采样人群体重偏重,存在或多或少的肥胖问题,相应的健康风险也会增加,如糖尿病、心脏病、高血压、某些类型的癌症等。
3.采样人群在运动方面是远远超过最低阈值的,代表该人群的运动能力较高,有较高的防范风险意识。
4.在蔬菜、牛奶、水果的摄入量方面,采样人群的摄入量都是偏少的,而肉类、油盐等指标的摄入是比较高的,分心该采样人群可能平时的饮食口味方面比较重,应该注重健康饮食情况,减轻口味。
5.在烟、酒的摄入量方面,采样人群普遍超标,尤其是摄入酒量严重超标,过量饮酒和吸烟可引发多种健康问题,如心血管疾病、肝脏疾病、癌症和呼吸系统疾病,还可能导致精神健康问题。健康的生活方式应限制饮酒和避免吸烟。
年龄 = 2013 - 出生年
2. 数据整合:我们将预处理后的人口统计学数据和问题一中计算得到的饮食习惯评价指标数据合并,形成了一个新的数据集。这个新的数据集包含了年龄、性别、民族、文化程度、婚姻状况、职业等人口统计学特征,以及各种饮食习惯评价指标。
3. 定义特征和目标变量:我们确定了特征(特征变量)和目标变量。其中,特征包括年龄、性别、民族、文化程度、婚姻状况、职业等人口统计学特征,目标变量则是我们在问题一中计算出来的饮食习惯评价指标。
4. 计算相关性:在定义了特征和目标变量后,我们计算了它们之间的相关性。具体来说,对于每一个人口统计学特征以及饮食习惯指标,我们都计算了它们之间的皮尔森相关系数。这个系数可以量化两个变量之间的线性关系,其值范围在-1(完全负相关)到1(完全正相关)之间。系数接近0则表示两个变量之间没有明显的线性关系。
皮尔逊相关系数的计算公式为:
r(X,Y) = Cov(X,Y) / (σx * σy)
变量 |
食品日摄入量 |
食品周摄入量 |
食品月摄入量 |
BMI |
运动 |
蔬菜日摄入量 |
水果日摄入量 |
奶类日摄入量 |
肉类日摄入量 |
油类日摄入量 |
盐类日摄入量 |
酒类日摄入量 |
出生年 |
-0.037 |
0.124 |
0.054 |
-0.109 |
-0.173 |
0.020 |
0.109 |
0.039 |
0.056 |
-0.027 |
-0.020 |
0.046 |
性别 |
0.057 |
-0.070 |
-0.009 |
-0.075 |
-0.016 |
0.017 |
0.042 |
0.074 |
-0.097 |
-0.005 |
0.012 |
-0.274 |
民族 |
-0.002 |
0.016 |
-0.006 |
-0.001 |
-0.012 |
-0.014 |
0.004 |
0.030 |
-0.006 |
-0.007 |
-0.009 |
-0.012 |
文化程度 |
0.032 |
0.171 |
-0.000 |
-0.044 |
0.068 |
0.091 |
0.062 |
0.061 |
0.094 |
-0.157 |
-0.080 |
0.056 |
婚姻状况 |
-0.000 |
-0.043 |
-0.014 |
0.063 |
0.030 |
0.005 |
-0.027 |
0.004 |
-0.020 |
0.000 |
0.003 |
-0.013 |
职业 |
0.058 |
-0.016 |
-0.046 |
-0.005 |
0.074 |
-0.003 |
-0.004 |
0.020 |
-0.004 |
0.047 |
-0.005 |
-0.104 |
最终得到的结果如下:
根据以上的相关性分析,得到以下结论:
(1)年龄(出生年): 年龄与运动的相关性较强,呈现负相关,表明年龄越大,参与运动的可能性越小。年龄与BMI也存在负相关性,可能是由于随着年龄的增长,身体状况和新陈代谢减弱。
(2)性别:性别与酒类日摄入量的相关性最强,呈现负相关,可能代表在此数据集中,男性的酒类日摄入量比女性的更高。
(3)民族:民族与各变量的相关性都较弱,表示民族因素对这些生活习惯和饮食习惯的影响较小。
(4)文化程度:文化程度与食品周摄入量、蔬菜日摄入量、肉类日摄入量和油类日摄入量相关性较高,表明文化程度可能对这些因素有较大影响。
(5)婚姻状况:婚姻状况与各变量的相关性都较弱,表示婚姻状况对这些生活习惯和饮食习惯的影响较小。
(6)职业:职业与运动的相关性最强,呈现正相关,可能表明某些职业类型更倾向于进行运动。
5.可视化数据集中所有列的相关性矩阵,以热力图的方式展现:
1. 定义预测特征X和目标变量Y:X为除了六种疾病外的所有特征,Y则是要预测的疾病,包括高血压,冠心病等六种。
2. 进行模型训练和预测:
2.1. 使用train_test_split函数将数据集分割为训练集和测试集,其中训练集用于训练模型,测试集用于评估模型的性能。
2.2. 使用LogisticRegression类创建逻辑回归模型,并使用fit方法训练模型。
逻辑回归模型的数学公式通常表示为:
P(Y=1|X) = 1 / (1 + e^(-(b0 + b1X1 + b2X2 + ... + bn*Xn)))
其中,P(Y=1|X)是给定特征X时,Y等于1(也就是分类为正类)的概率;b0、b1、…、bn是模型参数,通过训练数据来学习;e是自然对数的底数。
2.3. 使用训练好的模型对测试集进行预测。
3. 模型评估:
3.1. 使用accuracy_score函数计算模型的准确率,即预测正确的样本数占总样本数的比例。
3.2. 使用confusion_matrix函数生成混淆矩阵,以了解模型在各个类别上的预测性能。
3.3. 使用classification_report函数生成分类报告,展示模型在各个类别上的精确率,召回率和F1分数。
准确率的计算公式为:
(TP+TN)/(TP+TN+FP+FN),
其中,TP是真正类(模型预测为正,实际也为正),TN是真负类(模型预测为负,实际也为负),FP是假正类(模型预测为正,实际为负),FN是假负类(模型预测为负,实际为正)。
得到的结果如下:
Disease |
Accuracy |
高血压 |
0.6339 |
冠心病 |
0.9114 |
脑血管疾病(如脑出血、网膜下腔出血、脑血栓形成、脑栓塞等) |
0.9216 |
糖尿病 |
0.8763 |
慢性呼吸系统疾病(如慢支、肺气肿、哮喘) |
0.9120 |
恶性肿瘤 |
0.9362 |
以下是对这些结果的分析:
(1)高血压的模型准确率较低(约63.39%),这可能是由于该疾病的特征与其他疾病有很大的交叉,或者我们的数据集中没有足够的信息来准确地预测高血压。
(2)对于冠心病、脑血管疾病、慢性呼吸系统疾病和恶性肿瘤,模型的准确率都较高,分别为91.14%、92.16%、91.20%和93.62%。这可能表明我们的数据集中包含了这些疾病的关键特征,或者这些疾病在我们的数据集中的分布比较独特,较容易被模型识别。
(3)对于糖尿病,模型的准确率为87.63%,虽然低于冠心病、脑血管疾病和恶性肿瘤的准确率,但相对于高血压的准确率来说,仍然相对较高。
数据准备与预处理:
(1)首先,本文汇总了所有的疾病信息并添加到一个新的列"ill"中,这将为我们的模型提供一个疾病的综合指标。这个新的特征"ill"能帮助我们了解每个人有多少种疾病。
然后,为了确保每个特征在模型中的影响是平等的,我们需要对数据进行标准化。数据标准化能够使所有的特征都具有相同的尺度。
计算公式为:
z = (x - μ) / σ
(2)选择聚类数k:
在这个案例中,我们选择的聚类数k为3,也就是说我们要将所有居民分为3类。
(3)K-Means聚类算法:
在这个步骤中,我们使用了K-Means聚类算法。首先,算法随机选择3个点作为初始的聚类中心。然后,它计算每个数据点到这3个聚类中心的距离,并将每个数据点分配给最近的聚类中心。接着,它更新每个聚类的中心,使其成为该聚类中所有数据点的均值。以上过程会重复进行,直到聚类中心不再改变,或者达到预定的最大迭代次数。
聚类算法为:
d(p, q) = √[(q1-p1)² + (q2-p2)² + ... + (qn-pn)²]
(4)绘制结果:
我们通过图形显示了聚类的结果,每个类别都用一个圆圈表示。
(5)针对各类人群的健康建议:
健康人群:这类人群基本没有慢性疾病,他们应保持良好的饮食和锻炼习惯,防止慢性疾病的发生。他们可以尝试各种类型的运动,如游泳、跑步、瑜伽等。同时,他们也需要保持均衡的饮食,多吃蔬菜水果,少吃油腻和高糖食物。
一般人群:这类人群可能存在一些慢性疾病,他们需要更加注意自己的生活方式。对于饮食,他们需要按照医生或营养师的建议进行调整,可能需要限制某些食物的摄入。对于运动,他们需要找到适合自己疾病状况的运动方式,可能需要避免某些剧烈的运动。
较差人群:这类人群可能有多种慢性疾病,他们需要严格地按照医生的建议进行生活方式的调整。他们的饮食可能需要严格的控制,可能需要避免某些可能加重疾病的食物。对于运动,他们可能只能进行某些轻度的运动,如散步、做瑜伽等。此外,他们还需要定期地看医生,及时地对疾病进行治疗。
(1)建立疾病预测模型:通过利用逻辑回归,我们可以对居民的六种疾病进行预测。模型考虑了各种因素,如体重、年龄、吸烟等,并为每个因素赋予权重,从而得出疾病发生的概率。这样的模型能够在一定程度上预测居民的健康状况。
(2)划分人群群体:通过使用K-Means聚类,我们将居民按照他们的健康状况和生活习惯进行分类。这种分类方式可以帮助我们了解不同群体的健康状况,从而为他们提供针对性的膳食和运动建议。
(3)实用性和操作性强:该模型基于实际的生活习惯和健康状况数据,因此其预测和分类结果具有很高的实用价值。同时,模型采用的是逻辑回归和K-Means聚类这两种比较容易理解和操作的算法,有利于实际应用。
(1)数据依赖性:模型的效果大程度上取决于输入数据的质量和量,如果数据不完整或有误,可能导致模型的预测效果下降。
(2)逻辑回归的局限性:逻辑回归虽然能够处理二分类问题,但是对于本题中的六种疾病预测,其实是多分类问题,如果简单地将其视为二分类处理可能会忽略一些信息。
(3)K-Means的局限性:K-Means需要预先设定聚类数量,但实际上我们并不清楚有多少种健康状况的人群,这就需要我们手动选择一个合适的聚类数量。另外,K-Means对离群值敏感,可能会影响最后的分类效果。
(4)建议的个性化:模型可以根据不同群体的健康状况和生活习惯提出一般的膳食和运动建议,但对于个体的具体情况,可能需要更加个性化的建议,而这一点该模型无法做到。
改进:
1. 数据质量与量的提升:增强数据的质量和量是提高模型预测效果的关键。例如,可以增加更多的健康因素考虑,如基因特点、睡眠质量、精神压力等。同时,通过增加样本量也能提升模型的泛化能力。
2. 模型升级:针对多分类问题,可以使用更适合的算法替代逻辑回归,例如支持向量机(SVM)、决策树或随机森林等。另外,也可以尝试使用深度学习等更复杂的模型,例如神经网络模型,以获取更准确的预测。
3. 选择更合适的聚类算法:对于聚类问题,K-Means并不总是最好的选择,可以尝试使用其他聚类算法,如层次聚类、DBSCAN等,这些方法不需要预先设定聚类数量,并且对离群值的影响较小。
4. 提高建议的个性化:在给出建议时,除了考虑到群体特性外,还可以进一步提高建议的个性化。例如,可以使用机器学习模型预测个体对特定运动或食物的反应,从而给出更个性化的建议。
推广:
1. 应用领域的扩大:这种健康预测和人群分类模型不仅可以应用于居民健康管理,也可以推广到其他相关领域,如疾病预防、医疗保险定价等。
2. 平台的构建:可以将这种模型构建为一个在线平台或应用程序,用户可以输入自己的生活习惯和健康状况,系统就能预测他们的健康风险,并给出改善健康的建议。
3. 多元化推广:结合现代的移动健康设备,如智能手环、健康监测仪等,可以实时收集用户的健康数据,通过模型进行分析和预测,从而实时监测健康状况,并给出及时的建议。
4. 合作推广:可以和医疗机构、健康咨询机构等进行合作,利用这种模型提供更精准的个性化医疗和健康管理服务。
import pandas as pd
data = pd.read_excel(r'C:\Users\shinelon\Desktop\深圳A\data.xlsx')
# 处理重复值合控制
data.drop_duplicates(inplace=True)
data.fillna(0,inplace=True)
print(data.head())
# 构建评价指标(注意单位转换)
# 一、食物多样,合理搭配
food_list_day = ['食用大米次数/天', '食用小麦面粉的频率/天', '食用杂粮的频率/天','食用薯类的频率/天','食用油炸面食的频率/天','食用猪肉的频率/天',
'食用牛羊肉的频率/天','食用禽肉的频率/天','食用内脏的频率/天','食用水产的频率/天','食用鲜奶的频率/天','食用奶粉的频率/天','食用蛋类的频率/天',
'食用豆腐的频率/天','食用豆腐丝等的频率/天','食用豆浆的频率/天', '食用干豆的频率/天' ,'食用新鲜蔬菜的频率/天', '食用海草的频率/天',
'食用咸菜的频率/天','食用泡菜的频率/天','食用酸菜的频率/天','食用糕点的频率/天','食用水果的频率/天','食用果汁饮料的频率/天','食用其他饮料的频率/天',
]
foods_day = [0]*len(data.index)
foods_week = [0]*len(data.index)
foods_month = [0]*len(data.index)
for i in food_list_day:
foods_day = foods_day + data[i]
foods_week = foods_week + data[i.replace('天','周')]
foods_month = foods_month + data[i.replace('天','月')]
# 二、吃动平衡,健康体重
BMI = data['体重']/((data['身高']/100)**2)
sport = data['体育锻炼的强度']*data['平均每天体育锻炼时间']
# 三、多吃蔬果、奶类、全谷、大豆
total_vagetable_day = data['食用新鲜蔬菜的频率/天']*data['平均每次食用量.18']*50
total_fruit_day = data['食用水果的频率/天']*data['平均每次食用量.24']*50
total_muilk_day = (data['食用鲜奶的频率/天']*data['平均每次食用量.10']+data['食用奶粉的频率/天']*data['平均每次食用量.11']+data['食用酸奶的频率/天']*data['平均每次食用量.12'])*50
# 四、适量吃鱼、禽、蛋、瘦肉
total_mut_day = (data['食用禽肉的频率/天']*data['平均每次食用量.7']+data['食用水产的频率/天']*data['平均每次食用量.9']+
data['食用蛋类的频率/天']*data['平均每次食用量.13']+data['食用牛羊肉的频率/天']*data['平均每次食用量.6']+
data['食用猪肉的频率/天']*data['平均每次食用量.5'])*50
# 五、少盐少油,控糖限酒
total_oil_day = (data['植物油']+data['动物油'])*500/30/3
total_yan_day = data['盐']*50/30/3
total_jiu_day = 50/7*(data['饮用频率']*data['平均每次饮用量']+data['饮用频率.1']*data['平均每次饮用量.1']+data['饮用频率.2']*data['平均每次饮用量.2']+data['饮用频率.3']*data['平均每次饮用量.3']+data['饮用频率.4']*data['平均每次饮用量.4'])
col = [foods_day,foods_week,foods_month,BMI,sport,total_vagetable_day,total_fruit_day,total_muilk_day,total_mut_day,total_oil_day,total_yan_day,total_jiu_day]
col_name = ['foods_day','foods_week','foods_month','BMI','sport','total_vagetable_day','total_fruit_day','total_muilk_day','total_mut_day','total_oil_day','total_yan_day','total_jiu_day']
dt = pd.DataFrame()
for i in range(len(col)):
dt[col_name[i]] = col[i]
import matplotlib.pyplot as plt
def draw_histograms(df, variables, n_rows, n_cols):
fig=plt.figure(figsize=(10,10))
for i, var_name in enumerate(variables):
ax=fig.add_subplot(n_rows,n_cols,i+1)
df[var_name].hist(bins=10,range=(df[var_name].min(), df[var_name].max()),ax=ax)
ax.set_title(var_name)
fig.tight_layout() # Improves appearance a bit.
plt.show()
draw_histograms(dt, dt.columns, len(dt.columns)//3, 3)
# 获取列的数量
num_columns = dt.shape[1]
# 标准线
line = [[12],[25],[45],[18.5,24],[15],[300],[250,350],[500],[120,200],[25,30],[5],[15]]
# 计算子图的行数和列数
num_rows = int(num_columns ** 0.5) # 取根号然后向下取整
num_cols = (num_columns + num_rows - 1) // num_rows # 确保有足够的格子放置所有的子图
fig, axs = plt.subplots(num_rows, num_cols, figsize=(15, 15)) # 设置画布大小
# 对每一列画散点图
for i in range(num_columns):
row = i // num_cols # 计算子图所在的行
col = i % num_cols # 计算子图所在的列
ax = axs[row, col] if num_rows > 1 and num_cols > 1 else (axs[col] if num_rows == 1 else axs[row]) # 获取子图对象
ax.scatter(range(dt.shape[0]), dt.iloc[:, i])
for j in line[i]:
ax.axhline(y=j, color='red') # 在子图上画线
ax.set_ylabel('Value')
ax.set_title(f'Scatter plot of column: {dt.columns[i]}')
plt.tight_layout() # 自动调整子图的位置,避免重叠
plt.show()
data['出生年'] = 2013-data['出生年']
categorical_columns = ['出生年','性别','民族','文化程度','婚姻状况','职业']
for column in categorical_columns:
data[column] = labelencoder.fit_transform(data[column])
now_data = pd.concat([data[['出生年','性别','民族','文化程度','婚姻状况','职业'] ], dt], axis=1)
now_data
X = now_data.drop(col_name, axis=1) # 除了生活习惯和饮食习惯以外的所有列都作为特征
y = now_data[col_name] # 我们想要预测的目标变量
for i in categorical_columns:
for j in col_name:
correlation = np.corrcoef(X[i], y[j])[0, 1]
print(f"{i}和{j}的相关性: {correlation}")
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
# 计算数据集中所有列的相关性矩阵
correlation_matrix = now_data.corr()
# 使用热力图可视化相关性矩阵
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('Correlation Matrix')
plt.show()
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 新增吸烟因素
smoke = data['平均每周吸烟天数']*data['一天吸烟支数']
now_data['smoke'] = smoke
X = now_data
cl = ['高血压','冠心病','脑血管疾病(如脑出血、网膜下腔出血、脑血栓形成、脑栓塞等)','糖尿病','慢性呼吸系统疾病(如慢支、肺气肿、哮喘)','恶性肿瘤']
for i in cl:
y = data[i]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用逻辑回归建模
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
# 4. 模型评估与解释
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
confusion_mat = confusion_matrix(y_test, y_pred)
classification_rep = classification_report(y_test, y_pred)
# print(f"Accuracy: {accuracy}")
# 生成混淆矩阵
confusion_mat = confusion_matrix(y_test, y_pred)
# 将混淆矩阵转换为DataFrame,方便使用Seaborn绘制热力图
confusion_df = pd.DataFrame(confusion_mat, index=['Actual Negative', 'Actual Positive'], columns=['Predicted Negative', 'Predicted Positive'])
# 绘制热力图
plt.figure(figsize=(6, 4))
print(i)
sns.heatmap(confusion_df, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()
cl = ['高血压','冠心病','脑血管疾病(如脑出血、网膜下腔出血、脑血栓形成、脑栓塞等)','糖尿病','慢性呼吸系统疾病(如慢支、肺气肿、哮喘)','恶性肿瘤']
ill = [0]*len(data)
for i in cl:
ill = data[i]+ill
now_data['ill'] = ill
now_data
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# 1. 数据准备
# 2. 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 3. 选择聚类数k
k = 3
kmeans = KMeans(n_clusters=k, random_state=42)
# 4. 计算数据点到聚类中心的距离,5. 数据点分配,6. 更新聚类中心
clusters = kmeans.fit_predict(X_scaled)
# 7. 绘制散点图和画圈分类
plt.figure(figsize=(8, 6))
# 绘制散点图
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='x', s=200) # 绘制聚类中心
print(data[['ID', 'Cluster']])
print('分为三类,样本中心与分类圈如下:')
print('健康','一般','较差')
# 画圈分类并显示文字标签
labels = [ '较差', '健康','一般']
for i in range(k):
circle = plt.Circle((kmeans.cluster_centers_[i, 0], kmeans.cluster_centers_[i, 1]),
radius=0.8, edgecolor='red', facecolor='none', linestyle='dashed', linewidth=2)
plt.gca().add_patch(circle)
plt.text(kmeans.cluster_centers_[i, 0]+0.5, kmeans.cluster_centers_[i, 1], labels[i]+'人群样本数量:'+str((list(clusters).count(i))), color='black', ha='center', va='center', fontsize=12)
plt.title('居民聚类')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()