pyhton相关性分析

在数据分析和统计学中,理解变量之间的关系是揭示数据背后隐藏信息的关键步骤之一。无论是研究经济指标之间的相互影响,还是分析生物医学数据中的潜在关联,相关性分析都扮演着至关重要的角色。通过量化变量之间的关系强度和方向,我们可以更好地做出预测、优化决策,甚至发现新的研究方向。
Python,作为一门功能强大且广泛使用的编程语言,为数据科学家和分析师提供了丰富的工具和库,用于进行高效的相关性分析。从经典的皮尔逊相关系数到非参数的斯皮尔曼和肯德尔秩相关系数,Python 的统计和数据处理库(如 Pandas、NumPy 和 SciPy)使得这些复杂的统计分析变得简单易行。
本文将深入探讨如何使用 Python 进行相关性分析。我们将从基础理论入手,逐步介绍皮尔逊、斯皮尔曼和肯德尔这三种常用的相关性分析方法,并通过实际案例展示如何在 Python 中实现这些分析。无论你是初学者还是有一定经验的数据分析师,本文都将为你提供清晰的指导和实用的代码示例,帮助你更好地理解和应用相关性分析。
import pyodbc
import pandas as pd
from scipy.stats import zscore
from sklearn.preprocessing import StandardScaler
import seaborn as sns
import matplotlib.pyplot as plt

#连接数据库
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};'
'SERVER=.;'
'DATABASE=YongYangGT;'
'UID=sa;'
'PWD=123456')

#执行查询
query = "SELECT * FROM MODEL_COMCAL_RST_1_MIN"
df = pd.read_sql(query, conn)

conn.close()

#打印缺失统计
print(df.head())
print(df.isnull().sum())

#删除为nan的列
# df_clean = df.dropna(axis=1, how='all')

#删除时间类型的字段
df_clean = df.select_dtypes(exclude=['datetime', 'object'])

print(df_clean.head())

df_clean_c = df_clean.drop(columns=['Id'])

print(df_clean_c.head())

# 检查数据类型,确保只对值类型进行添加
print(df_clean_c.dtypes)

#填补缺失值,只对值类型
numeric_cols = df_clean_c.select_dtypes(include=['float64', 'int64']).columns
df_filled = df_clean_c.copy() # 创建副本以避免修改原始数据
df_filled[numeric_cols] = df_filled[numeric_cols].fillna(df_filled[numeric_cols].mean())

# 检查填充后的数据
print(df_filled.isnull().sum())

# 计算Z-score并删除异常值(Z-score大于3的行)
z_scores = zscore(df_filled.select_dtypes(include=['float64', 'int64']))
df_no_outliers = df_filled[(z_scores < 3).all(axis=1)]

# 标准化数值型数据
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df_no_outliers.select_dtypes(include=['float64', 'int64'])))

### 选择你感兴趣的列进行分析df_selected = df[['column1', 'column2', 'column3']]
# 计算皮尔森相关系数矩阵
correlation_matrix = df_no_outliers.corr(method='pearson')

# 输出相关系数矩阵
print(correlation_matrix)

# 绘制热图
plt.figure(figsize=(10,10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)
plt.title('Pearson Correlation Matrix')
plt.show()

接下来就是对这段代码进行讲解
1.首先就是导入库
import pyodbc
import pandas as pd
from scipy.stats import zscore
from sklearn.preprocessing import StandardScaler
import seaborn as sns
import matplotlib.pyplot as plt

2.连接数据库获取数据
# 连接数据库
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};'
'SERVER=.;'
'DATABASE=.;'
'UID=.;'
'PWD=.')
query = "SELECT * FROM MODEL_COMCAL_RST_1_MIN"
df = pd.read_sql(query, conn)
conn.close()
我在这里随便使用FROM MODEL_COMCAL_RST_1_MIN表

3.这里会打印出你所查询到的数据先对数据进行第一步统计,在你的表里有多少空值用来观看对应表里所有的数据
(1)print(df.head())
这个print(df.isnull().sum())用来统计有多少个空数据,因为空数据会影响最后的皮尔森计算,所以需要对这些空数据进行删除,或者计算平均值
(2)print(df.isnull().sum())

4.对于拿到的数据进行处理,让数据更符合接下来皮尔森计算的要求
# 删除时间类型字段(时间字段为datetime或object类型)df是查询到的数据源
df_clean = df.select_dtypes(exclude=['datetime', 'object'])
df_clean_c = df_clean.drop(columns=['Id'])
print(df_clean_c.dtypes)
numeric_cols = df_clean_c.select_dtypes(include=['float64', 'int64']).columns
df_filled = df_clean_c.copy() # 创建副本以避免修改原始数据
df_filled[numeric_cols] = df_filled[numeric_cols].fillna(df_filled[numeric_cols].mean())

5.#经过处理的数据拿来做异常判断,计算每个数值型数据的 Z-score,Z-score 越大,代表该数据点越可能是异常值。一般认为,Z-score 大于 3 或小于 -3 的值为异常值。
** # 计算Z-score并删除异常值(Z-score大于3的行)**
z_scores = zscore(df_filled.select_dtypes(include=['float64', 'int64']))
df_no_outliers = df_filled[(z_scores < 3).all(axis=1)]

6.将每个数值型列转化为均值为 0,方差为 1 的标准正态分布而且值范围是 [-1, 1]]
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df_no_outliers.select_dtypes(include=['float64', 'int64'])))

7.皮尔森相关系数分析
correlation_matrix = df_no_outliers.corr(method='pearson')
# 输出相关系数矩阵
print(correlation_matrix)

8.最后就是绘制热力图进行显示
** # 绘制热图**
plt.figure(figsize=(10,10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)
plt.title('Pearson Correlation Matrix')
plt.show()

9.在相关性分析的模型中,算法分为皮尔森,斯尔曼,肯德尔

  1. 数据类型:
    连续数据:如果你的数据是连续变量(例如身高、体重、温度等),且你认为这些数据之间可能存在线性关系,那么可以考虑使用皮尔森相关系数。
    排名数据或离散数据:如果你的数据是排名数据(如比赛排名、员工绩效等级等),或者你的数据并不完全连续,而是离散的,可以考虑使用斯皮尔曼或肯德尔相关系数。

  2. 数据的分布:
    正态分布:如果你的数据接近正态分布(你可以通过绘制直方图、Q-Q图或进行正态性检验来检查),那么皮尔森相关系数是一个合适的选择,因为皮尔森假设数据服从正态分布。
    非正态分布:如果数据不服从正态分布,或者你不确定数据的分布,建议使用斯皮尔曼或肯德尔,它们不依赖于数据的正态性。

  3. 关系的性质:
    线性关系:如果你认为两个变量之间存在线性关系(即随着一个变量的变化,另一个变量也呈直线性变化),那么使用皮尔森相关系数。
    单调关系:如果你认为两个变量之间可能存在单调关系(即一个变量的增加总是伴随另一个变量的增加或减少,但不一定是直线关系),那么可以使用斯皮尔曼或肯德尔。单调关系包括但不限于线性关系,适用的情形更广泛。

  4. 数据的尺度:
    等级数据:如果你的数据是等级数据(例如“优”、“良”、“中”、“差”)或有序类别数据,可以使用斯皮尔曼或肯德尔,它们能够有效地处理等级数据。
    连续数据:对于大部分连续数据(如身高、体重等),皮尔森适用性较好。

  5. 样本大小:
    小样本:如果样本量较小,肯德尔相关系数通常更稳健。斯皮尔曼也可以,但肯德尔在小样本时表现更好。
    大样本:如果样本量较大,三者都可以使用,但皮尔森通常能提供较为清晰的线性关系度量。
    总结:如何选择
    使用皮尔森:
    当数据是连续型的且接近正态分布时,且你认为数据之间存在线性关系。
    使用斯皮尔曼:
    当数据是非正态分布、连续型或者你不确定是否线性,但数据之间有单调关系(即一个变量增加时,另一个变量也始终增加或减少,不需要是直线关系)。
    数据中可能含有离群值,斯皮尔曼比皮尔森更能抵抗离群值的影响。
    使用肯德尔:
    与斯皮尔曼类似,但肯德尔对于小样本更为稳健。如果数据量较小或你关心数据的顺序一致性,肯德尔可能是更好的选择。

    10.如果需要使用其他两个
    只需要把correlation_matrix = df_scaled.corr(method='pearson')里的pearson换成另外两个对 应的英文就行
    皮尔森:pearson
    斯皮尔曼:spearman
    肯德尔:kendall

posted @ 2025-04-28 09:52  奥术  阅读(97)  评论(0)    收藏  举报