Самые удобные дома в Москве для жизни семьи с ребенком
Когда выбираешь дом с учетом благополучия ребенка и жизни семьи с ним ближайшие 20 лет, лучше жить в пешеходной доступности от детсада, школы, коледжа и университета. Было бы хорошо чтобы поблизости были кружки детского творчества, спортцентры, школы иностранных языков. Ну и отлично, когда рядом есть игровые площадки и поликлиники — жилье ведь выбирают не на пару лет.
Мой рейтинг домов будет основан только на количественных метриках пешеходной доступности. Все расчеты основаны на данных проекта OpenStreetMap для жилых домов, которые ближе 2 км пешком от входа в метрополитен или МЦК, а это значит что у этих домов нет проблем с транспортной доступностью. Рассчитаем самые удобные дома для жизни с детьми в районах Москвы.
Идея очень простая — когда изо дня в день ходите в одни и те же места на протяжении многих лет, то было бы отлично когда все эти маршруты были бы максимально близко к вашему дому и при этом у вас был бы выбор как можно большего числа объектов инфраструктуры в шаговой доступности от квартиры.
Методика расчета
Для каждого жилого дома Москвы выше 2х этажей в его окрестности 2 км пешком суммируем в отдельные значения сколько объектов каждого типа вокруг здания из списка:
Также для каждого дома ведем признак all_infra, который будет активирован, когда в окресности есть один и более объект для каждой из категорий этого списка. А также посчитаем totalScoreкак сумму числа всех этих объектов в окрестностях (поликлинику и детские площадки с понижающим коэффициентом 0.01).
Результаты расчетов опубликовал как список на 30 тыс жилых многоэтажных жилых домов для Москвы, где для каждого из домов расчитано число объектов инфраструктуры, связанной с детьми, в пешей доступности до 2 км. Можете загрузить его в Excel или базу данных и фильтровать и сортировать строки так как удобно именно вам. В данных есть адреса домов и название района.
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 правильные? Я отвечу — не всегда. Постоянно есть что улучшать и в исходных данных и к чему стремиться в модели, сохраняя при этом ее прозрачность и простоту. Считаю, что неполные бесплатные данные лучше их отсутствия / недоступности из-за стоимости комерческих геоданных.
Рейтинг лучших домов по районам
Если выбрать только одно значение для каждого района Москвы в следующем порядке, то получим рейтинг жилья по районам:
сначала дома где в округе есть вся вышеперечисленная инфраструктура
и в порядке убывания 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
Выводы
Больше всего инфраструктуры для детей Москвы доступно у домов в ЦАО, Ломоносовском районе, районе Аэропорт и в Измайлово. Но при этом почти в каждом районе столицы инфраструктуры придостаточно, если судить по рассчитаному списку.
Данных вокруг нас очень много. Но при этом мало кто задумывается какую ценность эти данные могут дать для решений в жизни, основанных не на эмоциях, а на объективных факторах. При этом у всех нас есть возможность улучшать и дополнять данные о реальном мире, а также строить модели которые пригодятся именно вам и вашей семье. Помните, что использование любой модели — это как навигатор с картой в автомобиле: можно принять информацию к сведению, но всегда отвественность за действия остается на вас.
Творчество нейросети SD на тему лучшего жилья в многоэтажном доме для семьи
Чем больше инфраструктуры для детей доступно в окрестностях вашего жилья, тем больше у семьи возможностей для лучшего выбора. Хотя цифры не единственное и абсолютно верное средство выбора места жительства, но если вас волнует судьба вашего чада, то описанные в статье критерии выбора могут помочь вам найти более комфортное место для вашей жизни, внимательнее присмотревшись к районам столицы.