DataSet : ์์๊ณต์ธ ์๊ถ ์ ๋ณด
- pecab : ํํ์ ๋ถ์๊ธฐ
- ๋จ์ : ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ฌ์ฉํ์ง ์๋๋ค- wordcloud : ๋จ์ด ๋ชจ์ ์ถ๋ ฅ ๋๊ตฌ
# ํ
์คํธ ๋ถ์์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
!pip install pecab wordcloud
# ๋ถ์์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
โ
- glob : ํ์ผ ์ด๋ฆ ๊ท์น์ ํด๋นํ๋ ํ์ผ๊ฒฝ๋ก ๋ชจ๋ ๊ฐ์ ธ์ค๋ ํจ์
- tqdm : progress bar(๋ฐ์ดํฐ ๋ถ๋ฌ์ฌ ๋ ์งํ ์ ๋ ํ์ธ ๊ฐ๋ฅ)
- tab ํ์ฉ : ๊ฒฝ๋ก ์ ๋ ฅ ์ tab์ ๋๋ฅด๋ฉด ๋ค์ ๊ฒฝ๋ก ๋ชฉ๋ก ํ์ธ ๊ฐ๋ฅ
from glob import glob
from tqdm.auto import tqdm
# ํ์ผ ์ด๋ฆ ๊ท์น์ ํด๋นํ๋ ํ์ผ๊ฒฝ๋ก ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ
file_list = sorted(glob('./data/์๊ฐ(์๊ถ)์ ๋ณด_20230630/*.csv'))
data = pd.DataFrame()
# ํด๋น ํ์ผ ๋ชจ๋ ๋ถ๋ฌ์ ๋ณํฉ
for file in tqdm(file_list): # tqdm ์ค์
temp = pd.read_csv(file)
data = pd.concat([data, temp], axis=0)
# tqdm์ด ์๋๋์ง ์์ ์ ์๋ ์ฝ๋๋ก ๋น์ทํ ๊ธฐ๋ฅ ๊ตฌํ ๊ฐ๋ฅ
# for idx, file in enumerate(file_list):
# print("Loading %d%%" % (idx/len(file_list)*100))
# temp = pd.read_csv(file)
# data = pd.concat([data, temp], axis=0)
โ
- gc : garbage collector(์์คํ ์ํํธ์จ์ด)
- ํ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์ด(๋ฉ๋ชจ๋ฆฌ ์ฒญ์)
- ๋์ฉ๋ ๋ฐ์ดํฐ ์ฌ์ฉ ์ ํ์(์ญ์ ๋ค ์ฌ์ฉ!)gc.collect() # ๋ฉ๋ชจ๋ฆฌ ๋ฐํ
# ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ ๋ ํ์ธ
data.info(memory_usage='deep')
# ์ฌ์ฉํ column์ ์ฐพ๊ธฐ ์ํด ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ์ฌ์ฉ
# df = data[:10000]
df = data.sample(n=10000, random_state=42) # 1๋ง๊ฐ ๋๋ค ์ถ์ถ
# ๋ถ์์ ์ํด ํ์ํ ์ปฌ๋ผ ํ์ธ
df.iloc[:, 1:11] # ์ํธ๋ช
, ์๊ถ์
์ข
๋๋ถ๋ฅ๋ช
, ์๊ถ์
์ข
์ค๋ถ๋ฅ๋ช
df.iloc[:, 11:15] # ์๋๋ช
# ํ์ ์ปฌ๋ผ๋ง์ ๋ด์ ๋ฐ์ดํฐ ๊ตฌ์ถ
data = data[['์ํธ๋ช
', '์๊ถ์
์ข
๋๋ถ๋ฅ๋ช
', '์๊ถ์
์ข
์ค๋ถ๋ฅ๋ช
', '์๋๋ช
']]
# ๋ฉ๋ชจ๋ฆฌ ๋ฐํ
gc.collect()
โ
# ํ์ ์์์ ์ ๋ฐ์ดํฐ
kr_restaurant = df[df['์๊ถ์
์ข
์ค๋ถ๋ฅ๋ช
'] == 'ํ์']
# ์ผ์ ์์์ ์ ๋ฐ์ดํฐ
jp_restaurant = df[df['์๊ถ์
์ข
์ค๋ถ๋ฅ๋ช
'] == '์ผ์']
# ์ค์ ์์์ ์ ๋ฐ์ดํฐ
cn_restaurant = df[df['์๊ถ์
์ข
์ค๋ถ๋ฅ๋ช
'] == '์ค์']
# ์ ์ฒด ์์์ ์ ๋ฐ์ดํฐ
total_restaurant = df[df['์๊ถ์
์ข
๋๋ถ๋ฅ๋ช
'] == '์์']
# ํ์/์ผ์/์ค์ ์์์ ๋น์จ ์ถ๋ ฅ
print(f'ํ์ ์์์ ๋น์จ : {len(kr_restaurant) / len(total_restaurant) *100:.2f}%')
print(f'์ผ์ ์์์ ๋น์จ : {len(jp_restaurant) / len(total_restaurant) *100:.2f}%')
print(f'์ค์ ์์์ ๋น์จ : {len(cn_restaurant) / len(total_restaurant) *100:.2f}%')
for sido in df['์๋๋ช
'].unique():
cond1 = df['์๋๋ช
'] == sido
cond2 = df['์๊ถ์
์ข
๋๋ถ๋ฅ๋ช
'] == '์์'
print(f'{sido} ์์์ ๋น์จ : {len(df.loc[cond1 & cond2]) / len(df[cond1]) * 100:.2f}')
- ํ ์คํธ ๋ง์ด๋(text mining) : ํ ์คํธ ๋ฐ์ดํฐ๋ก EDA
ex) ํค์๋, ์ฐ๊ด์ด ์ฐพ๊ธฐ
ex) LDA(์ฃผ์ ๋จ์ด ์ฐพ๊ธฐ-์ฌํ๊ณผํ ์ฐ๊ตฌ์ ๋ง์ด ์ฌ์ฉ)
- ์ฌํ๊ณผํ ์ฐ๊ตฌ ์ ์ค๋ฌธ์กฐ์ฌ ๋ง์ด ํ์ฉ(๊ทธ ์ธ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ, ์ธ์คํ๊ทธ๋จ ๋ฑ)[text mining process]
- corpus(๋ถ์ํ ํ ์คํธ ๋ฐ์ดํฐ) ์ ์
ex) ๋ค์ด๋ฒ ์ข ๋ชฉ ํ ๋ก ์ค
โ- ์ ์ฒ๋ฆฌ(text cleaning) - ๊ฐ์ฅ ๋ง์ ์๊ฐ ์์
- ๋ถ์ฉ์ด ์ ๊ฑฐ(์, ํน์ ๋จ์ด ๋ฑ)
- ํํ ํต์ผ (text normalization)
ex) ์ ์ผ์น(apple, apples)
ex) go, went, going ์ฒ๋ฆฌ
ex) ๊ฒฝ์ ๊ต์ก/๊ฒฝ์ ๊ต์ก >> ์ ์ฒ๋ฆฌ- regular expression(์ ๊ท ํํ์) ํ์ฉ
- ์ฑGPT์๊ฒ ์ ๊ทํํ์ ๋ถ๋ถ ๋งก๊ธฐ๋ ๊ฒ๋ ํ ๋ฐฉ๋ฒ์ผ ์ ์๋ค
โ
- tokenization(๋ถ์ ๋จ์ ๊ฒฐ์ ) ๐๐๐
- ์ด ๊ณผ์ ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ ๋ค๋ฅด๊ฒ ๋์จ๋ค
- ๋ฌธ์, ํํ์ ๊ธฐ์ค ๋ฑ
โ
- modeling
โ- visualization
- pecab
- morphs(๋ฌธ์ฅ) : ์ฃผ์ด์ง ๋ฌธ์ฅ์ ํํ์ ๋จ์๋ก ๋๋๋ ํจ์
- nouns(๋ฌธ์ฅ) : ์ฃผ์ด์ง ๋ฌธ์ฅ์์ ๋ช ์ฌ๋ง ์ถ์ถํ๋ ํจ์
- pos(๋ฌธ์ฅ) : POS(Part-OfSpeech) tagging(=ํ์ฌ ๋ถ์)ํ๋ ํจ์
- [์ฐธ๊ณ ][Korean POS tags comparison chart] J์ด(https://docs.google.com/spreadsheets/d/1OGAjUvalBuX-oZvZ-9tEfYD2gQe7hTGsgUpiiBSXI8/edit#gid=0)
corpus = data.loc[data["์๊ถ์
์ข
์ค๋ถ๋ฅ๋ช
"]=='ํ์', '์ํธ๋ช
']
from pecab import PeCab
pecab = PeCab()
# ์ํธ๋ช
์์ ๋ช
์ฌ๋ง ์ถ์ถ
tokenized_corpus = []
for doc in corpus:
tokenized_corpus.extend(pecab.nouns(doc))
# ๋น๋๊ฐ ๋์ 30๊ฐ ๋จ์ด ์ถ๋ ฅ
from collections import Counter
counter = Counter(tokenized_corpus)
counter.most_common(30)
# ๊ธ๊ผด ํ์ผ ๊ฒฝ๋ก ์ง์
# font_location = '/System/Library/Fonts/AppleSDGothicNeo.ttc' # For Apple
font_location = 'C:/Windows/Fonts/Malgun.ttf' # For Windows
from wordcloud import WordCloud
# font_path : ์ฌ์ฉํ๋ ๊ธ๊ผด์ ๊ฒฝ๋ก
# max_words : ์ต๋ ๋ช๊ฐ์ ๋จ์ด๋ฅผ ์ฌ์ฉํ ์ง(๋น๋์)
# width : ๊ฐ๋ก ๊ธธ์ด
# height : ์ธ๋ก ๊ธธ์ด
# random_state : for reproducing
# background_color : ๋ฐฐ๊ฒฝ ์(๊ธฐ๋ณธ์ : ๊ฒ์ )
# colormap : color palette
wc = WordCloud(font_path= font_location,
max_words=50,
width=1920,
height=1080,
random_state=42,
background_color='white',
colormap='viridis',).generate_from_frequencies(counter)
plt.axis('off') # ์ถ์ ์ถ๋ ฅํ์ง ์์
plt.savefig('./wordcloud.png') # wordcloud ๊ฒฐ๊ณผ ์ ์ฅ
plt.imshow(wc)