df<-read.csv('../Desktop/datascienceforbusiness-master/heights_weights.csv')

Definición del problema.

Crear un modelo de regresión con el objetivo de predecir el peso del individiuo,el datset cuenta con los sigientes atributos:

-Weight que hace referencía al peso que está en libras.

-Height hace alusión a la altura que está en pulgadas.

-Male que representa el sexo del indiviuo.

summary(df)
     Height          Weight           Male    
 Min.   :54.26   Min.   : 64.7   Min.   :0.0  
 1st Qu.:63.51   1st Qu.:135.8   1st Qu.:0.0  
 Median :66.32   Median :161.2   Median :0.5  
 Mean   :66.37   Mean   :161.4   Mean   :0.5  
 3rd Qu.:69.17   3rd Qu.:187.2   3rd Qu.:1.0  
 Max.   :79.00   Max.   :270.0   Max.   :1.0  
head(df)
dim(df)
[1] 10000     3

La base de datos cuenta con un total de 10000 observaciones y un número de variables de 3.

library(DataExplorer)
library(ggplot2)
plot_histogram(df)

La altura sigue una distibución normal casi en forma de campana donde puede tener una altura minima de 55 pulgadas que es equivalente en metros 1.39 a priori piede parecer una altura muy chica pero hay que tener en cuenta la edad de la persona algo que en este datset carece de información lo cual sospecho que sea de un infante.

df$Male<-factor(df$Male,levels = c(0,1),labels = c('Female','Male'))
ggplot(df,aes(y=Male,fill=Male)) + geom_bar() +
  ggtitle('Number of men and women')

Hay la misma cantidad de hombres y mujeres con un total de 5000 de cada sexo dando un total de 10000 observaciones.

df[df$Height==max(df$Height) | df$Height==min(df$Height),]
ggplot(df,aes(x=Male,y=Height,fill=Male)) + geom_boxplot() +
  ggtitle('Distribution of the height respect to sex') +
  labs(fill='Sex') + theme(legend.position = 'top')

df[df$Weight==max(df$Weight) | df$Weight==min(df$Weight),]
NA
ggplot(df,aes(x=Male,y=Weight,fill=Male)) + geom_boxplot() +
  ggtitle('Distribution of the weight respect to sex') +
  labs(fill='Sex') + theme(legend.position = 'top')

Se puede observar tanto en la gráfica como en el resultados los hombres tienen características fisiológicas mayores que la de los hombres, ya que hormonalmente son distintos.

ggplot(df,aes(x=Height,y=Weight,color=Male)) + geom_point(alpha=0.8) +
  geom_smooth(method='lm',col='red') + facet_grid(Male~.) + 
  ggtitle('Height to weight ratio') + theme(legend.position = 'top')
`geom_smooth()` using formula 'y ~ x'

Se pueden apreciar que ambas variables están altamente correlacionadas y siguen una tendencia lineal independientemente del sexo, algo que no es de extrañar ya que la fórmula matemática del indice de masa corporal (imc) es la relación del peso con la altura.

plot_correlation(df,title = 'Correlation Matrix')

Se pueden observar que todas las variables están altamente correlacionadas por lo cual van a tener un impacto significativo, y son coherentes ya que el sexo influye en la altura y el peso de las personas.

splits<-split(df,df$Male)
female<-splits[[1]]
male<-splits[[2]]

Creamos dos grupos con el objetivo de tratar de una manera más efectiva los valores atípicos.

impute_ut<-function(x){
  
  lower_limit<-mean(x)-1.5*sd(x)
  upper_limit<-median(x)+1.5*sd(x)
  
  
  x[x<lower_limit]<-mean(x)
  x[x>upper_limit]<-median(x)
  
  return(x)
  
}

Si el valor para la altura y el peso son exagerademente altos o bajos los va a remplazar por una medida de tendencia central.

