모두를 위한 웹 스크래핑(5/5)-데이터 분석하기

여기까지 웹의 데이터를 수집하고, 저장하는 방법들을 알아봤습니다. 과거에는 데이터를 많이 가지고 있는게 중요했습니다. 데이터가 폭발적으로 많아진 현재의 상황에서는 모든 데이터를 확인할 수 없으므로 분석과 통계를 통해 요약하고 시각화하여 전달성을 높이는게 중요해졌습니다.

데이터 통계

통계는 제가 약한 부분이라.. 이곳을 참조해 주세요. 파이썬에서의 수치 처리는 많은 경우 numpypandas 라이브러리를 사용합니다. 데이터를 불러오기 쉽고 통계 함수도 많이 제공하기 때문에 폭넓게 사용되고 있습니다. 파이썬을 활용한 금융 분석파이썬 라이브러리를 활용한 데이터 분석 이라는 책이 한빛에서 나와 있습니다. 이걸 참조해 보시는 것도 좋을 것 같습니다.

pandas를 이용한 데이터 분석

pandas 라이브러리는 파이썬에서 데이터 분석을 위해 폭넓게 사용되고 있습니다. 처음 개발된 목적도 금융 데이터의 처리와 분석을 위해서 였습니다. 특히 데이터 처리를 위한 여러 기능들이 준비되어 있어 사용하기 쉬운 강점이 있습니다. 몇 가지 사례를 통해 라이브러리 사용법을 알아보겠습니다.

  1. 데이터를 준비합니다.
  • 간단한 데이터라면 직접 리스트나 딕셔너리로 pandas 데이터로 변환할 수 있습니다.
values = { 
    '날짜': ['2016-10', '2016-11', '2016-12', '2017-01', '2017-02', '2017-03'],
    '삼성전자': [23353920, 21405206, 15932536, 11286761, 12195995, 12922589], 
    'LG전자': [13611721, 14520911, 20073843, 5911641, 4220130, 14147994]
}

df = pd.DataFrame(values, columns=['날짜', '삼성전자', 'LG전자'])
df
  1. 요약 통계량을 살펴봅니다. 간단한 통계는 pandas의 describe 함수로 확인해볼 수 있습니다.
    > df.describe()

KOSPI 지수 분석 사례

구글 금융에서 KOSPI 지수 데이터를 가져와 간단한 계산을 하고 시각화 해보겠습니다.

  1. 구글 파이넌스 데이터는 pandas-datareader 라이브러리를 통해 쉽게 불러올 수 있습니다.
from pandas_datareader import data

df_ks11 = data.DataReader('KRX:KOSPI', 'google', '2017-01-01', '2017-12-31' )

df_ks11 = df_ks11.ix[df_ks11.Volume > 0] # 휴장일 삭제
df_ks11.tail()
  1. 로그 수익률을 계산해 데이터에 추가합니다.
import numpy as np

df_ks11['Ret'] = np.log(df_ks11['Close'] / df_ks11['Close'].shift(1))
df_ks11.head()
  1. jupyter notebook 상에서 matplotlib 으로 시각화를 해봅니다.
%matplotlib inline

df_ks11['Ret'].plot(figsize=(16,4))

시각화

시각화는 요약된 데이터의 전달을 위한 효율적인 방법입니다. 파이썬에서 시각화를 위해 보통 matplotlib을 사용합니다. 그 외에 웹 기반인 plotly와 javascript 기반의 d3.js를 사용할 수 있습니다.

  • matplotlib : 파이썬 데이터 시각화를 위해 사용하는 대표적인 라이브러리 입니다. 너무 많은 기능이 있어 API를 하나씩 보며 공부하는 것 보다는 공식 홈페이지의 갤러리에서 원하는 샘플을 참조하는 것이 효율적으로 활용하는 방법인 것 같습니다.
  • plotly : 웹 서비스 형태입니다. 데이터를 제공하면 plotly에서 시각화를 처리하여 차트를 그려 보내줍니다. 가입이 필요하고 일정량 이상 사용시 요금을 지불해야 합니다.
  • 저희 집 온도와 습도 모니터링 샘플입니다.
import time
import mysql.connector
from sqlalchemy import create_engine
import pandas as pd
import numpy as np
import plotly.plotly as py
from plotly.graph_objs import *

cnx_str = 'mysql+mysqlconnector://root:'+pwd+'@xxx:3306/rpi'
engine = create_engine(cnx_str, echo=False)
con = engine.connect()

sql = "SELECT * FROM atmosphere WHERE datetime BETWEEN NOW() - INTERVAL 1 DAY AND NOW() ORDER BY datetime DESC"
df = pd.read_sql(sql, con)

# Line Chart
layout = dict(title= 'Room Atmosphere',
  xaxis={'title': 'Time'},
  yaxis2={'title': 'Temperature & Hum', 'overlaying': 'y'},
)

room_temp = Scatter(
  x=df.datetime,
  y=df.room_temp,
  name='Room Temp',
  yaxis='y2'
)
room_humi = Scatter(
  x=df.datetime,
  y=df.room_humi,
  name='Room Humi',
  yaxis='y2'
)
veranda_temp = Scatter(
  x=df.datetime,
  y=df.veranda_temp,
  name='Veranda Temp',
  yaxis='y2'
)
veranda_humi = Scatter(
  x=df.datetime,
  y=df.veranda_humi,
  name='Veranda Humi',
  yaxis='y2'
)

data = [room_temp, room_humi, veranda_temp, veranda_humi]
fig = dict(data= data, layout= layout)
py.iplot(fig, filename='basic-line')

  • 사용자 상호작용이 가능한 차트를 쉽게 만들 수 있는게 장점입니다.

정리

  • 웹 스크래핑 이후의 단계라고 할 수 있는 데이터 분석에 대해 알아보았습니다.
  • 많은 데이터의 요약을 위해 통계와 시각화를 활용하면 사용자가 이해하기 쉬워집니다.

다음에는 마지막으로 전체 wrap up을 진행해 보겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다