Загрузка данных


import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

# 1. Создаем данные стран-партнеров ФТС
raw_data = {
    'Country': ['Китай', 'Германия', 'Бразилия', 'Турция', 'Беларусь', 'ОАЭ'],
    'Price_per_kg': [150, 450, 15, 80, 40, 600],
    'Food_Share': [0.05, 0.02, 0.85, 0.60, 0.45, 0.01],
    'Frequency': [100, 50, 10, 70, 95, 20]
}

df = pd.DataFrame(raw_data)

# 2. Подготовка данных для ИИ
# Нам нужно нормализовать данные, чтобы разные масштабы не путали алгоритм
scaler = StandardScaler()
features = ['Price_per_kg', 'Food_Share', 'Frequency']
scaled_features = scaler.fit_transform(df[features])

# 3. Обучаем модель K-Means (делим на 3 кластера)
kmeans = KMeans(n_clusters=3, random_state=42)
df['Cluster'] = kmeans.fit_predict(scaled_features)

# 4. Визуализация результатов
plt.figure(figsize=(12, 7))

# Словарь для красивых названий в легенде
cluster_info = {
    0: "Технологии и Люкс",
    1: "Продовольствие",
    2: "Активные соседи"
}

# Рисуем точки для каждого кластера
colors = ['blue', 'green', 'red']
for i in range(3):
    cluster_data = df[df['Cluster'] == i]
    plt.scatter(cluster_data['Price_per_kg'], 
                cluster_data['Food_Share'], 
                s=200, 
                c=colors[i],
                edgecolors='black', 
                alpha=0.8, 
                label=f'Кластер {i}: {cluster_info[i]}')

    # Добавляем названия стран над точками
    for j, txt in enumerate(cluster_data['Country']):
        plt.annotate(txt, 
                     (cluster_data['Price_per_kg'].iat[j], 
                      cluster_data['Food_Share'].iat[j]),
                     xytext=(5, 5), 
                     textcoords="offset points", 
                     fontsize=11, 
                     fontweight="bold")

# Оформление графика
plt.title("Кластеризация стран-партнеров по структуре торговли", fontsize=15)
plt.xlabel("Средняя цена за 1 кг груза ($)", fontsize=12)
plt.ylabel("Доля продовольственных товаров (0.0 - 1.0)", fontsize=12)
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)

# Показываем результат
plt.tight_layout()
plt.show()