脱发因素机器学习数据分析

脱发因素机器学习数据分析

一、背景描述

随着年龄增长,脱发成为影响外貌与健康的重要问题。

本数据集包含遗传、荷尔蒙变化、医疗状况、药物治疗、营养缺乏、心理压力等12个可能导致脱发的因素,

旨在通过数据分析挖掘各因素与脱发的潜在关联,为健康管理和医疗干预提供参考。

二、数据说明

字段说明数据类型
Id标识符整数
Genetics是否有秃头家族史(1:是 / 0:否)二分类(0/1)
Hormonal Changes是否经历荷尔蒙变化二分类(0/1)
Medical Conditions病史(多选项)字符串(逗号分隔)
Medications & Treatments药物治疗史(多选项)字符串(逗号分隔)
Nutritional Deficiencies营养缺乏(多选项)字符串(逗号分隔)
Stress压力水平(低/中/高)分类变量
Age年龄整数
Poor Hair Care Habits是否有不良护发习惯二分类(0/1)
Environmental Factors是否暴露于有害环境二分类(0/1)
Smoking是否吸烟二分类(0/1)
Weight Loss是否经历显著体重减轻二分类(0/1)
Hair Loss是否脱发二分类(0/1)

三、需求

1. 描述统计

  • 计算平均年龄与年龄分布
  • 统计最常见的医疗条件及其频率
  • 统计营养缺乏的种类及出现频率

2. 可视化分析

  • 不同年龄段脱发比例(柱状图)
  • 各因素与脱发的相关性(热力图)
  • 不同压力水平下的脱发情况(柱状图)

3. 机器学习建模

  • 构建分类模型预测脱发(逻辑回归、随机森林)
  • 聚类分析探索脱发群体类型(KMeans)
  • 识别关键影响因素(随机森林特征重要性)

四、代码实现

导包

# 先设置环境变量,避免CPU核心数警告
import os# 设置使用的CPU核心数(根据实际情况调整,建议为逻辑核心数的一半)
os.environ["LOKY_MAX_CPU_COUNT"] = "4"# 导入所需库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score, classification_report
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')# 配置matplotlib支持中文字体
plt.rcParams.update({"font.family": ["SimHei", "serif"],"axes.unicode_minus": False
})

数据预处理

# ---------------------- 数据读取与预处理 ---------------------- #
# 读取数据(确保列名与数据说明一致)
data = pd.read_csv('data/08/predict_hair_fall.csv')# ---------------------- 1. 二分类字段转换(Yes/No转0/1)---------------------- #
binary_columns = ['Genetics', 'Hormonal Changes', 'Poor Hair Care Habits','Environmental Factors', 'Smoking', 'Weight Loss', 'Hair Loss'
]
for col in binary_columns:data[col] = data[col].replace({'Yes': 1, 'No': 0})  # 假设数据用Yes/No表示# ---------------------- 2. 多选项字段拆分(生成二进制特征)---------------------- #
def split_multiple_features(df, column_name, prefix):"""拆分多选项字段为二进制特征"""df[column_name] = df[column_name].fillna('')  # 处理空值# 拆分并生成虚拟变量dummies = df[column_name].str.split(', ', expand=True).stack().reset_index(level=1, drop=True)dummies = pd.get_dummies(dummies, prefix=prefix)return df.join(dummies.groupby(level=0).sum())# 拆分具体字段(注意列名需与数据集完全一致)
data = split_multiple_features(data, 'Medical Conditions', '病史')
data = split_multiple_features(data, 'Medications & Treatments', '药物')
data = split_multiple_features(data, 'Nutritional Deficiencies', '营养')# ---------------------- 3. 压力水平转换(文本转数值)---------------------- #
stress_mapping = {'Low': 1, 'Moderate': 2, 'High': 3}
data['Stress'] = data['Stress'].map(stress_mapping)# ---------------------- 4. 准备建模数据(排除非数值列)---------------------- #
drop_columns = ['Medical Conditions', 'Medications & Treatments', 'Nutritional Deficiencies', 'Id'  # 排除原始字符串列和ID
]
model_data = data.drop(drop_columns, axis=1).copy()  # 建模专用数据集(无字符串)

描述统计

