Как стать автором
Обновить

Самые удобные дома Москвы для жизни семьи с ребенком

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров4.4K

Когда выбираешь дом с учетом благополучия ребенка и жизни семьи с ним ближайшие 20 лет, лучше жить в пешеходной доступности от детсада, школы, коледжа и университета. Было бы хорошо чтобы поблизости были кружки детского творчества, спортцентры, школы иностранных языков. Ну и отлично, когда рядом есть игровые площадки и поликлиники - жилье ведь выбирают не на пару лет.

Мой рейтинг домов будет основан только на количественных метриках пешеходной доступности. Все расчеты основаны на данных проекта OpenStreetMap для жилых домов, которые ближе 2км пешком от входа в метрополитен или МЦК, а это значит что у этих домов нет проблем с транспортной доступностью. Рассчитаем самые удобные дома для жизни с детьми в районах Москвы.

Идея очень простая - когда изо дня в день ходите в одни и те же места на протяжении многих лет, то было бы отлично когда все эти маршруты были бы максимально близко к вашему дому и при этом у вас был бы выбор как можно большего числа объектов инфраструктуры в шаговой доступности от квартиры.

Методика расчета

Для каждого жилого дома Москвы выше 2х этажей в его окрестности 2км пешком суммируем в отдельные значения сколько объектов каждого типа вокруг здания из списка:

Также для каждого дома ведем признак all_infra, который будет активирован, когда в окресности есть один и более объект для каждой из категорий этого списка. А также посчитаем totalScore как сумму числа всех этих объектов в окрестностях (поликлинику и детские площадки с понижающим коэффициентом 0.01).

Результаты расчетов опубликовал как список на 30тыс жилых многоэтажных жилых домов для Москвы, где для каждого из домов расчитано число объектов инфраструктуры, связанной с детьми, в пешей доступности до 2км. Можете загрузить его в Excel или базу данных и фильтровать и сортировать строки так как удобно именно вам. В данных есть адреса домов и название района.

30тыс. домов Москвы. Чем светлее точка, тем меньше вышеназванной инфраструктуры в окрестностях дома
30тыс. домов Москвы. Чем светлее точка, тем меньше вышеназванной инфраструктуры в окрестностях дома

Моя модель достаточно простая и не учитывает что-либо кроме пешеходной дистанции до объектов инфраструктуры.

Если вы не программист, а интересны результаты, просто пропускайте следующий раздел.

Как рассчитать

С открытыми данными это не сложно. Хотя расчет пешеходных расстояний для большого числа домов это достаточно длительная операция, в отличии от простого расчета расстояний между двумя точками по прямой. Почему так происходит можно посмотреть на скринкастах.

Уже описывал по шагам как подготовить исходные данные для анализа. Но если у вас вдруг нет ресурсов или желания для таких расчетов, то можете взять предрасчитаные данные для пешеходных расстояний от жилых домов до мест в окрестностях: https://github.com/igor-suhorukov/igor-suhorukov.github.io/blob/main/data/distmsk_*.parquet (где под * номера от 0 до 21). Загружать эти файлы в таблицу duckdb_building нужно, чтобы обогатить данные адресом: номером дома, названием улицы и района.

Для загрузки данных в Parquet формате пришлось стряхнуть пыль со своего проекта arrow_to_database, обновить его зависимости до последней версии, поправил код и написал сборку проекта в Dockerfile. Проект позволяет используя библиотеку Apache Arrow загружать данные из файлов Parquet, ORC, Arrow Feather в базы данных PostgreSQL, H2, QuestDB. Жду не дождусь когда уже в PostgreSQL или psql появится возможность загружать parquet файлы без стороннего инструментария. Основной функционал проекта по загрузке данных:

 void copyArrowDatasetIntoPreparedStatement(int batchSize, FileFormat fileFormat,
                                              String datasetUri, PreparedStatement preparedStatement) throws Exception {
        try (BufferAllocator allocator = new RootAllocator()) {
            FileSystemDatasetFactory factory = new FileSystemDatasetFactory(allocator,
                                                        NativeMemoryPool.getDefault(), fileFormat, datasetUri);
            final Dataset dataset = factory.finish();
            ScanOptions options = new ScanOptions(batchSize);
            final Scanner scanner = dataset.newScan(options);
            try {
                long rowCount=0;
                try (ArrowReader reader = scanner.scanBatches()) {
                    while (reader.loadNextBatch()) {
                        try (VectorSchemaRoot root = reader.getVectorSchemaRoot()) {
                            JdbcParameterBinder binder = JdbcParameterBinder
                                    .builder(preparedStatement, root).bindAll().build();
                            while (binder.next()) {
                                preparedStatement.addBatch();
                                rowCount++;
                            }
                            preparedStatement.executeBatch();
                        }
                    }
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                LOGGER.info("Total rows imported: {}", rowCount);
            } finally {
                AutoCloseables.close(scanner, dataset);
            }
        }
    }

Происходит инициализация Dataset, создание Scanner и запись каждой порции данных( размер фрагмента задан параметром программы) из Arrow API в базу через JDBC. Остальной код в проекте нужен для конвертации схемы и парсинг параметров утилиты и интереса тут не представляет. Утилита также может автоматически создавать таблицу по схеме parquet файла, если указать create_table.

Импорт 55млн. строк данных в PostgreSQL :

[main] INFO org.apache.arrow.memory.BaseAllocator - Debug mode disabled. Enable with the VM option -Darrow.memory.debug.allocator=true.
[main] INFO org.apache.arrow.memory.DefaultAllocationManagerOption - allocation manager type not specified, using netty as the default type
[main] WARN org.apache.arrow.memory.CheckAllocator - More than one DefaultAllocationManager on classpath. Choosing first found
[main] INFO org.apache.arrow.memory.CheckAllocator - Using DefaultAllocationManager at memory-netty/14.0.1/arrow-memory-netty-14.0.1.jar!/org/apache/arrow/memory/DefaultAllocationManagerFactory.class
[main] INFO com.github.isuhorukov.arrow.jdbc.DatasetReader - Generated 'insert' query from Apache Arrow schema: insert into duckdb_building("h3_8", "building_id", "building_type", "distance", "categories", "design_ref", "name", "amenity", "leisure", "shop", "healthcare", "tourism", "historic", "sport", "memorial", "education", "religion", "office", "brand", "network", "operator") values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
[main] INFO com.github.isuhorukov.arrow.jdbc.DatasetReader - Total rows imported: 55180865

После подготовки необходимых данных расчет модели по домам явно не rocket science - просто суммы и фильтрация:

CREATE TABLE moscow_district AS select tags->'name' name,polygon from multipolygon where tags->'admin_level'='8' and tags->'boundary'='administrative';

CREATE INDEX idx_moscow_district_geometry ON moscow_district USING gist (polygon);

CREATE TABLE infrastructure_for_children AS
  select 
     (select name 
      from moscow_district 
      where st_contains(polygon, centre) limit 1) district,
  tags->'addr:street' street, 
  tags->'addr:housenumber' housenumber,  
  totalscore,
  kindergarten>0 and school>0 and college>0 and university>0 and language_school>0 and music_school>0 and training>0 and sports_centre>0 and community_centre>0 and playground>0 and clinic>0 all_infra,
  kindergarten::smallint,
  school::smallint,
  college::smallint,
  university::smallint,
  language_school::smallint,
  music_school::smallint,
  training::smallint,
  sports_centre::smallint,
  community_centre::smallint,
  playground::smallint,
  clinic::smallint
from (select building_id,building_type,
       (count(*) filter (where amenity='kindergarten' or amenity='childcare') +
       count(*) filter (where amenity='school') +
       count(*) filter (where amenity='college') +
       count(*) filter (where amenity='university') +
       count(*) filter (where amenity='language_school') +
       count(*) filter (where amenity='music_school') +
       count(*) filter (where amenity='training') +
       count(*) filter (where leisure='sports_centre') +
       count(*) filter (where amenity='community_centre') +
       0.01*count(*) filter (where leisure='playground') +
       0.01*count(*) filter (where amenity='clinic'))::float4 totalScore,
       count(*) filter (where amenity='kindergarten' or amenity='childcare') kindergarten,
       count(*) filter (where amenity='school') school,
       count(*) filter (where amenity='college') college,
       count(*) filter (where amenity='university') university,
       count(*) filter (where amenity='language_school') language_school,
       count(*) filter (where amenity='music_school') music_school,
       count(*) filter (where amenity='training') training,
       count(*) filter (where leisure='sports_centre') sports_centre,
       count(*) filter (where amenity='community_centre') community_centre,
       count(*) filter (where leisure='playground') playground,
       count(*) filter (where amenity='clinic') clinic
      from duckdb_building 
        group by 1,2) stat 
  inner join  geometry_global_view g 
    on stat.building_id=id and stat.building_type=type
        and (g.tags->'building:levels' is not null and g.tags->'building:levels'~'^\d+$' and (g.tags->'building:levels')::integer>2) -- только многоэтажные дома
 order by totalscore desc;

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

select district, street, housenumber,
        totalscore,all_infra,
  kindergarten, school,college, university, language_school, music_school,training,sports_centre,community_centre,playground,clinic 
from 
 (select *, row_number() over (partition by district order by all_infra desc,totalscore desc) 
   from infrastructure_for_children) a 
where row_number=1 and district is not null
order by totalscore desc;

Ну а раз вы выполнили эти шаги и знаете SQL хотя бы на базовом уровне, то перед вами открываются почти неограниченные возможности по созданию запросов и модели именно под себя, учитывая свои предпочтения.

Всегда ли и все ли исходные данные проекта OpenStreetMap правильные? Я отвечу - не всегда. Постоянно есть что улучшать и в исходных данных и к чему стремиться в модели, сохраняя при этом ее прозрачность и простоту. Считаю, что неполные бесплатные данные лучше их отсутствия / недоступности из-за стоимости комерческих геоданных.

Рейтинг лучших домов по районам

Если выбрать только одно значение для каждого района Москвы в следующем порядке, то получим рейтинг жилья по районам:

  1. сначала дома где в округе есть вся вышеперечисленная инфраструктура;

  2. и в порядке убывания totalScore для этого района.

Можно скачать по ссылке на GitHub с более подробной информацией по числу садиков, школ...

По одному самому лучшему дому на район. Чем светлее точка на карте, тем меньше вышеназванной инфраструктуры в окрестностях дома
По одному самому лучшему дому на район. Чем светлее точка на карте, тем меньше вышеназванной инфраструктуры в окрестностях дома
            Район                |            Улица              |    Дом      | totalscore | вся ли инф-ра? 
---------------------------------+-------------------------------+-------------+------------+---------------
 Красносельский район            | Сретенский бульвар            | 3/4 с2      |     190.16 | да
 Мещанский район                 | Рождественский бульвар        | 11          |     183.83 | да
 Басманный район                 | Мясницкая улица               | 30/2 с3     |      181.1 | да
 Тверской район                  | Петровский бульвар            | 23          |     178.83 | да
 Гагаринский район               | Ленинский проспект            | 79          |     166.48 | да
 Таганский район                 | Яузский бульвар               | 14/8        |     164.79 | да
 Пресненский район               | Садовая-Кудринская улица      | 6 с1        |     163.87 | да
 Ломоносовский район             | Ленинский проспект            | 81/2        |     163.42 | да
 район Арбат                     | Большой Девятинский переулок  | 1/17        |     156.64 | да
 Обручевский район               | Ленинский проспект            | 95Б         |     143.14 | да
 район Измайлово                 | Сиреневый бульвар             | 32          |     142.79 | да
 район Северное Измайлово        | Сиреневый бульвар             | 37/40       |     138.86 | да
 Академический район             | Нахимовский проспект          | 56          |     137.37 | да
 район Черёмушки                 | улица Архитектора Власова     | 27          |     135.24 | да
 район Марьина Роща              | Октябрьская улица             | 2           |     133.77 | да
 район Проспект Вернадского      | улица Удальцова               | 1 к1        |     131.96 | да
 район Хамовники                 | Смоленская улица              | 3           |     130.26 | да
 район Беговой                   | Бумажный проезд               | 2/2         |     128.49 | да
 Хорошёвский район               | Ленинградский проспект        | 59          |     127.45 | да
 район Замоскворечье             | улица Зацепский Вал           | 5           |      126.3 | да
 район Раменки                   | проспект Вернадского          | 10 к1       |     125.61 | да
 район Аэропорт                  | улица Усиевича                | 27 к1       |     125.43 | да
 Савёловский район               | улица 8 Марта                 | 8 к1        |     118.95 | да
 Орехово-Борисово Южное          | Ореховый бульвар              | 20/2        |     117.84 | нет
 район Сокол                     | Ленинградский проспект        | 63          |     117.31 | да
 район Орехово-Борисово Северное | Борисовский проезд            | 44 к2       |     116.63 | нет
 район Зябликово                 | Ореховый бульвар              | 29/49       |     115.83 | нет
 район Якиманка                  | улица Серафимовича            | 2/20        |     115.77 | да
 район Северное Тушино           | улица Героев Панфиловцев      | 3           |     114.98 | нет
 Южнопортовый район              | 3-й Крутицкий переулок        | 11          |     113.49 | да
 Тимирязевский район             | Чуксин тупик                  | 3           |     112.86 | да
 район Марьино                   | Братиславская улица           | 5           |     111.94 | да
 Бутырский район                 | Бутырская улица               | 4           |     111.75 | да
 район Люблино                   | улица Верхние Поля            | 35 к5       |     110.22 | да
 район Кузьминки                 | Волгоградский проспект        | 82/37       |     109.92 | да
 район Гольяново                 | Щёлковское шоссе              | 79 к1       |     108.18 | нет
 район Восточное Измайлово       | Первомайская улица            | 74          |     105.42 | да
 район Сокольники                | улица Гастелло                | 41          |     101.84 | да
 район Преображенское            | улица Богородский Вал         | 6 к1        |     100.14 | да
 район Богородское               | Краснобогатырская улица       | 79 к3А      |       99.3 | да
 Бескудниковский район           | Дмитровское шоссе             | 103         |      97.76 | нет
 Даниловский район               | Мытная улица                  | 48          |      97.47 | да
 район Бибирево                  | Шенкурский проезд             | 14          |      96.68 | нет
 район Митино                    | Митинская улица               | 23          |      96.04 | нет
 район Текстильщики              | 11-я улица Текстильщиков      | 12А         |      95.21 | да
 Дмитровский район               | Дмитровское шоссе             | 107 к1      |      94.44 | нет
 район Щукино                    | улица Маршала Рыбалко         | 1           |       93.7 | да
 район Лефортово                 | Красноказарменная улица       | 3           |      93.59 | да
 район Котловка                  | улица Кржижановского          | 27          |      92.89 | нет
 Бабушкинский район              | Ленская улица                 | 19          |      91.31 | да
 Лосиноостровский район          | Анадырский проезд             | 25 к2       |      90.75 | нет
 Алексеевский район              | проспект Мира                 | 182         |      90.43 | да
 район Ясенево                   | Ясногорская улица             | 13 к2       |      90.02 | нет
 район Зюзино                    | Болотниковская улица          | 54 к1       |      89.59 | да
 район Дорогомилово              | Большая Дорогомиловская улица | 4           |       89.5 | да
 район Хорошёво-Мнёвники         | улица Маршала Тухачевского    | 21 к1       |      89.33 | нет
 район Лианозово                 | Алтуфьевское шоссе            | 83          |      88.87 | нет
 район Северное Медведково       | Сухонская улица               | 11          |      88.69 | нет
 район Перово                    | Федеративный проспект         | 16 к1       |      88.39 | нет
 район Ховрино                   | улица Лавочкина               | 34 к1       |      87.79 | да
 район Восточное Дегунино        | улица 800-летия Москвы        | 14          |      87.58 | нет
 Рязанский район                 | Волжский бульвар              | 13 к1       |      86.68 | да
 район Отрадное                  | Северный бульвар              | 8           |      85.41 | нет
 район Соколиная Гора            | Большая Семёновская улица     | 29/2        |      85.39 | да
 Останкинский район              | Звёздный бульвар              | 1           |      84.64 | да
 район Кунцево                   | Ярцевская улица               | 27 к1       |      84.57 | нет
 район Новогиреево               | Мартеновская улица            | 16/36       |      84.26 | нет
 район Свиблово                  | Вересковая улица              | 1 к2        |      82.96 | да
 район Южное Тушино              | улица Свободы                 | 43          |      82.29 | да
 район Царицыно                  | Кантемировская улица          | 31          |      81.87 | нет
 Головинский район               | улица Лавочкина               | 28/42       |      80.72 | да
 Можайский район                 | Гвардейская улица             | 15 к1       |      79.32 | нет
 район Коньково                  | Профсоюзная улица             | 110 к2      |      78.75 | нет
 район Левобережный              | Фестивальная улица            | 4           |      77.87 | да
 Нагорный район                  | Болотниковская улица          | 11 к1       |      77.67 | нет
 район Ивановское                | Напольный проезд              | 1           |      76.81 | нет
 район Чертаново Северное        | Чертановская улица            | 1А к1       |      76.25 | нет
 Ярославский район               | Хибинский проезд              | 26          |      75.48 | нет
 район Коптево                   | улица Космонавта Волкова      | 29          |      74.97 | нет
 Донской район                   | Донская улица                 | 33          |      74.48 | да
 район Братеево                  | улица Борисовские Пруды       | 16 к2       |      74.46 | нет
 район Строгино                  | улица Маршала Катукова        | 20 к1       |      74.17 | да
 район Южное Медведково          | Заповедная улица              | 18 к2       |      73.61 | да
 район Западное Дегунино         | Коровинское шоссе             | 15 к1       |      73.24 | нет
 район Чертаново Центральное     | Кировоградская улица          | 32 к1       |      72.54 | нет
 район Выхино-Жулебино           | Рязанский проспект            | 58/1        |      71.61 | нет
 Алтуфьевский район              | Алтуфьевское шоссе            | 64В         |      71.57 | да
 район Тёплый Стан               | улица Островитянова           | 16 к2       |      71.54 | нет
 район Южное Бутово              | Южнобутовская улица           | 9           |      71.26 | нет
 Войковский район                | улица Космонавта Волкова      | 17 к1       |      69.81 | нет
 район Солнцево                  | улица Богданова               | 26 к2       |      66.57 | нет
 район Чертаново Южное           | Кировоградский проезд         | 3 к1        |      66.46 | нет
 район Москворечье-Сабурово      | Кантемировская улица          | 16 к1А      |      66.42 | нет
 район Ростокино                 | улица Сергея Эйзенштейна      | 2           |      66.14 | да
 Тропарёво-Никулино              | проспект Вернадского          | 105 к4      |      65.95 | нет
 район Крылатское                | Рублёвское шоссе              | 34 к1       |      65.48 | нет
 район Вешняки                   | улица Старый Гай              | 2 к3        |      64.12 | да
 район Печатники                 | улица Кухмистерова            | 20          |      62.96 | нет
 район Фили-Давыдково            | Инициативная улица            | 5 к1        |      61.81 | нет
 район Новокосино                | Суздальская улица             | 18 к3       |       60.8 | нет
 район Марфино                   | улица Кашёнкин Луг            | 2 к1        |      60.57 | нет
 район Нагатинский Затон         | Судостроительная улица        | 12          |      60.03 | нет
 Нижегородский район             | Боенский проезд               | 2           |      58.25 | нет
 район Нагатино-Садовники        | Нагатинская улица             | 32          |      57.96 | нет
 район Покровское-Стрешнево      | Малая Набережная улица        | 17/22       |      56.26 | да
 Ново-Переделкино                | улица Скульптора Мухиной      | 3           |      52.39 | нет
 район Филёвский Парк            | Кастанаевская улица           | 4           |      52.32 | да
 район Северное Бутово           | бульвар Дмитрия Донского      | 17          |      49.98 | нет
 район Очаково-Матвеевское       | Озёрная улица                 | 17          |      45.54 | да
 поселение Московский            | улица Зелёная Горка           | 1 к3        |      42.37 | нет
 район Косино-Ухтомский          | улица Руднёвка                | 3           |      41.89 | нет
 район Северный                  | Дмитровское шоссе             | 165Е к7     |      37.83 | нет
 район Бирюлёво Восточное        | 6-я Радиальная улица          | 3 к1        |      33.64 | нет
 район Метрогородок              | Открытое шоссе                | 17 к1       |      33.61 | нет
 поселение Внуковское            | улица Анны Ахматовой          | 10          |      33.59 | нет
 поселение Сосенское             | Фитарёвская улица             | 19          |      27.23 | нет
 район Некрасовка                | Рождественская улица          | 33          |      23.92 | нет
 поселение Воскресенское         | Чечёрский проезд              | 122 к2      |      20.53 | нет
 район Внуково                   | Спортивная улица              | 2/11        |      14.59 | нет
(119 rows)
Просмотр этого же списка в интерфейсе GitHub
Просмотр этого же списка в интерфейсе GitHub

Выводы

Больше всего инфраструктуры для детей Москвы доступно у домов в ЦАО, Ломоносовском районе, районе Аэропорт и в Измайлово. Но при этом почти в каждом районе столицы инфраструктуры предостаточно, если судить по рассчитаному списку.

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

Творчество нейросети SD на тему лучшего жилья в многоэтажном доме для семьи
Творчество нейросети SD на тему лучшего жилья в многоэтажном доме для семьи

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

Теги:
Хабы:
Всего голосов 13: ↑11 и ↓2+9
Комментарии26

Публикации

Истории

Работа

Java разработчик
361 вакансия

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург