working_helen
[데이터 전처리] EDA 본문
추천시스템 구축 전 키워드의 빈도수와 분포를 확인하기 위한 기초적인 EDA 과정을 진행했다.
1. 키워드별 빈도수 확인
2. 워드 클라우드
1. 키워드별 빈도수 확인
- '키워드'와 '책소개 키워드' 각각에 대하여 등장하는 모든 키워드에 대해 빈도수를 측정한다.
- 가장 빈도수가 높은 키워드는 무엇인지, 빈도수가 현저히 적은 키워드는 무엇인지 확인한다.
- CBF 알고리즘의 경우 데이터 간 키워드 중복 횟수 (키워드의 빈도수 count)가 너무 적은 경우 추천시스템의 성능이 떨어질 수 있다. 따라서 해당 키워드를 제외하거나 상위 키워드로 통합하는 과정이 필요하다.
Counter 클래스
- 리스트나 셋에 등장하는 각 원소의 개수를 셀 때 사용
- 각 원소을 키로, 개수를 value로 하는 dictionary를 출력
- most_common(n) : 상위 n개 요소 출력, default는 전체를 내림차순 출력
from collections import Counter
dictionary = Counter(list 혹은 set)
2. 워드 클라우드 WordCloud
Counter로 구한 키워드별 빈도수 데이터를 워드클라우드로 시각화해본다.
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 워드클라우드(wc) 객체 생성
font = 폰트 파일 저장 경로
wc = WordCloud(font_path=font, background_color=배경색, width=너비, height=높이,
max_font_size = 가장 빈도수가 높은 단어의 폰트 크기, ,,,)
# wc 적용 = 사용할 빈도수 데이터 지정
cloud = wc.generate_from_frequencies(word_count)
# wc 출력
plt.imshow(cloud)
plt.axis("off")
plt.show()
# wc 파일로 저장
wc.to_file('워드클라우드.png')
Jupyter Notebook
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
from ast import literal_eval
베스트셀러 = pd.read_excel(path + "/데이터 전처리/베스트셀러_최종2.xlsx")
best = 베스트셀러.iloc[:, 1:]
best
상품명 | 책소개 | 키워드 | 책소개 키워드 | 책소개 전처리 | 책소개 키워드 수정본 | |
---|---|---|---|---|---|---|
0 | 위기의 역사 | 40만 독자가 선택한 오건영의 글로벌 경제사 특강\n누적 조회 수 550만 회 달성... | ['금리', '모기지', '흥국', '저금리', '글로벌 금융 위기', '실리콘밸리... | {'조회', '선택', '부활', '오건', '금융위기', '달성', '소멸', '... | ['40만 독자가 선택한 오건영의 글로벌 경제사 특강', '누적 조회 수 550만 ... | ['부활', '인플레이션', '금융위기', '책', '경제위기', '소멸', '선택... |
1 | 돈의 속성(300쇄 리커버에디션) | 2020ㆍ2021ㆍ2022ㆍ2023 4년 연속 최장기 베스트셀러\n80만 깨어있는 ... | ['부자되는법', '종잣돈', '회장', '투자 원칙', '경제철학', '주식 시장... | {'연속', '일본', '상황', '선택', '최', '속성', '장기', '추가'... | ['2020 2021 2022 2023 4년 연속 최장기 베스트셀러', '80만 깨... | ['기념', '돈', '속성', '바뀐', '맞춰', '20', '경제', '경영'... |
2 | 부자의 그릇 | 수많은 젊은 부자가 꼽은 최고의 ‘부자학 입문서’ 『부자의 그릇』 양장 개정판\n“... | ['부자되는법', '신용', '소설 형식', '배트', '경제이야기', '사업 아이... | {'채널', '로부터', '울림', '원리', '누구', '최고', '주먹밥', '... | ['수많은 젊은 부자가 꼽은 최고의 부자학 입문서 부자의 그릇 양장 개정판', '당... | ['돈', '부자', '통해', '흥미로운', '의장', '스', '테디', '셀러... |
3 | 사장학개론 | 이 책은 과거와 현재,\n미래의 모든 사장을 위한 실무 지침서다\n이 책은 한국과 ... | ['창업', '매출', '직원', '장학', '기업인', '사업', '경제경영'] | {'의', '저자', '정리', '존재', '운영', '모든', '장학', '구',... | ['이 책은 과거와 현재', '미래의 모든 사장을 위한 실무 지침서다', '이 책은... | ['사장', '대한', '있는', '위', '가장', '되었다', '직원', '따라... |
4 | EBS 다큐프라임 | 우리가 반드시 알아야 할 자본주의의 진실!\n『자본주의』는 자본주의를 쉽게 풀어낸 ... | ['재테크', '경제학', '중앙은행', '케인스', '경제이론', '국부론', '... | {'능력', '반드시', '앞', '필수', '모든', '진실', '세계', '활용... | ['우리가 반드시 알아야 할 자본주의의 진실', '자본주의 는 자본주의를 쉽게 풀어... | ['자본주의', '있는', '그리고', '우리', '금융', '것', '오늘날', ... |
... | ... | ... | ... | ... | ... | ... |
3708 | 독서의 역사 | “독서를 다룬 책 중 가장 빼어난 이야기”\n언어의 파수꾼이자 책의 수호자, 세계 ... | ['독서가', '움베르토 에코', '분서갱유', '지배 세력', '성서', '진시황... | {'인간', '저자', '룸', '뒤', '분석', '자기', '형태', '위협',... | ['독서를 다룬 책 중 가장 빼어난 이야기', '언어의 파수꾼이자 책의 수호자 세계... | ['책', '있다', '저자', '대해', '관련', '된', '책', '독서', ... |
3709 | 표준 | 제4판 표준 중세 국어 문법론에서는 지난 10년 동안에 나온 중세어 관련 문법 업적... | ['품사론', '형태론', '통사론', '표기법', '겹문장', '발음', '인문'] | {'포함', '각주', '심화', '통해', '의미', '문법', '장', '표준'... | ['제4판 표준 중세 국어 문법론에서는 지난 10년 동안에 나온 중세어 관련 문법 ... | ['포함', '문법', '제', '3', '편', '국어', '지난', '다루었다'... |
3710 | 삼국지연의보다 재미있는 정사 삼국지 1 | 20만 구독자가 열광한 화제의 유튜브 역사채널 〈써에이스쇼〉의 삼국지\n누적 조회 ... | ['판타지', '황건적', '유비', '컬러 삽화', '위촉', '실제 역사', '... | {'채널', '역사', '의', '저자', '돌파', '층', '총', '결의', ... | ['20만 구독자가 열광한 화제의 유튜브 역사채널 써에이스쇼 의 삼국지', '누적 ... | ['삼국지', '정사', '역사', '시작', '장의', '마니아', '층', '있... |
3711 | 나도 손글씨 바르게 쓰면 소원이 없겠네(핸디 워크북) | 아무때나 시간 날 때 틈틈이\n지하철ㆍ학교ㆍ회사ㆍ카페ㆍ집 어느 장소에서도\n편하게 ... | ['악필', '교정', '원고지', '정자체', '스프링', '지하철', '인문'] | {'크기', '노트', '글씨', '스프링', '문장', '원고지', '가득', '... | ['아무때나 시간 날 때 틈틈이', '지하철 학교 회사 카페 집 어느 장소에서도',... | ['물론', '연습', '4', '주', '동안', '나도', '꾸준히', '종이'... |
3712 | 성격의 탄생 | 내 성격은 어떻게 만들어진 걸까?\n왜 사람마다 성격이 다를까?\n성격을 바꿀 수 ... | ['과학', '외향성', '유전학', '친화성', '규명', '개인차', '인문'] | {'인간', '저자', '존재', '사랑', '서로', '성실', '종합', '가치... | ['내 성격은 어떻게 만들어진 걸까', '왜 사람마다 성격이 다를까', '성격을 바... | ['성격', '사람', '저자', '어떻게', '무엇', '일까', '뇌', '과학... |
3713 rows × 6 columns
데이터 기본 정보 확인¶
best.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3713 entries, 0 to 3712
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 상품명 3713 non-null object
1 책소개 3713 non-null object
2 키워드 3713 non-null object
3 책소개 키워드 3713 non-null object
4 책소개 전처리 3713 non-null object
5 책소개 키워드 수정본 3713 non-null object
dtypes: object(6)
memory usage: 174.2+ KB
best.isnull().sum()
상품명 0
책소개 0
키워드 0
책소개 키워드 0
책소개 전처리 0
책소개 키워드 수정본 0
dtype: int64
best.duplicated().sum()
0
단어 빈도수 시각화¶
best['키워드'] = best['키워드'].apply(lambda x: literal_eval(x))
best['책소개 키워드 수정본'] = best['책소개 키워드 수정본'].apply(lambda x: literal_eval(x))
for col in best.columns:
print(type(best.loc[0, col]))
<class 'str'>
<class 'str'>
<class 'list'>
<class 'str'>
<class 'str'>
<class 'list'>
literal_eval
- csv, excel 등 데이터 테이블을 외부에서 불러올 때, 특정 열이 list, tuple, set, dictionary 형태이지만 string type으로 인식되어 불러져오는 경우가 발생
- literal_eval : string로 인식되었던 것을 원래의 data type으로 인식되도록 변환
from ast import literal_eval
list로 변환 = literal_eval(list지만 문자열로 인식되는 경우)
set으로 변환 = literal_eval(set이지만 문자열로 인식되는 경우)
'키워드' 빈도수¶
키워드별 빈도수 확인¶
가장 많이 나온 키워드는 무엇인지 + 너무 적게 나온 키워드는 무엇인지 확인
word : 등장하는 모든 키워드 집합 list
word_count : 각 키워드별 빈도수 count를 구한 dictionary
word=list()
for i in range(len(best['키워드'])):
keyword_list = best.loc[i, '키워드']
word += keyword_list
word[:10]
['금리', '모기지', '흥국', '저금리', '글로벌 금융 위기', '실리콘밸리', '경제경영', '부자되는법', '종잣돈', '회장']
#빈도수
from collections import Counter
word_count = Counter(word)
for key in word[:10]:
print(f"{key} : {word_count[key]}")
금리 : 43
모기지 : 3
흥국 : 2
저금리 : 10
글로벌 금융 위기 : 7
실리콘밸리 : 24
경제경영 : 937
부자되는법 : 22
종잣돈 : 15
회장 : 3
#빈도수 상위 30
max = 30
pos_top_30 = {}
for word, counts in word_count.most_common(max):
pos_top_30[word] = counts
print(f'{word} : {counts}')
소설 : 1039
경제경영 : 937
자기계발 : 929
인문 : 925
세계고전문학 : 154
주식투자 : 153
투자자 : 151
내면 : 147
사랑 : 108
재테크 : 82
자기관리 : 81
창업 : 75
영화원작소설 : 69
주식 시장 : 68
한국소설 : 67
인생 : 66
인간관계 : 65
수익 : 61
판타지소설 : 61
성장소설 : 60
성공 : 55
미스터리 : 51
부자 : 50
감정 : 48
일본소설 : 48
영미소설 : 48
개인 투자자 : 46
인공지능 : 46
거래량 : 45
습관 : 45
워드클라우드 시각화¶
from wordcloud import WordCloud
import matplotlib.pyplot as plt
font_path = "C:/Windows/Fonts/H2GTRM"
wc = WordCloud(font_path=font_path, background_color='ivory', width=1000, height=800)
cloud = wc.generate_from_frequencies(word_count)
plt.figure(figsize=(8,8))
plt.imshow(cloud)
plt.axis('off')
plt.show()
sparse_word : 키워드 빈도수가 1인 경우
density_word : 키워드 빈도수가 2 이상인 경우
sparse_word=list()
for word in word_count.keys():
if word_count[word]<2:
sparse_word.append(word)
density_word = list(set(word_count.keys()) - set(sparse_word))
print(len(sparse_word), len(density_word), len(word_count))
7133 3332 10465
print(density_word[:50])
['규제', '이코노미', '현장', '라이프스타일', '창업자', '유다', '퇴사', '순수', '범죄 소설', '카페', '주요 기업', '산분', '시점', '일평생', '작가 후기', '메인', '골든', '향후', '부동산 가격', '렌즈', '움베르토 에코', '수치심', '헌문', '팔로우', '엔지니어링', '회고록', '고대 신화', '군주국', '사회', '사고방식', '집 마련', '세액 공제', '합격', '대참사', '암호', '부동산투자', '금융 상식', '조삼모사', '디지털노마드', '코노 미스트', '주치의', '퀴어', '치매', '소년법', '건축가', '저술', '내지', '기독교 신학', '토벌', '유일무이']
print(sparse_word[:50])
['경제철학', '소설 형식', '배트', '장학', '복지 정책', '출간 당시', '망상', '정비례', '기본 법칙', '전기차', '투자분석', '노예', '헤지', '시대 흐름', '사다리', '판매', '암흑기', '지정학', '경쟁', '실리콘', '논픽션', '다트', '서비스업', '살림살이', '무역', '사마리아', '특강', '놀라움', '열광', '전전긍긍', '세계사', '재계', '중국집', '식자', '기존', '동의어', '배상', '검소', '조사', '절약', '애덤 스미스', '문경', '기본 원칙', '수입원', '촌철살인', '이윤', '기후변화', '장기기증', '소비자행동', '매니지먼트']
word_2=list()
for i in range(len(best['책소개 키워드 수정본'])):
keyword_list = best.loc[i, '책소개 키워드 수정본']
word_2 += keyword_list
word_2[:10]
['부활', '인플레이션', '금융위기', '책', '경제위기', '소멸', '선택', '생', '성과', '오건']
#빈도수
word_count_2 = Counter(word_2)
for key in word_2[:10]:
print(f"{key} : {word_count_2[key]}")
부활 : 4
인플레이션 : 6
금융위기 : 5
책 : 611
경제위기 : 1
소멸 : 4
선택 : 72
생 : 55
성과 : 86
오건 : 4
#빈도수 상위 30
max = 30
pos_top_30_2 = {}
for word, counts in word_count_2.most_common(max):
pos_top_30_2[word] = counts
print(f'{word} : {counts}')
것 : 1311
하는 : 1066
있다 : 997
있는 : 757
저자 : 663
한다 : 644
사람 : 617
책 : 611
삶 : 596
우리 : 578
그 : 570
대한 : 525
통해 : 522
세계 : 516
자신 : 490
가장 : 478
위 : 465
어떻게 : 437
간 : 402
위해 : 402
된 : 401
작가 : 399
이야기 : 388
방법 : 382
말 : 377
독자 : 369
출 : 359
인생 : 341
소설 : 335
투자 : 331
워드클라우드 시각화¶
font_path = "C:/Windows/Fonts/H2GTRM"
wc_2 = WordCloud(font_path=font_path, background_color='ivory', width=1000, height=800)
cloud_2 = wc.generate_from_frequencies(word_count_2)
plt.figure(figsize=(8,8))
plt.imshow(cloud_2)
plt.axis('off')
plt.show()
sparse_word_2 : 키워드 빈도수가 1인 경우
density_word_2 : 키워드 빈도수가 2 이상인 경우
sparse_word_2=list()
for word in word_count_2.keys():
if word_count_2[word]<2:
sparse_word_2.append(word)
density_word_2 = list(set(word_count_2.keys()) - set(sparse_word_2))
print(len(sparse_word_2), len(density_word_2), len(word_count_2))
9700 9032 18732
print(density_word_2[:50])
['출신', '가까운', '5000만', '들려준다', '오직', '짧은', '마찬가지', '지금껏', '달라', '1분', '향후', '부활', '규칙', '재탄생', '수치심', '감각', '빵', '우위', '대상', '시대', '경주', '사고방식', '니콜라스', '110', '더운', '호손', '헤지', '먹잇감', '1999년', '않았는데', '션', '오디오', '물리', '무인도', '양국', '인정받은', '귀족', '값', '잠재', '출발', '인생', '완전', '회수', '카버', '문고판', '정화', '과정', '마침내', '점수', 'Life']
print(sparse_word_2[:50])
['경제위기', '깨어있는', '사랑받으며', '이율', '반란', '빠뜨리는', '자유롭지', 'MIG', 'LadyBoss', 'Warrior', '세우기에', '버냉키', '깨뜨리는', '누리는', '멀찌감치', '자칭', '벗어나도록', '환주', '벗어나기로', '부럽지', '안유', '시경', '가졌다', '라이브', '기계로', '방문자', '구식', '뿅', '담아내지', '있듯이', '스며들어', '실리콘', '칩', '향배', '빼놓고', 'BW', 'EB', '추징', '짚고', '바뀌며', '영양가', '마늘', '끝났고', '살림살이', '민영화', '반지하', '부쩍', '느꼈고', '박태웅', '쓰나미']
'deep daiv. > 추천시스템 toy project' 카테고리의 다른 글
[모델링] 인코딩 기반 추천 시스템 (0) | 2023.08.10 |
---|---|
[모델링] CountVectorizer/ TfidfVectorizer / 한글 형태소 분석기 KoNLPy (0) | 2023.08.10 |
[데이터 수집] 데이터 수집 Workflow (0) | 2023.08.07 |