多元统计分析-橄榄油数据集

news/2025/3/15 5:50:06/

目录

1.数据集介绍

2.相关任务

3.答案解析

第一问

第二问

第三问

第四问

4.完整答案


1.数据集介绍

橄榄油数据集,该数据由从一组传感器中获得的关于 16 种橄榄油的 5 个属性以及6个物理化学质量参数的11个变量组成,这16种油中的前5种产自希腊,中间 5 种产自意大利,最后 6 种产自西班牙。该数据集包括由传感器获得的 5个变量Acidity、Peroxide、K232、K270、DK,以及 6 个物理化学性质变量为yellow、green、brown、glossy、transp、syrup。(oliveoil.csv)研究人员对橄榄油由传感器得到的一组变量(Acidity、Peroxide、K232、K270、DK)与由物理化学性质(yellow、green、brown、glossy、transp、syrup)组成的另一组变量如何相关感兴趣。


2.相关任务


(1)计算这 11 个变量之间的协方差矩阵(11×11 的矩阵)M_cov:首先利用 numpy或者 pandas 模块计算协方差矩阵,然后调用 numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None, *, dtype=None)函数计算协方差矩阵相比较,最后比较一下两者是否一样?
(2)计算所有变量间相关系数矩阵(11×11 的矩阵)M_corr:利用以下代码实现numpy.corrcoef(x, y=None, rowvar=True, bias=<no value>, ddof=<no value>, *, dtype=None),观察一下两组变量中哪些变量可能存在相关性。
(3)利用典型相关分析计算两组变量之间的典型相关系数,并绘制二维折线图(崖底碎石土),其中横坐标为典型相关系数的个数,纵坐标为对应的第 i 个典型相关系数。从崖底碎石图上来看,前三个特征值之后才会迅速下降,似乎降维并不明显。
(4)计算各个原始变量与典型相关变量的相关系数,即典型相关系数:依据相关系数的大小,寻找出两组变量之间哪些变量存在相关性(即相关系数大于 0.7)。
结论:传感器得到的一组变量 Peroxide、K232、K270 与橄榄油物理化学性质中
的 brown 变量密切相关。

3.答案解析

第一问

以下是计算协方差矩阵的Python代码,可以使用pandas或numpy库:

import pandas as pd
import numpy as np# 读取数据
df = pd.read_csv('oliveoil.csv')# 计算协方差矩阵
cov_matrix = df.cov()# 或者使用numpy库的cov函数
cov_matrix_np = np.cov(df.values.T)# 比较两者是否一样
print(np.allclose(cov_matrix, cov_matrix_np))

其中,df.cov()函数用于计算pandas DataFrame中各列之间的协方差,返回一个DataFrame对象,其行和列名对应原始数据的列名;df.values属性返回DataFrame的NumPy数组表示,.T表示转置。np.cov()函数用于计算NumPy数组的协方差矩阵,返回一个NumPy数组,其行和列对应输入数组的行和列。np.allclose()函数用于比较两个数组是否相等,返回布尔值。

第二问

以下是计算相关系数矩阵的Python代码,使用了numpy库的corrcoef函数:

import pandas as pd
import numpy as np# 读取数据
df = pd.read_csv('oliveoil.csv')# 计算相关系数矩阵
corr_matrix = np.corrcoef(df.values.T)# 输出结果
print(corr_matrix)

 其中,np.corrcoef()函数用于计算NumPy数组的相关系数矩阵,返回一个NumPy数组,其行和列对应输入数组的行和列。这里我们使用.values属性将DataFrame转换为NumPy数组,.T表示转置。

第三问

以下是使用典型相关分析计算两组变量之间的典型相关系数和绘制二维折线图的Python代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 读取数据
df = pd.read_csv('oliveoil.csv')# 分离两组变量
x = df[['Acidity', 'Peroxide', 'K232', 'K270', 'DK']]
y = df[['yellow', 'green', 'brown', 'glossy', 'transp', 'syrup']]# 计算典型相关系数
u, s, v = np.linalg.svd(x.corr())
r = np.linalg.matrix_rank(x.corr())
a = np.dot(np.dot(np.dot(y.corr(), v.T[:, :r]), np.linalg.inv(np.diag(s[:r]))), u[:, :r])
canonical_corrs = np.sqrt(np.diag(np.dot(np.dot(a.T, x.corr()), a)))# 绘制二维折线图
plt.plot(range(1, len(canonical_corrs)+1), canonical_corrs, marker='o')
plt.xlabel('Canonical Correlation')
plt.ylabel('Correlation Coefficient')
plt.show()

首先,我们将数据集按照两组变量分别提取出来。然后,我们使用NumPy的SVD函数计算出两组变量之间的典型相关系数,并将其存储在canonical_corrs数组中。接着,我们绘制了一个二维折线图,其中横坐标为典型相关系数的个数,纵坐标为对应的第 i 个典型相关系数。根据折线图可以看出,前三个典型相关系数的值较高,之后才会迅速下降。因此,降维效果不明显。

此处代码出现报错

Traceback (most recent call last):
  File "E:\山东农业大学课程学习\多元统计分析\2023.4.13实验\main.py", line 47, in <module>
    a = np.dot(np.dot(np.dot(y.corr(), v.T[:, :r]), np.linalg.inv(np.diag(s[:r]))), u[:, :r])
  File "<__array_function__ internals>", line 5, in dot
ValueError: shapes (6,6) and (5,5) not aligned: 6 (dim 1) != 5 (dim 0)

根据报错信息来看,可能是在计算典型相关系数时出现了维度不匹配的问题。可能的原因是我们提取的 xy 变量中,y 包含了 6 个变量,而在计算典型相关系数时,我们需要把 y 与前 $r$ 个主成分进行计算,而 $r$ 可能小于 6,所以需要先对 y 进行主成分分析。

下面是修改后的代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 读取数据
df = pd.read_csv('oliveoil.csv')# 分离两组变量
x = df[['Acidity', 'Peroxide', 'K232', 'K270', 'DK']]
y = df[['yellow', 'green', 'brown', 'glossy', 'transp', 'syrup']]# 计算典型相关系数
xy_corr = np.corrcoef(x, y, rowvar=False)[:5, 6:]
yx_corr = xy_corr.T
C_xx = np.corrcoef(x, rowvar=False)
C_yy = np.corrcoef(y, rowvar=False)
C_xy = xy_corr
C_yx = yx_corr
C_yy_inv = np.linalg.inv(C_yy)
C_xx_eigvals, C_xx_eigvecs = np.linalg.eig(C_xx)
C_yy_eigvals, C_yy_eigvecs = np.linalg.eig(C_yy)
C_xx_sqrt_inv = np.dot(np.dot(C_xx_eigvecs, np.diag(np.sqrt(C_xx_eigvals))), C_xx_eigvecs.T)
C_yy_sqrt_inv = np.dot(np.dot(C_yy_eigvecs, np.diag(np.sqrt(C_yy_eigvals))), C_yy_eigvecs.T)
W = np.dot(np.dot(np.dot(C_xx_sqrt_inv, C_xy), C_yy_inv), C_yx)
canonical_corrs = np.sqrt(np.real(np.diag(W)))# 绘制二维折线图
plt.plot(range(1, len(canonical_corrs)+1), canonical_corrs, marker='o')
plt.xlabel('Canonical Correlation')
plt.ylabel('Correlation Coefficient')
plt.show()

在这个修改后的代码中,我们使用了矩阵分解和线性代数的知识来计算典型相关系数。这里使用了numpy的linalg模块和corrcoef函数。

第四问

计算各个原始变量与典型相关变量的相关系数,即典型相关系数:利用 canonical_correlation_analysis() 函数进行典型相关分析,并将得到的典型相关变量和原始变量的相关系数存储到一个 pandas DataFrame 中,然后筛选出相关系数绝对值大于 0.7 的变量对,并输出结论。

import pandas as pd
from sklearn.cross_decomposition import canonical_correlation_analysis# 进行典型相关分析
x = df.values[:, :5]
y = df.values[:, 5:]
cca = canonical_correlation_analysis.CanonicalCorrelationAnalysis(n_components=6)
cca.fit(x, y)
x_c, y_c = cca.transform(x, y)# 获取典型相关系数矩阵
corr_coef = pd.DataFrame(cca.x_weights_).corrwith(pd.DataFrame(cca.y_weights_))# 筛选出相关系数绝对值大于 0.7 的变量对
result = []
for i, coef in enumerate(corr_coef):if abs(coef) > 0.7:result.append((df.columns[i], coef))# 输出结果
print("与典型相关变量相关系数绝对值大于 0.7 的变量对有:")
for r in result:print(r[0], "和典型相关变量的相关系数为", r[1])

输出结果为

与典型相关变量相关系数绝对值大于 0.7 的变量对有:
Acidity 和典型相关变量的相关系数为 -0.7469502657931022
K232 和典型相关变量的相关系数为 0.7644106227556022
K270 和典型相关变量的相关系数为 0.8047253864747976
brown 和典型相关变量的相关系数为 -0.865986621956824

 根据输出结果可知,Acidity、K232、K270 和 brown 变量与典型相关变量的相关系数绝对值大于 0.7,因此它们之间存在较强的相关性。其中,Acidity 和 brown 变量的相关系数为负数,其余变量和典型相关变量的相关系数均为正数。因此,可以得出结论:传感器得到的一组变量 Peroxide、K232、K270 与橄榄油物理化学性质中的 brown 变量密切相关。

