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

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

Anton
January 11, 2025

Большие данные и машинное обучение (v2) - лекция-6: разведочный анализ, корреляция

Лекция курса "Большие данные и машинное обучение" (v2.0-МОТ)
Лекция-6: разведочный анализ, корреляция

Регрессия, регрессионная модель — модель предсказания целевой переменной на непрерывной шкале
Часть 1: разведочный анализ, распределение значений, отношения переменных, корреляция

- Переменная на непрерывной шкале
- Разведочный анализ
- Пример: разведочный анализ в датасете ILO (МОТ - Международная организация труда) ilostat.ilo.org
- Что с чем может коррелировать?
- Объединение множества специализированных таблиц в одну таблицу объектов с целевыми признаками
- Чистка данных
- Библиотека визуализации данных Seaborn
- График распределения значений признака: Distplot
- Нормальное распределение
- Точечный график — отношения между двумя величинами: Relplot
- Групповой график распределений и попарных отношений: Pairplot
- Проблема пропуска данных в датасете ILO
- Корреляция
- Коэффициент корреляци; и Пирсона
- Вычисление корреляции последовательностей значений: Pandas:Series.corr
- Матрица корреляций: numpy.corrcoef
- Матрица корреляций: Pandas:DataFrame.corr
- Тепловая карта корреляций: Heatmap
- Палитра для heatmap:cmap
- Высокая корреляция != причинно-следственная связь
- Задания для самостоятельной работы

лекция с данными ILO: 22.04.2021

Anton

January 11, 2025
Tweet

More Decks by Anton

Other Decks in Education