female$Height<-impute_ut(female$Height)
female$Weight<-impute_ut(female$Weight)
male$Height<-impute_ut(male$Height)
male$Weight<-impute_ut(male$Weight)
new_df<-rbind(female,male)
ggplot(new_df,aes(x=Male,y=Height,fill=Male)) + geom_boxplot() +
  ggtitle('Distribution of the height respect to sex') +
  labs(fill='Sex') + theme(legend.position = 'top')

NA
NA
NA
ggplot(new_df,aes(x=Male,y=Weight,fill=Male)) + geom_boxplot() +
  ggtitle('Distribution of the weight respect to sex ') +
  labs(fill='Sex') + theme(legend.position = 'top')

Se pueden observar en la gráfica de caja y bigote que ya carecen valores atípicos y lo mejor de todo sin perder datos.

new_df$Height<-scale(new_df$Height)

Rescalamos las variables predictores continuas con el fin de trabajr en una escala similar.

library(caret)
set.seed(2018)

traning.ids<-createDataPartition(new_df$Weight,p=0.8,list=F)

train<-new_df[traning.ids,]
test<-new_df[-traning.ids,]

Separamos nuestros datos de entrenamiento y validación haciendo uso de la librería caret

Procedemos con la creación de nuestro modelo de regresión.

lm<-lm(Weight~.,data=train)
summary(lm)

Call:
lm(formula = Weight ~ ., data = train)

Residuals:
     Min       1Q   Median       3Q      Max 
-29.5279  -6.7834  -0.0203   6.7736  29.7488 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 148.0806     0.2295  645.11   <2e-16 ***
Height       14.7926     0.1986   74.49   <2e-16 ***
MaleMale     26.9196     0.3965   67.90   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.34 on 7997 degrees of freedom
Multiple R-squared:  0.871, Adjusted R-squared:  0.871 
F-statistic: 2.7e+04 on 2 and 7997 DF,  p-value: < 2.2e-16

Se puede observar que tenemos un alto R2 ajustado por lo cual se acopla muy bien con los datos de entrenamiento y no hay mucha diferencia respecto a los valores originales.

Ahora veamos como se comporta con nuestros datos de validación.

y_pred<-predict(lm,newdata = test)
R2(test$Weight,y_pred)
[1] 0.8694438

Tiene un muy bien R2 ajustado con los datos de validación por lo cual dicho modelo nos puede ayudar a la hora de predecir nuevos datos.

test['predictions']<-y_pred
head(test[,c('Weight','predictions')])
Height<-c(70,65,72,64)
Male<-c('Male','Male','Female','Female')

new_data<-data.frame(Height,Male)
new_data$Height<-scale(new_data$Height)
predict(lm,newdata = new_data)
       1        2        3        4 
183.6180 164.4675 164.3585 133.7177 

Mido 1.80 que es el equivalente a 70 pulgadas y medio una predición de 183 libras que es equivalente a 80 kg algo muy cercano a lo que peso en la realidad que son 82 kg.

