ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <심화 프로젝트> 와인 가격 예측 - 1
    내일배움캠프(데이터 분석 부트캠프 1기)/팀프로젝트 2024. 2. 21. 19:29

    개요

    프로젝트 모델링 과정의 개요는 아래 그림과 같다. 

     

    우선 데이터에 대해 EDA와 전처리를 진행하고 파생변수를 생성했다.

    그리고 전처리된 데이터로 모델링 과정을 진행하였다.

     

    첫 번째로 모델은 결측치를 삭제한 상태에서 모델을 학습하고 성능을 평가했으며

    두 번째 모델은 머신러닝을 통해 결측치를 보간한 뒤 학습하여 성능을 평가했다. 

    세 번째는 두 번째 모델의 결측치 보간 데이터를 사용했으며

    모델을 파생변수를 기준으로  둘로 나누어 각각 모델링하였다. 


    데이터

    사용한 데이터는 Kaggle의 Wine Information이라는 데이터였다.

    데이터는 한국의 웹사이트에서 얻어진 21605개의 와인 데이터이다. 

     

    출처 링크 : https://www.kaggle.com/datasets/dev7halo/wine-information

     

    Wine Information

    Wine Information with nation, varieties, flavor, price, etc

    www.kaggle.com

    데이터 컬럼 구성은 아래와 같다

     

    1) id - 와인 아이디
    2) name - 와인 이름
    3) producer - 와인 생산자(농장)
    4) nation - 와인 생산국가
    5~9) local1~ local4 - 와인 생산지역
    9) ~ 20) varieties1 ~ varieties12 - 와인 품종
    21) type - 와인 타입
    22) use - 와인 용도
    23) abv - 알코올 도수
    24) degree - 음용 온도
    25) sweet - 당도 점수 (1~5점)
    26) acidity - 산도 점수  (1~5점)
    27) body - 바디감 점수  (1~5점)
    28) tannin - 탄닌 점수  (1~5점)
    29) price - 와인 가격(KRW)
    30) year - 와인 생산연도
    31) ml - 와인 용량(ml)


    EDA

    데이터에 대한 EDA (탐색적 데이터분석) 부분이다. 

    위 그래프에서 왼쪽 그래프는 와인 생산국별 와인 갯수(count)이다.

    프랑스와인의 숫자가 가장 많았고 이탈리아, 미국 칠레, 스페인 순으로 와인 데이터가 많았다. 

     

    그리고 오른쪽의 그래프는 와인 생산국별 평균 와인 가격 그래프이다.

    미국이 가장 와인 평균가격이 높았고, 프랑스, 슬로베니아, 헝가리, 우루과이 순으로 평균 가격이 높았다. 


    위 그래프는 와인 생산지역(도시 등)별 와인 갯수(count) 데이터이다.

    와인 생산지역에는 209개의 unique 값이 존재하였으며 가장 와인 갯수가 많은 지역은 프랑스 부르고뉴, 미국 캘리포니아, 프랑스 보르도, 이탈리아 토스카나, 피에몬테 지방인 것으로 나타났다.

     

    데이터의 유니크 값을 보다보니 와인 생산지역 데이터 안에 와인 품종 데이터가 섞여 들어가 있는 데이터가 꽤 있었다. 

    해당하는 부분의 전처리에 대해서는 전처리 파트에서 기술하도록 하겠다. 


     

    다음은 와인의 품종별 와인 갯수(count) 그래프이다. 와인에는 352개의 품종 데이터가 존재했고

    위 그래프와 마찬가지로 거의 그래프에 표시가 잘 되지 않았다. 

     

    가장 와인의 숫자가 많은 품종은 카베르네 소비뇽, 샤르도네, 피노 누아, 메를로, 쉬라즈 순으로 나타났다. 

    주요 품종 이외에는 굉장히 적은 수 밖에 없는 와인 품종이 상당히 많았다.  


     

    위 그래프는 와인의 타입에 따른 와인의 갯수(count)와 와인 타입에 따른 와인 가격의 평균이다. 

    갯수로는 레드와인이 압도적으로 많았고 그 다음으로 화이트와인과 스파클링 와인이 차지했다. 

    그리고 가격은 하드와인이 가장 높았으며 그 다음은 스파클링, 레드와인, 주정강화와인, 화이트와인 순으로 나타났다.

     

    그런데 하드와인이 무엇인지 검색해보아도 나오질 않아서 하드와인의 데이터 특성을 확인해본 결과

    대체로 디저트로 사용되며 상대적으로 높은 알코올 도수를 가지는 달지 않고  옅은 탄닌과 낮은 산미

    높은 바디감을 가진 고가의 와인들인 것으로 나타났다. 


    다음으로 와인의 용도에 대한 그래프이다. 

    테이블 와인(식사와 함께 곁들이는 와인)이 종류가 가장 많았고, ( 에피타이저, 테이블), 디저트 와인이 그 다음으로 나타났다. 데이터가 다중값 속성으로 나타나서 이 부분을 해결할 필요가 있었다.  


     

     

    위 그래프는 와인의 특징에 대한 그래프이다. 각각 점수가 높을수록 해당하는 값이 높다는 것을 의미하며

    당도가 1로 낮은 와인이 가장 종류가 많음을 알 수 있다. 

    산도와 바디감의 경우에는 3,4,5 순으로 많이 나타나 비슷한 경향을 보이는 것을 확인할 수 있다. 

    그리고 떫은 맛을 의미하는 탄닌의 경우에는 1, 3이 가장 많았다. 


     

    위는 생산연도 막대그래프이다. 대부분의 와인이 2000년대 후반에서 2010년대에 분포되어 있는 것을 확인할 수 있다. 

    1967년 와인은 초 장기 숙성 와인인가... 심오한 와인의 세계


     

    수치형 변수인 abv, degree, ml 변수에 대해서 히스토그램으로 시각화 해본 결과 몇몇 극단치들로 인해 

    상당히 Skew가 심한 것을 확인할 수 있었다. 이상치에 대한 정제 부분은 전처리 파트에서 다시 기술하도록 하겠다. 


    위 그래프는 수치형 변수들에 대한 상관계수 히트맵이다.

    sweet, acidity, body, tannin의 경우에는 1~5단계의 점수 값(순서척도)이었는데

    이를 연속형 변수로 간주했을 때 상관관계가 나타나는지를 보고자 했다.

    그리고 year의 경우에도 값이 크거나 작은 것이 가격에 영향을 미치는지 여부도 궁금하여서

    연속형 변수로 간주해 상관계수를 보았다. 

     

    그 결과 body와 tannin이 0.59의 양의 상관관계를 보였고, degree와 tannin이 0.79로 꽤 높은 양의 상관관계를 보였다. 

    상관관계가 높았던 변수에 대해서 전처리를 고민했으나 변수를 합친다거나 하나를 삭제하는 것이 좋은 영향을 미칠 것 같지는 않아서 따로 전처리를 하지는 않았다. 


    전처리

    데이터 분석에 있어서 상당히 중요한 파트이자, 이번 프로젝트를 하면서 가장 공을 많이 들인 부분이다. 

     

    우선 id와 name의 경우에는 와인을 구분할 수 있는 고유한 값으로 분석에 사용되지 않았다. 

    Producer의 경우에는 와인 생산자(와이너리)의 데이터로 4819개의 unique값을 가진다.  이를 묶어나 인코딩 하는 것이 어렵다고 판단되어서 사용하지 않았다. 

     

    다음은 결측치 처리에 대한 부분이다.  

     

    결측치가 적은 칼럼도 있는가하면 데이터의 절반이상이 결측치인 데이터도 꽤 되는 것을 확인할 수 있다. 

    local2~4와 varieties2~12의 경우에는 적에는 1만개 많게는 2만개까지 데이터에 결측치가 존재한다. 

    이는 절반을 넘어서는 값으로 이 경우 데이터를 사용할 수 없다고 판단하여 컬럼을 삭제조치 하였다. 

     

    nation의 경우에는 2개의 결측치가 존재하는데 두 결측 모두 producer가 Aniche Cellars여서 검색해보니 

    미국에 위치한 와이너리라는 사실을 알 수 있어 U.S.A로 대체해주었다. 

     

    그리고 Others값을 가진 nation 데이터가 3개 있었는데 똑같이 3개의 값을 가진 Lebanon값은 잘 있었기 때문에 Others의 경우 일종의 결측값이라고 판단하여 가장 비중이 높은 France(최빈값)으로 대체해주었다. 이는 후술할 Geocoding 때문이기도 했다. (Others는 지리 정보가 아니기 때문에)


    다음은 Local1과 Varieties1인데

     

    먼저 Varieties1의 경우 와인 포도 품종으로 352개의 unique값이 있었다. producer와 마찬가지의 이유로 어떠한 특정 타입으로 묶기가 쉽지 않았고 type의 데이터가 어느정도 이를 묶어주었다고도 생각하여 사용하지 않았다. 

     

    Local1의 경우 위에서 설명했듯이 와인 생산 지역에 대한 데이터인데 이 데이터에 포도의 품종에 대한 데이터가 혼입되어 있었다. 따라서 파생변수를 따로 만들어주는 것을 통해 이를 해결하고자 했다. 그것은 바로 Geocoding이다.

     

    Google Map Platform Geocoding API에 집어넣으면 해당 주소의 위도 경도를 xml이나 json 형태로 받아올 수 있는데 이를 이용해 nation과 local1을 합친 prod_place변수를 위도, 경도값으로 변환해주었다. 그리고 이 과정을 통해서 

    주소로 인식되지 않는 local의 포도 품종 데이터 혼입이 정제되어, 해당 나라의 위도, 경도를 받아 오는 것을 확인하였다.

     

     

    아래는 나라별 위도 경도의 평균 값과  와인 갯수(count) 데이터로 Folium 라이브러리를 사용해 시각화한 그림이다. 

    위도 경도 평균값을 위치로 count 값의 크기에 비례하여 원이 커지도록 하였는데

     

    지도를 보면 상당히 많은 양의 와인이 미국과 유럽에서 생산되고 있음을 확인할 수 있다.  


    use 변수의 경우에는 대부분의 값이 Table 이었기 때문에 결측치를 Table로 대체하였고

    ml의 경우에도 대부분의 데이터가 750ml 이었기 때문에 결측치를 750으로 대체하였다.

     

    나머지 결측치에 대해서는 추후 설명하겠지만 머신러닝을 통해 결측치를 보간하였다. 


    그리고 nation 변수를 이용하여 파생변수를 2개 생성해주었다. 

     

    하나는 nation의 상위 범주인 continent(대륙)으로 국가들을 대륙으로 나누어 변수를 만들어주었다. 

    나머지 하나는 world변수로 이는 도메인 지식을 활용한 것인데,

    오랜 와인의 양조 역사를 가진 유럽과 북아프리카 일부 국가가 생산하는 와인을 Old World(구세계 와인)이라고 부르며

    유럽 이외의 와인 생산에 있어서 후발주자인 나라들이 생산하는 와인을 New World(신세계 와인)이라고 일컽는 다고 한다.

    이러한 지식을 활용해 구세계, 신세계 와인에 대한 world 변수를 생성해주었다.  


    그리고 이상치에 대해서 정제하였다. 

    세 변수를 보면 abv와 ml에서 꽤 많은 이상치가 있는 것을 Boxplot을 통해 확인할 수 있다. 

     

    abv의 경우에는 0인 값은 결측치로 간주하여 삭제하였고 도수가 20도를 넘어가는 와인에 대해서는 증류주로 판단하여

    20으로 대체해주었다. 

     

    degree의 경우에는 음용 적정온도가 50도를 넘어가는 데이터들을 관찰할 수 있는데 이를 섭씨가 아닌 화씨로 간주하여

    변환식을 통해서 섭씨로 바꾸어주었다. 

     

    마지막으로 ml인데 ml는 0인 데이터의 경우 결측치로 간주하였다고 위에서 서술하였고

    그 이외에 적은 용량과 상대적으로 굉장히 큰 용량의 데이터들이 몇 개 존재했다.

    하지만 이는 마트용 대용량 와인이라는 판단 하에 따로 정제해주지는 않았다.  

    출처 : 와인킹 유튜브


    다음은 인코딩 과정이다. 

    머신러닝 모델이 학습할 수 있는 데이터로 변환하기 위해서 범주형 변수를 인코딩해줄 필요가 있었다.

     

    앞서 설명한 sweet, acidity, body, tannin 변수의 경우 1~5의 값을 가지도록 레이블 인코딩 하였으며

    생산연도의 경우 연속형 변수보단 범주형 변수의 성격을 가진다고 판단하여 원 핫 인코딩 해주었다. 

     

    use 변수의 경우에는 다중값 속성을 가진 데이터가 해당 속성을 가지고 있으면 0, 가지고 있지 않으면 1로 

    되도록 원 핫 인코딩을 해주었다. 인코딩의 결과는 아래 표에서 잘 나타난다.

    Appetizer, Table이라는 값을 가지고 있는 경우 user_Appetizer, use_Table에 

    각각 1이 할당되어 있고 나머지는 0이 할당 되어 있는 것을 확인할 수 있다. 

     

    year 변수에 대해서도 범주형 변수로 간주한 뒤 원 핫 인코딩을 진행했다.

    nation과 continent 변수에 대해서는 원 핫 인코딩으로 전처리 하였다. 

    world 변수는 이진 변수 이기 때문에 레이블 인코딩으로 처리하였다. 


    그리고 결측치를 따로 최빈치 대치나 임의의 값을 넣지 않은 데이터들의 경우

    Price 데이터를 제외한 나머지 NaN 값을 가지고 있지 않은 데이터를 이용해

    머신러닝 모델을 학습하여 결측치 부분을 채워넣었다. 

     

    결측치를 보간에는 RandomForest모델을 사용하였다. 

     

     

    [와인 가격 예측 - 2]에서 계속

    https://jinhyunbae.tistory.com/161

     

    <심화 프로젝트> 와인 가격 예측 - 2

    [와인 가격 예측 -1]에서 이어짐 링크 : https://jinhyunbae.tistory.com/159 와인 가격 예측 - 1 개요 프로젝트 모델링 과정의 개요는 아래 그림과 같다. 우선 데이터에 대해 EDA와 전처리를 진행하고 파생변

    jinhyunbae.tistory.com

     

Designed by Tistory.