Импорт библиотек и чтение данных
Самые ранние археологические свидетельства винного винограда были обнаружены на участках в Грузии (ок. 6000 г. до н.э.), Иране (ок. 5000 г. до н.э.), Греции (ок. 4500 г. до н.э.) и Сицилии (ок. 4000 г. до н.э.), хотя есть более ранние свидетельства. вина, сделанного из ферментированного винограда среди других фруктов, потребляемых в Китае (ок. 7000–5500 до н.э.). Самые старые свидетельства производства вина были найдены в Армении (ок. 4100 г. до н.э.).
Измененное сознание, вызываемое вином, с самого начала считалось религиозным. Древние греки поклонялись Дионису или Вакху, а древние римляне продолжали его культ. Потребление ритуального вина было частью еврейской практики с библейских времен и, как часть евхаристии, посвященной Тайной вечере Иисуса, стало еще более важным для христианской церкви. Хотя ислам номинально запрещал производство или потребление вина, во время его Золотого века алхимики, такие как Гебер, впервые применили перегонку вина для медицинских и промышленных целей, таких как производство духов.
Производство и потребление вина увеличились, начиная с 15 века и далее в рамках европейской экспансии. Несмотря на разрушительное заражение филлоксерной вшью в 1887 году, современная наука и технология адаптированы, а промышленное производство вина и потребление вина теперь происходят во всем мире.
Наш набор данных содержит функции ниже. Мы проанализируем набор данных и используем процесс естественного языка, чтобы сделать прогноз.
СОДЕРЖАНИЕ
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)