Seaborn에서 ClusterMap 생성

Salman Mehmood 2024년2월15일
  1. Seaborn에서 clustermap() 메서드를 사용하여 Clustermap 생성
  2. Seaborn Clustermap에 row_colorscol_colors 옵션 추가
Seaborn에서 ClusterMap 생성

이 데모에서는 클러스터 맵이 무엇이며 여러 옵션에 대해 클러스터 맵을 만들고 사용하는 방법을 배웁니다.

Seaborn에서 clustermap() 메서드를 사용하여 Clustermap 생성

Seaborn 클러스터 맵은 히트 맵을 통해 매트릭스 엔터티를 시각화할 수 있는 매트릭스 플롯이지만 행과 열의 클러스터링도 얻을 수 있습니다.

몇 가지 필수 라이브러리를 가져오겠습니다.

암호:

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
import pandas as pd

이제 우리는 4명의 가상 학생에 대한 데이터를 생성할 것입니다. 우리는 그들의 이름, 공부 시간, 시험 점수, 거리 주소를 알 것입니다.

암호:

TOY_DATA_DICT = {
    "Name": ["Andrew", "Victor", "John", "Sarah"],
    "study_hours": [11, 25, 22, 14],
    "Score": [11, 30, 28, 19],
    "Street_Address": [20, 30, 21, 12],
}

따라서 이 장난감 데이터는 사전에 있지만 Pandas 데이터 프레임으로 변환하고 인덱스를 학생 이름으로 설정합니다.

암호:

TOY_DATA = pd.DataFrame(TOY_DATA_DICT)
TOY_DATA.set_index("Name", inplace=True)

TOY_DATA

따라서 4명의 가상 학생과 3개의 서로 다른 데이터 열이 있습니다. 여기에서 알 수 있듯이, 우리는 의도적으로 이 데이터 세트를 설계하여 study_hoursScore가 각 학생에게 매우 유사하도록 했습니다.

출력:

Seaborn Clustermap - 출력 1

clustermap() 메서드를 사용하여 이 데이터 프레임에 대한 클러스터 맵을 만들어 봅시다. TOY_DATA라는 전체 데이터 프레임만 전달하면 됩니다.

키워드 인수 annot을 하나 더 사용하고 True로 설정합니다. 이 인수를 사용하면 클러스터 맵의 히트 맵 부분에 인쇄된 실제 숫자를 볼 수 있습니다.

암호:

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
import pandas as pd


TOY_DATA_DICT = {
    "Name": ["Andrew", "Victor", "John", "Sarah"],
    "study_hours": [11, 25, 22, 14],
    "Score": [11, 30, 28, 19],
    "Street_Address": [20, 30, 21, 12],
}


TOY_DATA = pd.DataFrame(TOY_DATA_DICT)
TOY_DATA.set_index("Name", inplace=True)

TOY_DATA

sb.clustermap(TOY_DATA, figsize=(6, 4), annot=True)

plot.show()

값이 낮으면 색이 어두워지고 값이 높으면 색이 밝아집니다. 또한 이 열 지도의 왼쪽과 위쪽에 선이 있음을 알 수 있습니다. 이러한 선을 dendrograms라고 하며 seaborn이 데이터를 클러스터링한 방식입니다.

study_hoursscore가 함께 클러스터되어 학습 시간에서 점수까지의 거리를 보여줍니다. 그리고 거리가 가장 작기 때문에 먼저 덴드로그램에서 함께 클러스터링된 다음 다른 두 열과 덜 유사한 street_address를 추가합니다.

우리는 이 덴드로그램이 서로 다른 각 열이 서로 얼마나 떨어져 있는지에 대한 감각을 제공하며 동일한 일이 행에서 발생한다고 말할 수 있습니다. 또한 Seaborn이 행과 열을 재정렬했음을 알 수 있습니다.

출력:

Seaborn Clustermap - 출력 2

고급 데이터 세트에서 클러스터 맵을 살펴보겠습니다. 우리는 Seaborn 라이브러리에서 일부 데이터를 로드하고 있으며 이 데이터는 펭귄에 관한 것입니다.

암호:

PENGUINS = sb.load_dataset("penguins").dropna()
PENGUINS.head()

출력:

Seaborn Clustermap - 출력 3

이 데이터 세트에는 약 300마리의 펭귄이 있으며 shape 속성을 사용하여 데이터의 모양을 볼 수 있습니다.

암호:

print(PENGUINS.shape)

출력:

Seaborn Clustermap - 출력 4

