팬더를 사용하여 상관 행렬 플롯
나는 엄청난 수의 특징을 가진 데이터 세트를 가지고 있어서 상관 행렬을 분석하는 것은 매우 어려워졌다.우리가 사용하는 상관 행렬을 그림으로 표시하려고 한다.dataframe.corr()
하는 이 을 그리는 기능이 판다 도서관에서 제공하는 이 행렬을 그림으로 그릴 수 있는 기능이 있는가?
다음에서 사용할 수 있음matplotlib
:
import matplotlib.pyplot as plt
plt.matshow(dataframe.corr())
plt.show()
편집 :
설명에는 축 눈금 레이블을 변경하는 방법에 대한 요청이 있었다.여기 더 큰 그림 크기에 그려진 디럭스 버전과 데이터 프레임과 일치하는 축 레이블, 그리고 색상 척도를 해석하는 색상 막대 범례가 있다.
라벨의 크기와 회전율을 조정하는 방법을 포함시키고, 컬러바와 메인 피규어가 같은 높이로 나오게 하는 그림비율을 사용하고 있다.
EDIT 2: df.corr() 방법은 숫자가 아닌 열을 무시하므로,.select_dtypes(['number'])
라벨의 원치 않는 이동을 방지하기 위해 x 및 y 라벨을 정의할 때 사용해야 한다(아래 코드 참조).
f = plt.figure(figsize=(19, 15))
plt.matshow(df.corr(), fignum=f.number)
plt.xticks(range(df.select_dtypes(['number']).shape[1]), df.select_dtypes(['number']).columns, fontsize=14, rotation=45)
plt.yticks(range(df.select_dtypes(['number']).shape[1]), df.select_dtypes(['number']).columns, fontsize=14)
cb = plt.colorbar()
cb.ax.tick_params(labelsize=14)
plt.title('Correlation Matrix', fontsize=16);
그래프를 생성하는 것이 아니라 상관 행렬을 시각화하는 것이 주된 목표라면, 편리한 방법pandas
스타일링 옵션은 실행 가능한 내장 솔루션:
import pandas as pd
import numpy as np
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
corr = df.corr()
corr.style.background_gradient(cmap='coolwarm')
# 'RdBu_r', 'BrBG_r', & PuOr_r are other good diverging colormaps
이는 JuffyterLab 노트북과 같이 HTML 렌더링을 지원하는 백엔드에 있어야 한다는 점에 유의하십시오.
스타일링
자릿수 정밀도를 쉽게 제한할 수 있음:
corr.style.background_gradient(cmap='coolwarm').set_precision(2)
또는 주석 없이 행렬을 원하는 경우 숫자를 모두 제거하십시오.
corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})
스타일링 설명서에는 마우스 포인터가 맴돌고 있는 셀의 디스플레이를 변경하는 방법과 같은 고급 스타일에 대한 지침도 포함되어 있다.
시간비교
내 시험에서,style.background_gradient()
4배 더 빨랐다.plt.matshow()
120배 빠른 속도sns.heatmap()
10x10 매트릭스로 말이야불행히도 그것은 더 잘 확장되지 않는다.plt.matshow()
: 100x100 매트릭스에 대해 두 매트릭스는 거의 동일한 시간을 가진다.plt.matshow()
1000x1000 매트릭스의 경우 10배 더 빠름
저장
스타일화된 데이터 프레임을 저장하는 몇 가지 가능한 방법이 있다.
- HTML을
render()
메소드를 사용한 다음 파일에 출력을 기록하십시오. - 으로
.xslx
를 추가하여 조건부 포맷으로 파일화하다.to_excel()
방법의 - imgkit와 결합하여 비트맵 저장
- (여기서 한 것처럼) 스크린샷을 찍어라.
전체 행렬에 걸쳐 색상 표준화(판다 >= 0.24)
설정별axis=None
이제 열 또는 행당보다 전체 행렬을 기준으로 색상을 계산할 수 있다.
corr.style.background_gradient(cmap='coolwarm', axis=None)
단일 코너 열 지도
많은 사람들이 이 답을 읽고 있기 때문에, 나는 상관 행렬의 한 구석만을 보여줄 수 있는 팁을 추가해야겠다고 생각했다.나는 이것이 중복된 정보를 제거하기 때문에 내 스스로 읽는 것이 더 쉽다고 생각한다.
# Fill diagonal and upper half with NaNs
mask = np.zeros_like(corr, dtype=bool)
mask[np.triu_indices_from(mask)] = True
corr[mask] = np.nan
(corr
.style
.background_gradient(cmap='coolwarm', axis=None, vmin=-1, vmax=1)
.highlight_null(null_color='#f1f1f1') # Color NaNs grey
.set_precision(2))
Seaborn의 열 지도 버전:
import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)
상관 행렬에 대한 변수 이름도 표시하는 이 함수를 사용해 보십시오.
def plot_corr(df,size=10):
"""Function plots a graphical correlation matrix for each pair of columns in the dataframe.
Input:
df: pandas DataFrame
size: vertical and horizontal size of the plot
"""
corr = df.corr()
fig, ax = plt.subplots(figsize=(size, size))
ax.matshow(corr)
plt.xticks(range(len(corr.columns)), corr.columns)
plt.yticks(range(len(corr.columns)), corr.columns)
해저에서 열 지도를 그리거나 팬더에서 산포 행렬을 그리면 특징 간의 관계를 관찰할 수 있다.
산점도 행렬:
pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');
각 형상의 왜도도를 시각화하려면 해저 쌍 그림을 사용하십시오.
sns.pairplot(dataframe)
SNS 열 지도:
import seaborn as sns
f, ax = pl.subplots(figsize=(10, 8))
corr = dataframe.corr()
sns.heatmap(corr, mask=np.zeros_like(corr, dtype=np.bool), cmap=sns.diverging_palette(220, 10, as_cmap=True),
square=True, ax=ax)
출력은 형상의 상관관계 지도가 될 것이다. 즉, 아래 예제를 참조하라.
식료품과 세제 사이의 상관관계가 높다.이와 유사하게:
Pdoducts With High Correlation:- 식료품과 세제.
- 밀크와 식료품
- 우유 및 세제_종이
- 밀크 앤 델리
- 냉동과 신선.
- 얼린과 델리.
페어플롯에서:당신은 쌍끌이 또는 산점 행렬에서 동일한 관계 집합을 관찰할 수 있다.그러나 이것들로부터 우리는 데이터가 정상적으로 분배되는지 아닌지를 말할 수 있다.
참고: 위의 그래프는 열 지도를 그리는 데 사용되는 데이터에서 가져온 그래프와 동일하다.
완전성을 위해, 2019년 말 현재 바다오른에서 내가 알고 있는 가장 간단한 해결책, 만약 주피터를 사용하고 있다면:
import seaborn as sns
sns.heatmap(dataframe.corr())
matplotlib에서 imshow() 메서드를 사용할 수 있다.
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.imshow(X.corr(), cmap=plt.cm.Reds, interpolation='nearest')
plt.colorbar()
tick_marks = [i for i in range(len(X.columns))]
plt.xticks(tick_marks, X.columns, rotation='vertical')
plt.yticks(tick_marks, X.columns)
plt.show()
데이터 프레임이 다음과 같은 경우df
간단하게 사용 가능:
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)
더 능력 있고, 상호 작용하며, 대안을 사용하기 쉽다고 언급한 사람이 아무도 없다는 사실에 놀랐다.
A) 다음을 플롯으로 사용할 수 있다.
두 줄만 줄이면 다음과 같이 된다.
상호작용,
부드러운 눈금,
개별 열 대신 전체 데이터 프레임에 기반한 색상
축의 열 이름 및 행 인덱스,
확대,
패닝,
PNG 형식으로 저장할 수 있는 내장 원클릭 기능,
자동 검색,
맴도는 것에 대한 비교,
열 지도는 여전히 양호해 보이고 원하는 곳에서 값을 볼 수 있도록 값을 표시하는 버블:
import plotly.express as px
fig = px.imshow(df.corr())
fig.show()
B) Bokeh를 사용할 수도 있다.
모든 기능이 동일하고 번거로움도 약간 있다.그러나 만약 당신이 음모를 꾸미는데 참여하지 않고 여전히 이 모든 것을 원한다면 여전히 그럴 가치가 있다.
from bokeh.plotting import figure, show, output_notebook
from bokeh.models import ColumnDataSource, LinearColorMapper
from bokeh.transform import transform
output_notebook()
colors = ['#d7191c', '#fdae61', '#ffffbf', '#a6d96a', '#1a9641']
TOOLS = "hover,save,pan,box_zoom,reset,wheel_zoom"
data = df.corr().stack().rename("value").reset_index()
p = figure(x_range=list(df.columns), y_range=list(df.index), tools=TOOLS, toolbar_location='below',
tooltips=[('Row, Column', '@level_0 x @level_1'), ('value', '@value')], height = 500, width = 500)
p.rect(x="level_1", y="level_0", width=1, height=1,
source=data,
fill_color={'field': 'value', 'transform': LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max())},
line_color=None)
color_bar = ColorBar(color_mapper=LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max()), major_label_text_font_size="7px",
ticker=BasicTicker(desired_num_ticks=len(colors)),
formatter=PrintfTickFormatter(format="%f"),
label_standoff=6, border_line_color=None, location=(0, 0))
p.add_layout(color_bar, 'right')
show(p)
Statmodels 그래픽은 또한 상관 행렬의 멋진 보기를 제공한다.
import statsmodels.api as sm
import matplotlib.pyplot as plt
corr = dataframe.corr()
sm.graphics.plot_corr(corr, xnames=list(corr.columns))
plt.show()
다른 방법과 함께 모든 사례에 대해 산점도를 제공하는 페어 플롯을 갖는 것도 좋다.
import pandas as pd
import numpy as np
import seaborn as sns
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
sns.pairplot(df)
형태 상관 행렬, 나의 경우 zdf는 상관 행렬을 수행해야 하는 데이터 프레임이다.
corrMatrix =zdf.corr()
corrMatrix.to_csv('sm_zscaled_correlation_matrix.csv');
html = corrMatrix.style.background_gradient(cmap='RdBu').set_precision(2).render()
# Writing the output to a html file.
with open('test.html', 'w') as f:
print('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-widthinitial-scale=1.0"><title>Document</title></head><style>table{word-break: break-all;}</style><body>' + html+'</body></html>', file=f)
그러면 스크린샷을 찍으면 되잖아.또는 html을 이미지 파일로 변환하십시오.
좋은 답변이 많다고 생각하지만 구체적인 칼럼을 다루어야 하고 다른 줄거리를 보여야 하는 분들에게 이런 답변을 추가했다.
import numpy as np
import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(18, 18))
df= df.iloc[: , [3,4,5,6,7,8,9,10,11,12,13,14,17]].copy()
corr = df.corr()
plt.figure(figsize=(11,8))
sns.heatmap(corr, cmap="Greens",annot=True)
plt.show()
사용할 수 있다heatmap()
서로 다른 특성 b/w를 보기 위해 해저에서:
import matplot.pyplot as plt
import seaborn as sns
co_matrics=dataframe.corr()
plot.figure(figsize=(15,20))
sns.heatmap(co_matrix, square=True, cbar_kws={"shrink": .5})
아래에서 읽을 수 있는 코드를 확인하십시오.
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(36, 26))
heatmap = sns.heatmap(df.corr(), vmin=-1, vmax=1, annot=True)
heatmap.set_title('Correlation Heatmap', fontdict={'fontsize':12}, pad=12)```
[1]: https://i.stack.imgur.com/I5SeR.png
corrmatrix = df.corr()
corrmatrix *= np.tri(*corrmatrix.values.shape, k=-1).T
corrmatrix = corrmatrix.stack().sort_values(ascending = False).reset_index()
corrmatrix.columns = ['Признак 1', 'Признак 2', 'Корреляция']
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
drop_columns = corrmatrix[(corrmatrix['Корреляция'] >= 0.82) + (corrmatrix['Корреляция'] <= -0.7)]['Признак 2']
df.drop(drop_columns, axis=1, inplace=True)
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
참조URL: https://stackoverflow.com/questions/29432629/plot-correlation-matrix-using-pandas
'IT이야기' 카테고리의 다른 글
하위 구성 요소에서 상위 데이터 업데이트 (0) | 2022.03.10 |
---|---|
Vue-Form-Wizard의 현재 단계 선택에 따라 동적으로 구성 요소 로드 (0) | 2022.03.10 |
형식 지정 기능에서 2가지 유형을 반환하는 모범 사례? (0) | 2022.03.10 |
Flux 아키텍처에서 클라이언트 측 라우팅/url 상태를 어떻게 관리하십니까? (0) | 2022.03.10 |
불변 위반:a 밖에서 사용하면 안 된다. (0) | 2022.03.10 |