fig0


В свежем номере журнала The Lancet опубликована моя статья — любопытная карта и небольшое к ней пояснение. Решил рассказать об этом на Хабре, поскольку есть надежда, что реализованный способ визуализации данных может пригодиться еще кому-то.


Kashnitsky, I., & Scholey, J. (2018). Regional population structures at a glance. The Lancet, 392(10143), 209–210. https://doi.org/10.1016/S0140-6736(18)31194-2

Собственно, вот карта в высоком разрешении (кликабельно).


fig1


Карту можно воспроизвести точь-в-точь за несколько минут, код на гитхабе.


Данные создают цвета


Эта карта представляет собой «моментальный снимок» региональных возрастных структур населения в современной Европе. Соотношения детей, взрослых и пожилых к населении каждого из регионов закодировано цветом – данные «сами создают цвета». Возрастной структуре населения Европы соответствует серый цвет, который получается смешиванием в равных пропорциях розового, голубого и желтого. Чем больше возрастная структура населения региона отличается от среднеевропейской, тем больше доминирует один из трех цветов: желтый – если в населении преобладают пожилые, розовый – дети, голубой – люди трудоспособного возраста.


Одна карта может поведать нам бесконечное количество демографических историй. Курдистан, юго-восточная часть Турции, еще не завершил демографический переход, Восточная Европа переживает последние годы демографического дивиденда, в то время как западная Европа стремительно стареет. Столичные регионы стягивают население трудоспособного возраста, пристоличные регионы – молодые семьи с детьми, а в провинции остаются доживать старики. Приблизите карту, и вы увидите явственную границу между двумя Бельгиями – Фландрией и Валлонией. А знаете что это за яркое сиреневое пятно в Финляндии? Оказывается, там живут лестадианцы, крайне традиционные протестанты, предпочитающие в вопросах планирования семьи благочестивую позицию «сколько Бог пошлет» – рассказали мне финские демографы на Европейской конференции по изучению народонаселения. А посмотрите на Испанию, береговые регионы которой вместе со столичным регионом получили в нулевые годы невероятный приток международной миграции, в отличие от внутренней периферии страны.


tricolore


Цвета созданы с помощью нашего R пакета tricolore. Этот пакет, как мы надеемся, позволит исследователям из разных областей науки с легкостью отображать цветом троичные композиции данных. Чтобы "пощупать" возможности метода, можно поиграться со встроенным интерактивным примером, приложением shiny.


install.packages("tricolore")
library(tricolore)
DemoTricolore()

Весь код на гитхабе





