Статьи

Визуализация данных с R: RGoogleMaps и Торонто Open Data

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

Если вы посмотрите в наборе данных (или в документации к набору данных), вы увидите, что он содержит имена, адреса, телефонную информацию, тип здания, количество мест в дневном уходе (с разбивкой по возрастным категориям, а затем суммируется) и непроецированные координаты широты / долготы. Этот набор данных буквально умолял меня отобразить его, но он также умолял меня использовать одну из нескольких переменных пространства на карте!

Процесс, который я использовал для создания карт, очень похож на карты, которые я сделал, когда анализировал форму обратной связи казино Торонто (опрос), за исключением карт, которые я поместил в этом посте, точки могут быть больше или меньше в зависимости от процентили количественной переменной (в этом случае общее количество мест в детских учреждениях определенного типа здания). Вы можете найти код R, который я использовал для генерации этих карт и статистики, внизу этого поста.

Это подразумевается строго как исследовательское упражнение. Чтобы обеспечить дополнительную информативную ясность для этого упражнения, я создал несколько карт, на которых каждая карта показывает расположение центров по уходу за детьми одного типа зданий (например, Религиозные объекты, Государственные начальные школы, Здания высотного здания и т. Д.). Когда я опишу каждую карту, я также буду ссылаться на описательную статистику, которую я рассчитал и отобразил в нижней части этого поста (после всего кода R). Если вы посмотрите на таблицу внизу этого поста, вы заметите, что там было больше типов зданий, чем я здесь отобразил. Это потому, что мне не хотелось отображать все, только некоторые из самых популярных:)

Государственные начальные школы  , безусловно, являются наиболее популярным типом зданий, в которых находятся лицензированные центры по уходу за детьми в этом наборе данных (по данным 279 центров). Глядя на карту ниже, вы можете видеть, что в центре GTA (центр города Торонто и Северный Йорк) находится очень плотная группа государственных центров по уходу за детьми в начальной школе. Когда вы идете на запад в сторону Этобико и Рексдейла, вы определенно видите меньше центров, а затем в Скарборо вы также видите несколько центров, но они кажутся более рассредоточенными и менее сгруппированными, чем в других областях. В этих центрах по уходу за детьми много различий: от 15 до 217, при этом среднее количество мест в государственных центрах по уходу за детьми в начальной школе составляет около 74 мест в каждом центре.

Государственные начальные школы

Места поклонения , как вы можете видеть ниже, гораздо менее многочисленны, чем их коллеги из государственных начальных школ, и только 116 из них зарегистрированы в этом наборе данных. Первое, что я заметил на этой карте, — это то, что большинство маленьких точек (таким образом, маленькие центры по уходу за детьми в местах отправления культа), похоже, падают на юге ГТА, а не на севере. Я полагаю, что это имеет смысл для меня по аналогии. На севере GTA (где я живу) многие компании представляют собой крупные сети, которые стремятся обслуживать как можно больше людей, в то время как в центре города находится множество небольших предприятий, которые обслуживают нишу на рынке. Возможно, такая же история с центрами по уходу за детьми и в местах отправления культа.

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

Центры по уходу за детьми в местах отправления культа варьировались от минимум 8 мест до максимум 167, в среднем около 48 мест на центр.
места поклонения

 Как вы можете видеть ниже, центр по уходу за детьми High Rise демонстрирует довольно четкую географическую структуру. Похоже, они находятся либо на востоке Торонто, около шоссе 404 или за ним, либо на западе Торонто, большинство из них за пределами Аллен-роуд / Дафферин-стрит. Интересно, что объясняет, как выглядит эта дыра в середине !? Кроме того, вы заметите, что многие из небольших высотных детских учреждений находятся на востоке Торонто, а не на западе. Высотные центры по уходу за детьми варьируются от минимум 20 мест до максимум 145, в среднем около 69 мест на центр. Вы заметите, что минимальное количество мест выше, чем в других категориях, вероятно, из-за того, что они, вероятно, обслуживают много жителей в своем собственном высотном здании!
Небоскребы

Цель Здания , или здания, которые были созданы с учетом центра по уходу за детьми, довольно редки по всему Торонто, и в наборе данных только 58. С точки зрения кластеров здесь, похоже, вы могли бы разграничить 4 группы зданий: север, юг, восток и запад. Целевые здания варьируются от минимум 20 мест до максимум 165 со средним значением около 72 мест на центр (однако медиана равна 60, что говорит о том, что там есть несколько действительно больших по сравнению со всеми остальными). В стороне от них, кажется, что специальные здания похожи на высотные детские сады в том смысле, что они предназначены для более высокой пропускной способности, чем другие центры.
Назначение Здания

