Анализ читательских предпочтений по странам

Материал из Поле цифровой дидактики

Анализатор читательских предпочтений по странам

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

Обзор

Анализатор читательских предпочтений представляет собой скрипт на Python, который обрабатывает JSON-файл с отзывами на книги и предоставляет многоуровневую аналитику по географическому распределению читательских предпочтений. Программа использует встроенные библиотеки Python (json, collections) для обработки данных и не требует установки дополнительных зависимостей.

Требования к данным

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

Программа ожидает файл books_reviews.json со следующей структурой:

json {

 "reviews": [
   {
     "rating": 4.5,
     "genres": ["Фэнтези", "Приключения"],
     "country": "США",
     "reviewer": {
       "country": "Россия"
     }
   },
   ...
 ]

}

Поля данных:

  • rating (float): оценка книги (обычно от 1.0 до 5.0)
  • genres (list): список жанров книги
  • country (string): страна происхождения книги
  • reviewer.country (string): страна читателя, оставившего отзыв

Функциональные возможности

1. Общая статистика

  • Общее количество отзывов
  • Количество уникальных стран читателей
  • Количество уникальных стран книг
  • Количество уникальных жанров

2. Анализ оценок

  • Средние оценки по странам читателей (сортировка по количеству отзывов)
  • Средние оценки книг по странам происхождения (топ-10)
  • Средние оценки по жанрам (для жанров с ≥5 оценками)

3. Жанровые предпочтения

  • Любимые жанры по странам читателей (топ-3 для 8 самых активных стран)
  • Самые популярные жанры в целом (топ-10)
  • Корреляция жанров и оценок

4. Географический анализ

  • Предпочтения по странам происхождения книг для каждой страны читателей
  • Соотношение отечественных и зарубежных книг по странам
  • Страны-лидеры по количеству упоминаемых книг (топ-5)
  • Самые продуктивные страны-авторы

Структура кода

Основная функция:

analyze_book_reviews(file_path) Принимает путь к JSON-файлу и выполняет полный анализ данных.

Вспомогательные структуры данных:

  • ratings_by_country: средние оценки по странам читателей
  • genres_by_country: счётчики жанров по странам
  • book_country_by_reader_country: распределение стран книг по странам читателей
  • ratings_by_book_country: оценки по странам происхождения книг
  • domestic_vs_foreign: соотношение отечественных/зарубежных книг

Алгоритмическая сложность:

  • Временная сложность: O(n), где n — количество отзывов
  • Пространственная сложность: O(k), где k — количество уникальных стран и жанров

Использование

Базовое использование:

python python analyzer.py

Интеграция в другие проекты:

python from analyzer import analyze_book_reviews

Анализ собственного файла

analyze_book_reviews("path/to/your/reviews.json")

Обработка ошибок:

Программа включает обработку:
  • Отсутствия файла (FileNotFoundError)
  • Общих ошибок выполнения (Exception)

Пример вывода

АНАЛИЗ ЧИТАТЕЛЬСКИХ ПРЕДПОЧТЕНИЙ ПО СТРАНАМ

📊 ОБЩАЯ СТАТИСТИКА: Всего отзывов: 150 Уникальных стран читателей: 12 Уникальных стран книг: 8 Всего уникальных жанров: 25

⭐ СРЕДНИЕ ОЦЕНКИ ПО СТРАНАМ ЧИТАТЕЛЕЙ: Россия: 4.2 (45 отзывов) США: 4.0 (32 отзыва) Германия: 4.3 (28 отзывов) ...

📚 ЛЮБИМЫЕ ЖАНРЫ ПО СТРАНАМ ЧИТАТЕЛЕЙ: Россия: Фэнтези (15), Детектив (12), Научная фантастика (8) США: Роман (20), Биография (10), Драма (7) ... Аналитические возможности Выявление культурных предпочтений Программа позволяет обнаруживать: • Предпочтение отечественной литературы в разных странах • Популярность жанров в зависимости от региона • Различия в строгости оценок между странами Маркетинговые применения • Определение целевых рынков для перевода книг • Выявление жанров, популярных в конкретных регионах • Понимание восприятия иностранной литературы Исследовательский потенциал • Анализ культурного импорта/экспорта литературы • Изучение влияния страны происхождения на оценки • Выявление универсальных vs локальных жанровых предпочтений Ограничения 1. Требования к данным: необходимо минимум 3 отзыва для анализа по стране 2. Жанровый анализ: жанры анализируются только при наличии ≥5 оценок 3. Формат данных: строгая зависимость от структуры JSON-файла 4. Визуализация: отсутствие графического представления данных 5. Экспорт: результаты только выводятся в консоль Возможные расширения Функциональные улучшения: 1. Экспорт результатов в CSV/Excel форматы 2. Визуализация данных с помощью matplotlib/plotly 3. Веб-интерфейс для интерактивного анализа 4. API-доступ к аналитическим функциям 5. Расширенная фильтрация по временным периодам Аналитические расширения: 1. Анализ тональности текстов отзывов 2. Корреляционный анализ между жанрами и географией 3. Прогнозирование популярности книг в новых регионах 4. Кластеризация стран по читательским предпочтениям 5. Анализ временных трендов в предпочтениях Технические улучшения: 1. Кэширование результатов для больших наборов данных 2. Инкрементальный анализ при добавлении новых отзывов 3. Поддержка нескольких форматов данных (CSV, XML, SQL) 4. Многопоточная обработка для больших объёмов данных 5. Интеграция с базами данных (SQL, NoSQL) Заключение Анализатор читательских предпочтений по странам представляет собой эффективный инструмент для первичного анализа географического распределения литературных предпочтений. Благодаря простоте использования и отсутствию внешних зависимостей, программа может быть легко интегрирована в исследовательские проекты или использоваться для предварительного анализа данных в издательском бизнесе.

Примечание: Для работы программы требуется файл books_reviews.json в рабочей директории с корректной структурой данных.

Код программы на языке Python

import json
from collections import Counter, defaultdict

def analyze_book_reviews(file_path):
    """Анализ отзывов на книги"""
    
    # Загружаем данные
    with open(file_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    
    reviews = data['reviews']
    
    print("=" * 60)
    print("АНАЛИЗ ЧИТАТЕЛЬСКИХ ПРЕДПОЧТЕНИЙ ПО СТРАНАМ")
    print("=" * 60)
    
    # 1. Общая статистика
    print(f"\n📊 ОБЩАЯ СТАТИСТИКА:")
    print(f"Всего отзывов: {len(reviews)}")
    print(f"Уникальных стран читателей: {len(set(r['reviewer']['country'] for r in reviews))}")
    print(f"Уникальных стран книг: {len(set(r['country'] for r in reviews))}")
    print(f"Всего уникальных жанров: {len(set(g for r in reviews for g in r['genres']))}")
    
    # 2. Средние оценки по странам читателей
    print(f"\n⭐ СРЕДНИЕ ОЦЕНКИ ПО СТРАНАМ ЧИТАТЕЛЕЙ:")
    
    ratings_by_country = defaultdict(list)
    for review in reviews:
        country = review['reviewer']['country']
        rating = review['rating']
        ratings_by_country[country].append(rating)
    
    # Сортируем по количеству отзывов
    for country, ratings in sorted(ratings_by_country.items(), key=lambda x: len(x[1]), reverse=True):
        avg_rating = sum(ratings) / len(ratings)
        print(f"{country}: {avg_rating:.1f} ({len(ratings)} отзывов)")
    
    # 3. Любимые жанры по странам читателей
    print(f"\n📚 ЛЮБИМЫЕ ЖАНРЫ ПО СТРАНАМ ЧИТАТЕЛЕЙ:")
    
    genres_by_country = defaultdict(Counter)
    for review in reviews:
        country = review['reviewer']['country']
        genres_by_country[country].update(review['genres'])
    
    # Выводим топ стран по количеству отзывов
    top_countries = sorted(ratings_by_country.items(), key=lambda x: len(x[1]), reverse=True)[:8]
    
    for country, _ in top_countries:
        if country in genres_by_country and genres_by_country[country]:
            top_genres = genres_by_country[country].most_common(3)
            genres_str = ", ".join([f"{g} ({c})" for g, c in top_genres])
            print(f"{country}: {genres_str}")
    
    # 4. Предпочтения по странам происхождения книг
    print(f"\n🌍 ПРЕДПОЧТЕНИЯ ПО СТРАНАМ ПРОИСХОЖДЕНИЯ КНИГ:")
    
    # По странам читателей
    book_country_by_reader_country = defaultdict(lambda: defaultdict(int))
    for review in reviews:
        reader_country = review['reviewer']['country']
        book_country = review['country']
        book_country_by_reader_country[reader_country][book_country] += 1
    
    # Только для стран с достаточным количеством отзывов
    for reader_country, book_countries in sorted(book_country_by_reader_country.items()):
        total = sum(book_countries.values())
        if total >= 3:  # Минимум 3 отзыва для анализа
            print(f"\n{reader_country} читает книги из:")
            for book_country, count in sorted(book_countries.items(), key=lambda x: x[1], reverse=True)[:5]:
                percentage = (count / total) * 100
                print(f"  {book_country}: {count} книг ({percentage:.0f}%)")
    
    # 5. Средние оценки книг по странам происхождения
    print(f"\n🏆 СРЕДНИЕ ОЦЕНКИ КНИГ ПО СТРАНАМ ПРОИСХОЖДЕНИЯ:")
    
    ratings_by_book_country = defaultdict(list)
    for review in reviews:
        book_country = review['country']
        rating = review['rating']
        ratings_by_book_country[book_country].append(rating)
    
    # Сортируем по количеству книг
    for country, ratings in sorted(ratings_by_book_country.items(), 
                                   key=lambda x: len(x[1]), 
                                   reverse=True)[:10]:  # Топ-10 стран
        avg_rating = sum(ratings) / len(ratings)
        print(f"{country}: {avg_rating:.1f} ({len(ratings)} книг)")
    
    # 6. Анализ предпочтений: отечественные vs зарубежные книги
    print(f"\n📖 ОТЕЧЕСТВЕННЫЕ VS ЗАРУБЕЖНЫЕ КНИГИ:")
    
    domestic_vs_foreign = defaultdict(lambda: {'domestic': 0, 'foreign': 0})
    for review in reviews:
        reader_country = review['reviewer']['country']
        book_country = review['country']
        
        if reader_country == book_country:
            domestic_vs_foreign[reader_country]['domestic'] += 1
        else:
            domestic_vs_foreign[reader_country]['foreign'] += 1
    
    for country, counts in sorted(domestic_vs_foreign.items()):
        total = counts['domestic'] + counts['foreign']
        if total >= 3:  # Только для стран с достаточными данными
            domestic_pct = (counts['domestic'] / total) * 100 if total > 0 else 0
            foreign_pct = (counts['foreign'] / total) * 100 if total > 0 else 0
            print(f"{country}: {counts['domestic']} отечественных ({domestic_pct:.0f}%), "
                  f"{counts['foreign']} зарубежных ({foreign_pct:.0f}%)")
    
    # 7. Самые популярные жанры в целом
    print(f"\n🔥 САМЫЕ ПОПУЛЯРНЫЕ ЖАНРЫ В ЦЕЛОМ:")
    
    all_genres = []
    for review in reviews:
        all_genres.extend(review['genres'])
    
    genre_counter = Counter(all_genres)
    total_genre_mentions = sum(genre_counter.values())
    
    print("Топ-10 жанров:")
    for genre, count in genre_counter.most_common(10):
        percentage = (count / total_genre_mentions) * 100
        print(f"  {genre}: {count} упоминаний ({percentage:.1f}%)")
    
    # 8. Корреляция жанров и оценок
    print(f"\n📈 СРЕДНИЕ ОЦЕНКИ ПО ЖАНРАМ:")
    
    ratings_by_genre = defaultdict(list)
    for review in reviews:
        rating = review['rating']
        for genre in review['genres']:
            ratings_by_genre[genre].append(rating)
    
    # Только жанры с минимум 5 оценками
    filtered_genres = {g: r for g, r in ratings_by_genre.items() if len(r) >= 5}
    
    if filtered_genres:
        for genre, ratings in sorted(filtered_genres.items(), 
                                     key=lambda x: sum(x[1])/len(x[1]), 
                                     reverse=True)[:10]:
            avg_rating = sum(ratings) / len(ratings)
            print(f"{genre}: {avg_rating:.1f} ({len(ratings)} оценок)")
    else:
        print("Недостаточно данных для анализа по жанрам")
    
    # 9. Страны-лидеры по количеству книг
    print(f"\n🌎 СТРАНЫ-ЛИДЕРЫ ПО КОЛИЧЕСТВУ КНИГ:")
    
    book_count_by_country = Counter(review['country'] for review in reviews)
    
    for country, count in book_count_by_country.most_common(5):
        percentage = (count / len(reviews)) * 100
        print(f"{country}: {count} книг ({percentage:.1f}% от всех)")
    
    # 10. Визуализация наиболее продуктивных стран-авторов
    print(f"\n✍️ САМЫЕ ПРОДУКТИВНЫЕ СТРАНЫ-АВТОРЫ:")
    
    # Считаем сколько книг из каждой страны
    country_productivity = Counter()
    for review in reviews:
        country_productivity[review['country']] += 1
    
    print("Топ-5 стран по количеству упоминаемых книг:")
    for country, count in country_productivity.most_common(5):
        print(f"  {country}: {count} книг")

def main():
    """Основная функция"""
    file_path = "books_reviews.json"
    
    try:
        analyze_book_reviews(file_path)
    except FileNotFoundError:
        print(f"❌ Файл {file_path} не найден!")
    except Exception as e:
        print(f"❌ Неожиданная ошибка при анализе: {e}")

if __name__ == "__main__":
    main()