脫發因素機器學習數據分析

脫發因素機器學習數據分析

一、背景描述

隨著年齡增長,脫發成為影響外貌與健康的重要問題。

本數據集包含遺傳、荷爾蒙變化、醫療狀況、藥物治療、營養缺乏、心理壓力等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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85077.shtml
英文地址,請注明出處:http://en.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;當被觀察對象狀態發生變化時主動對外發起廣播&…