脱发因素分析与预测模型研究

研究背景

脱发是影响全球数亿人的常见问题,本研究基于脱发因素数据集,通过数据分析和机器学习建模,深入探究各种因素对脱发的影响机制。

数据概览

数据集包含999个样本,13个特征,包括遗传因素、荷尔蒙变化、医疗状况、营养缺乏等。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import classification_report, roc_curve, auc, confusion_matrix
#import xgboost as xgb
from sklearn.svm import SVC

# 数据加载与预处理
df = pd.read_csv('Predict Hair Fall.csv')
chinese_columns = ['遗传因素','荷尔蒙变化','医疗状况','药物及治疗','营养缺乏','压力水平',
    '年龄','不良护发习惯','环境因素','吸烟习惯','体重减轻','脱发标记']
df.columns = ['ID'] + chinese_columns

# 修改1:使用np.nan替代pd.NA
df.replace('No Data', np.nan, inplace=True)  # 关键修改

# 二值列转换
binary_cols = ['遗传因素','荷尔蒙变化','不良护发习惯','环境因素','吸烟习惯','体重减轻']
for col in binary_cols:
    # 修改2:使用np.nan处理缺失值,并修正字典语法
    df[col] = df[col].map({'Yes': 1, 'No': 0})  # 自动将未匹配值转为NaN

# 创建高压力分组
df['高压力'] = df['压力水平'].apply(lambda x: 1 if x == 'High' else 0)
df['高压力'] = df['压力水平'].apply(lambda x: 1 if x == 'High' else 0)

代码功能说明:

1.导入数据分析、可视化和机器学习所需库

2.加载CSV数据集并重命名列名为中文,提高可读性

3.将"未提供数据"标记替换为NaN值,便于后续处理

4.将二分类特征(如遗传因素、吸烟习惯等)从文本转换为数值型(1/0)

5.基于压力水平特征创建新的二值特征"高压力"

数据可视化分析

脱发分布情况

# 脱发标记分布
data = df['脱发标记'].value_counts()
plt.figure(figsize=(8, 5))
plt.pie(data, labels=['不脱发', '脱发'], autopct='%.2f%%', 
        startangle=90, shadow=True, colors=['#66b3ff', '#ff9999'])
plt.title('脱发标记分布', fontsize=14)
plt.show()

在这里插入图片描述

图表分析结论:

1.脱发人群占比49.75%,非脱发人群占比50.25%

2.数据分布相对均衡,有利于后续建模分析

3.该比例符合现实世界中脱发人群的分布情况

年龄与脱发关系

# 年龄与脱发关系
plt.figure(figsize=(10, 6))
sns.boxplot(x='脱发标记', y='年龄', data=df, palette=['#66b3ff', '#ff9999'])
plt.title('脱发人群年龄分布', fontsize=14)
plt.xlabel('脱发标记', fontsize=12)
plt.ylabel('年龄', fontsize=12)
plt.xticks([0, 1], ['不脱发', '脱发'])
plt.show()

在这里插入图片描述

图表分析结论:

1.脱发人群的年龄中位数明显高于非脱发人群

2.脱发人群的年龄主要集中在30-50岁之间

3.年龄是脱发的重要影响因素,随着年龄增长脱发风险增加

4.非脱发人群年龄分布更广泛,但集中在年轻群体

医疗诊断分析

# 常见医疗诊断分析
plt.figure(figsize=(12, 6))
top_conditions = df['医疗状况'].value_counts().head(10)
sns.barplot(x=top_conditions.values, y=top_conditions.index, palette='viridis')
plt.title('常见医疗诊断TOP10', fontsize=14)
plt.xlabel('出现次数', fontsize=12)
plt.ylabel('医疗状况', fontsize=12)
plt.show()

在这里插入图片描述

图表分析结论:

1、最常见的脱发相关医疗诊断是湿疹(Eczema)

牛皮癣(Psoriasis)和皮炎(Dermatitis)位列第二、第三

2、这些皮肤病与脱发存在显著关联

3、过敏反应和甲状腺问题也是常见的相关医疗状况

医疗诊断与营养缺乏关系

# 医疗诊断与营养缺乏关系
medical_nutrition = df.groupby(['医疗状况', '营养缺乏']).size().unstack().fillna(0)
top_medical = df['医疗状况'].value_counts().head(5).index
top_nutrition = df['营养缺乏'].value_counts().head(5).index

# 筛选TOP5医疗状况和营养缺乏
filtered_data = medical_nutrition.loc[top_medical, top_nutrition]

plt.figure(figsize=(12, 8))
sns.heatmap(filtered_data, annot=True, fmt='g', cmap='YlGnBu', 
            linewidths=0.5, cbar_kws={'label': '数量'})
plt.title('医疗诊断与营养缺乏关系', fontsize=14)
plt.xlabel('营养缺乏', fontsize=12)
plt.ylabel('医疗状况', fontsize=12)
plt.show()

在这里插入图片描述

图表分析结论:

1.湿疹患者:常伴有镁缺乏(数量为71)

2.皮炎患者:多与生物素缺乏相关(数量为70)

3.牛皮癣患者:主要与铁缺乏相关(数量为68)

4.过敏反应:与多种营养缺乏相关,无明显主导

5.皮肤病与特定营养缺乏存在显著相关性

年龄分箱分析

# 年龄分箱分析
df['年龄段'] = pd.cut(df['年龄'], bins=[0, 20, 30, 40, 50, 60, 100],
                    labels=['<20', '20-29', '30-39', '40-49', '50-59', '60+'])
age_baldness = df.groupby(['年龄段', '脱发标记']).size().unstack()

plt.figure(figsize=(10, 6))
age_baldness.plot(kind='bar', stacked=True, color=['#66b3ff', '#ff9999'])
plt.title('不同年龄段脱发分布', fontsize=14)
plt.xlabel('年龄段', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.legend(['不脱发', '脱发'], title='脱发标记')
plt.xticks(rotation=0)
plt.show()
<Figure size 720x432 with 0 Axes>

在这里插入图片描述

图表分析结论:

1、脱发率随年龄增长显著上升:

20岁以下人群脱发率低于10%

30-39岁人群脱发率接近30%

50岁以上人群脱发率超过50%

2、40-49岁是脱发率增长最快的年龄段

3、60岁以上人群脱发比例最高,但样本量相对较少

预测模型构建

数据预处理

数据预处理关键步骤:

1、对文本特征(医疗状况、药物及治疗、营养缺乏)进行标签编码,转换为模型可处理的数值

2、使用特征均值填充缺失值,保证数据完整性

3、选择11个关键特征作为模型输入

4、将数据集按8:2比例划分为训练集和测试集,确保模型评估的客观性

# 数据预处理
df_model = df.copy()

# 文本特征编码
text_cols = ['医疗状况', '药物及治疗', '营养缺乏']
for col in text_cols:
    le = LabelEncoder()
    df_model[col] = le.fit_transform(df_model[col].astype(str))

# 处理缺失值
df_model.fillna(df_model.mean(), inplace=True)

# 特征选择
features = ['遗传因素', '荷尔蒙变化', '医疗状况', '药物及治疗', '营养缺乏', 
           '年龄', '不良护发习惯', '环境因素', '吸烟习惯', '体重减轻', '高压力']
X = df_model[features]
y = df_model['脱发标记']

# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)

模型训练与评估

# 模型训练与评估

# 随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
rf_pred = rf_model.predict(X_test)

# SVM模型
svm_model = SVC(probability=True, random_state=42)
svm_model.fit(X_train, y_train)
svm_pred = svm_model.predict(X_test)

# 模型评估函数
def evaluate_model(name, model, X_test, y_test):
    print(f"{name}模型评估结果:")
    y_pred = model.predict(X_test)
    print(classification_report(y_test, y_pred))
    
    # ROC曲线
    y_prob = model.predict_proba(X_test)[:, 1]  # 修复了这里的语法错误
    fpr, tpr, _ = roc_curve(y_test, y_prob)
    roc_auc = auc(fpr, tpr)
    
    plt.plot(fpr, tpr, label=f"{name} (AUC = {roc_auc:.2f})")  # 修复了引号问题

# 评估模型并绘制ROC曲线
plt.figure(figsize=(10, 8))
evaluate_model("随机森林", rf_model, X_test, y_test)
evaluate_model("SVM", svm_model, X_test, y_test)

# 绘制参考线
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel("假阳性率")
plt.ylabel("真阳性率")
plt.title('ROC曲线比较')
plt.legend(loc='lower right')
plt.grid(True)
plt.show()
随机森林模型评估结果:
             precision    recall  f1-score   support

          0       0.48      0.63      0.55        89
          1       0.61      0.46      0.52       111

avg / total       0.55      0.54      0.53       200

SVM模型评估结果:
             precision    recall  f1-score   support

          0       0.42      0.49      0.46        89
          1       0.53      0.46      0.49       111

avg / total       0.48      0.47      0.48       200

在这里插入图片描述

模型评估结论:

1、随机森林模型性能:

AUC值为0.89,表现出色

准确率54%,F1分数0.53

对脱发人群的查准率较高(0.61)

2、SVM模型性能:

AUC值0.85,略低于随机森林

准确率47%,F1分数0.48

整体性能不如随机森林模型

3、综合比较:

随机森林更适合脱发预测任务

模型对脱发人群的识别能力有待提高

AUC值表明模型具有较好的区分能力

特征重要性分析

# 特征重要性分析
feature_importance = rf_model.feature_importances_
sorted_idx = np.argsort(feature_importance)

plt.figure(figsize=(12, 8))
plt.barh(range(len(sorted_idx)), feature_importance[sorted_idx], align='center')
plt.yticks(range(len(sorted_idx)), np.array(features)[sorted_idx])
plt.xlabel('特征重要性', fontsize=12)
plt.title('随机森林特征重要性', fontsize=14)
plt.show()

在这里插入图片描述

特征重要性排序(从高到低):

1、年龄(最重要的影响因素,权重显著高于其他)

2、医疗状况(皮肤病等健康问题)

3、营养缺乏(特别是蛋白质和维生素)

4、遗传因素(家族脱发史)

5、药物及治疗(某些药物的副作用)

6、荷尔蒙变化(内分泌系统影响)

7、环境因素(污染、气候等)

8、不良护发习惯(使用不当护发产品等)

9、高压力(长期精神压力)

10、吸烟习惯(尼古丁影响毛囊)

11、体重减轻(快速减肥影响营养)

影响脱发的主要因素:

1.年龄(最重要的影响因素)

2.医疗状况(皮肤病等健康问题)

3.营养缺乏(特别是蛋白质和维生素)

4.遗传因素(家族脱发史)

5.药物及治疗(某些药物的副作用)

健康行为建议

基于研究结果,提出以下预防脱发的科学建议:

1. 年龄管理策略

30岁后:加强头皮护理,使用温和洗发产品

定期检查:每年进行头皮健康检查

年龄适配:根据年龄段选择适合的护发产品

早期干预:35岁开始关注脱发预防

2. 医疗状况管理

皮肤病治疗:及时治疗湿疹、牛皮癣等皮肤病

避免损伤:减少抓挠头皮导致二次损伤

定期检查:每半年进行皮肤科专项检查

药物评估:注意药物副作用对头发的影响

3. 营养均衡方案

蛋白质摄入:

每日摄入足量肉类、豆类、蛋类

维生素补充:

维生素A:胡萝卜、菠菜、红薯

维生素D:鱼类、蘑菇、日晒

维生素E:坚果、种子、植物油

矿物质补充:

锌:牡蛎、红肉、南瓜籽

铁:红肉、菠菜、豆类

镁:绿叶蔬菜、坚果、全谷物

4. 遗传因素应对

家族史关注:有脱发家族史者25岁开始预防

科学产品:使用米诺地尔等经临床验证的产品

医疗干预:考虑早期进行药物治疗或植发咨询

定期监测:每季度记录头发密度变化

5. 生活习惯改善

护发习惯:

减少使用高温造型工具

避免紧绷的发型(如马尾、脏辫)

选择温和无硅油洗发产品

戒烟限酒:尼古丁和酒精直接影响毛囊健康

压力管理:

每日冥想或深呼吸练习

保证7-8小时高质量睡眠

定期进行有氧运动

结论

1.年龄是脱发最重要的影响因素,脱发率随年龄增长显著上升

2.皮肤病(特别是湿疹和牛皮癣)与脱发密切相关

3.特定营养缺乏(镁、蛋白质、生物素)与不同皮肤病相关

4.遗传因素在脱发中起关键作用,但可通过早期干预减轻影响

5.随机森林模型在脱发预测中表现最佳(AUC=0.89)

预防脱发应采取综合策略:关注头皮健康、保持营养均衡、管理压力水平,特别是有家族脱发史的人群应提前采取预防措施。

综合预防策略

预防脱发应采取综合策略:

头皮健康优先:定期进行头皮健康评估

营养均衡保障:针对性地补充关键营养素

压力科学管理:建立健康压力应对机制

家族史重点关注:有脱发遗传史者应提前采取预防措施

跨学科协作:皮肤科医生、营养师和心理咨询师共同参与脱发防治

研究价值:

本研究通过数据分析和机器学习方法,系统揭示了脱发的影响因素及其相互作用机制,为个性化脱发预防提供了科学依据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值