AI-система оптимізації розмірної сітки

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
AI-система оптимізації розмірної сітки
Середній
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

AI-система оптимізації розмірної сітки

Розмірна сітка одягу – не просто S/M/L. Правильна сітка відповідає антропометрії вашої аудиторії, знижує повернення та зменшує залишки крайніх розмірів. AI оптимізує сітку з урахуванням реальних даних покупців.

Антропометричний аналіз аудиторії

Аналіз покупок та повернень:

Дані транзакцій + повернень розкривають реальний розподіл розмірів аудиторії: - Повернення з коментарем «маломерит» → покупець взяв менший розмір, ніж потрібно - «Більшемірит» + обмін на менший → систематичне зміщення грейдингу - Розмірні гепи: немає продажів S та XXL, тільки M/L → сітка не відповідає ринку

import pandas as pd
import numpy as np
from scipy import stats
from scipy.optimize import minimize

class SizeGridOptimizer:
    """Оптимизация размерной сетки по данным транзакций и возвратов"""

    def analyze_size_distribution(self, orders_df, returns_df):
        """
        Анализ распределения размеров: что покупают vs. что возвращают.
        """
        # Купленные размеры
        purchased = orders_df.groupby('size')['order_id'].count()
        purchased = purchased / purchased.sum()

        # Возвраты по причине размера
        size_returns = returns_df[returns_df['reason'].isin(['too_small', 'too_large'])]
        return_rate_by_size = size_returns.groupby('size')['order_id'].count() / orders_df.groupby('size')['order_id'].count()

        # Implied true size distribution
        # Если покупают M и меняют на L → реальный размер L
        exchanges = returns_df[returns_df['reason'] == 'exchange']
        size_shift = exchanges.groupby(['size', 'exchanged_to_size']).size().reset_index()
        size_shift.columns = ['from_size', 'to_size', 'count']

        return {
            'purchased_distribution': purchased.to_dict(),
            'return_rate_by_size': return_rate_by_size.to_dict(),
            'size_exchanges': size_shift.to_dict('records')
        }

    def recommend_size_grid(self, body_measurement_data, target_coverage=0.95):
        """
        Рекомендация размерной сетки для охвата 95% целевой аудитории.
        body_measurement_data: DataFrame с измерениями (обхват груди, талии, бёдер)
        """
        key_measurements = ['chest_cm', 'waist_cm', 'hip_cm']

        # Fit multivariate normal distribution
        means = body_measurement_data[key_measurements].mean()
        cov = body_measurement_data[key_measurements].cov()

        from sklearn.mixture import GaussianMixture
        # Gaussian Mixture лучше одной нормали для неоднородной аудитории
        gmm = GaussianMixture(n_components=3, random_state=42)
        gmm.fit(body_measurement_data[key_measurements])

        # Генерировать размеры как квантили распределения
        sizes = ['XS', 'S', 'M', 'L', 'XL', 'XXL']
        quantiles = np.linspace(0.025, 0.975, len(sizes))

        # Рекомендованные измерения для каждого размера
        recommendations = {}
        for i, size in enumerate(sizes):
            # Ожидаемые значения в этом квантиле
            samples = gmm.sample(10000)[0]
            sorted_chest = np.sort(samples[:, 0])
            target_measurement = sorted_chest[int(quantiles[i] * len(sorted_chest))]
            recommendations[size] = {
                'chest_cm': float(target_measurement),
                'coverage_pct': float(quantiles[i] * 100)
            }

        return recommendations

3D Body Scanning та віртуальна примірка

AI-розмірна рекомендація:

Користувач вводить параметри → ML рекомендує розмір для конкретного бренду/артикула: - Дані: зростання, вага + опціональне охоплення → прогноз оптимального розміру - Personalization: облік історії повернень та обмінів конкретного покупця - Brand-specific models: різні бренди використовують різні лекала

class SizeRecommender:
    """Персональная рекомендация размера"""

    def recommend(self, user_measurements, product_id, purchase_history=None):
        """
        user_measurements: {'height_cm', 'weight_kg', 'chest_cm'} (опционально)
        purchase_history: прошлые размеры и возвраты пользователя
        """
        # Получить характеристики продукта
        product = self._get_product_specs(product_id)
        brand_bias = self._get_brand_size_bias(product['brand'])  # маломерит/большемерит

        # Базовая рекомендация по измерениям
        if 'chest_cm' in user_measurements:
            base_size = self._lookup_size_chart(user_measurements['chest_cm'],
                                               product['size_chart'])
        else:
            # Только рост и вес — менее точно
            base_size = self._estimate_from_height_weight(
                user_measurements['height_cm'],
                user_measurements['weight_kg'],
                product['category']
            )

        # Поправка на бренд
        adjusted_size = self._adjust_for_brand(base_size, brand_bias)

        # Поправка на историю покупок
        if purchase_history:
            user_bias = self._compute_user_bias(purchase_history, product['brand'])
            adjusted_size = self._adjust_for_user(adjusted_size, user_bias)

        confidence = 0.9 if 'chest_cm' in user_measurements else 0.7
        return {'recommended_size': adjusted_size, 'confidence': confidence,
                'note': f"Бренд {product['brand']}: {brand_bias}"}

Оптимізація закупівель за розмірами

Size buy optimization:

Правильний розподіл у закупівлі (size ratio):

def optimize_size_buy(demand_forecast_by_size, min_order_qty, budget):
    """
    Оптимизация соотношения размеров в закупке.
    Минимизировать нереализованные остатки + упущенные продажи.
    """
    from scipy.optimize import linprog

    sizes = list(demand_forecast_by_size.keys())
    demand = np.array([demand_forecast_by_size[s] for s in sizes])
    price = 500  # руб/единицу (пример)

    # Заказать ровно столько, сколько продастся → нет остатков, нет дефицита
    # Но с ограничениями на MOQ и бюджет
    total_units = budget / price

    # Оптимальное распределение пропорционально прогнозу
    weights = demand / demand.sum()
    optimal_order = (weights * total_units).astype(int)
    # Гарантировать MOQ
    optimal_order = np.maximum(optimal_order, min_order_qty)

    return dict(zip(sizes, optimal_order))

Результат оптимізації розмірної сітки: зниження на 15–25%, зменшення залишків крайніх розмірів на 30–40%.

Термін розробки: 2-3 місяці для системи аналізу розмірної сітки та персональної рекомендації розміру.