Como los datos los tengo en el formato mostrado, los traigo desde GoogleSheets:
link="https://docs.google.com/spreadsheets/d/e/2PACX-1vTLwlJ0dQJCuiidZvNH121tKRKCkpecEpdPolQO60oQ0SuAO66bVSZwTLtFJgXYeUiTSQJ5ripcwEv9/pub?gid=0&single=true&output=csv"
paviData=read.csv(link, stringsAsFactors = F)
Estructura
str(paviData)
## 'data.frame': 1096 obs. of 8 variables:
## $ apropiaciondolar : num 102.2 62.8 0 0 0 ...
## $ priorizado : chr "no" "no" "si" "no" ...
## $ pctopo : num 14.8 33.6 55.4 63.4 74.5 ...
## $ uribista : chr "no" "no" "no" "no" ...
## $ con_consejocomunal: chr "no" "no" "no" "no" ...
## $ ejecucion : chr "no" "no" "no" "no" ...
## $ poblacioncienmil : num 20.92 0.39 0.11 0.17 0.08 ...
## $ nbi : num 12.2 21.6 31.2 45.3 63.9 ...
Los nombres de la variables NO deben tener espacios ni tildes ni Ñs.
Las números no deben aparecer entre comillas, si eso sucede, quiere decir que el numero tiene simbolos como “comas”, elimina eso desde el original. Tambien puede ser porque hay alguna celda con algun valor inapropiado (quizas una X, un “-”, etc.), esos se deben eliminar y dejar la celda vacía.
Las variables categoricas que se muestran, han sido leídas como texto. Hay que volverlas categóricas usando la función “as.factor”:
# columnas 2 y de la 4 ala 6:
paviData[,c(2,4:6)]=lapply(paviData[,c(2,4:6)],as.factor)
Eliminar valores perdidos
paviData=paviData[complete.cases(paviData),]
summary(paviData)
## apropiaciondolar priorizado pctopo uribista con_consejocomunal
## Min. : 0.000 no:790 Min. : 0.00 :184 no:1001
## 1st Qu.: 0.000 si:270 1st Qu.: 6.24 no:325 si: 59
## Median : 0.000 Median :20.39 si:551
## Mean : 8.448 Mean :27.97
## 3rd Qu.: 10.560 3rd Qu.:45.70
## Max. :132.640 Max. :99.42
## ejecucion poblacioncienmil nbi
## no:1021 Min. : 0.0000 Min. : 5.36
## si: 39 1st Qu.: 0.0700 1st Qu.:28.30
## Median : 0.1400 Median :41.27
## Mean : 0.4143 Mean :42.94
## 3rd Qu.: 0.2700 3rd Qu.:55.49
## Max. :69.2700 Max. :98.81
Note que Uribista tiene un valor extraño:
levels(paviData$uribista)
## [1] "" "no" "si"
De ahí que:
levels(paviData$uribista)[levels(paviData$uribista)==''] = NA
Otra alternativa
library(Hmisc)
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## Loading required package: ggplot2
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
##
## format.pval, units
Hmisc::describe(paviData)
## paviData
##
## 8 Variables 1060 Observations
## ---------------------------------------------------------------------------
## apropiaciondolar
## n missing distinct Info Mean Gmd .05 .10
## 1060 0 212 0.842 8.448 13.38 0.00 0.00
## .25 .50 .75 .90 .95
## 0.00 0.00 10.56 33.22 42.32
##
## lowest : 0.00 0.03 0.04 0.15 0.20, highest: 95.40 96.64 99.72 102.17 132.64
## ---------------------------------------------------------------------------
## priorizado
## n missing distinct
## 1060 0 2
##
## Value no si
## Frequency 790 270
## Proportion 0.745 0.255
## ---------------------------------------------------------------------------
## pctopo
## n missing distinct Info Mean Gmd .05 .10
## 1060 0 947 1 27.97 28.1 0.3095 0.9990
## .25 .50 .75 .90 .95
## 6.2400 20.3900 45.7025 67.8070 80.2715
##
## lowest : 0.00 0.02 0.03 0.07 0.10, highest: 93.97 94.08 94.36 96.04 99.42
## ---------------------------------------------------------------------------
## uribista
## n missing distinct
## 876 184 2
##
## Value no si
## Frequency 325 551
## Proportion 0.371 0.629
## ---------------------------------------------------------------------------
## con_consejocomunal
## n missing distinct
## 1060 0 2
##
## Value no si
## Frequency 1001 59
## Proportion 0.944 0.056
## ---------------------------------------------------------------------------
## ejecucion
## n missing distinct
## 1060 0 2
##
## Value no si
## Frequency 1021 39
## Proportion 0.963 0.037
## ---------------------------------------------------------------------------
## poblacioncienmil
## n missing distinct Info Mean Gmd .05 .10
## 1060 0 138 0.999 0.4143 0.5972 0.0300 0.0400
## .25 .50 .75 .90 .95
## 0.0700 0.1400 0.2700 0.5500 0.9905
##
## Value 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5
## Frequency 775 211 35 10 3 4 3 6 3 2
## Proportion 0.731 0.199 0.033 0.009 0.003 0.004 0.003 0.006 0.003 0.002
##
## Value 5.0 5.5 7.0 9.5 13.0 21.0 23.0 69.5
## Frequency 1 1 1 1 1 1 1 1
## Proportion 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001
## ---------------------------------------------------------------------------
## nbi
## n missing distinct Info Mean Gmd .05 .10
## 1060 0 981 1 42.94 21.26 15.60 19.74
## .25 .50 .75 .90 .95
## 28.30 41.27 55.49 68.29 77.34
##
## lowest : 5.36 6.84 7.12 8.69 8.94, highest: 96.09 96.98 97.32 97.79 98.81
## ---------------------------------------------------------------------------
Verificar asimetría:
# Variable dependiente:
# Apropiacion presupuestal en millones US$: 'apropiaciondolar'
library(DescTools)
##
## Attaching package: 'DescTools'
## The following objects are masked from 'package:Hmisc':
##
## %nin%, Label, Mean, Quantile
Skew(paviData$apropiaciondolar)
## [1] 2.708773
Gráficos Si hay simetría o asimetría se verificvará en las gráficas:
Histograma
library(ggplot2)
base=ggplot(data=paviData, aes(x=apropiaciondolar))
base+geom_histogram(bins=20) #usar 20 siempre
Diagrama de cajas
base=ggplot(data=paviData, aes(y=apropiaciondolar))
base+geom_boxplot() + coord_flip()
Prueba de normalidad:
shapiro.test(paviData$apropiaciondolar)
##
## Shapiro-Wilk normality test
##
## data: paviData$apropiaciondolar
## W = 0.595, p-value < 2.2e-16
# H0 = Distribución es normal.
No es normal y rechaza la hipótesis nula. No es paramétrico. Como el p-value es menor que 0.05, se confirma que la variable no es similar a la curva normal.
# Variables Independientes:
# a) criterios técnicos: 'priorizado'
# b) clientelismo:
# b.1 porcentaje de la oposicion:'pctopo'
# b.2 municipio lo gano o no partido afin al ejecutivo: 'uribista'
# c) populismo:
# c.1 los municipios en los que se han realizado Consejos Comunales: 'consejocomunal'
# c.2 los municipios donde se habían ejecutado recursos: 'ejecucion'
f1=formula(apropiaciondolar ~ priorizado)
aggregate(f1, data=paviData,median)
## priorizado apropiaciondolar
## 1 no 0.000
## 2 si 0.655
base=ggplot(data=paviData, aes(x=priorizado,y=apropiaciondolar))
base+geom_boxplot() + coord_flip()
wilcox.test(f1,data=paviData)
##
## Wilcoxon rank sum test with continuity correction
##
## data: apropiaciondolar by priorizado
## W = 96581, p-value = 0.01152
## alternative hypothesis: true location shift is not equal to 0
Por el p-valor sabemos que las medianas son diferentes. Osea, hay efecto de la variable priorizado. Sí hay diferencias.
base=ggplot(data = paviData, aes(x=pctopo,y=apropiaciondolar))
base + geom_point()
library(ggpubr)
## Loading required package: magrittr
ggscatter(paviData,
x = "pctopo", y = "apropiaciondolar",
cor.coef = TRUE,
cor.method = "spearman",
add = "reg.line",
add.params = list(color = "blue", fill = "lightgray"),
conf.int = TRUE)
f2=formula(apropiaciondolar ~ uribista)
aggregate(f2, data=paviData,median)
## uribista apropiaciondolar
## 1 no 0
## 2 si 0
base=ggplot(data=paviData, aes(x=uribista,y=apropiaciondolar))
base+geom_boxplot() + coord_flip()
levels(paviData$uribista)
## [1] "no" "si"
Como hay un valor que no corresponde:
paviData[!paviData$uribista%in%c("si","no"),]=NA
Eso volvio NA al valor leido pero NO necesario. Ahora:
wilcox.test(f2,data=paviData)
##
## Wilcoxon rank sum test with continuity correction
##
## data: apropiaciondolar by uribista
## W = 95048, p-value = 0.09883
## alternative hypothesis: true location shift is not equal to 0
Por el p-valor sabemos que las medianas son diferentes. Osea, hay efecto de la variable uribista.
f3=formula(apropiaciondolar ~ con_consejocomunal)
aggregate(f3, data=paviData,median)
## con_consejocomunal apropiaciondolar
## 1 no 0.00
## 2 si 19.13
base=ggplot(data=paviData, aes(x=con_consejocomunal,y=apropiaciondolar))
base+geom_boxplot() + coord_flip()
## Warning: Removed 184 rows containing non-finite values (stat_boxplot).
wilcox.test(f3,data=paviData)
##
## Wilcoxon rank sum test with continuity correction
##
## data: apropiaciondolar by con_consejocomunal
## W = 8789, p-value = 5.02e-13
## alternative hypothesis: true location shift is not equal to 0
Por el p-valor sabemos que las medianas son diferentes. Osea, hay efecto de la variable con_consejocomunal.
f4=formula(apropiaciondolar ~ ejecucion)
aggregate(f4, data=paviData,median)
## ejecucion apropiaciondolar
## 1 no 0.000
## 2 si 1.335
base=ggplot(data=paviData, aes(x=ejecucion,y=apropiaciondolar))
base+geom_boxplot() + coord_flip()
## Warning: Removed 184 rows containing non-finite values (stat_boxplot).
wilcox.test(f4,data=paviData)
##
## Wilcoxon rank sum test with continuity correction
##
## data: apropiaciondolar by ejecucion
## W = 11741, p-value = 0.174
## alternative hypothesis: true location shift is not equal to 0
Por el p-valor sabemos que las medianas no serían diferentes. Osea, NO hay efecto de la variable ejecucion.
names(paviData)
## [1] "apropiaciondolar" "priorizado" "pctopo"
## [4] "uribista" "con_consejocomunal" "ejecucion"
## [7] "poblacioncienmil" "nbi"
paviModeloOrd=lm(apropiaciondolar~.,data=paviData)
summary(paviModeloOrd)
##
## Call:
## lm(formula = apropiaciondolar ~ ., data = paviData)
##
## Residuals:
## Min 1Q Median 3Q Max
## -60.200 -8.208 -5.877 2.512 92.495
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 14.13107 1.67647 8.429 < 2e-16 ***
## priorizadosi -2.21440 1.18713 -1.865 0.06247 .
## pctopo -0.03096 0.02126 -1.456 0.14562
## uribistasi -2.57304 1.09185 -2.357 0.01867 *
## con_consejocomunalsi 14.05085 2.32445 6.045 2.22e-09 ***
## ejecucionsi 2.95645 2.80751 1.053 0.29261
## poblacioncienmil 1.83856 0.20023 9.182 < 2e-16 ***
## nbi -0.09290 0.02941 -3.159 0.00164 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.38 on 868 degrees of freedom
## (184 observations deleted due to missingness)
## Multiple R-squared: 0.1751, Adjusted R-squared: 0.1684
## F-statistic: 26.32 on 7 and 868 DF, p-value: < 2.2e-16
Por lo tanto:
Cuando un proyecto sí está priorizado la asignación presupuestal promedio disminuye (relación inversa). El efecto que un proyecto priorizado disminuye la asignación promedio en -2.21440 millones de dolares. Este efecto es significativo al 0.1.
El porcentaje de voto de la oposición no tiene efecto significativo (ni al 0.05, ni a 0.1).
Cuando un municipio tiene alcalde que sí es Uribista la asignación presupuestal promedio disminuye (relación inversa). El efecto que haya alcalde Uribista disminuye la asignación promedio en -2.57304 millones de dolares. Este efecto es significativo al 0.05.
Cuando un municipio sí tiene Consejo Comunal la asignación presupuestal promedio aumenta (relación directa). El efecto que haya Consejo Comunal aumenta la asignación promedio en 14.05085 millones de dolares. Este efecto es significativo al 0.001.
Cuando un Consejo Comunal sí recibió promesa de ejecución no tiene efecto sobre la asignación presupuetal.