• 使用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看作没有病,其余看作有病。

    代码如下:

    1. import pandas as pd
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. data = pd.read_csv("心脏病数据.csv", header=None) # 读取csv文件,并存入data,不带标签
    5. # 修改列标签
    6. name = ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach',
    7. 'exang', 'oldpeak', 'slope', 'ca', 'thal', 'target']
    8. data.columns = name
    9. pd.set_option('expand_frame_repr', False) # 打印输出 dataframe 时不隐藏部分列
    10. print(data) # 输出一下看看
    11. xinzang = [] # 储存有心脏病人群
    12. danguchun_Up = [] # 储存胆固醇高人群
    13. danguchun_Down = [] # 储存胆固醇低人群
    14. age = [] # 心脏病患者的年龄
    15. dan = [] # 心脏病患者的胆固醇
    16. c = -1 # 心脏病数组标记
    17. for row in data.itertuples(): # 行遍历 data
    18. if getattr(row, 'target') != 0: # 如果有心脏病
    19. c = c + 1 # 标记 +1
    20. xinzang.append([])
    21. age.append(row[1]) # 单独获得心脏病患者的年龄,方便统计
    22. dan.append(row[5]) # 单独获得心脏病患者的胆固醇,方便统计
    23. for i in row: # 将该行添加进数组 xinzang 中
    24. xinzang[c].append(i)
    25. if getattr(row, 'chol') > 200: # 如果胆固醇高
    26. danguchun_Up.append(row[1]) # 单独获得胆固醇高的年龄,方便统计
    27. else: # 否则,胆固醇合格
    28. danguchun_Down.append(row[1]) # 单独获得心胆固醇合格的年龄,方便统计
    29. # if row[12] == '?' or row[13] == '?': #去掉有缺省数据,便于计算
    30. # data = data.drop(row[0], axis=0)
    31. # print(data) # 输出一下看看
    32. print("统计心脏病患者的年龄,得出:")
    33. print("平均数为:\t", np.mean(age))
    34. print("中位数为:\t", np.median(age))
    35. c = np.bincount(age)
    36. print("众数为:\t\t", np.argmax(c)) # 只适用于非负数集合
    37. print("可得58岁左右是心脏病高发年龄段。")
    38. print("=================================================")
    39. print("统计样本胆固醇状况,得出:")
    40. c = np.percentile(danguchun_Up, 25, interpolation='linear')
    41. d = np.percentile(danguchun_Up, 75, interpolation='linear')
    42. print('胆固醇不合格的人,年龄大多集中在:', c, '~', d, '之间')
    43. c = np.percentile(danguchun_Down, 25, interpolation='linear')
    44. d = np.percentile(danguchun_Down, 75, interpolation='linear')
    45. print('胆固醇合格的人,年龄大多集中在:', c, '~', d, '之间')
    46. print("可得随着年龄的增大,胆固醇不合格的人数也在增加。")
    47. print("=================================================")
    48. print("统计心脏病患者胆固醇状况,得出:")
    49. print("极差为:", max(dan) - min(dan))
    50. c = np.percentile(dan, 25, interpolation='linear')
    51. d = np.percentile(dan, 75, interpolation='linear')
    52. print("四分位极差为:", d - c)
    53. plt.figure(1)
    54. # 绘制箱型图
    55. flierprops = {'marker': 'o', 'markerfacecolor': 'red', 'color': 'black'}
    56. plt.grid(True, linestyle="-.", color="black", linewidth="0.4")
    57. plt.boxplot(dan, notch=False, flierprops=flierprops)
    58. print("可得心脏病患者的胆固醇高低差异较大,但仅仅考虑中间50%的数值,其差异会大大减少。")
    59. print("=================================================")
    60. plt.figure(2)
    61. # 绘制正态分布曲线
    62. x = np.arange(140, 410, 0.1) # x轴取值范围
    63. c = np.mean(dan) # 平均数
    64. d = np.std(dan) # 标准差
    65. y = np.exp(-((x - c) ** 2) / (2 * d ** 2)) / (d * np.sqrt(2 * np.pi)) # 正态分布曲线
    66. plt.plot(x, y)
    67. # 绘制数据集的正态分布曲线
    68. # 绘制直方图
    69. plt.hist(dan, bins=15, rwidth=0.9, density=True)
    70. print('心脏病患者的胆固醇:')
    71. print("平均数为:\t", c)
    72. print("中位数为:\t", np.median(dan))
    73. x = np.bincount(dan)
    74. print("众数为:\t\t", np.argmax(x)) # 只适用于非负数集合
    75. print('SK1为:\t', (c - np.argmax(x)) / d) # sk1 = (x-mo)/s
    76. print('SK2为:\t', 3 * (c - np.median(dan)) / d) # sk2 = 3(x-md)/s
    77. dan = pd.Series(dan) # 用于使用 pd
    78. print('直接用pd进行偏度计算:', dan.skew()) # 直接用pd进行偏度计算
    79. print('直接用pd进行峰度计算', dan.kurt()) # 直接用pd进行峰度计算
    80. print('由图可以看出心脏病患者的胆固醇满足正态分布。')
    81. print('任意两个变量之间的相关系数如下:')
    82. print(data.corr())
    83. print('可以看出 oldpeak ,cp ,exang ,slope 对确诊心脏病作用大')
    84. plt.show()

    结果示例:

    1. age sex cp trestbps chol fbs restecg thalach exang oldpeak slope ca thal target
    2. 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
    3. 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
    4. 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
    5. 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
    6. 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
    7. .. ... ... ... ... ... ... ... ... ... ... ... ... ... ...
    8. 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
    9. 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
    10. 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
    11. 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
    12. 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
    13. [303 rows x 14 columns]
    14. 统计心脏病患者的年龄,得出:
    15. 平均数为: 56.62589928057554
    16. 中位数为: 58.0
    17. 众数为: 58
    18. 可得58岁左右是心脏病高发年龄段。
    19. =================================================
    20. 统计样本胆固醇状况,得出:
    21. 胆固醇不合格的人,年龄大多集中在: 49.0 ~ 61.0 之间
    22. 胆固醇合格的人,年龄大多集中在: 43.25 ~ 59.0 之间
    23. 可得随着年龄的增大,胆固醇不合格的人数也在增加。
    24. =================================================
    25. 统计心脏病患者胆固醇状况,得出:
    26. 极差为: 278.0
    27. 四分位极差为: 66.0
    28. 可得心脏病患者的胆固醇高低差异较大,但仅仅考虑中间50%的数值,其差异会大大减少。
    29. =================================================
    30. 心脏病患者的胆固醇:
    31. 平均数为: 251.4748201438849
    32. 中位数为: 249.0
    33. 众数为: 212
    34. SK1为: 0.8005682075420549
    35. SK2为: 0.15057160382420312
    36. 直接用pd进行偏度计算: 0.29911265898713263
    37. 直接用pd进行峰度计算 0.34124961868724313
    38. 中位数为: 58.0
    39. 由图可以看出心脏病患者的胆固醇满足正态分布。
    40. 任意两个变量之间的相关系数如下:
    41. age sex cp trestbps chol fbs restecg thalach exang oldpeak slope target
    42. 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
    43. 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
    44. 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
    45. 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
    46. 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
    47. 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
    48. 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
    49. 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
    50. 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
    51. 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
    52. 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
    53. 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
    54. 可以看出 oldpeak ,cp ,exang ,slope 对确诊心脏病作用大
    55. 进程已结束,退出代码为 0

  • 相关阅读:
    OLED根据数据手册显示一条直线
    静态代码块和代码块的执行顺序解说
    使用navicat查看类型颜色
    C# in a Nutshell 系列(3)C#语言基础
    使用vxe-table 制作编辑表格
    决策树,sql考题,30个经典sql题目
    设0<c<1,a1=c/2,a(n+1)=c/2+an²/2,证明数列an收敛,并求其极限
    Qt for Android实现开机自启动
    力扣26:删除有序数组中的重复项
    es操作入门到高级
  • 原文地址:https://blog.csdn.net/weixin_58196051/article/details/126788079