Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Большие данные и машинне обучение (v2) - лекция...

Anton
December 10, 2024

Большие данные и машинне обучение (v2) - лекция-4: табличные данные в Python, библиотека Pandas

Лекция курса "Большие данные и машинное обучение" (v2.0-МОТ)
Лекция-4: визуализация данных Python+Pandas+Matplotlib

Часть-1
- Обзор библиотек визуализации данных: Matplotlib, Seaborn, Mayavi
- 3д: Matplotlib axis-3d vs Mayavi
- Matplotlib pyplot + NumPy: математика над вектором значений, график по точкам
- Pandas + Matplotlib: DataFrame.plot
- Данные: датасет ILO (МОТ - Международная организация труда) ilostat.ilo.org
- Таблица для анализа: средня зарплата по видам деятельности, полу, странам и годам
- Этапы решения задачи по визуализации: задать вопрос, на который ответит график, выбрать подходящий типовой график, подготовить данные - фильтрация, группировка, прочие преобразования
- Строим график: столбчатая диаграмма (bar chart) средней зарплаты в России по годам в долларах США (CUR_TYPE_USD)
- Подготовка данных: фильтрация данных, выбор колонок для столбиков, группировка значений по горизонтаельной оси - DataFrame.set_index
- Заголовок и легенда
- Несколько стобликов внутри групп, рубли и доллары на одном графике: простой set_index не подойдет, необходимо перегруппировать данные
- Сводная таблица DataFrame.pivot_table: превратить повторяющиеся категории в колонки
- Несколько стобликов внутри групп, рубли и доллары на одном графике: после перегруппировки сводной таблицей получилось ок
- Галопирующая инфляция и деноминация: несопоставимый масштаб данных на одном графике
- Логарифмическая шкала, подводные камни логарифма
- Несколько графиков в одном окне (subplots=True)
- Ручное масштабирование данных: ретроспективная деноминация
- Номинальная зарплата, реальное содержание заработной платы, индекс потребительских цен (инфляция)
- Данные по индексам потребильских цен: МОТ, Росстат

Часть-2
- Номинальная зарплата, реальное содержание заработной платы, индекс потребительских цен (ИПЦ),
- Изменение ИПЦ в % (инфляция)
- Данные: датасет ILO (МОТ - Международная организация труда) ilostat.ilo.org
- Таблица для анализа: средня зарплата по видам деятельности, полу, странам и годам
- Данные по индексам потребильских цен: МОТ, Росстат
- График инфляции по годам
- Мультииндекс, объединение таблиц средней зарплаты и ИПЦ по мультииндексу
- График: зарплата vs инфляция
- Номинальное значение заработной платы vs реальное содержание заработной платы в ценах 1992 года
- Группировка данных, групповые операции DataFrame → GroupBy → DataFrame
- Кумулятивное (накопленное) произведение GroupBy.cumprod
- Корректировка значения средней заработной платы на значения инфляции по годам в группах по странам
- График: реальное содержание заработной платы vs номинальная заработная плата в ценах 1992 года по годам в России
- Графики: реальное содержание заработной платы в ценах 1992 года vs номинальная заработная плата по годам, страны: США, КНР, Польша, Япония и т.п.
- Ретроспективное приведение зарплаты к ценам 2019 года
- Сдвиг данных внутри группы: GroupBy.shift
- Графики: номинальная зарплата vs реальное содержание зарплаты в ценах 2019 года по годам, страны: Россия, США, КНР
- Заключение:
-- Визуализация данных - еще один инструмент извлечения знаний из данных.
-- Значительную часть работы составляет подготовка (преобразование) данных для построения графика. Если данные подготовлены, построение графика технически не вызывает проблем.

Большие данные и машинное обучение, лекция-4: визуализация данных Python+Pandas+Matplotlib, часть-1
https://www.youtube.com/watch?v=STedHqTtCHg
Большие данные и машинное обучение, лекция-5: визуализация данных Python+Pandas+Matplotlib, часть-2
https://www.youtube.com/watch?v=99qSuwRyrzE

Anton

December 10, 2024
Tweet

More Decks by Anton

Other Decks in Education

Transcript

  1. 3d: Matplotlib vs Mayavi • Matplotlib — 3d не настоящее

    (проблемы проявляются при пересечении плоскостей и фигур) • Mayavi — настоящий OpenGL При этом • API matplotlib достаточно удобен и интуитивен • С Mayavi нужно привыкнуть к тому, что некоторые вещи сделаны не так, как можно ожидать
  2. Seaborn seaborn.pydata.org • Библиотека визуализации данных, на базе matplotlib •

    Больше графиков • Некоторые графики те же, что и matplotlib, но симпатичнее
  3. import matplotlib.pyplot as plt import numpy as np X =

    np.linspace(0,1) Y = X**3 - X**2 - 2 plt.plot(X, Y) plt.show()
  4. print(Y): [ -2. -2.00040799 -2.00159797 ... -2.03755238 -2.01958368 -2. ]

    print(X): [ 0. 0.02040816 0.04081633 ... 0.95918367 0.97959184 1. ]
  5. www.ILO.org > статистика и базы данных www.ilo.org/global/statistics-and-databases/lang-- en/index.htm • Ссылки

    в разделе: - всякие нормативные документы - на портал статистики ILOSTAT • ILOSTAT: The leading source of labour statistics ilostat.ilo.org
  6. Зайдём в раздел • Working conditions > Wages ilostat.ilo.org/topics/wages/ •

    Data > Mean nominal monthly earnings of employees by sex and economic activity | Annual • Zipped CSV: www.ilo.org/ilostat-files/WEB_bulk_download/indicator/ EAR_4MTH_SEX_ECO_CUR_NB_A.csv.gz • Расшифровки кодов: www.ilo.org/ilostat-files/WEB_bulk_download/html/bulk_dic.html
  7. Файл: EAR_4MTH_SEX_ECO_CUR_NB_A.csv • Колонки: ref_area, indicator, source, sex, classif1, classif2,

    time, obs_value, note_classif, note_indicator, note_source • 275217 строк (без заголовка)
  8. Файл: EAR_4MTH_SEX_ECO_CUR_NB_A.csv • ref_area — код территории (код страны), •

    indicator — EAR_4MTH_SEX_ECO_CUR_NB_A • source — код источника данных (см. далее) • sex — пол • classif1 — классификатор-1: вид деятельности (см. далее) • classif2 — классификатор-2: валюта (см. далее) • time — год • obs_value — целевое значение: средняя зарплата для указанной страны для вида деятельности и т. п. в указанный год в указанной валюте • note_classif, note_indicator, note_source — дополнительные заметки
  9. Pandas + Matplotlib: DataFrame.plot • Группируем данные, если необходимо: колонки

    с повторяющимися значениями (категории) • Выбираем числовые колонки, значения которых будем рисовать внутри категорий • Рисуем график с DataFrame.plot • Под капотом Matplotlib
  10. Pandas + Matplotlib: DataFrame.plot • Типовых графиков конечное количество, используется

    регулярно еще меньше • Поэтому способ представления данных обычно не изобретаем, а выбираем • Творческая часть: - задать вопрос, на который должна ответить визуализация - выбрать форму визуализации (что будет на графике) - правильно сгруппировать данные, чтобы получить наглядную визуализацию, которая поможет ответить на поставленный вопрос • Итого: львиная доля работы по визуализации — это манипулирование данными, т. е. преобразования таблиц
  11. pandas-matplotlib-ilo-test.py import pandas import numpy as np import matplotlib.pyplot as

    plt data = pandas.read_csv('EAR_4MTH_SEX_ECO_CUR_NB_A.csv') # уберем багованые данные data = data[ (data.ref_area != 'BLR') & (data.ref_area != 'ZWE') ] # и лишние колонки data = data[ ['ref_area', 'sex', 'classif1', 'classif2', 'time', 'obs_value']] # сразу возьмем среднее по всем видами деятельности и по всем полам data = data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') ]
  12. data[ (data.ref_area == 'RUS') & (data.classif2 == 'CUR_TYPE_USD') ] [['time',

    'obs_value']].plot(kind='bar') Попробуем наудачу • pandas-docs.github.io/pandas-docs- travis/reference/api/pandas.DataFrame.plot.html
  13. time obs_value 226446 1997 164.22 226517 2005 302.46 226571 2006

    391.09 226625 2007 531.37 226679 2008 695.69 226733 2009 587.20 226787 2010 689.94 226841 2011 795.34 226895 2012 863.46 226949 2013 935.76 227003 2014 846.70 227057 2015 558.44 227111 2016 547.44 227267 2017 661.76 227377 2019 690.93
  14. Видим • На вертикальной оси значения числовых колонок • На

    горизонтальной оси группировка по индексу • Чтобы значения time попали на горизонтальную ось, нужно, чтобы колонка time стала индексом
  15. data_rus = data[data.ref_area == 'RUS'] data_rus = data_rus.set_index('time').sort_index() print( data_rus[

    data_rus.classif2 == 'CUR_TYPE_USD'] ) Данные по России с индексом по годам • pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.set_index.html • pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.sort_index.html
  16. ref_area sex classif1 classif2 obs_value time 1997 RUS SEX_T ECO_AGGREGATE_TOTAL

    CUR_TYPE_USD 164.22 2005 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 302.46 2006 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 391.09 2007 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 531.37 2008 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 695.69 2009 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 587.20 2010 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 689.94 2011 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 795.34 2012 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 863.46 2013 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 935.76 2014 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 846.70 2015 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 558.44 2016 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 547.44 2017 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 661.76 2019 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 690.93
  17. • Важно: здесь имя колонки «time», а не сама колонка

    data_rus.time (т. е. не data_rus[«time»]), иначе колонка «time» сохранится в таблице • Сразу отсортируем по годам, т. е. уже по индексу (по факту они и так идут в нужном порядке, но так не обязательно всегда будет) • Не путать с DataFrame.reindex pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.reindex.html stackoverflow.com/questions/50741330/difference-between-df- reindex-and-df-set-index-methods-in-pandas
  18. • 1998 — 2004, 2018: дыра в данных (ничего не

    поделаешь — так бывает) • Можно добавить из другого источника • Или конвертировать из другой валюты по курсу (если есть данные за этот период) • Можно экстраполировать по крайним значениям (подойдет не для каждой задачи) • И т. п. • Оставим как есть
  19. Добавим заголовок и поправим легенду ax = data_rus[data_rus.classif2 == 'CUR_TYPE_USD'][['obs_value']].

    plot(title='Среднемесячная зарплата в России по годам', kind='bar') ax.legend(['Среднемесячная зарплата (USD)'])
  20. Замечание • Matplotlib на Python 2.7 по умолчанию не дружит

    с юникодом • Например, если в заголовок plot:title добавить что-то на русском, получим: UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128) • С Python 3 — всё ок
  21. Кстати • Можно не выбирать колонки, в таком случае будут

    построены столбики для всех числовых колонок (в нашем случае она всё равно только одна) • Если числовых колонок нет, то будет ошибка TypeError: Empty 'DataFrame': no numeric data to plot
  22. ref_area sex classif1 classif2 obs_value time 1995 RUS SEX_T ECO_AGGREGATE_TOTAL

    CUR_TYPE_LCU 472392.00 1996 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 790210.00 1997 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 950.00 1997 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 289.91 1997 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 164.22 1998 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 1051.00 2005 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 8555.00 2005 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 638.87 2005 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 302.46 ... 2016 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 36709.00 2016 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 1449.45 2016 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 547.44 2017 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 38609.00 2017 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 1530.99 2017 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 661.76 2019 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 44729.00 2019 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 690.93
  23. Наглядность так себе • Высокий столбик слева (позже разберемся) •

    Повторяющиеся метки по годам по горизонтали • Не видно, где какая валюта • Нужно как-то сгруппировать валюты по годам: - чтобы по горизонтали шли по порядку годы - на каждом году было несколько столбиков — по одному на каждую валюту
  24. Нужно сгруппировать по годам и разбить по валютам • DataFrame.plot

    так сделает, если: - год будет уникальным индексом - а значения валют для каждого года будут храниться в отдельных колонках CUR_USD, CUR_LOC, CUR_PPP • Т.е. уникальные значения колонки classif2 нужно превратить в новые колонки • Это делает DataFrame.pivot_table — генератор сводных таблиц
  25. classif2 CUR_TYPE_LCU CUR_TYPE_PPP CUR_TYPE_USD time 1995 472392.0 NaN NaN 1996

    790210.0 NaN NaN 1997 950.0 289.91 164.22 1998 1051.0 NaN NaN 2005 8555.0 638.87 302.46 2006 10634.0 782.08 391.09 2007 13593.0 947.50 531.37 2008 17290.0 1147.17 695.69 2009 18638.0 1169.03 587.20 2010 20952.0 1253.61 689.94 2011 23369.0 1252.69 795.34 2012 26629.0 1414.77 863.46 2013 29792.0 1425.99 935.76 2014 32495.0 1453.57 846.70 2015 34030.0 1382.00 558.44 2016 36709.0 1449.45 547.44 2017 38609.0 1530.99 661.76 2019 44729.0 NaN 690.93
  26. pandas.DataFrame.pivot_table • Pivot table — сводная таблица • values: колонка

    исходной таблицы — значения, которые будут сгруппированы в сводной таблице (values+aggfunc) • index: колонка исходной таблицы — первая колонка сводной таблицы, уникальные значения колонки исходной таблицы — ключи для группировки в сводной таблице • columns: колонка исходной таблицы => колонки сводной таблицы: уникальные значения из колонки исходной таблицы превратятся в колонки сводной таблицы • aggfunc: функция группировки значений values • Результат: объект DataFrame
  27. pandas.DataFrame.pivot_table:aggfunc • Операция агрегирования — функция (или набор функций), применяемая

    к столбцу value • Если строка, то функция из Series (он же — одномерный ndarray) (??): 'sum', 'mean', 'count', 'min', 'max' и т. п. • Или функция из Numpy (без кавычек): np.xxx np.sum, np.mean, np.min и т. п. (те, которые принимают на входе массив, а на выходе дают число?) • Может быть собственная функция • По умолчанию: numpy.mean (np.mean)
  28. classif2 CUR_TYPE_LCU CUR_TYPE_PPP CUR_TYPE_USD time 1995 472392.0 NaN NaN 1996

    790210.0 NaN NaN 1997 950.0 289.91 164.22 1998 1051.0 NaN NaN 2005 8555.0 638.87 302.46 2006 10634.0 782.08 391.09 2007 13593.0 947.50 531.37 2008 17290.0 1147.17 695.69 2009 18638.0 1169.03 587.20 2010 20952.0 1253.61 689.94 2011 23369.0 1252.69 795.34 2012 26629.0 1414.77 863.46 2013 29792.0 1425.99 935.76 2014 32495.0 1453.57 846.70 2015 34030.0 1382.00 558.44 2016 36709.0 1449.45 547.44 2017 38609.0 1530.99 661.76 2019 44729.0 NaN 690.93
  29. Данные ок, наглядность так себе • в 1996 большое значение,

    на его фоне не видно другие годы • Причина (очевидно) — рублевые (CUR_TYPE_LCU) значения зарплаты: сначала — сотни тысяч, потом — деноминация
  30. «Брат» (1997) Дед: Чего надо? Д.Б.: Дед, продай ружье —

    Мильён — Неси — Хех, деньги наперед давай — [отсчитал $200 — две купюры по $100] — ДоллАры — Здесь миллион двести, патроны тащи все
  31. Проблема: несопоставимый масштаб данных на одном графике • Решение: -

    или что-то сделать с данными (например, деноминировать ретроспективно) - или сделать логарифмическую ось
  32. Логарифм • Сохраняет отношения «больше» - «меньше» - «равно» между

    значениями x 1 , x 2 • При малом x: изменение [log(x+Δx) - log(x)] существенно • При большом x: изменение [log(x+Δx) - log(x)] ничтожно • Если применяем к вертикальной шкале: - в нижней части графика видно малые значения как большие - в верхней части графика видно большие значения как малые
  33. Подводные камни логарифма: • На графике важно понимать, что сравнивать

    абсолютные перепады уже нельзя, только относительные • В режиме stacked=True (столбики не рядом, а один на одном): - Логарифмическая шкала исказит соотношение размеров блоков внутри одной колонки - Решение: не использовать режим стека совместно с логарифмической шкалой • Не удобно смотреть на шкале абсолютные значения
  34. Деноминируем ретроспективно • Денежная реформа в России – деноминация рубля

    в тысячу раз (указ 1997, смена масштаба — с 1 января 1998) ria.ru/20170804/1499605988.html • Очевидно, на графике (данные ILO) зарплата за 1997 год указана уже в деноминированных рублях • В нашем наборе данных зарплаты за 1995 и 1996 год в строках CUR_TYPE_LCU указаны в неденоминированных рублях • Переведем значения средних зарплат за 1995 и 1996 год в деноминированный номинал
  35. • Обошлись без логарифмической шкалы — можно посмотреть абсолютные значения

    и сравнивать значения столбцов в рублях • Можно было бы еще посмотреть среднюю зарплату в 1995 и 1996 году в долларах (скорее всего обошлось бы без номинального скачка), но в базе ILO данных в долларах за эти годы для России нет • Видим, что уровень средних зарплат в России в рублях (CUR_TYPE_LCU) после 1997 года значительно вырос (к 2005 году — в несколько раз) • В долларах (CUR_TYPE_USD) тоже вырос, но не так сильно, как в рублях
  36. Как правильнее? • При деноминации сохраняется единица измерения валюты (как

    были рубли, так и остались) • Почему тогда зарплату в неденоминированных рублях из 1996- го года нельзя сравнивать с зарплатой в деноминированных рублях из 1998-го? • Тем более, что зарплата и так все время колеблется — то растет, то понижается, • а в некоторых отдельных случаях мы можем без деноминации в одно и то же время увидеть разницу в зарплатах в 1000 раз.
  37. Реальное содержание зарплаты • Всё дело в том, что при

    деноминации вместе с тысячекратным понижением номинальной зарплаты тысячекратно же понижаются цены на продукты потребления. • Т.е. на деноминированную зарплату можно купить такое же количество продуктов по деноминированным ценам, какое можно было купить на неденоминированную зарплату по неденоминированным ценам. • Таким образом, сам факт деноминации не приводит к уменьшению реального содержания зарплаты, • Хотя обычно деноминация сопровождается другими разными экономическими процессами и происходит не от хорошей жизни.
  38. Таким образом • Мы не можем вполне корректно сравнивать неденоминированную

    и деноминированную зарплату потому, что при деноминации одномоментно с изменением номинального уровня зарплаты изменяются цены на продукты потребления • Но ведь цены на продукты потребления и так всё время изменяются — то понижаются, то увеличиваются • Получается, что мы так же не можем сравнивать любые зарплаты как денежные суммы после того, как изменились цены на продукты потребления, даже если не проводить деноминацию? • Строго говоря, но в некотором роде: ДА
  39. «Остин Пауэрс: Человек-загадка международного масштаба», 1997 • Доктор Зло заморозил

    себя в 1967 году, • Разморозил в 1997 (спустя 30 лет) • Да и «сто миллиардов долларов» сейчас (в 2021 году) уже не те
  40. Визуализация данных Python + Pandas + Matplotlib часть-2: группировка данных,

    сдвиг данных данные: инфляция, сравнение покупательных способностей заработных плат
  41. • Зарплата — это денежное выражение стоимости товара «рабочая сила»

    • Вычисляется как сумма цен всех необходимых жизненных средств: продукты (еда, одежда, водопровод, электричество, гаджеты, транспорт, жилье и т. п.), услуги (образование, медицина, культура и т. п.) • Инфляция — это повышение цен на все товары, кроме товара «рабочая сила»
  42. Зарплата vs цены на продукты • При неизменной зарплате -

    Цены на продукты растут — реальное содержание зарплаты уменьшается - Цены на продукты уменьшаются — реальное содержание зарплаты увеличивается • Если зарплата и цены на продукты изменяются одновременно, то реальное содержание зарплаты будет зависеть от направления и скорости изменения номинальной зарплаты и прочих цен
  43. Индекс потребительских цен • Если мы хотим отслеживать не только

    номинал, но и реальное содержание зарплаты, нам следует иметь на руках как минимум: - исторические цены на продукты, бытовую технику, жилье, проценты по ипотеке, образование и т. п. - исторический список продуктов, которые входят в популярных набор потребления (потребительская корзина) в том или ином году в той или иной стране
  44. Индекс потребительских цен • Можете представить себе, насколько легко собрать

    и систематизировать такую информацию • По сути, это полное отражение всей экономики всего современного мира (см. глобализация) • Такими данными располагают некоторые специализированные организации и государственные службы статистики
  45. Ilostat.ilo.org > Inflation • Competitiveness > Inflation ilostat.ilo.org/topics/inflation/ • Data

    > National consumer price index (CPI) by COICOP, percentage change from previous year (%) | Annual www.ilo.org/ilostat-files/WEB_bulk_download/indicator/ CPI_NCYR_COI_RT_A.csv.gz • Расшифровки кодов: www.ilo.org/ilostat-files/WEB_bulk_download/html/bulk_dic.html
  46. Файл CPI_NCYR_COI_RT_A.csv • This indicator shows the percentage change of

    the CPI between a period and the same period of the previous year. • Consumer price indices (CPIs) measure changes over time in the level of prices of goods and services that households consume.
  47. Видим колонки • ref_area — код территории (страны) • indicator

    — CPI_NCYR_COI_RT • source — код источника данных • classif1 — классификатор • time — год • obs_value — изменение индекса цен (CPI) в процентах (CPI change) • note_source — заметки к источнику
  48. print( data_cpi.classif1.value_counts() ) и посмотрим classif1 COI_COICOP_CP01T12 4291 COI_COICOP_CP01 3566

    COI_COICOP_CP04 2584 COI_COICOP_CP03 2547 COI_COICOP_CP06 2539 COI_COICOP_CP07 2536 COI_COICOP_CP05 2530 COI_COICOP_CP02 2512 COI_COICOP_CP09 2504 COI_COICOP_CP12 2499 COI_COICOP_CP08 2454 COI_COICOP_CP10 2426 COI_COICOP_CP11 2351 Name: classif1, dtype: int64
  49. bulk_dic/classif1_en.csv • "COI_COICOP_CP01T12","COICOP2012: General - Individual consumption expenditure of households",543

    • "COI_COICOP_CP01","COICOP2012: 1. Food and non-alcoholic beverages",544 • "COI_COICOP_CP02","COICOP2012: 2. Alcoholic beverages, tobacco and narcotics",545 • "COI_COICOP_CP03","COICOP2012: 3. Clothing and footwear",546 • "COI_COICOP_CP04","COICOP2012: 4. Housing, water, electricity, gas and other fuels",547 • "COI_COICOP_CP05","COICOP2012: 5. Furnishings, household equipment and routine household maintenance",548 • "COI_COICOP_CP06","COICOP2012: 6. Health",549 • "COI_COICOP_CP07","COICOP2012: 7. Transport",550 • "COI_COICOP_CP08","COICOP2012: 8. Communication",551 • "COI_COICOP_CP09","COICOP2012: 9. Recreation and culture",552 • "COI_COICOP_CP10","COICOP2012: 10. Education",553 • "COI_COICOP_CP11","COICOP2012: 11. Restaurants and hotels",554 • "COI_COICOP_CP12","COICOP2012: 12. Miscellaneous goods and services",555
  50. data_cpi = data_cpi[data_cpi.classif1 == 'COI_COICOP_CP01T12'] [['ref_area', 'time', 'obs_value']] data_cpi =

    data_cpi.rename(columns={'obs_value': 'cpi_change'}) data_cpi = data_cpi.set_index(['ref_area', 'time'])
  51. • Оставим только "COI_COICOP_CP01T12" («General - Individual consumption expenditure of

    households» - общее индивидуальное потребление домохозяйств) • Удалим лишние колонки • Сделаем двойной индекс (мультииндекс, multiindex): группировка сначала по ref_area, потом по time
  52. print( data_cpi ) Мультииндекс — двойное вложение cpi_change ref_area time

    ABW 2012 0.63 2013 -2.37 2014 0.42 2015 0.47 2016 -0.93 2017 -1.03 2018 3.63 2019 4.26 AFG 2012 6.44 2013 7.39 2014 4.67 2015 -0.66 2016 4.38 2017 4.98 2018 0.63 2019 2.30 AGO 2012 10.28 2013 8.78 2014 7.28 ...
  53. print( data_cpi.loc['RUS'] ) data_cpi.loc['RUS'].sort_index()[['cpi_change']]. plot(title='Инфляция (изм. ИПЦ в %) в

    России по годам (ILO)', kind='bar') Посмотрим по России • DataFrame.loc — обращение по метке индекса (здесь: выбрать все строки с индексом «RUS») pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html
  54. cpi_change time 1993 874.25 1994 307.72 1995 197.41 1996 47.75

    1997 14.76 1998 27.69 1999 85.75 2000 20.80 2001 21.48 2002 15.79 ... 2014 7.82 2015 15.53 2016 7.04 2017 3.68 2018 2.88 2019 4.47 2020 3.38
  55. Здесь • Индекс потребительских цен (ИПЦ) (consumer price index, CPI)

    — отношение цены набора продуктов на определенную дату к цене на набор тех же (или аналогичных) продуктов на другую более раннюю дату (в процентах) • Инфляцией в публицистике обычно называют изменение индекса потребительских цен (CPI change) в процентах • На графике: - cpi_change — изменение ИПЦ (CPI change) - данные по России: 1993 — 2020 годы без пропусков
  56. «Как Росстат считает инфляцию и можно ли его перепроверить» rosstat.gov.ru/ps/inflation/

    • Индекс потребительских цен – статистический показатель, показывающий изменение стоимости набора определенных товаров и услуг. • Инфляция = Индекс - 100% Если индекс больше 100%, то это инфляция, если меньше – дефляция.
  57. # Подклеим данные по инфляции к данным по зарплатам data

    = data.join(data_cpi, on=['ref_area', 'time']) Склеим инфляцию с зарплатами • DataFrame.join уже использовали в прошлый раз • У data_cpi не просто так двойной индекс «ref_area + time» • В таблице data появится новая колонка — cpi_change
  58. data[ (data.ref_area == 'RUS') & (data.classif2 == 'CUR_TYPE_LCU') & (data.time

    > 1992) ].set_index('time').sort_index()[['obs_value', 'cpi_change']]. plot(title='Зарплата (LCU) vs инфляция (в %) в России по годам (ILO)', kind='bar', subplots=True) Зарплата vs инфляция в России
  59. Здесь • Высокие зарплаты перед деноминацией сопровождаются высокой инфляцией •

    Номинальное падение цен в 1000 раз после деноменации не отражено в проценте инфляции (иначе, он должен быть отрицательным в этот год) • Более того, изменение индекса показывает продолжение роста цен • Вывод: индекс потребительских цен считают так, чтобы деноминация не влияла на него (неденоминированные цены сравнивают с недоменированными, деноминированные — с деноминированными) - TODO: проверить методику Росстата по документам наверняка (возможно, в законе о деноминации 1997 года)
  60. Здесь • 1995-1996 видно, что повышение зарплаты реагирует на инфляцию

    с задержкой в 1 год • Пропуск данных: не показаны годы, для которых нет значения зарплаты obs_value в выбранной валюте (LCU) - у нас инфляция есть с 1993 года, но зарплаты только с 1995 - нет данных по зарплатам с 1999 по 2004 год
  61. Здесь • Хотя мы видим, что определенная связь между ростом

    зарплаты и уровнем инфляции есть, не вполне очевидно, насколько рост зарплаты соответствует уровню инфляции • зарплаты растут в абсолюте, а инфляция за каждый год указана по отношению к предыдущему году
  62. Чтобы сравнивать более корректно динамику зарплат и инфляции, нужно: •

    или как-то вычислить прирощение зарплаты от года к году в процентах • или привести уровень зарплат с учетом инфляции (реальное содержание), например, к началу рассматриваемого периода • если мы смотрим динамику роста номинальной зарплаты, то мы можем сравнивать их с началом рассматриваемого периода • было бы логично привести реальные зарплаты к началу того же периода с учетом ежегодной инфляции
  63. Для данных ILO • У нас есть только значение изменения

    ИПЦ (CPI change): cpi_change (%) • Дополнительно вычислим: - ИПЦ (CPI): cpi_value = 100 + cpi_change (%) - ИПЦ-множитель (ИПЦ как доля): cpi_factor = cpi_value / 100 • Например: - инфляция (изменение ИПЦ): cpi_change = 5% - ИПЦ: cpi_value = 100 + 5 = 105% - ИПЦ-множитель: cpi_factor = 1.05
  64. # значение ИПЦ (CPI) (в процентах, 100 - без изменений)

    data_cpi['cpi_value'] = data_cpi.cpi_change + 100 # ИПЦ как множитель (доля, 1 - без изменений) data_cpi['cpi_factor'] = data_cpi.cpi_value / 100 Значение ИПЦ в процентах и абсолюте • Обратите внимание: здесь между делом добавили новые колонки через оператор «квадратные скобки»
  65. Желтые столбики сравнивать удобнее • Аналогичным образом можно свести зарплаты

    за следующие годы к ценам 1992-го года • Как будто в 1992-м году заморозили цены на все продукты • И дальше только меняли среднюю заработную плату из года в год
  66. • В 1993-м году ИПЦ и так указан по отношению

    к 1992-му году: - стоимость корзины товаров в 1992-м году: cpi_value[1992]% = 100% = x д.е. (денежных единиц) - стоимость корзины товаров в 1993-м году: cpi_value[1993]% от стоимости этой же корзины в 1992-м году = x * cpi_factor[1993] • В 1994-м году ИПЦ указан по отношению к 1993-му году: - стоимость корзины товаров в 1993-м году: x * cpi_factor[1993] - стоимость корзины товаров в 1994-м году: (x * cpi_factor[1993]) * cpi_factor[1994] - (cpi_factor[1993] * cpi_factor[1994]) — множитель ИПЦ в 1994-м году по отношению к 1992-му году • И так далее до 2020: - (cpi_factor[1993] * … * cpi_factor[2020]) — множитель ИПЦ в 2020-м году по отношению к 1992-му году
  67. Получили: • Для того, чтобы узнать ИПЦ для выбранного года

    по отношению к 1992- му году, нужно перемножить ИПЦ-множители подряд между собой начиная с текущего года до (1992+1)=1993 года включительно (в 1992 множитель ИПЦ = 1) • Зная ИПЦ для 1992-го года в выбранном году, можно узнать, во сколько раз подорожал (или подешевел) набор товаров в выбранном году по сравнению с 1992-м годом • В таблице это можно сделать легко при помощи операции кумулятивного (накопленного) произведения (cumulative product) для колонки cpi_factor • Запишем результат для каждого года в новую колонку cpi_factor_1992
  68. Дополнительно: сбросить индекс ref_area time obs_value cpi_change 0 FRA 2014

    2905.0 2.11 1 RUS 2014 32495.0 14.11 data.group_by(by='ref_area').max() time obs_value cpi_change ref_area FRA 2014 2905.0 2.11 RUS 2014 32495.0 14.11 data.group_by(by='ref_area').max().reset_index()
  69. • Доступ к строкам по мультииндексу pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Index.get_level_values.html • Group by:

    split-apply-combine pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html pandas.pydata.org/pandas-docs/stable/reference/groupby.html • GroupBy.cumprod pandas.pydata.org/pandas- docs/stable/reference/api/pandas.core.groupby.GroupBy.cumprod.html#pandas.core.groupby .GroupBy.cumprod www.datasciencemadesimple.com/cumulative-product-of-column-in-pandas-python-2/
  70. cpi_change cpi_value cpi_factor cpi_factor_1992 ref_area time RUS 1993 874.25 974.25

    9.7425 9.742500 1994 307.72 407.72 4.0772 39.722121 1995 197.41 297.41 2.9741 118.137560 1996 47.75 147.75 1.4775 174.548245 1997 14.76 114.76 1.1476 200.311566 1998 27.69 127.69 1.2769 255.777839 1999 85.75 185.75 1.8575 475.107335 2000 20.80 120.80 1.2080 573.929661 2001 21.48 121.48 1.2148 697.209752 2002 15.79 115.79 1.1579 807.299172 2003 13.66 113.66 1.1366 917.576239 2004 10.89 110.89 1.1089 1017.500291 2005 12.69 112.69 1.1269 1146.621078 2006 9.67 109.67 1.0967 1257.499336 2007 9.01 109.01 1.0901 1370.800027 2008 14.11 114.11 1.1411 1564.219910 2009 11.65 111.65 1.1165 1746.451530 2010 6.85 106.85 1.0685 1866.083460 2011 8.44 108.44 1.0844 2023.580904 2012 5.07 105.07 1.0507 2126.176455 2013 6.75 106.75 1.0675 2269.693366 2014 7.82 107.82 1.0782 2447.183387 2015 15.53 115.53 1.1553 2827.230967 2016 7.04 107.04 1.0704 3026.268028 2017 3.68 103.68 1.0368 3137.634691 2018 2.88 102.88 1.0288 3227.998570 2019 4.47 104.47 1.0447 3372.290106 2020 3.38 103.38 1.0338 3486.273512
  71. cpi_change cpi_value cpi_factor cpi_factor_1992 ref_area time USA 1993 2.95 102.95

    1.0295 1.029500 1994 2.61 102.61 1.0261 1.056370 1995 2.81 102.81 1.0281 1.086054 1996 2.93 102.93 1.0293 1.117875 1997 2.34 102.34 1.0234 1.144034 1998 1.55 101.55 1.0155 1.161766 1999 2.19 102.19 1.0219 1.187209 2000 3.38 103.38 1.0338 1.227336 2001 2.83 102.83 1.0283 1.262070 2002 1.59 101.59 1.0159 1.282137 2003 2.27 102.27 1.0227 1.311242 2004 2.68 102.68 1.0268 1.346383 2005 3.39 103.39 1.0339 1.392025 2006 3.23 103.23 1.0323 1.436988 2007 2.85 102.85 1.0285 1.477942 2008 3.84 103.84 1.0384 1.534695 2009 -0.36 99.64 0.9964 1.529170 2010 1.64 101.64 1.0164 1.554248 2011 3.16 103.16 1.0316 1.603362 2012 2.07 102.07 1.0207 1.636552 2013 1.46 101.46 1.0146 1.660446 2014 1.62 101.62 1.0162 1.687345 2015 0.12 100.12 1.0012 1.689370 2016 1.26 101.26 1.0126 1.710656 2017 2.13 102.13 1.0213 1.747093 2018 2.44 102.44 1.0244 1.789722 2019 1.81 101.81 1.0181 1.822116 2020 1.23 101.23 1.0123 1.844528
  72. DataFrame.groupby, GroupBy.cumprod • DataFrame.groupby возвращает объект-группу GroupBy, который очень похож

    на DataFrame, но это не DataFrame (и не наследник DataFrame) • GroupBy.cumprod возвращает объект DataFrame — преобразованную таблицу, результат операции над сгруппированными значениями исходной таблицы с сохранением группировки в виде мультииндекса • Предварительная группировка groupby позволяет вычислить кумулятивное произведение не для всей таблицы (DataFrame.cumprod), а для отдельных групп значений (GroupBy.cumprod) • Важно для операции cumprod: предварительно отсортировать значения внутри групп — с тех значений, которые окажутся наверху каждой из групп, начнется накопление произведения
  73. data_cpi_1993.loc['RUS'].sort_index() [['cpi_factor', 'cpi_factor_1992']]. plot(title='Ежегодная инфляция и инфляция по отношению к

    1992 в России (ILO)', kind='bar', subplots=True) Ежегодный ИПЦ-множитель и ИПЦ-множитель по отношению к 1992
  74. • На нижнем графике накопленное произведение верхних столбцов • Если

    мы знаем цену товара в 1992 году, умножаем ее на значение cpi_factor_1992 для выбранного года и получаем цену этого товара с учетом инфляции в выбранном году • Или если мы знаем цену товара в выбранном году, делим ее на значение cpi_factor_1992 для выбранного года и получаем цену этого товара с учетом отмененной инфляции в 1992 году • Например, у нас есть зарплата (цена товара «рабочая сила») рабочего в 2015 году. Делим её на cpi_factory_1992 для 2015- года, получаем реальное наполнение зарплаты (суммарную цену продуктов, которые можно на неё купить) в ценах 1992-го года
  75. data = data.drop(columns=['cpi_change']) data = data.join(data_cpi_1993, on=['ref_area', 'time']) Склеим инфляцию

    с зарплатами (еще раз) • После прошлого склеивания у нас в data уже осталась колонка cpi_change • Удалим её здесь, чтобы данные не перегружать pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html • В таблице data появятся новые колонки: cpi_value, cpi_factor, cpi_factor_1992
  76. Реальное содержание зарплаты по годам в ценах 1992 data['wage_corr_cpi_1992'] =

    data.obs_value / data.cpi_factor_1992 • Новая колонка: data.wage_corr_cpi_1992
  77. Реальное содержание зарплаты по годам в ценах 1992 в России

    data_rus_lcu_1993 = data[ ( data.ref_area == 'RUS') & (data.classif2 == 'CUR_TYPE_LCU') & (data.time >= 1993) ] data_rus_lcu_1993.set_index('time').sort_index() [['obs_value', 'wage_corr_cpi_1992']]. plot(title='Номинальная зарплата vs реальное содержание зарплаты в ценах 1992 в России (ILO)', kind='bar', subplots=True)
  78. Опять нам мешает эта деноминация • Во-первых, пик номинальной зарплаты

    всё так же высоко • Во-вторых, даже без него, уровень реального наполнения зарплаты всё равно падает в 1997-м году в 1000 раз, т. к. множитель инфляции (ИПЦ) не учитывает деноминационный переход • Т.к. мы смотрим в ценах 1992-го года, то «отменим» деноминацию 1998-го года, как будто её не проводили
  79. Отменяем деноминацию data_rus_lcu_1993.loc[ data_rus_lcu_1993.time >= 1997, ['obs_value', 'wage_corr_cpi_1992'] ] *=

    1000 • Умножаем на 1000 значения колонок obs_value и wage_corr_cpi_1992 (обратите внимание на очередной хитрый синтаксис внутри DataFrame.loc и на оператор «*=») • Получим предупреждение в консоли (не обращаем внимание в этот раз) SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
  80. Реальное содержание зарплаты по годам в ценах 1992 в России,

    номинальная зарплата без учета деноминации 1998-го года data_rus_lcu_1993.set_index('time').sort_index() [['obs_value', 'wage_corr_cpi_1992']]. plot(title='Номинальная зарплата vs реальное содержание зарплаты в ценах 1992 в России (ILO)', kind='bar', subplots=True)
  81. data[ (data.ref_area == 'USA') & (data.classif2 == 'CUR_TYPE_LCU') & (data.time

    > 1992) ].set_index('time').sort_index()[['obs_value', 'wage_corr_cpi_1992']].plot(title='Зарплата в ценах 1992 в США (ILO)', kind='bar') data[ (data.ref_area == 'CHN') & (data.classif2 == 'CUR_TYPE_LCU') & (data.time > 1992) ].set_index('time').sort_index()[['obs_value', 'wage_corr_cpi_1992']].plot(title='Зарплата в ценах 1992 в КНР (ILO)', kind='bar') • И так далее: нужно только поставить код страны из bulk_dic/ref_area_en.csv • Замечание: для некоторых стран могут быть недоступны данные инфляции с 1992-года, в этом случае инфляция будет рассчитана с наиболее раннего доступного года, достпуность данных для каждой страны нужно отдельно проверять
  82. • и т. п. • Довольно интересно, • Но кто

    его знает, что там были за цены в этих странах в 1992-м году, да еще в национальной валюте • Немного интереснее было бы получить уровень зарплат ретроспективно: зарплата в предыдущие годы в ценах за текущий год (2021) или близкий к текущему (2020 или 2019)
  83. • В 2019 году ИПЦ-множитель cpi_factor относится к 2018- году

    • Пусть в 2019 году стоимость корзины продуктов равна x, в 2018 году стоимость корзины равна y - стоимость корзины в 2019: x = y * cpi_factor[2019] - стоимость корзины в 2018: y = x / cpi_factor[2019] = x * cpi_retro_factor[2018] • Множитель cpi_retro_factor[год] = 1 / cpi_factor[год + 1] • Стоимость корзины[год] = стоимость корзины[год+1] * cpi_retro_factor[год]
  84. • Стоимость корзины в годы, предшествующие 2019, в ценах 2019

    • Стоимость корзины в 2019: x • Стоимость корзины в 2018: x * cpi_retro_factor[2018] = • Стоимость корзины в 2017: (x * cpi_retro_factor[2018]) * cpi_retro_factor[2017] ... • Стоимость корзины в 2000: x * cpi_retro_factor[2018] * ... * cpi_retro_factor[2000] … • Множитель ретро-инфляции по отношению к 2019-му году: - cpi_retro_factor_2019[2019] = 1 ... - cpi_retro_factor_2019[2000] = cpi_retro_factor[2018] * ... * cpi_retro_factor[2000] • Кумулятивное (накопленное) произведение с обратной сортировкой и со сдвигом
  85. Попроще... • Если у нас есть набор товаров, который мы

    можем купить в 2019-м году по цене X, то мы сможем купить этот же набор товаров в 2001-м году по цене Y = X * cpi_retro_factor_2019[2001] (значение коэффициента для 2001-го года) • Если у нас есть набор товаров, который мы могли купить в 2001-м году по цене Y (например, потратить всю зарплату на него), то мы сможем купить такой же набор товаров в 2019-м году по цене X = Y / cpi_retro_factor_2019[2001]
  86. Теперь технически нам нужно • cpi_retro_factor[год] = 1 / cpi_factor[год

    + 1] • Для каждой текущей строки поделить 1 на значение колонки cpi_factor из предыдущей строки • Для этого выполним операцию сдвига: - отсортируем колонки по убыванию лет - сдвинем cpi_factor на один элемент вниз - получим значение cpi_factor за следующий год в строке за текущий год • После этого можно делить и записать результат в cpi_retro_factor
  87. print( data_cpi.sort_index(ascending=False) ) print( data_cpi.sort_index(ascending=False). groupby(by=['ref_area'])['cpi_factor'].shift(fill_value=1) ) cpi_change cpi_value cpi_factor

    ref_area time ZWE 2018 10.62 110.62 1.1062 2017 0.89 100.89 1.0089 2016 -1.54 98.46 0.9846 2015 -2.43 97.57 0.9757 2014 -0.20 99.80 0.9980 2013 1.63 101.63 1.0163 2012 3.73 103.73 1.0373 2011 3.47 103.47 1.0347 2010 3.02 103.02 1.0302 ZMB 2020 15.73 115.73 1.1573 2019 9.15 109.15 1.0915 2018 7.49 107.49 1.0749 2017 6.58 106.58 1.0658 2016 17.87 117.87 1.1787 2015 10.11 110.11 1.1011 2014 7.81 107.81 1.0781 2013 6.98 106.98 1.0698 2012 6.58 106.58 1.0658 2011 6.43 106.43 1.0643 ZAF 2020 3.22 103.22 1.0322 2019 4.12 104.12 1.0412 ... Проверим сдвиг GroupBy.shift ref_area time ZWE 2018 1.0000 2017 1.1062 2016 1.0089 2015 0.9846 2014 0.9757 2013 0.9980 2012 1.0163 2011 1.0373 2010 1.0347 ZMB 2020 1.0000 2019 1.1573 2018 1.0915 2017 1.0749 2016 1.0658 2015 1.1787 2014 1.1011 2013 1.0781 2012 1.0698 2011 1.0658 ZAF 2020 1.0000 2019 1.0322 2018 1.0412 ...
  88. • Важно: делать сдвиг внутри групп GroupBy • Сделать предварительрную

    сортировку в нужном направлении • fill_value: на место сдвинугого вниз верхнего значения в группе приедет fill_value=«1» • pandas.pydata.org/pandas- docs/stable/reference/api/pandas.core.groupby.DataFrameGroup By.shift.html Сдвиг GroupBy.shift
  89. data_cpi['cpi_retro_factor'] = 1 / data_cpi.sort_index(ascending=False). groupby(by=['ref_area'])['cpi_factor'].shift(fill_value=1) data_cpi_2019_retro = data_cpi.loc[data_cpi.index.get_level_values(1) <=

    2019] data_cpi_2019_retro.loc[ data_cpi_2019_retro.index.get_level_values(1) == 2019, 'cpi_retro_factor'] = 1 data_cpi_2019_retro['cpi_retro_factor_2019'] = data_cpi_2019_retro.sort_index(ascending=False). groupby(by=['ref_area'])['cpi_retro_factor'].cumprod() data = data.join( data_cpi_2019_retro[['cpi_retro_factor', 'cpi_retro_factor_2019']], on=['ref_area', 'time']) data['wage_corr_retro_cpi_2019'] = data.obs_value / data.cpi_retro_factor_2019 Дело техники...
  90. data[ (data.ref_area == 'RUS') & (data.classif2 == 'CUR_TYPE_LCU') & (data.time

    > 1996) & (data.time <= 2019) ].set_index('time').sort_index() [['obs_value', 'wage_corr_retro_cpi_2019']].plot(title='Зарплата в ценах 2019 в России (ILO)', kind='bar') data[ (data.ref_area == 'USA') & (data.classif2 == 'CUR_TYPE_LCU') & (data.time <= 2019) ].set_index('time').sort_index()[['obs_value', 'wage_corr_retro_cpi_2019']].plot(title='Зарплата в ценах 2019 в США (ILO)', kind='bar') data[ (data.ref_area == 'CHN') & (data.classif2 == 'CUR_TYPE_LCU') & (data.time <= 2019) ].set_index('time').sort_index()[['obs_value', 'wage_corr_retro_cpi_2019']].plot(title='Зарплата в ценах 2019 в КНР (ILO)', kind='bar') Графики по некоторым странам
  91. На графиках значения • obs_value для выбранного года: номинальная зарплата

    в локальной валюте в выбранный год • wage_corr_retro_cpi_2019 для выбранного года: по этой цене мы сможем купить в 2019-м году такой же набор товаров, какой могли купить на всю зарплату в выбранном году • Мы теперь не ограничены начальным годом, от которого замеряем уровень инфлации вперед, можем смотреть на любую глубину в историю, были бы данные по инфляции и зарплатам
  92. На графиках значения • Если у вас на руках сумма

    obs_value (синий столбик), вы сможете купить на нее такое же количество товаров, как на сумму wage_corr_retro_cpi_2019 (оранжевый столбик) в 2019-м году
  93. • Сразу срежем деноминацию до 1997-го года, чтобы сейчас не

    мешала • 40 тыс. руб. в 2019 году «ощущаются как» 20 тыс. в 2010-м
  94. • Данных нет после 2016-го года • Поэтому фактически цены

    2016-го года • До 1994-го года нет данных по инфляции
  95. • $3000 в 2019 году ощущаются как $2000 в 2001-м

    и • $3500 в 2019 ощущается как $500 в 1969-м • Стабильность с 1969-го года, но в 2003-м где-то раздобыли реальных денег
  96. Данные Росстата • Главная страница > Статистика > Официальная статистика

    > Цены rosstat.gov.ru/price • Индексы потребительских цен по Российской Федерации в 1991 - 2021 гг. rosstat.gov.ru/storage/mediabank/3RoAMs5Z/Индексы потребительских цен.html Дополнительно • «Как Росстат считает инфляцию и можно ли его перепроверить» rosstat.gov.ru/ps/inflation/ • Рынок труда, занятость и заработная плата rosstat.gov.ru/labor_market_employment_salaries
  97. pandas.DataFrame.plot:kind : str • ‘line’ : line plot (default) •

    ‘bar’ : vertical bar plot • ‘barh’ : horizontal bar plot • ‘hist’ : histogram • ‘box’ : boxplot • ‘kde’ : Kernel Density Estimation plot • ‘density’ : same as ‘kde’ • ‘area’ : area plot • ‘pie’ : pie plot • ‘scatter’ : scatter plot • ‘hexbin’ : hexbin plot
  98. Заключение • как видите, при визуализации данных сам процесс рисования

    (настройки графика) занимает не более 5% труда • Основное время - приведение данных в нужный вид, осмысленная работа с предметной областью • Графики помогают ответить на воросы, на которые сложно ответить простыми вычислениями • Например, мы можем одним взглядом охватить данные по множеству стран за множество лет • Т.е. это еще один инструмент извлечения знаний из данных (но вопросы здесь задаём мы)
  99. Лаба 2.0 • Воспроизвести код лекции • Построить графики для

    других стран по коду ref_area • Построить графики для других наборов продуктов (коды потребительских корзин)
  100. Лаба 2.1.1 • Если предположить, что цена на ружье с

    патронами движется соответственно средней инфляции • Сколько стоит ружье Деда с патронами в рублях с учетом деноминации и инфляции сейчас (в 2020 году)? • Продав ружье с патронами в 1996-м году за $200, он выиграл или проиграл по сравнению с ситуацией, если бы он продал его в 2020 году за рубли? Если выиграл или проиграл, то сколько?
  101. Лаба 2.1.2 • Что такое один миллион долларов США в

    США из 1967-го (1969) года в 1997-м году в США? • Что такое сто миллиардов долларов США в США из 1997-го года в 1967-м (1969) году в США? • Что такое сто миллиардов долларов США в США из 1997-го года в 2019-м году в США?
  102. Лаба 2.2 • Взять данные по инфляции в России с

    сайта Росстата • Сравнить с данными по инфляции МОТ (ILO) • Построить графики для России с данными Росстата, сравнить результат • Фактчек: найти методику Росстата по вычислению коэффициента потребильских цен (уровня инфляции) в период деноминации на рубеже 1997-1998 годов • Найти правила сравнения цен до номинации и после номинации • Проверить дополнительно: закон о деноминации, август 1997
  103. Лаба 2.3 — свободная тема • Построить любые другие графики

    по рассмотренному датасету • Взять любой другой датасет, исследовать его