Добавление перспективы в науку о данных

Одна из основных вещей, которая отличает нас (homo-sapiens) от других видов животных, - это наша способность воображать, определять закономерности и принимать действенные решения на основе этого понимания. Это помогло нам выжить в самых тяжелых условиях и покорить эту планету. Мы сделали это путем эффективной «обработки» доступных нам «данных». В первые дни люди вырабатывали новые стратегии выживания, выявляя закономерности в том, как хищники нападали на них. Наши предки использовали это как «данные для обучения» и открыли способы избежать атак хищников и даже контратаковать их. Точно так же они наблюдали данные о естественных процессах, таких как «изменения погоды», «лечебные свойства трав», «приготовление пищи на огне» и т. Д., И получили действенные идеи для продвижения вверх по эволюционной цепочке. Итак, данные всегда были там в той или иной форме. И люди всегда использовали данные в своих интересах. «Наука о данных» сегодня может быть модным словом, но люди использовали эту науку о данных с доисторических времен. Фактически, наука о данных позволила нам достичь того уровня, на котором мы находимся сегодня. Говоря простым языком, если вам нужно дать определение «наука о данных», это будет означать не более чем «наука об использовании данных для получения действенных выводов, чтобы сделать дела обстоят лучше ».

В наши дни «делать вещи лучше» может означать «делать покупки лучше», «лучше понимать поведение клиентов», «давать более точные рекомендации», «прогнозировать результаты» и т. Д. Использование данных и применение науки о данных принципов, помогает нам достичь всего этого и многого другого.

Чтобы построить твердое понимание любой области или концепции, мы должны попытаться понять значения основных терминов, используемых в этой области. В области науки о данных чрезмерно используются следующие 3 термина: статистика, интеллектуальный анализ данных и машинное обучение.

Статистика:

Допустим, у вас есть продуктовый магазин, в котором вы продаете какие-то продукты. Чтобы лучше понять, как работает ваш бизнес, вы записываете количество проданных продуктов каждый день. Поскольку у вас есть данные о продажах, вы можете узнать свои общие ежемесячные продажи, список 10 лучших продуктов, которые продаются больше, чем другие, список основных клиентов, средние продажи за неделю или средние продажи в конкретный день и т. Д. дать вам представление о том, как обстоят дела у вашего бизнеса. И в этом вся простая статистика.

Статистика - это просто наука о сборе, систематизации, обобщении, анализе и интерпретации данных.

Давайте разберемся с этим на примере. Репозиторий машинного обучения UCI предоставил набор данных, содержащий транзакции продаж, происходящие в период с 1 декабря 2010 г. по 9 декабря 2011 г. для зарегистрированной в Великобритании и зарегистрированной онлайн-розничной торговли вне магазинов. (Согласно репозиторию машинного обучения UCI, эти данные были предоставлены доктором Дацином Ченом, директором: Public Analytics group. Chend ‘@’ lsbu.ac.uk, Школа инженерии, Лондонский университет Южного берега, Лондон SE1 0AA, Великобритания.)

Вот некоторые из интересных вопросов, на которые можно ответить с помощью статистического подхода:

  • Каково общее количество уникальных клиентов, совершивших транзакции?
  • Кто входит в топ-10 клиентов с максимальным количеством заказов?
  • Кто входит в 10 крупнейших клиентов с максимальными расходами?
  • Каковы были средние продажи в каждый месяц каждого года?

Ответы на эти вопросы могут дать некоторое представление о бизнесе.

Python 3 / Jupyter Notebook использовался для исследования данных и ответа на вышеуказанные вопросы. (Ссылка на github для полной записной книжки была предоставлена ​​в конце. Однако мы подробно рассмотрим каждый раздел кода ниже.)

Позволяет импортировать необходимые библиотеки Python и загружать данные в фреймворк Pandas

#Import data
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns 
color = sns.color_palette()

df_retail_sales = pd.read_csv(‘./input/data.csv’,encoding="ISO-8859–1")

Проверить информацию об этом фрейме данных

df_retail_sales.info()

На выходе

Данные состоят из 8 атрибутов, которые определены ниже:

InvoiceNo: представляет собой уникальный номер заказа или номер транзакции.
StockCode: представляет собой уникальный код продукта, который был продан.
Описание: описывает проданный продукт.
Количество: Это количество единиц продукта, проданных в транзакции
InvoiceDate : Дата транзакции
UnitPrice: Цена продажи 1 единицы продаваемого продукта
CustomerID: Он представляет Клиент, совершивший транзакцию
Страна: Название страны, в которой проживает клиент.

Давайте выполним базовые задачи по очистке данных - удалим строки, которые имеют значения NULL для атрибута, и удалим строки с отрицательными значениями в столбце Quantity (отрицательные значения не имеют никакого смысла для столбца Quantity)

df_retail_sales['InvoiceDate'] = pd.to_datetime(df.InvoiceDate, format='%m/%d/%Y %H:%M')
df_retail_sales = df_retail_sales[df_retail_sales.Quantity > 0]
retail_sales = df_retail_sales.dropna()

