Анализ читательских предпочтений по странам
Анализатор читательских предпочтений по странам
Анализатор читательских предпочтений по странам — это программный инструмент на языке 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()
