와인 품질 예측 대회

Netflix의 contest 이후에 이쪽 competition에 대해서 까마득하게 잊고 있다가 최근 kaggle의 don’t overfit 문제를 풀어보게 되면서 다시 데이터 마이닝 혹은 데이터 분석 대회에 관심을 가지기 시작했다. don’t overfit문제는 뭐 거의 순위라고 말할 수 없는 순위에 있었지만 사실 테스트 용도로 한번 올려본 것이 전부인 대회였다. 학습 모델을 발전시킬 metric에 대한 계획도 없이 진행한 거라서 내놓기도 뭐한 그런 결과였지만 데이터의 특징에 맞게 알고리즘을 선정하는 고민을 해봤던 참 중요한 시간들이였던거 같다. 여기서 적용해본 PCA 방법이라든지 하는 feature 축소 알고리즘들은 잊지 못할거 같다.

 

이후 관심을 가졌던 대회는 CrowdAnalytix 에서 주최한 Cheers! Predicting Wine Quality다. 사실 슈퍼 크런처 라는 책에서 와인의 품질을 예측하는 알고리즘 이야기가 나오는데, 아마도 그 덕분에 이 대회에 더 관심을 가지게 되었는지 모르겠다. 대회는 12개의 화학적 측정 결과 데이터를 기반으로 와인의 품질을 0~10사이의 등급으로 분류하는 예측 알고리즘을 만들어 내는 것이다. 화학적 특징들이 등급에 관련이 있는지 없는지는 데이터를 보고 결정을 해야 되는 문제며 등급 자체는 화학적 특징이 아닌 전문가들이 감별한 품질 등급으로 알고 있다. 따라서 화학적 특징과 실제 등급과의 관련성을 구분해 내는게 이 대회의 목적이 아닐까 생각해본다.

일단 모든 quality와의 모든 pair에 대해서 scatter plot를 해보면 변수들의 관련성을 볼 수 있는데, 그중에 가장 관련성이 있을 만한것은 alcohol이라고 볼 수 있다(대강 눈으로 감별해도 되고, corrlation값이나 여타 두 변수의 경향성을 파악하는 알고리즘을 사용해보면 알 수 있다). x축은 등급, y축은 알코올…

 

alchol

 

학습셋에 제공된 3~9등급에 대한 alcohol의 박스 플롯은 위와 같은데, 등급에 따라서 alchol의 중앙값이 확연하다는 것을 알 수 있다.  그러나 이 속성 이외의 속성들은 품질 등급과 관련성을 눈으로 찾기가 힘들었다. 따라서 이 모델은 입력변수들과 출력변수간에 선형적이라 보기 힘든 경우가 될 수 있을 거라 예상할 수 있다. 그래도 모르니 일단 선형 회귀분석을  해보자.

 

> mdl <- lm(as.numeric(quality) ~ . - WineID, data=trainset)
> summary(mdl)
 
Call:
lm(formula = as.numeric(quality) ~ . - WineID, data = trainset)
 
Residuals:
    Min      1Q  Median      3Q     Max
-3.6696 -0.4715 -0.0451  0.4509  3.0115 
 
Coefficients:
                       Estimate Std. Error t value Pr(>|t|)
(Intercept)           9.060e+01  1.641e+01   5.520 3.57e-08 ***
typewhite            -3.656e-01  6.695e-02  -5.461 4.98e-08 *** <- 요건 빼는게 나았을 껀데..
fixed.acidity         8.179e-02  1.848e-02   4.427 9.78e-06 ***
volatile.acidity     -1.563e+00  9.814e-02 -15.930  < 2e-16 ***
citric.acid          -6.724e-02  9.422e-02  -0.714 0.475499
residual.sugar        5.836e-02  6.977e-03   8.365  < 2e-16 ***
chlorides            -6.116e-01  4.120e-01  -1.484 0.137754
free.sulfur.dioxide   4.529e-03  9.015e-04   5.024 5.24e-07 ***
total.sulfur.dioxide -1.397e-03  3.843e-04  -3.636 0.000280 ***
density              -9.161e+01  1.665e+01  -5.502 3.97e-08 ***
pH                    4.666e-01  1.075e-01   4.339 1.46e-05 ***
sulphates             6.918e-01  9.145e-02   7.566 4.65e-14 ***
alcohol               2.335e-01  2.103e-02  11.103  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
 
Residual standard error: 0.7291 on 4534 degrees of freedom
Multiple R-squared: 0.2941,     Adjusted R-squared: 0.2922
F-statistic: 157.4 on 12 and 4534 DF,  p-value: < 2.2e-16

 

회귀식의 설명력은 0.2922정도로 눈뜨고 못봐줄 지경이다. 그러나 앞서 생각했던 것처럼 alcohol의 p-value가 가장 작은 값을 가지고 있으며 이 변수가 품질 등급을 설명하는 능력이 가장 크다는 것을 알 수 있다. 중요한 feature를 뽑기 위해 backward elimination을 수행해봐도 그렇게 설명력은 높아지지 않는다. 사실 선형SVM으로 1차 submission을 해본 결과 결과가 별로 좋지 못해서 leaderboard에도 올라가지 못했다.

