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

article/2025/8/3 16:33:14

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

一、背景描述

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

本数据集包含遗传、荷尔蒙变化、医疗状况、药物治疗、营养缺乏、心理压力等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.hkcw.cn/article/yyGZOBlldi.shtml

相关文章

Transformer架构技术学习笔记:从理论到实战的完整解析

引言&#xff1a;重新定义序列建模的里程碑 2017年&#xff0c;Vaswani等人在论文《Attention Is All You Need》中提出的Transformer架构&#xff0c;彻底改变了自然语言处理领域的游戏规则。与传统RNN/LSTM相比&#xff0c;Transformer具有三大革命性特征&#xff1a; 全注意…

从0开始学习R语言--Day12--泊松分布

今天我们来看一个很经典的回归模型&#xff1a;泊松分布。 泊松分布 我们一般会把泊松分布用于预测问题&#xff0c;比如想知道成年人每天接到的骚扰电话次数&#xff0c;医院每天的急诊病人等。但在一些方面&#xff0c;跟我们想的会有出入。例如你不能将其应用在预测下周你的…

机器学习无监督学习sklearn实战一:K-Means 算法聚类对葡萄酒数据集进行聚类分析和可视化( 主成分分析PCA特征降维)

本项目代码在个人github链接&#xff1a;https://github.com/KLWU07/Machine-learning-Project-practice/tree/main/1-Wine%20cluster%20analysis 如果对于聚类算法理论不理解可参考这篇之前文章机器学习中无监督学习方法的聚类&#xff1a;划分式聚类、层次聚类、密度聚类&…

接口的概念及特性

目录 1、接口的概念2、语法规则2.1 接口的定义2.2、接口的使用 3、特性4、实现多个接口5、接口中的继承6、接口使用实例 1、接口的概念 在现实生活中&#xff0c;接口的例子有很多&#xff0c;比如&#xff1a;笔记本的 USB 接口&#xff0c;电源插座等。在电脑的 USB 口上&am…

品牌控价维护渠道生态与品牌价值的关键

在品牌发展的征程中&#xff0c;随着经销商队伍不断壮大&#xff0c;价格管控已成为关乎品牌存亡的核心命题。价格体系一旦失控&#xff0c;渠道乱象便如潮水般涌来。低价倾销不仅挤压正规经销商的生存空间&#xff0c;削弱其市场竞争力&#xff0c;更会引发消费者对产品价值的…

2011肠衣问题

1 D类竞赛题目---具体题目 D题 天然肠衣搭配问题 天然肠衣&#xff08;以下简称肠衣&#xff09;制作加工是我国的一个传统产业&#xff0c;出口量占世界首位。肠衣经过清洗整理后被分割成长度不等的小段&#xff08;原料&#xff09;&#xff0c;进入组装工序。 传统的生产…

Express教程【001】:Express创建基本的Web服务器

文章目录 1、初识express1.1 什么是Express1.2 主要特点1.3 Express的基本使用1.3.1 安装1.3.2 创建基本的Web服务器 1、初识express 目标&#xff1a; 能够使用express.static()快速托管静态资源能够使用express路由精简项目结构能够使用常见的express中间件能够使用express创…

CentOS 7 环境中部署 LNMP(Linux + Nginx + MySQL 5.7 + PHP)

在 CentOS 7 环境中部署 LNMP&#xff08;Linux Nginx MySQL 5.7 PHP&#xff09; 环境的详细步骤如下。此方案确保各组件版本兼容&#xff0c;并提供完整的配置验证流程。 1. 更新系统 sudo yum update -y 2. 安装 MySQL 5.7 2.1 添加 MySQL 官方 YUM 仓库 由于MySQL并不…

从零打造算法题刷题助手:Agent搭建保姆级攻略

我用Trae 做了一个有意思的Agent 「大厂机试助手」。 点击 https://s.trae.com.cn/a/d2a596 立即复刻&#xff0c;一起来玩吧&#xff01; Agent 简介 Agent名称为大厂机试助手&#xff0c;主要功能有以下三点。 解题&#xff1a; 根据用户给出的题目给出具体的解题思路引导做…