# ---------------------- 描述统计 ---------------------- #
# 1. 年龄统计
average_age = model_data['Age'].mean()
print(f"平均年龄:{average_age:.1f}岁")plt.figure(figsize=(8, 4))
sns.histplot(model_data['Age'], bins=10, kde=True, color='skyblue')
plt.title('年龄分布直方图')
plt.xlabel('年龄')
plt.ylabel('人数')
plt.show()# 2. 常见医疗条件统计
medical_counts = model_data.filter(like='病史_').sum().sort_values(ascending=False)
print("\n常见医疗条件(前5):")
print(medical_counts.head(5))# 3. 营养缺乏统计
nutritional_counts = model_data.filter(like='营养_').sum().sort_values(ascending=False)
print("\n营养缺乏种类(前5):")
print(nutritional_counts.head(5))
平均年龄:34.2岁

scikit-learn

常见医疗条件(前5):
病史_No Data                  110
病史_Alopecia Areata          107
病史_Psoriasis                100
病史_Thyroid Problems          99
病史_Androgenetic Alopecia     98
dtype: int64营养缺乏种类(前5):
营养_Zinc Deficiency         108
营养_Vitamin D Deficiency    104
营养_Biotin Deficiency        99
营养_Vitamin A Deficiency     99
营养_Omega-3 fatty acids      92
dtype: int64

可视化分析

# ---------------------- 可视化分析(使用原始数据创建分组)---------------------- #
# 单独处理可视化数据(保留年龄分组)
visual_data = data.copy()
visual_data['年龄分组'] = pd.cut(visual_data['Age'], bins=[0, 20, 30, 40, 50, 60, 100],labels=['<20', '20-30', '30-40', '40-50', '50-60', '>60'])

不同年龄段脱发比例

# 1. 不同年龄段脱发比例
age_loss_ratio = visual_data.groupby('年龄分组')['Hair Loss'].mean().reset_index()plt.figure(figsize=(10, 6))
sns.barplot(x='年龄分组', y='Hair Loss', data=age_loss_ratio, palette='viridis')
plt.title('不同年龄段脱发比例')
plt.xlabel('年龄分组')
plt.ylabel('脱发比例')
plt.xticks(rotation=45)
plt.show()

scikit-learn

因素与脱发的相关性热力图(使用建模数据,全为数值型)

