개인프로젝트: 공공데이터 활용 및 파이썬 복습

개요

1. 프로젝트명

국내 코로나19 확진자 수와 항공관련주 주가사이의 관계 분석

2. 기간

2021년 7월 8일 ~ 12일

3. 목적

  • 공공데이터 활용 및 파이썬 복습(numpy, pandas, matplot, tkinter)
  • 국내 코로나19 확산 추세와 항공관련주 주가 추세 사이의 관계를 분석
    • 코로나 확산에 따른 여행산업 위축으로 항공업계가 직격탄을 맞은 상황
    • 코로나 확산 추세와 항공관련주 주가가 어떤 동향을 그려나가는지 확인

4. 핵심 내용

  • (기본)일정 기간 동안, 일일 확진자 수와 항공관련주 주가(종가 기준) 변화 비교

    • 꺾은선 그래프를 그려 눈으로 그 변화의 관계를 추론해본다.(별도의 분석기술 없음)
  • (심화)하루동안 국내 코로나19 일일확진자 수의 추세(전날대비 변화율)와 일일주가 추세(당일등락률) 비교

    • 각각 x,y로 놓고 분포도를 그려 관계를 추론해본다.
  • +@ (도전)월 단위 확진자 수 추세와 주가 추세 사이의 관계

    • 각 지표의 추세분석: 추세(상승추세, 횡보, 하락추세) , 비추세(비추세 수렴, 비추세 확산)
      • 추세 유형의 정의, 각 데이터들이 어떤 유형에 속하는지 분석~~

주요 내용

1. 실행계획

1단계: 가설 수립
  • 확진자수와 항공관련주의 주가동향은 서로 반대의 경향을 보일 것이다.
    • 이를테면 전날보다 확진자수가 늘어난 날에는 항공관련주가가 하락할 것이다.
2단계: 데이터 수집(requests, beautifulsoup)
  • 코로나19 일일확진자수 데이터: 공공데이터포털
  • 코스피 데이터: 네이버 금융
  • 항공관련주 주가 데이터: 네이버 금융
    • 주가정보 수집대상: 대한항공(003490), 제주항공(089590), 티웨이항공(091810)
3단계: 데이터 전처리(numpy, pandas)
4단계: 데이터 분석(matplot)
  • 일일확진자수 동향과 선택한 주식 동향 비교 그래프(꺾은선그래프)
  • 일일확진자 수의 추세(전날대비 변화율)와 일일주가 추세(당일등락률) 그래프(분포도)
5단계: UI 제작(tkinter)

2. 기능

(1) 선택한 기간의 코로나19 일일확진자 수 동향 확인

(2) 선택한 기간의 선택한 주식 동향 확인(코스피, 대한항공, 제주항공, 티웨이항공)

(3) 선택한 기간의 일일확진자수 동향과 선택한 항공관련주 주가 데이터 동향 비교 그래프(꺾은선그래프) 확인

(4) 선택한 기간의 일일확진자 수의 추세(전날대비 변화율)와 일일주가 추세(당일등락률) 그래프(분포도) 확인

진행과정 중 애로사항

1. 코로나 확진자 수 데이터 수집 중 발생한 문제

Exceeded 30 redirects
  • 처음엔 별 문제 없이 잘 스크래핑이 되다가, 마지막에 전체 시간범위의 자료에 접근하려고 할 때 위와 같은 오류가 발생하였다.
  • 어떤 웹페이지는 도메인으로 접속을 할 시, 다른 도메인으로 리다이렉트를 설정하는 경우가 있다.
  • 위 문제의 근본적인 원인은 내가 사이트에 요청을 할 때 한 페이지에 10개의 데이터만 보여달라고 요청했기 때문이다. 따라서 요청에 따라 너무 많은 페이지들을 리다이렉트 할 수 밖에 없었다.
  • 한 페이지에 100개의 데이터를 보여달라 요청하자 위의 문제는 해소되었다.(스크래핑 소요시간도 개선)
  • 일 줄 알았는데 이후에도 몇번씩 위의 문제가 반복적으로 나타났다. (원인은 더 공부해보아야 할 듯)
공공데이터의 오류
  • 나름 코로나19 확진자 수를 가장 신뢰있게 제공해줄 것으로 예상했던 공공데이터에 오류가 꽤 많았다.
  • 아래처럼 일일확진자수가 음수가 나오는 경우가 있어 데이터 값을 수정해야 했다.

2. 데이터 전처리 과정 중 발생한 문제

pandas DataFrame ‘SettingWithCopyWarning’ 에러메세지
  • pandas DataFrame 객체에 변경을 가할 때 종종 나타났던 에러 메세지

  • 메모리와 관련된 경고메세지라고 한다. DataFrame은 자료구조이므로 이를 표현하기 위한 메모리를 할당받는데, 중간중간 새로운 DataFrame마다 계속 메모리를 할당하려고 한다면 금방 메모리가 바닥날 것이다.
  • 따라서 pandas는 DataFrame에서 파생되는 DataFrame들은 기존 DataFrame의 메모리에 접근하도록 함으로써 메모리를 보존한다.(일종의 view와 같은 개념)
    • 이 파생된 DataFrame에 수정을 가하는 경우, view만 바꾸는 것이지 기존 DataFrame은 변화하지 않는다.
    • pandas는 파생 DataFrame에 수정을 가하는 것을 권장하지 않고, 위 경고메세지를 반환한다.
    • 이를 방지하기 위하여 파생 DataFrame에 copy() 메서드를 사용해 기존 DataFrame과 별도의 메모리 공간을 부여해주면 된다.
datetime 모듈의 이해
  • datetime 파이썬에서 날짜형 데이터를 다루기 쉽게 도와주는 모듈이다. (datetime 객체)
  • 이번 프로젝트 특성상 날짜 데이터를 다룰 일이 많았는데, 아직 datetime 모듈에 대한 이해가 부족하여 상당히 시간이 오래 걸렸다. 따로 추가 공부를 한 뒤 정리를 해야할 것 같다.

3. UI 적용

tkinter 에서 matplotlib 그래프를 표시하기
  • tkinter를 활용하는 과정에서 그래프를 canvas에 출력하기 위해선 우리가 기존의 matplotlib으로 그래프를 그리던 것과는 약간 다른 문법을 사용해야 했다.

프로젝트의 의의

  • 원하는 분석은 애당초 불가능했다.

    • 사실 주식에 영향을 미치는 요소는 너무나도 많아서 이렇게 단순한 한가지 요인 만으로는 분석이 당연히 되지 않을 것이다.
    • 아직 수학적인 분석기법에 대하여 배우지 않았으므로 분석이라고 해봤자 그래프 비교에 그친다.
  • 지금까지 배운 것을 복습하기 위한 프로젝트

    • numpy, pandas 객체(ndarray, DataFrame)들을 활용한 데이터 전처리 과정 숙달
      • 따라서 vo 객체를 따로 정의하지 않고, 데이터프레임 요소에 바로 접근했다.
    • matplotlib의 활용 숙달(그래프 그려보기)
    • tkinter 활용 숙달(UI 적용)

프로젝트 결과

  • 인터넷에서 코로나19 확진자 수 정보와 주가정보는 성공적으로 가져올 수 있었다.
  • 이를 바탕으로 데이터를 전처리한 뒤 시각화하여 비교해보았다.
    • 결론적으론, 어떠한 분석기술도 모르기에 그래프를 덧대어 비교해보는데에 그쳤다.
    • 아래는 일일확진자수 증감률과 항공관련주 주가 증감률을 비교한 그래프이다.

개선점

  1. 데이터 수집 속도 개선을 위하여 MySQL 등 DB를 활용하는 것을 고려할만하다.
  2. 원하는 날짜범위를 선택하여 그 범위에 해당하는 그래프를 보여주도록 UI를 개선할 수 있을 것이다.
    • 원하는 날짜범위로 그래프를 그릴 수는 있는데, ui에서 날짜범위 설정을 하는 방법이 어려워서 구현하지 못했다.
  3. 수학적인 분석
  4. 패키지의 활용

배우는 입장에서 개인프로젝트를 하며 느낀점들

반복숙달의 중요성

  • 이미 많이 반복해봤고, 기존에 적혀있는 코드들은 어느 정도 해석은 할 수 있게 되었다.

  • 그러나 코드를 새로이 구현해야할 때엔 방법이나 문법이 헷갈려서 내 블로그, 다른 사람의 블로그나 스택오버플로우를 뒤적거리기 바빴다.
  • 마치 독해는 잘되지만 회화나 영작은 하나도 안되는 기분이다.
  • 반복숙달을 통해 기초적인 작업은 안보고도 빠르게 수행할 수 있는 경지에 올라설 필요가 있다고 느꼈다.
  • 특히 향후 상당한 양의 데이터를 다룰때 중요한 ‘pandas 데이터프레임’을 자유자재로 다룰 수 있을 정도로 숙달해야겠다고 생각한다.

코드의 통일성, 효율성 개선 필요(클래스, 패키지 등의 활용)

  • 구현하고자 하는 결과를 얻기 위해 주먹구구식으로 코드를 짜는 바람에 이른바 ‘스파게티 코드’가 되어버렸다.
  • 경험을 통해 대중적이면서도 효율적이고 일관된 데이터 수집 + 전처리 과정 + 가공 과정(그래프 등) 구조를 익혀나가는 것이 중요해보인다.

계획한 기능을 실현하기 위한 여러가지 방법에 대한 공부

  • 코드를 잘 몰라서 계획단계에서 의도한 기능을 실현하지 못한 것들이 많았다.
  • 나아가, 이 기능이 실제로 구현이 가능한 것인지, 구현과정에 있어선 어떤 애로사항들이 존재하는지 시작하기 전에는 예측할 수도 없을 정도로 무지했다.
  • 다양한 방법을 접하고 적용해봄으로써 점점 구현가능한 기능의 폭을 넓혀가는 것이 중요하다고 느꼈다.

진정한 웹 크롤링이란

다양한 데이터 수집을 위해 일일히 웹페이지 소스에 수동으로 접근하여 이를 분석하고, 이에 맞춰 웹 스크래핑을 하는 초보적인 수준의 작업을 진행하였다. 그런데 이 작업을 반복하며 지속적으로 드는 생각이 있었다.

  • 웹페이지 소스가 수정되는 경우 내 코드는 순식간에 무용지물이 될 것이다.

불과 1년전 네이버의 주식 정보를 잘만 긁어오던 코드가 지금은 통하지 않는다!

그렇다면 이러한 웹페이지 소스 분석 자체를 자동화하여 지속적으로 이를 업데이트 하는 방법은 없을까? 하고 고민하던 중 이것이 바로 ‘웹 크롤러’가 개발되는 배경이란 것을 알게 되었다.

Leave a comment