Search

EDA - 시각화 탐색

데이콘 - 와인 품질 분류 경진대회

와인 품질별로 몇개의 데이터가 있는지 확인하고자 한다.
# 파이썬 warning 무시 import warnings warnings.simplefilter(action='ignore', category=FutureWarning) # 시각화를 위한 라이브러리 import matplotlib.pyplot as plt import matplotlib.font_manager as fm # 한글 폰트를 사용하기 위한 코드 fe = fm.FontEntry(fname = 'NotoSansKR-Regular.otf', name = 'NotoSansKR') fm.fontManager.ttflist.insert(0, fe) plt.rc('font', family='NotoSansKR')
Python
복사
train['quality'].value_counts().sort_index()
Python
복사
3 26 4 186 5 1788 6 2416 7 924 8 152 9 5 Name: quality, dtype: int64
< 막대 그래프 시각화 >
x = train['quality'].value_counts().sort_index().index y = train['quality'].value_counts().sort_index().values plt.figure(figsize=(4,3), dpi=150) plt.title('와인 품질 분포') plt.xlabel('와인 품질') plt.ylabel('갯수') plt.bar(x,y) plt.show()
Python
복사
등급(quality)에 따른 다른 피처들의 통계량 시각화
def make_plots(text:str): plt.title(text + ' vs quality') x = train.groupby('quality').mean().reset_index()['quality'] y = train.groupby('quality').mean().reset_index()[text] plt.bar(x,y) plt.show() for col in train.groupby('quality').mean().reset_index().columns[2:-3]: # 2번째 컬럼 ~ 마지막에서 3번째 컬럼까지의 변수와 quality변수간의 막대그래프 make_plots(col)
Python
복사
변수간의 상관관계 - 상관행렬
import seaborn as sns features = ['fixed acidity', 'volatile acidity', 'citric acid', 'residual sugar', 'chlorides', 'free sulfur dioxide', 'total sulfur dioxide', 'density', 'pH', 'sulphates', 'alcohol', 'type'] plt.figure(figsize=(10,5)) ax = sns.heatmap(train[list(features) + ['quality']].corr(), annot=True) plt.show()
Python
복사
와인의 품질(quality)는 포도의 품종(type)에 영향을 받을까?
white = train[train['type'] == 'white'] red = train[train['type'] == 'red'] print('화이트 와인 데이터 개수 : ', white.shape[0]) print('레드와인 와인 데이터 개수 : ', red.shape[0])
Python
복사
화이트 와인 데이터 개수 : 4159 레드와인 와인 데이터 개수 : 1338
< 포도 품종별 품질 분포 시각화 - seaborn countplot
plt.style.use("ggplot") sns.countplot(data=train, x='type', hue='quality') plt.title("와인 type에 따른 품질등급별 데이터 개수") plt.show()
Python
복사
< 두 품종의 데이터 스케일 자체가 다르므로 따로 그래프를 그려보기 >
plt.style.use("ggplot") plt.figure(figsize=(6,4)) plt.suptitle("white / red", fontsize=20) ## white plt.subplot(1,2,1) sns.barplot(x = white['quality'].value_counts().index, y = white['quality'].value_counts()) ## red plt.subplot(1,2,2) sns.barplot(x = red['quality'].value_counts().index, y = red['quality'].value_counts()) plt.show()
Python
복사

모델 검증(실제값 VS 예측값) 시각화

import numpy as np ##### 모델 검증 시각화 ##### def make_plot(y_true, pred): acc = ACC(y_true, pred) df_validation = pd.DataFrame({'y_true':y_true, 'y_pred':pred}) # 검증 데이터 정답지('y_true') 빈도수 (sorted) df_validation_count = pd.DataFrame(df_validation['y_true'].value_counts().sort_index()) # 검증 데이터 예측치('y_pred') 빈도수 (sorted) df_pred_count = pd.DataFrame(df_validation['y_pred'].value_counts().sort_index()) # pd.concat - 검증 데이타 정답지, 예측치 빈도수 합치기 df_val_pred_count = pd.concat([df_validation_count,df_pred_count], axis=1).fillna(0) ############################################################ # 그래프 그리기 ############################################################ x = df_validation_count.index y_true_count = df_val_pred_count['y_true'] y_pred_count = df_val_pred_count['y_pred'] width = 0.35 plt.figure(figsize=(5,3),dpi=150) plt.title('ACC : ' + str(acc)[:6]) plt.xlabel('quality') plt.ylabel('count') p1 = plt.bar([idx-width/2 for idx in x], y_true_count, width, label='real') p2 = plt.bar([idx+width/2 for idx in x], y_pred_count, width, label='pred') plt.legend() plt.show() make_plot(y_valid, predict)
Python
복사