使用Pandas进行数据进行结构化数据的分析。
1. 文本数据的正则化
原始的数据如下图左,数据列名的格式比较复杂,可以看出有四种情况:
* 英文+\n+中文
* 英文+\u2028+中文
* 英文+\n+英文
* 英文
需要稍微进行一下处理便于后面的分析,有中文的保留中文部分,'ALF\nALF'变成'ALF','PVD'保持不变。主要使用正则表达式进行匹配。修改后的内容如下图右。
!pip install regex
## 导入需要的库
import regex as re
## 原始列名列表
col_names=list(data.columns)
col=[]
for i in range(len(col_names)):
if re.findall(r"\u2028(.+)",col_names[i])!=[]:
col.append(re.findall(r"\u2028(.+)",col_names[i])[0])
elif re.findall(r"\n(.+)",col_names[i])!=[]:
col.append(re.findall(r"\n(.+)",col_names[i])[0])
else:
col.append(col_names[i])
## 处理后的列名列表
col
2. 数据预处理 - 去除缺省值
## 删除缺失值
data=data.dropna(axis=0,how='any') ##axis=0表示行,axis=1表示列
## 再次查看
data.info()
3. 数据可视化
3.1 绘制散点图
对于不同的ALF针对好胆固醇和坏胆固醇绘制散点图
## 绘制散点图
plt.scatter(data[data.ALF==0]['好胆固醇'],data[data.ALF==0]['坏胆固醇'],label='ALF=0') ##ALF=0
plt.scatter(data[data.ALF==1]['好胆固醇'],data[data.ALF==1]['坏胆固醇'],label='ALF=1') ##ALF=1
plt.xlabel('好胆固醇') ##横轴标签
plt.ylabel('坏胆固醇') ##纵轴标签
plt.legend() ##图例
plt.show() ##展示
3.2 绘制条形图
频率统计。
data['区域'].value_counts()
为了绘制并列条形图,需要先将DataFrame中的数据提取出来,x表示横坐标,共4类,分别标记为1,2,3,4,y1表示ALF=0的各个区域人数,y2表示ALF=1的各个区域人数。
## 导入需要的库
import numpy as np
## 提取数据
x=np.array([1,2,3,4])
y1=[]
y2=[]
for i in data['区域'].unique():
y1.append(data[(data['ALF']==0) & (data['区域']==i)]['区域'].count())
y2.append(data[(data['ALF']==1) & (data['区域']==i)]['区域'].count())
## 绘制并列条形图
plt.bar(x,y1,width=0.3,label="ALF=0")
plt.bar(x+0.3,y2,width=0.3,label="ALF=1") #x+0.3相当于把每个柱子右移0.3
plt.xlabel('区域')
plt.ylabel('人数')
plt.xticks(x+0.15,data['区域'].unique())
plt.legend()
3.3 绘制直方图
## ALF=0
plt.hist(data[data.ALF==0]['体重指数'])
plt.show()
## ALF=1
plt.hist(data[data.ALF==1]['体重指数'])
plt.show()
3.4 箱形图
plt.boxplot([data[data.ALF==0]['总胆固醇'],data[data.ALF==1]['总胆固醇']],labels=[0,1])
plt.xlabel('ALF')
plt.ylabel('总胆固醇')
plt.show()
3.5 饼图
plt.pie(data['性别'].value_counts(),labels=['M','F'],autopct='%1.2f%%')
plt.show()
4. 常见统计信息
4.1 频数、均值、方差、分位数、最小值、最大值
## 查看总体信息
data.describe()
## 查看某个特征的相关统计信息
data['年龄'].describe()
## 偏度
data['年龄'].skew()
## 查看ALF的频率
data['ALF'].value_counts()
## 按ALF分组后查看基本信息
data.groupby('ALF').describe().unstack()
## 只查看某个变量的某个统计量
data.groupby('ALF')['年龄'].mean() ##此处可改成count/median/min/max/std/quantile等等
## 生成列联表
pd.crosstab(data['ALF'],data['区域'],margins=True)
可以支持的统计量如下:
5. 变量相关分析
## 计算相关系数
corrmat=data.corr()
corrmat
## 绘制相关系数图
cov = data.corr()
plt.figure(figsize=(15,10))
img = plt.matshow(cov,cmap=plt.cm.winter,fignum=0)
plt.colorbar(img, ticks=[-1,0,1])
plt.xticks(np.arange(len(data.keys())), data.keys(),rotation='90')
plt.yticks(np.arange(len(data.keys())), data.keys())
plt.show()
## 提取与ALF的相关系数的绝对值最大的前10个特征
k=10
cols = corrmat.nlargest(k, 'ALF')['ALF'].index
cols
## 散点图判断多变量之间的关系
col=['年龄','身高','体重指数','最高血压','总胆固醇'] ##指定变量
_ = pd.plotting.scatter_matrix(data[col],figsize=(15,10),
diagonal='kde', ##可选'hist'或'kde'
alpha = 0.8,
range_padding=0.1)