华院计算出席信创论坛,分享AI教育创新实践并与燧原科技共同推出教育一体机

5月21日&#xff0c;信创论坛于上海漕河泾会议中心举办。本次论坛以“聚力融合&#xff0c;繁荣生态”为主题&#xff0c;话题聚焦工业制造、交通运输、金融、教育、医疗等领域。华院计算技术&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称“华院计算”&#x…

MyBatis操作数据库

1.MyBatis:MyBatis是一款优秀的持久层框架,用于简化JDBC的开发.(持久层通常指数据访问层,用来操作数据库). 创建userInfo表,并插入如下数据: 在model中建立userinfo实体类,属性与之一一对应. 配置数据库连接字符串,Mybatis中要连接数据库,需要数据库相关参数配置. 接下来就可…

OCC笔记:BRepMesh_IncrementalMesh的使用

1. 函数接口 2. 线性偏转与角度偏转 2.1. theLineDeflection&#xff1a;线性偏转 根据文档推导下 isRelative传入Standard_True时&#xff0c;theLineDeflection为相对值。 参看isRelative说明 //! param isRelative if TRUE deflection used for discretization of //! ea…

调试技巧总结

目录 一.调试1.什么是调试2.调试语义的分类2.1 静态语义2.2 动态语义 二.实用的调试技巧1.屏蔽代码2.借助打印3.查看汇编代码4.调试技巧总结 一.调试 1.什么是调试 调试&#xff0c;通俗易懂地说就是不断排查代码的错误&#xff0c;进行修正的过程&#xff0c;在写代码的时候…

通过实时动作捕捉加速人形机器人训练

通过实时动作捕捉加速人形机器人训练 用于训练、控制和性能优化的精确实时运动学——受到全球机器人创新者的信赖&#xff01; 为什么选择 Xsens 进行人形机器人训练&#xff1f; 无与伦比的运动数据精度-经过科学验证的运动数据&#xff0c;用于简化AI/ML训练。 轻松集成到…

【UE5 C++】绘制地表贴合线

目录 原理 效果 步骤 源码 原理 先设置绘制线段的起点和终点&#xff0c;然后我们将起点和终点的高度升高&#xff0c;然后通过插值&#xff0c;在起点和终点之间添加多个点&#xff0c;再由这些点向地心发出射线&#xff0c;这样我们就可以获取到这些点在地表的投影点&…

01 redis 的环境搭建

前言 这一系列文章主要包含的内容主要是 各种常用软件的调试环境的搭建 主要的目的是 搭建一个可打断点的一个调试环境 c 系列 主要是基于 clion 调试, java 系列主要是基于 idea 调试, js 系列主要是基于 webstorm 调试 需要有一定的 c, c, java, js 相关基础 基于的…

python打卡训练营打卡记录day40

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代码…

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(五):语音合成输出与交互增强

Tailwind CSS 实战&#xff0c;基于Kooboo构建AI对话框页面&#xff08;一&#xff09; Tailwind CSS 实战&#xff0c;基于Kooboo构建AI对话框页面&#xff08;二&#xff09;&#xff1a;实现交互功能 Tailwind CSS 实战&#xff0c;基于 Kooboo 构建 AI 对话框页面&#x…

【MySQL】MVCC与Read View

目录 一、数据库并发的三种场景 二、读写场景的MVCC &#xff08;一&#xff09;表中的三个隐藏字段 &#xff08;二&#xff09;undo 日志 &#xff08;三&#xff09;模拟MVCC &#xff08;四&#xff09;Read View &#xff08;五&#xff09;当前读和快照读 三、RC和…

代码随想录打卡|Day53 图论(Floyd 算法精讲 、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结 )

图论part11 Floyd 算法精讲 代码随想录链接 题目链接 代码 三维DP数组 import java.util.Scanner;public class Main {// 定义最大距离值&#xff0c;避免使用Integer.MAX_VALUE防止加法溢出public static final int INF 100000000; // 10^8足够大且不会溢出public static…