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

오늘은 아주 짧은 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)

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()
flights_long.info()
flights_long.describe()- 어떤 컬럼이 있는지:
year,month,passengers - 데이터 타입은 어떤지:
int,category등 - 값의 범위: 승객 수가 대략 어느 정도인지
seaborn heatmap을 그리기 전에 “이 데이터는 시간에 따라 어떻게 변하는 값이구나” 정도의 감을 잡는 것이 2단계의 핵심입니다.
3단계 🧹 데이터 전처리 – pivot으로 모양 바꾸기
seaborn heatmap은 행·열에 의미가 있는 2차원 테이블을 그리기 좋습니다. 그래서 year와 month를 행·열로 만들기 위해 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을 가만히 보면, 숫자보다 색의 흐름이 먼저 눈에 들어옵니다. 이 색 패턴을 천천히 따라가면서 인사이트를 도출해보시죠.
- 왼쪽은 어둡고, 오른쪽은 밝다 → 장기 성장 추세
- 1949년(맨 왼쪽 열)은 전체적으로 짙은 보라색에 가깝고 값도 100대 초반에 머무릅니다.
- 1960년(맨 오른쪽 열)로 갈수록 색이 점점 밝아지며, 400~600대의 연한 주황·살구색이 많아집니다.
- 즉, 모든 달에서 승객 수가 꾸준히 증가하고 있고, 특정 달만 성장한 게 아니라 시간(연도)에 따라 전반적인 항공 수요가 성장하고 있다는 메시지를 줍니다.
- 가로로 보면 “계절 패턴”이 뚜렷하다
- 1월(Jan), 2월(Feb), 11월(Nov), 12월(Dec)은 전체적으로 색이 상대적으로 어둡습니다.
- 반대로 6월(Jun)부터 8월(Aug)까지는 거의 매년 색이 가장 밝고, 특히 7월·8월 행은 연도 전체에서 가장 “핫한” 색을 띱니다.
- 이건 해석이 어렵지 않죠. 겨울·초봄은 비수기, 여름은 뚜렷한 성수기라는 걸 한눈에 보여 줍니다.
- 만약 이게 항공이 아니라 매장 방문, 서비스 이용, 설비 가동률이었다면
→ “어느 시기에 인력/자원을 집중해야 하는가?”를 바로 파악할 수 있는 패턴입니다.
- 성수기 자체도 점점 더 밝아진다 → 성장 + 시즌 효과 강화
- 1950년대 초반의 7~8월은 200~300대 값인데,
- 1958~1960년의 7~8월은 400~600대까지 치솟습니다.
- 단순히 “전체가 조금씩 증가”하는 게 아니라, 성수기 피크가 특히 더 강하게 커지는 모습입니다.
- 이건 “시장 전체가 성장하는 동시에, 피크 시즌에 더 많은 수요가 몰린다”는 신호로 읽을 수 있습니다.
실무라면 → 성수기 증편, 프로모션·가격 전략, 인력 배치 계획에 바로 연결되겠죠.
- 이상점(outlier)은 거의 없다 → 안정적인 성장 구조
- 눈에 띄게 색이 갑자기 확 어두워지거나 밝아지는 “한 칸짜리 튀는 값”이 거의 없습니다.
- 즉, 연도별·월별 변화가 비교적 매끄럽게 이어지는 안정적인 성장 패턴입니다.
- 만약 특정 해 특정 달만 갑자기 색이 확 변했다면
→ 정책 변화, 외부 사건, 시스템 장애 같은 “이상 이벤트”를 의심하고 추가 분석을 해야 할 포인트가 될 겁니다.
- 실무로 옮기면 어떤 질문을 던질 수 있을까?
- “우리 서비스의 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단계 워크플로우를 한 번에 연습해볼 수 있는 훌륭한 예제였습니다.