# 2. 因素与脱发的相关性热力图(使用建模数据,全为数值型)
corr = model_data.corr()plt.figure(figsize=(12, 8))
sns.heatmap(corr[['Hair Loss']].sort_values(by='Hair Loss', ascending=False), annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('各因素与脱发的相关性')
plt.show()

scikit-learn

不同压力水平脱发情况

# 3. 不同压力水平脱发情况
stress_loss = model_data.groupby('Stress')['Hair Loss'].mean().reset_index()
stress_loss['压力水平'] = stress_loss['Stress'].map({1:'低', 2:'中', 3:'高'})plt.figure(figsize=(8, 5))
sns.barplot(x='压力水平', y='Hair Loss', data=stress_loss, palette='rocket')
plt.title('不同压力水平脱发比例')
plt.xlabel('压力水平')
plt.ylabel('脱发比例')
plt.show()

scikit-learn

机器学习建模

# ---------------------- 机器学习建模 ---------------------- #
X = model_data.drop('Hair Loss', axis=1)
y = model_data['Hair Loss']# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

逻辑回归模型

# 1. 逻辑回归模型
logreg = LogisticRegression(max_iter=1000)
logreg.fit(X_train, y_train)
print(f"逻辑回归准确率:{accuracy_score(y_test, logreg.predict(X_test)):.2f}")
逻辑回归准确率:0.47

随机森林模型

# 2. 随机森林模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
print(f"随机森林准确率:{accuracy_score(y_test, rf.predict(X_test)):.2f}")
随机森林准确率:0.43

聚类分析 K-means 模型

# 3. 聚类分析(KMeans)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 肘部法则确定聚类数
inertia = []
for k in range(2, 6):kmeans = KMeans(n_clusters=k, random_state=42)inertia.append(kmeans.fit(X_scaled).inertia_)plt.figure(figsize=(8, 4))
plt.plot(range(2, 6), inertia, marker='o', linestyle='--', color='b')
plt.title('肘部法则确定聚类数')
plt.xlabel('聚类数k')
plt.ylabel('惯性值')
plt.show()

scikit-learn

执行聚类

# 执行聚类(假设k=3)
kmeans = KMeans(n_clusters=3, random_state=42)
model_data['Cluster'] = kmeans.fit_predict(X_scaled)
print("\n聚类分布:")
print(model_data['Cluster'].value_counts())
聚类分布:
Cluster
2    601
1    226
0    172
Name: count, dtype: int64

重要特征分布

# 4. 特征重要性分析
features = X.columns
importances = rf.feature_importances_
importance_df = pd.DataFrame({'特征': features, '重要性': importances}).sort_values(by='重要性', ascending=False)plt.figure(figsize=(10, 6))
sns.barplot(x='重要性', y='特征', data=importance_df.head(10), palette='Set3')
plt.title('前10重要特征')
plt.xlabel('重要性得分')
plt.ylabel('特征')
plt.show()

scikit-learn

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 第四十八节 Router中 useMatch 的使用详细介绍及案例分析

前言 useMatch 是 React Router 中的一个钩子&#xff0c;用于判断当前 URL 路径是否与指定模式匹配&#xff0c;并返回匹配的详细信息。 它常用于动态路由参数提取、条件渲染和导航高亮等场景。 一、useMatch 核心功能 路径匹配检测&#xff1a;判断当前路径是否符合指定模…

ubuntu mysql 8.0.42 基于二进制日志文件位置和GTID主从复制配置

目录 1 操作系统信息 2 MySql数据库版本 3 主机列表 4 MySQL服务器都安装依赖 5 主库服务器安装mysql软件步骤&#xff1a; 6 从服务器安装mysql软件步骤 7 基于二进制日志文件位置的主从复制配置 8 使用全局事务标识符进行主从复制(GTID) 9 部署过程遇到问题 1 操作系…

鸿蒙OSUniApp滑动锁屏实战:打造流畅优雅的移动端解锁体验#三方框架 #Uniapp

UniApp滑动锁屏实战&#xff1a;打造流畅优雅的移动端解锁体验 引言 移动应用的安全性和用户体验是开发中不可忽视的重要环节。滑动锁屏作为一种直观、安全且用户友好的解锁方式&#xff0c;在移动应用中得到广泛应用。本文将深入探讨如何使用UniApp框架实现一个功能完备、动…

专场回顾 | 重新定义交互,智能硬件的未来设计

自2022年起&#xff0c;中国智能硬件行业呈现出蓬勃发展的态势&#xff0c;市场规模不断扩大。一个多月前&#xff0c;“小智AI”在短视频平台的爆火将智能硬件带向了大众视野&#xff0c;也意味着智能硬件已不再仅仅停留在概念和技术层面&#xff0c;而是加速迈向实际落地应用…

zynq 级联多个ssd方案设计(ECAM BUG修改)

本文讲解采用zynq7045芯片如何实现200T容量高速存储方案设计&#xff0c;对于大容量高速存储卡&#xff0c;首先会想到采用pcie switch级联方式&#xff0c;因为单张ssd的容量是有限制的&#xff08;目前常见的m.2接口容量为4TB&#xff0c;U.2接口容量为16TB&#xff09;&…

中国区域每月地下水水位栅格数据集(2005-2022)

时间分辨率&#xff1a;月空间分辨率&#xff1a;1km - 10km共享方式&#xff1a;开放获取数据大小&#xff1a;8.52 GB数据时间范围&#xff1a;2005-01-01 — 2022-12-01元数据更新时间&#xff1a;2024-09-09 数据集摘要 数据集“GWs_cn_1km”提供了2005年至2022年中国区域…

鸿蒙OSUniApp导航栏组件开发:打造清新简约的用户界面#三方框架 #Uniapp

UniApp 开发实战&#xff1a;打造符合鸿蒙设计风格的日历活动安排组件 在移动应用开发中&#xff0c;日历和活动安排是非常常见的需求。本文将详细介绍如何使用 UniApp 框架开发一个优雅的日历活动安排组件&#xff0c;并融入鸿蒙系统的设计理念&#xff0c;实现一个既美观又实…

在 HTML 文件中添加图片的常用方法

本文详解HTML图片插入方法&#xff1a;1&#xff09;通过<img>标签实现&#xff0c;必须含src和alt属性&#xff1b;2&#xff09;路径支持绝对/相对引用&#xff1b;3&#xff09;建议设置width/height保持比例&#xff1b;4&#xff09;响应式方案用srcset适配不同设备…

LangChain-自定义Tool和Agent结合DeepSeek应用实例

除了调用LangChain内置工具外&#xff0c;也可以自定义工具 实例1&#xff1a; 自定义多个工具 from langchain.agents import initialize_agent, AgentType from langchain_community.agent_toolkits.load_tools import load_tools from langchain_core.tools import tool, …

代码随想录算法训练营第60期第五十天打卡

大家好&#xff0c;首先感慨一下&#xff0c;时间过的真是快&#xff0c;不知不觉我们的训练营就已经到第五十天了&#xff0c;首先祝贺自己一直在坚持&#xff0c;今天是我们动态规划章节的收官之战&#xff0c;明天我们就会走进一个全新的算法章节单调栈&#xff0c;我们要为…

如何发布npm包?

如何发布npm包&#xff1f; 1. 注册账号[npm官网](https://www.npmjs.com/)2. 检查 npm 源是否在官方 npm 仓库&#xff0c;如果不在&#xff0c;进行切换3. 检查4. 打包配置5. 发布6. 使用错误&#xff1a;版本更新命令 1. 注册账号npm官网 2. 检查 npm 源是否在官方 npm 仓库…

AI工具使用的最佳实践,如何通过AI工具提高创作与工作效率

随着科技的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;已从遥不可及的未来构想&#xff0c;转变为广泛应用于各行业的实用工具。AI不仅在内容创作、设计、写作等领域展现出巨大潜力&#xff0c;还通过自动化和智能化显著提升了工作效率。本文将深入探讨如何通过选…

漏洞Reconfigure the affected application to avoid use of weak cipher suites. 修复方案

修复方案&#xff1a;禁用弱加密套件&#xff08;Weak Cipher Suites&#xff09; 1. 确认当前使用的加密套件 在修复前&#xff0c;先检查应用程序或服务器当前支持的加密套件&#xff1a; OpenSSL (适用于HTTPS/TLS服务)openssl ciphers -v ALL:COMPLEMENTOFALL | sortNgi…

AI对软件工程的影响及未来发展路径分析报告

目录 第一部分&#xff1a;引言 研究背景与意义 报告框架与方法论 第二部分&#xff1a;AI对不同行业软件工程的影响分析 数字化行业 制造业 零售业 工业领域 第三部分&#xff1a;大厂AI软件工程实践案例分析 微软 谷歌 阿里巴巴 华为 第四部分&#xff1a;未来…

WSL里执行python深度学习的一些方法记录

安装anaconda3&#xff1a; 可以直接从 Download Now | Anaconda 中下载&#xff0c;然后拷贝到WSL环境的某个目录&#xff0c;执行 bash xxxxxxx.sh 即可安装。 启动jupyter notebook&#xff1a; 先conda activate 当前环境&#xff0c;然后pip install jupyter 此时&am…

使用 SpyGlass Power Verify 解决方案中的规则

本节提供了关于使用 SpyGlass Power Verify 解决方案 的相关信息。内容组织如下: SpyGlass Power Verify 简介运行 SpyGlass Power Verify 解决方案在 SpyGlass Power Verify 解决方案中评估结果SpyGlass Power Verify 解决方案中的参数SpyGlass Power Verify 报告1 SpyGlass …

spring4第3课-ioc控制反转-详解依赖注入的4种方式

1&#xff0c;属性注入&#xff1b; 2&#xff0c;构造函数注入&#xff1b;(通过类型&#xff1b;通过索引&#xff1b;联合使用) 3&#xff0c;工厂方法注入&#xff1b;(非静态工厂&#xff0c;静态工厂) 4&#xff0c;泛型依赖注入&#xff1b;(Spring4 整合 Hibernate4…

使用Rust和并发实现一个高性能的彩色分形图案渲染

分形与 Mandelbrot Mandelbrot 集 (Mandelbrot Set) 是复数平面上一个点的集合,以数学家 Benot Mandelbrot 的名字命名。它是最著名的分形之一。一个复数 c 是否属于 Mandelbrot 集,取决于一个简单的迭代过程: z n + 1 = z n 2 + c z_{n+1}=z_{n}^2+c zn+1​=zn2​+c 如果…

微信小程序的软件测试用例编写指南及示例--性能测试用例

以下是针对微信小程序的性能测试用例补充,结合代码逻辑和实际使用场景,从加载性能、渲染性能、资源占用、交互流畅度等维度设计测试点,并标注对应的优化方向: 一、加载性能测试用例 测试项测试工具/方法测试步骤预期结果优化方向冷启动加载耗时微信开发者工具「性能」面板…

行为型:观察者模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、注意事项 1、核心思想 目的&#xff1a;针对被观察对象与观察者对象之间一对多的依赖关系建立起一种行为自动触发机制&#xff0c;当被观察对象状态发生变化时主动对外发起广播&…