탐색적데이터분석
수집한 맥주 리뷰 데이터를 관찰하며 다각도로 시각화해보았습니다.
우선 필요한 라이브러리들을 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은 계산하는 데 시간이 오래 걸릴 것으로 예상되네요. 🙂
'데이터사이언스 > 추천시스템' 카테고리의 다른 글
맥주 추천시스템 구현 - 8. 웹 배포하기(Pythonanywhere) (3) | 2021.03.02 |
---|---|
맥주 추천시스템 구현 - 7. 웹 구현하기(Django) (5) | 2021.03.01 |
맥주 추천시스템 구현 - 6. 웹 설정하기(Django) (2) | 2021.02.28 |
맥주 추천시스템 구현 - 5. CF 기반 추천시스템 구현 (0) | 2021.02.27 |
맥주 추천시스템 구현 - 4. 클러스터링 (0) | 2021.02.26 |