Skip to main content

# GroupBy와 시간대별 데이터 분석

자전거 데이터

  • 미국 시애틀 프레몬트 브릿지 자전거 카운터
    data = pd.read_csv(
    'bicycle.csv',
    index_col='Date', # Date 컬럼을 인덱스로 지정
    parse_dates=True) # 자동으로 날짜 처리
    data.head()

시각화

  • 편의를 위해 컬럼 이름 변경
    data.columns = ['Total', 'East', 'West']
  • 시각화
    data.plot()
  • 주 단위 합계 시각화
    data.resample('W').sum().plot()

이동 평균

  • 일단위 합계의 30일 이동 평균
    daily = data.resample('D').sum()
    daily.rolling(30, center=True).mean().plot()
  • 가까운 날짜에 더 많은 가중치를 주고, 먼 날짜에 적은 가중치를 주는 방식
    roll = daily.rolling(50, center=True, win_type='gaussian')
    roll.sum(std=10).plot()

시간대별 평균

  • 시간별(data.index.time)로 데이터를 모아(groupby) 평균
    by_time = data.groupby(data.index.time).mean()
    by_time.plot()

가로 눈금을 4시간 간격으로

import numpy as np
hourly_ticks = 4 * 60 * 60 * np.arange(6)
by_time.plot(xticks=hourly_ticks, style=[':', '--', '-'])

요일별 평균

by_weekday = data.groupby(data.index.dayofweek).mean()
by_weekday.index = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
by_weekday.plot()

주중과 주말의 비교

  • 주중과 주말, 시간대별로 나누어 평균
    weekend = np.where(data.index.weekday < 5, 'Weekday', 'Weekend')
    by_time = data.groupby([weekend, data.index.time]).mean()
  • 비교 시각화
    by_time.loc['Weekday'].plot(xticks=hourly_ticks)
    by_time.loc['Weekend'].plot(xticks=hourly_ticks)

하나의 그래프에 합쳐 그리기

  • 하나의 셀에 실행
    import matplotlib.pyplot as plt
    fig, ax = plt.subplots(1, 2, figsize=(14, 5))
    by_time.loc['Weekday'].plot(ax=ax[0], title='Weekdays', xticks=hourly_ticks)
    by_time.loc['Weekend'].plot(ax=ax[1], title='Weekends', xticks=hourly_ticks)

퀴즈