Найти тему

Исследование отзывов в App Store: как извлекать, классифицировать и анализировать мнения пользователей с помощью API App Store Connect

Авторы:
Назаров Александр - ведущий аналитик компании Лайм Эйч Ди;
Макаров Илья - продуктовый аналитик компании Лайм Эйч Ди.


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

В этой статье мы рассмотрим:

  • Авторизацию и доступ к данным: Как авторизоваться и получить доступ к данным в App Store Connect.
  • Извлечение отзывов: Процесс извлечения отзывов для разных аккаунтов на примере Lime HD и Lime X.
  • Категоризацию отзывов: Как автоматически классифицировать отзывы на основе ключевых слов и фраз.
  • Агрегацию и экспорт данных: Методы агрегации данных по отзывам и оценкам, а также их экспорт в Google Sheets для дальнейшего анализа.

Давайте погрузимся в мир отзывов App Store и узнаем, как сделать процесс их анализа более эффективным!

Импорт необходимых библиотек

Перед началом работы убедитесь, что у вас установлены все необходимые библиотеки. В нашем случае мы будем использовать такие библиотеки как pandas, numpy, requests и другие.

```python

import pandas as pd

import numpy as np

import io

import json

import jwt

import requests

import time

from urllib import parse

from sqlalchemy import create_engine

import warnings

from tqdm import tqdm_notebook

import re

from oauth2client.service_account import ServiceAccountCredentials

import gspread

from gspread_dataframe import set_with_dataframe

```

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

Авторизация и получение доступа к данным

Для извлечения отзывов из App Store Connect нам потребуется авторизоваться. Это можно сделать с помощью специального токена.

Авторизация в Google Cloud SDK Shell

Если вы храните свои данные или ключи авторизации на Google Drive, вам потребуется авторизоваться в Google Cloud SDK Shell. Это можно сделать следующим образом:

```python

scope = ["https://spreadsheets.google.com/feeds",'https://www.googleapis.com/auth/spreadsheets',"https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive"]

creds = ServiceAccountCredentials.from_json_keyfile_name('path_to_your_credentials.json', scope)

client = gspread.authorize(creds)

```

Замените `'path_to_your_credentials.json'` на путь к вашему файлу учетных данных.

Создание токена для App Store Connect

Для работы с API App Store Connect вам потребуется создать JWT (JSON Web Token). Этот токен используется для аутентификации вашего приложения при обращении к API.

```python

def create_token():

expiration_in_minutes = int(time.time() + 120)

payload = {

"iss": issuer_id, # issuer ID со страницы ключей App Store Connect

"exp": expiration_in_minutes, # время жизни токена

"aud": "appstoreconnect-v1" # Версия API

}

headers = {

"alg": "ES256", # Тип шифрования ключа всегда "ES256"

"kid": key_id, # ID ключа со страницы ключей App Store Connect

"typ": "JWT" # Тип токена всегда "JWT"

}

f = open("path_to_your_private_key.p8", "r")

private_key = f.read()

token = jwt.encode(payload=payload, key=private_key, algorithm="ES256", headers=headers)

return token

```

Извлечение отзывов из App Store Connect

После успешной авторизации можно приступить к извлечению отзывов. Для этого мы создадим функцию, которая будет отправлять GET-запросы к App Store Connect.

Функция для отправки GET-запросов:

```python

def get_customer_reviews(token: str, link, params):

r = requests.get(f"{link}",

headers={"Authorization": f"Bearer {token}"}, params=params)

return r

```

Эта функция принимает токен, ссылку и параметры запроса, отправляет GET-запрос и возвращает ответ.

Функция для извлечения отзывов:

```python

def get_review_response():

# Инициализация пустой таблицы для хранения отзывов

review_data = pd.DataFrame(columns=['id','attributes.rating','attributes.title','attributes.body','attributes.reviewerNickname','attributes.createdDate',

'attributes.territory','relationships.response.links.self','relationships.response.links.related'])

# Цикл перебора ID приложений

for i in tqdm_notebook(range(len(dump_app_id))):

# Ссылка для запроса отзывов

link = f'https://api.appstoreconnect.apple.com/v1/apps/{dump_app_id["id"][i]}/customerReviews'

# Бесконечный цикл для постраничных запросов отзывов

while True:

try:

r = get_customer_reviews(token, link, {})

response = json.loads(r.text)

review = pd.json_normalize(response, record_path='data')

review['bundle_id'] = dump_app_id['bundle'][i]

if len(review) > 0:

review_data = review_data.append(review)

except:

break

if response['links'].get("next", 'not_link') == 'not_link':

break

else:

link = response['links']['next']

return review_data

```

Эта функция извлекает отзывы для заданных приложений, преобразует их из формата JSON в DataFrame и возвращает собранные данные.

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

Применение функции для разных аккаунтов

После успешного создания инструментов для извлечения отзывов можно применить их к различным аккаунтам и приложениям. В нашем случае мы рассмотрим два аккаунта: Lime HD и Lime X.

Параметры и извлечение отзывов для аккаунта Lime HD

Перед началом работы убедимся, что установлены корректные параметры для авторизации:

```python

issuer_id = "your_issuer_id_for_Lime_HD"

key_id = "your_key_id_for_Lime_HD"

data = {

'id': [list_of_app_ids_for_Lime_HD],

'bundle': [list_of_bundle_names_for_Lime_HD]

}

df = pd.DataFrame(data)

```

Теперь, используя функцию `get_review_response()`, извлекаем отзывы:

```python

limehd_data = get_review_response()

```

Параметры и извлечение отзывов для аккаунта Lime X

