データサイエンスを使用して、ワインの味を良くするものを理解する方法

私の技術ブログにも公開されています

データサイエンス。 21世紀で最もセクシーな仕事として宣伝されています。企業から個人まで、誰もがそれを理解し、採用しようとしています。そして、プログラマーなら、間違いなくFoMo(見逃すことの恐怖)を経験しているでしょう!この用語が時間とともにどのように普及しているかを見てください:

過去5年間のデータサイエンスの人気レベル

Indeedによると、データサイエンティストの平均給与は米国で120,000ドルを超えています。彼らは現在、最高で6万ドルの給与の高い仕事も持っています。

しかし、彼らが話し続けているこの科学とは何ですか?読み続けます!

目次

  • データサイエンスの必要性
  • このチュートリアルを最大限に活用するのは誰ですか
  • 入門
  • データ解析
  • 機能とデータ視覚化手法との関係を探る
  • 外れ値の検出

データサイエンスの必要性

簡単に言えば、データサイエンスは、データ駆動型であることを支援します。データ主導の意思決定は、企業が顧客をよりよく理解し、優れたビジネスを構築するのに役立ちます。

私たちは情報爆発の時代に生きています。企業は、実行するビジネスのタイプに応じてさまざまな種類のデータを収集します。たとえば、小売店の場合、データは顧客が時間の経過とともに購入する製品の種類と支出額に関するものです。 Netflixの場合は、ほとんどのユーザーが見たり気に入ったりしていることを示すものと、そのユーザー層についてである場合があります。

多くの場合、ビジネス上の決定は、多くの直観とドメインの知識に依存しています。現在、データがますます大きくなるにつれて、その意味を理解することが難しくなっています。私たちには、膨大な情報で満たされた大規模なデータセットを注ぐ精神的な能力が備わっていません。

データサイエンスの目的は、ストーリーを語り、それを視覚化することです。

それを使用することができます:

  • さもなければ検出されないデータから多くの洞察を得る
  • なぜなら、コンピューターは結局のところ人間よりも速いからです!
  • 意思決定の背後にある多くのバイアスを排除します。歴史を通して、人間は常に自分の感情や偏見に判断力を曇らせがちでした…

しかし、人間とは異なり、コンピューターはビジネス会議に参加する必要はなく、特定の決定が他の決定よりも優れている理由についての辛issなコンテストに参加する必要はありません。

それが何であるかを理解できたので、それを学ぶ時です!

このチュートリアルを最大限に活用するのは誰ですか:

  • プログラミングの基礎知識を持ち、データサイエンスとそのアプリケーションを理解したい人。
  • 数学と統計が最初は少し圧倒されると感じる人。
  • 少しでもワインに興味がある場合は、読んでみてください。

始めましょう!

このチュートリアルでは、ワインのデータセットを分析し、その特徴を観察し、そこからさまざまな洞察を抽出する方法を理解します。このチュートリアルを終えると、次のことができます。

  • データサイエンスを使用してデータを分析し、洞察を得る方法を理解します。
  • ワインについて知識を深めます。 ;-)

飲まなくても大丈夫です-あなたはまだ新進のソムリエ、またはエノフィアになります(はい、それは実際の用語です!)。

次のブログ投稿では、機械学習の形で応用データサイエンスを見ることができます。

  • MLとは何ですか、それを使用してどのような問題を解決できますか?
  • MLを使用して分類器をトレーニングし、悪いワインから良いワインを識別する方法。
  • さまざまなパフォーマンスメトリック

読む前に知っておいてください:

すでにプログラミングの知識があると仮定しています。 Pythonのプログラミング知識がある程度必要です。そのため、このチュートリアルを知っていれば、このチュートリアルは比較的簡単です。そうでない場合は、Python入門に関するこの無料のコースをご覧になることを強くお勧めします。

なぜPython?それは、データサイエンスの言語の優先選択として急速に出現しているためです。取り上げて学ぶのはかなり簡単で、Pythonエコシステムには、Webサーバー、機械学習用のパッケージ、統計、ディープラーニング、IoTに至るまで、あらゆるものを仮想的に構築するための多くのツールとライブラリがあります。 Pythonには、スタックオーバーフローなど、インターネット上で最も活発なコミュニティの1つもあります。

numpyやpandasなどのライブラリの基本的な知識も役立ちますが、必須ではありません。

このチュートリアルに必要なもの:

  • できれば、PythonがインストールされたLinuxベースのディストリビューション(UbuntuまたはLinux Mint)。
  • Anacondaをインストールします。主にPythonプログラム用のオープンソースのパッケージ管理システムおよび環境管理システムです。機械学習モデルのトレーニングとテストには、scikit-learnと呼ばれる非常に人気のあるオープンソースライブラリを使用します。
  • このリポジトリからマシンにプロジェクトファイルをダウンロードします。次に、ターミナルを開き、プロジェクトフォルダーにcdし、pip install -r requirements.txtを実行して依存関係をインストールします。
  • または、設定の手間をかけずに、プロジェクトファイルをFloydHubにアップロードしてコードを実行することもできます。 Linuxベースのシステムがない場合はお勧めします。

IPython(Interactive Python)ノートブックファイルを使用してコードを実行します。プロジェクトファイルをダウンロードしたら、ターミナルを開き、プロジェクトフォルダーにcdして、jupyter-notebookを実行します。これにより、デフォルトのブラウザでポート8888の新しいウィンドウが開きます。FloydHubを使用している場合、そこから同じノートブックファイルを実行することもできます。

2つのIPythonノートブックファイルがあります。リストからgame-of-wines.ipynbという名前を選択します。もう1つのノートブックファイルには、このチュートリアルの完全なソースコードが含まれています。

このノートブックの使用方法

ノートブックには、開始するためのセル内のテンプレートコードと説明が既にあります。いくつかの場所では、簡単にするために、すでにコードがすでに作成されていることがわかります。また、必要に応じてコメントやリンクを見つけることができます。

セルでコードを実行するには、マウスでコードをクリックしてから、ブックのタイトルバーで実行オプションを選択します。

よし、乾杯!ちょっと飲みましょう…ワインのデータを調べてください。

先日、インターネット上で興味深いオープンソースデータを探していました。 Kaggleには非常に活発なコミュニティがあり、さまざまな種類のデータセットを簡単に検索して課題を解決できます。データセットを探すもう1つの素晴らしい場所は、カリフォルニア大学アーバイン校の機械学習リポジトリです。

UCI Machine Learningリポジトリには、2セットのワインデータがあります。 1つのデータセットには赤ワインに関する情報が含まれ、もう1つのデータセットには白ワインに関する情報が含まれています。プロジェクトフォルダにはすでに両方が含まれています。これらのワインは、ポルトガル北部のヴィーニョ・ヴェルデで生産されました。

最初に、データ分析に必要ないくつかのライブラリをインポートします。セルブロックをクリックし、実行コマンドを選択してすべてをロードします。

次に、データセットをノートブックにロードし、最初の5行を表示します。ノートブックのセルブロックに次のコードを入力して実行します。

#Red Winesデータセットを読み込む
data = pd.read_csv( "data / winequality-red.csv"、sep = ';')
#最初の5つのレコードを表示する
display(data.head(n = 5))

次の出力を印刷します。

ご覧のとおり、データセットの各ワインには約12の異なる機能があります。最後の列である品質は、特定のワインが1から10までの間にどの程度良いと評価されたかの指標です。

これらの列に情報が欠けているかどうかを見てみましょう。これをセルブロックに入力します。

data.isnull()。any()

出力から、空の列がないことがわかります。

以下を実行すると、データセットに関する追加情報を取得できます。

data.info()

ワインの予備的な分析を試してみましょう。ここでは、評価が7以上のすべてのワインを非常に良い品質のものとし、5と6のワインを平均品質のものとし、5未満のワインを品質の低いものとします。

