Edited at

ワインの味を分析してリア充達のクリスマスディナーを台無しにしよう

More than 1 year has passed since last update.

やるぞ...やるぞ...やるぞ...(血走った目で抑揚なく)


武器:ワインの評価データ

データ分析のサンプルとして見かける、スモールデータ。

専門家3名が、6種類のワインの味の特徴をコメントしたもの。

果物感と樽臭(直訳)の2つの観点のみ、3人が共通で評価しています。

それ以外にも個別に独特の感想を述べています。(バニラっぽさ、香ばしさ、コーヒーっぽさ)

今回使ったPythonのMCAライブラリのチュートリアル用データとして、ライブラリとセットで公開されています。親切ゥ!

https://github.com/esafak/mca

(このデータをコレスポンデンス分析して、最終的に極めてまずいワインやカップルが仲違いを始めそうなワインを探していきます。)


コレスポンデンス分析


  • 表側と表頭の関係をつかむのに便利な可視化手法

  • 固有値問題なので図示した後の「軸の解釈」がポイントになる


コード

ワインと特徴の関係の場合は、表側:ワインID、表頭:専門家評価軸のデータフレームを作る。

専門家とコメントの関係の場合は、表側:専門家ID、表頭:ワイン
評価軸のデータフレームを作る。

ある専門家しか評価していない観点があったりするので、評価スコアを基準化した。

また、2段階評価は非該当、当てはまる(0,1.0)、3段階評価は非該当、少し当てはまる、当てはまる(0,0.5,1.0)として扱った。

それぞれのデータフレームを下のコードで可視化しました。

# コレスポンデンス分析のライブラリ

import mca

# コレスポンデンス分析(df5は分析対象のpandasデータフレーム
ncol = df5.shape[1]
df5 = df5.astype("int") # 一部の整数がstrになっててエラーはいたので

mca_ben5 = mca.MCA(df5, ncols=ncol)

# 表頭の座標を書き出す
result_row5 = pd.DataFrame(mca_ben5.fs_r(N=2))
result_row5.index = list(df5.index)

# 表側の座標を書き出す
result_col5 = pd.DataFrame(mca_ben5.fs_c(N=2))
result_col5.index = list(df5.columns)

# 作図用ライブラリ
import matplotlib.pyplot as plt
%matplotlib inline
import random as rnd

# 図の設定(任意)
plt.figure(figsize=(10,10))
plt.rcParams["font.size"] = 15

# 表頭をプロット
plt.scatter(result_col5[0], result_col5[1], s=100, marker="x")
# ラベル付け
cnt = 0
for label in list(result_col5.index):
r = rnd.random() * 0.1
plt.text(result_col5.iloc[cnt, 0]+r, result_col5.iloc[cnt, 1]+r, label)
plt.plot([result_col5.iloc[cnt, 0]+r, result_col5.iloc[cnt, 0]], [result_col5.iloc[cnt, 1]+r, result_col5.iloc[cnt, 1]])
cnt += 1

# スコア確認
result_col5

# 表側をプロット
plt.scatter(result_row5[0], result_row5[1], s=100, marker="x")
# ラベル付け
cnt = 0
for label in list(result_row5.index):
r = rnd.random() * 0.1
plt.text(result_row5.iloc[cnt, 0]+r, result_row5.iloc[cnt, 1]+r, label)
plt.plot([result_row5.iloc[cnt, 0]+r, result_row5.iloc[cnt, 0]], [result_row5.iloc[cnt, 1]+r, result_row5.iloc[cnt, 1]])
cnt += 1

# スコア確認
result_row5


  • これだけ!(NGワード:関数化)


ワインと特徴の関係

burgundy_org1.png

なるなる。


専門家とコメントの関係

burgundy_org2.png

なるほどお。


結果の解釈

こうなりますね。(キリッ


ワインの特徴

burgundy1.png


  • W2〜W4はザ・酒ってやつで、W1、W5は甘くて飲みやすいやつ

  • W6にぶどうジュース疑惑

  • 正直、鼻に抜ける系の〜っていう解釈は実際にスコアの値を見るまで思いつかなかった

というか、明らかに空いてるポジションっぽいのがあるなー。

なんで商品作らないんだろう。

burgundy1a.png

理由:まずいから

じゃけん、開発はやめておきましょうねー。


専門家の特徴

burgundy2.png


  • 専門家2が万人受けしそうな評価してくれるやつ

  • 専門家1と3がちょっと個性的なこと言うやつ(うんちく語ってきそう

  • 専門家1と3は感覚違うっぽい

ということは、専門家1と3は同じテーブルに座らせないほうがいいってことよね。

ふーん

...これってアンチクリスマスに使えんじゃね?


クリスマスを台無しにするために


  • まずはおしゃれなレストランでバイトしよう。

  • がんばってソムリエ役を任せてもらおう。なあにデータを使えば簡単だ!


  • :couple_ww::champagne::skull::no_good_tone1::bow_tone1:



仲間割れさせよう


  • 好みのワインを把握してから、好みが分かれそうなワインを提供して、温度差を作る

burgundy2b.png



  • :man_tone1:「このウッディーなスメルがスペシャルディナーとパーフェクトなマリアージュでまるで僕達みたい(熱弁)」:woman_tone1:(木の味なんかまるでしねーしうんちくとか心の底からどうでもいい)

  • カップルの味覚の組合せによる。運任せは避けたい(トドメは確実に刺す派)

  • というか2人の好みがコアな方向で一致していると、逆に決定的な援護射撃になる可能性がある

まだ弱いな...


嫌いなワインを出そう


  • 好みの対極にあるワインを出す

burgundy1b.png



  • :woman_tone1:「やだ何これおいしくなーい!!!」 →この男店選びもできないの?(ダメンズ認定)


  • :girl_tone1:(お酒苦手でジュース頼んだのに...) →この人信じていいのかしら(早め帰宅)

  • データがなくてもある程度できるんじゃ

悪くないが単にもっとやりたい(外道)


超まずいワインをお見舞いしよう


  • 先ほど開発を踏みとどまった、とっておきの工業用アルコール玄人向けスペシャルワインをHomebrew(巻き舌)してお見舞いする。1

  • シンプル・イズ・ベスト。これでも食らえ!!!!!

burgundy1c.png



  • :woman_tone1:「〜〜〜!!!🤢」 → :woman_tone1::anger::punch_tone1:
    :man_tone1::sweat_drops::ambulance:(※動物的な本能が危険を感じたため)


まとめ


  • Pythonのコレスポンデンス分析ライブラリのチュートリアルで、Burgundyデータを可視化して遊びました。

  • https://github.com/esafak/mca

  • コレスポンデンス分析はRと違って情報少なかったけど、めんどくさがらずにGithubのチュートリアル読んだら簡単に使えたので、もし敬遠していた人がいればぜひ。

  • 今年もクリスマスは一人です。

  • 喫茶店でひとり、にやけながら記事を書いていましたが、隣の席ではおじいさんがおばあさんをめっちゃ強引に情熱的にデートに誘いまくっていました。...それに比べて自分は一体何をしているんだ。

  • ひねくれた記事ばかりで誠に申し訳ございません。





  1. ウィットに富んだ高度なジョーク。macユーザは笑いを禁じ得ない。