본문 바로가기
DATA_SCIENCE/DATA

[DATA] 스타트업 지원 사업 클러스터링 및 워드클라우드

by HYUNHP 2022. 4. 14.
728x90
반응형

안녕하세요, HELLO

 

이번에는 정부에서 주관하는 스타트업 지원 사업을 정리해서 지원 혜택 종류에 따라 클러스터링 (clustering)을 진행하고, 이후에는 지원 대상과 지원 혜택을 워드클라우드로 이미지를 그려보겠습니다. GPU 연산을 위해 구글 Colab을 활용했습니다.

 

■ 분석 목적

 - 現 정부에서 주관하는 스타트업 지원 혜택 유형을 분류

 - 각 지원 대상과 지원 혜택별로 키워드 파악

 

■ 데이터 수집

 - 2021년 1월 ~ 2022년 4월 12일 지원 목록 12,598건

 - 소관부처, 수행기관, 지원분야, 공고명, 지원대상, 지원혜택, 신청시작일자, 신청종료일자, 등록일자, URL

 - 기업마당 크롤링 진행 

2022.04.10 - [DATA_SCIENCE/Python] - [PYTHON] 기업마당_정부 지원 사업 자동화 수집 (크롤링)

 

■ 데이터 전처리

 - 회계 숫자 보존,한글 & 영어 & 숫자 외 제거, 연속된 공백 제거, 좌우 공백 제거, 최대 글자 255자

 

■ Language model

 - Pre-trained model을 활용해서 언어 모델을 진행함 (sentence_transformer)


STEP 1. '데이터 분석 과정' 

 

STEP 2. 'Clustering 결과'

 

STEP 3. '워드클라우드 결과'


STEP 1. '데이터 분석 과정' 


■ 분석 목적

 - 現 정부에서 주관하는 스타트업 지원 혜택 유형을 분류

 - 각 지원 대상과 지원 혜택별로 키워드 파악


■ 데이터 수집

 - 데이터 범위: 2021년 1월 ~ 2022년 4월 12일 지원 목록 12,598건

 

startup list (04.2022).csv
4.97MB

 

 - Column: 소관부처, 수행기관, 지원분야, 공고명, 지원대상, 지원혜택, 신청시작일자, 신청종료일자, 등록일자, URL

 - 아래 게시글에 크롤링 코드를 작성했습니다, 직접 크롤링을 진행하실 분은 참고하시기 바랍니다.

2022.04.10 - [DATA_SCIENCE/Python] - [PYTHON] 기업마당_정부 지원 사업 자동화 수집 (크롤링)


■ Improt library

 

# import library

# pre-trained model을 활용해서, 언어 모델을 진행함
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('jhgan/ko-sroberta-multitask')

from sklearn.cluster import KMeans
import pandas as pd
from tqdm import tqdm

from konlpy.tag import Hannanum

from google.colab import files
#uploaded = files.upload()

import io

■ 데이터 확인

 

# 활용 데이터 불러오기
df = pd.read_csv(io.BytesIO(uploaded['startup list (04.2022).csv']))

# 데이터 확인
df.head(2)

 

활용할 데이터는 '소관부처, 수행기관, 지원분야, 공고명, 지원대상, 지원혜택, 신청시작일자, 신청종료일자, 등록일자, URL'로 구성되었습니다. 이번 분석에는 '지원대상, 지원혜택'을 활용합니다.

 

# 결측치 확인
df.isnull().sum()

데이터 확인 결과, 1건의 결측치가 존재합니다.

 

# NULL 값 제거
print('지원 사업 목록 제거 전 "{}" 건'.format(len(df)))

df.dropna(inplace = True)
print('지원 사업 목록 제거 후 "{}" 건'.format(len(df)))

결측치 제거하여, 12,597건을 분석에서 활용했습니다.


■ 데이터 전처리

 

 - 지원 혜택에는 자본금 지원 항목이 많아, 회계 데이터를 보존하는 것이 중요합니다.

 - 회계 숫자 보존, 한글 & 영어 & 숫자 외 제거, 연속된 공백 제거, 좌우 공백 제거, 최대 글자 255자

 

# 데이터 전처리
# 회계 숫자 보존,한글 & 영어 & 숫자 외 제거, 연속된 공백 제거, 좌우 공백 제거, 최대 글자 255자

df_lst = ['지원혜택', '지원대상']

for i in df_lst:
  df[i] = df[i] \
  .replace(',', '', regex =True) \
  .replace(r'[^a-z|A-Z|0-9|ㄱ-ㅎ|가-힣]', ' ', regex = True) \
  .replace(r'\s+', ' ', regex = True) \
  .str.strip() \
  .str[:255] # 255자 이상 문자를 입력할 경우, Cuda error가 발생하여 글자 수 제한

■ Language model

 

 - Pre-trained model을 활용해서 언어 모델을 진행함 (sentence_transformer)

 - 언어 모델을 훈련하기 위해서는 대용량 데이터가 필요하기에, pre-trained model을 활용하고, 모델에 embedding vector을 연산합니다. 이를 통해 pre-trained model에 데이터가 훈련됩니다.

 - 언어 모델에서 embedding은 텍스트를 숫자형 vector로 변환하여 연산에 활용할 수 있게 합니다.  

 

# 스타트업 지원 혜택 임베딩

corpus_benefit = df['지원혜택'].values.tolist()
embeddings_benefit = model.encode(corpus_benefit)

embeddings_benefit[:5]

 

# KMeans clustering

num_clusters = 5
clustering_model = KMeans(n_clusters = num_clusters)
clustering_model.fit(embeddings_benefit)
cluster_labels = clustering_model.labels_

clustered_lst = [[] for i in range(num_clusters)]
for sentence_id, cluster_id in enumerate(cluster_labels):
  clustered_lst[cluster_id].append(corpus_benefit[sentence_id])

for i, cluster in enumerate(clustered_lst):
  print('cluser %d (%d)' % (i+1, len(cluster)))
  print(cluster)
  print('\n')

확인 결과, 자본금 지원, 마케팅, 기타 혜택 등으로 분류됨을 확인했습니다. 


STEP 3. '워드클라우드 결과'

 

추가적으로, 지원대상, 지원혜택 별로 워드클라우드를 그려보겠습니다.

우선, 지원혜택부터 워드클라우드를 그려보겠습니다.

 

# 워드 클라우드 그리기 
# 지원 혜택
extractor = Hannanum()

benefit_nouns = []

for benefit in tqdm(df['지원혜택'].values.tolist()):
  if type(benefit) is str:
    benefit_nouns.extend(extractor.nouns(benefit))

 

# 글자수 개수 파악

from collections import Counter

benefit_count = Counter(benefit_nouns)
benefit_words = dict(benefit_count.most_common())

for i, (word, count) in enumerate(benefit_words.items()):
  if i > 10:
    break

  print(word, count)

확인 결과, 1 글자로 표기된 단어 중에서 기간 내 기타 등등 이런 표현들이 포함되어, 해당 글자는 제외합니다.

 

 

benefit_words = {key:value for key, value in benefit_words.items() if len(key) > 1}
for i, (word, count) in enumerate(benefit_words.items()):
  if i > 10:
    break

  print(word, count)

 

# 지원혜택 워드클라우드 그리기

from wordcloud import WordCloud
import matplotlib.pyplot as plt

wc_ben_image = WordCloud(
    font_path='NanumSquareRoundR.ttf',
    width=2000,
    height=1000
).generate_from_frequencies(benefit_words)

plt.figure(figsize=(20, 10))
plt.imshow(wc_ben_image)
plt.axis('off')
plt.show()

 


그리고 추가적으로, '지원대상'을 워드클라우드로 그려보겠습니다.

 

# 지원 대상 워드 클라우드 그리가

extractor = Hannanum()

target_nouns = []

for benefit in tqdm(df['지원대상'].values.tolist()):
  if type(benefit) is str:
    target_nouns.extend(extractor.nouns(benefit))

target_count = Counter(target_nouns)
target_words = dict(target_count.most_common())

target_words = {key:value for key, value in target_words.items() if len(key) > 1}  ## 1글자 제거

wc_tag_image = WordCloud(
    font_path='NanumSquareRoundR.ttf',
    width=2000,
    height=1000
).generate_from_frequencies(target_words)

plt.figure(figsize=(20, 10))
plt.imshow(wc_tag_image)
plt.axis('off')
plt.show()

 


끝으로, 이번 분석을 진행하면서 작성한 코드를 공유합니다.

스타트업_지원_사업_클러스터링.ipynb
1.73MB


 

■ 마무리

오늘은 '스타트업 지원 사업 클러스터링 및 워드클라우드'에 대해서 알아봤습니다.

좋아요댓글 부탁드리며,

오늘 하루도 즐거운 날 되시길 기도하겠습니다 :)

감사합니다.

반응형

댓글