brunch

You can make anything
by writing

C.S.Lewis

네이버 API를 사용한 검색어 트렌드 크롤링 툴-2부

코스피 상장기업 트렌드를 살펴보자

1부: https://brunch.co.kr/@sukhyun9673/13



글이 길어져서 1, 2부로 나누게 되었다. 이번 글에서는 지난번에 이어, 검색어 요청을 5개씩 분할 요청하고, 스케일링하는 과정을 자동화해보도록 하겠다. 


다시한번 설명하자면 네이버 트렌드 API 가 자체 서버에 검색어 요청을 한번에 5개씩밖에 하지 못하게 되어있고, 또 결과값인 트렌트 인덱스가 매번 입력한 5개 검색어끼리 백분율 비율을 내어 상대적인 값으로 나타나기 때문에 5개가 넘어가는 검색어를 요청하려면 위와 같은 과정이 필요하다. 


어떠한 방식을 통해 위와 같은 자동화를 설계할지는 1부의 마지막에 설명해놓았다.



어디까지 했더라?



일단 지금 우리는 위와 같이 상장기업 755개에 대한 검색어를, 네이버 API 의 파라미터 형식에 맞는 dictionary 로 가지고 있는 상태다.


일단 스케일링을 위해 기준으로 정할 검색어 1개를 무작위로 정할 것이고, 그 기준 검색어를 매번 포함하여 5개씩 그룹으로 묶어 서버에 요청할 것이다. 


shuffle 을 이용해 파라미터들의 리스트를 그냥 랜덤하게 섞은 후, 그 첫 번째에 온 파라미터를 기준으로 사용하기로 했다. 


그리고, split_list라는 리스트 안에 모든 검색어들이 5개의 검색어를 원소로 하는 리스트 194개 + 마지막에 3개의 검색어를 원소로 하는 리스트 1개의 그룹으로 묶어졌음을 볼 수 있다. 이제 루프를 돌려, 이 모든 그룹에 대해 검색어를 요청하고, 기준 검색어에 대한 트렌드 인덱스에 대해 다른 검색어들의 결과값을 스케일링해서 비율을 통일해주면 된다. 


이 경우, '한국자산신탁' 이 기준으로 뽑혔다. 


한국자산신탁이 포함된 첫 번째 그룹에서, 한국자산신탁의  2017-01-01일 시점 인덱스인 15.47...을 기준으로 스케일하도록 하겠다. 이 과정의 코드는 다음고 같다:



참고로, Scraping을 해보지 왜인지 똑같이 2017년 1/1부터 2019년 1/1가지 1달 간격으로 설정했는데도, (그러면 검색어당 25개의 결과가 나온다) 딱 하나의 검색어에서 검색 횟수가 한 번 누락되어 24개의 결과만 나왔다. 그래서, standard 검색어와 검색결과의 수가 다를경우 맨 마지막 index를 모자란 횟수만큼 추가해주는 코드를 넣었다. 


이제 깔끔한 DataFrame을 얻었다. 플롯을 한번 해보면...


다음과 같이 나오지만, 700개가 넘는 종목을 한 차트에 넣었더니 어떤 종목이 어디에 해당하는지 알기도 힘들기에, '대충 분포가 이렇구나'정도만 알아두면 되겠다. 세세히 여러 종목을 검색하고 싶다면 dataframe에서 인덱싱을 통해 검색해서 플롯하는것을 추천한다.


엑셀로 보낼 수도 있다. 


 

755개의 열을 가진 엑셀 파일이 나왔다. 이 데이터를 네이버 트렌드를 사용해 5개씩 일일히 모으로, 또 755개의 모든 열을 하나하나 스케일링 했을 생각을 한다면 정말 소름이 끼친다. 



이왕 이렇게 된거, 월 단위로 25행짜리 데이터로는 너무 아쉽다는 생각이 들어, 똑간은 과정을 통해 주 단위, 일 단위로도 주가를 뽑아보았다.


주 단위로 뽑아본 트렌드 그래프


주식의 트렌드 차트


주별로 뽑아본 엑셀파일이다.


일 단위는 확실히 scraping하는 시간이 생각보다는 오래걸렸지만, 3분을 넘기지 않았다. 아무래도 내가 짠 코드가 루프를 돌려가며 데이터 형식을 정제하는 코드이다보니, 루프를 통한 연산이 많아그런지 생각많큼 빠르게 작동하지는 않았지만, 수 분 내로 데이터를 모두 긁어올 수 있었다. 네이버 트렌드를 통해 일일히 했다면 며칠이 걸렸을지...


일별로 뽑아본 주식 의 트렌드 차트



약 700일에 달하는 기간동안의 시계열 데이터가 이렇게 수집되었다. 


각 종목에 대해 더 interactive 한 차트를 만들고 싶다면 엑셀을 이용하는것이 더 좋은 생각일 듯 하다


주식 차트와 비교하며 활용해보기

마지막으로, 이 '검색 트렌드' 시계열 데이터는, 실제 주과 차트와 어느정도 유사성을 가질까?

실험삼아 몇 개를 랜덤으로 살펴보자


먼저, 랜덤으로 종목 5개를 뽑아보자


그 다음, 이 종목들에 대한 트렌드 차트를 만들어보겠다. 

네이버 검색 트렌드 차트. 주가 차트가 아니다!


그 다음, 네이버 증권에서 주가 데이터를 불러와보자. 

구글링을 해보니, 구글 독스와 구글 파이낸스를 이용해 손쉽게 상장 주식의 시계열 주가 데이터를 불러올 수 있는 방법이 있다. 


구글 시트에서 제공하는 명령어를 사용하면, 코드를 통해 웹 스크레이핑을 할 때처럼 파라미터를 통해 조건 (날짜별, 월별, 등)과 함께 종목 코드 (KRX로 시작하는 코드)를 입력하여 시계열데이터를 뽑아올 수 있다. 


다만, '일자'에 대한 시계열 데이터 형식이, '구글 파이낸스'와 내가 파이썬으로 만든 날짜데이터가 맞지 않기 때문에, 일자별로 비교를 하기는 어려울 듯 하다. 시계열로 그래프를 그려서 모양을 보는정도로 일단 만족하자. 


주가 데이터의 그래프



특히 아남전자나, 삼익 THK 같은 경우엔, 주가에 있어 특정 '피크'(Peek)부분에 있어 검색어 트렌드 차트와 주가 차트가 유사성을 띔을 볼 수 있다. 


특정 시기에 많이 검색되었다는 것은, 그 회사와 관련된 어떠한 사건이 일어났거나, 최소한 '사람들이 검색할만한 일'이 일어났다는 의미이다. 주가는 회사와 관련된 일과 깊은 연관성을 지니기 마련이며, 역으로 주가의 큰 상승과 하락이 다량의 검색 발생의 요인이 될 수도 있다. 



주가와 검색어 트렌드 동향 겹쳐보기


그럼 이번엔 좀더 나아가서, 더 정밀하게 주가와 검색어 트렌드 차트를 겹쳐보자. 

아무래도 Timestamp (일자에 대한 시계열) 형식과 범위가 통일되지 않았기때문에, 파이썬을 이용해 주가 데이터와 검색어 트렌드 데이터간의 보폭을 맞춰줄 필요가 있겠다. 


구글 파이낸스에서 얻어낸 주가 데이터와 검색 트렌드 데이터의 보폭이 맞지 않는 이유는, 주식시장이 개장하지 않는 주말/공휴일에도 검색어 트렌드는 계속 카운트되기 때문일 것이다. 따라서, 주식시장이 개장하지 않는 시간의 검색어 데이터 부분을 쳐내고 시계열로 다시 나타나는것이 좋겠다. 



일단 파일로 주가 데이터를 긁어와 파이썬으로 긁어온 뒤, Date부분의 형식을 맞춰준다. 

주가 데이터셋 앞의 5개만 출력

python 의 datetime object형식으로 맞춰주었다. 

마찬가지로, 검색어 트렌드 데이터도 같은 형식으로 맞춰준다. 


검색어 트렌드 데이터셋 앞에 5개만 출력


확인을 해보니 주가 데이터에는 주식시장이 개장하는 날에 대해서만, 486 일에 대한 데이터가 있고, 이 날짜들은 모두 검색어 데이터에도 포함되어있다. 


주식시장 데이터에 있는 날짜에 대해서만 검색어 트렌드 데이터를 남겼다. 



왼쪽은 검색어 트렌드 데이터, 오른쪽은 주가 데이터이다. 


하나의 파일로 합쳐보았다.


이제 이 둘을 스케일링해서, 한 그래프위에 올려놓고 모양을 비교해보자



그래프가 너무 플랫하거나, 두 인덱스간의 단위가 너무 차이나는 경우엔 log를 취하거나 혹은 10을 곱하는 방식으로 얼추 맞춰주었다. 아시아나항공, 현대홈쇼핑의 경우 전반적으로 평이해서 큰 특징을잡기 어렵지만, 나머지 세 종목의 경우엔 전반적인 상승, 하락폭이나 피크와 같은 부분이 유사한 움직임을 보인다. 


참고로 주황색이 주가, 파란색이 검색어 트렌드 수치이다. 




결론을 말하자면...


일단 직관적으로 보기에, 검색어 트렌드를 통해 주가와 관련된 유용한 정보를 어느정도 얻을 수 있는 것으로 보인다. 종목에 따라 차이는 있겠지만, '아남전자' 나 '금양', '삼익'의 경우 검색어 트렌드와 주가가 유사한 동향을 보였다. 


다만, 더 확실한 분석을 위해서는 검색어 인덱스와 주가 데이터들에 대한 상관관계 등을 분석함으로써 실제로 서로 영향을 주는지, 통계적으로 따졌을 때 실제로 유의미하다고 볼 수 있을지 살피면 좋을 듯 하다. 


시간이 있다면 다른 종목에 대해서도 그래프를 그려보려고 한다. 그러기 위해선, 위에서 작업한:

>>구글 파이낸스를 통해 주가 데이터를 긁어오고

>>데이터의 날짜를 다듬고

>>스케일링해서 그래프에 그려넣는다

이 일련의 과정 역시 코드를 통해 자동화한다면 훨씬 다루기 유용한 툴이 되지 않을까 싶다


첨부파일로 1부, 2부를 거쳐 내가 작성한 코드와, 사용한 코스피 상장기업 트렌드 데이터를 첨부한다. 

상장기업 리스트는 :http://kind.krx.co.kr/corpgeneral/corpList.do?method=loadInitPage

위 링크에서 얻을 수 있다. 




매거진의 이전글 네이버 API를 사용한 검색어 트렌드 크롤링 툴-1부
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari