2020-10-06结构化数据的探索性分析

使用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)

可以支持的统计量如下:

Image Name

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)

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值