UPD 2018-07-24: Разместил вчера карту на реддите (r/dataisbeautiful). За сутки 450К+ просмотров, 11.5К+ рейтинг, 365 комментариев. И дискуссия, порой, очень толковая. [ссылка на пост]

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


  1. chouck
    23.07.2018 02:56
    +1

    Да демографическая проблема сейчас на самом деле основная в мире. есть ли подобный карты для других частей мира?


    1. ikashnitsky Автор
      23.07.2018 08:45

      Пока нет. Но метод совершенно генерализованный, можно запросто кинуть любые данные на карту. Сделаю на досуге Россию и США.


      1. JobberNet
        23.07.2018 08:51

        А можно на весь глобус? Или хотя бы бывший Союз и Китай — было бы интересно сравнить с соседями. И США тоже интересно сравнить с Канадой и Латинской Америкой.


        1. ikashnitsky Автор
          23.07.2018 10:31

          Все можно, только данные нужны. Данные о население очень простые, но вот с пространственной привязкой не всегда просто.


      1. chouck
        23.07.2018 22:08

        неужели нет публичных дата сетов по итогам последних переписей?
        ООН ЮНИСЕФ или кто там ведь ведут такую статистику…
        какие именно данные нужны и в каком формате?


    1. solariserj
      23.07.2018 12:32
      +2

      Поддерживаю.
      Хотелось бы данные по всей Европе, а не только её части


      1. ikashnitsky Автор
        23.07.2018 13:32

        Я использовал данные Eurostat для всех стран, которые приняли систему административного деления NUTS.


  1. Koyanisqatsi
    23.07.2018 08:42
    +1

    Как интересно на фоне остальных выделяется Ирландия, хотя вот Турция с такими же цветами нет.


    1. artem_seleznev
      23.07.2018 11:50
      +1

      в Ирландии традиционно высокий (для Западной Европы) суммарный коэффициент рождаемости (СКР). Там более сильное влияние религии на менталитет


      1. asash
        23.07.2018 13:34

        И аборты разрешили только в этом году.


        1. ikashnitsky Автор
          23.07.2018 15:19

          Тут у товарища из Ирландии более любопытное объяснение


      1. Nick_mentat
        24.07.2018 10:37

        Наверное из-за уровня в жизни. Помнится, Ирландия держалась в топе по ИРЧП довольно долго.


  1. olgerdovich
    23.07.2018 12:06
    +1

    С ума сойти, у вас есть публикация в Lancet — мои поздравления!
    Таким не грех хвастаться и просто так, не говоря уж о том, что рассказать публике о том, как опубликоваться в ланцете.


    1. ikashnitsky Автор
      23.07.2018 12:30
      +1

      Спасибо! Думаю, что "рассказать публике" нечего (см. картинку в подвале). Это очень нестандартная публикация для Ланцета, тем более для формата писем. Пожалуй, один вывод можно сделать уверенно: красивая визуализация нравится всем, в том числе и редакторам журналов. Нет, еще вывод: стоит пытаться.


      Как опубликоваться в The Lancet

  1. Javian
    23.07.2018 12:08
    +1

    Интересно бы взглянуть на национальный состав. Возможно население трудоспособного возраста имеет заметную долю мигрантов.


    1. ikashnitsky Автор
      23.07.2018 12:40

      Несомненно. Но тут значительно сложнее с данными. Качество данных о миграции традиционно отвратительно. Исследователи прибегают к косвенным методам оценивания. Вот пример:
      Wilson, C., Sobotka, T., Williamson, L., & Boyle, P. (2013). Migration and intergenerational replacement in Europe. Population and Development Review, 39(1), 131–157. https://doi.org/10.1111/j.1728-4457.2013.00576.x
      Это одна из моих самых любимых статей. В студенческие годы я ее даже перевел на русский. Очень рекомендую, если интересна миграция.
      Уилсон, К., Соботка, Т., Уильямсон, Л., & Бойл, П. (2015). Миграция и замещение поколений в Европе. Демографическое Обозрение, 2(1), 56–88. https://demreview.hse.ru/article/view/1789


      Пара картинок из статьи

  1. striver
    23.07.2018 12:40

    Слишком много цветов на карте и по легенде частенько сложно сказать, что они означают. Есть ли возможность сгруппировать в, например, 9 групп с отдельным цветом для каждой? Как по мне — это наглядней. Текущая карта — слишком детально. К тому же данные по населению, скорее всего, примерные. Например, для меня Норвегия — полная загадка, что у них происходит, если просто сравнить карту и легенду.
    Javian

    Интересно бы взглянуть на национальный состав. Возможно население трудоспособного возраста имеет заметную долю мигрантов.
    Лучше нац. состав на другой карте и просто накладывать, при желании, ибо если еще эти данные внести, то получится такой винегрет, что не разберешь.


    1. ikashnitsky Автор
      23.07.2018 13:30

      Есть такая возможность в нашем пакете tricolore. Но, конечно, надо делать отдельно.


      пример (другие данные)
      install.packages("tricolore")
      library(tricolore)
      DemoTricolore()


  1. Rusli
    23.07.2018 14:05
    +1

    А не лучше было использовать чистые цвета RGB?
    То есть например, Working Age — это чистый 0, 0, 255.
    Young — 255, 0, 0.

    Тогда области со сбалансированным населением были бы просто белыми, а не имели этого сложного грязного цвета.


    1. ikashnitsky Автор
      23.07.2018 14:11

      Была такая попытка. Все сотрудничество с Йонасом у меня началось с идеи применения здесь perceptionally balanced color scheme.


      RGB

      image


      1. krundetz
        23.07.2018 16:00

        А почему от этого варианта отказались?


        1. ikashnitsky Автор
          23.07.2018 16:25

          Теоретически CYMK цвета правильнее для отображения композиций.
          Scholey, J., & Willekens, F. (2017). Visualizing compositional data on the Lexis surface. Demographic Research, 36(21), 627–658. https://doi.org/10.4054/DemRes.2017.36.21


      1. Syzd
        23.07.2018 16:05

        А по-моему понятнее так. Красное — старое население, красное цвет проблемы. Зеленое — «можно идти» (работать), синее — юность.


        1. ikashnitsky Автор
          23.07.2018 16:26

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


        1. tyomitch
          24.07.2018 00:41

          Демографические проблемы отображались бы при делении на «дети и студенты / трудоустроенные / безработные и пенсионеры», а не тупо по возрасту.
          Что-то мне подсказывает, что 64-летний британец куда как экономически активнее 64-летнего курда.


          1. JobberNet
            24.07.2018 06:28

            Скорее наоборот, 64-летний курд пенсию не получает, а потому пашет так же активно как и в молодости. У британца — просто денег больше.


            1. krundetz
              24.07.2018 12:50

              Если учесть:
              1. что британец выходит на пенсию в 65 лет,
              2. что курд выходит на пенсию в 60 лет (это возраст выхода на пенсию в Турции и Иране)
              то ваше утверждение не корректно.

              У британца — просто денег больше.
              Думаю зависимость обратная.
              Чем экономически активнее человек, тем у него денег больше.


              1. JobberNet
                24.07.2018 13:16

                Чем экономически активнее человек, тем у него денег больше.

                При прочих равных. Экономическая активность в каком-нибудь Бутане, принесёт меньше денег, чем «ничего-неделание» в Европе.


    1. Welran
      23.07.2018 14:19
      +1

      Всё равно цвета будут грязно серыми, а не чисто белым. Надо еще яркость на максимум cтавить. А вообще тут дело привычки скорее. Так как в оригинальном просто используется базис голубой, пурпурный и жёлтый, удобней для печати.


      1. ikashnitsky Автор
        23.07.2018 14:29

        https://twitter.com/jschoeley/status/1001503122873872385


        install.packages("tricolore")
        library(tricolore)
        DemoTricolore()


        1. Welran
          23.07.2018 15:06

          Тут вопрос был в том что смешивание цветов происходит с уменьшением их яркости. Видимо типа при 33% каждого компонента, яркость компоненты снижается на 66% и в сумме получается темносерый цвет. Но возможно было бы красивее повышает общую яркость наибольшей компоненте до максимума и остальные пропорционально. Тогда при равных пропорциях получился бы белый цвет, а на гифке в центре всегда темно серый при любых значениях цвета в углах.


          1. ikashnitsky Автор
            23.07.2018 15:18

            Что-то вроде этого вам хочется?


            tricolore::DemoTricolore()

            image


            1. Rusli
              23.07.2018 19:31

              Да, так гораздо лучше! Сбалансированное население — это ведь отсутствие проблемы, значит, логичней всего оставить белым. Чем темнее фон, тем больше дисбаланс. Ну а сам цвет уже показывает, в какую сторону этот дисбаланс.
              Гораздо логичней, чем первоначальный вариант с каким-то сложным серобуромалиновым для сбалансированных областей.


              1. ikashnitsky Автор
                23.07.2018 20:12
                +1

                Проблема в том, что нам хочется сохранить максимальное визуальное разнообразие оттенков цвета. А это, чисто теоретически, достигается при идеально сером цвете центра ("grey50")


              1. Nick_mentat
                24.07.2018 10:44

                Среднее по европе — не значит идеально сбалансировано. Вот если было бы теоретическое исследование оптимума по таким категориям возрастным, тогда можно было бы центрировать серый на нём, и посмотреть где проблемы есть, а где всё чётко.


  1. Novousp
    24.07.2018 04:32

    хм, мой R пишет радостное «plot.tag» is not a valid theme element name.


    1. ikashnitsky Автор
      24.07.2018 13:39

      Да, мне писал на почту еще один человек с той же ошибкой. Пока могу предположить, что проблемы возникают из-за: 1) обновления ggplot2 (использована версия 2.2.1); 2) обновления R (использована версия 3.4.3)