← Назад к вопросам

Что такое закон Парето?

2.0 Middle🔥 81 комментариев
#Python Core#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Закон Парето (Принцип 80/20)

Закон Парето — это эмпирический принцип, согласно которому 80% результатов обычно создаётся 20% усилий, ресурсов или факторов. Это означает, что небольшое количество входов (causes) отвечает за большую часть выходов (effects).

История

Принцип назван в честь итальянского экономиста Вильфредо Парето, который в 1906 году заметил, что 80% земли в Италии принадлежит 20% населения. Позже этот принцип был применён к экономике и управлению.

Основная идея

Усилия (Input)     →  Результаты (Output)
20%  ════════════  ══════  80%
80%  ════════════  ══════  20%

Небольшой процент работы создаёт большинство результатов

Примеры в разных сферах

В бизнесе

  • 20% клиентов производят 80% доходов
  • 20% продуктов приносят 80% прибыли
  • 20% сотрудников выполняют 80% работы
class CustomerAnalysis:
    def __init__(self, customers: list):
        self.customers = sorted(customers, key=lambda x: x['revenue'], reverse=True)
    
    def get_pareto_customers(self):
        total_revenue = sum(c['revenue'] for c in self.customers)
        target_revenue = total_revenue * 0.8
        
        accumulated = 0
        vip_customers = []
        
        for customer in self.customers:
            accumulated += customer['revenue']
            vip_customers.append(customer)
            if accumulated >= target_revenue:
                break
        
        percentage = (len(vip_customers) / len(self.customers)) * 100
        print(f"{percentage:.1f}% клиентов производят 80% дохода")
        return vip_customers

customers = [
    {"name": "Alice", "revenue": 50000},
    {"name": "Bob", "revenue": 30000},
    {"name": "Charlie", "revenue": 20000},
    {"name": "David", "revenue": 5000},
    {"name": "Eve", "revenue": 2000}
]

analysis = CustomerAnalysis(customers)
vip = analysis.get_pareto_customers()

В разработке

  • 20% функций используются 80% времени
  • 20% багов вызывают 80% критических ошибок
  • 20% кода занимает 80% времени выполнения (горячие точки)
import cProfile
import pstats
from io import StringIO

def profile_code(func):
    """Найти горячие точки кода (20% который требует 80% ресурсов)"""
    pr = cProfile.Profile()
    pr.enable()
    
    func()
    
    pr.disable()
    s = StringIO()
    ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
    ps.print_stats(10)  # Топ 10 функций
    print(s.getvalue())

def slow_function():
    for i in range(1000000):
        x = i ** 2  # Горячая точка

profile_code(slow_function)

В качестве

  • 20% типов дефектов приводят к 80% проблем
  • 20% функций создают 80% ошибок
from collections import Counter

def analyze_bugs(bugs: list):
    """Анализ багов по типам"""
    bug_types = Counter(b['type'] for b in bugs)
    total_bugs = len(bugs)
    
    # Сортируем по частоте
    sorted_types = bug_types.most_common()
    
    accumulated = 0
    critical_bugs = 0
    critical_count = 0
    
    for bug_type, count in sorted_types:
        accumulated += count
        critical_bugs += 1
        critical_count += count
        
        if accumulated >= total_bugs * 0.8:
            break
    
    percentage = (critical_bugs / len(sorted_types)) * 100
    print(f"{percentage:.1f}% типов багов создают 80% всех проблем")
    return [bt[0] for bt in sorted_types[:critical_bugs]]

Применение в управлении проектами

Приоритизация задач

class TaskPrioritization:
    def __init__(self, tasks: list):
        self.tasks = sorted(
            tasks,
            key=lambda t: t['impact'] * t['probability'],
            reverse=True
        )
    
    def get_80_20(self):
        total_impact = sum(t['impact'] for t in self.tasks)
        target_impact = total_impact * 0.8
        
        accumulated = 0
        priority_tasks = []
        
        for task in self.tasks:
            accumulated += task['impact']
            priority_tasks.append(task)
            if accumulated >= target_impact:
                break
        
        return priority_tasks

