Pandas и Scikit-Learn – это библиотеки Python, которые используются для анализа данных, машинного обучения и создания комплексных программных решений.

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

Структура:

  • понять бизнес-проблему, гипотезу
  • определиться с бизнес-метрикой
  • читать данные
  • исследовать и проверять данные
  • предварительно обработать данные
  • создать оценку метрик
  • моделировать или анализировать данные
  • соединение частей вместе и автоматизация

Если вы будете следовать этой схеме, вы создадите хорошие решения для науки о данных.

Теперь, чтобы следовать структуре (которая является мысленной структурой), вам нужно использовать Инструменты. Pandas — это инструмент, который помогает с этой структурой. Могут быть и другие инструменты, которые также могут подойти, но Pandas — лучший из них.

Понимание бизнес-проблемы:

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

Usually business problems start very vague. Example: 
A online real estate website is facing challenges with getting users to book home tours.

Когда проблема расплывчата и нуждается в более подробном описании, всегда начинайте с вопросов, чтобы узнать больше. Примеры вопросов: «На сайте уже много пользователей или это новый сайт?», «Существует ли уже существующий способ, которым пользователи узнают о бронировании туров на сайте?» «Есть ли какая-либо метрика, отслеживающая это».

Допустим, после того, как вы задали хорошие вопросы, вы переосмыслили бизнес-проблему, но теперь с гораздо большей детализацией.

Example of business problem after clarifying details:
A online real estate website is facing challenges with getting users to book home tours. The website is 5 year old and has a good user base. The "book tours" option is shown as a button on the home listing page. The metric that keeps track of this problem is "total tours books" and "average tours books per user".

Бизнес-задача будет либо проблемой предсказания, либо проблемой случайного вывода. Оба они разные и требуют разных подходов, поэтому важно понимать, с каким из них вы имеете дело.

Формирование гипотезы высокого уровня:

После того, как бизнес-проблема понята и детализирована, следующим шагом является создание гипотезы решения на высоком уровне. Продолжая приведенный выше пример, нашим решением может быть гипотеза, как показано ниже:

Hypothesis 1: We can create a model to find highly correlated user and home activity behavior that lead to booking a tour.
Hypothesis 2: The low number of "total tours books" and "average tours books per user" can be improved via creating an email campaign.
Hypothesis 3: The low number of "total tours books" and "average tours books per user" can be improved via having a "book tour" option on the home page.
Hypothesis 4: The low number of "total tours books" and "average tours books per user" can be improved via having a chat bot prompt a home tour.
Hypothesis 5: The low number of "total tours books" and "average tours books per user" can be improved via placing the "book tour" button on the upper right hand of the home listing picture".

Выбор показателя:

Прежде чем слишком углубляться в решение конкретной проблемы, важно иметь в общих чертах метрику начала бизнеса с севера. В приведенном выше случае, например, бизнес-метрика может быть «общее количество туров» и «среднее количество туров на пользователя». Это то, для чего нужно оптимизировать бизнес-задачу. Конечно, наряду с этим будут и дополнительные показатели, такие как «активные пользователи за день».

Чтение данных:

Чтение данных в большинстве случаев является самым первым шагом решения. Вы будете читать много данных. Это могут быть csv-файлы, текстовые файлы, паркетные файлы и т. д.

#csv files
dataframe = pd.read_csv(“file_path/data_file.csv, sep=”,“)
dataframe = pd.read_csv(“file_path/data_file.csv, sep=”|“)
#text files
dataframe = pd.read_csv(“file_path/data_file.txt, sep=”\t“)
#json files
dataframe = pd.read_json(“file_path/data_file.json, sep=”\t“)

Изучение и проверка данных:

Проверьте распространение данных, высокий уровень:

dataframe.describe()

Визуализация распределения данных:

import matplotlib.pyplot as plt
plt.hist(dataframe[“column1”])
plt.show()
Histogram plot
y-axis
^     |----|
|   __|    |
|  |  |    |
|__|  |    |___
|__|__|____|__ |_______> x-axis

Check how the distribution looks. Is it Normal? Is it bi-modal? It has extreme outliers? Depending on that, your further analysis would need to adjust.
Scatter plot
plt.plot(dataframe[“column1”], dataframe[“column2”])
plt.show()
y-axis
^
|          '  ' ' '
|      ' ' ' '
|   ' '
| '' 
|'__________________> x-axis
What relationship do you see between two variables? Is it linearly correlation? or is it non-linear? is there a visible pattern? Depending on that, your further analysis would need to adjust.

Предварительная обработка данных:

После чтения данных нам необходимо предварительно обработать данные или очистить их. Это требует сначала понимания формы и деталей высокого уровня данных и, соответственно, внесения изменений.

Вот несколько примеров предварительной обработки и очистки:

Фильтрация данных:

when you need filter and drop rows that do not meet a condition:
dataframe_filtered = dataframe[data_frame_csv[“column_1”] < 2000]
when you need to filtering and impute data that do not meet a condition:
dataframe_filtered = dataframe.where(data_frame_csv[“column_1”] < 2000, other=0)
a little more swiss knife, impute with a dynamic calculation:
dataframe_filtered = dataframe.where(data_frame_csv[“column_1”] < 2000, other=lambda x:x * 2)

