使用Python以UCI心脏病数据集为例,进行数据简单分析

本文章包含以下内容:

        以UCI心脏病数据集为例,进行数据简单分析:

  1. 求心脏病患者年龄的平均值、中位数和众数,从结果里分析年龄与心脏病的关系;
  2. 胆固醇正常值是0-200mg/dL,区分胆固醇不合格和不合格人员,用百分位数分析年龄和胆固醇的关系(哪个年龄段胆固醇不合格的多,对比两组进行分析)  
  3. 求心脏病患者的胆固醇极差和四分位极差,并分析结果说明的问题
  4. 分析心脏病患者的胆固醇是否满足正太分布?
  5. 用相关系数或卡方计算12个属性和得心脏病的相关性,分析哪些因素对确诊心脏病作用大。

数据集:uci心脏病数据集子集

数据子集下载

数据属性说明:

age: 该朋友的年龄

sex: 该朋友的性别 (1 = 男性, 0 = 女性)

cp: 经历过的胸痛类型(值1:典型心绞痛,值2:非典型性心绞痛,值3:非心绞痛,值4:无症状)

trestbps: 该朋友的静息血压(入院时的毫米汞柱)

chol: 该朋友的胆固醇测量值,单位 :mg/dl

fbs: 人的空腹血糖(> 120 mg/dl,1=真;0=假)

restecg: 静息心电图测量(0=正常,1=患有ST-T波异常,2=根据Estes的标准显示可能或确定的左心室肥大)

thalach: 这朋友达到的最大心率

exang: 运动引起的心绞痛(1=有过;0=没有)

oldpeak: ST抑制,由运动引起的相对于休息引起的(“ ST”与ECG图上的位置有关。)

slope: 最高运动ST段的斜率(值1:上坡,值2:平坦,值3:下坡)

ca: 萤光显色的主要血管数目(0-4)

thal: 一种称为地中海贫血的血液疾病(3=正常;6=固定缺陷;7=可逆缺陷)

target: 心脏病(0=否,1=是)

心脏病数据有一定问题,这里将0看作没有病,其余看作有病。

代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv("心脏病数据.csv", header=None)  # 读取csv文件,并存入data,不带标签
# 修改列标签
name = ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach',
        'exang', 'oldpeak', 'slope', 'ca', 'thal', 'target']
data.columns = name
pd.set_option('expand_frame_repr', False)  # 打印输出 dataframe 时不隐藏部分列
print(data)  # 输出一下看看
xinzang = []  # 储存有心脏病人群
danguchun_Up = []  # 储存胆固醇高人群
danguchun_Down = []  # 储存胆固醇低人群
age = []  # 心脏病患者的年龄
dan = []  # 心脏病患者的胆固醇
c = -1  # 心脏病数组标记
for row in data.itertuples():  # 行遍历 data
    if getattr(row, 'target') != 0:  # 如果有心脏病
        c = c + 1  # 标记 +1
        xinzang.append([])
        age.append(row[1])  # 单独获得心脏病患者的年龄,方便统计
        dan.append(row[5])  # 单独获得心脏病患者的胆固醇,方便统计
        for i in row:  # 将该行添加进数组 xinzang 中
            xinzang[c].append(i)
    if getattr(row, 'chol') > 200:  # 如果胆固醇高
        danguchun_Up.append(row[1])  # 单独获得胆固醇高的年龄,方便统计
    else:  # 否则,胆固醇合格
        danguchun_Down.append(row[1])  # 单独获得心胆固醇合格的年龄,方便统计
    # if row[12] == '?' or row[13] == '?':    #去掉有缺省数据,便于计算
    #     data = data.drop(row[0], axis=0)
