以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