文章目錄
- 1 前言
- 1 課題背景
- 2 數據處理
- 3 數據可視化
- 4 最后
1 前言
🔥 優質競賽項目系列,今天要分享的是
🚩 基于大數據的心血管疾病分析
該項目較為新穎,適合作為競賽課題方向,學長非常推薦!
🥇學長這里給一個題目綜合評分(每項滿分5分)
- 難度系數:3分
- 工作量:3分
- 創新點:4分
🧿 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate
1 課題背景
本項目的任務是利用患者的檢查結果預測心血管疾病(CVD)的存在與否。
2 數據處理
數據集包括年齡、性別、收縮壓、舒張壓等12個特征的患者數據記錄7萬份。
當患者有心血管疾病時,目標類“cardio”等于1,如果患者健康,則為0。
數據描述
有三種類型的輸入特征:
- Objective: 客觀事實;
- Examination: 體檢檢查結果;
- Subjective: 病人提供的信息
數據信息概覽
?
import numpy as npimport pandas as pdimport seaborn as snsfrom matplotlib import pyplot as pltimport osdf.head()
變量分析
?
df.info()
所有特征都是數字,12個整數和1個小數(權值)。第二列告訴我們數據集有多大,每個字段有多少非空值。
我們可以使用’ describe() ‘來顯示每個屬性的樣本統計信息,比如’ min ‘、’ max ‘、’ mean ‘、’ std ':
評論
?
df.describe()
年齡以天為單位,身高以厘米為單位。
讓我們看看數值變量以及它們是如何在目標類中分布的。
例如,什么年齡患有心血管疾病的人數超過沒有心血管疾病的人數?
3 數據可視化
?
from matplotlib import rcParams
rcParams['figure.figsize'] = 11, 8
df['years'] = (df['age'] / 365).round().astype('int')
sns.countplot(x='years', hue='cardio', data = df, palette="Set2");
可以觀察到55歲以上的人更容易得心血管疾病的。
從上面的表格中,我們可以看到ap_hi, ap_lo, weight 和height中有異常值。我們以后再處理。
讓我們看看數據集中的分類變量及其分布:
?
df_categorical = df.loc[:,['cholesterol','gluc', 'smoke', 'alco', 'active']]
sns.countplot(x="variable", hue="value",data= pd.melt(df_categorical));
?
?
df_long = pd.melt(df, id_vars=['cardio'], value_vars=['cholesterol','gluc', 'smoke', 'alco', 'active'])
sns.catplot(x="variable", hue="value", col="cardio",data=df_long, kind="count");
可以清楚地看到,CVD患者的膽固醇和血糖水平較高。而且一般來說不太活躍,運動少。
為了計算“1”在性別欄中代表女性還是男性,讓我們計算每個性別的身高平均值。我們假設男人平均比女人高。
?
corr = df.corr()
cmap = sns.diverging_palette(220, 10, as_cmap=True)
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True# 設置matplotlib圖
f, ax = plt.subplots(figsize=(11, 9))
# 畫出熱圖,并校正長寬比
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot = True,square=True, linewidths=.5, cbar_kws={"shrink": .5});
我們可以看到年齡和膽固醇有顯著的影響,但與目標階層的相關性不是很高。
.
讓我們創建violinplot來顯示不同性別的身高分布。
查看每個性別特征值的身高和體重的平均值可能不足以決定1是男性還是女性。
?
import warnings
warnings.filterwarnings("ignore")
df_melt = pd.melt(frame=df, value_vars=['height'], id_vars=['gender'])
plt.figure(figsize=(12, 10))
ax = sns.violinplot(x='variable', y='value', hue='gender', split=True, data=df_melt, scale='count',scale_hue=False,palette="Set2");
讓我們創造一個新的特征-身體質量指數(BMI):
比較健康人的平均BMI和病人的平均BMI。正常的BMI值在18.5到25之間。
?
df['BMI'] = df['weight']/((df['height']/100)**2)
sns.catplot(x="gender", y="BMI", hue="alco", col="cardio", data=df, color = "yellow",kind="box", height=10, aspect=.7);
根據女性的BMI,喝酒的女性比喝酒的男性有更高的心血管疾病風險。
4 最后
🧿 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate