判断两列是否有相关性关系的一个例子

判断价格与购买人数,
相关性系数不可以输出特征相关的公式
回归可以输出相关关系的公式

利用相关性系数

import pandas as pd
from scipy.stats import pearsonr, spearmanr, kendalltau
import numpy as np

data = pd.read_csv('C:/Users/yangyunpeng/Desktop/123123.csv')
# 判断数组中的元素是否为NaN或inf,并将其置为0
data[np.isinf(data) | np.isnan(data)] = 0

#print(data.corr())
#sns.heatmap(data.corr(), annot=True)
#plt.show()


# 计算数值列的分位数
q1 = data['avg_price'].quantile(q=0.1)
q3 = data['avg_price'].quantile(q=0.9)
# 删除四分位数范围外的所有行
data = data.drop(data[(data['avg_price'] < q1) | (data['avg_price'] > q3)].index)
#删除DataFrame中根据某一列的数值删除对应所有行
data=data.drop(data[data['count(distinct domain_id)'] < 1].index)
#按照某列的数值从大到小进行其他列的排序
data = data.sort_values(by='count(distinct domain_id)', ascending=False)
#print(data)

# 删除数组中的元素 data = np.delete(data_o, np.where(mask))
x = data['avg_price']
y = data['count(distinct domain_id)']
# 计算Pearson相关系数和p值
pearson_corr, pearson_pvalue = pearsonr(x, y)
print('Pearson相关系数:', pearson_corr)
print('Pearson p值:', pearson_pvalue)

# 计算Spearman秩相关系数和p值
spearman_corr, spearman_pvalue = spearmanr(x, y)
print('Spearman秩相关系数:', spearman_corr)
print('Spearman p值:', spearman_pvalue)

# 计算Kendall秩相关系数和p值
kendall_corr, kendall_pvalue = kendalltau(x, y)
print('Kendall秩相关系数:', kendall_corr)
print('Kendall p值:', kendall_pvalue)
Pearson相关系数: -0.024778684605260518
Pearson p值: 0.028105969640083453
Spearman秩相关系数: -0.09442789542281876
Spearman p值: 5.057909838678121e-17
Kendall秩相关系数: -0.07182909221982381
Kendall p值: 4.4489210579224094e-17

这个结果代表了两个变量之间的相关性程度及其统计显著性。

  • Pearson相关系数是一种线性相关系数,其介于-1和1之间。值越接近1或-1,表示两个变量之间的线性相关性越强;值越接近0,则表示两个变量之间的线性相关性越弱。在这个结果中,Pearson相关系数为-0.0247,接近于0,说明两个变量之间的线性相关性很弱。
    Pearson p值是用来判断Pearson相关系数是否统计显著的指标。p值越小,表示Pearson相关系数越显著。在这个结果中,p值为0.0281,小于0.05的显著性水平,说明Pearson相关系数是统计显著的,但是相关性程度很弱。
  • Spearman秩相关系数是一种非线性相关系数,用于衡量两个变量之间的单调关系。其介于-1和1之间,值越接近1或-1,表示两个变量之间的单调关系越强;值越接近0,则表示两个变量之间的单调关系越弱。在这个结果中,Spearman秩相关系数为-0.0944,接近于0,说明两个变量之间的单调关系很弱。
    Spearman p值是用来判断Spearman秩相关系数是否统计显著的指标。p值越小,表示Spearman秩相关系数越显著。在这个结果中,p值为5.0579e-17,远小于0.05的显著性水平,说明Spearman秩相关系数是非常显著的,但是相关性程度很弱。
  • Kendall秩相关系数是一种非参数的相关系数,用于衡量两个变量之间的顺序关系。其介于-1和1之间,值越接近1或-1,表示两个变量之间的顺序关系越强;值越接近0,则表示两个变量之间的顺序关系越弱。在这个结果中,Kendall秩相关系数为-0.0718,接近于0,说明两个变量之间的顺序关系很弱。
    Kendall p值是用来判断Kendall秩相关系数是否统计显著的指标。p值越小,表示Kendall秩相关系数越显著。在这个结果中,p值为4.4489e-17,远小于0.05的显著性水平,说明Kendall秩相关系数是非常显著的,但是相关性程度很弱。

假设有一个学生的成绩单,包括数学、语文和英语三门课程的成绩。如果我们对这三门课程的成绩进行排名,从高到低分别是数学、英语、语文,那么可以说数学成绩在三门课程中排名最高,英语次之,语文最低。这种排名关系就是一种顺序关系。

如果我们想衡量成绩与学习时间之间的关系,可以记录每门课程的成绩和学习时间,然后计算它们之间的相关性。如果发现学习时间越长,成绩也越高,或者学习时间越短,成绩也越低,那么可以说它们之间存在单调关系,即一个变量的增加或减少会导致另一个变量的相应增加或减少。但是,如果两个变量之间的关系不是单调的,例如学习时间很长或很短时成绩都很低,此时它们之间就不存在单调关系。

因此,顺序关系是指两个变量之间的相对大小关系,单调关系则是指一个变量的增加或减少导致另一个变量的相应增加或减少的关系。

利用回归模型判断线性相关

import pandas as pd
from scipy.stats import pearsonr, spearmanr, kendalltau
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

data = pd.read_csv('C:/Users/yangyunpeng/Desktop/123123.csv')
# 判断数组中的元素是否为NaN或inf,并将其置为0
data[np.isinf(data) | np.isnan(data)] = 0
# 计算数值列的分位数
q1 = data['avg_price'].quantile(q=0.1)
q3 = data['avg_price'].quantile(q=0.9)
# 删除四分位数范围外的所有行
data = data.drop(data[(data['avg_price'] < q1) | (data['avg_price'] > q3)].index)
#删除DataFrame中根据某一列的数值删除对应所有行
data=data.drop(data[data['count(distinct domain_id)'] < 1].index)
#按照某列的数值从大到小进行其他列的排序
data = data.sort_values(by='count(distinct domain_id)', ascending=False)
#print(data)

# 删除数组中的元素 data = np.delete(data_o, np.where(mask))
x = data['avg_price']
y = data['count(distinct domain_id)']
'''
# 计算Pearson相关系数和p值
pearson_corr, pearson_pvalue = pearsonr(x, y)
print('Pearson相关系数:', pearson_corr)
print('Pearson p值:', pearson_pvalue)

# 计算Spearman秩相关系数和p值
spearman_corr, spearman_pvalue = spearmanr(x, y)
print('Spearman秩相关系数:', spearman_corr)
print('Spearman p值:', spearman_pvalue)

# 计算Kendall秩相关系数和p值
kendall_corr, kendall_pvalue = kendalltau(x, y)
print('Kendall秩相关系数:', kendall_corr)
print('Kendall p值:', kendall_pvalue)

'''
# 绘制散点图x,y
plt.scatter(x, y, color='blue')
# 添加标题和标签
plt.title('Scatter Plot Example')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.show()


# 添加常数项,在进行线性回归分析时,我们需要考虑截距,即在自变量为0时,因变量的值。
#因此,在构建模型时,需要添加一个常数项列,这个常数项列的值全部为1,用于表示截距。
#如果不添加常数项列,那么模型就不能考虑截距的影响,这会导致模型拟合不准确。
#因此,添加一个常数项列到自变量中,是进行线性回归分析的必要步骤之一。
x = sm.add_constant(x)
#print(x)
# 拟合模型
model = sm.OLS(y, x)
results = model.fit()
# 输出相关系数和拟合结果
print(results.params)
print(results.summary())

输出结果

const          48.999147
avg_price   -1432.473764
dtype: float64
                                OLS Regression Results                               
=====================================================================================
Dep. Variable:     count(distinct domain_id)   R-squared:                       0.001
Model:                                   OLS   Adj. R-squared:                  0.000
Method:                        Least Squares   F-statistic:                     4.823
Date:                       Wed, 15 Mar 2023   Prob (F-statistic):             0.0281
Time:                               09:46:28   Log-Likelihood:                -61107.
No. Observations:                       7853   AIC:                         1.222e+05
Df Residuals:                           7851   BIC:                         1.222e+05
Df Model:                                  1                                         
Covariance Type:                   nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         48.9991     10.678      4.589      0.000      28.066      69.932
avg_price  -1432.4738    652.248     -2.196      0.028   -2711.053    -153.895
==============================================================================
Omnibus:                    23188.184   Durbin-Watson:                   0.106
Prob(Omnibus):                  0.000   Jarque-Bera (JB):       1377688128.380
Skew:                          41.815   Prob(JB):                         0.00
Kurtosis:                    2053.229   Cond. No.                         99.7
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

这个回归结果是一元线性回归的结果,因为只有一个自变量avg_price。具体来说,它表示了一个线性模型:count(distinct domain_id) = 48.9991 - 1432.4738 * avg_price + ε,其中const是截距,coef是回归系数,std err是标准误,t是t统计量,P>|t|是p值,[0.025 0.975]是置信区间。这个模型的R-squared是0.001,说明自变量avg_price对因变量count(distinct domain_id)的解释力很弱,因为只有0.1%的方差可以被解释。这个模型的F统计量是4.823,p值是0.0281,说明整个模型的显著性检验是显著的。同时,这个模型的残差的方差可能有异方差性,因为它的Covariance Type是nonrobust。

回归模型中
标准误(standard error)是用来衡量回归系数的精度和可靠性的。它衡量了在多次采样的情况下,回归系数可能偏离其真实值的平均程度。标准误越小,回归系数越精确和可靠。
t统计量(t-statistic)是用来判断回归系数是否显著不为零的。它的计算方法是将回归系数除以其标准误。如果t统计量的绝对值越大,说明回归系数越显著不为零,即回归系数对因变量的影响越大。
置信区间(confidence interval)是用来估计回归系数真实值的范围的。置信区间给出了回归系数的一个上下界,使得在一定置信水平下,回归系数落在这个区间内的概率是很高的。通常使用95%置信水平。如果置信区间包含零,说明回归系数可能不显著,否则说明回归系数显著不为零。
F统计量代表整个模型的显著性,即模型中至少有一个自变量对因变量有显著的影响。F统计量的值可以用来判断模型的拟合程度和预测能力,一般来说,F统计量的值越大,说明模型的拟合程度越好,预测能力越强。F统计量还可以用来比较不同模型的拟合程度,选择最优模型。
回归模型中的残差是指实际观测值与模型预测值之间的差异,即残差=实际观测值-模型预测值。
残差可以用来评估模型的拟合程度和预测精度,如果残差较小,则说明模型拟合程度较好;如果残差较大,则说明模型存在一定的误差。
回归模型中的方差指的是所有残差的平方和除以残差自由度,表示模型中预测值和实际值之间的离散程度。
异方差是指回归模型中残差的方差不恒定,即残差方差与自变量有关。异方差通常会导致回归模型的预测精度降低,需要进行异方差性检验和纠正。

利用回归模型判断非线性相关

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsRegressor
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

data = pd.read_csv('C:/Users/yangyunpeng/Desktop/123123.csv')

# 判断数组中的元素是否为NaN或inf,并将其置为0
data[np.isinf(data) | np.isnan(data)] = 0
# 计算数值列的分位数
q1 = data['avg_price'].quantile(q=0.1)
q3 = data['avg_price'].quantile(q=0.9)
# 删除四分位数范围外的所有行
data = data.drop(data[(data['avg_price'] < q1) | (data['avg_price'] > q3)].index)
#删除DataFrame中根据某一列的数值删除对应所有行
data=data.drop(data[data['count(distinct domain_id)'] < 1].index)
#按照某列的数值从大到小进行其他列的排序
#data = data.sort_values(by='count(distinct domain_id)', ascending=False)

# 删除数组中的元素 data = np.delete(data_o, np.where(mask))
x = data.iloc[:, :-1].values  #['avg_price']
y = data.iloc[:,-1].values    #['count(distinct domain_id)']


x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=6)
# 构建核函数回归模型
knn = KNeighborsRegressor(weights='uniform', n_neighbors=5)
knn.fit(x, y)


# 生成预测值
y_pred = knn.predict(x_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
# 计算均方根误差
rmse = np.sqrt(mse)
# 计算平均绝对误差
mae = mean_absolute_error(y_test, y_pred)
# 计算决定系数
r2 = r2_score(y_test, y_pred)
print("MSE:", mse)
print("RMSE:", rmse)
print("MAE:", mae)
print("R2:", r2)


# 绘制图像
plt.scatter(x, y, color='darkorange', label='data')
plt.plot(x_test, y_pred, color='navy', label='prediction')
plt.legend()
plt.title('Kernel Regression')
plt.show()

均方误差(MSE):表示模型预测值与真实值之间的平均平方误差。MSE越小,模型的性能越好。

均方根误差(RMSE):表示MSE的平方根,具有与MSE相同的性质。RMSE越小,模型的性能越好。

平均绝对误差(MAE):表示模型预测值与真实值之间的平均绝对误差。MAE越小,模型的性能越好。

决定系数(R2):表示模型预测值与真实值之间的相关性。R2越接近1,模型的性能越好。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值