pacotes <- c("PerformanceAnalytics", "readr")
lapply(pacotes, library, character.only = TRUE)
apts <- read_csv("teste_indicium_precificacao.csv")
## Rows: 48894 Columns: 16
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): nome, host_name, bairro_group, bairro, room_type
## dbl (10): id, host_id, latitude, longitude, price, minimo_noites, numero_de...
## date (1): ultima_review
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(apts, 5)
## # A tibble: 5 × 16
## id nome host_id host_name bairro_group bairro latitude longitude room_type
## <dbl> <chr> <dbl> <chr> <chr> <chr> <dbl> <dbl> <chr>
## 1 2595 Skyl… 2845 Jennifer Manhattan Midto… 40.8 -74.0 Entire h…
## 2 3647 THE … 4632 Elisabeth Manhattan Harlem 40.8 -73.9 Private …
## 3 3831 Cozy… 4869 LisaRoxa… Brooklyn Clint… 40.7 -74.0 Entire h…
## 4 5022 Enti… 7192 Laura Manhattan East … 40.8 -73.9 Entire h…
## 5 5099 Larg… 7322 Chris Manhattan Murra… 40.7 -74.0 Entire h…
## # ℹ 7 more variables: price <dbl>, minimo_noites <dbl>,
## # numero_de_reviews <dbl>, ultima_review <date>, reviews_por_mes <dbl>,
## # calculado_host_listings_count <dbl>, disponibilidade_365 <dbl>
Os dados originais precisam ser ajustados para que um modelo preditivo seja criado a partir deles. Para tal vou eliminar algumas variáveis e dummizar as variáveis categóricas que serão usadas no modelo.
Como o objetivo é prever o preço dos apartamentos, decidi eliminar as variáveis que não influenciam o preço.
Com base na minha compreensão do contexto real, deduzi que algumas variáveis, como o número de avaliações mensais (numero_de_reviews) e o nome do proprietário (host_name), entre outras, não têm relevância na determinação do preço. Portanto, decidi excluir essas variáveis do conjunto de dados.
Também optei por remover as variáveis “bairro_group”, “latitude” e “longitude” porque acredito que a maior parte das informações relevantes nessas variáveis já está capturada pela variável “bairro”. Além disso, quando tentei incluir todas essas variáveis no meu modelo preditivo, acredito que complexidades desnecessárias foram criadas, pois a capacidade preditiva do modelo foi afetada negativamente.
levels(factor(apts$bairro_group))
## [1] "Bronx" "Brooklyn" "Manhattan" "Queens"
## [5] "Staten Island"
levels(factor(apts$bairro))
## [1] "Allerton" "Arden Heights"
## [3] "Arrochar" "Arverne"
## [5] "Astoria" "Bath Beach"
## [7] "Battery Park City" "Bay Ridge"
## [9] "Bay Terrace" "Bay Terrace, Staten Island"
## [11] "Baychester" "Bayside"
## [13] "Bayswater" "Bedford-Stuyvesant"
## [15] "Belle Harbor" "Bellerose"
## [17] "Belmont" "Bensonhurst"
## [19] "Bergen Beach" "Boerum Hill"
## [21] "Borough Park" "Breezy Point"
## [23] "Briarwood" "Brighton Beach"
## [25] "Bronxdale" "Brooklyn Heights"
## [27] "Brownsville" "Bull's Head"
## [29] "Bushwick" "Cambria Heights"
## [31] "Canarsie" "Carroll Gardens"
## [33] "Castle Hill" "Castleton Corners"
## [35] "Chelsea" "Chinatown"
## [37] "City Island" "Civic Center"
## [39] "Claremont Village" "Clason Point"
## [41] "Clifton" "Clinton Hill"
## [43] "Co-op City" "Cobble Hill"
## [45] "College Point" "Columbia St"
## [47] "Concord" "Concourse"
## [49] "Concourse Village" "Coney Island"
## [51] "Corona" "Crown Heights"
## [53] "Cypress Hills" "Ditmars Steinway"
## [55] "Dongan Hills" "Douglaston"
## [57] "Downtown Brooklyn" "DUMBO"
## [59] "Dyker Heights" "East Elmhurst"
## [61] "East Flatbush" "East Harlem"
## [63] "East Morrisania" "East New York"
## [65] "East Village" "Eastchester"
## [67] "Edenwald" "Edgemere"
## [69] "Elmhurst" "Eltingville"
## [71] "Emerson Hill" "Far Rockaway"
## [73] "Fieldston" "Financial District"
## [75] "Flatbush" "Flatiron District"
## [77] "Flatlands" "Flushing"
## [79] "Fordham" "Forest Hills"
## [81] "Fort Greene" "Fort Hamilton"
## [83] "Fort Wadsworth" "Fresh Meadows"
## [85] "Glendale" "Gowanus"
## [87] "Gramercy" "Graniteville"
## [89] "Grant City" "Gravesend"
## [91] "Great Kills" "Greenpoint"
## [93] "Greenwich Village" "Grymes Hill"
## [95] "Harlem" "Hell's Kitchen"
## [97] "Highbridge" "Hollis"
## [99] "Holliswood" "Howard Beach"
## [101] "Howland Hook" "Huguenot"
## [103] "Hunts Point" "Inwood"
## [105] "Jackson Heights" "Jamaica"
## [107] "Jamaica Estates" "Jamaica Hills"
## [109] "Kensington" "Kew Gardens"
## [111] "Kew Gardens Hills" "Kingsbridge"
## [113] "Kips Bay" "Laurelton"
## [115] "Lighthouse Hill" "Little Italy"
## [117] "Little Neck" "Long Island City"
## [119] "Longwood" "Lower East Side"
## [121] "Manhattan Beach" "Marble Hill"
## [123] "Mariners Harbor" "Maspeth"
## [125] "Melrose" "Middle Village"
## [127] "Midland Beach" "Midtown"
## [129] "Midwood" "Mill Basin"
## [131] "Morningside Heights" "Morris Heights"
## [133] "Morris Park" "Morrisania"
## [135] "Mott Haven" "Mount Eden"
## [137] "Mount Hope" "Murray Hill"
## [139] "Navy Yard" "Neponsit"
## [141] "New Brighton" "New Dorp"
## [143] "New Dorp Beach" "New Springville"
## [145] "NoHo" "Nolita"
## [147] "North Riverdale" "Norwood"
## [149] "Oakwood" "Olinville"
## [151] "Ozone Park" "Park Slope"
## [153] "Parkchester" "Pelham Bay"
## [155] "Pelham Gardens" "Port Morris"
## [157] "Port Richmond" "Prince's Bay"
## [159] "Prospect-Lefferts Gardens" "Prospect Heights"
## [161] "Queens Village" "Randall Manor"
## [163] "Red Hook" "Rego Park"
## [165] "Richmond Hill" "Richmondtown"
## [167] "Ridgewood" "Riverdale"
## [169] "Rockaway Beach" "Roosevelt Island"
## [171] "Rosebank" "Rosedale"
## [173] "Rossville" "Schuylerville"
## [175] "Sea Gate" "Sheepshead Bay"
## [177] "Shore Acres" "Silver Lake"
## [179] "SoHo" "Soundview"
## [181] "South Beach" "South Ozone Park"
## [183] "South Slope" "Springfield Gardens"
## [185] "Spuyten Duyvil" "St. Albans"
## [187] "St. George" "Stapleton"
## [189] "Stuyvesant Town" "Sunnyside"
## [191] "Sunset Park" "Theater District"
## [193] "Throgs Neck" "Todt Hill"
## [195] "Tompkinsville" "Tottenville"
## [197] "Tremont" "Tribeca"
## [199] "Two Bridges" "Unionport"
## [201] "University Heights" "Upper East Side"
## [203] "Upper West Side" "Van Nest"
## [205] "Vinegar Hill" "Wakefield"
## [207] "Washington Heights" "West Brighton"
## [209] "West Farms" "West Village"
## [211] "Westchester Square" "Westerleigh"
## [213] "Whitestone" "Williamsbridge"
## [215] "Williamsburg" "Willowbrook"
## [217] "Windsor Terrace" "Woodhaven"
## [219] "Woodlawn" "Woodrow"
## [221] "Woodside"
levels(factor(apts$room_type))
## [1] "Entire home/apt" "Private room" "Shared room"
Tendo em mente que a variável “bairro” representa uma subdivisão da variável “bairro_group”, é natural que a variável “bairro” possua muitos mais niveis/categorias do que “bairro_group”. Consequentemente, como as duas variaveis estao relacionadas com a localização do imovel, os niveis da variável “bairro” devem possuir informaçoes mais profundas e especificas relacionadas a precificaçao do imovel. Esse motivo tende a tornar a variável “bairro_group” pouco útil para a previsão dos preços quando na presença da variável “bairro”.
table(apts$bairro_group)
##
## Bronx Brooklyn Manhattan Queens Staten Island
## 1091 20103 21661 5666 373
table(apts$room_type)
##
## Entire home/apt Private room Shared room
## 25409 22325 1160
A função ‘table’ nos permite ver que a maioria dos apartamentos estão localizados no distrito de Manhattan e são do tipo “Entire home/apt”.
variaveis_para_remover <- c("id", "nome", "host_id", "host_name", "bairro_group", "latitude", "longitude", "numero_de_reviews", "ultima_review", "reviews_por_mes", "calculado_host_listings_count")
apts_final <- apts[, -which(names(apts) %in% variaveis_para_remover)]
Com base nas justificativas apresentadas anteriormente, decidi remover as variáveis do dataset que não foram usadas no modelo preditivo para tornar as próximas análises mais eficientes.
summary(apts_final)
## bairro room_type price minimo_noites
## Length:48894 Length:48894 Min. : 0.0 Min. : 1.00
## Class :character Class :character 1st Qu.: 69.0 1st Qu.: 1.00
## Mode :character Mode :character Median : 106.0 Median : 3.00
## Mean : 152.7 Mean : 7.03
## 3rd Qu.: 175.0 3rd Qu.: 5.00
## Max. :10000.0 Max. :1250.00
## disponibilidade_365
## Min. : 0.0
## 1st Qu.: 0.0
## Median : 45.0
## Mean :112.8
## 3rd Qu.:227.0
## Max. :365.0
boxplot(apts_final$minimo_noites, main="Boxplot de minimo_noites", ylab="Valores")
boxplot(apts_final$price, main="Boxplot de price", ylab="Valores")
Ao analisarmos algumas estatísticas das variáveis numéricas, podemos reparar a presença de ouliers nas variáveis “minimo_noites” e “prices”. Para tentar obeter uma previsão mais precisa, os outliers que estejam acima dos quartis superiores nessas duas variáveis serão removidos do dataset.
chart.Correlation((apts_final[, c(3, 4, 5)]), histogram = TRUE)
A matriz de correlação nos permite observar que as variáveis “minimo_noites” e “disponibilidade_365” têm alguma correlação com a variável “price”. No entanto, essa correlação não é particularmente forte, sugerindo que a localização dos imóveis e o tipo de apartamento (room_type), provavelmente terão um papel mais significativo na previsão do preço pelo modelo.
Por último, como uma das questões do desafio pergunta se existe um padrão no nome dos lugares de mais alto valor, vou separar e analisar os maiores outliers da varável “price”.
# Calculando o IQR da variável
IQR <- IQR(apts$price)
# Calculando o limite superior para outliers
limite_superior_price <- quantile(apts$price, 0.99) + 1.5 * IQR
# Identificando os outliers
apts$outlier <- ifelse(apts$price > limite_superior_price, 1, 0)
outliers <- apts[apts$outlier == 1, ]
# Olhando a frequência dos outliers (alto valor)
table(outliers$bairro_group)
##
## Bronx Brooklyn Manhattan Queens Staten Island
## 2 76 236 13 3
Através dessa análise, podemos ver que a grande maioria dos imóveis de mais alto valor estão localizados no distrito de Manhattan.
A análise foi feita identificando como outliers os valores que excedem o limite superior, que é definido como o percentil 99 da variável “price” acrescido de 1,5 vezes o IQR.
Em suma, no conjunto de dados fornecido para o desafio, o número de imóveis de mais alto valor localizados em Manhattan supera em mais do que o dobro a soma dos imóveis de mais alto valor encontrados nos outros quatro distritos combinados.