tasks = [
    {"name": "Feature A", "impact": 100, "probability": 0.9},
    {"name": "Bug B", "impact": 50, "probability": 0.8},
    {"name": "Feature C", "impact": 20, "probability": 0.5},
    {"name": "Refactor D", "impact": 10, "probability": 0.7},
]

priorization = TaskPrioritization(tasks)
top_tasks = prioritization.get_80_20()
print("Выполни эти задачи и получишь 80% результата")
for task in top_tasks:
    print(f"  - {task['name']}")

Применение в оптимизации

Оптимизация производительности

def optimize_with_pareto(operations: list):
    """
    Вместо оптимизации всего кода,
    оптимизируй только 20% горячих точек
    """
    
    # Найди 20% операций которые занимают 80% времени
    sorted_ops = sorted(
        operations,
        key=lambda x: x['execution_time'],
        reverse=True
    )
    
    total_time = sum(op['execution_time'] for op in sorted_ops)
    target_time = total_time * 0.8
    
    accumulated = 0
    critical_ops = []
    
    for op in sorted_ops:
        accumulated += op['execution_time']
        critical_ops.append(op)
        if accumulated >= target_time:
            break
    
    return critical_ops

operations = [
    {"name": "database_query", "execution_time": 5000},
    {"name": "api_call", "execution_time": 3000},
    {"name": "json_parse", "execution_time": 500},
    {"name": "logging", "execution_time": 100},
]

critical = optimize_with_pareto(operations)
print("Оптимизируй эти операции для максимального выигрыша:")
for op in critical:
    print(f"  - {op['name']}: {op['execution_time']}ms")

Применение в обучении и развитии

class LearningStrategy:
    @staticmethod
    def identify_core_concepts(topics: list):
        """
        Выучи 20% концепций которые дадут тебе 80% понимания
        """
        
        # Сортируем по важности и частоте использования
        ranked = sorted(
            topics,
            key=lambda t: t['importance'] * t['frequency'],
            reverse=True
        )
        
        total_importance = sum(t['importance'] for t in ranked)
        target = total_importance * 0.8
        
        core_topics = []
        accumulated = 0
        
        for topic in ranked:
            accumulated += topic['importance']
            core_topics.append(topic['name'])
            if accumulated >= target:
                break
        
        return core_topics

topics = [
    {"name": "Functions", "importance": 100, "frequency": 10},
    {"name": "Loops", "importance": 90, "frequency": 8},
    {"name": "Classes", "importance": 80, "frequency": 7},
    {"name": "Decorators", "importance": 40, "frequency": 3},
    {"name": "Metaclasses", "importance": 10, "frequency": 1},
]

strategy = LearningStrategy()
core = strategy.identify_core_concepts(topics)
print("Выучи эти концепции и получишь 80% навыков:")
for topic in core:
    print(f"  - {topic}")

Ограничения закона Парето

  1. Не универсален — соотношение не всегда ровно 80/20
  2. Контекстуален — зависит от области применения
  3. Не причина — показывает корреляцию, не причинность
  4. Требует анализа — нужно исследовать для каждого случая

Практическое применение для разработчика

class DeveloperProductivity:
    def daily_standup():
        """Применяй принцип 80/20 в работе"""
        
        # 20% действий дают 80% результата
        focus_areas = [
            "Критические баги",
            "Производительность горячих точек",
            "Фичи, которые ждут клиенты",
        ]
        
        # Остальные 80% действий дают только 20% результата
        nice_to_have = [
            "Рефакторинг низкоприоритетного кода",
            "Документирование всего",
            "Переписание давнего кода",
        ]
        
        return focus_areas

Закон Парето — это практический инструмент для определения приоритетов и максимизации результатов при минимальных затратах. Используй его для выявления того, на что стоит потратить энергию для получения наибольшего эффекта.

Что такое закон Парето? | PrepBro