n_wines = data.shape [0]
#品質評価が6を超えるワインの数
quality_above_6 = data.loc [(data ['quality']> 6)]
n_above_6 = quality_above_6.shape [0]
#品質評価が5未満のワインの数
quality_below_5 = data.loc [(data ['quality'] <5)]
n_below_5 = quality_below_5.shape [0]
#品質評価が5〜6のワインの数
quality_between_5 = data.loc [(data ['quality']> = 5)&(data ['quality'] <= 6)]
n_between_5 = quality_between_5.shape [0]
#品質評価が6を超えるワインの割合
greater_percent = n_above_6 * 100 / n_wines
#結果を印刷する
print( "ワインデータの総数:{}"。format(n_wines))
print( "評価7以上のワイン:{}"。format(n_above_6))
print( "評価が5未満のワイン:{}"。format(n_below_5))
print( "評価5および6のワイン:{}"。format(n_between_5))
print( "品質7以上のワインの割合:{:.2f}%"。format(greater_percent))
#さらに追加のデータ分析
display(np.round(data.describe()))

グラフで品質分布を表示することもできます。

#元のデータの歪んだ連続フィーチャを視覚化する
vs.distribution(data、 "quality")

ご覧のとおり、ほとんどのワインは平均的な品質に該当します。非常に高品質で素晴らしいテイスティングのワインは少なく、あまり良くないワインはほとんどありません。

また、pandas記述メソッドを使用して、データの特徴の平均、中央値、標準偏差などの有用な統計を取得できます。

知っておくべきいくつかの有用な統計:

  • 平均(平均):おそらく最も馴染みのあるものです。特定の機能のすべてのサンプル値を合計し、サンプル数で割ります。
  • 中央値:最初に、リスト内のすべてのサンプル値を数値順に並べます。このリストの中央の数字が中央値になります。
  • モード:サンプルのリストで最も多く発生する値。
  • 範囲:リスト内の最高値と最低値の差。
  • 標準偏差:セット内の値の分散を測定するために使用されます。最初に平均を計算してから、リスト内の各数値を平均で減算し、結果を二乗します。次に、それらの平方差の平均を計算し、最後に平方根を計算します。

さて、次のステップは、データセットの機能をさらに詳しく調べることです。

ワインの品質は、味、香り、風味に影響する化学的性質に依存します。そうです、ワイン造りは芸術と考えられていますが、考えてみれば、実際にはかなり科学的です。

データサイエンスでは、ドメインの知識を持っていることが、平凡な洞察と優れた洞察を区別する重要な要因になります。

ワインのボキャブラリーで賢明な時間を!

ワインには、さまざまな割合の糖、アルコール、有機酸、ミネラルおよび有機酸の塩、フェノール化合物、顔料、窒素物質、ペクチン、ゴム、粘液、揮発性芳香族化合物(エステル、アルデヒド、ケトン)、ビタミン、塩、二酸化硫黄が含まれています。

ワインの試飲では、酸味という用語は、ワインのフレッシュ、酸味、酸味の属性を指します。酒ぶどうには、酒石酸、リンゴ酸、クエン酸という3つの主要な酸があります。それらは、タンニンのようなワインの甘さと苦味の成分がどの程度酸味のバランスを取っているかに関して評価されます。

  • 固定酸度

滴定酸度は、固定酸度とも呼ばれ、ワインに含まれる滴定酸と遊離水素イオンの合計濃度の測定値です。リトマス紙を使用して、特定の溶液が酸性か塩基性かを識別できます。最も一般的な滴定可能な酸は、酒石酸、リンゴ酸、クエン酸、炭酸です。これらの酸は、より多くの少量とともに、ブドウで自然に発生するか、発酵プロセスで生成されます。

  • 揮発性酸性度

揮発性の酸性度は、主にワインに含まれるバクテリアによって引き起こされます。酢酸は酢(酢に特徴的な風味と香りを与える酸)と、その副産物である酢酸エチルを生成します。揮発性の酸度は、損傷したブドウや空気にさらされたワインなどによって引き起こされる、腐敗または製造プロセスのエラーの指標になる可能性があります。これにより、酢酸菌が侵入して繁殖し、不快な味と臭いが発生します。ワインの専門家は、単に匂いを嗅ぐだけでこれを知ることができます!

  • クエン酸

クエン酸は、一般にワイン用ブドウにごく少量含まれています。それは防腐剤として機能し、酸度を高め、特定のフレーバーを補い、または第二鉄混濁を防ぐためにワインに加えられます。完成したワインに加えて、酸味を高め、「フレッシュ」な風味を与えることができます。ただし、過剰な添加は味を損なう可能性があります。

  • 残留糖

残留糖(略してRS)とは、発酵が終了した後に(意図的であるかどうかにかかわらず)残っている天然のブドウ糖を指します。ワイン用ブドウの果汁は非常に甘い状態で始まり、発酵はその糖分を使い尽くします。

醸造中、酵母は通常、すべての砂糖をアルコールに変換して辛口ワインを作ります。しかし、時々、すべての砂糖が酵母によって発酵されず、いくらかの甘さが残ります。

味の良いワインを作るには、飲み物の甘さと酸味のバランスを完璧にすることが重要です。

  • 塩化物

通常、ワインに含まれる塩化物の量は、その「塩味」の指標です。これは、通常、ワイン用ブドウの栽培地域、栽培方法、およびブドウの種類によって影響を受けます。塩味が多すぎると望ましくないと考えられます。適切な比率でワインをより美味しくすることができます。

  • 二酸化硫黄レベル

二酸化硫黄は、遊離および結合形態でワインに存在し、その組み合わせは総SO2と呼ばれます。これは最も一般的に使用される防腐剤であり、通常は空気や酸素への暴露の悪影響からワインを保護するためにワインメーカーによって追加されます。二酸化硫黄が追加されたワインは通常、ラベルに「亜硫酸塩を含有」しています。

それは消毒剤として機能します-通常、それを加えると、ワインに入ってその味と香りを損なうかもしれない望ましくないバクテリアまたはイーストを殺します。ローマ人が最初に使用したのは、空のワイン容器の中で硫黄のろうそくを燃やすと、新鮮で酢の臭いがなくなることを発見したときです。きれいですね。

  • 密度

比重とも呼ばれ、ワインのアルコール濃度の測定に使用できます。発酵中、果汁の糖は二酸化炭素を廃ガスとしてエタノールに変換されます。プロセス中に密度を監視することにより、最高品質のワインのこの変換ステップを最適に制御できます。甘いワインは一般的に密度が高くなります。

  • pH

pHは水素の力を表し、これは溶液中の水素イオン濃度の測定値です。一般に、pH値が7未満の溶液は酸性と見なされ、最も強い酸の一部は0に近くなります。7を超える溶液はアルカリ性または塩基性と見なされます。水のpH値は、酸でも塩基でもないため、7です。

  • 硫酸塩

硫酸塩は硫酸の塩です。彼らはワインの生産には関与していませんが、一部のビールメーカーは、醸造プロセス中の水のミネラル不足を修正するために、硫酸カルシウム(醸造用石膏とも呼ばれる)を使用します。また、「シャープ」な味が少し加えられます。

  • アルコール

ああ、アルコール—パーティーを成功させるための鍵です!アルコール飲料は、少なくとも新石器時代(紀元前10,000年)から存在していました。少量飲むと、内側の温かいあいまいな気持ちになり、より社交的になります。もちろん、より高い用量はあなたを気絶させることもできます。

私のデータサイエンティストの相棒、熱心に酒を飲んでください!

機能と視覚化の関係を探る

ワインについてある程度の知識が得られたので、次はさらに探求してみましょう。データセットには、アルコールレベル、残留糖量、pH値など、上で見た多くの機能が含まれています。これらの機能には、他の機能に依存するものと依存しないものがあります。それらのいくつかは、品質評価にも影響する可能性があります。

データサイエンスや機械学習では、データを構成する機能を研究し、それらの間に相互関係があるかどうかを確認することが非常に重要です。

たとえば、pHレベルは固定酸度レベルに影響しますか?揮発性の酸度レベルは品質と関係がありますか?アルコール度数の高いワインは、よりおいしく、または品質が高いと感じますか?

幸いなことに、Pythonには、さまざまな種類の視覚化を提供するという重い作業を行う素晴らしいライブラリがあります。データを使用して散布図をプロットし、それが何を示しているかを観察してみましょう。

pd.plotting.scatter_matrix(data、alpha = 0.3、figsize =(40,40)、対角線= 'kde');

