Авторы:
Назаров Александр - ведущий аналитик компании Лайм Эйч Ди;
Макаров Илья - продуктовый аналитик компании Лайм Эйч Ди.
В мире мобильных приложений отзывы пользователей играют ключевую роль. Они предоставляют разработчикам ценную обратную связь, которая может быть использована для оптимизации приложений, улучшения пользовательского опыта и повышения уровня удовлетворенности клиентов. Но как автоматизировать процесс сбора и анализа этих отзывов?
В этой статье мы рассмотрим:
- Авторизацию и доступ к данным: Как авторизоваться и получить доступ к данным в 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, мы создали эффективный инструмент для мониторинга и анализа отзывов.
Надеемся, что представленный материал поможет разработчикам и аналитикам лучше понимать своих пользователей, улучшать приложения и достигать новых вершин в индустрии мобильных приложений.
Большое спасибо за внимание! Если у вас есть дополнительные вопросы или комментарии, не стесняйтесь делиться ими. Всегда рады помочь и обсудить интересные темы в области анализа данных!