LS0tDQp0aXRsZTogIlByZWRlY2lyIGVsIHBlc28gZGUgbGFzIHBlcnNvbmFzLiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KZGY8LXJlYWQuY3N2KCcuLi9EZXNrdG9wL2RhdGFzY2llbmNlZm9yYnVzaW5lc3MtbWFzdGVyL2hlaWdodHNfd2VpZ2h0cy5jc3YnKQ0KYGBgDQoNCg0KRGVmaW5pY2nDs24gZGVsIHByb2JsZW1hLg0KDQpDcmVhciB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBjb24gZWwgb2JqZXRpdm8gZGUgcHJlZGVjaXIgZWwgcGVzbyBkZWwgaW5kaXZpZGl1byxlbCBkYXRzZXQNCmN1ZW50YSBjb24gbG9zIHNpZ2llbnRlcyBhdHJpYnV0b3M6DQoNCi1XZWlnaHQgcXVlIGhhY2UgcmVmZXJlbmPDrWEgYWwgcGVzbyBxdWUgZXN0w6EgZW4gbGlicmFzLg0KDQotSGVpZ2h0IGhhY2UgYWx1c2nDs24gYSBsYSBhbHR1cmEgcXVlIGVzdMOhIGVuIHB1bGdhZGFzLg0KDQotTWFsZSBxdWUgcmVwcmVzZW50YSBlbCBzZXhvIGRlbCBpbmRpdml1by4NCg0KDQpgYGB7cn0NCnN1bW1hcnkoZGYpDQoNCmBgYA0KYGBge3J9DQpoZWFkKGRmKQ0KYGBgDQpgYGB7cn0NCmRpbShkZikNCmBgYA0KTGEgYmFzZSBkZSBkYXRvcyBjdWVudGEgY29uIHVuIHRvdGFsIGRlIDEwMDAwIG9ic2VydmFjaW9uZXMgeSB1biBuw7ptZXJvIGRlIHZhcmlhYmxlcyBkZSAzLg0KDQpgYGB7cn0NCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQpgYGB7cn0NCnBsb3RfaGlzdG9ncmFtKGRmKQ0KYGBgDQpMYSBhbHR1cmEgc2lndWUgdW5hIGRpc3RpYnVjacOzbiAgbm9ybWFsIGNhc2kgZW4gZm9ybWEgZGUgY2FtcGFuYSBkb25kZSBwdWVkZSB0ZW5lciB1bmEgYWx0dXJhIG1pbmltYSBkZSA1NSBwdWxnYWRhcyBxdWUgZXMgZXF1aXZhbGVudGUgZW4gbWV0cm9zIDEuMzkgYSBwcmlvcmkgcGllZGUgcGFyZWNlciB1bmEgYWx0dXJhIG11eSBjaGljYSBwZXJvIGhheSAgcXVlIHRlbmVyIGVuIGN1ZW50YSBsYSBlZGFkIGRlIGxhIHBlcnNvbmEgYWxnbyBxdWUgZW4gZXN0ZSBkYXRzZXQgY2FyZWNlIGRlIGluZm9ybWFjacOzbiBsbyBjdWFsIHNvc3BlY2hvIHF1ZSBzZWEgZGUgdW4gaW5mYW50ZS4NCmBgYHtyfQ0KZGYkTWFsZTwtZmFjdG9yKGRmJE1hbGUsbGV2ZWxzID0gYygwLDEpLGxhYmVscyA9IGMoJ0ZlbWFsZScsJ01hbGUnKSkNCmBgYA0KDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGYsYWVzKHk9TWFsZSxmaWxsPU1hbGUpKSArIGdlb21fYmFyKCkgKw0KICBnZ3RpdGxlKCdOdW1iZXIgb2YgbWVuIGFuZCB3b21lbicpDQpgYGANCkhheSBsYSBtaXNtYSBjYW50aWRhZCBkZSBob21icmVzIHkgbXVqZXJlcyBjb24gdW4gdG90YWwgZGUgNTAwMCBkZSBjYWRhIHNleG8gZGFuZG8gdW4gdG90YWwgZGUgMTAwMDANCm9ic2VydmFjaW9uZXMuDQpgYGB7cn0NCmRmW2RmJEhlaWdodD09bWF4KGRmJEhlaWdodCkgfCBkZiRIZWlnaHQ9PW1pbihkZiRIZWlnaHQpLF0NCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRmLGFlcyh4PU1hbGUseT1IZWlnaHQsZmlsbD1NYWxlKSkgKyBnZW9tX2JveHBsb3QoKSArDQogIGdndGl0bGUoJ0Rpc3RyaWJ1dGlvbiBvZiB0aGUgaGVpZ2h0IHJlc3BlY3QgdG8gc2V4JykgKw0KICBsYWJzKGZpbGw9J1NleCcpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ3RvcCcpDQpgYGANCmBgYHtyfQ0KZGZbZGYkV2VpZ2h0PT1tYXgoZGYkV2VpZ2h0KSB8IGRmJFdlaWdodD09bWluKGRmJFdlaWdodCksXQ0KDQpgYGANCmBgYHtyfQ0KZ2dwbG90KGRmLGFlcyh4PU1hbGUseT1XZWlnaHQsZmlsbD1NYWxlKSkgKyBnZW9tX2JveHBsb3QoKSArDQogIGdndGl0bGUoJ0Rpc3RyaWJ1dGlvbiBvZiB0aGUgd2VpZ2h0IHJlc3BlY3QgdG8gc2V4JykgKw0KICBsYWJzKGZpbGw9J1NleCcpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ3RvcCcpDQpgYGANClNlIHB1ZWRlIG9ic2VydmFyIHRhbnRvIGVuIGxhIGdyw6FmaWNhIGNvbW8gZW4gZWwgcmVzdWx0YWRvcyBsb3MgaG9tYnJlcyB0aWVuZW4gY2FyYWN0ZXLDrXN0aWNhcyBmaXNpb2zDs2dpY2FzDQptYXlvcmVzIHF1ZSBsYSBkZSBsb3MgaG9tYnJlcywgeWEgcXVlIGhvcm1vbmFsbWVudGUgc29uIGRpc3RpbnRvcy4NCg0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRmLGFlcyh4PUhlaWdodCx5PVdlaWdodCxjb2xvcj1NYWxlKSkgKyBnZW9tX3BvaW50KGFscGhhPTAuOCkgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJyxjb2w9J3JlZCcpICsgZmFjZXRfZ3JpZChNYWxlfi4pICsgDQogIGdndGl0bGUoJ0hlaWdodCB0byB3ZWlnaHQgcmF0aW8nKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICd0b3AnKQ0KYGBgDQpTZSBwdWVkZW4gYXByZWNpYXIgcXVlIGFtYmFzIHZhcmlhYmxlcyBlc3TDoW4gYWx0YW1lbnRlIGNvcnJlbGFjaW9uYWRhcyB5IHNpZ3VlbiB1bmEgdGVuZGVuY2lhIGxpbmVhbCBpbmRlcGVuZGllbnRlbWVudGUgZGVsIHNleG8sIGFsZ28gcXVlIG5vIGVzIGRlIGV4dHJhw7FhciB5YSBxdWUgbGEgZsOzcm11bGEgbWF0ZW3DoXRpY2EgZGVsIGluZGljZSBkZSBtYXNhDQpjb3Jwb3JhbCAoaW1jKSBlcyBsYSByZWxhY2nDs24gZGVsIHBlc28gY29uIGxhIGFsdHVyYS4NCg0KDQoNCg0KYGBge3J9DQpwbG90X2NvcnJlbGF0aW9uKGRmLHRpdGxlID0gJ0NvcnJlbGF0aW9uIE1hdHJpeCcpDQpgYGANClNlIHB1ZWRlbiBvYnNlcnZhciBxdWUgdG9kYXMgbGFzIHZhcmlhYmxlcyBlc3TDoW4gYWx0YW1lbnRlIGNvcnJlbGFjaW9uYWRhcyBwb3IgbG8gY3VhbCB2YW4gYSB0ZW5lciB1biANCmltcGFjdG8gc2lnbmlmaWNhdGl2bywgeSBzb24gY29oZXJlbnRlcyB5YSBxdWUgZWwgc2V4byBpbmZsdXllIGVuIGxhIGFsdHVyYSB5IGVsIHBlc28gZGUgbGFzIHBlcnNvbmFzLg0KDQoNCg0KDQoNCmBgYHtyfQ0Kc3BsaXRzPC1zcGxpdChkZixkZiRNYWxlKQ0KYGBgDQoNCmBgYHtyfQ0KZmVtYWxlPC1zcGxpdHNbWzFdXQ0KbWFsZTwtc3BsaXRzW1syXV0NCmBgYA0KDQpDcmVhbW9zIGRvcyBncnVwb3MgY29uIGVsIG9iamV0aXZvIGRlIHRyYXRhciBkZSB1bmEgbWFuZXJhIG3DoXMgZWZlY3RpdmEgbG9zIHZhbG9yZXMgYXTDrXBpY29zLg0KDQoNCmBgYHtyfQ0KaW1wdXRlX3V0PC1mdW5jdGlvbih4KXsNCiAgDQogIGxvd2VyX2xpbWl0PC1tZWFuKHgpLTEuNSpzZCh4KQ0KICB1cHBlcl9saW1pdDwtbWVkaWFuKHgpKzEuNSpzZCh4KQ0KICANCiAgDQogIHhbeDxsb3dlcl9saW1pdF08LW1lYW4oeCkNCiAgeFt4PnVwcGVyX2xpbWl0XTwtbWVkaWFuKHgpDQogIA0KICByZXR1cm4oeCkNCiAgDQp9DQpgYGANCg0KU2kgZWwgdmFsb3IgcGFyYSBsYSBhbHR1cmEgeSBlbCBwZXNvIHNvbiBleGFnZXJhZGVtZW50ZSBhbHRvcyBvIGJham9zIGxvcyB2YSBhIHJlbXBsYXphciBwb3IgdW5hIG1lZGlkYQ0KZGUgdGVuZGVuY2lhIGNlbnRyYWwuDQoNCmBgYHtyfQ0KZmVtYWxlJEhlaWdodDwtaW1wdXRlX3V0KGZlbWFsZSRIZWlnaHQpDQpmZW1hbGUkV2VpZ2h0PC1pbXB1dGVfdXQoZmVtYWxlJFdlaWdodCkNCmBgYA0KDQpgYGB7cn0NCm1hbGUkSGVpZ2h0PC1pbXB1dGVfdXQobWFsZSRIZWlnaHQpDQptYWxlJFdlaWdodDwtaW1wdXRlX3V0KG1hbGUkV2VpZ2h0KQ0KYGBgDQoNCmBgYHtyfQ0KbmV3X2RmPC1yYmluZChmZW1hbGUsbWFsZSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChuZXdfZGYsYWVzKHg9TWFsZSx5PUhlaWdodCxmaWxsPU1hbGUpKSArIGdlb21fYm94cGxvdCgpICsNCiAgZ2d0aXRsZSgnRGlzdHJpYnV0aW9uIG9mIHRoZSBoZWlnaHQgcmVzcGVjdCB0byBzZXgnKSArDQogIGxhYnMoZmlsbD0nU2V4JykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAndG9wJykNCg0KDQoNCmBgYA0KYGBge3J9DQpnZ3Bsb3QobmV3X2RmLGFlcyh4PU1hbGUseT1XZWlnaHQsZmlsbD1NYWxlKSkgKyBnZW9tX2JveHBsb3QoKSArDQogIGdndGl0bGUoJ0Rpc3RyaWJ1dGlvbiBvZiB0aGUgd2VpZ2h0IHJlc3BlY3QgdG8gc2V4ICcpICsNCiAgbGFicyhmaWxsPSdTZXgnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICd0b3AnKQ0KYGBgDQpTZSBwdWVkZW4gb2JzZXJ2YXIgZW4gbGEgZ3LDoWZpY2EgZGUgY2FqYSB5IGJpZ290ZSBxdWUgeWEgY2FyZWNlbiB2YWxvcmVzIGF0w61waWNvcyB5IGxvIG1lam9yIGRlIHRvZG8gc2luIHBlcmRlciBkYXRvcy4NCg0KDQpgYGB7cn0NCm5ld19kZiRIZWlnaHQ8LXNjYWxlKG5ld19kZiRIZWlnaHQpDQpgYGANCg0KUmVzY2FsYW1vcyBsYXMgdmFyaWFibGVzIHByZWRpY3RvcmVzIGNvbnRpbnVhcyBjb24gZWwgZmluIGRlIHRyYWJhanIgZW4gdW5hIGVzY2FsYSBzaW1pbGFyLg0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGNhcmV0KQ0KYGBgDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMjAxOCkNCg0KdHJhbmluZy5pZHM8LWNyZWF0ZURhdGFQYXJ0aXRpb24obmV3X2RmJFdlaWdodCxwPTAuOCxsaXN0PUYpDQoNCnRyYWluPC1uZXdfZGZbdHJhbmluZy5pZHMsXQ0KdGVzdDwtbmV3X2RmWy10cmFuaW5nLmlkcyxdDQpgYGANCg0KDQpTZXBhcmFtb3MgbnVlc3Ryb3MgZGF0b3MgZGUgZW50cmVuYW1pZW50byB5IHZhbGlkYWNpw7NuIGhhY2llbmRvIHVzbyBkZSBsYSBsaWJyZXLDrWEgY2FyZXQNCg0KDQoNClByb2NlZGVtb3MgY29uIGxhIGNyZWFjacOzbiBkZSBudWVzdHJvIG1vZGVsbyBkZSByZWdyZXNpw7NuLg0KDQoNCg0KDQpgYGB7cn0NCmxtPC1sbShXZWlnaHR+LixkYXRhPXRyYWluKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShsbSkNCmBgYA0KU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIHRlbmVtb3MgdW4gYWx0byBSMiBhanVzdGFkbyBwb3IgbG8gY3VhbCBzZSBhY29wbGEgbXV5IGJpZW4gY29uIGxvcyBkYXRvcyBkZSBlbnRyZW5hbWllbnRvIHkgbm8gaGF5IG11Y2hhIGRpZmVyZW5jaWEgcmVzcGVjdG8gYSBsb3MgdmFsb3JlcyBvcmlnaW5hbGVzLg0KDQoNCkFob3JhIHZlYW1vcyBjb21vIHNlIGNvbXBvcnRhIGNvbiBudWVzdHJvcyBkYXRvcyBkZSB2YWxpZGFjacOzbi4NCg0KYGBge3J9DQp5X3ByZWQ8LXByZWRpY3QobG0sbmV3ZGF0YSA9IHRlc3QpDQpgYGANCg0KDQoNCmBgYHtyfQ0KUjIodGVzdCRXZWlnaHQseV9wcmVkKQ0KYGBgDQpUaWVuZSB1biBtdXkgYmllbiBSMiBhanVzdGFkbyBjb24gbG9zIGRhdG9zIGRlIHZhbGlkYWNpw7NuIHBvciBsbyBjdWFsIGRpY2hvIG1vZGVsbyBub3MgcHVlZGUgYXl1ZGFyIGEgbGEgaG9yYSBkZSBwcmVkZWNpciBudWV2b3MgZGF0b3MuDQoNCmBgYHtyfQ0KdGVzdFsncHJlZGljdGlvbnMnXTwteV9wcmVkDQpgYGANCg0KYGBge3J9DQpoZWFkKHRlc3RbLGMoJ1dlaWdodCcsJ3ByZWRpY3Rpb25zJyldKQ0KYGBgDQpgYGB7cn0NCkhlaWdodDwtYyg3MCw2NSw3Miw2NCkNCk1hbGU8LWMoJ01hbGUnLCdNYWxlJywnRmVtYWxlJywnRmVtYWxlJykNCg0KbmV3X2RhdGE8LWRhdGEuZnJhbWUoSGVpZ2h0LE1hbGUpDQoNCmBgYA0KDQpgYGB7cn0NCm5ld19kYXRhJEhlaWdodDwtc2NhbGUobmV3X2RhdGEkSGVpZ2h0KQ0KYGBgDQpgYGB7cn0NCnByZWRpY3QobG0sbmV3ZGF0YSA9IG5ld19kYXRhKQ0KYGBgDQpNaWRvIDEuODAgcXVlIGVzIGVsIGVxdWl2YWxlbnRlIGEgNzAgcHVsZ2FkYXMgeSBtZWRpbyB1bmEgcHJlZGljacOzbiBkZSAxODMgbGlicmFzIHF1ZSBlcyBlcXVpdmFsZW50ZQ0KYSA4MCBrZyBhbGdvIG11eSBjZXJjYW5vIGEgbG8gcXVlIHBlc28gZW4gbGEgcmVhbGlkYWQgcXVlIHNvbiA4MiBrZy4NCg==