Paso 1: Preparando datos

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),]

Paso 2: Estadisticos de las variables

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
## ---------------------------------------------------------------------------

Paso 3: Análisis de la Dependiente

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.

Paso 4: Análisis Bivariado

# 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.

Paso 5: Análisis Regresión

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:

  1. 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.

  2. El porcentaje de voto de la oposición no tiene efecto significativo (ni al 0.05, ni a 0.1).

  3. 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.

  4. 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.

  5. Cuando un Consejo Comunal sí recibió promesa de ejecución no tiene efecto sobre la asignación presupuetal.