비선형 모델을 만들 수 있는 tree계열의 알고리즘 중에서 randomForest를 사용해보도록 하자. 만들어진 모델을 가지고 feaure importance를 뽑아보니 아래와 같다. Gini지수가 크게 감소한다는것은 그 특징에 정보량이 많다는 것을 의미함으로 alcohol이 가장 중요한 fearture라고 볼 수 있다. 반면에 type은 정말 빼도 좋을 정도로 정보량이 빈약하다는 것을 알 수 있다. 따라서 와인의 등급은 white와인인지 red와인인지 그닥 결과에 영향을 미치지 않는 것으로 보인다.

 

rf

몇년전 읽었던 슈퍼크런처 책에서는 와인의 등급을 결정짓는 것은 포도의 품질이고 포도의 품질에 영향을 끼치는것 해당 생산 년도의 강수량 일조량 같은 포도의 당도에 영향을 많이 끼치는 것이라고 했다. 당이 변해서 residual.sugar나 alcohol을 만든하고 했을때 중요 feature로 올라가는 것은 어찌보면 당연한듯 하다.

이걸 보고 본질적인 생각을 해보자면 과연 이 등급을 매긴 사람들이 실제 와인 자체를 가지고 blind 테스트를 했느냐인데, 몇몇 등급 산정 방법을 보자면 등급은 와인의 생산 방법에 대한 인증 정도의 개념이 현재로서는 크다는 것을 알았다. 그리고 등급은 제품군에 대한 등급이지 개별 한병 한병에 대한 등급은 아니고 같은 등급이더라도 성분과 맛의 차이가 없으리라는 보장은 없다고 생각한다.  하지만 와인을 가지고 감별을 할 수 있는 소믈리에가 있다는 사실은 와인의 등급이 어느정도 신빙성이 있다는 반증이 아닐까도 한다.

많은 사람들은 와인을 구입하기 전에 라벨을 읽어 본다. 라벨에 있는 정보는 “양조장명”, “포도원산지”, “브렌드”, “와인등급”, “용량”, “알코올 도수” 정도이다. 이것들을 중요한 정보라고 하기에 기재를 한것일텐데, 이중에서 우리가 가지고 있는 변수는 알코올 도수 정도이며, 역시나 등급과 상관성이 크다는 것을 이것으로 예상해 볼 수 있다. 그리고 화이트 와인이 일반적으로 레드와인보다 설탕 성분이 많은데, 역시 관련 도표를 그려보면 레드와인과 화이트 와인이 설탕 성분이 차이가 확연한 것을 볼 수 있다. (두 변수가 겹치는 정보를 가지고 있다면 하나는 제외하는게 낫다.)

이로서 type 정보는 정보량이 없다고 판단하고 삭제할 수 있을 것이다.

이 문제에서 본인이 정말 궁금한것은 등급이 어떤 과정을 통해 이뤄졌냐는 것이다.  라벨 정도의 데이터가 오픈된 상태에서 등급이 매겨졌을 확률이 많고, 따라서 브랜드나 명성이 맛보다 더 등급을 매기는데 더 많이 쓰였다면 이 데이터만으로 정확한 와인 등급을 예측하기는 힘들것이라 생각해본다. 사람에게는 선입견이라는게 있기 때문이다.

사람들이 브랜드를 보고 와인을 주로 선택한다면 기계로 분류한 등급보다는 사람이 분류한 등급이 아마도 더 효과가 크지 않을까 생각해본다. 하지만 저렴하고 지명도가 낮지만 성분상으로 상위 브랜드 와인과 별반 다를게 없는 와인이 있다면 나조차도 저렴한 와인 맛이 궁금하지 않을까 한다. 게다가 비싼 와인과의 맛 비교도 해볼만 하지 않을까도 말이다.  내가 와인 판매상이라면 와인 성분을 모조리 분석해 가장 비슷한 와인군에 대한 정보를 가지고 사람들에게 추천하면 참 좋을거 같다는 생각을 해본다. 저렴하지만 비싼 와인과 화학적인 구성성분 혹은 맛이 상당히 비슷한 와인을 찾는 사람이 분명히 있을것이기 때문이다.

여튼 두번째 submission 결과 아래와 같이  top 4 순위권에 들었다(현재 참여자는 약 90명).

이 대회 말고 마케팅 e-mail을 열어볼 것인지 그리고 링크를 클릭할 것인지 예측하는 대회도 있는데, R에서 1G정도 데이터 로딩이 실패하는 관계로 관련 Big Data기술들을 알아 보고 있는 중이다.

CC BY-NC 4.0 와인 품질 예측 대회 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.