Evaluando los conceptos claves a la hora de evaluar la calidad de los datos utilizados en un reporte, pueden formarse algunas guias para automatizar el analisis como etapa fundamental del gobierno de datos. Llamaremos a estas guias Principios de Calidad, definidos como:
A partir de estos 5 principios, podemos generar Reglas de Calidad, aplicables a lo largo del perimetro de nuestras bases de datos. Las lineas de trabajo pueden verse de la siguiente manera:
df <- readxl::read_xlsx("Lyrics.xlsx")
dim(df)## [1] 28372 30
colnames(df)## [1] "artist_name" "track_name"
## [3] "release_date" "genre"
## [5] "lyrics" "len"
## [7] "dating" "violence"
## [9] "world/life" "night/time"
## [11] "shake the audience" "family/gospel"
## [13] "romantic" "communication"
## [15] "obscene" "music"
## [17] "movement/places" "light/visual perceptions"
## [19] "family/spiritual" "like/girls"
## [21] "sadness" "feelings"
## [23] "danceability" "loudness"
## [25] "acousticness" "instrumentalness"
## [27] "valence" "energy"
## [29] "topic" "age"
Este paquete contiene funciones creadas para evaluar distintos
aspectos de los datos.
A continuacion se muestra los principios que incluye este
paquete:
| Principios | Abbr |
|---|---|
| Validez | V |
| Completitud | C |
| Duplicidad | D |
| Integridad | I |
| Precision | P |
| Principio | SubPrincipio | Funcion | Descripcion |
|---|---|---|---|
| V | 1 | V.1 | Conteo de valores faltantes |
| V | 2 | V.2 | Control de valores no permitidos |
Esta función realiza un chequeo de la longitud de cada uno de los
valores distintos de una variable, el usuario debe colocar cual es la
longitud que desea chequear con el argumento digits.
V1 <- function(data,columna,KO = TRUE, digits = 4){
if (KO == TRUE){
print("Los casos que no cumplen con la condición son:")
} else {print("Casos que cumplen con la condición:")}
data %>%
select(columna) %>%
distinct() %>%
mutate(n = nchar(.[[1]])) %>%
filter(if(KO == T){n != digits}else{n == digits})
}V1(data = df,columna = "genre",digits = 4,KO = F)## [1] "Casos que cumplen con la condición:"
## # A tibble: 2 × 2
## genre n
## <chr> <int>
## 1 jazz 4
## 2 rock 4
| Principio | SubPrincipio | Funcion | Descripcion |
|---|---|---|---|
| C | 1 | C.1 | Conteo de valores faltantes |
C1 <- function(data,detail = F){
if (detail == F){
sum(is.na(data))
}
else {
for (i in 1:ncol(data)){
print(
paste(colnames(data[,i]),":",sum(is.na(i)))
)
}
}
} C1(df,detail = F)## [1] 0
C1(df,detail = T)## [1] "artist_name : 0"
## [1] "track_name : 0"
## [1] "release_date : 0"
## [1] "genre : 0"
## [1] "lyrics : 0"
## [1] "len : 0"
## [1] "dating : 0"
## [1] "violence : 0"
## [1] "world/life : 0"
## [1] "night/time : 0"
## [1] "shake the audience : 0"
## [1] "family/gospel : 0"
## [1] "romantic : 0"
## [1] "communication : 0"
## [1] "obscene : 0"
## [1] "music : 0"
## [1] "movement/places : 0"
## [1] "light/visual perceptions : 0"
## [1] "family/spiritual : 0"
## [1] "like/girls : 0"
## [1] "sadness : 0"
## [1] "feelings : 0"
## [1] "danceability : 0"
## [1] "loudness : 0"
## [1] "acousticness : 0"
## [1] "instrumentalness : 0"
## [1] "valence : 0"
## [1] "energy : 0"
## [1] "topic : 0"
## [1] "age : 0"
| Principio | SubPrincipio | Funcion | Descripcion |
|---|---|---|---|
| D | 1 | D.1 | Control de valores duplicados |
Esta funcion es util para detectar IDs duplicados
D1 <- function(data,columnas,detail = F){
if (detail == F){
sum(duplicated(data))
}
else {
data %>%
filter(duplicated(columnas) == T)
}
}D1(data = df,columnas = df$track_name,detail = T) ## # A tibble: 4,683 × 30
## artist_name track…¹ relea…² genre lyrics len dating viole…³ world…⁴ night…⁵
## <chr> <chr> <dbl> <chr> <chr> <dbl> <chr> <chr> <chr> <chr>
## 1 ricky nels… unchai… 1958 pop darli… 26 0.002… 0.0022… 0.0022… 0.5056…
## 2 neil sedaka as lon… 1959 pop long … 31 0.040… 0.0017… 0.3299… 0.2132…
## 3 the brothe… angeli… 1959 pop angel… 93 0.001… 0.0553… 0.4638… 0.0010…
## 4 connie fra… non di… 1959 pop dimen… 48 0.002… 0.0020… 0.1918… 0.0414…
## 5 fats domino i'm wa… 1959 pop walki… 44 0.267… 0.0015… 0.0015… 0.0015…
## 6 connie fra… winter… 1959 pop sleig… 44 0.001… 0.0018… 0.0018… 0.0713…
## 7 dion & the… that's… 1959 pop spend… 32 0.002… 0.0020… 0.0020… 0.1349…
## 8 esquivel! all of… 1959 pop come … 47 0.001… 0.4419… 0.0015… 0.0216…
## 9 connie fra… summer… 1960 pop dream… 65 0.002… 0.0026… 0.0026… 0.0026…
## 10 the flamin… when i… 1960 pop women… 149 0.018… 0.0005… 0.0005… 0.0005…
## # … with 4,673 more rows, 20 more variables: `shake the audience` <chr>,
## # `family/gospel` <chr>, romantic <chr>, communication <chr>, obscene <chr>,
## # music <chr>, `movement/places` <chr>, `light/visual perceptions` <chr>,
## # `family/spiritual` <chr>, `like/girls` <chr>, sadness <chr>,
## # feelings <chr>, danceability <chr>, loudness <chr>, acousticness <chr>,
## # instrumentalness <chr>, valence <chr>, energy <chr>, topic <chr>,
## # age <chr>, and abbreviated variable names ¹track_name, ²release_date, …
## # ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names
| Principio | SubPrincipio | Funcion | Descripcion |
|---|---|---|---|
| I | 1 | I.1 | Control de consistencia entre distintas campos de un mismo objeto |
df$age <- as.numeric(df$age)
paste("La correlación entre la variable age y el año de lanzamiento es de :",cor(x = df$release_date,y = df$age,method = "pearson"))## [1] "La correlación entre la variable age y el año de lanzamiento es de : -1"
Esto significa que existe una relación lineal negativa entre ambas variables. Cuando aumenta una baja la otra y viceversa. Entonces podemos expresar la siguiente relación:
range(df$release_date)## [1] 1950 2019
range(df$age)## [1] 0.01428571 1.00000000
\[Min (AGE) = Max (release_{date}) \]
| age | release_date |
|---|---|
| 1 | 1950 |
| age | release_date |
|---|---|
| 0.0142857 | 2019 |
I1 <- function(data,x,y){
}| Principio | SubPrincipio | Funcion | Descripcion |
|---|---|---|---|
| P | 1 | P.1 | Control de que la variación de una métrica entre dos periodos no supere un determinado umbral |
| P | 2 | P.2 | Control de que los valores de una métrica no superen determinado umbral |
P2 <- function(dataframe,columnas,umbral ,detail = F){
if (detail == F){
dataframe %>% filter(columnas > umbral) %>% nrow()}
else {
dataframe %>% filter(columnas > umbral)
}
}P2(dataframe = df,columnas = df$release_date,umbral = 2014,detail = F)## [1] 2997
head(P2(dataframe = df,columnas = df$release_date,umbral = 2014,detail = T))## # A tibble: 6 × 30
## artist_name track…¹ relea…² genre lyrics len dating viole…³ world…⁴ night…⁵
## <chr> <chr> <dbl> <chr> <chr> <dbl> <chr> <chr> <chr> <chr>
## 1 halsey hurric… 2015 pop place… 84 0.091… 0.0008… 0.0008… 0.0008…
## 2 meek mill lord k… 2015 pop futur… 65 0.002… 0.3856… 0.0021… 0.1661…
## 3 action bron… baby b… 2015 pop heart… 189 0.057… 0.0004… 0.0674… 0.0004…
## 4 langhorne s… changes 2015 pop thing… 47 0.001… 0.0013… 0.4137… 0.0013…
## 5 drake diamon… 2015 pop stage… 181 0.011… 0.0004… 0.1354… 0.0004…
## 6 fetty wap rgf is… 2015 pop yeah … 89 0.040… 0.0010… 0.0010… 0.0010…
## # … with 20 more variables: `shake the audience` <chr>, `family/gospel` <chr>,
## # romantic <chr>, communication <chr>, obscene <chr>, music <chr>,
## # `movement/places` <chr>, `light/visual perceptions` <chr>,
## # `family/spiritual` <chr>, `like/girls` <chr>, sadness <chr>,
## # feelings <chr>, danceability <chr>, loudness <chr>, acousticness <chr>,
## # instrumentalness <chr>, valence <chr>, energy <chr>, topic <chr>,
## # age <dbl>, and abbreviated variable names ¹track_name, ²release_date, …
## # ℹ Use `colnames()` to see all variable names
Marcelo G Gonzalez
marcelo.g.gonzalez95@gmail.com
LinkTree