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

Когда выбираешь дом с учетом благополучия ребенка и жизни семьи с ним ближайшие 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 
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 | да
 район Раменки                   | проспект Вернадского          | 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 | нет
 район Северное Тушино           | улица Героев Панфиловцев      | 3           |     114.98 | нет
 Южнопортовый район              | 3-й Крутицкий переулок        | 11          |     113.49 | да
 Тимирязевский район             | Чуксин тупик                  | 3           |     112.86 | да
 район Марьино                   | Братиславская улица           | 5           |     111.94 | да
 Бутырский район                 | Бутырская улица               | 4           |     111.75 | да
 район Люблино                   | Новороссийская улица          | 34          |     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 | нет
 район Митино                    | Митинская улица               | 21          |      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 | нет
 Нагорный район                  | Болотниковская улица          | 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 | да
 район Фили-Давыдково            | Инициативная улица            | 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 | нет
 район Северный                  | Дмитровское шоссе             | 169 к8      |      37.83 | нет
 район Бирюлёво Восточное        | 6-я Радиальная улица          | 3 к1        |      33.64 | нет
 район Метрогородок              | Открытое шоссе                | 17 к1       |      33.61 | нет
 поселение Внуковское            | улица Анны Ахматовой          | 10          |      33.59 | нет
 поселение Сосенское             | Фитарёвская улица             | 19          |      27.23 | нет
 район Некрасовка                | улица Недорубова              | 25          |      23.92 | нет
 поселение Воскресенское         | Чечёрский проезд              | 122 к2      |      20.53 | нет
 район Внуково                   | Спортивная улица              | 1/9         |      14.59 | нет

Просмотр этого же списка в интерфейсе GitHub

Просмотр этого же списка в интерфейсе GitHub

Выводы

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

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

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

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

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

© Habrahabr.ru