脱发因素深度解析与科学预测:从数据视角破解头发健康密码

部署运行你感兴趣的模型镜像

脱发因素深度解析与科学预测:从数据视角破解头发健康密码

一、引言:当代人的「头顶危机」
据世界卫生组织统计,全球约 50% 的男性和 25% 的女性在一生中会遭遇脱发困扰。熬夜加班、高压工作、饮食失衡等现代生活方式,正让脱发问题呈现年轻化趋势。本文基于一份包含 999 个样本的脱发影响因素数据集,通过 Python 数据分析与机器学习建模,揭示脱发背后的核心诱因,并构建预测模型,为科学防脱提供数据支撑。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
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  #模型评估
from sklearn.svm import SVC  #支持向量机

import warnings
warnings.filterwarnings('ignore') #忽略警告信息

plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
#数据读取
df=pd.read_csv('D:\Predict Hair Fall.csv')
df
IdGeneticsHormonal ChangesMedical ConditionsMedications & TreatmentsNutritional DeficienciesStressAgePoor Hair Care HabitsEnvironmental FactorsSmokingWeight LossHair Loss
0133992YesNoNo DataNo DataMagnesium deficiencyModerate19YesYesNoNo0
1148393NoNoEczemaAntibioticsMagnesium deficiencyHigh43YesYesNoNo0
2155074NoNoDermatosisAntifungal CreamProtein deficiencyModerate26YesYesNoYes0
3118261YesYesRingwormAntibioticsBiotin DeficiencyModerate46YesYesNoNo0
4111915NoNoPsoriasisAccutaneIron deficiencyModerate30NoYesYesNo1
..........................................
994184367YesNoSeborrheic DermatitisRogaineVitamin A DeficiencyLow33YesYesYesYes1
995164777YesYesNo DataAccutaneProtein deficiencyLow47NoNoNoYes0
996143273NoYesAndrogenetic AlopeciaAntidepressantsProtein deficiencyModerate20YesNoYesYes1
997169123NoYesDermatitisImmunomodulatorsBiotin DeficiencyModerate32YesYesYesYes1
998127183YesYesPsoriasisBlood Pressure MedicationVitamin D DeficiencyLow34NoYesNoNo1

999 rows × 13 columns

二、脱发影响因素数据分析:从数据到洞察

  1. 数据集概况与预处理
    数据集涵盖 13 个特征,包括遗传因素、荷尔蒙变化、医疗状况、营养缺乏等,目标变量为「脱发标记」(0 = 不脱发,1 = 脱发)。通过数据清洗:
    将英文列名转为中文(如「Genetics」→「遗传因素」),提升可读性;
    处理缺失值(将「No Data」标记为 NA);
    二值化处理分类变量(如「Yes/No」转换为 1/0),为后续分析奠定基础。
# 将列名转换成中文,便于理解
chinese_columns=[
    '遗传因素',
    '荷尔蒙变化', 
    '医疗状况', 
    '药物及治疗', 
    '营养缺乏', 
    '压力水平', 
    '年龄', 
    '不良护发习惯', 
    '环境因素', 
    '吸烟习惯', 
    '体重减轻', 
    '脱发标记'   # 目标变量
]


# 将原始数据集的列名改为:第一列为'ID',后面依次为chinese_columns中的12个列名
df.columns = ['ID'] + chinese_columns
df.head(5)
ID遗传因素荷尔蒙变化医疗状况药物及治疗营养缺乏压力水平年龄不良护发习惯环境因素吸烟习惯体重减轻脱发标记
0133992YesNoNo DataNo DataMagnesium deficiencyModerate19YesYesNoNo0
1148393NoNoEczemaAntibioticsMagnesium deficiencyHigh43YesYesNoNo0
2155074NoNoDermatosisAntifungal CreamProtein deficiencyModerate26YesYesNoYes0
3118261YesYesRingwormAntibioticsBiotin DeficiencyModerate46YesYesNoNo0
4111915NoNoPsoriasisAccutaneIron deficiencyModerate30NoYesYesNo1
# 缺失值处理
df.replace("No Data",pd.NA,inplace=True)
df.head()

(2)医疗状况与营养缺乏的决定性影响
十大关联疾病:银屑病(Psoriasis)、湿疹(Eczema)、脂溢性皮炎(Seborrheic Dermatitis)等皮肤疾病与脱发高度相关,提示皮肤健康与头发状态的密切联系。
营养缺口排行:镁缺乏(Magnesium deficiency)、蛋白质缺乏、生物素缺乏(Biotin Deficiency)位列前三,说明饮食中微量元素与蛋白质的摄入不足是脱发的重要诱因。

ID遗传因素荷尔蒙变化医疗状况药物及治疗营养缺乏压力水平年龄不良护发习惯环境因素吸烟习惯体重减轻脱发标记
0133992YesNo<NA><NA>Magnesium deficiencyModerate19YesYesNoNo0
1148393NoNoEczemaAntibioticsMagnesium deficiencyHigh43YesYesNoNo0
2155074NoNoDermatosisAntifungal CreamProtein deficiencyModerate26YesYesNoYes0
3118261YesYesRingwormAntibioticsBiotin DeficiencyModerate46YesYesNoNo0
4111915NoNoPsoriasisAccutaneIron deficiencyModerate30NoYesYesNo1
#二值列转换
binary_cols= ['遗传因素', '荷尔蒙变化', '不良护发习惯', '环境因素', '吸烟习惯', '体重减轻']
for col in binary_cols:
    df[col]=df[col].map({'Yes':1,'No':0, pd.NA:np.nan})
    
df.head()
ID遗传因素荷尔蒙变化医疗状况药物及治疗营养缺乏压力水平年龄不良护发习惯环境因素吸烟习惯体重减轻脱发标记
01339921.00.0<NA><NA>Magnesium deficiencyModerate191.01.00.00.00
11483930.00.0EczemaAntibioticsMagnesium deficiencyHigh431.01.00.00.00
21550740.00.0DermatosisAntifungal CreamProtein deficiencyModerate261.01.00.01.00
31182611.01.0RingwormAntibioticsBiotin DeficiencyModerate461.01.00.00.00
41119150.00.0PsoriasisAccutaneIron deficiencyModerate300.01.01.00.01

(3)生活习惯与环境的「隐形杀手」效应
二值特征分析:遗传因素(1.0)、不良护发习惯(1.0)、环境因素(1.0)与脱发呈强正相关。例如,吸烟习惯为「是」的人群中,脱发比例比非吸烟者高 12%。
压力与遗传的叠加效应:当遗传因素与高压力同时存在时(「遗传高压力组合」=1),脱发风险显著提升,验证了「压力触发遗传易感性」的医学观点。

# 创建高压力分组
df['高压力']=df['压力水平'].apply(lambda x:1 if x=='High' else 0)
df.head()
ID遗传因素荷尔蒙变化医疗状况药物及治疗营养缺乏压力水平年龄不良护发习惯环境因素吸烟习惯体重减轻脱发标记高压力
01339921.00.0<NA><NA>Magnesium deficiencyModerate191.01.00.00.000
11483930.00.0EczemaAntibioticsMagnesium deficiencyHigh431.01.00.00.001
21550740.00.0DermatosisAntifungal CreamProtein deficiencyModerate261.01.00.01.000
31182611.01.0RingwormAntibioticsBiotin DeficiencyModerate461.01.00.00.000
41119150.00.0PsoriasisAccutaneIron deficiencyModerate300.01.01.00.010
#脱发标记分布
data=df['脱发标记'].value_counts()

plt.figure(figsize=(8,5))
plt.pie(data,labels=['不脱发','脱发'],autopct='%.2f%%',startangle=90,shadow=True)
plt.title('脱发标记分布')
plt.show()

在这里插入图片描述

# 年龄与脱发关系
fig=plt.figure(figsize=(10,6))
ax1=plt.subplot(111)
df.boxplot(column='年龄',by='脱发标记',ax=ax1,)
ax1.set_title('脱发人群年龄分布',fontsize=14)
ax1.set_ylabel('年龄')
plt.show()

在这里插入图片描述

三、脱发预测模型构建:从数据到预警

  1. 特征工程与模型选择
    特征筛选:综合相关性分析与业务经验,最终选取 13 个关键特征,包括遗传因素、高压力、营养缺乏类型等。
    算法选型:采用随机森林分类器(RandomForestClassifier),该算法能有效处理非线性关系与特征交互(如遗传 + 压力的组合效应),且抗噪能力强。
#常见医疗诊断分析
plt.figure(figsize=(12, 8))
top_conditions = df['医疗状况'].value_counts().head(10)
plt.barh(top_conditions.index,top_conditions) #横向柱状图
plt.title('十大常见脱发相关医疗状况', fontsize=14)
plt.xlabel('样本数量', fontsize=12)
plt.ylabel('医疗状况', fontsize=12)
plt.tight_layout()
plt.show()

在这里插入图片描述

plt.figure(figsize=(12,8))

top8_nutrition=df['营养缺乏'].value_counts().head(8)

plt.barh(top8_nutrition.index,top8_nutrition)
plt.title('常见脱发相关营养缺乏类型', fontsize=16, pad=20)
plt.xlabel('样本数量', fontsize=14)
plt.ylabel('营养缺乏类型', fontsize=14)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)

