这是数据集,关于数据集的描述:
# Timestamp 受访时间 # Gender 受访者性别 # Country 受访者居住的国家 # Occupation 受访者的职业 # self_employed 受访者是否为自雇人士? # family_history 受访者的家庭中是否有精神健康障碍史? # treatment 受访者是否接受过心理健康问题的治疗? # Days_Indoors 受访者每周待在室内的估计天数。 # Growing_Stress 受访者当前感受到的压力程度 # Changes_Habits 受访者的睡眠习惯或模式有任何变化吗? # Mental_Health_History 受访者以前是否有精神健康障碍史? # Mood_Swings 受访者是否经历过突然的情绪波动? # Coping_Struggles 受访者在应对压力或压力方面有困难吗? # Work_Interest 受访者对工作的兴趣和积极性 # Social_Weakness 受访者是否觉得很难进行社交互动或维持关系? # mental_health_interview 受访者是否愿意接受心理健康访谈? # care_options 受访者是否意识到或正在使用心理保健方案?
问题描述 # 心理健康与个人特征的关系:通过分析性别、职业、是否自雇等个人特征与心理健康指标(如压力、抑郁、焦虑等)之间的关系,探究不同人群在心理健康上的差异和共性。 # 家庭背景与心理健康的关联:研究家庭精神健康史与个体心理健康状况之间的联系,探讨家庭因素对心理健康的影响。 # 心理健康治疗的接受情况:调查受访者是否接受过心理健康治疗与其它变量之间的关系,如家庭背景、个人特征、压力水平等,从而了解心理健康服务利用的情况及影响因素。
data = pd.read_csv("Mental Health Dataset.csv")
pd.set_option("display.max_columns",100)
# print(data.head(5))
# 读取数据后我们进行数据的预处理
# 首先查看其是否有缺失值
print(data.isnull().sum())
# self_employed 5202 我们可以看出这一行有5202个缺失值 有缺失值我们看其缺失值比例占整个数据集的比例
print("缺失值比例:",data["self_employed"].isnull().sum()/len(data)*100)
# 缺失值比例 1.7792888317303086 我们可以看到缺失值的比例占比并不高
print(data.info())
# self_employed属于标称属性,所以这里填充缺失值我们用众数(出现次数最多的)来填充,其实我感觉占比不高完全可以删除,但是这样会破坏其他列数据的完整性
data['self_employed'] = data['self_employed'].fillna(data['self_employed'].mode()[0])
# 还有我们从数据集中可以看到Timestamp是日期与时间,与我们的问题无任何关系,那我们将其删除即可
data = data.drop('Timestamp', axis=1)
# print(data.info()) # 处理后的数据没有了缺失值
之后我们通过图示来分析第一个问题:
gender_stress_data = pd.crosstab(data['Gender'], data['Growing_Stress'])
gender_stress_data.loc['Total'] = gender_stress_data.sum(axis=0)
gender_stress_data.plot(kind='bar', stacked=True, colormap='viridis', figsize=(10, 6))
plt.title("性别与是否有压力的关系图")
plt.xlabel("性别")
plt.ylabel("是否有压力")
# plt.show()
occupation_stress = pd.crosstab(data['Occupation'], data['Growing_Stress'])
occupation_stress.loc['Total'] = occupation_stress.sum(axis=0)
occupation_stress.plot(kind='bar', stacked=True, colormap='viridis', figsize=(10, 6))
plt.title("职业与是否有压力的关系图")
plt.xlabel("职业")
plt.ylabel("是否有压力")
# plt.show()
self_employed_stress = pd.crosstab(data['self_employed'], data['Growing_Stress'])
self_employed_stress.loc['Total'] = self_employed_stress.sum(axis=0)
self_employed_stress.plot(kind='bar', stacked=True, colormap='viridis', figsize=(10, 6))
plt.title("自雇人员与是否有压力的关系图")
plt.xlabel("是否为自雇人员")
plt.ylabel("是否有压力")
# plt.show()
之后我们分析第二个问题:
plt.figure(figsize=(10,6))
ax = sns.histplot(x='family_history',y='treatment',data=data,color='red')
plt.title("家庭精神健康史与个体心理健康状况之间的联系")
# plt.show()
最后一个问题:
# 心理健康治疗的接受情况:调查受访者是否接受过心理健康治疗与其它变量之间的关系,如家庭背景、个人特征、压力水平等,从而了解心理健康服务利用的情况及影响因素
le = LabelEncoder()
columns = ['family_history','Gender','Growing_Stress','treatment']
for i in columns:
data[i] = le.fit_transform(data[i])
X = data[['family_history','Gender','Growing_Stress']]
y = data['treatment']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
model = RandomForestClassifier(n_estimators=100,random_state=42)
model.fit(X_train,y_train)
feature_importance = model.feature_importances_
feature = X.columns
sort_index = feature_importance.argsort()
plt.figure(figsize=(12, 6))
plt.barh(range(len(sort_index)), feature_importance[sort_index])
plt.yticks(range(len(sort_index)), [feature[i] for i in sort_index])
plt.xlabel('特征重要性')
plt.title('特征重要性分析')
plt.show()
由此我们可以看出家庭的影响对人心理健康的影响较大