Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 머신러닝
- OpenAIAPI
- fastapi #python웹개발
- 챗gpt
- Python
- fastapi
- 자연어분석
- chatGPT
- 파이썬
- sklearn
- NLP
- 딥러닝
- pytorch
- langchain
- fastapi #파이썬웹개발
- HTML
- konlpy
- python 정렬
- 파이썬웹개발
- 파이토치기본
- pandas
- 판다스
- deeplearning
- 사이킷런
- 랭체인
- 파이토치
- programmablesearchengine
- 판다스 데이터정렬
- MachineLearning
- 비지도학습
Archives
- Today
- Total
Data Navigator
[NLP, 키워드 빈도 분석] 고양시 관광 관련 인스타그램 수집 자료 분석 본문
고양시 관광 관련 인스타그램 크롤링 자료 분석
결론
1. 인스타그램은 비공개 게시물이 많아 관련 키워드의 총 게시물 숫자에 비해서 수집이 가능한 게시물 수가 적었음.
2. 고양시 관련 여행 패턴과 자주 가는 관광지가 어디인지를 찾는 것이 목적이었으나 인스타그램이 주로 음식점, 카페 관련 게시물이 압도적으로 많은 관계로 목적에 맞는 결과가 도출되지 않음.
고양시 관광 관련 인스타그램 게시물에 언급된 단어 빈도 상위 100개의 그래프
추가 분석 과제
1. 딥러닝을 활용한 군집 분석과 단어 간의 상관관계 분석이 필요. (gensim, Word2Vec을 이용해 분석 예정)
2. 블로그와 페이스북 자료를 추가적으로 확보하여 함께 분석 하는 것이 필요.
분석환경
Mac OS Big Sur,
python, pandas, Konlpy, Mecab, nltk, wordcloud
¶
In [232]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
In [233]:
goyangsi_trip = pd.read_csv('/Users/starlight_publishing/bigdata/insta_crawling/고양시여행_3253중380_all_text.csv', header=None, index_col=None, sep=',')
goyang_trip = pd.read_csv('/Users/starlight_publishing/bigdata/insta_crawling/고양여행_4248중712_all_text.csv', header=None, index_col=None, sep=',')
goyang_hotplace = pd.read_csv('/Users/starlight_publishing/bigdata/insta_crawling/고양핫플_2389중2032_all_text.csv', header=None, index_col=None, sep=',')
goyang_restaurent = pd.read_csv('/Users/starlight_publishing/bigdata/insta_crawling/고양시맛집_63121중702_all_text.csv', header=None, index_col=None, sep=',')
ilsan_trip = pd.read_csv('/Users/starlight_publishing/bigdata/insta_crawling/일산여행_5207중296_all_text.csv', header=None, index_col=None, sep=',')
ilsan_hotplace = pd.read_csv('/Users/starlight_publishing/bigdata/insta_crawling/일산핫플_38788중546_all_text.csv', header=None, index_col=None, sep=',')
데이터 전처리를 위해서 string, Mecab, re 모듈 import¶
In [234]:
import string
from konlpy.tag import Mecab
import re
In [235]:
string.punctuation
Out[235]:
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
CSV에서 읽어온 자료가 (1,n) 배열이라서 transpose()를 사용해 (n,1)로 shape 변환¶
In [236]:
goyangsi_trip = goyangsi_trip.transpose()
goyang_trip = goyang_trip.transpose()
goyang_hotplace = goyang_hotplace.transpose()
ilsan_trip = ilsan_trip.transpose()
ilsan_hotplace = ilsan_hotplace.transpose()
관광 관련 데이터 프레임을 모두 합쳐서 data에 저장¶
In [237]:
data = pd.concat([goyangsi_trip, goyang_trip, goyang_hotplace, ilsan_trip, ilsan_hotplace])
data
Out[237]:
0 | |
---|---|
0 | gyeonggi_tour |
1 | 경기도에서도 중남미의 문화를 한껏 느껴볼 수가 있어요! 고양시 중남미문화원에서 이국... |
2 | gyeonggi_tour |
3 | #경기도 #호감사진 #경기관광공사 #주말여행 #고양시 #고양시여행 #중남미문화원 #... |
4 | NaN |
... | ... |
6640 | _\n제주나 양평 어딘가에 있을듯한 뮤지어... |
6641 | jisoo_o_o |
6642 | 바디크리에이터 대표 김지수 입니다 ◡̈︎ 잠시 소통가능하세요 ~~?🤗 |
6643 | NaN |
6644 | NaN |
38548 rows × 1 columns
string.punctuation을 사용하여 특수문자 제거¶
In [238]:
data[0] = data[0].apply(lambda x : ''.join([i for i in str(x) if i not in string.punctuation]))
data
Out[238]:
0 | |
---|---|
0 | gyeonggitour |
1 | 경기도에서도 중남미의 문화를 한껏 느껴볼 수가 있어요 고양시 중남미문화원에서 이국적... |
2 | gyeonggitour |
3 | 경기도 호감사진 경기관광공사 주말여행 고양시 고양시여행 중남미문화원 가을여행 가을 ... |
4 | nan |
... | ... |
6640 | \n제주나 양평 어딘가에 있을듯한 뮤지엄... |
6641 | jisoooo |
6642 | 바디크리에이터 대표 김지수 입니다 ◡̈︎ 잠시 소통가능하세요 🤗 |
6643 | nan |
6644 | nan |
38548 rows × 1 columns
이모티콘, \n 등의 문자가 남아있는 것을 정규표현식을 사용하여 제거¶
In [239]:
clean = re.compile('[^가-힣a-z]')
In [240]:
data[0] = data[0].apply([lambda x : clean.sub(' ',x)])
data
Out[240]:
0 | |
---|---|
0 | gyeonggitour |
1 | 경기도에서도 중남미의 문화를 한껏 느껴볼 수가 있어요 고양시 중남미문화원에서 이국적... |
2 | gyeonggitour |
3 | 경기도 호감사진 경기관광공사 주말여행 고양시 고양시여행 중남미문화원 가을여행 가을 ... |
4 | nan |
... | ... |
6640 | ... |
6641 | jisoooo |
6642 | 바디크리에이터 대표 김지수 입니다 잠시 소통가능하세요 |
6643 | nan |
6644 | nan |
38548 rows × 1 columns
In [241]:
data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 38548 entries, 0 to 6644
Data columns (total 1 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 0 38548 non-null object
dtypes: object(1)
memory usage: 602.3+ KB
Konlpy의 Mecab()을 사용하여 명사만 추출¶
In [242]:
mecab = Mecab()
In [243]:
data2 = data.copy()
In [244]:
data2
Out[244]:
0 | |
---|---|
0 | gyeonggitour |
1 | 경기도에서도 중남미의 문화를 한껏 느껴볼 수가 있어요 고양시 중남미문화원에서 이국적... |
2 | gyeonggitour |
3 | 경기도 호감사진 경기관광공사 주말여행 고양시 고양시여행 중남미문화원 가을여행 가을 ... |
4 | nan |
... | ... |
6640 | ... |
6641 | jisoooo |
6642 | 바디크리에이터 대표 김지수 입니다 잠시 소통가능하세요 |
6643 | nan |
6644 | nan |
38548 rows × 1 columns
In [245]:
data2[0] = data2[0].apply(lambda x : mecab.nouns(x))
data2
Out[245]:
0 | |
---|---|
0 | [] |
1 | [경기도, 중남미, 문화, 수, 고양시, 중남미, 문화원, 이국, 볼거리] |
2 | [] |
3 | [경기도, 호감, 사진, 경기, 관광공사, 주말, 여행, 고양시, 고양시, 여행, ... |
4 | [] |
... | ... |
6640 | [일상, 주말, 일산, 핫, 플] |
6641 | [] |
6642 | [바디, 크리에이터, 대표, 김지수, 소통, 가능] |
6643 | [] |
6644 | [] |
38548 rows × 1 columns
영어와 nan이었던 행이 빈리스트가 되어 있으므로 빈리스트를 NaN으로 변환 후 제거¶
In [246]:
data2[0].head()
Out[246]:
0 []
1 [경기도, 중남미, 문화, 수, 고양시, 중남미, 문화원, 이국, 볼거리]
2 []
3 [경기도, 호감, 사진, 경기, 관광공사, 주말, 여행, 고양시, 고양시, 여행, ...
4 []
Name: 0, dtype: object
In [247]:
len(data2[0])
Out[247]:
38548
In [248]:
data2[0] = data2[0].apply(lambda x : x if len(x) != 0 else "NaN")
In [249]:
data2
Out[249]:
0 | |
---|---|
0 | NaN |
1 | [경기도, 중남미, 문화, 수, 고양시, 중남미, 문화원, 이국, 볼거리] |
2 | NaN |
3 | [경기도, 호감, 사진, 경기, 관광공사, 주말, 여행, 고양시, 고양시, 여행, ... |
4 | NaN |
... | ... |
6640 | [일상, 주말, 일산, 핫, 플] |
6641 | NaN |
6642 | [바디, 크리에이터, 대표, 김지수, 소통, 가능] |
6643 | NaN |
6644 | NaN |
38548 rows × 1 columns
In [250]:
data2 = data2[0].loc[data2[0] != "NaN"]
In [251]:
data2 = pd.DataFrame(data2)
In [252]:
data2 = data2.reset_index(drop=True)
In [253]:
data2
Out[253]:
0 | |
---|---|
0 | [경기도, 중남미, 문화, 수, 고양시, 중남미, 문화원, 이국, 볼거리] |
1 | [경기도, 호감, 사진, 경기, 관광공사, 주말, 여행, 고양시, 고양시, 여행, ... |
2 | [것, 가을, 님, 가을, 가요, 하늘, 것, 님, 마음, 가을] |
3 | [사람, 단풍, 사진] |
4 | [그림, 하늘, 호수, 갈대, 무지개, 완벽, 조합, 풍경, 산책, 뷰, 발걸음, ... |
... | ... |
11324 | [효교, 짬뽕] |
11325 | [효소, 소] |
11326 | [답글, 개] |
11327 | [일상, 주말, 일산, 핫, 플] |
11328 | [바디, 크리에이터, 대표, 김지수, 소통, 가능] |
11329 rows × 1 columns
전처리가 완료된 데이터 프레임 행에서 단어를 추출하여 all_word에 모음¶
In [268]:
all_word = []
for row in data2[0]:
for word in row:
all_word.append(word)
len(all_word)
Out[268]:
205032
단어 빈도를 체크하면서 불용어 리스트를 만들고 단어 모음에서 제거 후 all_word2에 모음¶
In [296]:
stopword = ['고양','일산','핫','플','스타','그램','답글','맞','팔','곳','리','원','애','수','오','샵','나','분','드','맘','일' \
,'길','밤','거','만','어','월','이','시','오늘','여기','중','렌','맛','선','날','번','천','점','집','티','것' \
, '인','존','곧','먹','반사','내']
all_word2 = []
for row in data2[0]:
for word in row:
if word not in stopword:
all_word2.append(word)
else:
continue
len(all_word2)
Out[296]:
153801
NLTK의 FreqDist를 사용하여 전체 단어 빈도 계산¶
In [256]:
from nltk.probability import FreqDist
In [ ]:
word_count = FreqDist(all_word)
word_count2 = FreqDist(all_word2)
불용어 처리를 하지 않은 데이터의 단어 빈도¶
In [257]:
FreqDist(all_word)
Out[257]:
FreqDist({'맛집': 8108, '고양': 7537, '일산': 7168, '핫': 5942, '여행': 5869, '카페': 5545, '플': 4677, '스타': 3221, '그램': 3059, '개': 2762, ...})
불용어 처리를 하지 않은 데이터의 단어 빈도 그래프 (상위 50개)¶
In [276]:
plt.rcParams['font.family'] = 'AppleGothic'
plt.figure(figsize=(20,10))
FreqDist(word_count).plot(50)
Out[276]:
<AxesSubplot:xlabel='Samples', ylabel='Counts'>
불용어 처리한 데이터의 단어 빈도¶
In [303]:
word_count2
Out[303]:
FreqDist({'맛집': 8108, '여행': 5869, '카페': 5545, '개': 2762, '원흥': 2182, '빵': 2077, '브런치': 1861, '데이트': 1431, '추천': 1420, '필드': 1365, ...})
불용어 처리한 데이터의 단어 빈도 그래프 (상위 100개)¶
In [298]:
plt.rcParams['font.family'] = 'AppleGothic'
plt.figure(figsize=(20,10))
FreqDist(word_count2).plot(100)
Out[298]:
<AxesSubplot:xlabel='Samples', ylabel='Counts'>
워드클라우드로 시각화¶
In [216]:
from wordcloud import WordCloud
In [269]:
fontpath = '/Library/Fonts/NanumGothic.ttf'
wc = WordCloud(
width = 600,
height = 600,
max_words=200,
font_path = fontpath,
background_color='black'
).generate(str(all_word))
plt.figure(figsize=(20, 10))
plt.imshow(wc)
plt.axis('off')
print()
In [299]:
fontpath = '/Library/Fonts/NanumGothic.ttf'
wc = WordCloud(
width = 600,
height = 600,
max_words=200,
font_path = fontpath,
background_color='black'
).generate(str(all_word2))
plt.figure(figsize=(20, 10))
plt.imshow(wc)
plt.axis('off')
print()
In [ ]:
In [ ]:
'DataAnalysisProject' 카테고리의 다른 글
[R] 한국 복지 패널 데이타를 이용한 통계 기반 데이터 분석 (0) | 2021.01.16 |
---|---|
[R] 한국KBO 자료를 통한 안타(H)과 병살타(GDP)의 회귀분석 (0) | 2021.01.16 |
[R] 통계청 2013년 발표 연령, 남녀, 경력별 월급 데이터셋을 이용한 기술적 분석 (0) | 2021.01.16 |