上記の散布図から、興味深い詳細を取得できます。一部の機能では、分布はかなり線形に見えます。他の一部では、分布は負に歪んでいるように見えます。したがって、これは私たちの最初の疑いを裏付けています。確かに、いくつかの機能の間にいくつかの興味深い相互依存関係があります。

機能間の相互関係のヒートマップをプロットできます。これにより、より多くの洞察を得ることができます。

相関= data.corr()
#display(correlation)
plt.figure(figsize =(14、12))
heatmap = sns.heatmap(correlation、annot = True、linewidths = 0、vmin = -1、cmap = "RdBu_r")

ご覧のとおり、正の値を持つ正方形は、フィーチャ間の直接的な相互関係を示しています。値が高いほど、これらの関係は強くなります-赤味が強くなります。つまり、1つの機能が増加すると、他の機能も増加する傾向があり、その逆も同様です。

負の値を持つ正方形は、逆相関関係を示しています。これらの値が負になるほど、反比例し、青が強くなります。つまり、1つの機能の値が高い場合、他の機能の値は低くなります。

最後に、ゼロに近い四角は、これらの機能セット間に相互依存関係がほとんどないことを示します。

かなり面白いでしょう?これらの相互関係について詳しく見ていきましょう。

  • pH対固定酸度
#pHと固定酸度の相関関係を視覚化する
#pHと固定酸性度カラムのみを含む新しいデータフレームを作成して、相互関係を視覚化する
fixedAcidity_pH = data [['pH'、 'fixed acidity']]
#seabornライブラリを使用して、データフレームでジョイントグリッドを初期化する
gridA = sns.JointGrid(x = "fixed acidity"、y = "pH"、data = fixedAcidity_pH、size = 6)
#グリッドに回帰プロットを描画します
gridA = gridA.plot_joint(sns.regplot、scatter_kws = {"s":10})
#同じグリッドに分布プロットを描画します
gridA = gridA.plot_marginals(sns.distplot)

この散布図は、固定酸性度レベルを変更するとpHの値がどのように変化するかを示しています。一定の酸性度レベルが増加すると、pHレベルが低下することがわかります。理にかなっていますか?低いpHレベルは、結局のところ、高い酸性度の指標です。

  • 固定酸度とクエン酸
fixedAcidity_citricAcid = data [['クエン酸'、 '固定酸度']]
g = sns.JointGrid(x = "固定酸度"、y = "クエン酸"、data = fixedAcidity_citricAcid、size = 6)
g = g.plot_joint(sns.regplot、scatter_kws = {"s":10})
g = g.plot_marginals(sns.distplot)

クエン酸の量が増えると、固定酸度レベルも上がります。

  • 揮発性酸度と品質
fig、axs = plt.subplots(ncols = 1、figsize =(10,6))
sns.barplot(x = 'quality'、y = 'volatile acidity'、data = volatileAcidity_quality、ax = axs)
plt.title( 'quality VS volatile volatileity')
plt.tight_layout()
plt.show()
plt.gcf()。clear()

通常、品質が高いほど、揮発性の酸性度が低くなります。揮発性の酸性度は腐敗の指標であり、不快な香りを引き起こす可能性があるため、これは理にかなっています。これは、ドメインの知識と一致しています。

  • アルコール対品質
fig、axs = plt.subplots(ncols = 1、figsize =(10,6))
sns.barplot(x = 'quality'、y = 'alcohol'、data = quality_alcohol、ax = axs)
plt.title( 'quality VS alcohol')
plt.tight_layout()
plt.show()
plt.gcf()。clear()

うーんほとんどの人は一般的に、アルコールの割合が高いワインを好むようです。

ノートブックで独自の機能を試してみて、何かが明らかになるかどうかを確認してください。何らかの関係がある場合、その理由は何だと思いますか?探索すると、より多くの隠れた洞察が明らかになります。

相関関係は必ずしも因果関係を意味するとは限らないことを覚えておくと役立ちます。 2つのフィーチャのグラフをプロットするとき、偶然の一致のパターンが表示されることがあります。以下に例を示します—

http://philosophy.hku.hk/think/sci/inference.php。ここでさらに例を確認できます。