Изменить данные для определенных строк, соответствующих условию:

Когда вам нужно изменить значения для определенных строк, которые соответствуют заданному вами условию. Здесь пригодится loc — способ индексации строк.

dataframe_imputed = dataframe.loc[dataframe[‘column1’ > 10, ‘column1’] = 0
dataframe_imputed = dataframe.loc[dataframe[‘column1’ < 10, ‘column1’] = 1
alternatively, you can use np.where() for changing values for rows that meet a specific condition. This more useful as it always allows to provide values for rows that do not meet a condition.
dataframe[‘column1’] = np.where(dataframe[‘column1’] < 10, 1, dataframe[‘column1’])

Изменить тип данных столбцов:

dataframe[“column_1”] = dataframe[“column_1”].astype(str)
dataframe[“column_1”] = dataframe[“column_1”].astype(int)
Change column names:

если вы хотите изменить имена столбцов в кадре данных

dataframe.columms = [“column_name1”, “column_name2”, ….]

Денормализация

Денормализация — большая тема в предварительной обработке.

объединение разных фреймов данных

dataframe1.join(dataframe2, how=”inner”, on=”column1")
dataframe1.join(dataframe2, how=”inner”, left_on=”column1", right_on=”column2", r_suffix=”_y”)

Объединение

dataframe1.concat(dataframe2, axis=0) — vertically concatenate
[ df1  ]
   |
[ df2  ]
dataframe1.concat(dataframe2, axis=1) — horizontal concatenate
[ df1  ] -- [  df2 ]

Агрегация

dataframe1.groupby(‘column1’, as_index=False).agg({‘column2’: ‘sum’. ‘column3’: ‘mean’})

Группирование столбцов

можно использовать loc для создания сегментов для столбца на основе определенных условий.

Обработка пустых значений

dataframe.fillna(0) — fill all na values with 0
dataframe.dropna() — drop rows with na values

Моделирование или анализ

Simple correlation
dataframe['column1'].corr(dataframe['column2'])
dataframe['column1'].corr(dataframe['column2'], method_type="pearson")
Linear Regression
from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(np.array(dataframe['columns1234']).reshape(-1, 1),np.array(dataframe['column5']).reshape(-1, 1))
model.coef_
output = array([[0.99569654]])
Logistic Regression
from sklearn.linear_model import LogisticRegression
model = LogisticRegression().fit(np.array(dataframe['columns1234']).reshape(-1, 1),np.array(dataframe['column5']).reshape(-1, 1))
#column5 above MUST be binary
model.coef_
output = array([[0.99569654]])
Decision Tree
from sklearn import tree
model = tree.DecisionTreeClassifier().fit(np.array(dataframe['columns1234']).reshape(-1, 1),np.array(dataframe['column5']).reshape(-1, 1))
model.predict(np.array(dataframe['column5']).reshape(-1, 1))
model.predict_proba(np.array(dataframe['column5']).reshape(-1, 1))

Метрики и оценка

Будьте осторожны с метриками. Метрики помогут вам. Основные метрики и метрики ограждения.

Low level offline model level metrics:
Numeric data — RMSE, MAE, R2 score.
Classification label data - Accuracy, Precision, Recall, AUC, F-Score.
Precision is used when cost of missing out on a actual 1 is not that critical but 1s need to be accurate. Recall is used when missing out on a actual 1 is very critical.
For these analysis metric, from sklearn.metrics package offers many popular metrics such as accuracy, precision, recall, RMSE, MAE, R2 score.
High level business level metric
Acquisition, Engagement, Retention, Revenue. Imagine the customer funnel. Also, cohorts are very important when calculating these metrics.
Examples:
Let's take an online real estate website as an example business cases.
Acquisition metrics examples:
- Email Invite Acceptance Rate = Number of sign ups / Number of invites sent (cohort analysis)
- Acceptance Rate = Number of sign ups / Number of invites sent
Engagement metrics examples:
- Average Sessions Per User
- Average Sessions Time Per User
- Average Home Views Per User
- Average Home Tours Per User
- Average Active Homes Sales Per Month
- Average Home Views
- Average Home Sales
Retention metrics examples:
- Daily Active 
       -Users
       -Homes
       -Home Owners
- Monthly Active 
       -Users
       -Homes
       -Home Owners
- Yearly Active 
       -Users
       -Homes
       -Home Owners
Revenue metrics examples:
- Total revenue
- Total monthly revenue
- Average Revenue Per Home Sale
- Average Revenue Per User
- Average Revenue Per Region

Other forms of evaluation include Survivor Analysis:
Survivor analysis helps understand how the distribution of "initiation -> event" is for something. This is useful to not find if, but how much time something takes to converge to an event.
Example: how much time does a car tire take to reach it's half life?
% of samples - y-axis
   ^
80%|                '   
   |             
   |            
5% |          '  '
   |  '   '    
   |__1___2___3__4__5_______> time to half life (years) - x-axis

If you analyze the chart above, you see that majority of the tires reach half life at year 5. You can calculate the area under curve for specific ranges and get the probability density. 

Автоматизация

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