안녕하세요, 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건
- 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()
끝으로, 이번 분석을 진행하면서 작성한 코드를 공유합니다.
■ 마무리
오늘은 '스타트업 지원 사업 클러스터링 및 워드클라우드'에 대해서 알아봤습니다.
좋아요와 댓글 부탁드리며,
오늘 하루도 즐거운 날 되시길 기도하겠습니다 :)
감사합니다.
'DATA_SCIENCE > DATA' 카테고리의 다른 글
[DATA] 수치형 데이터에서 피처 정규화가 중요할까요? (0) | 2023.05.28 |
---|---|
2022년 상반기 서강대학교 정보통신대학원 데이터 사이언스 합격 후기 (21) | 2022.01.13 |
댓글