Kodomo

Пользователь

Приводим данные в божеский вид

[data_apartaments.zip]

Источники проблем в данных

Данные про жилье в Бруклине: rollingsales_brooklyn.xls Для начала попробуйте открыть файл в Excel и посмотреть, как он выглядит.

Устанавливаем и подключаем пакет gdata:

install.packages("gdata")
require(gdata)

Читаем данные:

bk <- read.xls("rollingsales_brooklyn.xls",pattern="BOROUGH") #все что до строки, содержащей , "BOROUGH", не читаем

Смотрим на данные:

head(bk) 
summary(bk) #сводная статистика, чего сколько

Чистим данные

Смотрим колонку с ценами:

head(bk$SALE.PRICE)

[1] $403,572 $218,010 $952,311 $842,692 $815,288 $815,288 3318 Levels: $0 $1 $10 $100 $1,000 $10,000 $100,000 $1,000,000 ... $999,999

Переводим цены в числовой формат:

bk$SALE.PRICE.N <- as.numeric(gsub("[^[:digit:]]","", bk$SALE.PRICE))# убираем все кроме цифр, т.е. заменяем все кроме цифр на “”

В данных часто бывает, что какие-то данные отсутствуют. В этом случае там стоит специальное значение NA. Это часто мешает производить вычисления.

x<-c(1,2,3,NA,3,4)
mean(x)

Но можно указать, что значения NA нужно убрать прежде чем производить вычисления

mean(x, na.rm=TRUE)

Или убрать предварительно NA из выборки

mean(na.omit(x))

На самом деле "na.omit" возвращает специальный объект

x<-na.omit(x)
print(x)

Но его всегда можно снова превратить в вектор

x<-as.vector(x)
print(x)

Смотрим, для скольки объектов у нас нет данных про цены

count(is.na(bk$SALE.PRICE.N))# можно вместо count сделать sum

Сделаем все имена столбцов маленькими буквами

names(bk) <- tolower(names(bk))

Приведем в порядок площади

head(bk$gross.square.feet)
bk$gross.sqft <- as.numeric(gsub("[^[:digit:]]","", bk$gross.square.feet))
head(bk$land.square.feet)
bk$land.sqft <- as.numeric(gsub("[^[:digit:]]","", bk$land.square.feet))

Приведем в порядок даты

bk$sale.date <- as.Date(bk$sale.date)
bk$year.built <- as.numeric(as.character(bk$year.built))

Надоело писать длинные имена? Работаем с одной таблицей? Нет проблем!

attach(bk)#теперь по-умолчанию работаем только с bk
hist(sale.price.n)#обращаемся прямо по имени поля
hist(sale.price.n[sale.price.n>0])
hist(gross.sqft[sale.price.n==0])
detach(bk)#закончили работать, открепляемся!

Теперь беглый анализ, как устроены данные

bk.sale <- bk[bk$sale.price.n!=0,]
plot(bk.sale$gross.sqft,bk.sale$sale.price.n)

“Вынем” данные из нуля

plot(log(bk.sale$gross.sqft),log(bk.sale$sale.price.n))

Выберем для анализа только дома (категория содержит в названии “FAMILY”)

bk.homes <- bk.sale[which(grepl("FAMILY", bk.sale$building.class.category)),]
plot(log(bk.homes$gross.sqft),log(bk.homes$sale.price.n))

Уберем “особенные” дома

bk.homes$outliers <- (log(bk.homes$sale.price.n) <=5) + 0
bk.homes <- bk.homes[which(bk.homes$outliers==0),]
plot(log(bk.homes$gross.sqft),log(bk.homes$sale.price.n))