Теперь давайте займемся базовым проектированием функций - это причудливый способ сказать, что мы добавляем новый столбец или изменяем существующий столбец в наших данных, что может быть более полезным. Например, в нашем случае мы можем добавить новый столбец «AmountSpent», который будет произведением Quantity и UnitPrice. Мы также должны добавить отдельные столбцы для Год, Месяц и День, которые могут быть получены из InvoiceDate. Это поможет нам рассчитать данные по годовым, ежемесячным и дневным продажам. (Помните… .. вот что такое основная статистика!)

retail_sales['AmountSpent'] = retail_sales['Quantity'] * retail_sales['UnitPrice']
retail_sales.insert(loc=6, column='YearMonth', value=retail_sales['InvoiceDate'].map(lambda x: 100*x.year + x.month))
retail_sales.insert(loc=7, column='Month', value=retail_sales.InvoiceDate.dt.month)
retail_sales.insert(loc=8, column='Day', value=(retail_sales.InvoiceDate.dt.dayofweek)+1)
retail_sales.insert(loc=9, column='Hour', value=retail_sales.InvoiceDate.dt.hour)

Наш новый фрейм данных «retail_sales» выглядит следующим образом:

retail_sales.info()

Теперь попробуем ответить на наши вопросы.

Каково общее количество уникальных клиентов, совершивших транзакции?

retail_sales['CustomerID'].nunique()

4339

Кто входит в первую 10 клиентов с максимальным количеством заказов?

orders = retail_sales.groupby(by=['CustomerID'], as_index=False)['InvoiceNo'].count()
orders.rename(columns={'InvoiceNo': 'Cnt_Invoices'}, inplace=True)
orders=orders.sort_values(by='Cnt_Invoices', ascending=False).head(10)
orders.plot(x="CustomerID", y=["Cnt_Invoices"], kind="bar")

Кто входит в 10 крупнейших клиентов с максимальными расходами?

spending = retail_sales.groupby(by=['CustomerID'], as_index=False)['AmountSpent'].sum()
spending.sort_values(by='AmountSpent', ascending=False).head(10)
spending.plot(x="CustomerID", y=["AmountSpent"], kind="bar")

Каковы были средние продажи за каждый месяц?

ax = retail_sales.groupby(‘YearMonth’)
[‘AmountSpent’].mean().sort_index().plot(‘bar’,color=color[1],figsize=(15,6))
ax.set_xlabel(‘Month’,fontsize=10)
ax.set_ylabel(‘Avg Sales’,fontsize=10)
ax.set_title(‘Sales (01-Dec 2010–09-Dec-2011)’,fontsize=14)
ax.set_xticklabels((‘Dec10’,’Jan11',’Feb11',’Mar11',’Apr11',’May11',’Jun11',’July11',’Aug11',’Sep11',’Oct11',’Nov11',’Dec11'), rotation=’horizontal’, fontsize=11)
plt.show()

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

Интеллектуальный анализ данных:

Взяв тот же пример с данными о розничных продажах, мы можем попытаться найти:

  1. Лояльные клиенты (часто совершающие покупки)
  2. Клиенты, которые неактивны (не часто делают покупки)
  3. Самая ранняя и последняя дата заказа каждого клиента.
  4. Группа товаров, которые покупают определенные группы людей в определенные дни года.

Интеллектуальный анализ данных - это процесс автоматического обнаружения полезной информации в больших хранилищах данных.

Давайте создадим новый фрейм данных для клиентов и попробуем найти часть этой информации.

customer_data=retail_sales.groupby(‘CustomerID’).agg(
 # Get count of orders column for each customer
 TotalOrders=(‘InvoiceNo’, ‘count’),
 # Get total amount spent for each customer
 TotalSpending=(‘AmountSpent’, ‘sum’),
 # Get earliest order date for each customer
 EarliestInvoice=(‘InvoiceDate’, ‘min’),
 # Get latest order date for each customer 
 LatestInvoice=(‘InvoiceDate’, ‘max’)
)
customer_data.head()

Два новых атрибута: Самый ранний счет и Последний счет можно использовать, чтобы определить, является ли клиент постоянным или бездействующим. Если разница между этими двумя датами небольшая, покупатель часто совершает покупки, в противном случае он бездействует.

Столбец «Общие расходы» можно использовать для сбора информации о крупных спонсорах. Эту информацию можно объединить с подсчетом StockCode (Product), чтобы узнать, какие продукты продаются чаще.

Машинное обучение:

Скажем так - ваши клиенты оставляют вам отзывы о своих покупках. Чтобы получить практическую информацию из этой обратной связи, вы пишете компьютерную программу, которая принимает ее в качестве входных данных и возвращает вам оценку чувств или настроений клиентов по поводу вашего продукта. Эти настроения могут помочь вам понять потребности ваших клиентов и предпринять некоторые действия для их удовлетворения. По мере того, как количество покупок у разных клиентов растет, а новые отзывы продолжают поступать, ваша программа становится лучше улавливать настроения ваших клиентов. Это машинное обучение.

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

Говоря простым языком, статистические методы используются для обучения вашего компьютера (или компьютерной программы) учиться, тем самым помогая вам анализировать свои данные, чтобы находить полезные закономерности и полезные идеи.

Код для обсуждаемых примеров доступен на Github.