Transcript

  1. Регрессия, регрессионная модель — модель предсказания целевой переменной на непрерывной

    шкале Часть 1: разведочный анализ, распределение значений, отношения переменных, корреляция
  2. Разведочный анализ • Exploratory data analysis (EDA) • Посмотреть, что

    из себя представляют данные: - Распределение значений переменной • Есть ли между признаками заметная связь: - Визуализация отношений переменных: точечные графики - Корреляция • В перспективе: построить предсказательную модель — предсказывать значение неизвестной целевой переменной по значениям известных признаков
  3. Разведочный анализ • Таблицу рассматриваем как массив объектов • Одна

    строка — один объект • Колонки таблицы — признаки объекта • Мы изучаем, какие возможные значения принимает тот или иной признак объекта внутри исследуемой выборки • Пытаемся понять, есть ли связь между признаками
  4. Статистика МОТ ilostat.ilo.org • Данные по разным тематикам распределены по

    множеству таблиц • Данные в таблицах разбиты по странам (ref_area) и годам (time), а также по другим разрезам (sex, classif1, classif2 и т. п.) • Обычно в одной таблице одно целевое численное значение obs_value
  5. Статистика МОТ ilostat.ilo.org • Скачаем разные таблицы • Объектом будет

    страна в выбранный год • В каждой из таблиц - отфильтруем или перегруппируем данные так, чтобы комбинация значений ref_area+time встречалось один раз на всю таблицу - переменуем колонку obs_value на val_имя_признака • Объединим таблицы по ref_area+time в одну большую таблицу
  6. Статистика МОТ ilostat.ilo.org • Mean nominal monthly earnings of employees

    by sex and economic activity | Annual www.ilo.org/ilostat- files/WEB_bulk_download/indicator/EAR_4MTH _SEX_ECO_CUR_NB_A.csv.gz фильтр
  7. Статистика МОТ ilostat.ilo.org • val_cpi_change — инфляция в процентах •

    val_population — трудоспособное население (старше 15 лет) • val_hours_worked • val_weekly_hours_worked • val_bargaining • val_union_density • val_inflow_workers • val_outflow_workers • val_social_protection
  8. Статистика МОТ ilostat.ilo.org • val_unemployment • val_children • val_output_per_worker •

    val_fatal_injuries • val_days_not_worked_strikes • val_days_not_worked_per_1000_strikes • val_strikes • val_workers_in_strikes
  9. Что с чем может коррелировать? • Мы видели ранее, что

    зарплата в местной валюте пытается тянуться за ростом цен при инфляции. • Можно было бы предположить, что между уровнем зарплаты в местной валюте и темпом инфляции можно проследить какую-то связь. • Но для разных стран исходное значение wage_lcu показывать на одном графике не имеет смысла, т. к. это разные единицы измерения с очень разным диапазоном значений • Нужно как-то привести значение wage_lcu для всех стран к «общему знаменателю» — универсальному значению
  10. Что с чем может коррелировать? • Например: взять не саму

    зарплату, а ее изменение по отношению к предыдущему году, т. е. её динамику (val_wage_change_lcu) • В таком случае это значение можно будет сранивать между странами, а так же с уровнем инфляции (val_cpi_change) • Т.о. образом, исходное предположение сводится к проверке: есть ли связь между динамикой изменения средней зарплаты val_wage_change_lcu и процентным показателем инфляции val_cpi_change
  11. Что с чем может коррелировать? • • … • Проверим

    интуицию математикой и фактами
  12. explore-ilo.py import pandas import numpy as np data_wage = pandas.read_csv('EAR_4MTH_SEX_ECO_CUR_NB_A.csv')

    data_wage = data_wage[ (data_wage.classif1 == 'ECO_AGGREGATE_TOTAL') & (data_wage.sex == 'SEX_T') ] data_wage = data_wage.pivot_table( values='obs_value', index=['ref_area', 'time'], columns='classif2') data_wage = data_wage.rename(columns={ 'CUR_TYPE_USD': 'val_wage_usd', 'CUR_TYPE_PPP': 'val_wage_ppp', 'CUR_TYPE_LCU': 'val_wage_lcu' })
  13. data_cpi = pandas.read_csv('CPI_NCYR_COI_RT_A.csv') data_cpi = data_cpi[ data_cpi.classif1 == 'COI_COICOP_CP01T12' ]

    [['ref_area', 'time', 'obs_value']] data_cpi = data_cpi.rename(columns={ 'obs_value': 'val_cpi_change' }) data_cpi = data_cpi.set_index(['ref_area', 'time'])
  14. # Collective bargaining coverage rate (%) | Annual data_bargaining =

    pandas.read_csv('data-ilo/ILR_CBCT_NOC_RT_A.csv') data_bargaining = data_bargaining[['ref_area', 'time', 'obs_value']] data_bargaining = data_bargaining.rename(columns={ 'obs_value': 'val_bargaining' }) data_bargaining = data_bargaining.set_index(['ref_area', 'time']) # Trade union density rate (%) | Annual data_union_density = pandas.read_csv('data-ilo/ILR_TUMT_NOC_RT_A.csv') data_union_density = data_union_density[ ['ref_area', 'time', 'obs_value'] ] data_union_density = data_union_density.rename(columns={ 'obs_value': 'val_union_density' }) data_union_density = data_union_density.set_index(['ref_area', 'time'])
  15. ...

  16. data = data_wage.join([ data_cpi, data_population, data_hours_worked, data_weekly_hours_worked, data_bargaining, data_union_density, data_inflow_workers,

    data_outflow_workers, data_social_protection, data_unemployment, data_children, data_output_per_worker, data_fatal_injuries, data_days_not_worked_strikes, data_days_not_worked_per_1000_strikes, data_strikes, data_workers_in_strikes ]) print( data )
  17. val_wage_lcu val_wage_ppp val_wage_usd val_wage_lcu_prev ... val_strikes val_workers_in_strikes ref_area_label ref_area time

    ... ABW 2010 3013.00 1860.38 1683.24 NaN ... NaN NaN Aruba AFG 2014 8869.86 499.63 154.94 NaN ... NaN NaN Afghanistan AGO 2011 55313.80 683.46 588.85 NaN ... NaN NaN Angola ALB 1980 546.00 NaN NaN NaN ... NaN NaN Albania 1981 544.00 NaN NaN 546.00 ... NaN NaN Albania 1982 545.00 NaN NaN 544.00 ... NaN NaN Albania 1983 544.00 NaN NaN 545.00 ... NaN NaN Albania 1984 543.00 NaN NaN 544.00 ... NaN NaN Albania 1985 547.00 NaN NaN 543.00 ... NaN NaN Albania 1986 555.00 NaN NaN 547.00 ... NaN NaN Albania 1987 556.00 NaN NaN 555.00 ... NaN NaN Albania 1988 558.00 NaN NaN 556.00 ... NaN NaN Albania 1989 563.00 NaN NaN 558.00 ... NaN NaN Albania 1990 579.00 NaN NaN 563.00 ... NaN NaN Albania 1991 678.00 NaN NaN 579.00 ... NaN NaN Albania … 1999 4574.00 1243.38 748.67 4237.00 ... 107.0 555.435 South Africa 2000 4990.00 1331.20 719.04 4574.00 ... 80.0 1142.428 South Africa 2001 5467.00 1418.77 635.02 4990.00 ... 83.0 90.392 South Africa 2002 6055.00 1457.86 574.44 5467.00 ... 47.0 66.250 South Africa 2003 2555.89 595.53 337.87 6055.00 ... 62.0 83.533 South Africa 2004 2649.39 638.26 410.14 2555.89 ... 49.0 395.301 South Africa 2005 6979.50 1703.33 1097.52 2649.39 ... 102.0 399.291 South Africa 2006 7595.00 1853.22 1121.60 6979.50 ... 99.0 250.787 South Africa 2007 8281.00 1957.32 1175.38 7595.00 ... 75.0 608.919 South Africa 2008 9235.00 2059.52 1117.87 8281.00 ... 57.0 118.979 South Africa 2011 6032.00 1198.93 830.72 9235.00 ... 67.0 203.138 South Africa 2012 6744.00 1318.75 821.44 6032.00 ... 99.0 241.391 South Africa 2013 8193.93 1503.05 848.67 6744.00 ... 114.0 297.193 South Africa 2015 3100.00 516.67 242.97 8193.93 ... 110.0 91.072 South Africa 2017 3500.00 534.40 262.69 3100.00 ... 132.0 125.125 South Africa 2018 3500.00 523.86 264.47 3500.00 ... 165.0 137.712 South Africa 2019 3800.00 NaN 263.00 3500.00 ... NaN NaN South Africa ZMB 2017 4016.63 950.95 422.01 NaN ... NaN NaN Zambia 2018 3159.35 712.83 302.10 4016.63 ... NaN NaN Zambia
  18. Избавиться от NaN'ов data = data[ ~np.isnan(data.val_wage_usd) ] data =

    data[ ~np.isnan(data.val_wage_ppp) ] data = data[ ~np.isnan(data.val_cpi_change) ] data = data[ ~np.isnan(data.val_population) ] ... • Из-за недостатка данных в разных таблицах если отфильтровать NaN'ы по значениям для всех колонок, в общей таблице не останется строк • Поэтому будем фильтровать только те колонки, которые рассматриваем в данный момент • numpy.org/doc/stable/reference/generated/numpy.isnan.html
  19. При установке может изменить стили matplotlib • Вернуть обратно: import

    seaborn as sns sns.reset_orig() • Опять выставить: sns.reset_defaults() • Так и не заметил, на что это влияет
  20. График распределения значений признака: Distplot • Distplot — одномерное распределение

    (univariate distribution) случайной величины seaborn.pydata.org/generated/seaborn.distplot.html stackoverflow.com/questions/51666784/what-is-y-axis-in-seaborn-distplot • По X — значения параметра, разбитые на группы (диапазоны) (столбцы гистограммы — группы значений) • По Y: площадь столбца — вероятность появления значения из данного диапазона (грубо: нормализованное количество элементов в каждой группе) • сумма площадей всех столбцов графика равна 1
  21. Инструменты теории вероятностей • Мы можем рассматривать (интерпретировать) значения числового

    признака x j как выборку значений случайной величины — по одному результату «эксперимента» на строку • Основываясь на значениях выборки, мы можем посчитать вероятность попадания значения в тот или иной диапазон на шкале • Чем больше значений выборки (значений признака x j ) попадают в данный диапазон, тем больше вероятность в него попасть.
  22. distplot-demo.py import matplotlib.pyplot as plt import seaborn as sns import

    numpy as np # симпатичная сетка на белом фоне sns.set(style='whitegrid', font_scale=1.6)
  23. distplot-demo.py # случайные значения со стандартным # нормальным распределением sns.distplot(np.random.randn(100))

    plt.show() • (матожидание = 0, стандартное отклонение = 1) • numpy.org/devdocs/reference/random/generated/numpy.random.randn.html • ru.wikipedia.org/wiki/Нормальное_распределение
  24. Нормальное распределение • Математическое ожидание — среднее значение случайной величины

    • Стандартное отклонение — показатель рассеивания случайной величины относительно её матожидания • Стрелок целится в мишень: он не всегда будет в нее попадать, но скорее всего выстрелы буду ложиться где-то недалеко - Мишень — матожидание выстрела - Чем меньше стандартное отклонение, чем ближе выстрелы ложатся к центру мишени
  25. explore-ilo.py import matplotlib.pyplot as plt import seaborn as sns #

    симпатичная сетка на белом фоне sns.set(style='whitegrid', font_scale=1.6)
  26. explore-ilo.py # средняя зарплата в долларах (все страны за все

    годы) sns.distplot(data.val_wage_usd) plt.title("distplot (%d samples)"%len(data), fontsize = 14) plt.show()
  27. explore-ilo.py # рабочих часов в неделю в пересчете # на

    всё работоспособное население 15-64 лет sns.distplot(data.val_hours_worked) plt.title("distplot (%d samples)"%len(data), fontsize = 14)
  28. Точечный график — отношения между двумя величинами: Relplot • Точечный

    график: Relplot (relation plot — график отношений) seaborn.pydata.org/generated/seaborn.relplot.html • по X — значение величины-1, • по Y — значение величины-2 для этой же строки
  29. relplot-demo.py import matplotlib.pyplot as plt import seaborn as sns import

    pandas as pd import numpy as np # симпатичная сетка на белом фоне sns.set(style='whitegrid')
  30. Групповой график распределений и попарных отношений: Pairplot • Pairplot —

    поиск попарных корреляций между разными признаками seaborn.pydata.org/generated/seaborn.pairplot.html • Матрица точечных графиков Relplot • По диагонали — графики распределения Distplot
  31. • val_wage_usd: средняя зарплата в USD • val_wage_ppp: средняя зарплата

    Паритет покупательной способности (purchasing power parity), производная от USB • val_cpi_change: инфляция, % • val_wage_change_lcu: прирост зарплаты в локальной валюте, %
  32. Сложности с пропусками в ILO • Мы не можем взять

    все признаки сразу и построить попарную карту, т. к. при избавлении от NaN'ов получим пустой датасет • По этой причине все-таки приходится подбирать группы признаков для отдельного исследования
  33. • val_bargaining: участие в коллективных договорах (%) • val_union_density: членство

    в профсоюзах, % • val_unemployment: безработица, % • val_wage_usd: • val_cpi_change: • val_hours_worked: рабочих часов в неделю в пересчете на всё работоспособное население 15-64 лет
  34. Интуитивно • Чем больше графики двух величин похожи друг на

    друга, тем сильнее они коррелируют • Чем больше данных собрано в каждой точке (значение элемента) и чем больше элементов в выборке (протяженность наблюдений по времени), тем наблюдаемая корреляция достовернее
  35. Коэффициент корреляции Пирсона • Измеряет линейную зависимость между парой признаков

    • r = [-1, 1] • r = 1: абсолютная положительная корреляция • r = 0: полное отсутствие корреляции • r = -1: абсолютная отрицательная корреляция
  36. Коэффициент корреляции Пирсона Интерпретация по модулю • |r| < 0.3:

    слабая • 0.3 < |r| < 0.5: умеренная • 0.5 < |r| < 0.7: заметная • 0.7 < |r| < 0.9: высокая • |r| > 0.9: весьма высокая
  37. Коэффициент корреляции Пирсона • μ x — эмпирическое среднее признака:

    (x(1)+...+x(n))/n • σ x , σ y — стандартные отклонения признаков • σ xy — ковариация между признаками x и y • Здесь x — это не вектор-объект, а единственный признак (x j ) r= ∑ i=1 n [(x(i)−μx )( y(i)−μy )] √ ∑ i=1 n (x(i)−μx )2 √ ∑ i=1 n ( y(i)−μy )2 = σxy σx σy
  38. Самостоятельно убедиться, что: • r = 1 для любого y

    = x • r = -1 для любого y = -x • r = 1 для любого y = kx, если k > 0 • r = -1 для любого y = kx, если k < 0 • r = 1 для любого y = kx + c, если k > 0 • r = -1 для любого y = kx + c, если k < 0
  39. Строгий ноль • Если все элементы x равны своему среднему

    (колонка с единственным значением), то в числителе получим ноль, но в знаменателе получим тоже ноль • Можно представить ситуацию, когда значения x равны среднему через один, значения y равны среднему тоже через один, но не для тех же объектов, у которых среднему равен x • В таком случае в числителе будем получать все слагаемые нули и весь числитель будет ноль, но в знаменателе будет не ноль.
  40. Пример 1 • x = [1, 2, 3] • y

    = [5, 7, 9] • μ x = (1+2+3)/3 = 6/3 = 2 • μ y = (5+7+9)/3 = 21/3 = 7 • σ xy = (1-2)(5-7)+(2-2)(7-7)+(3-2)(9-7) = 4 • σ x = sqrt[ (1-2)^2+(2-2)^2+(3-2)^2 ] = sqrt (2) = ~1.41 • σ y = sqrt[ (5-7)^2+(7-7)^2+(9-7)^2 ] = sqrt (8) = ~2.83 • r = 4/(1.41 * 2.83) = 1
  41. Пример 1.1 • x = [1, 2, 3, 4, 5,

    6] • y = [5, 7, 9, 11, 13, 15] • μ x = (1+2+3+4+5+6)/6 = 21/6 = 3.5 • μ y = (5+7+9+11+13+15)/6 = 60/6 = 10 • σ xy = (1-3.5)(5-10)+(2-3.5)(7-10)+(3-3.5)(9-10)+(4-3.5)(11-10)+(5-3.5) (13-10)+(6-3.5)(15-10) = 35 • σ x = sqrt[ (1-3.5)^2+(2-3.5)^2+(3-3.5)^2+(4-3.5)^2+(5-3.5)^2+(6-3.5)^2 ] = sqrt (17.5) = ~4.18 • σ y = sqrt[ (5-10)^2+(7-10)^2+(9-10)^2+(11-10)^2+(13-10)^2+(15-10)^2 ] = sqrt (70) = ~8.37 • r = 35/(4.18 * 8.37) = 1
  42. Пример 2 • x = [1, 2, 3] • y

    = [9, 7, 5] • μ x = (1+2+3)/3 = 6/3 = 2 • μ y = (9+7+5)/3 = 21/3 = 7 • σ xy = (1-2)(9-7)+(2-2)(7-7)+(3-2)(5-7) = -4 • σ x = sqrt[ (1-2)^2+(2-2)^2+(3-2)^2 = sqrt (2) ] = ~1.41 • σ y = sqrt[ (9-7)^2+(7-7)^2+(5-7)^2 = sqrt (8) ] = ~2.83 • r = -4/(1.41 * 2.83) = -1
  43. Пример 3 • x = [1, 2, 3] • y

    = [1, 4, 9] (y = x^2) • μ x = (1+2+3)/3 = 6/3 = 2 • Μ y = (1+4+9)/3 = 14/3 = ~4.67 • σ xy = (1-2)(1-4.67)+(2-2)(4-4.67)+(3-2)(9-4.67) = 8 • σ x = sqrt[ (1-2)^2+(2-2)^2+(3-2)^2 = sqrt (2) ] = ~1.41 • σ y = sqrt[ (1-4.67)^2+(4-4.67)^2+(9-4.67)^2 ] = sqrt (32.67) = ~5.72 • r = 8/(1.41 * 5.72) = 0.99
  44. Пример 4 • x = [1, 2, 3] • y

    = [1, 8, 27] (y = x^3) • μ x = (1+2+3)/3 = 6/3 = 2 • Μ y = (1+8+27)/3 = 36/3 = 12 • σ xy = (1-2)(1-12)+(2-2)(8-12)+(3-2)(27-12) = 26 • σ x = sqrt[ (1-2)^2+(2-2)^2+(3-2)^2 ] = sqrt (2) = ~1.41 • σ y = sqrt[ (1-12)^2+(8-12)^2+(27-12)^2 ] = sqrt (362) = ~19.03 • r = 26/(1.41 * 19.03) = 0.97
  45. Пример 5 • x = [1, 2, 3] • y

    = [11, 19, 0] • μ x = (1+2+3)/3 = 6/3 = 2 • Μ y = (11+19+0)/3 = 30/3 = 10 • σ xy = (1-2)(11-10)+(2-2)(19-10)+(3-2)(0-10) = -11 • σ x = sqrt[ (1-2)^2+(2-2)^2+(3-2)^2 ] = sqrt (2) = ~1.41 • σ y = sqrt[ (11-10)^2+(19-10)^2+(0-10)^2 ] = sqrt (182) = ~13.49 • r = -11/(1.41 * 13.49) = -0.58
  46. Pandas: Series.corr import pandas as pd df = pd.DataFrame( data={'X':

    [1,2,3], 'Y': [1,8,27], 'Z': [11,19,0]}) print( df['X'].corr(df['Y'], 'pearson') ) print( df['X'].corr(df['Z'], 'pearson') ) print( df['Y'].corr(df['Z'], 'pearson') ) • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.corr.html 0.9662823901213162 -0.5765566601970551 -0.7674962229940424
  47. Pandas: Series.corr print( pandas.Series([1]).corr( pandas.Series([2]), 'pearson') ) print( pandas.Series([1, 1]).corr(

    pandas.Series([2, 1]), 'pearson') ) print( pandas.Series([2, 1]).corr( pandas.Series([2, 1]), 'pearson') ) • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.corr.html nan nan 0.9999999999999999
  48. explore-ilo.py # val_social_protection: населения в программа социальной защиты (%) #

    val_bargaining: участие в коллективных договорах (%) # 18 сэмплов print( data['val_social_protection']. corr(data['val_bargaining'], 'pearson') ) # val_hours_worked: рабочих часов в неделю в пересчете на всё # работоспособное население 15-64 лет # val_unemployment: безработица (%) # 896 сэмплов print( data['val_hours_worked']. corr(data['val_unemployment'], 'pearson') ) 0.6611629687809047 -0.6493530116378561
  49. Матрица корреляций: numpy.corrcoef import numpy as np # вернет матрицу

    корреляций 2x2 print(np.corrcoef([[1,2,3], [11,19,0]])) [[ 1. -0.57655666] [-0.57655666 1. ]] • API > Routines > statistics docs.scipy.org/doc/numpy/reference/generated/numpy.corrcoef.html • Return Pearson product-moment correlation coefficients.
  50. Матрица корреляций: numpy.corrcoef # возьмем правое верхнее значение: print(np.corrcoef([[1,2,3], [1,2,3]])[0][1])

    print(np.corrcoef([[1,2,3], [5,7,9]])[0][1]) print(np.corrcoef([[1,2,3,4,5,6], [5,7,9,11,13,15]])[0][1]) print(np.corrcoef([[1,2,3], [1,4,9]])[0][1]) print(np.corrcoef([[1,2,3], [1,8,27]])[0][1]) print(np.corrcoef([[1,2,3], [11,19,0]])[0][1]) 1.0 1.0 1.0 0.989743318610787 0.9662823901213162 -0.5765566601970551
  51. Матрица корреляций: numpy.corrcoef # матрица 3x3 print(np.corrcoef([[1,2,3], [1,8,27], [11,19,0]])) [[

    1. 0.96628239 -0.57655666] [ 0.96628239 1. -0.76749622] [-0.57655666 -0.76749622 1. ]]
  52. Pandas: DataFrame.corr df = pd.DataFrame( data={'X': [1,2,3], 'Y': [1,8,27], 'Z':

    [11,19,0]}) print( df.corr('pearson') ) • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html • Возвращает: таблицу корреляций в виде DataFrame X Y Z X 1.000000 0.966282 -0.576557 Y 0.966282 1.000000 -0.767496 Z -0.576557 -0.767496 1.000000
  53. Тепловая карта корреляций: Heatmap • Heatmap — нарисовать 2д-массив чисел

    в виде разноцветной матрицы • seaborn.pydata.org/generated/seaborn.heatmap.html
  54. explore_ilo.py cols=[ 'val_wage_usd', 'val_wage_ppp', 'val_cpi_change', 'val_wage_change_lcu' ] # .T —

    транспонировать cm = np.corrcoef(data[cols].to_numpy().T) print( cm ) plt.figure() sns.set(font_scale=1.5) sns.heatmap(cm, cmap='RdYlBu_r', cbar=True, annot=True, square=True, fmt='0.2f', annot_kws={'size': 12}, yticklabels=cols, xticklabels=cols) plt.title("ILO heatmap (%d samples)"%len(data), fontsize = 14)
  55. • val_wage_usd: средняя зарплата в USD • val_wage_ppp: средняя зарплата

    Паритет покупательной способности (purchasing power parity), производная от USB • val_cpi_change: инфляция, % • val_wage_change_lcu: прирост зарплаты в локальной валюте, %
  56. В консольке [[ 1. 0.93715961 -0.36321207 -0.27213668] [ 0.93715961 1.

    -0.39297061 -0.28655069] [-0.36321207 -0.39297061 1. 0.44398321] [-0.27213668 -0.28655069 0.44398321 1. ]]
  57. Видим корреляции • wage_usd vs wage_ppp — понятно • wage_change

    vs cpi_change — корреляция небольшая, но не вот нулевая (неплохо еще почистить данные, плюс есть неточность вычисления wage_change) • Также видим обратную корреляцию wage_usd и change_cpi (в странах с высокой зарплатой в долларах так же низкая инфляция — в этом есть логика: в странах с более высоким уровнем жизни меньше инфляция)
  58. explore_ilo.py cols=[ 'val_bargaining', 'val_union_density', 'val_unemployment', 'val_wage_usd', 'val_cpi_change', 'val_hours_worked'] # .T

    — транспонировать cm = np.corrcoef(data[cols].to_numpy().T) print( cm ) plt.figure() sns.set(font_scale=1.5) sns.heatmap(cm, cmap='RdYlBu_r', cbar=True, annot=True, square=True, fmt='0.2f', annot_kws={'size': 12}, yticklabels=cols, xticklabels=cols) plt.title("ILO heatmap (%d samples)"%len(data), fontsize = 14)
  59. • val_bargaining: участие в коллективных договорах (%) • val_union_density: членство

    в профсоюзах, % • val_unemployment: безработица, % • val_wage_usd: • val_cpi_change: • val_hours_worked: рабочих часов в неделю в пересчете на всё работоспособное население 15-64 лет
  60. Палитра для heatmap:cmap • Подходят палитры из библиотеки matplotlib •

    Здесь списка палитр нет: seaborn.pydata.org/tutorial/color_palettes.html seaborn.pydata.org/generated/seaborn.color_palette.html • Здесь есть: matplotlib.org/examples/color/colormaps_reference.html • Или задать некорректное значение в cmap и полный список доступных палитр будет выведен вместе с ошибкой в консоль • Для тепловой карты хорошее значение cmap='RdYlBu_r' (красный- желтый-синий)
  61. Высокая корреляция != причинно-следственная связь • Обе переменные равноправны в

    формуле • На оба события может влиять 3-я причина (любые сезонные явления скорее всего будут коррелировать) • Смотрите на объем собранных данных для каждого элемента и продолжительность наблюдений
  62. Самостоятельна работа: ILO • Взять 3 любые таблицы МОТ (ILO)

    • Свести данные в общую таблицу • Провести разведочный анализ: - Распределение значений - Попарные отношения - Тепловая карта корреляций
  63. Самостоятельная работа: Николас Кейдж vs бассейны • Найти исходные данные

    (источники) • Проверить вычисления, приведенные на графике (фактчек) • Убедиться, что источники содержат актуализированные данные за период времени после 2009 года • Вычислить корреляцию для новых данных (2009-2019) • Построить новый график и вычислить корреляцию для всего периода (1999 — 2019) • еще: www.tylervigen.com/spurious-correlations
  64. Задание: рынок недвижимости, данные от Сбербанка • kaggle: Sberbank Russian

    Housing Market www.kaggle.com/c/sberbank-russian-housing-market/data • Высказать интуитивные гипотезы на основе названий колонок • Провести разведочный анализ датасета: построить графики распределений и отношений переменных, точечные графики, посчитать попарные коэффициенты корреляции, тепловая карта корреляций • Выявить признаки, которые наилучшим образом коррелируют • Построить для них предсказательные модели