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

Sparkify — это вымышленная популярная цифровая медиа-служба, созданная Udacity, похожая на Spotify или Pandora; многие пользователи пользуются их услугами каждый день. У него также есть два режима: использование бесплатного уровня или модели подписки премиум-класса, в которой пользователь может бесплатно обновить, понизить или отменить услугу по своему усмотрению. Важно, чтобы пользователю нравился сервис, лояльный к Sparkify.

Мы отслеживаем каждое событие; если пользователь воспроизводит песню, посещает определенную страницу или получает сообщение об ошибке, он генерирует много данных, которые можно легко увеличить до ГБ данных. К счастью, для больших объемов данных мы можем использовать технологии больших данных, такие как Spark, и мы можем анализировать и прогнозировать отток клиентов, чтобы они не уходили.

Что такое отток клиентов?

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

Определение проекта

Это реалистичный набор данных со Spark для разработки соответствующих функций для прогнозирования оттока. Использование Spark MLlib для создания моделей машинного обучения с большими наборами данных. Полный набор данных составляет 12 ГБ (s3n://udacity-dsnd/sparkify/sparkify_event_data.json), из которых вы можете проанализировать мини-подмножество 128 МБ (s3n://udacity-dsnd/sparkify/mini_sparkify_event_data.json)

Код этого проекта находится в репозитории Github.

создать искровую сессию:

# create a Spark session
spark = SparkSession \
        .builder \
        .master("local[*]") \
        .config("spark.ui.port",3000) \
        .appName("Sparkify") \
        .getOrCreate()

Загрузить и очистить набор данных

для мини-подмножества данных это небольшой набор данных для машинного обучения; он содержит 286 500 строк и следующие столбцы:

отсутствуют идентификаторы пользователей, обычно файлы cookie отключены или мы не можем отследить этого конкретного пользователя, тогда связанные с ним данные были удалены. Есть 225 уникальных пользователей, которые имеют следующее распределение:

Исследовательский анализ данных

Мы определили как отток посещения Cancellation Confirmation страницы, и данные были оценены в соответствии с этим, если у пользователя отток или нет.

23,11% пользователей отказались от услуги, а взаимодействие пользователей с посещенными страницами выглядит следующим образом:

Существует небольшая разница в поведении пользователей, у которых есть отток и нет от сервиса. Thumbs Up , Thumps down и Roll Advert , однако статистически значимой разницы по-прежнему нет. Эта оценка блочной диаграммы была выполнена для визуализации процентилей и среднего значения для проверки распределения.

Чтобы избежать переобучения модели, мы удалили страницы, связанные с аннулированием аккаунта, что означает отток.

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

hour_data_Churn =  spark.sql("""
    SELECT  
        Churn,
        dayOfWeek(from_unixtime( ts/1000.00)) dayofweek,
        hour(from_unixtime( ts/1000.00)) hour,
        count(*) count
    FROM Sparkify_churn_view
    group by 
        Churn,
        dayOfWeek(from_unixtime( ts/1000.00)) ,
        dayofmonth(from_unixtime( ts/1000.00)) ,
        hour(from_unixtime( ts/1000.00)) 
        
    
""").toPandas()
hour_data_scaled = scale_data_by_Churn(hour_data_Churn,'dayofweek','count')
hour_data_scaled.plot.bar(rot=0,title = 'event count(scaled) by day of week', figsize=(5,5))

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

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

Разработка функций

  1. Категориальные характеристики: все категориальные помечены как 1/0 (фиктивные столбцы), чтобы их можно было использовать в модели.
  • Пол
  • страницы (удалить Cancellation Confirmation и Cancel)
  • Браузер (извлечено из userAgent)
  • ОС (извлечено из userAgent)

2. Числовые характеристики: эти данные были масштабированы от 0 до 1.

  • среднее значение песен в сеансе
  • средняя продолжительность сеанса (в часах)
  • среднее значение событий (регистров) в сеансе
  • дни использования (поведение)

Все данные были сокращены пользователем.

в качестве последних столбцов имеем:

root
 |-- userId: string (nullable = true)
 |-- Churn: integer (nullable = true)
 |-- level: integer (nullable = true)
 |-- gender: integer (nullable = true)
 |-- lenght_avg_scaled: double (nullable = true)
 |-- day_of_weeks3n://udacity-dsnd/sparkify/sparkify_event_data.json)scaled: double (nullable = true)
 |-- day_of_weeks3n://udacity-dsnd/sparkify/mini_sparkify_event_data.jsonscaled: double (nullable = true)
 |-- day_of_weekCancellation Confirmationscaled: double (nullable = true)
 |-- day_of_weekThumbs Upscaled: double (nullable = true)
 |-- day_of_weekThumps downscaled: double (nullable = true)
 |-- day_of_weekRoll Advertscaled: double (nullable = true)
 |-- day_of_weekCancellation Confirmationscaled: double (nullable = true)
 |-- songs_by_session_scaled: double (nullable = true)
 |-- session_duration_scaled: double (nullable = true)
 |-- event_count_by_session_scaled: double (nullable = true)
 |-- total_sessions_scaled: double (nullable = true)
 |-- browser_chrome: integer (nullable = true)
 |-- browser_firefox: integer (nullable = true)
 |-- browser_ie: integer (nullable = true)
 |-- browser_mobile_safari: integer (nullable = true)
 |-- browser_safari: integer (nullable = true)
 |-- OS_linux: integer (nullable = true)
 |-- OS_mac_os_x: integer (nullable = true)
 |-- OS_ubuntu: integer (nullable = true)
 |-- OS_windows: integer (nullable = true)
 |-- OS_ios: integer (nullable = true)
 |-- page_about_scaled: double (nullable = true)
 |-- page_add_friend_scaled: double (nullable = true)
 |-- page_add_to_playlist_scaled: double (nullable = true)
 |-- page_downgrade_scaled: double (nullable = true)
 |-- page_error_scaled: double (nullable = true)
 |-- page_help_scaled: double (nullable = true)
 |-- page_home_scaled: double (nullable = true)
 |-- page_logout_scaled: double (nullable = true)
 |-- page_nextsong_scaled: double (nullable = true)
 |-- page_roll_advert_scaled: double (nullable = true)
 |-- page_save_settings_scaled: double (nullable = true)
 |-- page_settings_scaled: double (nullable = true)
 |-- page_submit_downgrade_scaled: double (nullable = true)
 |-- page_submit_upgrade_scaled: double (nullable = true)
 |-- page_thumbs_down_scaled: double (nullable = true)
 |-- page_thumbs_up_scaled: double (nullable = true)
 |-- page_upgrade_scaled: double (nullable = true)

Построение модели

Данные были разделены на наборы данных для обучения и тестирования, которым присвоены 70% и 30% соответственно. Для этого анализа используются следующие классификации:

  • Дерево решенийКлассификатор
  • GBTКлассификатор
  • Случайный ЛесКлассификатор
  • ЛинейныйSVC

на каждой из моделей выполняются следующие операции:

model = classifier.fit(df_train) #train the model
pred_test = model.transform(df_test) #predict the data
#evaluate the metrics 
metric_f1.evaluate(pred_test)

Оценка модели

Мы проверим производительность обученных моделей и выберем ту, которая имеет лучшую производительность; он основан на счете f1

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

Выводы

Модель Machine Learning и Spark позволяют обрабатывать большие объемы данных; это полезно для масштабируемого анализа и позволяет отслеживать пользователей. После того, как мы определили пользователей с возможным поведением оттока, хорошей бизнес-стратегией для уменьшения оттока будет AB/Test, чтобы оценить и привлечь больше пользователей, и это начнется с исследования текущей производительности, затем наблюдения и формулирования гипотезу и определить варианты для двух групп (новый стимул и контрольная группа с существующими) и оценить новое поведение.

Оценка F1 была метрикой для оптимизации, лучшим результатом для этого была классификация линейных опорных векторов (LinearSVC) с оценкой 0,8061; несмотря на время обучения, после обучения время прогнозирования не будет иметь значения для новых пользователей. Модель можно оценивать раз в неделю для выявления новых пользователей, а настройку модели и функции для извлечения можно оценивать раз в неделю.

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