A. Общее описание: предсказание оттока клиентов

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

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

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

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

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

Задания разделены на группы по темам:

  1. Этот текст.
  2. Владение Python и numpy.
  3. Визуализация.
  4. Владение библиотекой pandas.
  5. Владение языком SQL.
  6. Предварительный анализ указанного набора данных.
  7. Основная задача предсказания.

Баллы за все задания суммируются.


Задача B1. Add

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:6  

Условие

Требуется написать на языке Python функцию Add(x, y), которая принимает два числа и возвращает их сумму. Пример использования функции в примерах тестов.

Формат выходных данных

Код решения должен содержать только определение и реализацию функции. Он не должен ничего выводить.

Примеры тестов

Стандартный вход Стандартный выход
1 x, y = 2, 3 print(Add(x, y))
5
2 print(Add(10, 11))
21

Задача B2. Норма L1

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:5  

Условие

Дан вектор произвольной размерности. Необходимо посчитать так называемую норму L1 для этого вектора. Норма L1 — это сумма абсолютных величин компонент вектора (абсолютная величина вычисляется функцией abs).

Формат входных данных

Входные данные содержат целые числа — компоненты вектора, записанные в одной строке через пробел.

Формат выходных данных

Выходные данные должны содержать одно целое число — норму L1 этого вектора.

Примеры тестов

Стандартный вход Стандартный выход
1
3 4
7
2
10 -20 3
33

Задача B3. Метрика F-beta

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:10  

Условие

Требуется на языке Python реализовать функцию, вычисляющую значение метрики F-beta.

Функция должна иметь следующий интерфейс


import numpy as np

def fbeta_score(y_true: np.ndarray, y_pred: np.ndarray, *, beta: float) -> float:
    """
    Вычисляет метрику F-beta для задачи бинарной классификации.

    Параметры:
        y_true: одномерный массив булевых значений. Истинные значения целевой перменной.
        y_pred: одномерный массив булевых значений. Предсказанные значения целевой переменной.
        beta: вещественное число. Параметр `beta` метрики.

    Возвращаемое значение:
        fbeta_score: вещественное число. Значение метрии F-beta.
    """
    pass

При решении задачи запрещено использовать функцию sklearn.metrics.fbeta_score.

Формат выходных данных

Код решения должен содержать импортируемые модули, определение и реализацию функции.

Ограничения

Длина входных массивов не превышает 1000000 элементов.

Примеры тестов

Стандартный вход Стандартный выход
1
y_true = np.array([True, True, False, True, True,  False, True, True, False])
y_pred = np.array([True, True, True, True, False, True, True, True, True])
print(fbeta_score(y_true, y_pred, beta=2))
0.78125

Задача C1. График плотности распределения

Входной файл:Стандартный вход   Ограничение времени:3 сек
Выходной файл:output.png   Ограничение памяти:512 Мб
Максимальный балл:10  

Условие

Требуется реализовать на языке Python функцию, отображающую оценку плотности распределения столбца данных. Функция должна иметь следующий интерфейс


import pandas as pd
from typing import Union

def draw_pdf(data: pd.DataFrame, column: str, bins: Union[int, str] = 10) -> None:
    """
        Отображает оценку плотности распределения столбца данных

        Параметры:
            data: таблица данных.
            column: название столбца для отображения.
            bins: спецификация интервалов разбиения, аналогично matplotlib.pyplot.hist.
    """
    pass

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

Формат выходного файла

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

Примеры тестов

Стандартный вход Выходной файл (output.png)
1 data.csv
data = pd.read_csv('data.csv') plt.figure(figsize=(10, 5)) plt.rcParams.update({'font.size': 14}) draw_pdf(data, 'Account length', 'sturges') plt.savefig('output.png')
См. изображение в тексте задачи

Задача C2. Столбчатая диаграмма

Входной файл:Стандартный вход   Ограничение времени:3 сек
Выходной файл:output.png   Ограничение памяти:512 Мб
Максимальный балл:8  

Условие

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


import pandas as pd

def draw_bars(data: pd.DataFrame, column: str, target_column: str) -> None:
    """
        Отображает долю целевых значений `target_column` при каждом уникальном значении категориального признака `column` в виде слолбчатой диаграммы.

        Параметры:
            data: таблица данных.
            column: название категориального признака.
            target_column: название целевой переменной.
    """
    pass

