Импорт библиотек и чтение данных

Самые ранние археологические свидетельства винного винограда были обнаружены на участках в Грузии (ок. 6000 г. до н.э.), Иране (ок. 5000 г. до н.э.), Греции (ок. 4500 г. до н.э.) и Сицилии (ок. 4000 г. до н.э.), хотя есть более ранние свидетельства. вина, сделанного из ферментированного винограда среди других фруктов, потребляемых в Китае (ок. 7000–5500 до н.э.). Самые старые свидетельства производства вина были найдены в Армении (ок. 4100 г. до н.э.).

Измененное сознание, вызываемое вином, с самого начала считалось религиозным. Древние греки поклонялись Дионису или Вакху, а древние римляне продолжали его культ. Потребление ритуального вина было частью еврейской практики с библейских времен и, как часть евхаристии, посвященной Тайной вечере Иисуса, стало еще более важным для христианской церкви. Хотя ислам номинально запрещал производство или потребление вина, во время его Золотого века алхимики, такие как Гебер, впервые применили перегонку вина для медицинских и промышленных целей, таких как производство духов.

Производство и потребление вина увеличились, начиная с 15 века и далее в рамках европейской экспансии. Несмотря на разрушительное заражение филлоксерной вшью в 1887 году, современная наука и технология адаптированы, а промышленное производство вина и потребление вина теперь происходят во всем мире.

https://en.wikipedia.org/wiki/История_вина

Наш набор данных содержит функции ниже. Мы проанализируем набор данных и используем процесс естественного языка, чтобы сделать прогноз.

СОДЕРЖАНИЕ
1. Импорт библиотек и чтение данных
2. Исследование и визуализация данных
3. Процесс на естественном языке

Исследование и визуализация данных

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import plotly.plotly as py
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)
import plotly.graph_objs as go
from plotly import tools
df = pd.read_csv("../input/winemag-data-130k-v2.csv")
df.info()

df.head() # First 5 rows of our dataset

Набор данных содержит;

country: страна, из которой произведено вино.
description: несколько предложений от сомелье, описывающих вкус, запах, вид, ощущение вина и т. д.
обозначение: Виноградник на территории винодельни, откуда взят виноград, из которого сделано вино.
Баллы: Количество баллов, которое WineEnthusiast оценило вино по шкале 1–100 (хотя они говорят, что публикуют обзоры только для вин, получивших оценку ›=80)
цена: стоимость бутылки вина
провинция: провинция или штат, из которого произведено вино
region_1: винодельческий район в провинции или штате (например, Напа)
region_2 : иногда в винодельческой зоне указываются более конкретные регионы (например, Резерфорд в долине Напа), но иногда это значение может быть пустым.
taster_name: имя человека, который пробовал и делал обзор вино
дегустатор_ twitter_handle: дескриптор в Твиттере человека, который попробовал вино и оставил отзыв о нем.
название: заголовок обзора вина, который часто содержит винтаж, если вы заинтересованы в его извлечении. характеристика
разнообразие: сорт винограда, использованный для производства вина (например, Пино Нуар)
винодельня: винодельня, изготовившая вино

# Let's delete "Unnamed: 0" column
df.drop(["Unnamed: 0"], axis=1, inplace=True)

Процесс естественного языка (NLP)

Количество продегустированных вин по странам (10 лучших)

plt.figure(figsize=(16,7))
sns.set(style="darkgrid")
sns.barplot(x=df.country.value_counts()[:10].index, y=df.country.value_counts()[:10].values)
plt.xlabel("Countries")
plt.ylabel("Number of Wine")
plt.show()

Среднее количество баллов (10 лучших)

plt.figure(figsize=(16,7))
g = sns.barplot(x=df.groupby("country").mean().sort_values(by="points",ascending=False).points.index[:10], y=df.groupby("country").mean().sort_values(by="points",ascending=False).points.values[:10], palette="gist_ncar")
plt.xlabel("Countries")
plt.ylabel("Average Points")
plt.title("Average Points Top 10")
ax=g
for p in ax.patches:
    ax.annotate("%.2f" % p.get_height(), (p.get_x() + p.get_width() / 2., p.get_height()),
                 ha='center', va='center', fontsize=11, color='gray', xytext=(0, 20),
                 textcoords='offset points')
plt.show()

plt.figure(figsize=(16,7))
g = sns.barplot(x=df.groupby("country").mean().sort_values(by="price",ascending=False).price.index[:10], y=df.groupby("country").mean().sort_values(by="price",ascending=False).price.values[:10], palette="Blues_r")
plt.xlabel("Countries")
plt.ylabel("Average Price (US Dollar)")
plt.title("Average Price Top 10")
ax=g
for p in ax.patches:
    ax.annotate("%.2f" % p.get_height(), (p.get_x() + p.get_width() / 2., p.get_height()),
                 ha='center', va='center', fontsize=11, color='gray', xytext=(0, 20),
                 textcoords='offset points')
plt.show()

Соотношение баллов и цены (10 лучших)

df2 = df[np.isfinite(df["price"])]
df2["points/price"] = df2.points / df2.price
df2.groupby("country").mean().sort_values(by="points/price", ascending=False)
plt.figure(figsize=(16,7))
g = sns.barplot(x=df2.groupby("country").mean().sort_values(by="points/price", ascending=False)["points/price"].index[:10], y=df2.groupby("country").mean().sort_values(by="points/price", ascending=False)["points/price"].values[:10], palette="jet_r")
plt.xlabel("Countries")
plt.xticks(rotation= 45, ha="right")
plt.ylabel("Points / Price Ratio")
ax=g
for p in ax.patches:
    ax.annotate("%.2f" % p.get_height(), (p.get_x() + p.get_width() / 2., p.get_height()),
                 ha='center', va='center', fontsize=11, color='gray', xytext=(0, 20),
                 textcoords='offset points')
