Hola! Para este pequeño tutorial sobre Rmarkdown usaré un notebook de R. Los notebooks en Rmarkdown nos ayudan a combinar código y texto pero de forma interactiva, de manera tal que puedas mostrar (show) o esconder (hide) el código que se está utilizando para generar el reporte en html.

La sintaxis es igual que en un archivo .rmd como te darás cuenta a continuación. Por ejemplo, podemos crear encabezados de primer nivel, segundo nivel, etc; agregando un número determinado de #. Pero a medida que avance en el notebook, iré explicando sintaxis adicional sobre Rmarkdown. En el siguiente párrafo crearé un encabezado de primer nivel con un # para el título de la subsección.

Caso Data Banco: Tiempos de atención al cliente

Un Banco de la ciudad requiere mejorar los tiempos de atención al cliente en ventanilla, para ello ha recolectado esta información anónimamente para cada cajero y transacción realizada.

Entender la data

Para poder abordar el problema planteado por el Banco, es necesario entender nuestra matriz de datos.

Se sabe que una matriz de datos es aquella compuesta por elementos [i,j], es decir, la i-ésima fila con la j-ésima columna.

En este caso, cada fila representa a cada uno de los clientes que realizaron una transacción y cada columna corresponde a las variables medidas en dichos individuos.

Tipos de datos

Para realizar un análisis exploratorio de datos, es necesario saber con cuántas observaciones cuenta la data así como el número y tipo de variables medidas.

Para lo anterior debe importarse la data. Para diferenciar el nombre de la data, la pondré en este texto como cursiva. La sintaxis para volver cursiva una palabra es agregando un guión bajo al inicio y final de la palabra como aquí; o también usando asteriscos como en este ejemplo. Volviendo al caso de análisis, la data a usar será el objeto data_banco.

data_banco<-read.xlsx(xlsxFile = "Data/Data_Banco.xlsx", sheet = "Data")

Revisando los tipos de datos por columnas (variables), se tiene la función str:

str(data_banco)
'data.frame':   24299 obs. of  7 variables:
 $ Sucursal           : num  62 62 62 62 62 62 62 62 62 62 ...
 $ Cajero             : num  4820 4820 4820 4820 4820 4820 4820 4820 4820 4820 ...
 $ ID_Transaccion     : chr  "2" "2" "2" "2" ...
 $ Transaccion        : chr  "Cobro/Pago (Cta externa)" "Cobro/Pago (Cta externa)" "Cobro/Pago (Cta externa)" "Cobro/Pago (Cta externa)" ...
 $ Tiempo_Servicio_seg: num  311 156 248 99 123 172 140 247 183 91 ...
 $ Satisfaccion       : chr  "Muy Bueno" "Malo" "Regular" "Regular" ...
 $ Monto              : chr  "2889,3" "1670,69" "3172,49" "1764.92" ...

¿Por qué las variables Sucursal y Cajero, teniendo valores observados numéricos, son tipo caracter? Nota que esta pregunta la puse en negritas. La manera de poner un texto en negritas es poniendo al inicio y final un doble guión bajo, así como estoy poniendo esta oración. También puedes hacerlo usando doble asterisco al inicio y final.

Nota: Si las variables no están clasificadas en la naturaleza que le corresponde, es necesario someter a los datos a transformaciones.

Mejorando la base

Como se comentó en clases, hay muchas estructuras de datos. Recordemos cuáles son esas estructuras básicas, enumerándolas; para eso crearemos viñetas no ordenadas en esta subsección. Puedes crear el primer nivel con un “*“, el siguiente nivel con”-” y uno subsiguiente con “+”:

  • Vectores
    • Matrices
    • Dataframe
      • Listas
      • Array

Otra estructura importante de datos es tibble, que no es nada más que un dataframe mejorado. Para poder convertir un dataframe a tibble hay varios caminos, entre esos el usar la función tbl_df() como sigue:

#transformando de dataframe a tibble
data_banco<-tbl_df(data_banco)

Transformando los tipos de datos de data_banco

Recordarás que en clase hicimos en el script este ejercicio. Ahora lo haremos en este notebook poniéndolo dentro de un chunk

data_banco<-data_banco %>%
  mutate(Monto = str_replace(Monto, pattern = ",", replacement = ".")) %>%
  mutate(Sucursal = as.character(Sucursal),
         Cajero = as.character(Cajero),
         Satisfaccion = parse_factor(Satisfaccion,
                                     levels = c("Muy Malo", "Malo", "Regular", "Bueno", "Muy Bueno"),
                                     ordered = TRUE),
         Monto = parse_number(Monto,locale = locale(decimal_mark = ".")))

Análisis Exploratorio

Como es de interés saber qué sucede con el tiempo de servicio, se inicia checando cuál es el tiempo promedio de atención en segundos y su dispersión:

data_banco %>% 
  summarise( 
    MEDIA= mean(Tiempo_Servicio_seg, na.rm=TRUE), 
    VARIANZA= var(Tiempo_Servicio_seg, na.rm = TRUE),
    DESVEST = sqrt(VARIANZA)
  )%>%View()

Se desprende que el tiempo promedio de atención en segundos es de 155.58 segs. con una dispersión de 120 segs. Es decir que entre transacciones, el tiempo de atención varía mediantamente respecto al tiempo promedio.

Verificando lo anterior gráficamente se tiene:

ggplot(data = data_banco, aes(x= Tiempo_Servicio_seg)) + 
  geom_histogram( aes(y= ..count..),binwidth = 1 ) +
  labs(title= 'Histograma para Tiempo de Servicio (seg)', y= "Cantidad", x= "Tiempo")+geom_vline(aes(xintercept = mean(Tiempo_Servicio_seg)), color= "red")

Nótese que la distribución de la variable es asimétrica a la derecha; la recta roja representa la media del tiempo de servicio. Mediante ésta última se puede apreciar lo que ocurre con la dispersión.

¿Qué sucede con los tiempos de atención por transacción?

Explorando gráficamente el tiempo de servicio por transacción:

ggplot(data_banco, aes(x = Tiempo_Servicio_seg)) + 
  geom_histogram(aes(y = ..density.., fill= Transaccion), binwidth = 7,   
                 position = "identity", alpha= 0.4)

Se aprecia que la transacción que requiere más tiempo por parte de los clientes es la de Cobro/Pago. Los depósitos, al contrario, es la transacción que tiene menor tiempo de demora en la atención.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQphdXRob3I6ICJadWxlbW1hIEJhenVydG8iDQpkYXRlOiAnMjAyNC1BZ29zdG8nDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpIb2xhISBQYXJhIGVzdGUgcGVxdWXDsW8gdHV0b3JpYWwgc29icmUgUm1hcmtkb3duIHVzYXLDqSB1biBub3RlYm9vayBkZSBSLiBMb3Mgbm90ZWJvb2tzIGVuIFJtYXJrZG93biBub3MgYXl1ZGFuIGEgY29tYmluYXIgY8OzZGlnbyB5IHRleHRvIHBlcm8gZGUgZm9ybWEgaW50ZXJhY3RpdmEsIGRlIG1hbmVyYSB0YWwgcXVlIHB1ZWRhcyBtb3N0cmFyIChfX3Nob3dfXykgbyBlc2NvbmRlciAoX19oaWRlX18pIGVsIGPDs2RpZ28gcXVlIHNlIGVzdMOhIHV0aWxpemFuZG8gcGFyYSBnZW5lcmFyIGVsIHJlcG9ydGUgZW4gaHRtbC4NCg0KTGEgc2ludGF4aXMgZXMgaWd1YWwgcXVlIGVuIHVuIGFyY2hpdm8gLnJtZCBjb21vIHRlIGRhcsOhcyBjdWVudGEgIGEgY29udGludWFjacOzbi4gUG9yIGVqZW1wbG8sIHBvZGVtb3MgY3JlYXIgZW5jYWJlemFkb3MgZGUgcHJpbWVyIG5pdmVsLCBzZWd1bmRvIG5pdmVsLCBldGM7IGFncmVnYW5kbyB1biBuw7ptZXJvIGRldGVybWluYWRvIGRlICMuIFBlcm8gYSAgbWVkaWRhIHF1ZSBhdmFuY2UgZW4gZWwgbm90ZWJvb2ssIGlyw6kgZXhwbGljYW5kbyBzaW50YXhpcyBhZGljaW9uYWwgc29icmUgUm1hcmtkb3duLg0KRW4gZWwgc2lndWllbnRlIHDDoXJyYWZvIGNyZWFyw6kgdW4gZW5jYWJlemFkbyBkZSBwcmltZXIgbml2ZWwgY29uIHVuICMgcGFyYSBlbCB0w610dWxvIGRlIGxhIHN1YnNlY2Npw7NuLg0KDQojIENhc28gRGF0YSBCYW5jbzogVGllbXBvcyBkZSBhdGVuY2nDs24gYWwgY2xpZW50ZQ0KDQpVbiBCYW5jbyBkZSBsYSBjaXVkYWQgcmVxdWllcmUgbWVqb3JhciBsb3MgdGllbXBvcyBkZSBhdGVuY2nDs24gYWwgY2xpZW50ZSBlbiB2ZW50YW5pbGxhLCBwYXJhIGVsbG8gaGEgcmVjb2xlY3RhZG8gZXN0YSBpbmZvcm1hY2nDs24gYW7Ds25pbWFtZW50ZSBwYXJhIGNhZGEgY2FqZXJvIHkgdHJhbnNhY2Npw7NuIHJlYWxpemFkYS4NCg0KIyMgRW50ZW5kZXIgbGEgZGF0YQ0KUGFyYSBwb2RlciBhYm9yZGFyIGVsIHByb2JsZW1hIHBsYW50ZWFkbyBwb3IgZWwgQmFuY28sIGVzIG5lY2VzYXJpbyBlbnRlbmRlciBudWVzdHJhIG1hdHJpeiBkZSBkYXRvcy4NCg0KU2Ugc2FiZSBxdWUgdW5hIG1hdHJpeiBkZSBkYXRvcyBlcyBhcXVlbGxhIGNvbXB1ZXN0YSBwb3IgZWxlbWVudG9zIFtpLGpdLCBlcyBkZWNpciwgbGEgaS3DqXNpbWEgZmlsYSBjb24gbGEgai3DqXNpbWEgY29sdW1uYS4NCg0KRW4gZXN0ZSBjYXNvLCBjYWRhIGZpbGEgcmVwcmVzZW50YSBhIGNhZGEgdW5vIGRlIGxvcyBjbGllbnRlcyBxdWUgcmVhbGl6YXJvbiB1bmEgdHJhbnNhY2Npw7NuIHkgY2FkYSBjb2x1bW5hIGNvcnJlc3BvbmRlIGEgbGFzIHZhcmlhYmxlcyBtZWRpZGFzIGVuIGRpY2hvcyBpbmRpdmlkdW9zLg0KDQojIyMgVGlwb3MgZGUgZGF0b3MNClBhcmEgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBkYXRvcywgZXMgbmVjZXNhcmlvIHNhYmVyIGNvbiBjdcOhbnRhcyBvYnNlcnZhY2lvbmVzIGN1ZW50YSBsYSBkYXRhIGFzw60gY29tbyBlbCBuw7ptZXJvIHkgdGlwbyBkZSB2YXJpYWJsZXMgbWVkaWRhcy4NCg0KUGFyYSBsbyBhbnRlcmlvciBkZWJlIGltcG9ydGFyc2UgbGEgZGF0YS4gUGFyYSBkaWZlcmVuY2lhciBlbCBub21icmUgZGUgbGEgZGF0YSwgbGEgcG9uZHLDqSBlbiBlc3RlIHRleHRvIGNvbW8gY3Vyc2l2YS4gTGEgc2ludGF4aXMgcGFyYSB2b2x2ZXIgY3Vyc2l2YSB1bmEgcGFsYWJyYSBlcyBhZ3JlZ2FuZG8gdW4gZ3Vpw7NuIGJham8gYWwgaW5pY2lvIHkgZmluYWwgZGUgbGEgcGFsYWJyYSBjb21vIF9hcXXDrV87IG8gdGFtYmnDqW4gdXNhbmRvIGFzdGVyaXNjb3MgY29tbyAqZW4gZXN0ZSBlamVtcGxvKi4NClZvbHZpZW5kbyBhbCBjYXNvIGRlIGFuw6FsaXNpcywgbGEgZGF0YSBhIHVzYXIgc2Vyw6EgZWwgb2JqZXRvICpkYXRhX2JhbmNvKi4NCg0KYGBge3J9DQojSW1wb3J0YW5kbyBsYSBkYXRhDQpkYXRhX2JhbmNvPC1yZWFkLnhsc3goeGxzeEZpbGUgPSAiRGF0YS9EYXRhX0JhbmNvLnhsc3giLCBzaGVldCA9ICJEYXRhIikNCmBgYA0KDQoNClJldmlzYW5kbyBsb3MgdGlwb3MgZGUgZGF0b3MgcG9yIGNvbHVtbmFzICh2YXJpYWJsZXMpLCBzZSB0aWVuZSBsYSBmdW5jacOzbiBfc3RyXzoNCg0KYGBge3J9DQpzdHIoZGF0YV9iYW5jbykNCmBgYA0KDQoqKsK/UG9yIHF1w6kgbGFzIHZhcmlhYmxlcyBTdWN1cnNhbCB5IENhamVybywgdGVuaWVuZG8gdmFsb3JlcyBvYnNlcnZhZG9zIG51bcOpcmljb3MsIHNvbiB0aXBvIGNhcmFjdGVyPyoqIE5vdGEgcXVlIGVzdGEgcHJlZ3VudGEgbGEgcHVzZSBlbiBuZWdyaXRhcy4gTGEgbWFuZXJhIGRlIHBvbmVyIHVuIHRleHRvIGVuIG5lZ3JpdGFzIGVzIHBvbmllbmRvIGFsIGluaWNpbyB5IGZpbmFsIHVuIGRvYmxlIGd1acOzbiBiYWpvLCBfX2Fzw60gY29tbyBlc3RveSBwb25pZW5kbyBlc3RhIG9yYWNpw7NuX18uIFRhbWJpw6luIHB1ZWRlcyBoYWNlcmxvIHVzYW5kbyBkb2JsZSBhc3RlcmlzY28gKiphbCBpbmljaW8geSBmaW5hbCoqLg0KDQoqTm90YTogU2kgbGFzIHZhcmlhYmxlcyBubyBlc3TDoW4gY2xhc2lmaWNhZGFzIGVuIGxhIG5hdHVyYWxlemEgcXVlIGxlIGNvcnJlc3BvbmRlLCBlcyBuZWNlc2FyaW8gc29tZXRlciBhIGxvcyBkYXRvcyBhIHRyYW5zZm9ybWFjaW9uZXMuKg0KDQoNCiMjIyBNZWpvcmFuZG8gbGEgYmFzZQ0KQ29tbyBzZSBjb21lbnTDsyBlbiBjbGFzZXMsIGhheSBtdWNoYXMgZXN0cnVjdHVyYXMgZGUgZGF0b3MuIFJlY29yZGVtb3MgY3XDoWxlcyBzb24gZXNhcyBlc3RydWN0dXJhcyBiw6FzaWNhcywgZW51bWVyw6FuZG9sYXM7IHBhcmEgZXNvIGNyZWFyZW1vcyB2acOxZXRhcyBubyBvcmRlbmFkYXMgZW4gZXN0YSBzdWJzZWNjacOzbi4gUHVlZGVzIGNyZWFyIGVsIHByaW1lciBuaXZlbCBjb24gdW4gIioiLCBlbCBzaWd1aWVudGUgbml2ZWwgY29uICItIiB5IHVubyBzdWJzaWd1aWVudGUgY29uICIrIjoNCg0KKiBWZWN0b3Jlcw0KICAtIE1hdHJpY2VzDQogIC0gRGF0YWZyYW1lDQogICAgKyBMaXN0YXMNCiAgICArIEFycmF5DQogICAgDQpPdHJhIGVzdHJ1Y3R1cmEgaW1wb3J0YW50ZSBkZSBkYXRvcyBlcyBfdGliYmxlXywgcXVlIG5vIGVzIG5hZGEgbcOhcyBxdWUgdW4gZGF0YWZyYW1lIG1lam9yYWRvLg0KUGFyYSBwb2RlciBjb252ZXJ0aXIgdW4gZGF0YWZyYW1lIGEgdGliYmxlIGhheSB2YXJpb3MgY2FtaW5vcywgZW50cmUgZXNvcyBlbCB1c2FyIGxhIGZ1bmNpw7NuIF90YmxfZGYoKV8gY29tbyBzaWd1ZToNCg0KYGBge3J9DQojdHJhbnNmb3JtYW5kbyBkZSBkYXRhZnJhbWUgYSB0aWJibGUNCmRhdGFfYmFuY288LXRibF9kZihkYXRhX2JhbmNvKQ0KYGBgDQoNCiMjIFRyYW5zZm9ybWFuZG8gbG9zIHRpcG9zIGRlIGRhdG9zIGRlIF9kYXRhX2JhbmNvXw0KDQpSZWNvcmRhcsOhcyBxdWUgZW4gY2xhc2UgaGljaW1vcyBlbiBlbCBzY3JpcHQgZXN0ZSBlamVyY2ljaW8uIEFob3JhIGxvIGhhcmVtb3MgZW4gZXN0ZSBub3RlYm9vayBwb25pw6luZG9sbyBkZW50cm8gZGUgdW4gY2h1bmsNCg0KYGBge3J9DQpkYXRhX2JhbmNvPC1kYXRhX2JhbmNvICU+JQ0KICBtdXRhdGUoTW9udG8gPSBzdHJfcmVwbGFjZShNb250bywgcGF0dGVybiA9ICIsIiwgcmVwbGFjZW1lbnQgPSAiLiIpKSAlPiUNCiAgbXV0YXRlKFN1Y3Vyc2FsID0gYXMuY2hhcmFjdGVyKFN1Y3Vyc2FsKSwNCiAgICAgICAgIENhamVybyA9IGFzLmNoYXJhY3RlcihDYWplcm8pLA0KICAgICAgICAgU2F0aXNmYWNjaW9uID0gcGFyc2VfZmFjdG9yKFNhdGlzZmFjY2lvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJNdXkgTWFsbyIsICJNYWxvIiwgIlJlZ3VsYXIiLCAiQnVlbm8iLCAiTXV5IEJ1ZW5vIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFRSVUUpLA0KICAgICAgICAgTW9udG8gPSBwYXJzZV9udW1iZXIoTW9udG8sbG9jYWxlID0gbG9jYWxlKGRlY2ltYWxfbWFyayA9ICIuIikpKQ0KYGBgDQoNCiMgQW7DoWxpc2lzIEV4cGxvcmF0b3Jpbw0KQ29tbyBlcyBkZSBpbnRlcsOpcyBzYWJlciBxdcOpIHN1Y2VkZSBjb24gZWwgdGllbXBvIGRlIHNlcnZpY2lvLCBzZSBpbmljaWEgY2hlY2FuZG8gY3XDoWwgZXMgZWwgdGllbXBvIHByb21lZGlvIGRlIGF0ZW5jacOzbiBlbiBzZWd1bmRvcyB5IHN1IGRpc3BlcnNpw7NuOg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGFfYmFuY28gJT4lIA0KICBzdW1tYXJpc2UoIA0KICAgIE1FRElBPSBtZWFuKFRpZW1wb19TZXJ2aWNpb19zZWcsIG5hLnJtPVRSVUUpLCANCiAgICBWQVJJQU5aQT0gdmFyKFRpZW1wb19TZXJ2aWNpb19zZWcsIG5hLnJtID0gVFJVRSksDQogICAgREVTVkVTVCA9IHNxcnQoVkFSSUFOWkEpDQogICklPiVWaWV3KCkNCmBgYA0KDQpTZSBkZXNwcmVuZGUgcXVlIGVsIHRpZW1wbyBwcm9tZWRpbyBkZSBhdGVuY2nDs24gZW4gc2VndW5kb3MgZXMgZGUgMTU1LjU4IHNlZ3MuIGNvbiB1bmEgZGlzcGVyc2nDs24gZGUgMTIwIHNlZ3MuIEVzIGRlY2lyIHF1ZSBlbnRyZSB0cmFuc2FjY2lvbmVzLCBlbCB0aWVtcG8gZGUgYXRlbmNpw7NuIHZhcsOtYSBtZWRpYW50YW1lbnRlIHJlc3BlY3RvIGFsIHRpZW1wbyBwcm9tZWRpby4NCg0KVmVyaWZpY2FuZG8gbG8gYW50ZXJpb3IgZ3LDoWZpY2FtZW50ZSBzZSB0aWVuZToNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IGRhdGFfYmFuY28sIGFlcyh4PSBUaWVtcG9fU2VydmljaW9fc2VnKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oIGFlcyh5PSAuLmNvdW50Li4pLGJpbndpZHRoID0gMSApICsNCiAgbGFicyh0aXRsZT0gJ0hpc3RvZ3JhbWEgcGFyYSBUaWVtcG8gZGUgU2VydmljaW8gKHNlZyknLCB5PSAiQ2FudGlkYWQiLCB4PSAiVGllbXBvIikrZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1lYW4oVGllbXBvX1NlcnZpY2lvX3NlZykpLCBjb2xvcj0gInJlZCIpDQpgYGANCg0KTsOzdGVzZSBxdWUgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSB2YXJpYWJsZSBlcyBhc2ltw6l0cmljYSBhIGxhIGRlcmVjaGE7IGxhIHJlY3RhIHJvamEgcmVwcmVzZW50YSBsYSBtZWRpYSBkZWwgdGllbXBvIGRlIHNlcnZpY2lvLiBNZWRpYW50ZSDDqXN0YSDDumx0aW1hIHNlIHB1ZWRlIGFwcmVjaWFyIGxvIHF1ZSBvY3VycmUgY29uIGxhIGRpc3BlcnNpw7NuLg0KDQojICoqwr9RdcOpIHN1Y2VkZSBjb24gbG9zIHRpZW1wb3MgZGUgYXRlbmNpw7NuIHBvciB0cmFuc2FjY2nDs24/KioNCg0KRXhwbG9yYW5kbyBncsOhZmljYW1lbnRlIGVsIHRpZW1wbyBkZSBzZXJ2aWNpbyBwb3IgdHJhbnNhY2Npw7NuOg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdChkYXRhX2JhbmNvLCBhZXMoeCA9IFRpZW1wb19TZXJ2aWNpb19zZWcpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uLCBmaWxsPSBUcmFuc2FjY2lvbiksIGJpbndpZHRoID0gNywgICANCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBhbHBoYT0gMC40KSArDQogIGxhYnModGl0bGU9ICdUaWVtcG8gZGUgc2VydmljaW8gcG9yIHRyYW5zYWNjacOzbicsIHg9ICJUaWVtcG8iKQ0KYGBgDQoNClNlIGFwcmVjaWEgcXVlIGxhIHRyYW5zYWNjacOzbiBxdWUgcmVxdWllcmUgbcOhcyB0aWVtcG8gcG9yIHBhcnRlIGRlIGxvcyBjbGllbnRlcyBlcyBsYSBkZSBDb2Jyby9QYWdvLiBMb3MgZGVww7NzaXRvcywgYWwgY29udHJhcmlvLCBlcyBsYSB0cmFuc2FjY2nDs24gcXVlIHRpZW5lIG1lbm9yIHRpZW1wbyBkZSBkZW1vcmEgZW4gbGEgYXRlbmNpw7NuLiANCg0KDQo=