07_Data_Analysis

06_시간 시각화

chuu_travel 2025. 3. 17. 00:51
728x90
시간 시각화

 

  • 시점 요소가 있는 데이터는 시계열(Time series)형태로 표현할 수 있음
    • 시간의 흐름에 따른 데이터의 변화를 표현
    • 전체적인 흐름을 한 눈에 확인할 수 있고, 데이터의 트렌드나 노이즈도 쉽게 찾아낼 수 있음
  • 시간 시각화는 선 그래프 형태인 연속형과 막대 그래프 형태인 분절형으로 구분
  • 연속형 시간 시각화
    • 선 그래프
    • 시간 간격의 밀도가 높을 때 주로 사용
      • 예) 초 단위의 공정 센서 데이터, 일년 간의 일별 판매량 데이터
    • 데이터의 양이 너무 많거나 변동이 심하면 트렌드나 패턴을 파악하는 것이 어려울 수 있음
      • 이 경우는 추세션을 삽입하여 들쭉날쭉한 데이터 흐름을 안정된 선으로 표현하는 것도 가능
    • 전체적인 경향이나 패턴을 쉽게 파악하는 것이 목적
    • 추세선을 그리는 가장 일반적인 방법은 이동평균(moving average) 방법을 사용하는 것
      • 이동평균법 : 데이터의 연속적인 그룹의 평균을 구하는 것
        • 예) 시간의 흐름에 따라 2 -> 5 -> 3 -> 7 -> 4 의 값이 있다면 3개 시점씩 평균을 구해 (2, 5, 3)의 평균 -> (5, 3, 7)의 평균 -> (3, 7, 4)의 평균 으로 표현하는 것
  • 분절형 시간 시각화
    • 막대 그래프, 누적 막대 그래프, 점 그래프 등
    • 시간의 밀도가 낮은 경우에 주로 사용
      • 예) 1년 동안의 월 간격 단위 흐름
    • 값들의 상대적인 차이를 나타내는 것에 유리
    • 막대에 색상을 표현하여 특정 시점에 대한 정보를 추가할 수도 있음
    • 누적 막대 그래프는 한 시점에 2개 이상의 세부 항목이 존재할 때 사용
      • 예) A, B, C 품목의 월별 판매량 데이터를 표현하고자 할 때, 각 품목의 판매량을 색상이나 질감으로 차이를 주어 하나의 막대로 표현
      • 각 품목 전체의 합을 함께 표현할 수 있는 것이 장점
      • 각 품목의 판매량을 전체 판매량의 비율로 환산하여 절대적 비율을 비교할 수 있도록 표현할 수도 있음

 

import matplotlib.pyplot as plt
import pandas as pd
import datetime
df = pd.read_csv("./data/superstore.csv")
df.head()

 

  • 일자별 고객들의 제품 판매 정보가 기록되어 있음
df.shape
(9800, 18)

 

df.dtypes
Row ID             int64
Order ID          object
Order Date        object
Ship Date         object
Ship Mode         object
Customer ID       object
Customer Name     object
Segment           object
Country           object
City              object
State             object
Postal Code      float64
Region            object
Product ID        object
Category          object
Sub-Category      object
Product Name      object
Sales            float64
dtype: object

 

# Order Date 컬럼 날짜형식 변환
df["Date2"] = pd.to_datetime(df["Order Date"], format = "%d/%m/%Y")
df.dtypes
Row ID                    int64
Order ID                 object
Order Date               object
Ship Date                object
Ship Mode                object
Customer ID              object
Customer Name            object
Segment                  object
Country                  object
City                     object
State                    object
Postal Code             float64
Region                   object
Product ID               object
Category                 object
Sub-Category             object
Product Name             object
Sales                   float64
Date2            datetime64[ns]
dtype: object

 

df.head()

 

# 날짜 오름차순 정렬
df = df.sort_values(by = "Date2")
df.head()

 

# 연도 컬럼 생성
df["Year"] = df["Date2"].dt.year
df.tail()

 

# 2018년 데이터만 필터링
df_line = df[df["Year"] == 2018]
df_line.head()

 

# 2018년 일별 매출액 가공
df_line = df_line.groupby("Date2")["Sales"].sum().reset_index()
df_line.head()

 

  • 기존의 Order Date 컬럼을 날짜 형식으로 변환하고 연도 구분 컬럼 생성
  • 2018년도 데이터만 필터링
  • groupby()를 사용하여 일별 매출액을 가공
    • 일자별로 매출액 합계 집계
# 선 그래프 시각화
df_line.plot(x = "Date2", y = "Sales", linewidth = 0.5, figsize = (15, 5))
plt.show()

 

# 30일 이동평균 생성
df_line["Month"] = df_line["Sales"].rolling(window = 30).mean() #30일의 평균
df_line.head(40)

...

 

 

ax = df_line.plot(x = "Date2", y = "Sales", linewidth = 0.5, figsize = (15, 5))
df_line.plot(x = "Date2", y = "Month", color = "#FF7F50", linewidth = 1, ax = ax)
plt.show()

 

  • 앞에서 가공한 데이터셋을 활용하여 선 그래프를 시각화
  • 30일 이동평균선을 삽입하기 위해 rolling() 함수를 사용하여 Month 컬럼을 새로 생성
  • 2018년도의 일자별 매출액이 잘 나타나지만 매출액 편차가 커서 일 매출선으로는 전체적인 추이를 가늠하기 힘듦
    • 이런 경우 이동평균선이 도움이 될 수 있음
    • Month 선을 통해 5월부터 매출이 감소했다가 8월부터 상승하는 것을 직관적으로 확인할 수 있음

 

막대그래프

# 연도별 판매량 데이터 가공
df_bar_1 = df.groupby("Year")["Sales"].sum().reset_index()
df_bar_1.head()

 

 

  • 막대 그래프 시각화를 위해 연도별 매출액 데이터를 가공
    • Year 컬럼을 이용하여 연도별 매출액 합계를 계산
# 연도별 매출액 막대 그래프 시각화
ax = df_bar_1.plot.bar(x = "Year", y = "Sales", rot = 75, figsize = (10, 5))
plt.show()

 

# 고객 segment 를 컬럼으로 피벗
df_bar_2 = df.pivot_table(index = "Year",
                          columns = "Segment",
                          values = "Sales",
                          aggfunc = "sum").reset_index()
df_bar_2.head()

 

 

  • 누적 막대 그래프 시각화를 위한 데이터 가공
    • Segment 컬럼을 활용하여 Consumer, Corporate, Home Office 구분에 따라 매출액을 집계
# 연도별 고객 세그먼트별 매출액 누적 막대 그래프 시각화
df_bar_2.plot.bar(x = "Year", stacked = True, figsize = (10, 7))
plt.show()

  • 매출액은 앞의 단순 막대 그래프와 동일하지만 세 가지 세그먼트의 각 매출액이 구분되어 표현됨
  • 이를 통해 각 연도에서 세그먼트 별 매출액 비중이 어느정도 되는지 파악할 수 있음
  • 만약 stacked 옵션을 False로 설정하면 각 연도별로 세 개의 막대 그래프가 나오도록 표현됨
  • 상황에 따라 옵션을 조정하여 정보 전달 효과를 높일 수 있음
728x90

'07_Data_Analysis' 카테고리의 다른 글

08_분포 시각화  (0) 2025.03.17
07_비교 시각화  (0) 2025.03.17
05_Folium(지도 시각화 도구)  (1) 2025.03.17
04_seaborn예제  (0) 2025.03.16
03_Matplotlib예제  (1) 2025.03.16