HOWTO · Seaborn

Seaborn 라인 플롯을 만드는 방법

이 튜토리얼에서는 Seaborn 모듈을 사용해 Python에서 라인 플롯을 만드는 방법을 시연합니다. 사용자 지정 가능한 라인 플롯, 신뢰 구간, 비교 분석을 위한 여러 선을 이용해 데이터를 효과적으로 시각화하는 방법을 알아보세요. 데이터 시각화 실력을 높이고 싶은 초보자와 숙련된 사용자 모두에게 적합합니다.

이 페이지의 내용

Seaborn 라인 플롯은 x 변수와 y 변수의 값을 선으로 연결된 점에 매핑합니다. 시계열에 자주 사용되지만, x는 순서가 있거나 연속적인 변수라면 무엇이든 될 수 있습니다. seaborn.lineplot() 함수는 반복된 관측을 요약하고 범주별로 별도의 선을 그릴 수도 있어, 측정값이 어떻게 변하는지 탐색하고 그룹을 비교하는 데 유용합니다.

Seaborn 시작하기

Seaborn은 Matplotlib 위에 구축된 통계 플로팅 라이브러리입니다. 아래 예제에서는 이름 있는 열들을 함께 유지하는 편리한 방법인 pandas DataFrame을 사용합니다. Seaborn과 그 의존성이 Python 환경에서 아직 사용할 수 없다면 설치한 뒤, Seaborn과 Matplotlib를 가져오세요. 플로팅 예제에서는 별도의 설치 명령이 필요하지 않습니다.

이 튜토리얼의 예제는 Python 3.12에서 Seaborn 0.13.2, Matplotlib 3.11.2, pandas 3.1.0으로 실행하고 검증했으며, 아래의 모든 그림은 해당 예제가 실제로 생성한 출력입니다.

기본 라인 플롯 만들기

DataFrame을 data에 전달하고 x와 y의 열을 지정하세요. 다음 예제는 고정된 값을 사용하므로 그려지는 점이 재현 가능합니다. plt.show()를 호출하면 대화형 환경에서 그림이 열립니다. 노트북에서는 그림이 일반적으로 셀 결과로 표시됩니다.

이 예제를 실행하세요.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "day": [1, 2, 3, 4, 5],
    "visitors": [12, 15, 13, 18, 21],
})

sns.lineplot(data=data, x="day", y="visitors")
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Visitors by day")
plt.tight_layout()
plt.show()

1일부터 5일까지의 방문자 수를 나타낸 Seaborn 라인 플롯으로, 12에서 21로 상승하고 3일째에 13으로 떨어집니다.

가로축은 day를 사용하고 세로축은 visitors를 사용합니다. 이 이름과 값들을 자신의 표에 있는 열로 바꾸세요. 행들이 x 값을 공유하면 Seaborn은 그 위치의 y 관측을 집계하고 불확실성 밴드를 표시할 수 있습니다. 다음 섹션에서는 이러한 특징을 해석하는 방법을 설명합니다.

라인 플롯 사용자 지정하기

모양 설정은 독자가 시리즈를 구분하거나 그 값을 따라가는 데 도움이 됩니다. 예를 들어 color는 선 색상을 설정하고, marker는 각 관측에 기호를 배치하며, linestyle은 선의 패턴을 변경합니다. 이는 시각적인 선택입니다. 그룹을 만들거나 어떤 행이 데이터에 속하는지를 바꾸지는 않습니다. 그림이 읽힐 크기에서도 쉽게 구분할 수 있는 색상과 마커를 선택하세요.

가져오기와 data 정의가 포함된 스크립트에서 위와 동일한 결정적인 표를 사용하세요. 이 완전한 변형은 점선을 이용해 점을 강조합니다.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "day": [1, 2, 3, 4, 5],
    "visitors": [12, 15, 13, 18, 21],
})

sns.lineplot(data=data, x="day", y="visitors", color="darkorange", marker="o", linestyle="--")
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Visitors by day")
plt.tight_layout()
plt.show()

동일한 방문자 라인 플롯을 짙은 주황색 점선과 각 관측값의 원형 마커로 다시 스타일링한 그림입니다.

다른 모양을 원한다면 이러한 인자를 변경하거나 Matplotlib 메서드를 사용해 레이블과 제목을 설정하세요. 나중에 읽는 사람이 각 점이 무엇을 나타내는지 알 수 있도록 x와 y의 매핑을 명시적으로 유지하세요.

신뢰 구간 추가하기

선 주위의 불확실성 밴드는 추정치 주위의 변동이나 불확실성을 요약합니다. 그 의미는 데이터와 추정량에 따라 달라집니다. 여러 관측이 하나의 x 위치에 기여하면 중심선이 그것들을 요약할 수 있고, 밴드는 그 요약 주위의 불확실성을 전달합니다. 이는 단순히 표준 편차의 다른 이름이 아닙니다. 표준 편차는 관측들 사이의 퍼짐을 설명하고, 신뢰 구간은 추정된 양의 불확실성을 설명합니다.

다음 예제에서는 각 날짜에 세 개의 관측값을 부여합니다. 코드는 먼저 각 그룹의 평균을 출력하므로, 그려진 선을 단순한 숫자와 대조해 확인할 수 있습니다.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "day": [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
    "visitors": [10, 12, 14, 14, 16, 18, 13, 15, 17, 19, 21, 23],
})

print(data.groupby("day")["visitors"].mean())

sns.lineplot(data=data, x="day", y="visitors", marker="o")
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Mean visitors by day with 95% confidence band")
plt.tight_layout()
plt.show()

출력:

day
1    12.0
2    16.0
3    15.0
4    21.0
Name: visitors, dtype: float64

그룹 평균 12, 16, 15, 21을 통과하는 선으로 표시한 일평균 방문자 수와 그 주위의 음영 처리된 95% 신뢰 밴드입니다.

중심선은 출력된 평균(12, 16, 15, 21)을 통과합니다. 반복된 관측이 있으면 lineplot()은 기본적으로 각 x 그룹을 평균으로 집계합니다. 음영 밴드는 그 평균에 대한 95% 신뢰 구간으로, 부트스트래핑으로 계산됩니다. 그룹이 더 퍼져 있을수록 밴드는 넓어지며, 개별 관측값이 어디에 위치하는지는 말해 주지 않습니다.

밴드를 해석하기 전에, 각 x 값에 반복된 관측이 있는지, 그리고 그 관측이 무엇을 나타내는지 확인하세요. 예를 들어 동일한 대상으로부터의 반복 측정은 반드시 독립적인 표본을 나타내지는 않습니다. 각 x 값에 관측이 하나뿐이라면, 같은 방식으로 변동을 추론할 수 있는 위치 내 반복이 없습니다. 적절한 해석은 사용 중인 Seaborn 버전과 플로팅 옵션에도 따라 달라집니다. 여기의 예제는 Seaborn 0.12부터 사용할 수 있는 errorbar 매개변수를 사용합니다. Seaborn 0.13.2에서 기본값은 errorbar=("ci", 95)이며, errorbar="sd"는 대신 평균 양쪽으로 1 표준 편차를 아우르는 밴드를 그립니다. 추정량이나 구간 방법을 제어해야 할 때는 설치된 버전의 문서를 참조하세요. 밴드가 데이터에 의미가 없다면, 그에 맞게 플롯을 구성하거나 밴드를 생략하고 선이 어떻게 계산되었는지 설명하세요.

밴드가 의미가 없다면 errorbar=None으로 끄세요. 집계는 여전히 수행되어 선이 그룹 평균을 연결하지만, 밴드는 그려지지 않습니다.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "day": [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
    "visitors": [10, 12, 14, 14, 16, 18, 13, 15, 17, 19, 21, 23],
})

sns.lineplot(data=data, x="day", y="visitors", marker="o", errorbar=None)
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Mean visitors by day without uncertainty band")
plt.tight_layout()
plt.show()

errorbar를 None으로 설정해 그린 일평균 방문자 수로, 선이 불확실성 밴드 없이 동일한 그룹 평균을 연결합니다.

두 그림은 동일한 평균을 그리며, 차이는 밴드뿐입니다. 어느 그림이 더 깔끔해 보이는지가 아니라, 불확실성 요약이 독자에게 도움이 되는지를 기준으로 선택하세요.

여러 선 그리기

범주 기반 비교를 위해서는 범주 열을 포함해 hue에 매핑하세요. Seaborn은 범주마다 색상이 다른 별도의 선을 그리고 범례를 추가합니다. 선 패턴이 추가적인 시각적 구분을 제공할 수 있을 때는 style을 같은 범주 열이나 다른 범주 열에 매핑하세요. 범주는 행들이 같은 x 및 y 측정값을 공유할 때만 사용하고, 그룹 전반에 걸쳐 레이블과 단위를 일관되게 유지하세요.

고정된 관측값을 사용한 그룹화된 데이터의 완전한 예제는 다음과 같습니다.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({
    "week": [1, 2, 3, 1, 2, 3],
    "orders": [8, 11, 14, 6, 9, 10],
    "store": ["North", "North", "North", "South", "South", "South"],
})

sns.lineplot(data=data, x="week", y="orders", hue="store", style="store", markers=True, dashes=True)
plt.xlabel("Week")
plt.ylabel("Orders")
plt.title("Orders by store")
plt.tight_layout()
plt.show()

한 그림에 담긴 두 개의 라인 플롯으로, 8에서 14로 상승하는 North 매장의 주간 주문이 6에서 10으로 상승하는 South 매장 위에 있으며, 색상, 마커, 선 스타일로 구분됩니다.

대신 데이터가 시리즈마다 별도의 숫자 열을 가지고 있다면, 하나의 값 열과 하나의 시리즈 이름 열을 가진 긴 표로 재구성한 다음 시리즈 이름을 hue에 매핑하세요. 또는 각 y 열을 공유된 Matplotlib 축에 그리고 범례를 추가하기 전에 각 선에 레이블을 할당하세요. 어느 접근법에서든 범례는 모든 선을 식별하고 그 데이터와 일치해야 합니다. 서로 다른 단위나 척도를 숨기기 위해 범주 스타일을 사용하지 마세요. 직접 비교가 오해를 불러일으킬 수 있다면 별도의 축이나 별도의 그림을 고려하세요.

잘못 입력한 열 이름 수정하기

x와 y에 전달하는 이름은 data의 열 이름과 정확히 일치해야 합니다. 이름의 철자가 틀리면 lineplot()은 아무것도 그리기 전에 오류를 발생시킵니다. 이 호출은 visitor라는 열을 요구하지만, DataFrame에는 visitors만 있습니다.

import pandas as pd
import seaborn as sns

data = pd.DataFrame({
    "day": [1, 2, 3, 4, 5],
    "visitors": [12, 15, 13, 18, 21],
})

sns.lineplot(data=data, x="day", y="visitor")

출력:

ValueError: Could not interpret value `visitor` for `y`. An entry with this name does not appear in `data`.

메시지에는 인자(y), 실패한 값(visitor), 그리고 이유가 표시되므로 이 오류는 빠르게 수정할 수 있습니다. 이름을 실제 열과 비교하고(data.columns를 출력하면 목록이 나옵니다) 철자를 고치세요. 동일한 오류는 x나 철자가 틀린 hue 또는 style 열에서도 나타납니다.

결론

seaborn.lineplot()을 사용해 x 값에 따라 y 측정값을 연결한 다음, 모양 설정이나 범주 매핑을 선택해 그림을 읽기 쉽게 만드세요. 불확실성 밴드를 해석하기 전에 반복된 관측이 어떻게 요약되는지 확인하고, 비교하는 각 시리즈에 명확히 레이블을 지정하세요.

자주 묻는 질문

  1. Seaborn은 Matplotlib에 무엇을 추가하나요? Seaborn은 통계 그래픽을 위한 고수준 인터페이스를 제공하고, 그림 표시와 추가 서식을 위해 Matplotlib와 함께 동작합니다.
  2. pandas DataFrame을 전달할 수 있나요? 네. data를 DataFrame으로 설정하고 열 이름을 x와 y에 전달하세요.
  3. 선 모양을 어떻게 바꾸나요? color, marker, linestyle 같은 옵션을 사용하세요. 이것들은 모양을 바꾸고, hue는 범주를 별도의 선에 매핑합니다.
  4. 음영 밴드는 무엇을 의미하나요? 그려진 추정치와 연관된 불확실성 요약을 나타냅니다. 그 해석은 반복된 관측, 추정량, 선택한 구간 방법에 따라 달라지며, 자동으로 표준 편차가 되는 것은 아닙니다.
  5. 여러 선을 어떻게 비교할 수 있나요? 범주 열을 hue에 매핑하거나, 공유된 축에 별도로 레이블이 지정된 시리즈를 그리세요. 범례가 각 선을 정확히 이름 붙이는지 확인하세요.
  6. 음영 밴드를 어떻게 제거하나요? errorbar=None을 전달하세요. 선은 여전히 반복된 관측을 평균으로 집계하며, 생략되는 것은 불확실성 밴드뿐입니다.