HOWTO · Seaborn
Seaborn BoxPlot
이 튜토리얼은 파이썬에서 seaborn 모듈을 사용하여 상자 플롯을 만드는 방법을 보여줍니다.
이 페이지의 내용
seaborn.boxplot()은 숫자형 데이터의 분포를 요약하거나 범주별 값을 비교할 때 사용할 수 있습니다. 각 데이터 열을 축에 명시적으로 연결하면 Seaborn이 어떤 변수를 어느 축에 표시할지 알 수 있습니다. 상자 그림은 중앙값과 사분위수 범위(IQR)를 보여 줍니다. 기본 수염 규칙에서는 상자에서 1.5 IQR 이내에 있는 관측값 중 가장 바깥쪽 값까지 수염이 이어지고, 그보다 멀리 있는 관측값은 개별 점으로 표시됩니다.
하나의 분포를 상자 그림으로 나타내기
측정값을 DataFrame 열에 넣고 해당 열을 y에 연결합니다. 그러면 데이터의 역할이 명확해지고 그래프 축에도 유용한 레이블이 붙습니다. 아래 예제는 고정된 값을 사용하므로 실행할 때마다 같은 입력 데이터가 사용됩니다.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24]})
ax = sns.boxplot(data=data, y="Score")
ax.set_title("Score distribution")
plt.show()
상자 안의 선은 중앙값을 나타냅니다. 상자는 제1사분위수부터 제3사분위수까지 이어지므로 높이는 관측값 가운데 절반이 분포하는 범위를 나타냅니다. 상자가 길수록 데이터의 중앙 부분이 더 넓게 퍼져 있습니다. 수염은 선택한 수염 규칙에 따른 범위를 보여 주며, 항상 최솟값과 최댓값까지 이어지는 것은 아닙니다.
범주별 분포 비교하기
범주를 x에, 숫자형 측정값을 y에 연결하면 각 범주에 상자가 하나씩 표시됩니다. 이 데이터셋에서 각 상자는 하나의 Quantity 수준에 해당하는 Price 분포를 요약합니다. hue="Product"를 추가하면 각 범주가 제품 그룹별로 나뉘어 같은 수량에서 제품 간 차이를 비교하기 쉽습니다.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
"Product": ["A", "A", "A", "A", "B", "B", "B", "B"] * 2,
}
)
ax = sns.boxplot(data=data, x="Quantity", y="Price", hue="Product")
ax.set_title("Price by quantity and product")
plt.show()
추가 그룹이 비교하려는 질문에 답을 줄 때 hue를 사용하세요. 그룹이 많으면 상자들이 서로 겹쳐 복잡해질 수 있습니다. 분포를 읽기 쉽게 유지하려면 범주를 단순화하거나 그래프를 나누어 그리세요.
Strip Plot으로 개별 관측값 표시하기
상자 그림은 데이터를 요약 통계로 압축해 보여 줍니다. 각 관측값도 보여 주려면 seaborn.stripplot()을 겹쳐 그리세요. 두 그래프에서 같은 축과 데이터 연결을 사용하고, 값이 비슷한 점들이 완전히 겹치지 않도록 가로 방향으로 약간의 지터를 적용합니다.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24]})
ax = sns.boxplot(data=data, y="Score", color="lightgray")
sns.stripplot(data=data, y="Score", color="darkred", jitter=0.15, ax=ax)
ax.set_title("Scores with individual observations")
plt.show()
상자는 계속 요약 정보를 나타내고, 각 표식은 데이터의 한 행을 나타냅니다. 데이터가 많으면 점들이 겹칠 수 있으므로 표식 크기나 투명도를 조정해 점이 밀집된 영역도 알아보기 쉽게 하세요.
상자 그림 사용자 지정하기
Matplotlib의 축 범위 메서드로 관심 있는 값의 범위를 강조하고, linewidth로 상자와 수염 테두리의 두께를 조절하며, palette로 범주별 색상을 지정할 수 있습니다. orient 매개변수는 그래프의 방향을 제어합니다. 예를 들어 데이터 연결이 맞으면 orient="h"로 가로 방향 그래프를 요청할 수 있습니다. 축 범위는 화면에 보이는 영역만 바꾸므로, 관련 관측값이 가려지지 않도록 범위와 눈금을 명확히 선택하세요.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
"Product": ["A", "A", "A", "A", "B", "B", "B", "B"] * 2,
}
)
ax = sns.boxplot(
data=data,
x="Quantity",
y="Price",
hue="Product",
linewidth=2.5,
palette="Set2",
)
ax.set_ylim(8, 20)
ax.set_title("Customized price comparison")
plt.show()
팔레트의 색상은 hue 그룹에 대응합니다. 가로 상자를 사용하려면 범주와 측정값의 연결을 서로 바꾸고 orient="h"로 설정하세요. 그러면 축 범위는 set_ylim()이 아니라 set_xlim()으로 지정해야 합니다.
catplot()으로 상자 그림 만들기
그림 수준 인터페이스를 사용하려면 catplot()에 kind="box"를 지정하세요. 같은 방식으로 데이터를 명시적으로 연결할 수 있으며, 다른 변수별로 비교를 나누려면 col이나 row를 사용해 별도의 패널을 만들 수 있습니다. 그래프 하나만 필요할 때는 축 수준 옵션인 seaborn.boxplot()을 사용할 수 있고, 패싯이 필요한 그림에는 catplot()이 편리합니다.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
}
)
grid = sns.catplot(data=data, x="Quantity", y="Price", kind="box")
grid.set_axis_labels("Quantity", "Price")
grid.fig.suptitle("Price by quantity")
plt.show()