EDA
- 머신러닝 모델을 활용한 문제를 해결하기 위한 데이터를 이해하는 과정
- 데이터의 여러 패턴과 잠재적인 문제점등을 발견
EDA 의 필요성
- 설계된 모델에 특별한 문제가 없더라도 데이터마다 적합한 모델이 있음
- 모델과 데이터의 최적의 조합을 찾아 좋은 결과를 도출하기 위함
- 데이터에 대한 통찰이 있어야 최적의 모델선정과 튜닝을 통해 결과를 도출할 수 있음
EDA 진행 과정
- 특별히 정해진 틀은 없음
- 데이터에서 최대한 많은 정보를 추출
- 추출할 정보: 데이터에 대한 평균값, 중앙값, 최솟값, 최댓값, 범위, 분포, 이상치 등
EDA 흐름도
EDA 실습
- Naver sentiment movie corpus
1. 데이터 다운로드
2. 라이브러리 로드
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
3. 데이터 크기 확인
path = './data_in/'
for file in os.listdir(path):
if 'txt' in file:
print(file.ljust(30)+str(round(os.path.getsize(path+file)/1000000, 2))+'MB')
4. 판다스로 학습 데이터(ratings_train.txt) 로드 및 내용 확인
# delimiter : 구분자, quoting : 쌍따옴표 무시를 위해 인자 3 설정
train_data = pd.read_csv(path+'ratings_train.txt', header = 0, delimiter = '\t', quoting = 3)
train_data.head()
5. 전체 학습데이터의 개수 확인
print(len(train_data))
6. 학습 데이터의 각 리뷰 길이 확인
train_length = train_data['document'].astype(str).apply(len)
train_length.head()
7. 전체 데이터 길이에 대한 히스토그램 생성
plt.figure(figsize = (12, 5))
plt.hist(train_length, bins = 200, alpha = 0.5, color = 'r', label = 'word')
plt.yscale('log', base = 10)
plt.title('Histogram of length of review', color = 'w')
plt.xlabel('Length of review', color = 'w')
plt.ylabel('Number of review', color = 'w')
히스토그램 분석
- 140자 까지는 비교적 고르게 분포
- 40자 이후부터 길이가 줄어들다가 140자에선 늘어남
8. 리뷰 길이의 최대, 최소, 평균, 표준편차, 중간, 1사분위, 3사분위 값 확인
# 리뷰 길이 최대값
print(np.max(train_length))
# 리뷰 길이 최솟값
print(np.min(train_length))
# 리뷰 길이 평균값
print(np.mean(train_length))
# 리뷰 길이 표준편차
print(np.std(train_length))
# 리뷰 길이 중간값
print(np.median(train_length))
# 리뷰 길이 1사분위 값
print(np.percentile(train_length, 25))
# 리뷰 길이 3사분위 값
print(np.percentile(train_length, 75))
9. 데이터 박스플롯으로 확인
plt.figure(figsize = (12, 5))
plt.boxplot(train_length, labels = ['counts'], showmeans = True)
10. 워드클라우드를 통한 어휘 빈도 분석
# 어휘 빈도 분석을 위해 문자열이 아닌 데이터 모두 제거
train_review = [review for review in train_data['document'] if type(review) is str]
wordcloud = WordCloud(font_path = path + 'NotoSansKR-Medium.otf', width = 800, height = 600).generate(' '.join(train_review))
plt.figure(figsize = (20, 15))
plt.imshow(wordcloud, interpolation = 'bilinear')
plt.axis('off')
11. 데이터의 긍정(1), 부정(0)을 나타내는 라벨값의 비율 확인
fig, axe = plt.subplots(ncols = 1)
fig.set_size_inches(6, 3)
sns.countplot(train_data['label'])
12. 긍부정 라벨값의 실제 수치 확인
# 실제 수치 확인
print("긍정 리뷰 갯수: {}".format(train_data['label'].value_counts()[1]))
print("부정 리뷰 갯수: {}".format(train_data['label'].value_counts()[0]))
13. 각 리뷰의 단어 수 확인
# 각 데이터를 띄어쓰기 기준으로 나누고 갯수를 변수로 지정
train_word_counts = train_data['document'].astype(str).apply(lambda x:len(x.split(' ')))
plt.figure(figsize = (15, 10))
plt.hist(train_word_counts, bins = 50, alpha = 0.5, facecolor = 'r', label = 'train')
plt.title('Histogram of word count in review', fontsize = 15)
plt.yscale('log', base = 10)
plt.legend()
plt.xlabel('Number of words', fontsize = 15)
plt.ylabel('Number of reviews', fontsize = 15)
- 단어는 대부분 5개~10개 사이에 가장 많이 분포, 35개 이후 급격히 줄어듬
14. 각 리뷰 단어 수의 실제 값 확인
# 단어 개수 최대값
print(np.max(train_word_counts))
# 단어 개수 최솟값
print(np.min(train_word_counts))
# 단어 개수 평균값
print(np.mean(train_word_counts))
# 단어 개수 표준편차
print(np.std(train_word_counts))
# 단어 개수 중간값
print(np.median(train_word_counts))
# 단어 개수 1사분위 값
print(np.percentile(train_word_counts, 25))
# 단어 개수 3사분위 값
print(np.percentile(train_word_counts, 75))
15. 데이터에 대한 특수문자 비율 확인
- '?' 와 '.' 이 사용된 리뷰 비율 확인
qmarks = np.mean(train_data['document'].astype(str).apply(lambda x: '?' in x)) # ?
fullstop = np.mean(train_data['document'].astype(str).apply(lambda x: '.' in x)) # .
print("물음표가 있는 리뷰:{:.2f}%".format(qmarks*100))
print("마침표가 있는 리뷰:{:.2f}%".format(fullstop*100))
'AI > 머신러닝&딥러닝' 카테고리의 다른 글
One-hot Encoding (0) | 2022.06.20 |
---|---|
feature (0) | 2022.06.20 |
진짜 나를 위한 딥러닝 #순차 데이터 #순환 신경망 (0) | 2022.02.09 |
진짜 나를 위한 딥러닝 #합성곱 신경망 (0) | 2022.02.07 |
진짜 나를 위한 딥러닝 #신경망 모델 훈련 (0) | 2022.02.04 |