#!/usr/bin/env python # -*- coding: utf-8 -*- #------------------------------------------------------------------------- # Импорт: import numpy as np import collections import itertools #------------------------------------------------------------------------- # Опции: # В dataset месячный доход, переводим в годовой, если нужно. YEAR_INCOME = True #YEAR_INCOME = False # Прогрессивный подоходный налог. Нарастающий, в процентах. TAX_PERCENT = 0.5 TAX_MAXIMUM = 0.9 TAX_MINIMUM = 0.1 # Многоступенчатая ставка. Доходы разбиваются на блоки, ставка нарастает. # https://ru.wikipedia.org/wiki/Прогрессивное_налогообложение#Многоступенчатая TAX_STEPS = 5 # Процент бедных от численности населения, которых поддерживают из налогов: POVERTY_PERCENT = 0.3 # Процент считающихся богатыми, для квинтильного коэффициента: WEALTHY_PERCENT = 0.2 #------------------------------------------------------------------------- # Данные для коэффициента Джини: # Число элементов массива = число домохозяйств. Числа, это доходы. # Wyoming Household Income # https://www.homefacts.com/demographics/Wyoming.html # Household Income | Number | Percent | National Average # -------------------- | ------- | ------- | ---------------- # Less than $10,000 | 11,596 | 5.2% | 6.7% # $10,000 to $14,999 | 10,085 | 4.5% | 4.8% # $15,000 to $24,999 | 22,031 | 9.9% | 9.7% # $25,000 to $34,999 | 20,516 | 9.2% | 9.5% # $35,000 to $49,999 | 32,065 | 14.3% | 13.0% # $50,000 to $74,999 | 41,112 | 18.4% | 17.7% # $75,000 to $99,999 | 30,199 | 13.5% | 12.3% # $100,000 to $149,000 | 36,144 | 16.2% | 14.0% # $150,000 to $199,999 | 11,364 | 5.1% | 5.8% # $200,000 or more | 8,507 | 3.8% | 6.4% # Median household income 59,882 National 57,617 # Per capita income 30,042 National 31,128 # Wyoming Property Value # Property Type | Number | Percent | National Average # -------------------- | ------- | ------- | ---------------- # Less then $50,000 | 14,466 | 9.4% | 7.3% # $50,000 to $99,999 | 8,893 | 5.8% | 7.3% # $100,000 to $149,000 | 17,706 | 11.5% | 14.1% # $150,000 to $199,000 | 31,171 | 20.3% | 14.5% # $200,000 to $299,999 | 41,155 | 26.7% | 19.2% # $300,000 to $499,999 | 28,705 | 18.7% | 18.2% # $500,000 to $999,999 | 7,618 | 5.0% | 10.5% # $1,000,000 or more | 4,180 | 2.7% | 3.1% # Median (Dollars) 209,500 National 205,000 # Тысяча домохозяйств: # ВВП -- 75 979, коэффициент Джини -- 0.436 # ВВП на домохозяйство -- 75.9 # Медианный доход (midpoint_tax) = 56 #dataset = [ # 500, 500, 500, 500, 500, 400, 400, 400, 400, 400, # 350, 350, 350, 350, 350, 300, 300, 300, 300, 300, # 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, # 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, # 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, # 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, # 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, # 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, # 160, 160, 160, 160, 160, 160, 160, 160, 150, 150, # 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, # 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, # 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, # 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, # 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, # 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, # 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, # 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, # 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, # 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, # 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, # 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, # 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, # 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, # 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, # 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, # 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, # 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, # 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, # 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, # 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, # 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, # 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, # 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, # 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, # 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, # 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, # 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, # 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, # 75, 75, 75, 75, 75, 74, 74, 74, 74, 74, # 74, 74, 74, 74, 73, 73, 73, 73, 73, 73, # 72, 72, 72, 72, 71, 71, 71, 71, 71, 72, # 70, 70, 70, 70, 69, 69, 69, 69, 69, 69, # 68, 68, 68, 68, 67, 67, 67, 67, 67, 67, # 66, 66, 66, 66, 65, 65, 65, 65, 65, 65, # 64, 64, 64, 64, 63, 63, 63, 63, 63, 63, # 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, # 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, # 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, # 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, # 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, # 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, # 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, # 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, # 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, # 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, # 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, # 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, # 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, # 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, # 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, # 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, # 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, # 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, # 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, # 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, # 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, # 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, # 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, # 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, # 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, # 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, # 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, # 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, # 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, # 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, # 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, # 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, # 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, # 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, # 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, # 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, # 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, # 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, # 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, # 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, # 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, # 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, # 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, # 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, # 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, # 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, # 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, # 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, # 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, # 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, # 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, # 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, # 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, # 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, #] # Для Эквестрии (1000 домохозяйств): dataset = [ 1600, 1200, 900, 700, 600, 550, 500, 450, 420, 400, 390, 380, 370, 360, 350, 340, 330, 320, 310, 300, 295, 290, 285, 280, 275, 270, 265, 260, 255, 250, 247, 244, 241, 238, 235, 232, 229, 226, 223, 220, 218, 216, 214, 212, 210, 208, 206, 204, 202, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 149, 148, 148, 147, 147, 146, 146, 145, 145, 144, 144, 144, 143, 143, 143, 142, 142, 142, 142, 141, 141, 141, 140, 140, 140, 139, 139, 139, 139, 138, 138, 138, 137, 137, 137, 136, 136, 136, 136, 135, 135, 135, 134, 134, 134, 133, 133, 133, 133, 132, 132, 132, 131, 131, 131, 130, 130, 130, 130, 129, 129, 129, 128, 128, 128, 127, 127, 127, 127, 126, 126, 126, 125, 125, 125, 124, 124, 124, 124, 123, 123, 123, 122, 122, 122, 121, 121, 121, 121, 120, 120, 120, 119, 119, 119, 118, 118, 118, 118, 117, 117, 117, 116, 116, 116, 115, 115, 115, 115, 114, 114, 114, 113, 113, 113, 112, 112, 112, 112, 111, 111, 111, 110, 110, 110, 109, 109, 109, 109, 108, 108, 108, 107, 107, 107, 106, 106, 106, 106, 105, 105, 105, 104, 104, 104, 103, 103, 103, 103, 102, 102, 102, 102, 102, 101, 101, 101, 101, 101, 100, 100, 100, 100, 100, 99, 99, 99, 99, 99, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 96, 96, 96, 96, 96, 95, 95, 95, 95, 95, 94, 94, 94, 94, 94, 93, 93, 93, 93, 93, 92, 92, 92, 92, 92, 91, 91, 91, 91, 91, 90, 90, 90, 90, 90, 89, 89, 89, 89, 89, 88, 88, 88, 88, 88, 87, 87, 87, 87, 87, 86, 86, 86, 86, 86, 85, 85, 85, 85, 85, 84, 84, 84, 84, 84, 83, 83, 83, 83, 83, 82, 82, 82, 82, 82, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 79, 79, 79, 79, 79, 78, 78, 78, 78, 78, 77, 77, 77, 77, 77, 76, 76, 76, 76, 76, 75, 75, 75, 75, 75, 74, 74, 74, 74, 74, 73, 73, 73, 73, 73, 72, 72, 72, 72, 72, 71, 71, 71, 71, 71, 70, 70, 70, 70, 70, 69, 69, 69, 69, 69, 68, 68, 68, 68, 68, 67, 67, 67, 67, 67, 66, 66, 66, 66, 66, 65, 65, 65, 65, 65, 64, 64, 64, 64, 64, 63, 63, 63, 63, 63, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 46, 46, 46, 46, 46, 46, 46, 46, 46, 45, 45, 45, 45, 45, 45, 45, 45, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 42, 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, ] #------------------------------------------------------------------------- # Функции: def dict_sort (stats): """Сортировка словаря по частоте""" stats_sort = collections.OrderedDict(sorted(stats.items(), key=lambda x: x[0], reverse=False)) #for el, val in stats_sort.items(): # print(el, val) return stats_sort def gini_coefficient(dataset_list): """Коэффициент Джини, справедливость распределения доходов в группе. Если коэф. Джини = 1 все доходы принадлежат одному. Если коэф. Джини = 0 все доходы поровну распределены. Диапазон современных государств от 0.3 в странах Европы до 0.6 в Сингапуре https://en.wikipedia.org/wiki/Gini_coefficient """ # (Warning: This is a concise implementation, but it is O(n**2) # in time and memory, where n = len(x). *Don't* pass in huge # samples!) # Mean absolute difference mad = np.abs(np.subtract.outer(dataset_list, dataset_list)).mean() # Relative mean absolute difference rmad = mad/np.mean(dataset_list) # Gini coefficient g = 0.5 * rmad return g def get_midpoint(dataset_list, money_sum_percent = 0.5): """Срез списка по сумме доходов. Суммируем все доходы, перебираем список до указанного процента этой суммы. """ # Инвертируем проценты, иначе неинтуитивно: money_sum_percent = 1 - money_sum_percent money_sum = 0 for midpoint, income in enumerate(dataset_list): if money_sum < (sum(dataset) * money_sum_percent): money_sum += income else: return midpoint def wealth_coefficient(dataset, wealthy_percent = 0.2, powerty_percent = 0.2): """Квинтильный коэффициент / децильный коэффициент Децильный коэффициент. Показывает во сколько раз минимальная заработная плата в группе 10% наиболее оплачиваемых работников Превышает максимальную заработную плату в группе 10% наименее оплачиваемых работников. Квинтильный коэффициент = капитал 20% богатейших / капитал 20% беднейших """ p_rich = round(len(dataset) * (1 - wealthy_percent)) p_poor = round(len(dataset) * powerty_percent) s_rich = sum(dataset[p_rich:]) s_poor = sum(dataset[:p_poor]) coefficient = round(s_rich / s_poor, 2) return s_rich, s_poor, coefficient def calculate_tax (income, taxation_list, tax_maximum = 0.9, tax_minimum = 0.1, tax_steps = 6): """Прогрессивный подоходный налог. Многоступенчатая ставка. Эта система оптимальна, если нет компьютеров. Вычитание и сложение на счётах. налогооблажение нарастает очень плавно, без скачков. Удобно хранится в таблицах. https://ru.wikipedia.org/wiki/Прогрессивное_налогообложение#Многоступенчатая Сахарный уголок, доход -- 2000 серебряных бит/месяц # блок дохода | ставка (%) | налог | остаток # ----------- | ---------- | ----- | ------- # 100 | 10 | 10 | 1900 # 200 | 20 | 40 | 1700 # 300 | 40 | 120 | 1400 # 400 | 60 | 240 | 1000 # 600+ | 80 | 480 | 600 # Сумма: 10 + 40 + 120 + 240 + (600 * 0.8) = 890 бит (44.5% налог) """ tax_sum = 0 tax_step_percent = tax_maximum / tax_steps # По списку создаётся словарь со степенями дохода и процентом налогов: # Используется лямбда-выражение для поиска ближайшего числа в списке (для большей точности) taxation_dict = collections.OrderedDict() for step in [n for n in range(1, tax_steps + 1)]: taxation_point = min(taxation_list) * step taxation_point = min(taxation_list, key = lambda x: abs(x - taxation_point)) taxation_percent = round(tax_step_percent * step, 3) taxation_dict[taxation_point] = taxation_percent # Обрабатываем степени дохода, по нарастающей, 140 -- 15% налог, 280 -- 30% налог. # При этом каждая обложенная налогом степень вычитается из доходов, пока не обработаем всё. for tax_point, tax_percent in taxation_dict.items(): if income >= tax_point: if tax_minimum > tax_percent: tax_percent = tax_minimum tax_sum += tax_point * tax_percent income -=tax_point else: tax_sum += income * tax_percent income = 0 break # Если доход значительно выше, чем учтённые степени, то налог максимальный: if income > 0: tax_sum += income * tax_maximum income = 0 return tax_sum #------------------------------------------------------------------------- # Запуск: # Переводим месячный доход в годовой, если нужно: dataset = sorted(dataset) if YEAR_INCOME is True: dataset = [el * 12 for el in dataset] # Находим средний доход, то есть точку 50% от суммы всех доходов: midpoint = get_midpoint(dataset, TAX_PERCENT) midpoint_tax = dataset[midpoint] print('Доходы (Податных/Всех): {i}/{ia} ({ip}%)'.format( i = sum(dataset[:midpoint]), ia = sum(dataset), ip = round(sum(dataset[:midpoint]) / sum(dataset), 3) * 100, )) print('Налогоплатильщики: {n}/{na} ({np}%)'.format( n = len(dataset) - midpoint, na = len(dataset), np = round(((len(dataset) - midpoint)) / len(dataset), 3) * 100, )) # Группируем домохозяйства по доходам в словарь (сначала общий, затем срез налогоплатильщиков): # https://ru.wikipedia.org/wiki/Прогрессивное_налогообложение#Многоступенчатая datadict = dict_sort(collections.Counter(dataset)) datadict_tax = {el:val for el,val in datadict.items() if el >= midpoint_tax} # Собираем налоги с каждого налогооблагаемого домохозяйства: tax_all = 0 dataset_tax = dataset[midpoint:] taxation_list = list(sorted(datadict_tax.keys())) datadict_tax_collection = {} print('Налог_% Доход --> Остаток (Оплатили_%, Собрано)') for el, income in enumerate(dataset_tax): #tax = calculate_tax(income, taxation_list) tax = calculate_tax(income, taxation_list, TAX_MAXIMUM, TAX_MINIMUM, TAX_STEPS) tax = round(tax, 2) dataset_tax[el] = round(income - tax) tax_all += tax print('{p}% {i} --> {a} ({n}%, {s})'.format( i = income, a = round(income - tax), p = round((tax / income) * 100), n = round(el / len(dataset_tax) * 100), s = round(tax_all), )) # Уровень бедности: # Household Income | Number | Percent | National Average # -------------------- | ------- | ------- | ---------------- # Less than $10,000 | 11,596 | 5.2% | 6.7% # $10,000 to $14,999 | 10,085 | 4.5% | 4.8% # $15,000 to $24,999 | 22,031 | 9.9% | 9.7% # $25,000 to $34,999 | 20,516 | 9.2% | 9.5% poverty_point = round(len(dataset) * POVERTY_PERCENT) # Поддержка бедняков: dotation_all = 0 dataset_poverty = dataset[:poverty_point] for el, income in enumerate(dataset_poverty): if income < max(dataset_poverty): dotation = max(dataset_poverty) - income dataset_poverty[el] = income + dotation dotation_all += dotation print('-----------------------------------------------------') print('Поддержка {np}% бедных ({mp}% бюджета): {po1}-{po2}/{pna1} ({mp1}%) --> {pn1}-{pn2}/{pna2} ({mp2}%)'.format( np = round(len(dataset_poverty) / len(dataset) * 100), po1 = min(dataset[:poverty_point]), po2 = max(dataset[:poverty_point]), pn1 = min(dataset_poverty), pn2 = max(dataset_poverty), pna1 = sum(dataset[:poverty_point]), pna2 = sum(dataset_poverty), mp = round(dotation_all / tax_all * 100, 1), mp1 = round(sum(dataset[:poverty_point]) / sum(dataset) * 100, 1), mp2 = round(sum(dataset_poverty) / sum(dataset) * 100, 1), )) # Объединяем срезы после распределения налогов: dataset_mid = dataset[poverty_point:midpoint] dataset_after = list(itertools.chain(dataset_poverty, dataset_mid, dataset_tax)) # Квинтильный коэффициент: # Распределение Парето, 20% богатых владеют таким-то доходом, 20% бедных таким-то. print('Доходы {p}% богатых: {m2}/{a2} ({ap2}%) --> {m1}/{a1} ({ap1}%)'.format( p = round(WEALTHY_PERCENT * 100), m1 = round(wealth_coefficient(dataset_after, WEALTHY_PERCENT)[0], 3), m2 = round(wealth_coefficient(dataset, WEALTHY_PERCENT)[0], 3), a1 = sum(dataset_after), a2 = sum(dataset), ap1 = round(wealth_coefficient(dataset_after, WEALTHY_PERCENT)[0] / sum(dataset_after) * 100, 1), ap2 = round(wealth_coefficient(dataset, WEALTHY_PERCENT)[0] / sum(dataset) * 100, 1), )) print('Доходы {p}% богатых: {m2}/{a2} ({ap2}%) --> {m1}/{a1} ({ap1}%)'.format( p = round(0.01 * 100), m1 = round(wealth_coefficient(dataset_after, 0.01)[0], 3), m2 = round(wealth_coefficient(dataset, 0.01)[0], 3), a1 = sum(dataset_after), a2 = sum(dataset), ap1 = round(wealth_coefficient(dataset_after, 0.01)[0] / sum(dataset_after) * 100, 1), ap2 = round(wealth_coefficient(dataset, 0.01)[0] / sum(dataset) * 100, 1), )) print('Квинтильный коэффициент: {ka} ({k} до налогов)'.format( ka = round(wealth_coefficient(dataset_after, WEALTHY_PERCENT)[2], 3), k = round(wealth_coefficient(dataset, WEALTHY_PERCENT)[2], 3), )) print('Децильный коэффициент: {ka} ({k} до налогов)'.format( ka = round(wealth_coefficient(dataset_after, 0.1, 0.1)[2], 3), k = round(wealth_coefficient(dataset, 0.1, 0.1)[2], 3), )) print('Коэффициент Джини: {ga} ({g} до налогов)'.format( ga = round(gini_coefficient(dataset_after), 3), g = round(gini_coefficient(dataset), 3), )) # Делим все семьи на 10% группы и смотрим их доли доходов: print('-----------------------------------------------------') homes_slice_number = 10 homes_slice = round(len(dataset_after) / homes_slice_number) datadict_slices = collections.OrderedDict() homes_slice_start = 0 homes_slice_end = homes_slice for n in range(0, homes_slice_number): data_slice = dataset_after[homes_slice_start:homes_slice_end] datadict_slices[((homes_slice_start, homes_slice_end), min(data_slice), max(data_slice))] = sum(data_slice) homes_slice_start += homes_slice homes_slice_end += homes_slice print('Семьи -- доходы/средние (богатство_%):') for key, value in datadict_slices.items(): print('{s1}-{s2} -- {i_min}-{i_max}/{i_mid} ({i_percent}%)'.format( s1 = key[0][0], s2 = key[0][1], i_min = key[1], i_max = key[2], i_mid = round((key[1] + key[2]) / 2), income = value, i_percent = round(value / sum(dataset_after) * 100, 1), ))