Стиль оформления графика (цвета, границы, подписи, ширина колонок и т.п.) должен соответствовать представленному ниже. Цвета столбцов должны быть получены из палитры tab10. Вклад долей менее 5% не должен быть подписан на графике.

Формат выходного файла

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

Примеры тестов

Стандартный вход Выходной файл (output.png)
1 data.csv
data = pd.read_csv('data.csv') plt.figure(figsize=(10, 5)) plt.rcParams.update({ 'font.size': 8 }) draw_bars(data, 'Customer service calls', 'Churn') plt.savefig('output.png')
См. изображение в тексте задачи

Задача D1. Деловые люди (Pandas)

Автор:А. Могилёвкин   Ограничение времени:1 сек
Входной файл:data.csv   Ограничение памяти:256 Мб
Выходной файл:Стандартный выход  
Максимальный балл:4  

Условие

Требуется на языке Python реализовать функцию get_businessmen(df: pd.DataFrame) Функция принимает на вход объект DataFrame библиотеки Pandas и возвращает DataFrame пользователей, совершивших 20 и более международных звонков.

В объекте DataFrame присутствуют следующие поля:

Функция имеет следующий интерфейс


import pandas as pd

def get_businessmen(df: pd.DataFrame) -> pd.DataFrame:
    """
    Возвращает DataFrame, оставляя в нём только пользователей из df,
    совершивших 20 и более международных звонков

    Параметры:
      df: исходный DataFrame

    Возвращаемое значение:
      отфильтрованный DataFrame
    """
    pass
        

Формат выходных данных

Код решения должен содержать импортируемые модули, определение и реализацию функции.

Примеры тестов

Входной файл (data.csv) Стандартный выход
1
# Пример вызывающего кода
import pandas as pd

df = pd.read_csv('data.csv')
businessmen = get_businessmen(df)
 

Задача D2. Соединение таблиц (Pandas)

Автор:А. Могилёвкин   Ограничение времени:1 сек
Входной файл:data.csv   Ограничение памяти:256 Мб
Выходной файл:Стандартный выход  
Максимальный балл:4  

Условие

Требуется на языке Python реализовать функцию join_dataframes(users_df: pd.DataFrame, states_df: pd.DataFrame) Функция принимает на вход два объекта DataFrame и возвращает объединённый DataFrame пользователей и штатов.

Пример таблицы штатов

Пример таблицы пользователей

Функция имеет следующий интерфейс


import pandas as pd

def join_dataframes(data: pd.DataFrame, states: pd.DataFrame) -> pd.DataFrame:
    """
    Возвращает объединённый DataFrame

    Параметры:
      data: DataFrame с пользователями
      states: DataFrame с штатами

    Возвращаемое значение:
      объединённый DataFrame, содержащий поля 'Total day calls', 'Total night calls', 'State' в данном порядке
    """
    pass
        

Формат выходных данных

Код решения должен содержать импортируемые модули, определение и реализацию функции.

Примеры тестов

Входной файл (data.csv) Стандартный выход
1
import pandas as pd

states = pd.read_csv('states.csv', index_col='ID')
data = pd.read_csv('data.csv', index_col='ID')
joined_df = join_dataframes(data, states)
    Total day calls  Total night calls State
ID                                          
1               110                 91    OK
2               123                103    OK
3               114                104    OK
4                71                 89    OK
5               113                121    OK
6                98                118    KS
7                88                118    OH
8                79                 96    NJ
9                70                 12    OK
10               61                311    AL

Задача D3. Самый деловой штат (Pandas)

Автор:А. Могилёвкин   Ограничение времени:1 сек
Входной файл:data.csv   Ограничение памяти:256 Мб
Выходной файл:Стандартный выход  
Максимальный балл:4  

Условие

Требуется на языке Python реализовать функцию get_busiest_states(data: pd.DataFrame)Функция принимает на вход объект DataFrame и возвращает Series, отсортированный по убыванию, в котором штаты являются индексами, а значения — количеством международных звонков в данном штате.

Функция имеет следующий интерфейс


import pandas as pd

def get_busiest_states(data: pd.DataFrame) -> pd.Series:
    """
    Вычисляет Series, в котором индексы - наименования штатов, а значение - количество совершённых международных звонов. 

    Параметры:
      data: DataFrame с данными

    Возвращаемое значение:
      Series отсортированный по убыванию значений.
    """
    pass
        

Формат входного файла

Пример датасета

Формат выходных данных

