Importing libraries

library(ggplot2)
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.3.3
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin

Importing Dataset

df<-read.csv("C:/Users/ONKAR/OneDrive/Desktop/SEM-4/Projects/Data Science/dataset.csv")
head(df,5)

Spliting Dataset into train and test Dataset

set.seed(123)
data_split_index <-sample(2,nrow(df),replace = TRUE,prob<-c(0.8,0.2))
train_dataset<-df[data_split_index==1,]
test_demo<-df[data_split_index==2,]
target<-as.factor(test_demo[,12])
test_dataset<-df[data_split_index==2,-12]

Converting train data to factor

train_dataset$age<-as.factor(train_dataset$age)
train_dataset$deep_conversations<-as.factor(train_dataset$deep_conversations)
train_dataset$role_father<-as.factor(train_dataset$role_father)
train_dataset$advice_from_father<-as.factor(train_dataset$advice_from_father)
train_dataset$improve_relationship<-as.factor(train_dataset$improve_relationship)
train_dataset$relationship_in_future<-as.factor(train_dataset$relationship_in_future)
train_dataset$relationship_with_father <- as.factor(train_dataset$relationship_with_father)
train_dataset$gender <- as.factor(train_dataset$gender)
train_dataset$native_place <- as.factor(train_dataset$native_place)
train_dataset$quality_time <- as.factor(train_dataset$quality_time)
train_dataset$qualification_of_father <- as.factor(train_dataset$qualification_of_father)
train_dataset$sharing_emotions <- as.factor(train_dataset$sharing_emotions)
train_dataset$deep_conversations <- as.factor(train_dataset$deep_conversations)

Converting Test data to factor

test_dataset$age <- as.factor(test_dataset$age)
test_dataset$deep_conversations <- as.factor(test_dataset$deep_conversations)
test_dataset$role_father <- as.factor(test_dataset$role_father)
test_dataset$advice_from_father <- as.factor(test_dataset$advice_from_father)
test_dataset$improve_relationship <- as.factor(test_dataset$improve_relationship)
test_dataset$relationship_in_future <- as.factor(test_dataset$relationship_in_future)
test_dataset$gender <- as.factor(test_dataset$gender)
test_dataset$native_place <- as.factor(test_dataset$native_place)
test_dataset$quality_time <- as.factor(test_dataset$quality_time)
test_dataset$qualification_of_father <- as.factor(test_dataset$qualification_of_father)
test_dataset$sharing_emotions <- as.factor(test_dataset$sharing_emotions)
test_dataset$deep_conversations <- as.factor(test_dataset$deep_conversations)

Training Model

random_forest<-randomForest(relationship_with_father~.,data=train_dataset)
print(random_forest)
## 
## Call:
##  randomForest(formula = relationship_with_father ~ ., data = train_dataset) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 3
## 
##         OOB estimate of  error rate: 39.56%
## Confusion matrix:
##            Close Neutral Very close class.error
## Close        115      23         36   0.3390805
## Neutral       41      44         11   0.5416667
## Very close    44       6         87   0.3649635

Updating levels of train and test data to be equal

test_dataset$age <- factor(test_dataset$age, levels = levels(train_dataset$age))
test_dataset$deep_conversations <- factor(test_dataset$deep_conversations, levels = levels(train_dataset$deep_conversations))
test_dataset$role_father <- factor(test_dataset$role_father, levels = levels(train_dataset$role_father))
test_dataset$advice_from_father <- factor(test_dataset$advice_from_father, levels = levels(train_dataset$advice_from_father))
test_dataset$improve_relationship <- factor(test_dataset$improve_relationship, levels = levels(train_dataset$improve_relationship))
test_dataset$relationship_in_future <- factor(test_dataset$relationship_in_future, levels = levels(train_dataset$relationship_in_future))
test_dataset$gender <- factor(test_dataset$gender, levels = levels(train_dataset$gender))
test_dataset$native_place <- factor(test_dataset$native_place, levels = levels(train_dataset$native_place))
test_dataset$quality_time <- factor(test_dataset$quality_time, levels = levels(train_dataset$quality_time))
test_dataset$qualification_of_father <- factor(test_dataset$qualification_of_father, levels = levels(train_dataset$qualification_of_father))
test_dataset$sharing_emotions <- factor(test_dataset$sharing_emotions, levels = levels(train_dataset$sharing_emotions))

Prediction for test dataset

