第十三周数据预处理实验

  1. 实验任务
  1. 准备工作
    1. 学习数据预处理描述性分析的内容
    2. 在学习通下载文件“insurance.csv”和“doc_sim.csv”

  1. 实验内容

任务1:导入文件“insurance.csv”,只选取“age”“bmi”“children”“charges”四列属性。

导入文件并查看信息:

提取“age”“bmi”“children”“charges”四列属性组成新的二维表:

 

任务2:分别计算四列数据的均值、中位数、众数、极差、方差、标准差和上四分位数。

代码:

运行结果:

 

任务3:作出四列数据的直方图和箱线图,以及三张散点图(以charges为因变量,age,bmi,children为自变量)。要求:柱状颜色为蓝色,有清楚明了的标题(如age频数直方图)和横纵轴标签(如区间、频数等),用黑体显示中文,正常显示负号,透明度为0.7。

代码:

import matplotlib.pyplot as plt

import matplotlib

# 做出直方图

# ege频数直方图

square = ['age频数直方图','bmi频数直方图','children频数直方图','charges频数直方图']

sccar= ['age与charges散点图','bmi与charges散点图','children与charges散点图']

box= ['agebox','bmibox','childrenbox','chargesbox']

for i in range(4):

    df_age = pd2.iloc[:,i]

    matplotlib.rcParams['font.sans-serif']=['simHei']

    matplotlib.rcParams['axes.unicode_minus']=False

    plt.hist(df_age,bins=40,facecolor='blue',edgecolor='black',alpha=0.7)

    plt.xlabel('区间')

    plt.ylabel('频数')

    plt.title(square[i])

    plt.show()

    pd2.iloc[:,i].plot.box(title=box[i])

    plt.grid(linestyle='--', alpha=0.7)

    plt.show()

for i in range(3):

    plt.scatter(pd2.iloc[:,i],pd2.iloc[:,3])

    plt.title(sccar[i])

plt.show()

运行结果:

  1. 四个直方图:

  1. 四个箱线图:

  1. 三个散点图:

任务4导入文件“doc_sim.csv”,计算3条数据对象之间的余弦相似性和欧几里得距离,并生成相应的相似性矩阵和相异性矩阵。

余弦相似度是通过衡量两个向量夹角余弦值来评估其相似度,而对于数据而言,每一条数据对象都可看做是两个向量,那么在探究数据对象之间的余弦相似性就可以归结到探究两两向量之间余弦值大小的问题。

例如:A=[A1,A2,A3,...,An],B=[B1,B2,...Bn]。这两个向量都是从原点出发,指向各自的方向,倘若两条线段之间的夹角为0度,则余弦值为1,两个数据对象的余弦相似性为1;倘若夹角为90度,说明两个向量正交;倘若夹角为180度,说明两个向量方向完全相反,那么对应余弦值范围在[-1,1]之间,根据余弦相似度可以归一化到[0,1]区间内,余弦相似度的绝对值越趋近于1,说明数据对象的相似度越高。

代码:

# 计算余弦相似度

# 定义计算余弦相似度的函数

def cosine_similarity(x, y):

    x=np.array(x)

    y=np.array(y)

    num = np.dot(x,y)

    denom = np.linalg.norm(x) * np.linalg.norm(y)

    return num / denom

# 定义计算欧式距离的函数

def dist(x,y):

    x = np.array(x)

    y = np.array(y)

    dist1 = np.linalg.norm(x-y)

    return dist1

for i in range(2):

    for j in range(i+1,3):

        cos=cosine_similarity(pd3.iloc[i,:],pd3.iloc[j,:])

        print("{0}和{1}的余弦相似度为{2}".format(i,j,cos))

        dist2= dist(pd3.iloc[i,:],pd3.iloc[j,:])

        print("{0}和{1}的欧几里得距离为{2}".format(i, j,dist2))

其中,在计算余弦相似度函数以及欧式距离时,我是先定义了两个函数。调用函数的双层嵌套循环中。由于数据对象有三条,按行标号为0,1,2。则计算0和1,0和2,1和2的相似度与相异度。那么,从第1个循环开始,i=0,j=i+1=1,传入参数第0行和第1行数据对象,调用定义的求余弦相似度的函数,将参数传递并数组化,用numpy中的dot函数计算向量乘积,再分别用linalg.norm()函数计算范数。返回计算的余弦结果。

同理,调用求欧式距离的函数,也就是范数函数np.linalg.norm()计算向量间每两个元素差值的平方和再开方。返回计算结果。

运行结果:

  1. 实验总结

1.知识总结

实验中你学习到的知识和方法

1、pandas中的df.mean()函数和numpy中mean()函数的区别:

pandas中的df.mean()函数默认等价于df.mean(0),即按轴方向求平均,得到每列数据的平均值。

相反,df.mean(1)则代表按行方向求平均,得到每行数据平均值。

而numpy中的np.mean()函数则是求所有数组中的平均值。

2、求中位数、方差、标准差、分位数等指标的方法:

(1)中位数:pd.median()函数:默认等价于df.median(0),即按轴方向求平均,得到每列数据的中位数;df.median(1)则代表按行方向求平均,得到每行数据平均值。

同理:

  1. 方差:pd.var()函数。
  2. 标准差:pd.std()函数
  3. 分位数:np.percentile(x,75)函数:前件为变量,后件为设置的分位。
  1. 求众数:

从scipy中导入stats模块,调用stats.mode()函数寻找数组或者矩阵每行/每列中最常出现成员以及出现的次数。

  1. 相似性和相异性度量

(1)标称属性:

多元属性中,相异性公式写为状态不相同的属性数占所有属性数的比。

相似性公式:sim(i,j)=1-d(i,j)。即状态相同的属性数占所有属性数的比。

  1. 数值属性

欧氏距离

数值属性对象i=(xi1,xi2,…,xip)和j=(xj1,xj2,…,xjp)具有p个数值属性的刻画,则对象i和j的欧式距离为:

D(i,j)=[(xi1-xj1)^2+(xi2-xj2)^2+…+(xip-xjp)^2]^0.5

对应L2范数。

余弦相似度用于向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似。

2.遇到的问题及解决方法

除了要求完成的任务及思考以外,遇到的问题解决问题的办法等

问题1:在任务2中分别计算四列数据的极差时,调用ptp函数结果只返回一个数据。

解决:原因在于我使用的是numpy中的mean()函数,它只能返回所有数组中数据的平均数,因此只有一个值;将其改为pandas中的mean()函数,分别计算各个数组的平均值。

问题2:在计算极差时,分别计算每列数据代码过于繁琐。

解决:采用双层嵌套的for循环,定义一个空列表,在每列中逐行遍历元素,添加到列表中,再用ptp()函数计算极差,每次按列遍历添加元素后,都将列表内元素清空,再跳到下一列属性重新添加元素。

问题及解决方法

除了要求完成的任务及思考以外,遇到的问题解决问题的办法等

问题1:在任务2中分别计算四列数据的极差时,调用ptp函数结果只返回一个数据。

解决:原因在于我使用的是numpy中的mean()函数,它只能返回所有数组中数据的平均数,因此只有一个值;将其改为pandas中的mean()函数,分别计算各个数组的平均值。

问题2:在计算极差时,分别计算每列数据代码过于繁琐。

解决:采用双层嵌套的for循环,定义一个空列表,在每列中逐行遍历元素,添加到列表中,再用ptp()函数计算极差,每次按列遍历添加元素后,都将列表内元素清空,再跳到下一列属性重新添加元素。

猜你喜欢

转载自blog.csdn.net/m0_52051577/article/details/121667167
今日推荐