Код решения должен содержать импортируемые модули, определение и реализацию функции.

Примеры тестов

Входной файл (data.csv) Стандартный выход
1
import pandas as pd
df = pd.read_csv('data.csv')
busiest_states = get_busiest_states(df)
      
State
OH    12
KS     6

Задача E1. Деловые люди (SQL)

Входной файл:data.csv   Ограничение времени:1 сек
Выходной файл:test.log   Ограничение памяти:256 Мб
Максимальный балл:4  

Условие

Требуется на языке SQL реализовать запрос, который обращается к таблице data и возвращает список ID пользователей, совершивших 20 и более международных звонков.

В таблице data присутствуют следующие поля:

Решение следует представить в виде текстового файла, содержащего единственный SQL-запрос. При отправке следует выбирать среду разработки Python.

Ограничения

Для работы с базой данных используется SQLite3.


Задача E2. Соединение таблиц (SQL)

Автор:А. Могилёвкин   Ограничение времени:1 сек
Входной файл:data.csv   Ограничение памяти:256 Мб
Выходной файл:test.log  
Максимальный балл:4  

Условие

Требуется на языке SQL реализовать запрос, который объединяет таблицы users и states по id штата.

В таблице users присутствуют следующие поля:

В таблице states присутствуют следующие поля:

Решение следует представить в виде текстового файла, содержащего единственный SQL-запрос. При отправке следует выбирать среду разработки Python.

Формат выходного файла

Результирующая таблица должна содержать поля ID, Total day calls, Total night calls, State.

Ограничения

Для работы с базой данных используется SQLite3.


Задача E3. Самый деловой штат (SQL)

Автор:А. Могилёвкин   Ограничение времени:1 сек
Входной файл:data.csv   Ограничение памяти:256 Мб
Выходной файл:test.log  
Максимальный балл:4  

Условие

Требуется на языке SQL реализовать запрос, вычисляющий количество международных звонков в каждом штате.

В таблице users присутствуют следующие поля:

Решение следует представить в виде текстового файла, содержащего единственный SQL-запрос. При отправке следует выбирать среду разработки Python.

Формат выходного файла

Результирующая таблица должна содержать поля следующие поля

Таблица также должна быть отсортирована по убыванию по полю Count

Ограничения

Для работы с базой данных используется SQLite3.


Задача F1. Предварительный анализ: статистика

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:2  

Условие

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



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

Поле State содержит названия штатов, подсчитайте количество уникальных значений этого признака.

Задача F2. Предварительный анализ: корреляция

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

На основании корреляционного анализа из набора данных можно исключить поля: State Account length Area code International plan Voice mail plan Number vmail messages Total day minutes Total day calls Total day charge Total eve minutes Total eve calls Total eve charge Total night minutes Total night calls Total night charge Total intl minutes Total intl calls Total intl charge Customer service calls Churn


Задача G1. Предсказание оттока клиентов: классификация

Входной файл:test.csv   Ограничение времени:1 сек
Выходной файл:submission.csv   Ограничение памяти:512 Мб
Максимальный балл:100  

Условие

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

Вы можете использовать базовое решение в качестве начальной точки вашей работы.

Данные

Метрика качества

Точность предсказания оценивается с использованием метрики F-beta с параметром β = 2.

Баллы за задачу начисляются по следующей формуле score = 100f2_score(y_true, y_pred)

Формат входного файла

В датасете собраны данные о пользователях телекоммуникационной компании:

Формат выходного файла

В качестве решения необходимо загрузить файл в формате csv с единственным полем Churn — предсказанные на тестовой выборке значения целевой переменной. Разделителем целой и дробной части в числах должна быть точка.


Задача G2. Предсказание оттока клиентов: загрузка решения

Максимальный балл:10   Ограничение времени:1 сек
  Ограничение памяти:512 Мб

Условие

В данной задаче необходимо отправить ссылку код для решения задачи классификации, например в виде jupyter notebook. В тексте решения необходимо отметить, какими методами были получены результаты, отправленные в систему, например указав в комментарии перед созданием файла для отправки id попытки, в которую был отправлен этот файл:

# Попытка 654321
submit = pd.DataFrame()
submit['Churn'] = my_model.predict(...)
submit.to_csv('submission.csv')

Формат выходных данных

В выходных данных укажите ссылку на решение (Google Colab, Github, Google Drive и др.).


0.988s 0.014s 67