皮尔逊相关系数矩阵是一个用于量化多个变量之间线性关系的统计工具。它的每个元素表示两个变量之间的皮尔逊相关系数,取值范围从 -1 到 1:
- 1 表示完全正相关:当一个变量增加时,另一个变量也会增加。
- -1 表示完全负相关:当一个变量增加时,另一个变量会减少。
- 0 表示没有线性相关关系。
皮尔逊相关系数的计算
皮尔逊相关系数 rrr 的计算公式为:
其中:
- Xi 和 Yi 是变量的观测值。
- Xˉ 和 Yˉ 是变量的均值。
应用场景
皮尔逊相关系数矩阵常用于:
- 数据分析与统计研究。
- 发现变量之间的关系,尤其是在机器学习和数据挖掘中。
- 经济学、心理学、生物学等领域的研究。
例子
假设有三个变量 A,B,CA, B, CA,B,C,计算得到的皮尔逊相关系数矩阵可能如下:
A | B | C | |
---|---|---|---|
A | 1 | 0.8 | -0.3 |
B | 0.8 | 1 | 0.2 |
C | -0.3 | 0.2 | 1 |
这个矩阵表示:
- A 和 B 的相关性较强。
- A 和 C 之间存在负相关。
- B 和 C 的相关性较弱。
测试一个简单demo
import pandas as pd
import numpy as np
# 创建一个示例数据集
data = {
'feature1': np.random.rand(100),
'feature2': np.random.rand(100),
'feature3': np.random.rand(100),
'feature4': np.random.rand(100),
'target': np.random.rand(100)
}
df = pd.DataFrame(data)
# 计算皮尔逊相关系数矩阵
correlation_matrix = df.corr(method='pearson')
# 显示相关系数矩阵
print("相关系数矩阵:\n", correlation_matrix)
# 设置相关性阈值
threshold = 0.5
# 筛选相关性大于阈值的特征
relevant_features = correlation_matrix['target'][abs(correlation_matrix['target']) > threshold].index.tolist()
# 移除目标变量
relevant_features.remove('target')
print("与目标变量相关性大于阈值的特征:", relevant_features)
返回结果
相关系数矩阵:
feature1 feature2 feature3 feature4 target
feature1 1.000000 -0.112876 -0.148784 0.011113 0.059841
feature2 -0.112876 1.000000 -0.093312 0.140427 0.177329
feature3 -0.148784 -0.093312 1.000000 0.086698 -0.032103
feature4 0.011113 0.140427 0.086698 1.000000 0.196255
target 0.059841 0.177329 -0.032103 0.196255 1.000000
生产上使用下面方法和调用去返回数据分析
def build_correlations_matrix(data_id, is_pps=False, encode_strings=False, image=False):
data = run_query(
handle_predefined(data_id),
build_query(data_id, global_state.get_query(data_id)),
global_state.get_context_variables(data_id),
)
valid_corr_cols, valid_str_corr_cols, valid_date_cols = correlations.get_col_groups(
data_id, data
)
str_encodings_code = ""
dummy_col_mappings = {}
if encode_strings and valid_str_corr_cols:
data = data[valid_corr_cols + valid_str_corr_cols]
dummy_kwargs = {}
if pandas_util.is_pandas2():
dummy_kwargs["dtype"] = "int"
for str_col in valid_str_corr_cols:
dummies = pd.get_dummies(data[[str_col]], columns=[str_col], **dummy_kwargs)
dummy_cols = list(dummies.columns)
dummy_col_mappings[str_col] = dummy_cols
data[dummy_cols] = dummies
valid_corr_cols += dummy_cols
str_encodings_code = (
"str_corr_cols = [\n\t'{valid_str_corr_cols}'\n]\n"
"dummies = pd.get_dummies(corr_data, str_corr_cols)\n"
"corr_data.loc[:, dummies.columns] = dummies\n"
).format(valid_str_corr_cols="', '".join(valid_str_corr_cols))
else:
data = data[valid_corr_cols]
corr_cols_str = "'\n\t'".join(
["', '".join(chunk) for chunk in divide_chunks(valid_corr_cols, 8)]
)
pps_data = None
if is_pps:
code = build_code_export(data_id, imports="import ppscore\n")
code.append(
(
"corr_cols = [\n"
"\t'{corr_cols}'\n"
"]\n"
"corr_data = df[corr_cols]\n"
"{str_encodings}"
"corr_data = ppscore.matrix(corr_data)\n"
).format(corr_cols=corr_cols_str, str_encodings=str_encodings_code)
)
data, pps_data = get_ppscore_matrix(data[valid_corr_cols])
else:
data, matrix_code = correlations.build_matrix(
data_id,
data,
valid_corr_cols,
{"corr_cols": corr_cols_str, "str_encodings": str_encodings_code},
)
code = [matrix_code]
code.append(
"corr_data.index.name = str('column')\ncorr_data = corr_data.reset_index()"
)
code = "\n".join(code)
data.index.name = str("column")
if image:
return build_correlations_matrix_image(
data,
is_pps,
valid_corr_cols,
valid_str_corr_cols,
valid_date_cols,
dummy_col_mappings,
pps_data,
code,
)
return (
valid_corr_cols,
valid_str_corr_cols,
valid_date_cols,
dummy_col_mappings,
pps_data,
code,
data,
)
接口调用该方法
@dtale.route("/correlations/<data_id>")
@exception_decorator
def get_correlations(data_id):
"""
:class:`flask:flask.Flask` route which gathers Pearson correlations against all combinations of columns with
numeric data using :meth:`pandas:pandas.DataFrame.corr`
On large datasets with no :attr:`numpy:numpy.nan` data this code will use :meth:`numpy:numpy.corrcoef`
for speed purposes
:param data_id: integer string identifier for a D-Tale process's data
:type data_id: str
:param query: string from flask.request.args['query'] which is applied to DATA using the query() function
:returns: JSON {
data: [{column: col1, col1: 1.0, col2: 0.99, colN: 0.45},...,{column: colN, col1: 0.34, col2: 0.88, colN: 1.0}],
} or {error: 'Exception message', traceback: 'Exception stacktrace'}
"""
is_pps = get_bool_arg(request, "pps")
image = get_bool_arg(request, "image")
matrix_data = build_correlations_matrix(
data_id,
is_pps=is_pps,
encode_strings=get_bool_arg(request, "encodeStrings"),
image=image,
)
(
valid_corr_cols,
valid_str_corr_cols,
valid_date_cols,
dummy_col_mappings,
pps_data,
code,
df_or_image,
) = matrix_data
if image:
fname = "{}.png".format("predictive_power_score" if is_pps else "correlations")
return send_file(df_or_image, fname, "image/png")
data = df_or_image.reset_index()
col_types = grid_columns(data)
f = grid_formatter(col_types, nan_display=None)
return jsonify(
data=f.format_dicts(data.itertuples()),
dates=valid_date_cols,
strings=valid_str_corr_cols,
dummyColMappings=dummy_col_mappings,
code=code,
pps=pps_data,
)
前端渲染页面