# print(data)  # 输出一下看看
print("统计心脏病患者的年龄,得出:")
print("平均数为:\t", np.mean(age))
print("中位数为:\t", np.median(age))
c = np.bincount(age)
print("众数为:\t\t", np.argmax(c))  # 只适用于非负数集合
print("可得58岁左右是心脏病高发年龄段。")
print("=================================================")
print("统计样本胆固醇状况,得出:")
c = np.percentile(danguchun_Up, 25, interpolation='linear')
d = np.percentile(danguchun_Up, 75, interpolation='linear')
print('胆固醇不合格的人,年龄大多集中在:', c, '~', d, '之间')
c = np.percentile(danguchun_Down, 25, interpolation='linear')
d = np.percentile(danguchun_Down, 75, interpolation='linear')
print('胆固醇合格的人,年龄大多集中在:', c, '~', d, '之间')
print("可得随着年龄的增大,胆固醇不合格的人数也在增加。")
print("=================================================")
print("统计心脏病患者胆固醇状况,得出:")
print("极差为:", max(dan) - min(dan))
c = np.percentile(dan, 25, interpolation='linear')
d = np.percentile(dan, 75, interpolation='linear')
print("四分位极差为:", d - c)
plt.figure(1)
# 绘制箱型图
flierprops = {'marker': 'o', 'markerfacecolor': 'red', 'color': 'black'}
plt.grid(True, linestyle="-.", color="black", linewidth="0.4")
plt.boxplot(dan, notch=False, flierprops=flierprops)
print("可得心脏病患者的胆固醇高低差异较大,但仅仅考虑中间50%的数值,其差异会大大减少。")

print("=================================================")
plt.figure(2)
# 绘制正态分布曲线
x = np.arange(140, 410, 0.1)  # x轴取值范围
c = np.mean(dan)  # 平均数
d = np.std(dan)  # 标准差
y = np.exp(-((x - c) ** 2) / (2 * d ** 2)) / (d * np.sqrt(2 * np.pi))  # 正态分布曲线
plt.plot(x, y)
# 绘制数据集的正态分布曲线
# 绘制直方图
plt.hist(dan, bins=15, rwidth=0.9, density=True)
print('心脏病患者的胆固醇:')
print("平均数为:\t", c)
print("中位数为:\t", np.median(dan))
x = np.bincount(dan)
print("众数为:\t\t", np.argmax(x))  # 只适用于非负数集合
print('SK1为:\t', (c - np.argmax(x)) / d)  # sk1 =  (x-mo)/s
print('SK2为:\t', 3 * (c - np.median(dan)) / d)  # sk2 = 3(x-md)/s
dan = pd.Series(dan)  # 用于使用 pd
print('直接用pd进行偏度计算:', dan.skew())  # 直接用pd进行偏度计算
print('直接用pd进行峰度计算', dan.kurt())  # 直接用pd进行峰度计算
print('由图可以看出心脏病患者的胆固醇满足正态分布。')
print('任意两个变量之间的相关系数如下:')
print(data.corr())
print('可以看出 oldpeak ,cp  ,exang ,slope 对确诊心脏病作用大')
plt.show()

结果示例:

      age  sex   cp  trestbps   chol  fbs  restecg  thalach  exang  oldpeak  slope   ca thal  target
0    63.0  1.0  1.0     145.0  233.0  1.0      2.0    150.0    0.0      2.3    3.0  0.0  6.0       0
1    67.0  1.0  4.0     160.0  286.0  0.0      2.0    108.0    1.0      1.5    2.0  3.0  3.0       2
2    67.0  1.0  4.0     120.0  229.0  0.0      2.0    129.0    1.0      2.6    2.0  2.0  7.0       1
3    37.0  1.0  3.0     130.0  250.0  0.0      0.0    187.0    0.0      3.5    3.0  0.0  3.0       0
4    41.0  0.0  2.0     130.0  204.0  0.0      2.0    172.0    0.0      1.4    1.0  0.0  3.0       0
..    ...  ...  ...       ...    ...  ...      ...      ...    ...      ...    ...  ...  ...     ...
298  45.0  1.0  1.0     110.0  264.0  0.0      0.0    132.0    0.0      1.2    2.0  0.0  7.0       1
299  68.0  1.0  4.0     144.0  193.0  1.0      0.0    141.0    0.0      3.4    2.0  2.0  7.0       2
300  57.0  1.0  4.0     130.0  131.0  0.0      0.0    115.0    1.0      1.2    2.0  1.0  7.0       3
301  57.0  0.0  2.0     130.0  236.0  0.0      2.0    174.0    0.0      0.0    2.0  1.0  3.0       1
302  38.0  1.0  3.0     138.0  175.0  0.0      0.0    173.0    0.0      0.0    1.0    ?  3.0       0

