OkBublewrap

Wine_EDA 본문

Python/프로젝트

Wine_EDA

옥뽁뽁 2023. 2. 22. 16:39
# Package
import numpy as np
import pandas as pd

import warnings
warnings.filterwarnings('ignore')

# Visulization
import matplotlib.pyplot as plt
import seaborn as sns

# Data Set
from sklearn.datasets import load_wine
wine = load_wine()
wine_df = pd.DataFrame(data = wine.data, columns = wine.feature_names)
wine_df_y = wine.target
wine_df['target'] = winde_df_y

Columns 

  • 알콜(Alcohol)
  • 말산(Malic acid)
  • 회분(Ash)
  • 회분의 알칼리도(Alcalinity of ash)
  • 마그네슘(Magnesium)
  • 총 폴리페놀(Total phenols)
  • 플라보노이드 폴리페놀(Flavanoids)
  • 비 플라보노이드 폴리페놀(Nonflavanoid phenols)
  • 프로안토시아닌(Proanthocyanins)
  • 색상의 강도(Color intensity)
  • 색상(Hue)
  • 희석 와인의 OD280/OD315 비율 (OD280/OD315 of diluted wines)
  • 프롤린(Proline)

결측치 유무확인

import missingno as miss
miss.matrix(wine_df);

결측치는 없어 보인다.

 

Target

np.unique(wine_df_y, 
          return_counts=True)

[out]

(array([0, 1, 2), array([59, 71, 48]))

Target 값은 0,1,2로 이루어진 범주형으로 갯수는 동일 하지 않았다.

 

 

# Descirbe
winde_df.describe()

변수 종류가 다 연속형으로 되어 있는 것으로 보인다.

# Boxplot 시각화
plt.figure(figsize=(15, 15))

for idx, col in enumerate(list(wine_df)):
    plt.subplot(4, 4, idx+1)
    sns.boxplot(wine_df[col], color = 'g')

alchole : 11 ~ 15

mailc_acid : 0 ~ 6

ash : 1 ~ 3

alcalinity_of_ash : 10 ~ 30

magnesusum : 60 ~ 170

total_phenols : 1 ~ 4

flavanolds : 0 ~ 5

nonflavanoid_phenols : 0 ~ 0.7

proanthocyanins : 0 ~ 4

color_intensity : 2 ~ 13

hue : 0.5 ~ 1.75

od280/od315_of_duluted_wines : 1 ~ 4

proline : 300 ~ 1700

target : 0, 1, 2

분포가 이렇게 이루어진 것으로 볼 수 가 있다. 박스 플롯을 보면 이상치가 존재하는데

malic_acid, ash, alcalinity_of_ash, magnesium, proanthoyanins, color_intensity, hue에 개별적으로 보기로 하자

 

말산은 포도주의 시큼한 맛에 기여를 한다. 

wine_df['malic_acid'].sort_values(ascending = False).head(3)
# 123    5.80
# 173    5.65
# 137    5.51
# Name: malic_acid, dtype: float64

인덱스로 출력을 해보면 target 값은 1, 2, 2로 나온다 품질이 높게 나온 것을 볼 수 있다. 

상관계수를 확인해보자

<상관계수>

plt.figure(figsize=(18,8))
corr= wine_df.corr()
sns.heatmap(corr, annot=True, square=False, vmin=-.6, vmax=1.0);

상관계수는 0.44으로 약간의 양의 상관관계를 가지는 것을 확인 할 수 있다. target에 유의미한 상관계수는 0.52인 alcalinity_of_ash, -0.85 favanoids, 0.49 noflavanoid_phenols. -0.5 proanthocyanins -0.62 hue, -0.79 wines, -0.63 proline이라고 볼수 있다. 음에 상관관계인 flavanoids는 플라보노이드 폴리페놀(Flavanoids)이다. 이게 무엇인지 찾아봤는데 화학적 물질이라고 한다. 맛에 관련된 화학성분으로 보인다. 

 

<PairPlot>

전체적인 분포도를 보기 위해서 목표별로 시각화를 진행

sns.pairplot(wine_df, hue = 'target', palette = 'deep' )​

분포를 봤을때 고루게 잘 나눠진것을 보면 alchole , flavanolds, proline 정도가 보인다. 변수의 양이 너무 많아서 보기가 힘드므로 변수를 추출할 필요성이 있어 보인다.

<의사결정나무>

# 패키지
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
from sklearn.tree import plot_tree
from IPython.display import Image
import pydotplus

# 데이터 나누기
X = wine_df.drop('target', axis = 1)
y = wine_df['target']

# 시각화
dt_clf = DecisionTreeClassifier(random_state= 2023).fit(X,y)

dot_data = export_graphviz(dt_clf, out_file=None, feature_names=X.columns,
                          class_names= str(y.unique()), filled=True, rounded=True, special_characters=True)

graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())

# 변수중요도
clf_importance = pd.Series(dt_clf.feature_importances_, index = wine["feature_names"]).sort_values()
clf_importance.plot(kind = "barh", title = "tree feature importance")
plt.show()

변수 중요도는 proline, od280/od315_odf_diluted_wines, flavanoids, hue, color_intensity, alcohol, malic_acid가 중요 변수로 나왔다. 이 변수들만 가지고 모델링을 진행을 해보기로 했다. 추출된 변수의 분포확인

# data seting
X = X[['proline', 'od280/od315_of_diluted_wines', 'flavanoids', 'hue', 'color_intensity', 'alcohol', 'malic_acid']]
dt_new = X
dt_new['target'] = y

sns.pairplot(dt_new, hue = 'target', palette = 'deep')

 

'Python > 프로젝트' 카테고리의 다른 글

실전 데이터 분석 프로젝트(3)  (0) 2023.03.24
실전 데이터 분석 프로젝트(2)  (0) 2023.03.22
실전 데이터 분석 프로젝트(1)  (0) 2023.03.21
wine_modeling(1)  (0) 2023.03.05
Human Activity Recognition  (1) 2022.10.06