{"metadata":{"kernelspec":{"name":"ir","display_name":"R","language":"R"},"language_info":{"name":"R","codemirror_mode":"r","pygments_lexer":"r","mimetype":"text/x-r-source","file_extension":".r","version":"4.0.5"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":" # 1. Data Preparation\n    ","metadata":{}},{"cell_type":"markdown","source":"# a. Data Set","metadata":{}},{"cell_type":"code","source":"train.data= read.csv('../input/house-prices-advanced-regression-techniques/train.csv')\ntest.data= read.csv('../input/house-prices-advanced-regression-techniques/test.csv')\n\nsummary(train.data)\n","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:44.446305Z","iopub.execute_input":"2022-07-26T05:53:44.451775Z","iopub.status.idle":"2022-07-26T05:53:44.663702Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# (i) Combine train and test \nTo easier cleaning the data, instead of clean them one by one","metadata":{}},{"cell_type":"code","source":"train_test <- rbind(train.data[,-which(colnames(train.data) == 'SalePrice')], test.data)\ntrain_test <- train_test[,-which(colnames(train_test) == 'Id')] #id\nsummary(train_test)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:44.683789Z","iopub.execute_input":"2022-07-26T05:53:44.688907Z","iopub.status.idle":"2022-07-26T05:53:44.777822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"diag(cor(train_test[, unlist(lapply(train_test, is.numeric))]) )","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:44.784354Z","iopub.execute_input":"2022-07-26T05:53:44.789360Z","iopub.status.idle":"2022-07-26T05:53:44.828297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"This means all the numerical attributes are strongly correlated, therefore we use all the numerical attributes","metadata":{}},{"cell_type":"markdown","source":"# b. Cleaning \n# (i) Handling NA in numerical data","metadata":{}},{"cell_type":"code","source":"idx <- which(unlist(lapply(train_test, is.numeric)))\ndrop.col <- c()\nreplace.row <- c()\nk1 <- 1\nk2 <- 1\nfor (i in idx)\n    {\n    count.na <- sum(is.na(train_test[,i])) / length(train_test[,i]) * 100\n    if(count.na > 5)\n        {\n        drop.col[k1] <- i\n        k1 <- k1 + 1\n    }\n    \n    else if(count.na <= 5 && count.na > 0)\n        {\n        replace.row[k2] <- i\n        k2 <- k2 + 1\n    }\n}\ndrop.col\nreplace.row","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:44.834641Z","iopub.execute_input":"2022-07-26T05:53:44.840945Z","iopub.status.idle":"2022-07-26T05:53:44.924564Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for (i in replace.row)\n    {\n    for(k in 1:nrow(train_test))\n        {\n        if(is.na(train_test[k,i]) )\n        {\n            train_test[k,i] <- mean(train_test[,i], na.rm = TRUE)\n            }\n    }\n    \n}","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:44.931527Z","iopub.execute_input":"2022-07-26T05:53:44.937137Z","iopub.status.idle":"2022-07-26T05:53:45.591875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_test <- train_test[,-drop.col]","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:45.595945Z","iopub.execute_input":"2022-07-26T05:53:45.598517Z","iopub.status.idle":"2022-07-26T05:53:45.617373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"summary(train_test)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:45.621231Z","iopub.execute_input":"2022-07-26T05:53:45.623555Z","iopub.status.idle":"2022-07-26T05:53:45.686203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Now, there is no NA in numerical data \n# (ii) Handling NA categorical data \nFirst, change to factor","metadata":{}},{"cell_type":"code","source":"#to get the index\n\nidx <- which(unlist(lapply(train_test, is.character)))\nfor(i in idx)\n    {\n    train_test[,i] <- factor(train_test[,i])\n}\n\nsummary(train_test)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:45.690629Z","iopub.execute_input":"2022-07-26T05:53:45.693425Z","iopub.status.idle":"2022-07-26T05:53:45.797816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"BsmtQual, BsmtCond, BsmtExposure, BsmtFinType1, BsmtFinType2: 24 or 25 NAs, Electrical(1), are the columns with considerably few NAs so we are going to impute these rows. For Alley, MasVnrType, FireplaceQu, PoolQC, Fence, MiscFeature if the percentage of missing values are more than 5% we shall drop the column.","metadata":{}},{"cell_type":"code","source":"drop.col <- c()\nreplace.row <- c()\nk1 <- 1\nk2 <- 1\nfor (i in idx)\n    {\n    count.na <- sum(is.na(train_test[,i])) / length(train_test[,i]) * 100\n    if(count.na > 5)\n        {\n        drop.col[k1] <- i\n        k1 <- k1 + 1\n    }\n    \n    else if(count.na <= 5 && count.na > 0)\n        {\n        replace.row[k2] <- i\n        k2 <- k2 + 1\n    }\n}\ndrop.col\nreplace.row","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:45.802059Z","iopub.execute_input":"2022-07-26T05:53:45.804764Z","iopub.status.idle":"2022-07-26T05:53:45.881278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for (i in replace.row)\n    {\n    for(k in 1:nrow(train_test))\n        {\n        if(is.na(train_test[k,i]) )\n        {\n            train_test[k,i] <- train_test[which.max(table(train_test[,i])),i]\n            }\n    }\n    \n}","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:45.885686Z","iopub.execute_input":"2022-07-26T05:53:45.888433Z","iopub.status.idle":"2022-07-26T05:53:47.249370Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_test <- train_test[,-drop.col]","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:47.254421Z","iopub.execute_input":"2022-07-26T05:53:47.256143Z","iopub.status.idle":"2022-07-26T05:53:47.277536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"summary(train_test)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:47.281534Z","iopub.execute_input":"2022-07-26T05:53:47.283777Z","iopub.status.idle":"2022-07-26T05:53:47.336492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"There is no NA, the categorical data is clean now.\n","metadata":{}},{"cell_type":"markdown","source":"# c. Feature Selection\nDrop the columns that have small variance. Based on the above summary, it can be easily seen the below columns have small variance. The proof is:","metadata":{}},{"cell_type":"code","source":"barplot(table(train_test$Utilities))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:47.339961Z","iopub.execute_input":"2022-07-26T05:53:47.341498Z","iopub.status.idle":"2022-07-26T05:53:47.408090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"barplot(table(train_test$BsmtFinSF2))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:47.411633Z","iopub.execute_input":"2022-07-26T05:53:47.413268Z","iopub.status.idle":"2022-07-26T05:53:47.487260Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"barplot(table(train_test$LowQualFinSF))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:47.490813Z","iopub.execute_input":"2022-07-26T05:53:47.492366Z","iopub.status.idle":"2022-07-26T05:53:47.586028Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"barplot(table(train_test$EnclosedPorch))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:47.590274Z","iopub.execute_input":"2022-07-26T05:53:47.592891Z","iopub.status.idle":"2022-07-26T05:53:47.697355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"barplot(table(train_test$X3SsnPorch))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:47.701627Z","iopub.execute_input":"2022-07-26T05:53:47.704269Z","iopub.status.idle":"2022-07-26T05:53:47.809205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"barplot(table(train_test$ScreenPorch))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:47.813087Z","iopub.execute_input":"2022-07-26T05:53:47.815770Z","iopub.status.idle":"2022-07-26T05:53:47.944009Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"barplot(table(train_test$PoolArea))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:47.947622Z","iopub.execute_input":"2022-07-26T05:53:47.949749Z","iopub.status.idle":"2022-07-26T05:53:48.050044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"barplot(table(train_test$MiscVal))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:48.053843Z","iopub.execute_input":"2022-07-26T05:53:48.056183Z","iopub.status.idle":"2022-07-26T05:53:48.164329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Drop these columns\ncols <- c(which(colnames(train_test) == 'Utilities'),which(colnames(train_test) == 'BsmtFinSF2'),which(colnames(train_test) == 'LowQualFinSF'),\n         which(colnames(train_test) == 'EnclosedPorch'), which(colnames(train_test) == 'X3SsnPorch'), which(colnames(train_test) == 'ScreenPorch'),\n         which(colnames(train_test) == 'PoolArea'), which(colnames(train_test) == 'MiscVal'))\n                                                          \ntrain_test <- train_test[,-cols]\nsummary(train_test)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:48.168189Z","iopub.execute_input":"2022-07-26T05:53:48.170488Z","iopub.status.idle":"2022-07-26T05:53:48.237215Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# d. Change Categorical to dummy column","metadata":{}},{"cell_type":"code","source":"library(mltools)\nlibrary(data.table)\n#dum <- matrix[,nrow = nrow(train_test), ncol = ncol()]\ntrain_test <- one_hot(as.data.table(train_test))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:48.241338Z","iopub.execute_input":"2022-07-26T05:53:48.244022Z","iopub.status.idle":"2022-07-26T05:53:48.819700Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Change the column names that have unsupported character\nlibrary(janitor)\nnames(train_test)[names(train_test) == 'MSZoning_C (all)'] <- 'MSZoning_C'\nnames(train_test)[names(train_test) == 'RoofMatl_Tar&Grv'] <- 'RoofMatl_TarGrv'\n#clear space and lowercase\nnames(train_test) <- make_clean_names(names(train_test))\nsummary(train_test)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:48.823755Z","iopub.execute_input":"2022-07-26T05:53:48.826270Z","iopub.status.idle":"2022-07-26T05:53:49.356780Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. Algorithm","metadata":{}},{"cell_type":"code","source":"train.x <- train_test[1:nrow(train.data),]\ntest.x <- train_test[(nrow(train.data)+1) : nrow(train_test),]","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:49.361216Z","iopub.execute_input":"2022-07-26T05:53:49.363951Z","iopub.status.idle":"2022-07-26T05:53:49.391275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.x$SalePrice <- train.data$SalePrice","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:49.395092Z","iopub.execute_input":"2022-07-26T05:53:49.397397Z","iopub.status.idle":"2022-07-26T05:53:49.416419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Random Forest\nlibrary(tidyverse)\nlibrary(caret)\nlibrary(randomForest)\n\nset.seed(123)\n\nrf <- randomForest(SalePrice ~ ., data = train.x, mtry = ncol(train.x) - 1,importance = T)\ntest.rf <- predict(rf, test.x)\n","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:53:49.420397Z","iopub.execute_input":"2022-07-26T05:53:49.422834Z","iopub.status.idle":"2022-07-26T05:55:10.384866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"library(xgboost)\n# Fit the model on the training set\nset.seed(124)\ngb <- train(SalePrice ~ ., data = train.x, method = \"xgbTree\",\n  trControl = trainControl(\"cv\", number = 10)\n  )\ntest.gb <- predict(gb, test.x)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:55:10.387219Z","iopub.execute_input":"2022-07-26T05:55:10.388549Z","iopub.status.idle":"2022-07-26T05:57:45.154551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rmse(test.rf,train.x$SalePrice)\nrmse(test.gb,train.x$SalePrice)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T05:57:45.158401Z","iopub.execute_input":"2022-07-26T05:57:45.160324Z","iopub.status.idle":"2022-07-26T05:57:45.183780Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Random Forest has lower rmse, so we choose its prediction of SalePrice ","metadata":{}},{"cell_type":"code","source":"out <- tibble(test.data$Id,test.rf)\ncolnames(out)<- c(\"Id\",\"SalePrice\")\nwrite.csv(out,\"submission.csv\",row.names = FALSE)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:01:50.747802Z","iopub.execute_input":"2022-07-26T06:01:50.752580Z","iopub.status.idle":"2022-07-26T06:01:50.812319Z"},"trusted":true},"execution_count":null,"outputs":[]}]}