Общественные и развлекательные центры  с детьми заботятся о том, чтобы показать, как они расположены вокруг GTA. Очевидные исключения — в Скарборо, где, по-видимому, очень мало общественных и развлекательных центров с уходом за детьми по сравнению с тем, что происходит на западе. Возможно, это отражает явление, которое мы наблюдали в центрах по уходу за детьми в местах отправления религиозных обрядов, на юге расположено множество небольших общинных и развлекательных центров с уходом за детьми, тогда как север — это область более крупных центров. Эти центры варьируются от минимум 13 пробелов до максимум 146, в среднем около 64 пробелов на центр.
Общественные и развлекательные центры

Хотя центры по уходу за детьми в домахКажется, что они выглядят очень случайно, я не могу не заметить, что в непосредственной близости от железнодорожных путей Go Train, исходящих от станции Union, есть несколько центров. Возможно, там есть интересная история, или, может быть, я просто вижу шаблоны, которые ничего не значат (в конце концов, в наборе данных зарегистрировано всего 38 таких мест!). Центры по уходу за детьми в домах варьируются от минимум 10 мест до максимум 116, в среднем около 50 мест на центр. Мне действительно интересно, как именно эти дома подходят так многим детям. Видя, как мы живем в мире пост-Google Street View, вы можете просто посмотреть на любой дом, который вы хотите в живом цвете, введя адрес. Вы можете увидеть, насколько большой из этих домов (он имеет 87 мест!) Под следующей картой.
дома

Selection_030
Вау! Это не полная картина, но вы чувствуете, что дом действительно довольно большой!

Ну вот и завершается мой набег в мир лицензированных центров по уходу за детьми. Если у вас есть какие-либо комментарии относительно этих результатов или вы можете показать мне лучший способ их отображения (хотя мне действительно нравится RGoogleMaps), то обязательно оставьте мне комментарий! Код R доступен ниже.

library(ff)
library(ffbase)
library(RgoogleMaps)
library(plyr)

addTrans <- function(color,trans)
{
  # This function adds transparancy to a color.
  # Define transparancy with an integer between 0 and 255
  # 0 being fully transparant and 255 being fully visable
  # Works with either color and trans a vector of equal length,
  # or one of the two of length 1.
  
  if (length(color)!=length(trans)&!any(c(length(color),length(trans))==1)) stop("Vector lengths not correct")
  if (length(color)==1 & length(trans)>1) color <- rep(color,length(trans))
  if (length(trans)==1 & length(color)>1) trans <- rep(trans,length(color))
  
  num2hex <- function(x)
  {
    hex <- unlist(strsplit("0123456789ABCDEF",split=""))
    return(paste(hex[(x-x%%16)/16+1],hex[x%%16+1],sep=""))
  }
  rgb <- rbind(col2rgb(color),trans)
  res <- paste("#",apply(apply(rgb,2,num2hex),2,paste,collapse=""),sep="")
  return(res)
}

childcare = read.csv.ffdf(file="child-care.csv", first.rows=500,next.rows=500,colClasses=NA,header=TRUE)
pcodes = read.csv.ffdf(file="zipcodeset.txt", first.rows=50000, next.rows=50000, colClasses=NA, header=FALSE)

childcare$PCODE_R = as.ff(as.factor(sub(" ","", childcare[,"PCODE"])))
names(pcodes) = c("PCODE","Lat","Long","City","Prov")

childcare = merge(childcare, as.ffdf(pcodes[,1:3]), by.x="PCODE_R", by.y="PCODE", all.x=TRUE)

childcare.gc = subset(childcare, !is.na(Lat))
childcare.worship = subset(childcare.gc, bldg_type == "Place of Worship")
childcare.house = subset(childcare.gc, bldg_type == "House")
childcare.community = subset(childcare.gc, bldg_type == "Community/Recreation Centre")
childcare.pschool = subset(childcare.gc, bldg_type == "Public Elementary School")
childcare.highrise = subset(childcare.gc, bldg_type == "High Rise Apartment")
childcare.purpose = subset(childcare.gc, bldg_type == "Purpose Built")

Fn = ecdf(childcare.worship[,"TOTSPACE"])
childcare.worship$TOTSPACE.pct = as.ff(Fn(childcare.worship[,"TOTSPACE"]))
mymap = MapBackground(lat=childcare.worship[,"Lat"], lon=childcare.worship[,"Long"])
PlotOnStaticMap(mymap, childcare.worship[,"Lat"], childcare.worship[,"Long"], cex=childcare.worship[,"TOTSPACE.pct"]*4, pch=21, bg=addTrans("purple",100))