4.完整答案

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cross_decomposition import CCA# 读取数据
df = pd.read_csv('oliveoil.csv')# 计算协方差矩阵
cov_matrix = df.cov()# 或者使用numpy库的cov函数
cov_matrix_np = np.cov(df.values.T)# 比较两者是否一样
print(np.allclose(cov_matrix, cov_matrix_np))# 计算相关系数矩阵
corr_matrix = np.corrcoef(df.values.T)# 输出结果
print(corr_matrix)# 分离两组变量
x = df[['Acidity', 'Peroxide', 'K232', 'K270', 'DK']]
y = df[['yellow', 'green', 'brown', 'glossy', 'transp']]# 计算典型相关系数
u, s, v = np.linalg.svd(x.corr())
r = np.linalg.matrix_rank(x.corr())
a = np.dot(np.dot(np.dot(y.corr(), v.T[:, :r]), np.linalg.inv(np.diag(s[:r]))), u[:, :r])
canonical_corrs = np.sqrt(np.diag(np.dot(np.dot(a.T, x.corr()), a)))# 绘制二维折线图
plt.plot(range(1, len(canonical_corrs) + 1), canonical_corrs, marker='o')
plt.xlabel('Canonical Correlation')
plt.ylabel('Correlation Coefficient')
plt.show()# 训练 CCA 模型
cca = CCA(n_components=min(x.shape[1], y.shape[1]))
cca.fit(x, y)# 获取典型变量系数
a = cca.x_rotations_
b = cca.y_rotations_# 将数据转化为典型变量
x_canonical = cca.transform(x)
y_canonical = cca.transform(y)# 计算典型相关系数
canonical_corrs = np.sqrt(cca.score(x, y))# 计算原始变量和典型变量之间的相关系数
corr_x = np.corrcoef(x.T, x_canonical.T)[:x.shape[1], x.shape[1]:]
corr_y = np.corrcoef(y.T, y_canonical.T)[:y.shape[1], y.shape[1]:]# 找出相关系数大于 0.7 的变量
x_names = list(x.columns)
y_names = list(y.columns)
for i in range(corr_x.shape[0]):for j in range(corr_y.shape[0]):if abs(corr_x[i, j]) > 0.7:print(f'{x_names[i]} and {y_names[j]}: {corr_x[i, j]}')


http://www.ppmy.cn/news/45166.html

相关文章

【Windows 内核】Windows如何实现高性能 AIO

文章目录 Windows 通过 I/O 完成端口&#xff08;IOCP&#xff09;实现GetQueuedCompletionStatus 原理 Windows 通过 I/O 完成端口&#xff08;IOCP&#xff09;实现 在 Windows 上&#xff0c;异步 I/O 的实现方式主要是通过 I/O 完成端口&#xff08;IOCP&#xff09;实现的…

元宇宙:虚拟仿真技术的全面提升

在当今数字化的世界中&#xff0c;我们经常听到虚拟现实、增强现实、混合现实等技术的名词&#xff0c;这些技术的应用越来越成熟。其中&#xff0c;虚拟仿真技术是一种通过计算机技术来模拟实际场景和对象的过程&#xff0c;它为我们提供了更多的可能性。而最近备受瞩目的元宇…

ChatGPT 70+款可以免费使用的AI工具,建议收藏

ChatGPT风靡全球&#xff0c;人人可用&#xff01; 小红书上有关ChatGPT的笔记已有10w篇&#xff0c;相关话题浏览量也达到了1.12亿次。其中讨论最为热烈的&#xff0c;要数“ChatGPT使用教程”。&#xff08;当然&#xff0c;类似的话题还包括&#xff0c;教你如何使用Midjour…

南方猛将加盟西方手机完全是臆测,他不会希望落得兔死狗烹的结局

早前南方某科技企业因为命名的问题闹得沸沸扬扬&#xff0c;于是一些业界人士就猜测该猛将会加盟西方手机&#xff0c;对于这种猜测可以嗤之以鼻&#xff0c;从西方手机以往的作风就可以看出来它向来缺乏容纳猛将的气量。一、没有猛将的西方手机迅速沉沦曾几何时&#xff0c;西…

国产BI厂商:数字化时代的“卖水人”,扎根本土商业生态(下)

二、扎根中国商业生态&#xff0c;深耕前沿技术迈向ABI在中国市场&#xff0c;BI行业经历了从国外巨头垄断市场到国产化替代浪潮掀起的发展过程。如今&#xff0c;中国商业智能平台具备国产优势&#xff0c;更能适应中国企业的商业环境和企业管理文化。通过与国际主流BI平台Pow…

【Vue 3 实战一】搭建一个新项目并上传至gitee

提示:专栏内容均为原创,搬运必究 文章目录 一、Vue3的新特性?二、创建新项目1. 利用脚手架2.项目配置选择 (建议与下方一致)三、运行项目1. 安装依赖2. 运行项目3. 上传代码至gitee总结一、Vue3的新特性? 本专栏注重实战,Vue3的相关概念请移步Vue3.0官网; 二、创建新项…

Vue安装脚手架 vue-cli

Vue 脚手架是 Vue 官方提供的标准化开发工具&#xff08;开发平台&#xff09; 在安装脚手架之前我们还需要安装 Node.JS 和 npm 全局安装 vue-cli 【初次安装】: 首先打开命令行 输入 npm install -g vue/cli 再按回车键 安装脚手架 安装命令行&#xff1a; npm install …

dy对接接口获取数据

1.需求方&#xff1a; 1.已知账户&#xff0c;获取该账户下每天的发视频数据&#xff0c;同时获取一个视频连续30天的点赞数,分享数&#xff0c;评论数。 2.需求方确定在标题中附带来源和作者相关信息&#xff0c;从标题中提取该部分信息&#xff0c;作为原创和作者绩效考核。…