본문 바로가기

Data Science/Data Preprocessing

[03. Feature Engineering] 003. Binning

728x90

숫자형 변수를 범주형 변수로 변환하는 것을 구간화(Binning)라고 한다. 쉽게 설명하면 히스토그램을 생각하면 된다. 특정부분에서의 결측치가 많거나 의미있는 정보가 아닌 경우, 그리고 Raw Data로는 정보를 추출하기 힘든 경우 사용하면 된다. 그렇다고 모든 연속형 변수를 Binning시키면 중요한 정보가 사라질 수 있다. 모든 데이터 분석이 그렇듯이 분석자의 역량과 판단이 중요하다.

 

from bs4 import BeautifulSoup
import pandas as pd
import requests
from io import BytesIO
from zipfile import ZipFile
import json

def get_company_code(api_key):
    url = 'https://opendart.fss.or.kr/api/corpCode.xml?crtfc_key=%s' % api_key
    response = requests.get(url)
    zip_file = ZipFile(BytesIO(response.content))
    files = zip_file.namelist()
    soup = ''

    with zip_file.open(files[0]) as csvfile:
        soup = BeautifulSoup(csvfile.read(), 'lxml')
        soup = soup.findAll('list')

    data = []
    for company in soup:
        data.append({
            'corp_code': company.corp_code.text,
            'corp_name': company.corp_name.text,
            'stock_code': company.stock_code.text,
            'modify_date': company.modify_date.text
        })

    return pd.DataFrame(data)

def get_multi_account(api_key, code, year, report_code):
    fullUrl = 'https://opendart.fss.or.kr/api/fnlttMultiAcnt.json?crtfc_key=%s&corp_code=%s&' \
              'bsns_year=%s&reprt_code=%s' % (api_key, code, year, report_code)

    response = requests.get(fullUrl, headers={'User-Agent': 'Mozilla/5.0'})
    result = response.text
    result = json.loads(result)

    if result['status'] == '000':
        data = pd.DataFrame(result['list'])

        return data

if __name__ == '__main__':
    api_key = '*'
    company_code = get_company_code(api_key)
    code = ','.join(company_code[company_code['stock_code'].isin(['005930', '005380', '000660','035720', '035420', '093050', '051910', '207940', '051900'])]['corp_code'].tolist())
    year = '2020'
    report_code = '11011'

    multi_account = get_multi_account(api_key, code, year, report_code)
    multi_account = multi_account[['stock_code', 'fs_nm', 'account_nm', 'thstrm_amount']]
    multi_account = multi_account[(multi_account['fs_nm']=='연결재무제표') & (multi_account['account_nm']=='당기순이익')]
    multi_account['thstrm_amount'] = multi_account['thstrm_amount'].str.replace(',', '').astype(float) / 100000000

    # bins = (미포함, 포함]
    bins = [0, 500, 1000, 1500, 2000, 3000, 5000, 10000, 20000, 50000, 100000, 300000]
    multi_account['bins'] = pd.cut(multi_account['thstrm_amount'], bins=bins)
multi_account = multi_account.merge(company_code[['stock_code', 'corp_name']], how='left', on='stock_code')
    print(multi_account)


결과 값
  stock_code   fs_nm      account_nm      thstrm_amount        bins       corp_name
0  005930     연결재무제표  당기순이익      264078.320000  (100000, 300000]  삼성전자    
1  000660     연결재무제표  당기순이익      47589.140000   (20000, 50000]    SK하이닉스  
2  035720     연결재무제표  당기순이익      1733.596719    (1500, 2000]      카카오     
3  035420     연결재무제표  당기순이익      8449.969771    (5000, 10000]     NAVER   
4  051910     연결재무제표  당기순이익      6824.080000    (5000, 10000]     LG화학    
5  051900     연결재무제표  당기순이익      8131.011400    (5000, 10000]     LG생활건강  
6  093050     연결재무제표  당기순이익      285.960299     (0, 500]          LF      
7  207940     연결재무제표  당기순이익      2409.748000    (2000, 3000]      삼성바이오로직스
728x90