Ccmmutty logo
Commutty IT
2 min read

「美人」な日本酒

https://picsum.photos/seed/af20d6af39254c1d8bd14472fe602376/600/800

日本酒データ分析1 美人

Pythonで「〜美人」を分析する
  • toc: true
  • badges: true
  • comments: true
  • categories: [分析]
  • image: images/logo.png
python
#hide
import warnings
warnings.simplefilter('ignore')
from IPython.display import set_matplotlib_formats
set_matplotlib_formats('png')
さけのわデータ (https://sakenowa.com) のデータを加工して利用しています。

概要

日本酒には「〜美人」とつく銘柄があります。今回はどんなお酒が「美人」なのかをフレーバーやタグから分析します。

使うデータ

さけのわデータをRDB形式で保存するで作成したデータベースからSQLを叩いて必要なデータをとります。
なお、2020年9月21日時点でのデータとなります。
python
import sqlite3
import pandas as pd
conn = sqlite3.connect('data/sakenowaRDB.db')

「美人」を見つける

「美人」を含んでいる銘柄を検索します。蔵元と都道府県のデータも結合しておきます。
python
query = (
    'SELECT brands.name as 銘柄名, breweries.name as 蔵元名, areas.name as 都道府県 '
    'FROM brands LEFT JOIN breweries ON brands.breweryId = breweries.id '
    'LEFT JOIN areas ON breweries.areaId = areas.id '
    'WHERE brands.name LIKE "%美人%"'
)
pd.read_sql_query(query, conn)
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
蔵元名が空になっている「福久美人」はGoogleで検索してもヒットしないので「福美人」の間違いでしょう。
また「美人蔵部」も調べたところ北山酒造の女性向け販促会であるので「島美人」と同じと考えた方が良さそうです。
結局、全国に15の「美人」が見つかったことになります。
山口の東洋美人は一度いただいたことがあります。軽やかな飲み口で大変美味でございました。
岩手の南部美人は酒造りに機械学習を用いているそうで、一度飲んでみたいですね。

「美人」のランキングをみてみる

野暮なこととは知りつつも、順番が気になるのが人の性。ということで、15人の「美人」のランキングでの順位をみてみましょう。
まずは全国ランキングから。
python
query = (
    'SELECT brands.name as 銘柄名, breweries.name as 蔵元名, areas.name as 都道府県, ovr.rank, ovr.score '
    'FROM brands '
    'LEFT JOIN breweries ON brands.breweryId = breweries.id '
    'LEFT JOIN areas ON breweries.areaId = areas.id '
    'LEFT JOIN overall_ranking as ovr ON brands.id = ovr.brandId '
    'WHERE brands.name LIKE "%美人%" AND brands.name NOT LIKE "%福久%" AND brands.name NOT LIKE "%蔵部%" '
    'AND ovr.rank IS NOT NULL'
)
pd.read_sql_query(query, conn)
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
全国ランキングは50位まであるのですが、ランク入りした「美人」は23位の「東洋美人」だけでした。流石全国ランキングだけあって厳しいですね。
では都道府県でのランキング圏内に入っている「美人」をみてみましょう。
python
query = (
    'SELECT brands.name as 銘柄名, breweries.name as 蔵元名, areas.name as 都道府県, rank.rank, rank.score '
    'FROM brands '
    'LEFT JOIN breweries ON brands.breweryId = breweries.id '
    'LEFT JOIN areas ON breweries.areaId = areas.id '
    'LEFT JOIN rankings as rank ON brands.id = rank.brandId '
    'WHERE brands.name LIKE "%美人%" AND brands.name NOT LIKE "%福久%" AND brands.name NOT LIKE "%蔵部%" '
    'AND rank.rank IS NOT NULL'
)
pd.read_sql_query(query, conn)
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
都道府県でのランキング圏内に入ったのは5銘柄でした。
15銘柄中5銘柄がそれぞれの都道府県の10位以内に入るのですから、「美人」には美味しいお酒が多いと言えるのではないでしょうか。

「美人」のフレーバーチャートをみてみよう

「美人」と名付けられるお酒にはどんな共通点があるのか、「美人」の条件はあるのか。フレーバーチャートをみてみましょう。
matplotlibを使います。
python
# 日本語を使うための設定。各自の環境による。
import matplotlib as mpl
mpl.rcParams['font.family'] = 'IPAGothic'
python
import matplotlib.pyplot as plt
python
query = (
    'SELECT brands.name as 銘柄名, breweries.name as 蔵元名, areas.name as 都道府県, fc.flavor, fc.score '
    'FROM brands '
    'LEFT JOIN breweries ON brands.breweryId = breweries.id '
    'LEFT JOIN areas ON breweries.areaId = areas.id '
    'LEFT JOIN flavor_charts as fc ON brands.id = fc.brandId '
    'WHERE brands.name LIKE "%美人%" AND brands.name NOT LIKE "%福久%" AND brands.name NOT LIKE "%蔵部%" '
    'AND fc.flavor IS NOT NULL'
)
df_fc = pd.read_sql_query(query, conn)
print(df_fc.銘柄名.unique())
['南部美人' 'ゆきの美人' '舞美人' '都美人' '東洋美人' '福美人']
さけのわでフレーバーチャートが付くのはある程度情報が集まったお酒だけのようで、都道府県ランキングで圏内だった5銘柄に「福美人」を加えた6銘柄のみフレーバーチャートのデータがあります。
棒グラフにしてみましょう。
python
fig = plt.figure(figsize=(9,6))
for i, name in enumerate(df_fc.銘柄名.unique()):
    ax = fig.add_subplot(2,3,i+1)
    df_fc[df_fc.銘柄名 == name].plot.barh(x="flavor",y="score",title=name,ax=ax,legend=None,
                                      xlim=(0., 1.))
fig.subplots_adjust(wspace=0.5, hspace=0.5)
plt.show()
png
あんまり統一感がないですね。これなら美人と言える!!という特徴はないのでしょうか。
一応、6銘柄の平均を算出して「平均的美人」をみてみましょうか。
python
df_fc.groupby(['flavor']).mean().plot.barh(title='平均的美人', legend=None, xlim=(0., 1.))
<AxesSubplot:title={'center':'平均的美人'}, ylabel='flavor'>
png
「重厚よりは軽快で、華やかさと芳醇さを備える」といったところでしょうか。
参考に、「美人」以外のお酒の平均もみておきます。
python
query = (
    'SELECT brands.name as 銘柄名, breweries.name as 蔵元名, areas.name as 都道府県, fc.flavor, fc.score '
    'FROM brands '
    'LEFT JOIN breweries ON brands.breweryId = breweries.id '
    'LEFT JOIN areas ON breweries.areaId = areas.id '
    'LEFT JOIN flavor_charts as fc ON brands.id = fc.brandId '
    'WHERE brands.name  NOT LIKE "%美人%" AND brands.name NOT LIKE "%福久%" AND brands.name NOT LIKE "%蔵部%" '
    'AND fc.flavor IS NOT NULL'
)
df_fc = pd.read_sql_query(query, conn)
df_fc.groupby(['flavor']).mean().plot.barh(title='平均的不美人', legend=None, xlim=(0., 1.))
<AxesSubplot:title={'center':'平均的不美人'}, ylabel='flavor'>
png

「美人」を形容する言葉をみてみよう

最後に、「美人」に付与されることが多いタグから、美人を形容する言葉を抽出してみましょう。
python
query = (
    'SELECT brands.name as 銘柄名, ft.tag '
    'FROM brands '
    'LEFT JOIN brand_flavor_tags as bft ON brands.id = bft.brandId '
    'LEFT JOIN flavor_tags as ft ON bft.tagId = ft.id '
    'WHERE brands.name LIKE "%美人%" AND brands.name NOT LIKE "%福久%" AND brands.name NOT LIKE "%蔵部%" '
    'AND ft.tag IS NOT NULL'
)
df_tag = pd.read_sql_query(query, conn)
df_tag.銘柄名.unique()
array(['南部美人', 'ゆきの美人', '舞美人', '都美人', '東洋美人', '福美人', '雪中美人', '雪美人', '島美人', '下田美人', '菊美人', '加賀美人'], dtype=object)
12銘柄にタグが付いています。3つ以上の銘柄につけられたタグをみてみましょう。
python
df_tag.groupby(['tag']).count().sort_values(ascending=False, by='銘柄名').query('銘柄名>2')

Discussion

コメントにはログインが必要です。