Fn = ecdf(childcare.house[,"TOTSPACE"])
childcare.house$TOTSPACE.pct = as.ff(Fn(childcare.house[,"TOTSPACE"]))
mymap = MapBackground(lat=childcare.house[,"Lat"], lon=childcare.house[,"Long"])
PlotOnStaticMap(mymap, childcare.house[,"Lat"], childcare.house[,"Long"], cex=childcare.house[,"TOTSPACE.pct"]*4, pch=21, bg=addTrans("purple",100))


Fn = ecdf(childcare.community[,"TOTSPACE"])
childcare.community$TOTSPACE.pct = as.ff(Fn(childcare.community[,"TOTSPACE"]))
mymap = MapBackground(lat=childcare.community[,"Lat"], lon=childcare.community[,"Long"])
PlotOnStaticMap(mymap, childcare.community[,"Lat"], childcare.community[,"Long"], cex=childcare.community[,"TOTSPACE.pct"]*4, pch=21, bg=addTrans("purple",100))

Fn = ecdf(childcare.pschool[,"TOTSPACE"])
childcare.pschool$TOTSPACE.pct = as.ff(Fn(childcare.pschool[,"TOTSPACE"]))
mymap = MapBackground(lat=childcare.pschool[,"Lat"], lon=childcare.pschool[,"Long"])
PlotOnStaticMap(mymap, childcare.pschool[,"Lat"], childcare.pschool[,"Long"], cex=childcare.pschool[,"TOTSPACE.pct"]*4, pch=21, bg=addTrans("purple",100))

Fn = ecdf(childcare.highrise[,"TOTSPACE"])
childcare.highrise$TOTSPACE.pct = as.ff(Fn(childcare.highrise[,"TOTSPACE"]))
mymap = MapBackground(lat=childcare.highrise[,"Lat"], lon=childcare.highrise[,"Long"])
PlotOnStaticMap(mymap, childcare.highrise[,"Lat"], childcare.highrise[,"Long"], cex=childcare.highrise[,"TOTSPACE.pct"]*4, pch=21, bg=addTrans("purple",100))

Fn = ecdf(childcare.purpose[,"TOTSPACE"])
childcare.purpose$TOTSPACE.pct = as.ff(Fn(childcare.purpose[,"TOTSPACE"]))
mymap = MapBackground(lat=childcare.purpose[,"Lat"], lon=childcare.purpose[,"Long"])
PlotOnStaticMap(mymap, childcare.purpose[,"Lat"], childcare.purpose[,"Long"], cex=childcare.purpose[,"TOTSPACE.pct"]*4, pch=21, bg=addTrans("purple",100))

space.by.bldg_type = ddply(as.data.frame(childcare.gc), .(bldg_type), function (x) c(min.space = min(x[,"TOTSPACE"], na.rm=TRUE), average.space = mean(x[,"TOTSPACE"], na.rm=TRUE), median.space = median(x[,"TOTSPACE"], na.rm=TRUE), max.space = max(x[,"TOTSPACE"], na.rm=TRUE), tot_daycares = sum(!is.na(x[,"TOTSPACE"]))))
space.by.bldg_type = space.by.bldg_type[order(-space.by.bldg_type$tot_daycares),]

                                bldg_type min.space average.space median.space max.space tot_daycares
18               Public Elementary School        15      74.19355         69.0       217          279
17                       Place of Worship         8      48.46552         44.0       167          116
16                                  Other        14      51.17647         48.5       160          102
1              Catholic Elementary School        16      51.50000         49.5       112           76
9                     High Rise Apartment        20      68.56522         62.0       145           69
22                          Purpose Built        20      72.48276         59.5       165           58
8             Community/Recreation Centre        13      63.73333         60.0       146           45
11                                  House        10      49.84211         44.5       116           38
6                     Commercial Building        16      55.95833         51.5       129           24
15                        Office Building        20      69.69565         64.0       162           23
20                     Public High School        16      42.36842         41.0        60           19
21                 Public School (Closed)        22      70.26667         56.0       180           15
4                                  Church        13      51.90909         46.0       148           11
19      Public Elementary School (French)        36      84.71429         70.0       167            7
23                              Synagogue        24      64.00000         61.0       108            7
7            Community College/University        15      55.16667         59.5        78            6
14                     Low Rise Apartment        15      56.00000         62.0        92            6
2      Catholic Elementary School(French)        39      81.20000         76.0       130            5
5  City owned Community/Recreation Centre        28      65.80000         62.0       103            5
3                    Catholic High School        36      51.50000         54.0        62            4
12                                 HUMSRV        45      52.00000         52.0        59            2
13                    Industrial Building        45     109.00000        109.0       173            2
26              Private Elementary School        20     154.50000        154.5       289            2
10                 Hospital/Health Centre        25      25.00000         25.0        25            1
24                                              109     109.00000        109.0       109            1
25            Coomunity/Recreation Centre       156     156.00000        156.0       156            1
27                   Public Middle School        10      10.00000         10.0        10            1