Обновляем параметры для авторизации:

```python

issuer_id = "your_issuer_id_for_Lime_X"

key_id = "your_key_id_for_Lime_X"

data = {

'id': [list_of_app_ids_for_Lime_X],

'bundle': [list_of_bundle_names_for_Lime_X]

}

df = pd.DataFrame(data)

```

И затем извлекаем отзывы:

```python

limex_data = get_review_response()

```

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

Обработка и подготовка данных отзывов для анализа

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

Объединение данных из разных источников

Чтобы получить полную картину, лучше всего объединить данные из разных источников в один общий датасет:

```python

df_all = pd.concat([limehd_data, limex_data], ignore_index=True)

```

Добавление дополнительных столбцов

Для удобства анализа можно добавить дополнительные столбцы, такие как полный текст отзыва:

```python

df_all['review'] = df_all['attributes.title'].str.cat(df_all['attributes.body'], sep=' ')

```

Фильтрация данных по дате

Если вам нужно анализировать только недавние отзывы, можно легко отфильтровать данные по дате:

```python

df_all['attributes.createdDate'] = pd.to_datetime(df_all['attributes.createdDate'], utc=True).dt.date

df_all['date'] = pd.to_datetime(df_all['attributes.createdDate'])

df_all = df_all[df_all['date'] > pd.to_datetime('2022-04-30')]

```

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

Категоризация отзывов

Один из важных этапов анализа отзывов — их категоризация. Это позволяет быстро идентифицировать основные проблемы и пожелания пользователей, а также отслеживать изменения во времени.

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

Например:

  • Реклама: реклама, рекламы, спам, рекламной, рекламммммм, рекламу и так далее.
  • Трансляция не работает/Тёмный экран: темно, черный экран, экран чернейт, темный экран, нет трансляции и так далее.
  • Плохое качество: мутное, размазано, размытое, ужасное качество, плохое изображение и так далее.
  • ... и так далее для других категорий.

```python

categories = {

'Реклама': r'(реклам.*?)|(реклама.*?)|...',

'Трансляция не работает/Тёмный экран': r'(темн.*?)|(черный экран.*?)|...',

'Плохое качество': r'(мутное.*?)|(расплывчатое.*?)|...',

...

}

```

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

Функция категоризации отзывов

Для автоматической категоризации отзывов создадим функцию, которая будет применяться к каждому отзыву:

```python

def categorize_review(review):

categories_found = []

for category, pattern in categories.items():

if re.search(pattern, review, re.IGNORECASE):

categories_found.append(category)

if categories_found:

return categories_found

else:

return ['other']

```

Данная функция проходит по каждому отзыву и проверяет его на соответствие ключевым словам из каждой категории. Если отзыв соответствует какой-либо категории, эта категория добавляется в список `categories_found`. Если отзыв не соответствует ни одной из категорий, он относится к категории `other`.

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

```python

df_all['categories'] = df_all['review'].apply(categorize_review)

```

Так как один отзыв может соответствовать нескольким категориям, мы преобразуем датафрейм таким образом, чтобы каждая строка соответствовала одной категории:

```python

df_all = df_all.explode('categories')

df_all = df_all[df_all['categories'] != 'other']

```

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

Агрегация и экспорт данных

Собранная и категоризированная информация по отзывам может быть агрегирована и экспортирована для дальнейшего анализа и представления.

Агрегация данных по отзывам

На основе обработанных отзывов создается агрегированный датафрейм, который группирует данные по дате, приложению и категории отзыва:

```python

reviews_data = df_all.groupby(['date','bundle_id','categories']).agg({'id':['count']}).reset_index()

reviews_data.columns = ['Дата','Приложение','Жалоба','Количество отзывов']

```

Экспорт данных по отзывам в Google Sheets

Полученный агрегированный датафрейм можно экспортировать в Google Sheets для удобства дальнейшего анализа и представления:

```python

from gspread_dataframe import set_with_dataframe

reviews_data['Дата'] = reviews_data['Дата'].astype(str)

headers = reviews_data.columns.values.tolist()

reviews_table = client.open('app_store_reviews')

reviews_sheet = reviews_table.sheet1

reviews_sheet.clear()

set_with_dataframe(worksheet=reviews_sheet, dataframe=reviews_data, include_index=False, include_column_header=True, resize=False)

reviews_table.share('', perm_type='anyone', role='writer')

print(reviews_table.url)

```

Агрегация данных по оценкам

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

```python

rating_data = pd.read_csv('/path_to_your_data/all_reviews_appstore.csv')

rating_data = rating_data.groupby(['date','bundle_id','attributes.rating']).agg({'id':['count']}).reset_index()

rating_data.columns = ['Дата','Приложение','Оценка','Количество оценок']

```

Экспорт агрегированных данных по оценкам в Google Sheets

```python

rating_data['Дата'] = rating_data['Дата'].astype(str)

headers = rating_data.columns.values.tolist()

rating_table = client.open('app_store_rating')

rating_sheet = rating_table.sheet1

rating_sheet.clear()

set_with_dataframe(worksheet=rating_sheet, dataframe=rating_data, include_index=False, include_column_header=True, resize=False)

rating_table.share('', perm_type='anyone', role='writer')

print(rating_table.url)

```

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

Заключение

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

В этой статье мы рассмотрели шаги, необходимые для автоматизации процесса извлечения, категоризации и анализа отзывов из App Store. Используя API App Store Connect, Python и Google Sheets, мы создали эффективный инструмент для мониторинга и анализа отзывов.

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

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

iPhone
151,8 тыс интересуются