Q.1 Use the given data (“exampleData.rData”) to do the following:

load("exampleData.rData")
head(custdata)
head(hhdata)
head(medianincome)

A. Finding and handling missing values:

a. Determine all the missing values in the data (find the # of missing values if any for each attribute). Show the results clearly indicating the missing values.

Finding the missing values by column for custdata

a <- data.frame(colSums(is.na(custdata)))
colnames(a)[colnames(a) == 'colSums.is.na.custdata..'] <- 'num of NAs by column'
a

Here, we can see that housing.type, recent.move and num.vehicles all have 56 missing values

Finding the missing values by column for hhdata

colSums(is.na(hhdata))
household_id      cust_id       income           gp 
           0            0            0            0 

Finding the missing values by column for medianincome

colSums(is.na(medianincome))
        State Median.Income 
            0             0 

b. Three variables/features are all missing exactly 56 values suggests that it’s the same 56 customers in each case. Because the missing data represents a fairly small fraction of the dataset, it’s probably safe just to drop these customers from your analysis. Drop these 56 customers from the data set. Show the results.

We know that housing.type, recent.move and num.vehicles all have 56 missing values

cleaned <- custdata[!is.na(custdata$recent.move),]
colSums(is.na(cleaned))
    state.of.res           custid              sex      is.employed           income     marital.stat       health.ins     housing.type 
               0                0                0              280                0                0                0                0 
     recent.move     num.vehicles              age is.employed.fix1   age.normalized    Median.Income      income.norm               gp 
               0                0                0                0                0                0                0                0 
   income.lt.30K        age.range           Income 
               0                0              309 

From above we can see that housing.type, recent.move and num.vehicles all have 0 missing values.

c.Use the original data and find out how many values are missing in the “is.employed” and replace the NAs with “missing”. This transformation will turn the variable type to string. You can change it back with the as.factor() function. (Create a new column named “is.employed.fixed”.

sum(is.na(cleaned$is.employed))
[1] 280

There are 280 missing values in the is.employed column

Creating a new column is_employed.fix

cleaned$is_employed.fix <- cleaned$is.employed
cleaned$is_employed.fix[is.na(cleaned$is.employed)]<- "missing"
cleaned[c("is.employed","is_employed.fix")]

From the above, we can see that we created a new column is_employed.fix from is.employed where we replaced all the missing values with “missing”

d. Find out the # of missing values in “income” and replace the missing values by zeroes. (create a new column called Income.fix.zeroes).

sum(is.na(cleaned$Income))
[1] 309
cleaned$Income.fix.zeroes <- cleaned$Income
cleaned$Income.fix.zeroes[is.na(cleaned$Income)]<- 0
cleaned[c("Income","Income.fix.zeroes")]

d.2 Find out the # of missing values in “income” and replace the missing values by the mean value of the income. (create a new column called Income.fix.mean).

sum(is.na(cleaned$Income))
[1] 309
cleaned$Income.fix.mean <- cleaned$Income
cleaned$Income.fix.mean[is.na(cleaned$Income)]<- mean(cleaned$income)
cleaned[c("Income","Income.fix.mean")]

Data Transformations:

a. Use the “medianincome” dataframe and merge this with the “custdata” dataframe on the “state.of.res” feature in “custdata” and “State” feature in “Median.Income”.

new_df <- merge(medianincome, custdata, by.medianincome = "State", by.custdata = "state.of.res")
new_df

b. use the summary() method to summarize 3 features from the dataframe created in a. “state.of.res”, “income” and ‘Median.Income”.

summary(new_df$state.of.res)
       Alabama         Alaska        Arizona       Arkansas     California       Colorado    Connecticut       Delaware        Florida 
            12              2             12             13            114             10             18              4             31 
       Georgia         Hawaii          Idaho       Illinois        Indiana           Iowa         Kansas       Kentucky      Louisiana 
            26              2              3             52             27              9              6             13             17 
         Maine       Maryland  Massachusetts       Michigan      Minnesota    Mississippi       Missouri        Montana       Nebraska 
            10             15             30             43             18             16             23              3              6 
        Nevada  New Hampshire     New Jersey     New Mexico       New York North Carolina   North Dakota           Ohio       Oklahoma 
             4              7             40              4             94             25              3             59              7 
        Oregon   Pennsylvania   Rhode Island South Carolina   South Dakota      Tennessee          Texas           Utah        Vermont 
             8             63              2             16              1             16             51              5              1 
      Virginia     Washington  West Virginia      Wisconsin        Wyoming 
            22             11              7             15              4 
summary(new_df$income)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  -8700   14600   35000   53505   67000  615000 
summary(new_df$Median.Income)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  37427   44819   50118   50919   55534   68187 

c. Normalize the “income” by “Median.Income” and create a new column “income.normed” and display it using summary() method.

Using the min max normalization function Min Max Function Formula

new_df$income.normed <- (new_df$income - min(new_df$Median.Income)) / (max(new_df$Median.Income) - min(new_df$Median.Income))
new_df[c("income","income.normed")]
summary(new_df$income.normed)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-1.4996 -0.7421 -0.0789  0.5227  0.9614 18.7768 

d. Convert the income feature to categorical with anyone having <20K income as TRUE and otherwise FALSE.

new_df$Income.lessthan.20K[new_df$income < 20000]<- "TRUE"
new_df$Income.lessthan.20K[new_df$income >= 20000]<- "FALSE"
new_df[c("income","Income.lessthan.20K")]

e. Convert the “age” into range with the following breaks 0, 25, 65 and Inf.

#This is already given to us
summary(new_df$age.range)
  [0,25]  (25,65] (65,Inf] 
      56      732      212 
new_df$Age_Range[new_df$age <= 25]<- "[0,25]"
new_df$Age_Range[new_df$age > 25 & new_df$age <= 65 ]<- "(25,65]"
new_df$Age_Range[new_df$age > 65]<- "(65,inf]"
new_df[c("age","Age_Range")]
LS0tCnRpdGxlOiAiTGFiIDIgLSBEYXRhIFByZXByb2Nlc3NpbmciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClEuMSBVc2UgdGhlIGdpdmVuIGRhdGEgKOKAnGV4YW1wbGVEYXRhLnJEYXRh4oCdKSB0byBkbyB0aGUgZm9sbG93aW5nOgoKYGBge3J9CmxvYWQoImV4YW1wbGVEYXRhLnJEYXRhIikKYGBgCgpgYGB7cn0KaGVhZChjdXN0ZGF0YSkKaGVhZChoaGRhdGEpCmhlYWQobWVkaWFuaW5jb21lKQpgYGAKCgojIyMgQS4gRmluZGluZyBhbmQgaGFuZGxpbmcgbWlzc2luZyB2YWx1ZXM6CgoqKmEuIERldGVybWluZSBhbGwgdGhlIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBkYXRhIChmaW5kIHRoZSAjIG9mIG1pc3NpbmcgdmFsdWVzIGlmIGFueSBmb3IgZWFjaCBhdHRyaWJ1dGUpLiBTaG93IHRoZSByZXN1bHRzIGNsZWFybHkgaW5kaWNhdGluZyB0aGUgbWlzc2luZyB2YWx1ZXMuKioKCkZpbmRpbmcgdGhlIG1pc3NpbmcgdmFsdWVzIGJ5IGNvbHVtbiBmb3IgY3VzdGRhdGEgCgpgYGB7cn0KYSA8LSBkYXRhLmZyYW1lKGNvbFN1bXMoaXMubmEoY3VzdGRhdGEpKSkKY29sbmFtZXMoYSlbY29sbmFtZXMoYSkgPT0gJ2NvbFN1bXMuaXMubmEuY3VzdGRhdGEuLiddIDwtICdudW0gb2YgTkFzIGJ5IGNvbHVtbicKYQpgYGAKSGVyZSwgd2UgY2FuIHNlZSB0aGF0IGhvdXNpbmcudHlwZSwgcmVjZW50Lm1vdmUgYW5kIG51bS52ZWhpY2xlcyBhbGwgaGF2ZSA1NiBtaXNzaW5nIHZhbHVlcwoKRmluZGluZyB0aGUgbWlzc2luZyB2YWx1ZXMgYnkgY29sdW1uIGZvciBoaGRhdGEgCmBgYHtyfQpjb2xTdW1zKGlzLm5hKGhoZGF0YSkpCmBgYApGaW5kaW5nIHRoZSBtaXNzaW5nIHZhbHVlcyBieSBjb2x1bW4gZm9yIG1lZGlhbmluY29tZSAKYGBge3J9CmNvbFN1bXMoaXMubmEobWVkaWFuaW5jb21lKSkKYGBgCioqYi4gVGhyZWUgdmFyaWFibGVzL2ZlYXR1cmVzIGFyZSBhbGwgbWlzc2luZyBleGFjdGx5IDU2IHZhbHVlcyBzdWdnZXN0cyB0aGF0IGl04oCZcyB0aGUgc2FtZSA1NiBjdXN0b21lcnMgaW4gZWFjaCBjYXNlLiBCZWNhdXNlIHRoZSBtaXNzaW5nIGRhdGEgcmVwcmVzZW50cyBhIGZhaXJseSBzbWFsbCBmcmFjdGlvbiBvZiB0aGUgZGF0YXNldCwgaXTigJlzIHByb2JhYmx5IHNhZmUganVzdCB0byBkcm9wIHRoZXNlIGN1c3RvbWVycyBmcm9tIHlvdXIgYW5hbHlzaXMuIERyb3AgdGhlc2UgNTYgY3VzdG9tZXJzIGZyb20gdGhlIGRhdGEgc2V0LiBTaG93IHRoZSByZXN1bHRzLioqCgpXZSBrbm93IHRoYXQgaG91c2luZy50eXBlLCByZWNlbnQubW92ZSBhbmQgbnVtLnZlaGljbGVzIGFsbCBoYXZlIDU2IG1pc3NpbmcgdmFsdWVzCmBgYHtyfQpjbGVhbmVkIDwtIGN1c3RkYXRhWyFpcy5uYShjdXN0ZGF0YSRyZWNlbnQubW92ZSksXSAjIFRoaXMgcmVtb3ZlZCBhbGwgbWlzc2luZyB2YWx1ZXMgZnJvbSB0aGUgcmVjZW50Lm1vdmUgY29sdW1uCmBgYAoKYGBge3J9CmNvbFN1bXMoaXMubmEoY2xlYW5lZCkpCmBgYAoKRnJvbSBhYm92ZSB3ZSBjYW4gc2VlIHRoYXQgaG91c2luZy50eXBlLCByZWNlbnQubW92ZSBhbmQgbnVtLnZlaGljbGVzIGFsbCBoYXZlIDAgbWlzc2luZyB2YWx1ZXMuCgoqKmMuVXNlIHRoZSBvcmlnaW5hbCBkYXRhIGFuZCBmaW5kIG91dCBob3cgbWFueSB2YWx1ZXMgYXJlIG1pc3NpbmcgaW4gdGhlIOKAnGlzLmVtcGxveWVk4oCdIGFuZCByZXBsYWNlIHRoZSBOQXMgd2l0aCDigJxtaXNzaW5n4oCdLiBUaGlzIHRyYW5zZm9ybWF0aW9uIHdpbGwgdHVybiB0aGUgdmFyaWFibGUgdHlwZSB0byBzdHJpbmcuIFlvdSBjYW4gY2hhbmdlIGl0IGJhY2sgd2l0aCB0aGUgYXMuZmFjdG9yKCkgZnVuY3Rpb24uIChDcmVhdGUgYSBuZXcgY29sdW1uIG5hbWVkIOKAnGlzLmVtcGxveWVkLmZpeGVk4oCdLioqCgpgYGB7cn0Kc3VtKGlzLm5hKGNsZWFuZWQkaXMuZW1wbG95ZWQpKQpgYGAKVGhlcmUgYXJlIDI4MCBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgaXMuZW1wbG95ZWQgY29sdW1uCgpDcmVhdGluZyBhIG5ldyBjb2x1bW4gaXNfZW1wbG95ZWQuZml4CgpgYGB7cn0KY2xlYW5lZCRpc19lbXBsb3llZC5maXggPC0gY2xlYW5lZCRpcy5lbXBsb3llZApjbGVhbmVkJGlzX2VtcGxveWVkLmZpeFtpcy5uYShjbGVhbmVkJGlzLmVtcGxveWVkKV08LSAibWlzc2luZyIKY2xlYW5lZFtjKCJpcy5lbXBsb3llZCIsImlzX2VtcGxveWVkLmZpeCIpXQpgYGAKRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiBzZWUgdGhhdCB3ZSBjcmVhdGVkIGEgbmV3IGNvbHVtbiBpc19lbXBsb3llZC5maXggZnJvbSBpcy5lbXBsb3llZCB3aGVyZSB3ZSByZXBsYWNlZCBhbGwgdGhlIG1pc3NpbmcgdmFsdWVzIHdpdGggIm1pc3NpbmciCgoqKmQuIEZpbmQgb3V0IHRoZSAjIG9mIG1pc3NpbmcgdmFsdWVzIGluIOKAnGluY29tZeKAnSBhbmQgcmVwbGFjZSB0aGUgbWlzc2luZyB2YWx1ZXMgYnkgemVyb2VzLiAoY3JlYXRlIGEgbmV3IGNvbHVtbiBjYWxsZWQgSW5jb21lLmZpeC56ZXJvZXMpLioqCgpgYGB7cn0Kc3VtKGlzLm5hKGNsZWFuZWQkSW5jb21lKSkKYGBgCgoKYGBge3J9CmNsZWFuZWQkSW5jb21lLmZpeC56ZXJvZXMgPC0gY2xlYW5lZCRJbmNvbWUKY2xlYW5lZCRJbmNvbWUuZml4Lnplcm9lc1tpcy5uYShjbGVhbmVkJEluY29tZSldPC0gMApjbGVhbmVkW2MoIkluY29tZSIsIkluY29tZS5maXguemVyb2VzIildCmBgYAoKKipkLjIgRmluZCBvdXQgdGhlICMgb2YgbWlzc2luZyB2YWx1ZXMgaW4g4oCcaW5jb21l4oCdIGFuZCByZXBsYWNlIHRoZSBtaXNzaW5nIHZhbHVlcyBieSB0aGUgbWVhbiB2YWx1ZSBvZiB0aGUgaW5jb21lLiAoY3JlYXRlIGEgbmV3IGNvbHVtbiBjYWxsZWQgSW5jb21lLmZpeC5tZWFuKS4qKgoKYGBge3J9CnN1bShpcy5uYShjbGVhbmVkJEluY29tZSkpCmBgYAoKYGBge3J9CmNsZWFuZWQkSW5jb21lLmZpeC5tZWFuIDwtIGNsZWFuZWQkSW5jb21lCmNsZWFuZWQkSW5jb21lLmZpeC5tZWFuW2lzLm5hKGNsZWFuZWQkSW5jb21lKV08LSBtZWFuKGNsZWFuZWQkaW5jb21lKQpjbGVhbmVkW2MoIkluY29tZSIsIkluY29tZS5maXgubWVhbiIpXQpgYGAKCiMjIyBEYXRhIFRyYW5zZm9ybWF0aW9uczoKCioqYS4gVXNlIHRoZSDigJxtZWRpYW5pbmNvbWXigJ0gZGF0YWZyYW1lIGFuZCBtZXJnZSB0aGlzIHdpdGggdGhlIOKAnGN1c3RkYXRh4oCdIGRhdGFmcmFtZSBvbiB0aGUg4oCcc3RhdGUub2YucmVz4oCdIGZlYXR1cmUgaW4g4oCcY3VzdGRhdGHigJ0gYW5kIOKAnFN0YXRl4oCdIGZlYXR1cmUgaW4g4oCcTWVkaWFuLkluY29tZeKAnS4qKgoKYGBge3J9Cm5ld19kZiA8LSBtZXJnZShtZWRpYW5pbmNvbWUsIGN1c3RkYXRhLCBieS5tZWRpYW5pbmNvbWUgPSAiU3RhdGUiLCBieS5jdXN0ZGF0YSA9ICJzdGF0ZS5vZi5yZXMiKQpuZXdfZGYKYGBgCioqYi4gdXNlIHRoZSBzdW1tYXJ5KCkgbWV0aG9kIHRvIHN1bW1hcml6ZSAzIGZlYXR1cmVzIGZyb20gdGhlIGRhdGFmcmFtZSBjcmVhdGVkIGluIGEuIOKAnHN0YXRlLm9mLnJlc+KAnSwg4oCcaW5jb21l4oCdIGFuZCDigJhNZWRpYW4uSW5jb21l4oCdLioqCgpgYGB7cn0Kc3VtbWFyeShuZXdfZGYkc3RhdGUub2YucmVzKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG5ld19kZiRpbmNvbWUpCmBgYAoKYGBge3J9CnN1bW1hcnkobmV3X2RmJE1lZGlhbi5JbmNvbWUpCmBgYAoKKipjLiBOb3JtYWxpemUgdGhlIOKAnGluY29tZeKAnSBieSDigJxNZWRpYW4uSW5jb21l4oCdIGFuZCBjcmVhdGUgYSBuZXcgY29sdW1uIOKAnGluY29tZS5ub3JtZWTigJ0gYW5kIGRpc3BsYXkgaXQgdXNpbmcgc3VtbWFyeSgpIG1ldGhvZC4qKgoKVXNpbmcgdGhlIG1pbiBtYXggbm9ybWFsaXphdGlvbiBmdW5jdGlvbgohW01pbiBNYXggRnVuY3Rpb24gRm9ybXVsYV0oTWluX01heF9GdW5jdGlvbi5wbmcpCgpgYGB7cn0KbmV3X2RmJGluY29tZS5ub3JtZWQgPC0gKG5ld19kZiRpbmNvbWUgLSBtaW4obmV3X2RmJE1lZGlhbi5JbmNvbWUpKSAvIChtYXgobmV3X2RmJE1lZGlhbi5JbmNvbWUpIC0gbWluKG5ld19kZiRNZWRpYW4uSW5jb21lKSkKbmV3X2RmW2MoImluY29tZSIsImluY29tZS5ub3JtZWQiKV0KYGBgCmBgYHtyfQpzdW1tYXJ5KG5ld19kZiRpbmNvbWUubm9ybWVkKQpgYGAKCioqZC4gQ29udmVydCB0aGUgaW5jb21lIGZlYXR1cmUgdG8gY2F0ZWdvcmljYWwgd2l0aCBhbnlvbmUgaGF2aW5nIDwyMEsgaW5jb21lIGFzIFRSVUUgYW5kIG90aGVyd2lzZSBGQUxTRS4qKgoKYGBge3J9Cm5ld19kZiRJbmNvbWUubGVzc3RoYW4uMjBLW25ld19kZiRpbmNvbWUgPCAyMDAwMF08LSAiVFJVRSIKbmV3X2RmJEluY29tZS5sZXNzdGhhbi4yMEtbbmV3X2RmJGluY29tZSA+PSAyMDAwMF08LSAiRkFMU0UiCm5ld19kZltjKCJpbmNvbWUiLCJJbmNvbWUubGVzc3RoYW4uMjBLIildCmBgYAoqKmUuIENvbnZlcnQgdGhlIOKAnGFnZeKAnSBpbnRvIHJhbmdlIHdpdGggdGhlIGZvbGxvd2luZyBicmVha3MgMCwgMjUsIDY1IGFuZCBJbmYuKioKCmBgYHtyfQojVGhpcyBpcyBhbHJlYWR5IGdpdmVuIHRvIHVzCnN1bW1hcnkobmV3X2RmJGFnZS5yYW5nZSkKYGBgCgpgYGB7cn0KbmV3X2RmJEFnZV9SYW5nZVtuZXdfZGYkYWdlIDw9IDI1XTwtICJbMCwyNV0iCm5ld19kZiRBZ2VfUmFuZ2VbbmV3X2RmJGFnZSA+IDI1ICYgbmV3X2RmJGFnZSA8PSA2NSBdPC0gIigyNSw2NV0iCm5ld19kZiRBZ2VfUmFuZ2VbbmV3X2RmJGFnZSA+IDY1XTwtICIoNjUsaW5mXSIKbmV3X2RmW2MoImFnZSIsIkFnZV9SYW5nZSIpXQpgYGAKCgo=