이 데이터에 대한 클러스터 맵을 작성해 보겠습니다. 이러한 클러스터 맵 중 하나로 전달하는 데이터는 숫자여야 하므로 이 데이터 프레임의 숫자 열로만 필터링해야 합니다.

Seaborn Clustermap - 출력 5

고급 클러스터 맵을 만들어 봅시다.

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
import pandas as pd


PENGUINS = sb.load_dataset("penguins").dropna()
PENGUINS.head()
print(PENGUINS.shape)

NUMERICAL_COLS = PENGUINS.columns[2:6]
print(NUMERICAL_COLS)

sb.clustermap(PENGUINS[NUMERICAL_COLS], figsize=(6, 6))
plot.show()

이 코드를 실행하면 매우 어두운 값을 가진 3개의 열과 매우 밝은 값을 가진 1개의 열만 있음을 즉시 확인할 수 있습니다. 이는 서로 다른 열에 대해 서로 다른 척도를 갖기 때문입니다.

출력:

Seaborn Clustermap - 출력 6

3개의 열에는 더 작은 값이 있고, body_mass_g 열에는 매우 큰 값이 있습니다. 그러나 이것은 일종의 도움이 되지 않는 열 지도를 만들 수 있으므로 데이터를 확장해야 합니다.

클러스터 맵 내에서 데이터를 확장하는 몇 가지 방법이 있지만 한 가지 쉬운 방법은 standard_scale이라는 이 인수를 사용하는 것입니다. 이 인수의 값은 각 행의 크기를 조정하려는 경우 0이고 각 열의 크기를 조정하려는 경우 1입니다.

암호:

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
import pandas as pd


PENGUINS = sb.load_dataset("penguins").dropna()
PENGUINS.head()
print(PENGUINS.shape)

NUMERICAL_COLS = PENGUINS.columns[2:6]
print(NUMERICAL_COLS)

sb.clustermap(PENGUINS[NUMERICAL_COLS], figsize=(6, 6), standard_scale=1)
plot.show()

이제 모든 값이 0과 1 사이에 표시됩니다. 각 열을 동일한 척도에 배치하여 더 쉽게 비교할 수 있습니다.

또한 서로 다른 모든 펭귄이 모여 있는 것을 볼 수 있으므로 어떤 펭귄이 서로 가장 유사한지 파악하는 데 도움이 될 수 있습니다.

출력:

Seaborn Clustermap - 출력 7

seaborn 클러스터 맵에서 거리를 판단하는 데 사용되는 연결과 행렬을 모두 변경할 수 있으므로 method 인수를 사용하여 연결을 변경해 보겠습니다. 최소 연결인 single이라는 값으로 문자열을 전달할 수 있습니다.

암호:

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
import pandas as pd


PENGUINS = sb.load_dataset("penguins").dropna()
PENGUINS.head()
print(PENGUINS.shape)

NUMERICAL_COLS = PENGUINS.columns[2:6]
print(NUMERICAL_COLS)

sb.clustermap(
    PENGUINS[NUMERICAL_COLS], figsize=(10, 9), standard_scale=1, method="single"
)
plot.show()

단일 링키지를 사용할 때 덴드로그램이 약간 달라지기 시작하는 것을 알 수 있습니다.

출력:

Seaborn Clustermap - 출력 8

Seaborn Clustermap에 row_colorscol_colors 옵션 추가

클러스터 맵을 구축할 때 사용할 수 있는 몇 가지 추가 옵션이 있습니다. seaborn 클러스터 맵의 추가 옵션은 row_colors 또는 col_colors입니다.

이제 각 색상을 지정하고 펭귄 열(범주 열)에서 이 데이터를 가져옵니다.

암호:

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
import pandas as pd


PENGUINS = sb.load_dataset("penguins").dropna()
PENGUINS.head()

NUMERICAL_COLS = PENGUINS.columns[2:6]

SPECIES_COLORS = PENGUINS.species.map(
    {"Adelie": "blue", "Chinstrap": "red", "Gentoo": "green"}
)

sb.clustermap(
    PENGUINS[NUMERICAL_COLS],
    figsize=(10, 9),
    standard_scale=1,
    row_colors=SPECIES_COLORS,
)
plot.show()

다양한 유형의 펭귄 종과 함께 모든 행에 대한 깃발을 볼 수 있습니다.

출력:

Seaborn Clustermap - 출력 9

Seaborn은 백엔드에서 scipy 또는 fast cluster를 활용하고 있으므로 이러한 사용 가능한 연결 옵션에 대해 자세히 보려면 scipy 문서를 확인하십시오.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn