Загрузка библиотек и данных для анализа

Используем библиотеки tidyverse, leaflet, readxl, plotly, stringr.

library(rsconnect)
library(tidyverse) # для общей обработки данных
library(leaflet) # для отображения на карте
library(readxl) # для чтения данных из файлов excel
library(plotly) # для интерактивных визуализаций
library(stringr) # для обработки текста

Загрузим файл parkovki.xlsx, содержащий информацию о перехватывающих парковках Москвы (источник: портал открытых данных Правительства Москвы data.mos.ru).

parkings = read_excel('parkovki.xlsx', sheet = 'Sheet0') %>% # Чтение данных
           mutate(Longitude_WGS84 = as.numeric(Longitude_WGS84), # Преобразование долготы в числовой формат
                  Latitude_WGS84 = as.numeric(Latitude_WGS84), # Преобразование широты в числовой формат
                  CarCapacity = as.numeric(CarCapacity), # Преобразование вместимости парковок в числовой формат
                  District = str_replace(District, 'район | район', ''), # Сокращение длины названий районов
                  ParkingName = str_replace(toupper(ParkingName),
                        'ПЕРЕХВАТЫВАЮЩАЯ ПАРКОВКА МЕТРОПОЛИТЕНА ', '')) # Сокращение длины названий парковок

Визуализация данных на карте

Строим карту с помощью библиотеки leaflet.

plot_01 = NA %>%
      leaflet() %>% # Инициализация
      addTiles() %>% # Добавление холста
      addProviderTiles("OpenStreetMap.Mapnik") %>% # Выбор карты OpenStreetMap
      addCircleMarkers( # Определение параметров меток
        lng = parkings$Longitude_WGS84, # Добавление широты
        lat = parkings$Latitude_WGS84, # Добавление долготы
        clusterOptions = markerClusterOptions(), # Добавление условия кластеризации
        radius = parkings$CarCapacity / 25, # Привязка радиуса метки к вместимости парковки
        popup = paste(paste('<b>', parkings$MetroStation, '</b>', sep = ''), # Станция метро
                paste('<u>', 'Адрес', '</u>', ': ', parkings$LocationDescription, sep = ''), # Адрес
                paste('<u>', 'Расписание работы', '</u>', ': ', parkings$Schedule, sep = ''), # Расписание работы
                paste('<u>', 'Вместимость', '</u>', ': ', parkings$CarCapacity, ' а/м', sep = ''), # Вместимость
                sep = "<br>"), # Разделитель в подсказке
        label = parkings$ParkingName # Название
                       )
plot_01 # Запуск визуализации

Визуализация анализа данных

Покажем количество перехватывающих парковок по районам.

distr = parkings %>% group_by(District) %>% summarise(count = n()) %>% # Расчёт количества парковок по районам
        mutate(paint = # Параметр цвета
                 ifelse(count >= quantile(count)[5], 'rgba(0, 34, 158, 1.0)',
                 ifelse(count >= quantile(count)[4], 'rgba(71, 102, 205, 1.0)', 
                 ifelse(count >= quantile(count)[3], 'rgba(103, 115, 158, 1.0)',
                                                     'rgba(119, 128, 158, 1.0)'))))

# Построение графика с использованием plotly
plot_02 = plot_ly(distr, x = ~count, y = ~reorder(District, count),
                  type = 'bar', orientation = 'h',
                  text = ~count, textposition = 'inside', insidetextanchor = 'start',
                  marker = list(color = ~paint)) %>%
          layout(title = paste('<b>', 'Количество перехватывающих парковок', '</b>', sep = ''), 
                 xaxis = list(title = "", zeroline = F, showline = F, showticklabels = F, showgrid = F),
                 yaxis = list(title = ''),
                 font = list(family = 'Arial', size = 14))

plot_02 # Запуск визуализации

Покажем количество перехватывающих парковок по категориям вместимости.

b1 = 100; b2 = 150; b3 = 200; b4 = 350 # Границы категорий
colors = c('violet', 'royalblue', 'orange', 'lightseagreen', 'khaki') # Цвета категорий

capacity = parkings %>%
           mutate(category = # Параметр границ категорий
             ifelse(CarCapacity < b1,
                    paste('До ', as.character(b1), ' а/м', sep = ''),
             ifelse(CarCapacity >= b1 & CarCapacity < b2,
                    paste('От ', as.character(b1), ' до ', as.character(b2), ' а/м', sep = ''), 
             ifelse(CarCapacity >= b2 & CarCapacity < b3,
                    paste('От ', as.character(b2), ' до ', as.character(b3), ' а/м', sep = ''),
             ifelse(CarCapacity >= b3 & CarCapacity < b4,
                    paste('От ', as.character(b3), ' до ', as.character(b4), ' а/м', sep = ''),
                    paste('От ', as.character(b4), ' а/м', sep = '')))))) %>%
            group_by(category) %>% summarise(count = n()) # Расчёт количества парковок по категориям вместимости

# Построение диаграммы с использованием plotly
plot_03 = plot_ly(capacity, labels = ~category, values = ~count, type = 'pie',
                  textposition = 'inside', textinfo = 'label+percent+value', showlegend = FALSE,
                  marker = list(colors = colors, line = list(color = '#FFFFFF', width = 1))) %>%
          layout(title = paste('<b>', 'Перехватывающие парковки по категориям вместимости', '</b>', sep = ''),
                 font = list(family = 'Arial', size = 13))

plot_03 # Запуск визуализации