import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np # --- НАСТРОЙКИ --- sns.set_style("whitegrid") plt.rcParams['figure.figsize'] = (12, 8) # Попытка установить шрифт, поддерживающий кириллицу (обычно Arial или Sans-Serif работают) plt.rcParams['font.family'] = 'sans-serif' # --- БЛОК 1: ДАННЫЕ (Без изменений) --- # 1. Сезонность df_months = pd.DataFrame({ 'Месяц': ['Август', 'Сентябрь'], 'Выручка ($)': [260130, 816265], 'Рентабельность (%)': [5.82, 6.81] }) # 2. Продукты (Рентабельность) df_products = pd.DataFrame({ 'Продукт': ['HIKMA 4YOU', 'NYGMET 8 DAYS', 'HIKMA 7 DAYS', 'IZI 7 DAYS', 'NIYET 7 DAYS', 'ASTANA', 'HIKMA 8 DAYS', 'AMAL 7 DAYS', 'SHOHADA 4YOU'], 'Рентабельность (%)': [15.29, 7.07, 6.53, 6.45, 5.47, 4.49, 2.01, 0.43, -0.82] }) # 3. Менеджеры df_managers = pd.DataFrame({ 'Менеджер': ['Бахыт Е.', 'Zhanerke', 'Акбермет', 'Bektay', 'Bagdat', 'Qymbat', 'Ulzhan'], 'Прибыль ($)': [31591, 7050, 6229, 4470, 1460, 950, 900], 'Рентабельность (%)': [7.38, 22.15, 5.89, 9.87, 4.22, 2.34, 1.18], 'Туристы (чел)': [274, 18, 66, 24, 21, 24, 49] }) # 4. Структура холдинга df_holding = pd.DataFrame({ 'Субъект': ['Hickmet Travel\n(Оператор)', 'Hickmet Premium\n(Агент)'], 'Прибыль ($)': [37470, 27625] # Скорректированная цифра }) # --- БЛОК 2: ПОСТРОЕНИЕ ГРАФИКОВ --- # ГРАФИК 1: Распределение прибыли и Сезонность fig1, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6)) # 1.1 Пай-чарт colors_pie = ['#66bb6a', '#ffa726'] ax1.pie(df_holding['Прибыль ($)'], labels=df_holding['Субъект'], autopct='%1.1f%%', colors=colors_pie, startangle=90, explode=(0.05, 0)) ax1.set_title('Доля в валовой прибыли', fontweight='bold') # 1.2 Сезонность (Combo chart) sns.barplot(data=df_months, x='Месяц', y='Выручка ($)', ax=ax2, color='#42a5f5', alpha=0.7) ax2.set_ylabel('Выручка ($)', color='#1e88e5', fontweight='bold') # Подписи для баров ax2.bar_label(ax2.containers[0], fmt='${:,.0f}', padding=3) # Вторая ось для % ax3 = ax2.twinx() sns.lineplot(data=df_months, x='Месяц', y='Рентабельность (%)', ax=ax3, color='#e53935', marker='o', linewidth=3, markersize=10) ax3.set_ylabel('Рентабельность (%)', color='#e53935', fontweight='bold') ax3.set_ylim(0, 10) # Подписи для линии for x, y in zip(range(len(df_months)), df_months['Рентабельность (%)']): ax3.text(x, y + 0.5, f'{y}%', color='#e53935', fontweight='bold', ha='center') plt.tight_layout() plt.show() # ГРАФИК 2: Рентабельность продуктов (Horizontal Bar) plt.figure(figsize=(12, 6)) # Цвета: Зеленый (>5%), Желтый (0-5%), Красный (<0%) colors_prod = ['#2e7d32' if x >= 5 else ('#fbc02d' if x > 0 else '#c62828') for x in df_products['Рентабельность (%)']] ax = sns.barplot(data=df_products, y='Продукт', x='Рентабельность (%)', palette=colors_prod, hue='Продукт', legend=False) plt.axvline(x=0, color='black', linewidth=1) plt.title('Рентабельность продуктов', fontweight='bold') # Новые безопасные подписи ax.bar_label(ax.containers[0], fmt='%.2f%%', padding=3, fontweight='bold') plt.tight_layout() plt.show() # ГРАФИК 3: Матрица менеджеров (Bubble Chart) plt.figure(figsize=(10, 6)) scatter = sns.scatterplot(data=df_managers, x='Туристы (чел)', y='Прибыль ($)', size='Рентабельность (%)', sizes=(200, 2000), alpha=0.6, hue='Рентабельность (%)', palette='viridis', legend=False) # Подписи имен for i in range(df_managers.shape[0]): plt.text(df_managers['Туристы (чел)'][i], df_managers['Прибыль ($)'][i], f"{df_managers['Менеджер'][i]}\n{df_managers['Рентабельность (%)'][i]}%", ha='center', va='center', fontweight='bold', fontsize=9) plt.title('Матрица Менеджеров: Объем vs Прибыль (Размер круга = Эффективность)', fontweight='bold') plt.grid(True, linestyle='--', alpha=0.5) plt.tight_layout() plt.show() # ГРАФИК 4: Водопад успехов и неудач (Кейсы) df_cases = pd.DataFrame({ 'Тур': ['06.08 AA\n(Ошибка цены)', '28.09 ALA-JED\n(Агент минус)', 'SHOHADA\n(Убыток)', '13.09 ALA-JED\n(Объем)', 'HIKMA 4YOU\n(Маржа)'], 'Результат ($)': [-4992, -1350, -100, 9461, 3500] }) plt.figure(figsize=(10, 5)) colors_cases = ['#c62828' if x < 0 else '#2e7d32' for x in df_cases['Результат ($)']] ax = sns.barplot(data=df_cases, x='Результат ($)', y='Тур', palette=colors_cases, hue='Тур', legend=False) plt.title('Анализ отклонений: Провалы vs Успехи', fontweight='bold') plt.axvline(x=0, color='black', linewidth=1) # Подписи (сдвиг влево для отрицательных, вправо для положительных происходит автоматически через label_type='edge') ax.bar_label(ax.containers[0], fmt='$%.0f', padding=3, fontweight='bold') plt.tight_layout() plt.show()