plt.show()

plt.figure(figsize=(12,6))
sns.boxplot(x=df.points)
plt.title("Points Boxplot")
plt.show()

Лучшие вина по баллам (20 лучших)

top20Points = df.sort_values(by="points", ascending=False).head(20)
for i in range(20):
    print("{} / {} / {} / $ {}".format(top20Points.title.values[i], top20Points.country.values[i], top20Points.province.values[i], top20Points.price.values[i]))
    print("-----------------------------------------------------------------------------------------------------------------------")

Производитель 20 лучших вин

labels = top20Points.country.value_counts().index
values = top20Points.country.value_counts().values
trace = go.Pie(labels=labels, values=values)
iplot([trace])

Сорт винограда, из которого делают вино (10 лучших)

Теперь попробуем предсказать, выше среднего балл вина или нет. Мы сделаем это, используя описания вин, и мы будем использовать алгоритм НЛП.

df.variety.value_counts()
fig = {
  "data": [
    {
      "values": df.variety.value_counts().values[:10],
      "labels": df.variety.value_counts().index[:10],
      "name": "Variaty",
      "hoverinfo":"label+percent+name",
      "hole": .4,
      "type": "pie"
    },
    ],
  "layout": {
        "title":"Variaty",
        "annotations": [
            {
                "font": {
                    "size": 20
                },
                "showarrow": False,
                "text": "Grapes",
                "x": 0.5,
                "y": 0.5
            },
        ]
    }
}
iplot(fig)

Quinta do Noval 2011 Nacional Vintage (Port) / Португалия / Портвейн / $ 650.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Салон 2006 Le Mesnil Blanc de Blancs Brut Chardonnay (Шампанское) / Франция / Шампанское / $ 617.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Charles Smith 2006 Royal City Syrah (Columbia Valley (WA)) / США / Вашингтон / $80.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Biondi Santi 2010 Riserva (Brunello di Montalcino) / Италия / Тоскана / $ 550.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Cayuse 2008 Bionic Frog Syrah (Walla Walla Valley (WA)) / США / Вашингтон / $80.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Verité 2007 La Muse Red (Округ Сонома) / США / Калифорния / $ 450.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — —
Casa Ferreirinha 2008 Barca-Velha Red (Douro ) / Португалия / Дору / $ 450.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Château Léoville Las Cases 2010 Saint- Жюльен / Франция / Бордо / $359.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Шато Шеваль Блан 2010 Сент-Эмильон / Франция / Бордо / $1500.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Казанова ди Нери 2007 Черретальто (Брунелло ди Монтальчино) / Италия / Тоскана / $270.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Château Lafite Rothschild 2010 Pauillac / Франция / Бордо / $ 1500.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Château Léoville Barton 2010 Сен-Жюльен / Франция / Бордо / $ 150.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Chambers Rosewood Vineyards NV Редкий Мускат (Рутерглен) / Австралия / Виктория / $350.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Cardinale 2006 Каберне Совиньон (Долина Напа) / США / Калифорния / $200.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Круг 2002 Брют (Шампанское) / Франция / Шампанское / $ 259.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Louis Roederer 2008 Cristal Vintage Brut (Шампанское) / Франция / Шампанское / $ 250.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Авиньонези 1995 Occhio di Pernice (Vin Santo di Montepulciano) / Италия / Тоскана / 210 долларов. 0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Шато О-Брион 2014 Пессак-Леоньян / Франция / Бордо / $ 848.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — —
Tenuta dell'Ornellaia 2007 Masseto Мерло (Тоскана)/Италия/Тоскана/$460.0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Château Latour 2010 Pauillac / Франция / Бордо / $ nan
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Спасибо !

meanPoints = df.points.mean()
df["Above_Average"] = [1 if i > meanPoints else 0 for i in df.points]
# This process can takes long time. Because we have a lot of descriptions.
import re
import nltk
from nltk.corpus import stopwords
import nltk as nlp
descriptionList = list()
lemma = nlp.WordNetLemmatizer()
for description in df.description:
    description = re.sub("[^a-zA-Z]"," ",description) # We use regular expression to delete non-alphabetic characters on data.
    description = description.lower() # Since upper and lower characters are (e.g a - A) evaluated like they are different each other by computer we make turn whole characters into lowercase.
    description = nltk.word_tokenize(description) # We tokenized the statement
    description = [i for i in description if not i in set(stopwords.words("english"))] # We will remove words like 'the', 'or', 'and', 'is' etc.
    description = [lemma.lemmatize(i)for i in description] # e.g: loved => love
    description = " ".join(description) # Now we turn our words list into sentence again
    descriptionList.append(description)
from sklearn.feature_extraction.text import CountVectorizer
# We try to use most common 1500 words to make a prediction.
max_features = 1500
count_vectorizer = CountVectorizer(max_features=max_features) 
sparce_matrix = count_vectorizer.fit_transform(descriptionList)
sparce_matrix = sparce_matrix.toarray()
x = sparce_matrix
y = df.iloc[:,13].values
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 42)
from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(x_train, y_train)
# Prediction
y_pred = nb.predict(x_test)
print("Accuracy: {:.2f}%".format(nb.score(y_pred.reshape(-1,1), y_test)*100))

LinkedIn: «https://www.linkedin.com/in/canerdabakoglu/»

GitHub: https://github.com/cdabakoglu

Kaggle: https://www.kaggle.com/cdabakoglu

Визуализация обзоров вин и процесс естественного языка (NLP)