prediction_on_testdata <- predict(random_forest, newdata = test_dataset)
prediction_on_testdata
##          4          5          8         11         16         20         21 
##      Close      Close      Close    Neutral      Close    Neutral      Close 
##         24         31         32         50         59         65         67 
## Very close    Neutral      Close      Close      Close Very close      Close 
##         68         87         88         89        104        106        107 
##      Close    Neutral      Close      Close      Close      Close      Close 
##        111        114        118        126        132        137        139 
##    Neutral Very close      Close Very close      Close      Close      Close 
##        145        151        173        179        181        189        190 
##      Close      Close Very close      Close      Close      Close      Close 
##        193        195        202        206        219        220        222 
##    Neutral Very close      Close Very close      Close Very close    Neutral 
##        230        238        240        248       <NA>       <NA>        261 
##    Neutral      Close      Close    Neutral       <NA>       <NA> Very close 
##        262        264        271        277        294        296        297 
##      Close      Close      Close Very close Very close Very close Very close 
##        316        317        320        321        327        330        334 
##      Close    Neutral      Close      Close Very close      Close      Close 
##        340        347        352        356        360        363        373 
##      Close    Neutral    Neutral      Close      Close    Neutral      Close 
##        376        380        386        391        400        401        403 
##      Close    Neutral Very close      Close      Close      Close Very close 
##        412        417        425        430        431        434        445 
##    Neutral    Neutral Very close      Close Very close      Close      Close 
##        456        457        461        470        472        482        485 
## Very close      Close    Neutral Very close      Close      Close    Neutral 
##        490        491        496 
##    Neutral      Close Very close 
## Levels: Close Neutral Very close
library(lattice)
library(caret)
## Warning: package 'caret' was built under R version 4.3.3

Confusion matrix

rf_confusion_matrix<-confusionMatrix(prediction_on_testdata,target)
rf_confusion_matrix
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   Close Neutral Very close
##   Close         25      13         14
##   Neutral        7      11          1
##   Very close     3       0         18
## 
## Overall Statistics
##                                           
##                Accuracy : 0.587           
##                  95% CI : (0.4795, 0.6887)
##     No Information Rate : 0.3804          
##     P-Value [Acc > NIR] : 4.765e-05       
##                                           
##                   Kappa : 0.3638          
##                                           
##  Mcnemar's Test P-Value : 0.01928         
## 
## Statistics by Class:
## 
##                      Class: Close Class: Neutral Class: Very close
## Sensitivity                0.7143         0.4583            0.5455
## Specificity                0.5263         0.8824            0.9492
## Pos Pred Value             0.4808         0.5789            0.8571
## Neg Pred Value             0.7500         0.8219            0.7887
## Prevalence                 0.3804         0.2609            0.3587
## Detection Rate             0.2717         0.1196            0.1957
## Detection Prevalence       0.5652         0.2065            0.2283
## Balanced Accuracy          0.6203         0.6703            0.7473

Accuracy

accuracy<-rf_confusion_matrix$overall["Accuracy"]*100
cat("Accuracy of model is ",accuracy," %")
## Accuracy of model is  58.69565  %

Creating sample Data frame for prediction

data_vector <- data.frame( 
  gender = as.factor("Male"),
  age = as.factor(20),
  native_place = as.factor("City"),
  quality_time = as.factor("Regularly"),
  qualification_of_father = as.factor("Graduate"),
  sharing_emotions = as.factor("Yes"),
  deep_conversations = as.factor("Regularly"),
  role_father = as.factor("Consultant (offering advice)"),
  advice_from_father = as.factor("Regularly"),
  improve_relationship = as.factor("Yes"),
  relationship_in_future = as.factor("More open communication and honesty")
)
data_vector$age <- factor(data_vector$age, levels = levels(train_dataset$age))
data_vector$deep_conversations <- factor(data_vector$deep_conversations, levels = levels(train_dataset$deep_conversations))
data_vector$role_father <- factor(data_vector$role_father, levels = levels(train_dataset$role_father))
data_vector$advice_from_father <- factor(data_vector$advice_from_father, levels = levels(train_dataset$advice_from_father))
data_vector$improve_relationship <- factor(data_vector$improve_relationship, levels = levels(train_dataset$improve_relationship))
data_vector$relationship_in_future <- factor(data_vector$relationship_in_future, levels = levels(train_dataset$relationship_in_future))
data_vector$gender <- factor(data_vector$gender, levels = levels(train_dataset$gender))
data_vector$native_place <- factor(data_vector$native_place, levels = levels(train_dataset$native_place))
data_vector$quality_time <- factor(data_vector$quality_time, levels = levels(train_dataset$quality_time))
data_vector$qualification_of_father <- factor(data_vector$qualification_of_father, levels = levels(train_dataset$qualification_of_father))
data_vector$sharing_emotions <- factor(data_vector$sharing_emotions, levels = levels(train_dataset$sharing_emotions))

Prediction of sample dataframe

predictions <- predict(random_forest, newdata = data_vector)
predictions
##          1 
## Very close 
## Levels: Close Neutral Very close