데이터 분석 7단계 워크플로우 1편. Seaborn Heatmap

Seaborn Heatmap image

오늘은 아주 짧은 Seaborn Heatmap 예제를 가지고, 데이터 분석 & 시각화 7단계 전체를 한 번에 훑어보는 포스트입니다.

아래에서 보듯이 코드 자체는 몇 줄밖에 안 되지만, 데이터 분석가라면 기본 중에 기본인 그래프로 다룰 수 있어야 합니다. 데이터 분석 과정 중에 꼭 다루는 부분이기도 하구요.

우리가 사용할 예제 코드는 아래와 같습니다.(출처: Seaborn 공식 홈페이지)

import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme()

# Load the example flights dataset and convert to long-form
flights_long = sns.load_dataset("flights")
flights = (
    flights_long
    .pivot(index="month", columns="year", values="passengers")
)

# Draw a heatmap with the numeric values in each cell
f, ax = plt.subplots(figsize=(9, 6))
sns.heatmap(flights, annot=True, fmt="d", linewidths=.5, ax=ax)
jupyter notebook seaborn heatmap

1단계 📥 데이터 수집/로딩

여기서는 FRED API나 CSV 파일이 아니라, seaborn이 제공하는 샘플 데이터셋을 사용합니다.

flights_long = sns.load_dataset("flights")
  • sns.load_dataset("flights")
    → 1949~1960년 월별 항공 승객 수 데이터를 자동으로 내려받아 DataFrame으로 로딩
  • 실제 프로젝트에서는
    • pd.read_csv(), pd.read_excel(), DB 쿼리, API 요청 등으로 대체될 부분입니다.

즉, 지금은 “데이터를 어디선가 가져왔다”를 seaborn이 대신해 주는 편리한 연습용 단계라고 보시면 됩니다.

2단계 🔍 데이터 탐색(EDA) – flights_long 들여다보기

flights_long.head() image
flights_long.info() image
flights_long.describe() image

데이터 분석가라면 기본적으로 컴퓨터에서는 보통 위와 같이 찍어보겠죠.
위 그림은 주피터 노트북을 이용해서 확인해본거예요.

flights_long.head()
flights_long.info()
flights_long.describe()
  • 어떤 컬럼이 있는지: year, month, passengers
  • 데이터 타입은 어떤지: int, category
  • 값의 범위: 승객 수가 대략 어느 정도인지

seaborn heatmap을 그리기 전에 “이 데이터는 시간에 따라 어떻게 변하는 값이구나” 정도의 감을 잡는 것이 2단계의 핵심입니다.

3단계 🧹 데이터 전처리 – pivot으로 모양 바꾸기

seaborn heatmap은 행·열에 의미가 있는 2차원 테이블을 그리기 좋습니다. 그래서 yearmonth를 행·열로 만들기 위해 pivot을 사용합니다.

flights = (
    flights_long
    .pivot(index="month", columns="year", values="passengers")
)
  • index="month" → y축(행)에 월
  • columns="year" → x축(열)에 연도
  • values="passengers" → 셀 값은 승객 수

이게 바로 3단계 전처리입니다.
실전에서는 여기서 더 나아가

  • 결측치 처리 (.fillna())
  • 로그 변환, 정규화
  • 특정 연도/월만 필터링
    등이 들어갑니다.

4단계 📈 시각화 설계 – 왜 Seaborn Heatmap인가?

(데이터를 보고 시각화를 이제 시작한다는 가정하에)
이제 “어떤 그래프로 그릴까?”를 결정해야 합니다.

이런 시각화 설계는 데이터 분석 과정에서 필수적으로 다루는 주제입니다.
이 데이터의 질문은 대략 이런 느낌이죠.

  • 연도별로 승객 수가 늘어나는 추세가 보이는가?
  • 월별 패턴(성수기/비수기)이 있는가?

라인 그래프도 후보가 될 수 있지만,
연도 × 월을 한눈에 보는 데에는 seaborn heatmap이 훨씬 직관적입니다.

  • 행: 1~12월
  • 열: 1949~1960
  • 색: 승객 수 크기

이렇게 머릿속에 레이아웃을 잡는 과정이 4단계, 시각화 설계입니다.

5단계 🎨 그래프 생성 & 커스터마이징 – sns.heatmap

이제 실제 그래프를 만듭니다.

f, ax = plt.subplots(figsize=(9, 6))
sns.heatmap(flights, annot=True, fmt="d", linewidths=.5, ax=ax)

여기에도 살펴볼 만한 포인트가 꽤 많아요.

  • plt.subplots(figsize=(9, 6))
    → 그래프 전체 크기 설정 (가로 9, 세로 6)
  • sns.heatmap(flights, ...)
    • annot=True 숫자를 셀 안에 같이 표시
    • fmt="d" 정수 형태로 표시
    • linewidths=.5 셀 경계선 얇게 표시

실전에서는 여기에 컬러 팔레트(cmap="YlOrRd")까지 더하겠죠.

sns.heatmap(
    flights,
    annot=True,
    fmt="d",
    linewidths=.5,
    cmap="YlOrRd"
)

이 단계가 바로 seaborn heatmap을 이용한 그래프 생성 + 커스터마이징 단계입니다.

6단계 💡 인사이트 도출 – 색의 패턴 읽기

(출처: 코드로 직접 생성함)

그래프를 그렸으면, 이제 진짜 중요한 건 “그래프가 말해주는 이야기”입니다.

seaborn heatmap을 가만히 보면, 숫자보다 색의 흐름이 먼저 눈에 들어옵니다. 이 색 패턴을 천천히 따라가면서 인사이트를 도출해보시죠.

  1. 왼쪽은 어둡고, 오른쪽은 밝다 → 장기 성장 추세
    • 1949년(맨 왼쪽 열)은 전체적으로 짙은 보라색에 가깝고 값도 100대 초반에 머무릅니다.
    • 1960년(맨 오른쪽 열)로 갈수록 색이 점점 밝아지며, 400~600대의 연한 주황·살구색이 많아집니다.
    • 즉, 모든 달에서 승객 수가 꾸준히 증가하고 있고, 특정 달만 성장한 게 아니라 시간(연도)에 따라 전반적인 항공 수요가 성장하고 있다는 메시지를 줍니다.
  2. 가로로 보면 “계절 패턴”이 뚜렷하다
    • 1월(Jan), 2월(Feb), 11월(Nov), 12월(Dec)은 전체적으로 색이 상대적으로 어둡습니다.
    • 반대로 6월(Jun)부터 8월(Aug)까지는 거의 매년 색이 가장 밝고, 특히 7월·8월 행은 연도 전체에서 가장 “핫한” 색을 띱니다.
    • 이건 해석이 어렵지 않죠. 겨울·초봄은 비수기, 여름은 뚜렷한 성수기라는 걸 한눈에 보여 줍니다.
    • 만약 이게 항공이 아니라 매장 방문, 서비스 이용, 설비 가동률이었다면
      → “어느 시기에 인력/자원을 집중해야 하는가?”를 바로 파악할 수 있는 패턴입니다.
  3. 성수기 자체도 점점 더 밝아진다 → 성장 + 시즌 효과 강화
    • 1950년대 초반의 7~8월은 200~300대 값인데,
    • 1958~1960년의 7~8월은 400~600대까지 치솟습니다.
    • 단순히 “전체가 조금씩 증가”하는 게 아니라, 성수기 피크가 특히 더 강하게 커지는 모습입니다.
    • 이건 “시장 전체가 성장하는 동시에, 피크 시즌에 더 많은 수요가 몰린다”는 신호로 읽을 수 있습니다.
      실무라면 → 성수기 증편, 프로모션·가격 전략, 인력 배치 계획에 바로 연결되겠죠.
  4. 이상점(outlier)은 거의 없다 → 안정적인 성장 구조
    • 눈에 띄게 색이 갑자기 확 어두워지거나 밝아지는 “한 칸짜리 튀는 값”이 거의 없습니다.
    • 즉, 연도별·월별 변화가 비교적 매끄럽게 이어지는 안정적인 성장 패턴입니다.
    • 만약 특정 해 특정 달만 갑자기 색이 확 변했다면
      → 정책 변화, 외부 사건, 시스템 장애 같은 “이상 이벤트”를 의심하고 추가 분석을 해야 할 포인트가 될 겁니다.
  5. 실무로 옮기면 어떤 질문을 던질 수 있을까?
    • “우리 서비스의 heatmap을 그렸을 때도, 이렇게 왼쪽은 어둡고 오른쪽으로 갈수록 밝은가?”
    • “어떤 월/요일/시간대가 항공의 7~8월처럼 절대적인 성수기 역할을 하는가?”
    • “우리는 성수기와 비수기에 다른 전략을 쓰고 있는가, 아니면 연중 내내 같은 자원 배분을 하고 있는가?”

이렇게 색의 흐름만 잘 읽어도, 단순 예제 데이터에서

  • 장기 성장 여부,
  • 계절성 패턴,
  • 성수기 강도 변화,
  • 이상점 존재 여부
    까지 꽤 많은 이야기를 뽑아낼 수 있습니다.

이 예제는 단순하지만,
실제 경제 지표, 매출, 설비 가동률 데이터를 이용하여 heatmap으로 그리면

  • “어느 지점/라인/부서의 성과가 안정적인가?”
  • “어느 시점에 이상 패턴이 발생했는가?”

같은 질문에 답할 수 있습니다.
이때 heatmap은 그냥 예쁜 그림이 아니라 패턴 탐지 도구가 됩니다.

7단계 📝 리포트 작성

마지막 단계는 결과를 남에게 설명하는 것입니다.

  • 왜 seaborn heatmap을 선택했는지
  • 어떤 식으로 데이터를 전처리했는지
  • 그래프에서 어떤 패턴이 보였는지

이걸 한번 정리해두면, 나중에

  • 같은 코드로 다른 데이터셋을 그릴 때
  • 보고서·발표자료를 만들 때
  • 팀원에게 “분석 프로세스”를 설명할 때

엄청난 재사용성이 생깁니다.
대략적으로 다음과 같은 형식을 작성하면 되겠죠?

보고 제목: 1949–1960년 항공 승객 데이터 분석 결과 보고

1. 분석 목적
   - 장기 항공 수요 추세와 월별 성수기·비수기 패턴을 파악하여
     향후 노선 전략 및 인력·자원 배치 계획 수립에 참고하고자 함.

2. 데이터 개요
   - 공개 예제 데이터(flights)를 사용하였으며,
     기간은 1949년 1월부터 1960년 12월까지 12년간 월별 승객 수.
   - 주요 변수
     • year: 연도
     • month: 월
     • passengers: 해당 월 항공 승객 수(명)

3. 분석 방법 요약
   - 연도(year)를 가로축, 월(month)을 세로축으로 두고,
     승객 수를 색상으로 표현한 히트맵(heatmap)을 작성.
   - 각 셀에 실제 승객 수(정수)를 함께 표기하여
     색상 패턴과 수치를 동시에 확인할 수 있도록 구성.

4. 주요 분석 결과
   1) 장기 성장 추세
      - 1949년 대비 1960년으로 갈수록 전체적으로 색깔이 밝아지며,
        대부분의 월에서 승객 수가 꾸준히 증가하는 양상을 확인.
      - 특히 1955년 이후부터는 거의 전 월에서 300명 이상을 유지하는 등
        항공 수요가 구조적으로 성장한 것으로 보임.

   2) 계절성 패턴
      - 매년 6월부터 8월까지 여름철에 색이 가장 밝게 나타나며,
        해당 기간 승객 수가 다른 달보다 현저히 높음.
      - 1~2월과 11~12월은 상대적으로 어두운 색으로,
        일관된 비수기 패턴을 보임.
      - 계절성의 크기도 시간이 지날수록 커지는 경향(성수기 피크 강화).

   3) 이상 패턴 여부
      - 특정 연도에만 갑자기 색이 급격히 어두워지거나 밝아지는 구간은 거의 없음.
      - 전반적으로 완만한 성장 곡선을 유지하고 있어,
        외부 충격(전쟁, 금융위기 등)에 따른 급격한 수요 붕괴 신호는 관측되지 않음.

5. 시사점
   - 장기 성장: 항공 시장 전체가 우상향하고 있어,
     중장기적으로는 기단 확대·노선 다변화를 검토할 수 있는 환경으로 판단됨.
   - 계절성 대응:
     • 매년 여름 성수기(6~8월)에 좌석·인력·마케팅 예산을 집중 배치하는 것이 합리적.
     • 겨울 비수기에는 프로모션, 환승 할인 등 수요 진작 전략이 필요.
   - 리스크 관리:
     • 현재와 유사한 데이터가 실무에서 확보된다면,
       히트맵을 통해 갑작스러운 수요 감소 구간을 조기에 탐지하는
       모니터링 지표로도 활용 가능.

6. 향후 계획 제안
   - 금번 예제 분석 방식을 실제 당사 노선별·구간별 월간 승객 데이터에도 적용하여
     노선별 히트맵을 정기적으로 생성하는 대시보드 구축 검토.
   - 성수기·비수기 구간별 수익성 지표(매출, 탑승률, 단위당 수익)를 추가하여
     단순 수요가 아닌 수익성 관점의 히트맵 분석으로 확장.
   - 추후에는 외부 변수(유가, 환율, 경기지수)와의 상관관계 분석까지 포함한
     확장 리포트를 준비할 예정.

정리하면, 오늘 코드는 짧지만 seaborn heatmap + 데이터 분석 7단계 워크플로우를 한 번에 연습해볼 수 있는 훌륭한 예제였습니다.

유사한 게시물