본문 바로가기

AICE associate

시각화로 데이터 탐색하기

데이터의 시각화는 방대한 양의 데이터를 빠르게 확인하고 유의미한 특성을 찾아내는 중요한 작업이다

 

파이썬에는 여러 가지 시각화 라이브러리가 있지만, 그중 matplotlib는 가장 범용적으로 사용하는 라이브러리이다

 

matplotlib 시각화 방법 지원

  • 선 그래프(line plot)
  • 막대 그래프(bar plot)
  • 파이 그래프(pie plot)
  • 히스토그램(histogram)
  • 상자 그래프(box plot)
  • 산점도(scatter plot)

1. 일변량 시각화 탐색하기

 - matplotlib을 사용하려면 figure, plot, show 3가지를 기억하면 된다

 - figure는 시각화 하는 영역을 지정한다, matplotlib.pyplot을 plt로 선언하고 plt.figure로 사용한다

 - plot은 시각화 내용을 표기하며, 시각화에 사용할 plot의 형태와 매개변수 등에 따라 변경된다.

     figure와 같은 방식으로 plt.plot으로 사용함

- show는 시각화한 객체를 출력하며, plt.show으로 사용한다. 주피터 노트북 환경에서는 셀별로 코드를 실행하기 때문에 figure,         show를 생략하고 사용하기도 한다

 

1) 선 그래프

 - 시간이나 순서에 따른 데이터의 연속적인 변화량을 관찰할 때 주로 사용되는 그래프이다

 - 선 그래프는 수량을 점으로 표시한 후 해당 점을 선으로 이어서 그려주기 때문에 증가와 감소에 대한 상태 변화를 파악하는데 유용하다 

 - 항공권 가격 예측 데이터에서 출발까지 남은 일자에 따라 항공권 가격이 어떻게 변화하는지 시각화를 통해 확인할 수 있다

우선 항공권 구입 시점에 따른 평균 가격을 확인하기 위해 데이터를 만들어보면

더보기

교재에서는 

days_left=df.groupby('days_left').mean()
days_left.head()
 
작성시 TypeError: agg function failed [how->mean,dtype->object]  에러가 뜬다
이 오류는 문자열(object) 타입 컬럼에 대해 mean()을 계산하려고 해서 발생한 것이다

df.groupby('days_left').mean() 은
그룹별로 모든 컬럼을 평균(mean) 하려고 한다.

근데 df 안에는 이런 문자열 컬럼이 있어:

  • airline (SpiceJet, Indigo 등)
  • source
  • destination
  • class

이런 object 타입 컬럼을 평균낼 수 없어 → 그래서 TypeError 발생.

 

방법 : 필요한 숫자 컬럼만 직접 적기

예를 들어 price만 평균내고 싶다면:

 
days_left = df.groupby('days_left')['price'].mean()
days_left.head()

 

#days_left별 평균 데이터 만들기
days_left = df.groupby('days_left')[['duration','price']].mean()
days_left.head()
 

항공권 구입 시점에 따른 비행시간과 항공권 가격 데이터프레임이 만들어졌다

 

이제 matplotlib을 활용하여 출발까지 남은 일자(days_left)와 항공권 가격(price) 데이터를 가지고, 출발까지 남은 일자에 따라 항공권 가격이 어떻게 변화하는지 선 그래프를 그려서 확인해보자

#시각화 라이브러리 불러오기
import matplotlib.pyplot as plt

#시각화 영역(figure) 지정하기
plt.figure()

#days_left의 price 데이터로 선 그래프 그리기
plt.plot(days_left['price'])

#X축 이름 지정하기
plt.xlabel("Days_left")

#Y축 이름 지정하기
plt.ylabel("Price")

#시각화 표기하기
plt.show()

matplotlib.pyplot을 plt로 선언하여 matplotlib를 불러온 후, plt.plot을 사용하여 선 그래프를 시각화

plt.xlabel과 plt.ylabel은 각각 x축과 y축의 이름을 지정해 주는 함수

출발까지 남은 일자가 많을 수록, 즉 항공권을 미리 구매할수록 가격이 저렴해지고 출발일에 가까울수록 비싸다는 사실을 확인할 수 있다

이처럼 선 그래프는 시간이나 순서에 따른 데이터의 연속적인 변화량을 확인하는데 유용하다

 

2) 막대 그래프(bar plot)

 - 범주에 대한 통계 데이터나 양을 막대 모양으로 나타내는 그래프이다

 -  각 항목의 수량을 한눈에 파악하기 쉽고, 크고 작음을 비교할 수 있다

 

막대 그래프를 사용해서 항공사별 평균 항공권 가격을 비교해보자

#인덱스를 리스트로 만들기
label = airline.index
plt.figure()

