uni farm

pythonとtableauでscotch whiskyの味の特徴を分析、可視化

pythonでデータを作成し、tableauにて可視化を行った

作ったもの

scotch whiskyの味の特徴と蒸留所の場所を可視化するtableauノートブックを作成した

スコッチウイスキーについて、似ている風味のものや蒸留所(Distillery)の地図上でマッピングするダッシュボードを作成した

python

データ取得、分析、加工までgoogle colaboratoryにて行った

データについて

元データはwhisky taste classificationを使用。86種類のスコッチウイスキーについてDistillery(蒸留所)、位置情報、12種類のカテゴリ(sweetness, smoky, nuttyなど)について0-4で得点を付けたもの、を含むデータセット

各カテゴリは何やら風味について言及しているが、bodyは味というか飲み口みたいなものを表している。bodyは口の中に残る余韻のことを示しており、大きいほど余韻が大きいらしい

データ読み込み用スクリプト

import pandas as pd
data_url = 'https://outreach.mathstat.strath.ac.uk/outreach/nessie/datasets/whiskies.txt'
df = pd.read_csv(data_url) 

前処理 元データの特徴をまとめる

元データには12種類の特徴量あったが、whisky wheelの区分を参考にカテゴリ数を12->8にまとめた(因子分析にかけるときなるべく次元数を減らしたかったため)

具体的には以下のようにまとめて、これらの和を取ったものを新たな特徴量とした

body_cols = ['Body']
winey_cols = ['Winey', 'Nutty']
central_cols = ['Malty']
feinty_cols = ['Honey', 'Tobacco']
peaty_cols = ['Medicinal', 'Smoky']
floral_cols = ['Floral']
fruity_cols = ['Fruity', 'Sweetness']
woody_cols = ['Spicy']

whisky wheelはこちらを使用した

from: https://whiskymag.com/story/tasting-wheel

因子分析(factor analysis)で因子抽出

各特徴量の関係を次元圧縮し、指定した数の因子としてまとめる。 2次元の散布図に表示したかったので、因子数は2とした

モデルの各因子負荷量をみてみる

factor analysis loading plot

第一因子はpeaty&bodyが高く、floral&fruityは低くなっている

第二因子はwiney&fruity&bodyが高く、peaty&floralは低くなっている

また、tableauワークブックにて因子のplotをみると、右上には点がない。peatyでwineyなウイスキーはない、ということなのだろうか

また、相関行列のplotも出してみた

whisky taste correlation

結構因子の特徴を表現している。wineyもしくはpeatyだとbodyは高いらしい

実行スクリプトは以下

  • モデル作成
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.decomposition import FactorAnalysis as FA

# 因子分析
def fa_and_plot(X, target, n_components=2):
    ss = StandardScaler()
    fa = FA(n_components=n_components, max_iter=500)

    pl = Pipeline([("scaler", ss), ("fa", fa)])
    x = pl.fit_transform(X)

    return pl['fa'], x
   
val_cols = ['winey', 'woody', 'body',
             'central', 'feinty', 'peaty',
             'floral', 'fruity']
             
fa, x_fa = fa_and_plot(df[val_cols], df['Distillery'].values, n_components=2)
  • 因子負荷量のplot
# 因子負荷量
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.bar(list(df[val_cols].columns), fa.components_[0])
plt.title('fa loading 1')
plt.subplot(2, 1, 2)
plt.title('fa loading 2')
plt.bar(list(df[val_cols].columns), fa.components_[1])
plt.show()
  • 相関行列のplot
import seaborn as sns
sns.heatmap(df[val_cols].corr(), vmax=1, vmin=-1, center=0)
plt.show()

後処理 tableau表示用に加工してspread sheetへ出力

レーダーチャートに表示するために、ダミーのkey(ここではz_body)を追加した

また、データは縦持ちにしている

# 出力データ加工用
id_cols = ['RowID', 'Distillery', 'Postcode', ' Latitude', ' Longitude', 'x0_fa', 'x1_fa']

# tableauでレーダーチャートに表示するためのカラム
df_fa2 = df_fa.copy()
df_fa2['z_body'] = df_fa2['body']
df_melt = df_fa2.melt(value_vars=val_cols+['z_body'], id_vars=id_cols, var_name='key')

# tableauで計算するためにカテゴリごとにidをつける
df_melt['key_id'] = df_melt['key'].astype('category').cat.codes + 1

spread sheetへの書き込み用スクリプト

from google.colab import auth
from oauth2client.client import GoogleCredentials
import gspread
import gspread_dataframe as gs_df

# 認証処理
auth.authenticate_user()
gc = gspread.authorize(GoogleCredentials.get_application_default())

# 一つ目のワークシートへ書き込み
worksheet = gc.open('class_whiskey').get_worksheet(0)
gs_df.set_with_dataframe(worksheet, df_melt)

tableau

Tableau Publicで作成し、公開した

詰まった部分を残しておく

tableauでpostcode(郵便番号)をマッピング

mapをtableauで表示させようとしてもこのままだとLatitude Longitudeは何やら表記方法が異なるため使えず、また、Postcodeも分割を行いoutcodeをimportしないとできなかった

こちらの記事を参考にした

UK Postcode mapping in 5 minutes - The Information Lab

OutCodesよりOUTCODE.csvをダウンロードし、tableauにimportする

これでスペースで分割したPostcodeの前半部分を地理データとして用いれば自動で座標変換され、mapデータとして表示できる

レーダーチャート作成

計算フィールドとチャートは、以下のページを参考に作った。表示用にデータを入れたりしないといけないのが辛かった

参考

  • Rによるデータサイエンス

因子分析の例を参考にした

  • ウイスキー用語

https://www.bonigala.com/basic-whisky-terminology

2022, Built with Gatsby. This site uses Google Analytics.