[303 rows x 14 columns]
统计心脏病患者的年龄,得出:
平均数为:	 56.62589928057554
中位数为:	 58.0
众数为:		 58
可得58岁左右是心脏病高发年龄段。
=================================================
统计样本胆固醇状况,得出:
胆固醇不合格的人,年龄大多集中在: 49.0 ~ 61.0 之间
胆固醇合格的人,年龄大多集中在: 43.25 ~ 59.0 之间
可得随着年龄的增大,胆固醇不合格的人数也在增加。
=================================================
统计心脏病患者胆固醇状况,得出:
极差为: 278.0
四分位极差为: 66.0
可得心脏病患者的胆固醇高低差异较大,但仅仅考虑中间50%的数值,其差异会大大减少。
=================================================
心脏病患者的胆固醇:
平均数为:	 251.4748201438849
中位数为:	 249.0
众数为:		 212
SK1为:	 0.8005682075420549
SK2为:	 0.15057160382420312
直接用pd进行偏度计算: 0.29911265898713263
直接用pd进行峰度计算 0.34124961868724313
中位数为:	 58.0
由图可以看出心脏病患者的胆固醇满足正态分布。
任意两个变量之间的相关系数如下:
               age       sex        cp  trestbps      chol       fbs   restecg   thalach     exang   oldpeak     slope    target
age       1.000000 -0.097542  0.104139  0.284946  0.208950  0.118530  0.148868 -0.393806  0.091661  0.203805  0.161770  0.222853
sex      -0.097542  1.000000  0.010084 -0.064456 -0.199915  0.047862  0.021647 -0.048663  0.146201  0.102173  0.037533  0.224469
cp        0.104139  0.010084  1.000000 -0.036077  0.072319 -0.039975  0.067505 -0.334422  0.384060  0.202277  0.152050  0.407075
trestbps  0.284946 -0.064456 -0.036077  1.000000  0.130120  0.175340  0.146560 -0.045351  0.064762  0.189171  0.117382  0.157754
chol      0.208950 -0.199915  0.072319  0.130120  1.000000  0.009841  0.171043 -0.003432  0.061310  0.046564 -0.004062  0.070909
fbs       0.118530  0.047862 -0.039975  0.175340  0.009841  1.000000  0.069564 -0.007854  0.025665  0.005747  0.059894  0.059186
restecg   0.148868  0.021647  0.067505  0.146560  0.171043  0.069564  1.000000 -0.083389  0.084867  0.114133  0.133946  0.183696
thalach  -0.393806 -0.048663 -0.334422 -0.045351 -0.003432 -0.007854 -0.083389  1.000000 -0.378103 -0.343085 -0.385601 -0.415040
exang     0.091661  0.146201  0.384060  0.064762  0.061310  0.025665  0.084867 -0.378103  1.000000  0.288223  0.257748  0.397057
oldpeak   0.203805  0.102173  0.202277  0.189171  0.046564  0.005747  0.114133 -0.343085  0.288223  1.000000  0.577537  0.504092
slope     0.161770  0.037533  0.152050  0.117382 -0.004062  0.059894  0.133946 -0.385601  0.257748  0.577537  1.000000  0.377957
target    0.222853  0.224469  0.407075  0.157754  0.070909  0.059186  0.183696 -0.415040  0.397057  0.504092  0.377957  1.000000
可以看出 oldpeak ,cp  ,exang ,slope 对确诊心脏病作用大

进程已结束,退出代码为 0

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年6月21日
下一篇 2023年6月21日

相关推荐