공시데이터 공시등록에 대한 분석 및 시각화
- 분석 목적:
이번에 dart의 open api를 열어 NAS DB에 쌓기 시작했다. 데이터 추출에 기반이 되는 회사명, 회사고유번호, 수정날짜 등을 이용해서 분석을 진행해볼 예정이다. 주로 시계열 분석적으로 데이터를 확인해볼 예정이다.
# Library 불러오기
import pandas as pd
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
import config
import pymysql
from collections import Counter
import datetime
# 디비 접속 및 데이터 불러오기
con_hs = pymysql.connect(host = config.hs_db['host'],password = config.hs_db['password'],
user= config.hs_db['user'],port=config.hs_db['port'],db="hs_datascience_db",charset='utf8')
dart_df = pd.read_sql("SELECT * FROM dart_corp_code",con=con_hs)
con_hs.close()
dart_df
| id | corp_code | corp_name | stock_code | modify_date | record_datetime | |
|---|---|---|---|---|---|---|
| 0 | 87305 | 00434003 | 다코 | None | 2017-06-30 | 2021-08-02 22:31:36 |
| 1 | 87306 | 00434456 | 일산약품 | None | 2017-06-30 | 2021-08-02 22:31:36 |
| 2 | 87307 | 00430964 | 굿앤엘에스 | None | 2017-06-30 | 2021-08-02 22:31:36 |
| 3 | 87308 | 00432403 | 한라판지 | None | 2017-06-30 | 2021-08-02 22:31:36 |
| 4 | 87309 | 00388953 | 크레디피아제이십오차유동화전문회사 | None | 2017-06-30 | 2021-08-02 22:31:36 |
| ... | ... | ... | ... | ... | ... | ... |
| 87948 | 175253 | 00804318 | 씨엠에프 | None | 2021-08-17 | 2021-08-18 08:00:22 |
| 87949 | 175254 | 00244260 | 극동제연공업 | None | 2021-08-17 | 2021-08-18 08:00:22 |
| 87950 | 175255 | 01119606 | 하나스테이제1호위탁관리부동산투자회사 | None | 2021-08-17 | 2021-08-18 08:00:22 |
| 87951 | 175256 | 00942751 | 선산철강공업 | None | 2021-08-17 | 2021-08-18 08:00:22 |
| 87952 | 175257 | 01578270 | 골든씨제일차 | None | 2021-08-17 | 2021-08-18 08:00:22 |
87953 rows × 6 columns
다음과 같이 테이블을 구성하여 집어넣고 있다. corp_code 같은 경우에는 혹시 몰라서 스트링으로 데이터를 모으고 있는 중이다. 우선 corp_code가 고유한지 파악해 보았다. 총 87953개의 데이터가 들어가 있다.
pd.DataFrame(Counter(dart_df.corp_code).items(),columns=['corp_code','cunt']).sort_values(['cunt'],ascending=False).head()
| corp_code | cunt | |
|---|---|---|
| 82123 | 01416642 | 3 |
| 68289 | 01432631 | 3 |
| 81808 | 00130824 | 2 |
| 85429 | 00193832 | 2 |
| 74413 | 01353051 | 2 |
확실히 중복이 존재할 것이라고 생각했는데, 생각이 맞았다. 그렇다면 왜 겹치는 코드가 있는 것일까. 맨 위에 세번이나 중복이 있는 “01416642”를 불러와서 확인해 보았다.
dart_df[dart_df.corp_code=="01416642"]
| id | corp_code | corp_name | stock_code | modify_date | record_datetime | |
|---|---|---|---|---|---|---|
| 82123 | 169428 | 01416642 | 유안타제6호스팩 | 340360 | 2021-07-29 | 2021-08-02 22:31:38 |
| 87445 | 174750 | 01416642 | 다보링크 | 340360 | 2021-08-13 | 2021-08-16 17:33:49 |
| 87938 | 175243 | 01416642 | 다보링크 | 340360 | 2021-08-17 | 2021-08-18 08:00:22 |
최근 유행하는 스팩주와 관련된 내용이다. 증권사들이 회사를 상장하기 위해 최근에 주로 사용하는 방법으로 알고 있다. 자세한건 모르기 때문에 추 후에 알아봐야 겠다. 아무튼 스팩 주도 dart에 등록이 된다는 사실을 알게 되었다. 본 분석에서는 등록되는 발전소의 월별 갯수를 확인하고 싶기 때문에 중복은 제거해 주도록 하겠다.
dart_df2 = dart_df.drop_duplicates(['corp_code'],keep='first')
len(dart_df2)
87385
갯수가 87953개에서 87385로 줄어들었다. 생각보다 많이 빠지지는 않았다. 그렇다면 stock_code가 부여된 회사는 몇개가 있을까? 사실 이 중에는 상장폐지가 된 것도 있으리라 생각된다. 일단 간단한 시각화를 위해 column을 만들어 주자.
dart_df2['exist_stock_code'] = np.nan
dart_df2.exist_stock_code[dart_df2.stock_code.isnull()]="상장X"
dart_df2.exist_stock_code[dart_df2.stock_code.isnull()==False]="상장O"
fig = px.histogram(x='exist_stock_code',color="exist_stock_code",data_frame=dart_df2)
생각보다 큰 차이가 있음을 알 수 있다. 이제까지 8만 개가 넘는 회사들이 dart에 등록되었지만, 정작 상장이 되었다고 추정되는 회사는 약 3천개 정도 밖에 되지 않았다. 상장 자체가 쉬운 일이 아님을 알 수 있다. 그렇다면 회사 등록이 월별로 얼만큼 되었는지 알아보도록 하자. 그럴려면 우선 년월을 나타낼 수 있는 column을 나타내 주어야 한다.
dart_df2['month'] = [x.strftime("%Y-%m") for x in dart_df2.modify_date]
dart_monthly= pd.DataFrame(Counter(dart_df2.month).items(),columns=['month','cunt']).sort_values(['month'])
dart_monthly.head()
| month | cunt | |
|---|---|---|
| 0 | 2017-06 | 34182 |
| 2 | 2017-07 | 152 |
| 3 | 2017-08 | 215 |
| 4 | 2017-09 | 276 |
| 5 | 2017-10 | 224 |
2017년 6월에 한꺼번에 dart API DB에 올라갔음을 확인할 수 있다.숫자가 크기 때문에 단순한 트렌드를 확인하기 위해 cunt에 로그화를 진행하도록 하겠다.
dart_monthly['log_cunt']=np.log(dart_monthly.cunt)
fig=px.line(x="month",y="log_cunt",data_frame=dart_monthly)
2017년 6월을 제외하면 2021년 2월에 상당히 많은 회사가 등록되었다. 예상하건데 스팩주의 시작이 2021년 2월이 아니었을까? 로그화를 한 것이기 때문에 실제로 차이는 더 크다. 확실히 조금씩 회사가 많이 만들어지고 있다는 느낌이 든다. 또한 2월,5월 정도에 회사등록이 많이 일어난 다는 것을 짐작할 수 있다.
Leave a comment