#인덱스를 X, 평균 가격을 Y로 하는 막대 그래프 그리기
plt.bar(label, airline['price'])
plt.xlabel("Airline")
plt.ylabel("Price")
plt.show()

Air_India와 Vistara 항공사가 다른 4개의 항공사보다 가격이 비싸다는 것을 단번에 확인할 수 있다

이처럼 막대 그래프는 각 항목의 수량을 한눈에 파악하여 크고 작음을 비교하는데 유용하다

 

3) 파이 그래프(pie plot)

 - 전체에 대한 각 부분의 비율을 부채꼴 모양으로 나타낸 그래프이다

 - 경우에 따라 원형이 아닌 도넛 모양으로 나타내기도 하며, 전체를 100으로 놓고 각각의 비율대로 나누어 표기하므로 한눈에 알 수 있다.

 

출발 시간에 따른 비행기 스케줄을 확인해 보자

plt.pie를 사용하여 파이 그래프를 시각화하면

#departure_time 빈도표 데이터 만들기
departure_time = df['departure_time'].value_counts()

plt.figure(figsize=(10,6))

#departure_time 빈도표 데이터로 파이 그래프 그리기
plt.pie(departure_time, labels=departure_time.index, autopct='%.1f%%')
plt.show()

Morning 시간대 출발이 가장 많고, Late_Night를 제외한 대부분의 시간에 고루 출발한다는 사실을 확인할 수 있다

이처럼 파이 그래프는 데이터가 분포하는 비율을 확인할 때 유용하다

 

4) 히스토그램(histogram)

- 특정 데이터의 빈도수를 막대 모양으로 표시한 그래프이다

- 가장 많이 사용되는 통계, 분석 도구이다

 

목적지까지 소요 시간의 분포를 확인해보자

plt.hist를 사용하여 히스토그램을 시각화하면 되는데 bins 파라미터를 알아야 한다 bins는 계급을 몇 개의 구간으로 나눌지를 지정하며 기본값은 10이다

비행시간(duration) 데이터의 bins를 10과 20으로 설정하고 시각화해서 비교해보면

plt.figure

#duration을 10개 구간으로 나눠서 히스토그램 그리기
plt.hist(df['duration'], bins=10)

#duration을 20개 구간으로 나눠서 히스토그램 그리기
plt.hist(df['duration'], bins=20)
plt.xlabel("Duration")
plt.ylabel("Flights")

#동시에 2개의 그래프를 하나의 시각화 영역에 그려서 범례 지정하기
plt.legend(("Bin 10", "Bin 20"))
plt.show()

두 그래프를 비교해보면 비슷한듯 다른 모습이다

공통적으로 5~15시간 이내가 가장 많은 비중을 차지하는데, bins 20기준으로 보면 0~2.5시간 내에도 많은 편수가 있다

히스토그램은 빈도나 빈도밀도 등을 확인하기에 유용하다

 

5)상자 그래프(box plot)

 - 사분위수를 중심으로 수치적 요약 통계 자료를 시각화하는 그래프이다

 - 수치 자료로 얻어낸 통계량인 5가지(최솟값, 제1사분위수, 중앙값, 제3사분위수, 최댓값)를 가지고 그래프를 만들어 데이터를 이해하는데 유용하다

설명
이상치 정해진 최댓값보다 크거나, 최솟값 보다 작은값
최댓값 제3사분위수+1.5*IQR보다 작은 값 중 최댓값
제3사분위수 제3사분위수(75%)를 나타냄
중앙값 제2사분위수(50%)를 나타냄
제1사분위수 제1사분위수(25%)를 나타냄
최솟값 제1사분위수-1.5*IQR보다 큰 값 중 최솟값

 

비행기 항공권 가격을 상자 그래프로 확인해 보자

가격 항목만 목록으로 만들어 plt.boxplot의 파라미터로 넣으면 바로 상자 그래프를 통해 항공권의 데이터 요약 통계와 분포를 확인할 수 있다

plt.figure()

# Price 칼럼에 대한 상자그래프 그리기
plt.boxplot(list(df['price']))
plt.ylabel("price")
plt.show()

상자 그래프에서 알 수 있는 것은 가격 데이터의 범위는 0~120000 사이이지만 중앙값이 10000정도로 50%의 비행기는 10000 이하의 가격으로 판매된다는 것이다

여러 항목으로 상자 그래프를 만들어서 비교하면, 데이터프레임의 boxplot 메소드도 사용할 수 있다

 

출발 시간별 가격 정보의 분포를 확인해보면

#departure_time 별로 price에 대한 상자 그래프 그리기
df.boxplot(by="departure_time", column="price", figsize=(10,8))

 

'AICE associate' 카테고리의 다른 글

시각화로 데이터 탐색하기(2)  (0) 2025.11.24
지표로 데이터 탐색하기  (1) 2025.11.17
데이터프레임 병합하기  (0) 2025.11.11