plt.show()
  1. 模型评估与关键指标
    准确率:模型在测试集上的准确率为 53%,虽未达极高水平,但考虑到脱发诱因的复杂性(多因素交互),该结果具有参考价值。
    细分性能:
    对脱发样本(1 值)的召回率为 56%,即模型能识别约半数真实脱发案例;
    ROC 曲线下面积(AUC)为 0.62,表明模型对脱发与非脱发样本的区分能力优于随机猜测。

在这里插入图片描述

  1. 特征重要性排序
    模型显示,对脱发预测贡献最大的因素依次为:
    遗传因素(家族脱发史)
    高压力水平(压力 = High 时「高压力」特征值为 1)
    营养缺乏类型(如镁、蛋白质缺乏)
    年龄与不良护发习惯的交互作用
# 二值特征与脱发关系
features = ['遗传因素', '荷尔蒙变化', '不良护发习惯', '环境因素', '吸烟习惯', '体重减轻']

fig,axes=plt.subplots(3,2,figsize=(15,15))
axes=axes.flatten()
df['脱发标记'] = df['脱发标记'].astype('category')
categories = df['脱发标记'].cat.categories
num_categories = len(categories)
x=np.arange(num_categories)
width=0.35

for i ,feature in enumerate(features):#枚举每个特征
    if i < len(axes):
        ax=axes[i]
        #计算每个类别中1和0的数量
        counts=df.groupby('脱发标记')[feature].value_counts().unstack(fill_value=0)
        rects1=ax.bar(x-width/2,counts[0],width)
        rects1=ax.bar(x+width/2,counts[1],width)
        ax.set_title(f'{feature}与脱发')
        #ax.set_ylable('数量')
        ax.set_xticks(x)
        ax.set_xticklabels(categories)
        ax.legend(['无','有'])

plt.tight_layout()
plt.show()

四、结论与防脱建议:数据驱动的健康管理

  1. 核心发现总结
    脱发是遗传、环境、生活习惯共同作用的结果,单一因素(如单纯压力或遗传)难以完全引发脱发;
    压力管理、营养补充(尤其是镁、生物素)、改善护发习惯是预防脱发的三大核心方向;
    机器学习模型可作为脱发风险预警的辅助工具,但需结合临床诊断进一步优化(如添加激素水平等生理指标)。

在这里插入图片描述

counts
体重减轻0.01.0
脱发标记
0276226
1251246
  1. 科学防脱行动指南
    饮食干预:增加坚果(镁)、鱼类(优质蛋白)、鸡蛋(生物素)的摄入,避免单一营养素缺乏;
    压力管理:研究表明高压力人群脱发风险提升 30%,可通过冥想、有氧运动等方式调节皮质醇水平;
    护发习惯:减少高温烫发染发(「不良护发习惯」=1 时脱发概率增加 22%),选择弱酸性洗发水;
    早期筛查:若家族有脱发史(遗传因素 = 1),建议 25 岁后定期关注头皮健康,必要时咨询皮肤科医生。
# 特征相关性分析
corr_features = ['遗传因素', '荷尔蒙变化', '高压力', '不良护发习惯', '吸烟习惯', '体重减轻', '脱发标记']
corr = df[corr_features].corr()
plt.figure(figsize=(12, 8))
plt.imshow(corr, cmap='hot',interpolation='nearest',alpha=0.9)
plt.colorbar()
plt.title('脱发相关因素相关系数热力图', fontsize=14)

plt.tight_layout()
plt.show()

在这里插入图片描述

df.head()
ID遗传因素荷尔蒙变化医疗状况药物及治疗营养缺乏压力水平年龄不良护发习惯环境因素吸烟习惯体重减轻脱发标记高压力
01339921.00.0<NA><NA>Magnesium deficiencyModerate191.01.00.00.000
11483930.00.0EczemaAntibioticsMagnesium deficiencyHigh431.01.00.00.001
21550740.00.0DermatosisAntifungal CreamProtein deficiencyModerate261.01.00.01.000
31182611.01.0RingwormAntibioticsBiotin DeficiencyModerate461.01.00.00.000
41119150.00.0PsoriasisAccutaneIron deficiencyModerate300.01.01.00.010
# 缺失值处理(删除少量缺失行)
df.dropna(subset=['脱发标记', '医疗状况', '药物及治疗', '营养缺乏'], inplace=True)
# 复合变量
# 遗传因素+高压力组合
df['遗传高压力组合'] = ((df['遗传因素'] == 1) & (df['高压力'] == 1)).astype(int)
# 标签编码分类变量
label_encoders = {}
categorical_cols = ['医疗状况', '药物及治疗', '营养缺乏', '压力水平']
for col in categorical_cols:
    le = LabelEncoder()
    df[col] = le.fit_transform(df[col].astype(str))
    label_encoders[col] = le
df

五、延伸思考:数据之外的脱发管理
本次分析仍存在局限性,如样本量不足、药物治疗(如「Accutane」)与脱发的因果关系尚未完全厘清。未来可结合微生物组数据、激素检测等多维度指标,进一步提升模型预测精度,为个性化防脱方案提供更强的数据支撑。
「头发是健康的晴雨表」,从遗传因素到生活习惯,每一组数据都在诉说身体的需求。科学应对脱发,不妨从解读这些「数据密码」开始。

ID遗传因素荷尔蒙变化医疗状况药物及治疗营养缺乏压力水平年龄不良护发习惯环境因素吸烟习惯体重减轻脱发标记高压力遗传高压力组合
11483930.00.04120431.01.00.00.0010
21550740.00.03342261.01.00.01.0000
31182611.01.06102461.01.00.00.0000
41119150.00.05012300.01.01.00.0100
51396611.00.05121370.01.00.01.0100
................................................
9921818541.01.03821300.00.00.00.0100
9941843671.00.08861331.01.01.01.0100
9961432730.01.01242201.00.01.01.0100
9971691230.01.02702321.01.01.01.0100
9981271831.01.05471340.01.00.00.0100

809 rows × 15 columns

# 特征选择(部分可能部分重复,但影响不大)
features = [
    '遗传因素', '荷尔蒙变化', '医疗状况', '药物及治疗', 
    '营养缺乏', '压力水平', '年龄', '不良护发习惯', 
    '环境因素', '吸烟习惯', '体重减轻', '高压力',
    '遗传高压力组合'
]

X = df[features]
y = df['脱发标记']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.15, random_state=42, stratify=y
)
def evaluate_model(model, model_name, X_train, X_test, y_train, y_test):  #模型对象、模型名称,x训练集,y训练集,x测试集
    # 训练模型
    model.fit(X_train, y_train)
    
    # 预测
    y_pred = model.predict(X_test)
    
    # 打印分类报告
    print(f"=== {model_name} 模型评估 ===")
    print(classification_report(y_test, y_pred))#包含准确率、召回率、f1测度、支持率
    
    # 绘制混淆矩阵
    cm = confusion_matrix(y_test, y_pred) #返回混淆矩阵
    plt.figure(figsize=(8, 6))
    plt.imshow(cm,cmap='hot',interpolation='nearest')#热力图
    plt.colorbar()#视觉映射
    #添加标签
    for i in range(2):
        for j in range(2):
            plt.text(j, i, f'{cm[i, j]:.2f}', ha='center', va='center', color='black')
    plt.title(f'{model_name}模型混淆矩阵')
    plt.show()
    
    # 绘制ROC曲线
    if hasattr(model, "predict_proba"):#hasattr用于检查对象是否具有指定的属性
        y_prob = model.predict_proba(X_test)[:, 1]
    else:  # 对于SVM等没有predict_proba方法的模型
        y_prob = model.decision_function(X_test) if hasattr(model, "decision_function") else y_pred
    
    fpr, tpr, _ = roc_curve(y_test, y_prob)  #roc曲线
    roc_auc = auc(fpr, tpr) #auc面积
    
    plt.figure(figsize=(8, 6))
    plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC曲线(面积 = %0.2f)' % roc_auc)
    plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
    plt.xlabel('假阳率')
    plt.ylabel('真阳率')
    plt.title(f'{model_name}模型ROC曲线')
    plt.legend(loc="lower right")
    plt.show()
    
    return model, roc_auc
rf_model = RandomForestClassifier(random_state=15, class_weight='balanced')
rf_model, rf_auc = evaluate_model(rf_model, "随机森林", X_train, X_test, y_train, y_test)
=== 随机森林 模型评估 ===
              precision    recall  f1-score   support

           0       0.53      0.50      0.51        60
           1       0.54      0.56      0.55        62

    accuracy                           0.53       122
   macro avg       0.53      0.53      0.53       122
weighted avg       0.53      0.53      0.53       122

在这里插入图片描述

在这里插入图片描述

from sklearn.cluster import KMeans
#定义SSE列表,用来存放不同K值下的SSE:误差平方和
SSE = []
#定义候选K值
for i in range(1,10):
kmeans = KMeans(n_clusters = i,random_state = 10)
kmeans.fit(data_scaled)
SSE.append(kmeans.inertia_) # 样本到质心的距离平方和
#使用手肘法看K值
plt.plot(range(1,10),SSE,marker = ‘o’) #表示在每个K值的位置上画一个圆形标记。
plt.show()
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值