데이터사이언스/추천시스템

맥주 추천시스템 구현 - 3. 탐색적데이터분석

ghtis1798 2021. 3. 8. 10:02

탐색적데이터분석

탐색적데이터분석

수집한 맥주 리뷰 데이터를 관찰하며 다각도로 시각화해보았습니다.

우선 필요한 라이브러리들을 import합니다.

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import plotly.figure_factory as ff

pd.set_option('display.max_rows', 100)

beer = pd.read_csv('전처리후데이터.csv', encoding='utf-8', index_col=0)

beer.head(3)

살펴 볼 데이터의 개략적인 정보들입니다.

beer.info()

다음은 맥주 평점에 대한 히스토그램입니다.

label = ['distplot']
hist_data = [beer.평점]

fig = ff.create_distplot(hist_data, label, bin_size=[.1])
fig.show()

5가지 평가 요소인 Aroma, Appearance, Flavor, Mouthfeel, Overall에 대한 Boxplot도 그려보았습니다.

fig = go.Figure()

fig.add_trace(go.Box(y=beer.Aroma, name="Aroma"))
fig.add_trace(go.Box(y=beer.Appearance, name="Appearance"))
fig.add_trace(go.Box(y=beer.Flavor, name="Flavor"))
fig.add_trace(go.Box(y=beer.Mouthfeel, name="Mouthfeel"))
fig.add_trace(go.Box(y=beer.Overall, name="Overall"))

fig.show()

📊연도별, 월별 평점 그래프

맥주 평점이 연도별로 어떻게 변화하는지 궁금했습니다.

과거부터 🥃인기있는 맥주가 있다면 최근에 유명해진 맥주도 있을 거라고 생각했습니다.

🔧년, 월 분리

우선 날짜로부터 '월'과 '년'을 분리해야 합니다.

콤마(,)를 기준으로 분리하겠습니다.

tmp = beer.copy()
tmp['월'] = tmp['날짜'].apply(lambda x : x.split(',')[0])
tmp['년'] = tmp['날짜'].apply(lambda x : x.split(',')[1])

tmp.head(3)

잘 분리 된 것을 확인할 수 있습니다.

맥주별 리뷰수도 확인해 보았습니다.

ttmp = tmp.copy()

# 맥주별 리뷰수
ttmp['맥주'].value_counts().head(10)

유명한 기네스와 호가든, 필스너 등의 맥주들이 리뷰가 많은 편입니다.

연도별 평점 추이를 알기 위해서 평점도 계산했습니다.

# 년도별 평점 계산
df_year = ttmp['평점'].groupby(ttmp['년']).mean()
df_year = pd.DataFrame(data=df_year, columns = ['평점'])
# 인덱스를 컬럼으로 변환하기
df_year['년'] = df_year.index
df_year

📈연도별 평점 변화 그래프

# 년도별 평점변화
fig = go.Figure(data=go.Scatter(x=df_year['년'],y=df_year['평점']))

fig.update_layout(title='년도별 평점 변화량 그래프',
                   xaxis_title='년도',
                   yaxis_title='평점')

fig.show()

📉월별 평점 변화 그래프

이번엔 월별 평점 추이를 나타내보았습니다.

우선 월별 평점을 계산했습니다.

df_month = ttmp['평점'].groupby(ttmp['월']).mean()
df_month = pd.DataFrame(data=df_month, columns=['평점'])
df_month

그리고 현재 인덱스 부분에 월 정보가 들어 있습니다.

이것도 분리하겠습니다.

# 인덱스를 삭제함과 동시에 컬럼에 추가
df_month.reset_index(inplace=True)
df_month

그런데 여기서 바로 시각화를 하게되면, ABC 알파벳 순으로 X축이 꼬입니다.

따라서 월별 문자열을 숫자로 바꾸고 정렬한 뒤 그래프로 나타내겠습니다.

month = {'April':4,
 'August':8,
 'December':12,
 'February':2,
 'January':1,
 'July':7,
 'June':6,
 'March':3,
 'May':5,
 'November':11,
 'October':10,
 'September':9}

 df_month['월'] = df_month['월'].apply(lambda x : month[x])
 df_month

숫자로 잘 변환된 데이터를 월을 기준으로 정렬 후 시각화했습니다.

df_month.sort_values(by='월', inplace=True)

# 월별 평점변화
fig = px.line(df_month, x="월", y="평점")

fig.update_layout(title='월별 평점 변화량 그래프',
                   xaxis_title='월',
                   yaxis_title='평점')

fig.show()

🍺연도별 맥주 평점 그래프

ttmp = tmp.copy()
ttmp.head(3)

# 맥주, 년도별 평점 평균
beer_by_year = ttmp['평점'].groupby([ttmp['맥주'],ttmp['년']]).mean()
beer_by_year

데이터프레임으로 변환하겠습니다.

beer_by_year = pd.DataFrame(data=beer_by_year, columns=['평점'])
beer_by_year

이번에도 인덱스에 맥주,년이 포함되어 있으므로 컬럼으로 분리합니다.

beer_by_year.reset_index(level=['맥주','년'], inplace=True)
beer_by_year.head()

연도별 평점 데이터를 저장합니다.

beer_by_year.to_csv('맥주_연도별평점.csv', encoding='utf-8')

예시로 Cass 맥주에 대한 연도별 평점을 나타내보겠습니다.

cass = beer_by_year[beer_by_year['맥주'] == 'Cass Fresh']

# 맥주별 연도에 따른 평점 변화
fig = px.line(cass, x="년", y="평점", color="맥주", hover_name="맥주")

fig.update_layout(title='연도별 맥주 평점 변화량 그래프',
                   xaxis_title='년도',
                   yaxis_title='평점')

fig.show()

전체 맥주의 연도별 평점 그래프도 확인할 수 있었습니다.

# 맥주별 연도에 따른 평점 변화
fig = px.line(beer_by_year, x="년", y="평점", color="맥주", hover_name="맥주")

fig.update_layout(title='연도별 맥주 평점 변화량 그래프',
                   xaxis_title='년도',
                   yaxis_title='평점')

fig.show()

시각화를 하고나니 분석하는 맛이 좀 더 나는 것 같습니다.

수집한 맥주 데이터로 전처리와 EDA를 마쳤으니

다음 포스팅에서는 실제 추천시스템을 구현해보려고 합니다.

현재 생각하고 있는 모델은 CBF와 CF, 그리고 행렬분해 기반의 Latent Factor 모델입니다.

아무래도 Matrix Facotrization은 계산하는 데 시간이 오래 걸릴 것으로 예상되네요. 🙂