では、なぜそれを行うのでしょうか?データセットの整合性が損なわれていないかどうかを確認するのに役立ちます。

たとえば、酸性度が上がるとpHを下げる必要があることは確かです。しかし、グラフが反対を示している場合、それは何かがおかしいことを示しています。データセットは信頼できません。そして、それは私たちの予測を誤らせる可能性があります!ここで、ドメインの知識が再び役立つことがわかります。

外れ値の検出

ラニスター王国には、約10,000人の成人がいます。それらのほとんどは平均身長(5フィート以上)ですが、約100人の小人がいます。これらは、予想される高さの範囲外の極端な値であるため、外れ値とも呼ばれます。つまり、外れ値とは、他のほとんどのデータポイントから大幅に離れているデータポイントです。

なぜ重要なのですか?なぜなら、それらはデータ分析で多くの問題を引き起こすことがあるからです。部屋でランダムに選択された10個のオブジェクトの平均温度を計算しようとしているとしましょう。そのうち9個は摂氏20〜25度です。ただし、オーブンはオンのままにしており、175°Cです。温度の中央値は20〜25℃ですが、平均温度は35.5〜40℃です。この場合、中央値はランダムにサンプリングされたオブジェクトの温度をより適切に反映します。これは、部屋で予想される温度を下回るためです。

したがって、非常に小さい値または非常に大きい値はデータ分析に悪影響を及ぼし、結果として予測に悪影響を与える可能性があるため、外れ値を見つけることが重要です。そのため、それらを削除することが必要になる場合があります。

Tukeyの異常値検出方法

後で読むことができるこの方法に関する非常に素晴らしい投稿を読みました。しかし、要するに、ここにテクニックの仕組みがあります:

  • 最初に、並べ替えられたデータを4つの間隔に分割することから始めます。その結果、結果のセクションにはそれぞれ合計データポイントの約25%が含まれるようになります。これらの間隔が分割される値は四分位数と呼ばれます。
  • 次に、第1四分位から第3四分位を差し引いて、四分位範囲(IQR)を取得します。これは中間の50%であり、大部分のデータが含まれています。
  • IQRの1.5倍を超えるデータポイントは、外れ値と見なされます。

次のコードブロックで次を実行して、データセットのすべての機能の外れ値を印刷します。

#フィーチャごとに、極端に高いまたは低い値を持つデータポイントを見つける
data.keys()の機能の場合:

    #TODO:指定された機能のQ1(データの25パーセンタイル)を計算します
    Q1 = np.percentile(data [feature]、q = 25)
 
    #TODO:指定された機能のQ3(データの75パーセンタイル)を計算します
    Q3 = np.percentile(data [feature]、q = 75)
 
    #TODO:四分位範囲を使用して外れ値ステップを計算します(四分位範囲の1.5倍)
    interquartile_range = Q3-Q1
    ステップ= 1.5 * interquartile_range
 
    #外れ値を表示する
    print( "機能 '{}'の外れ値と見なされるデータポイント:"。format(feature))
    display(data [〜((data [feature]> = Q1-step)&(data [feature] <= Q3 + step))])
 
#オプション:削除するデータポイントのインデックスを選択します
外れ値= []
#外れ値がある場合は、それを削除します
good_data = data.drop(data.index [outliers])。reset_index(drop = True)

そして...完了です!

このチュートリアルをお楽しみください。これで、以前よりもデータサイエンスについて詳しく知ることができました!

実際にタイリオンラニスターのように感じるのは

もちろん、見た目以上のものがあります。詳細を知りたい場合は、以下を確認することを強くお勧めします。

  • 統計と確率のコース
  • Python for Data Scienceの概要
  • インターネット上の最高のデータサイエンスコース
  • データサイエンティストになる方法

しかし、今のところは休憩してから、次のチュートリアルに進んでください。ここでは、機械学習の中核となるものに飛び込みます。機械学習モデルを作成する方法を学びます。モデルにワイン属性を付与すると、正確な品質評価が得られます。

あなたが読んだものが好きですか?購読する必要があります。あなたの時間を無駄にしません。

ご質問がある場合、またはクールなトピックに関するチュートリアルが必要な場合は、コメントをお気軽にお寄せください!