INTRODUCION

Neste arquivo de RStudio a modo de libro vanse a adxuntar con explicacións todos os códigos que se empregaron para o traballo do concello de Cambados. Agárdase que sexan claros e fáciles de entender para o lector.

FILTRADO DE DATOS.

Neste primeiro apartado vaise mostrar como se filtraron os datos para o traballo do nivel de estudos de Cambados.

LECTURA DOS DATOS.

Descarga de paquete.

O primeiro paso é, como os datos tense nun .xlsx, tense que descargar a libraría para que lea o documento .xlsx co seguinte código.

####################################################
# INSTALACION DE PAQUETES
#install.packages("readxl") # Instalar paquete. Descomentar se non se conta con el.
library(readxl) # Activar 
####################################################

Lectura .xlsx.

Unha vez comprobado que o arquivo atópase na carpeta que está usando RStudio simplemente temos que compilar o seguinte.

####################################################
# LECTURA DE DATOS xlsx
datos<-read_xlsx("HISTORICO_NOVO.xlsx",col_names=TRUE) ; # lectura
summary(datos) # ver categorias datos
##      C. INE         C.Var.           Cod. Lugar.       Cod. Mov         Cod. Pais Nac. 
##  Min.   : 0.00   Length:103472      Min.   :101601   Length:103472      Min.   :101.0  
##  1st Qu.:20.00   Class :character   1st Qu.:101601   Class :character   1st Qu.:108.0  
##  Median :20.00   Mode  :character   Median :101601   Mode  :character   Median :108.0  
##  Mean   :22.28                      Mean   :215880                      Mean   :131.8  
##  3rd Qu.:30.00                      3rd Qu.:305301                      3rd Qu.:108.0  
##  Max.   :48.00                      Max.   :517801                      Max.   :501.0  
##                                     NA's   :1                           NA's   :58     
##  Cod. Parroquia      F. Alta                       F. Nacimiento                    
##  Min.   :100000   Min.   :1974-11-24 00:00:00.00   Min.   :1900-01-02 00:00:00.000  
##  1st Qu.:100000   1st Qu.:1996-05-01 00:00:00.00   1st Qu.:1964-05-07 00:00:00.000  
##  Median :100000   Median :2000-04-06 12:00:00.00   Median :1979-12-31 00:00:00.000  
##  Mean   :211406   Mean   :2004-01-09 05:57:36.37   Mean   :1978-02-02 10:55:17.993  
##  3rd Qu.:300000   3rd Qu.:2010-04-07 00:00:00.00   3rd Qu.:1997-05-13 00:00:00.000  
##  Max.   :500000   Max.   :2026-07-23 00:00:00.00   Max.   :2026-06-22 00:00:00.000  
##  NA's   :1                                         NA's   :57                       
##    F.Ult.Mov.                     Fecha Efectiva                  
##  Min.   :1996-05-01 00:00:00.00   Min.   :1974-11-24 00:00:00.00  
##  1st Qu.:2013-01-31 00:00:00.00   1st Qu.:2005-06-20 00:00:00.00  
##  Median :2014-04-01 00:00:00.00   Median :2013-02-11 00:00:00.00  
##  Mean   :2014-05-14 02:47:25.99   Mean   :2011-08-20 20:17:14.01  
##  3rd Qu.:2016-11-11 00:00:00.00   3rd Qu.:2016-10-01 00:00:00.00  
##  Max.   :2026-07-23 00:00:00.00   Max.   :2026-07-23 00:00:00.00  
##                                                                   
##    Fecha Mod.                          NIA               Sexo      
##  Min.   :1988-05-25 00:00:00.00   Min.   :      1   Min.   :1.000  
##  1st Qu.:2006-04-10 00:00:00.00   1st Qu.:   7394   1st Qu.:1.000  
##  Median :2014-02-11 00:00:00.00   Median :  13783   Median :6.000  
##  Mean   :2012-02-04 09:32:13.88   Mean   : 136724   Mean   :3.521  
##  3rd Qu.:2016-11-11 00:00:00.00   3rd Qu.:  18994   3rd Qu.:6.000  
##  Max.   :2026-07-23 00:00:00.00   Max.   :1010456   Max.   :6.000  
##                                                     NA's   :1
####################################################

Lectura .csv.

No caso de que se conte co documento .csv a lectura pode realizarse co seguinte código.

####################################################
# LECTURA DE DATOS csv
#datos <- read.csv("HISTORICO_MERGE.csv") ; # lectura
#summary(datos) # ver categorias datos
####################################################

Estas liñas están comentadas pois usáronse os datos do excel que xa ten borradas algunhas columnas do .csv para que sexa máis lixeiro para R traballar ca base de datos.

DEPURACIÓN DOS DATOS

Os datos recollidos son os movementos das diferentes persoas no padrón de Cambados durante 30 anos. Como neste primeiro momento so se precisa saber cantas persoas tense en Cambados e o último movemento de cada unha vaise usar este criterio.

Filtrado NIA.

Para iso úsase a función duplicated que poñendo fromLast fai unha lectura de abaixo a arriba e borra os datos que vexa repetidos, é dicir, deixa o último movemento rexistrado. Podería filtrarse usando nomes e apelidos ou mesmo o DNI pero existe unha columna xa comentada que é o NIA que asigna un número a cada persoa polo que usaremos esta por ser a máis sinxela.

####################################################
datos_limpos <- datos[!duplicated(datos$NIA,fromLast = TRUE),] # Quitar persoas repetidas
summary(datos_limpos) # Ver categorias de novo
##      C. INE        C.Var.           Cod. Lugar.       Cod. Mov         Cod. Pais Nac. 
##  Min.   : 0.0   Length:27149       Min.   :101601   Length:27149       Min.   :101.0  
##  1st Qu.:20.0   Class :character   1st Qu.:101601   Class :character   1st Qu.:108.0  
##  Median :20.0   Mode  :character   Median :101601   Mode  :character   Median :108.0  
##  Mean   :24.6                      Mean   :217249                      Mean   :132.7  
##  3rd Qu.:31.0                      3rd Qu.:305301                      3rd Qu.:108.0  
##  Max.   :48.0                      Max.   :517801                      Max.   :501.0  
##                                    NA's   :1                           NA's   :13     
##  Cod. Parroquia      F. Alta                       F. Nacimiento                    
##  Min.   :100000   Min.   :1974-11-24 00:00:00.00   Min.   :1900-01-02 00:00:00.000  
##  1st Qu.:100000   1st Qu.:1996-05-01 00:00:00.00   1st Qu.:1956-07-30 00:00:00.000  
##  Median :100000   Median :2001-02-26 00:00:00.00   Median :1975-10-26 00:00:00.000  
##  Mean   :212631   Mean   :2005-07-13 17:37:12.34   Mean   :1973-11-07 22:23:26.255  
##  3rd Qu.:300000   3rd Qu.:2014-07-29 00:00:00.00   3rd Qu.:1992-09-08 00:00:00.000  
##  Max.   :500000   Max.   :2026-07-23 00:00:00.00   Max.   :2026-06-22 00:00:00.000  
##  NA's   :1                                         NA's   :8                        
##    F.Ult.Mov.                     Fecha Efectiva                  
##  Min.   :1996-05-01 00:00:00.00   Min.   :1985-01-10 00:00:00.00  
##  1st Qu.:2013-01-31 00:00:00.00   1st Qu.:2013-01-31 00:00:00.00  
##  Median :2016-11-11 00:00:00.00   Median :2016-09-30 00:00:00.00  
##  Mean   :2016-07-18 07:41:17.66   Mean   :2016-04-08 00:06:50.52  
##  3rd Qu.:2022-11-14 00:00:00.00   3rd Qu.:2022-11-14 00:00:00.00  
##  Max.   :2026-07-23 00:00:00.00   Max.   :2026-07-23 00:00:00.00  
##                                                                   
##    Fecha Mod.                          NIA               Sexo      
##  Min.   :1996-05-01 00:00:00.00   Min.   :      1   Min.   :1.000  
##  1st Qu.:2013-01-31 00:00:00.00   1st Qu.:   6817   1st Qu.:1.000  
##  Median :2016-11-11 00:00:00.00   Median :  13623   Median :6.000  
##  Mean   :2016-06-14 19:27:50.91   Mean   : 206400   Mean   :3.527  
##  3rd Qu.:2022-11-14 00:00:00.00   3rd Qu.:  20507   3rd Qu.:6.000  
##  Max.   :2026-07-23 00:00:00.00   Max.   :1010456   Max.   :6.000  
## 
####################################################

Filtrado CVAR.

Agora para saber a poboación de Cambados quítanse as persoas que por defunción, emigración ou outro motivo xa non están no padrón. Unha forma de comprobar que o que se fixo é correcto é ver que Fecha Mod. coincide con F.Ult.Mov., é dicir, as datas de último movemento coinciden cas de movemento.

####################################################
datos_persoas<-datos_limpos[datos_limpos$C.Var.!="B",] #Quitar as persoas no grupo B ( mortes , emigrados oudesactualizados )
summary(datos_persoas) # Ver categorias de novo
##      C. INE         C.Var.           Cod. Lugar.       Cod. Mov         Cod. Pais Nac. 
##  Min.   : 0.00   Length:15035       Min.   :101601   Length:15035       Min.   :101.0  
##  1st Qu.:20.00   Class :character   1st Qu.:101601   Class :character   1st Qu.:108.0  
##  Median :22.00   Mode  :character   Median :101601   Mode  :character   Median :108.0  
##  Mean   :25.62                      Mean   :222650                      Mean   :129.8  
##  3rd Qu.:32.00                      3rd Qu.:306601                      3rd Qu.:108.0  
##  Max.   :48.00                      Max.   :517801                      Max.   :501.0  
##                                                                         NA's   :3      
##  Cod. Parroquia      F. Alta                       F. Nacimiento                    
##  Min.   :100000   Min.   :1974-11-24 00:00:00.00   Min.   :1900-04-27 00:00:00.000  
##  1st Qu.:100000   1st Qu.:1996-05-01 00:00:00.00   1st Qu.:1963-01-14 06:00:00.000  
##  Median :100000   Median :2003-02-21 00:00:00.00   Median :1978-05-29 12:00:00.000  
##  Mean   :217938   Mean   :2006-10-28 16:17:35.46   Mean   :1979-10-19 19:34:52.376  
##  3rd Qu.:300000   3rd Qu.:2017-06-13 00:00:00.00   3rd Qu.:1998-03-02 06:00:00.000  
##  Max.   :500000   Max.   :2026-07-23 00:00:00.00   Max.   :2026-06-22 00:00:00.000  
##                                                    NA's   :1                        
##    F.Ult.Mov.                    Fecha Efectiva                  
##  Min.   :1996-05-01 00:00:00.0   Min.   :1985-01-10 00:00:00.00  
##  1st Qu.:2016-09-30 00:00:00.0   1st Qu.:2016-09-30 00:00:00.00  
##  Median :2018-02-13 00:00:00.0   Median :2017-08-14 00:00:00.00  
##  Mean   :2019-04-18 08:24:15.7   Mean   :2018-11-16 10:49:33.38  
##  3rd Qu.:2023-06-14 00:00:00.0   3rd Qu.:2023-03-29 12:00:00.00  
##  Max.   :2026-07-23 00:00:00.0   Max.   :2026-07-23 00:00:00.00  
##                                                                  
##    Fecha Mod.                          NIA               Sexo      
##  Min.   :1996-05-01 00:00:00.00   Min.   :      2   Min.   :1.000  
##  1st Qu.:2016-09-30 00:00:00.00   1st Qu.:   7208   1st Qu.:1.000  
##  Median :2018-02-13 00:00:00.00   Median :  14030   Median :6.000  
##  Mean   :2019-02-17 07:03:08.44   Mean   : 250531   Mean   :3.566  
##  3rd Qu.:2023-06-14 00:00:00.00   3rd Qu.:  21743   3rd Qu.:6.000  
##  Max.   :2026-07-23 00:00:00.00   Max.   :1010456   Max.   :6.000  
## 
####################################################

Con isto vese que se ten unha poboación en Cambados de 15035 habitantes moi próxima ao valor aportado en MIGRANTES.xlsx . Se fixera falta comprobar podería verse a columna C.VAR. que elementos contén. O arquivo de datos datos_persoas será o que se usará principalmente nos seguintes arquivos.

IDADES

DEPURACIÓN DE DATAS

Datas vacias

O primeiro que se vai facer e eliminar aquelas persoas que no padrón non teñan data de nacemento especificada para evitar problemas a hora de compilar o código.

##################################################
datos_persoas_datas<-datos_persoas[!is.na(datos_persoas$`F. Nacimiento`),]
summary(datos_persoas_datas)
##      C. INE         C.Var.           Cod. Lugar.       Cod. Mov         Cod. Pais Nac. 
##  Min.   : 0.00   Length:15034       Min.   :101601   Length:15034       Min.   :101.0  
##  1st Qu.:20.00   Class :character   1st Qu.:101601   Class :character   1st Qu.:108.0  
##  Median :22.00   Mode  :character   Median :101601   Mode  :character   Median :108.0  
##  Mean   :25.62                      Mean   :222658                      Mean   :129.8  
##  3rd Qu.:32.00                      3rd Qu.:306601                      3rd Qu.:108.0  
##  Max.   :48.00                      Max.   :517801                      Max.   :501.0  
##                                                                         NA's   :3      
##  Cod. Parroquia      F. Alta                       F. Nacimiento                    
##  Min.   :100000   Min.   :1974-11-24 00:00:00.00   Min.   :1900-04-27 00:00:00.000  
##  1st Qu.:100000   1st Qu.:1996-05-01 00:00:00.00   1st Qu.:1963-01-14 06:00:00.000  
##  Median :100000   Median :2003-02-21 00:00:00.00   Median :1978-05-29 12:00:00.000  
##  Mean   :217946   Mean   :2006-10-28 16:06:21.22   Mean   :1979-10-19 19:34:52.376  
##  3rd Qu.:300000   3rd Qu.:2017-06-13 00:00:00.00   3rd Qu.:1998-03-02 06:00:00.000  
##  Max.   :500000   Max.   :2026-07-23 00:00:00.00   Max.   :2026-06-22 00:00:00.000  
##                                                                                     
##    F.Ult.Mov.                     Fecha Efectiva                  
##  Min.   :1996-05-01 00:00:00.00   Min.   :1985-01-10 00:00:00.00  
##  1st Qu.:2016-09-30 00:00:00.00   1st Qu.:2016-09-30 00:00:00.00  
##  Median :2018-02-13 00:00:00.00   Median :2017-08-15 12:00:00.00  
##  Mean   :2019-04-18 13:09:26.55   Mean   :2018-11-16 17:39:56.00  
##  3rd Qu.:2023-06-14 00:00:00.00   3rd Qu.:2023-03-29 18:00:00.00  
##  Max.   :2026-07-23 00:00:00.00   Max.   :2026-07-23 00:00:00.00  
##                                                                   
##    Fecha Mod.                          NIA               Sexo      
##  Min.   :1996-05-01 00:00:00.00   Min.   :      2   Min.   :1.000  
##  1st Qu.:2016-09-30 00:00:00.00   1st Qu.:   7207   1st Qu.:1.000  
##  Median :2018-02-13 00:00:00.00   Median :  14029   Median :6.000  
##  Mean   :2019-02-17 14:02:24.63   Mean   : 250547   Mean   :3.566  
##  3rd Qu.:2023-06-14 00:00:00.00   3rd Qu.:  21744   3rd Qu.:6.000  
##  Max.   :2026-07-23 00:00:00.00   Max.   :1010456   Max.   :6.000  
## 
##################################################

Elimínase un único dato como se pode observar. Non podemos esquecer este paso pois levar un dato NAN produciría que todo o demais logo fose mal.

Cálculo dos anos das persoas

Para calcular a idade de cada persoa vaise usar a columna coas datas de nacemento recoller o ano de nacemento de cada persoa e facer unha diferenza entre o ano actual e a idade das persoas. En caso de que se compile o código nun ano que non sexa 2026 todas as persoas variarán a súa idade do proposto aquí.

##################################################
ano_actual<-as.POSIXlt(Sys.Date(), format="%d/%m/%Y %H:%M:%S")$year+1900
ano_nacemento<-as.POSIXlt(datos_persoas_datas$`F. Nacimiento`)$year + 1900
datos_persoas_datas$edad<-ano_actual-ano_nacemento
##################################################

Rangos de idades

Para realizar varios gráficos vaise crear unha categoría que sexan rangos de idades. Vanse facer de 10 en 10 aínda que se poderían tamén facer de 5 en 5, pero como o traballo non ten este punto como o maior de interese chegará para dar certas conclusións da poboación.

##################################################
cortes<-c(-1,10,20,30,40,50,60,70,80,90,100,Inf) #defínense os cortes.
idades<-c("0-10","11-20","21-30","31-40","41-50","51 -60 " , " 61 -70 " , " 71 -80 " , " 81 -90 " , " 91 -100 " , " 101+ " ) #nome aos grupos de idade.
datos_persoas_datas$rango <- cut ( datos_persoas_datas$edad,breaks = cortes,labels = idades , right = TRUE ) #columna rangos de idade.
tabla_idades <- table(datos_persoas_datas$rango ) #táboa frecuencias rangos de idade.
##################################################

GRÁFICOS IDADE.

Gráfico de barras.

O primeiro gráfico é un gráfico de barras aproveitando que se calculou a táboa de frecuencias.

##################################################
barplot ( tabla_idades , main=" Distribucion da
poboacion por grupos de idade en Cambados " , xlab = " Rangos de idade " , ylab = " Numero de Habitantes " , ylim = c (0 ,2500) , col = " steelblue " , las =1 , cex.names = 0.4)

##################################################

Histograma.

Este gráfico é semellante ao anterior pero calcula por si mesmo os intervalos óptimos e as barras se colocan unhas pegadas as outras.

##################################################
hist(datos_persoas_datas$edad,main = "Distribución da poboación por idades",xlab = "Idade", ylab = "Número de habitantes", col = "steelblue")

##################################################

Diagrama de caixas.

Serve para ver onde están os cuantis e os datos atípicos.

##################################################
boxplot(datos_persoas_datas$edad , main = " Distribución de
Idades da Poboación " , ylab = " Idade " , col = " skyblue " , border = "darkblue " , notch =T) # O ultimo argumento marca a mediana

##################################################

Pirámide de poboación.

Un dos gráficos máis usados para ver como se distribue a poboación por idades é a pirámide poboacional. Na primeira parte do código descárganse dúas librerías. Logo faise unha base de datos na que se cambian os valores que identifican a homes e mulleres. Os homes quedan con valor 1 mentres as mulleres cambian o 6 por un -1. Despois na táboa de conteo no terceiro parágrafo faise un reconto das frecuencias e cambianse outra vez de signo pois de costume os homes van a esquerda e as mulleres a dereita. Ao final, crease o gráfico con ggplot2.

#############################################
library(dplyr)   # Libraría comando mutate
library(ggplot2) # Libraría gráfica ggplot

# Créase o data frame seleccionando as columnas polo seu nome directamente
datos_demo <- data.frame(
  edad = datos_persoas_datas$edad,
  Sexo = datos_persoas_datas$Sexo
)

# Modifícase a variable sexo
datos_demo <- datos_demo %>%
  mutate(sexo = case_when(
    Sexo == 1 ~ 1,
    Sexo == 6 ~ -1
  ))

# Cóntanse as frecuencias
tabla_conteo <- datos_demo %>% 
  count(edad, sexo) %>%
  mutate(poblacion = ifelse(sexo == -1, n, -n)) 

# Gráfico ggplot 
ggplot(tabla_conteo, aes(x = edad, y = poblacion, fill = as.factor(sexo))) + 
  geom_col(width = 0.7) + 
  coord_flip() + 
  scale_y_continuous(labels = abs) + 
  scale_fill_manual( 
    name = "Sexo", 
    values = c("-1" = "red", "1" = "blue"), 
    labels = c("-1" = "Muller", "1" = "Home") 
  ) +
  labs(x = "Idade", y = "Poboación") + 
  theme_minimal()

###########################################

Gráfico de barras parroquia concreta.

Este código é moi semellante ao primeiro deste apartado. O único diferente é o acoutamento a parroquia na primeira liña. Para as outras parroquias só debe cambiarse o número 100000 por 200000(Castrelo), 300000(Corvillón), 400000(Oubiña) ou 500000(Vilariño). O único que variaría facer ese gráfico respecto dos do Latex serán os títulos dos gráficos e nalgún as escalas. Nos próximos gráficos do tipo parroquias só se indica o código de Cambados pois como se remata de explicar son totalmente análogos.

######################################
idades_camb<-datos_persoas_datas[datos_persoas_datas$`Cod. Parroquia`==100000,] # So temos que cambiar este numero para as outras parroquias .
idades_camb$rango <- cut (idades_camb$edad , breaks=cortes , labels = idades , right = TRUE ) # Usamos os mesmos cortes anteriores.
tabla_idades <- table(idades_camb$rango) # Gardar os datos en táboa de frecuencias
barplot(tabla_idades , main = " Distribucion da poboacion por
grupos de idade en parroquia Cambados " , xlab = " Rangos de idade ", ylab = " Numero de Habitantes " , ylim =c(0,1500) , col = " steelblue" , las =1 , cex.names = 0.7) #Cálculo do gráfico de barras .

######################################

ESTUDOS

ESTUDOS CAMBADOS XERAL

Filtrado de datos.

Vaise volver realizar un filtrado de datos para ter as categorías precisas para este apartado. Recollemos as persoas que vaian traballar nun futuro polo que quitamos o grupo de persoas maiores de 65 anos e o grupo con estudos calificados como menores de 10 anos.

################################################
datosbos <- datos_persoas_datas [ datos_persoas_datas$edad<=65 & datos_persoas_datas$`C. INE` != 0 ,] #Filtrado datos
Estudos = table ( datosbos$`C. INE` ) #Táboa frecuencias
################################################

Gráfico de barras estudos Cambados.

################################################
barplot ( Estudos , main = " Distribucion da poboacion por
grupos de estudos " , xlab = " Niveis de estudos " , ylab = "
Numero de Habitantes " , ylim = c (0 ,2000) , col = "steelblue" ,las =1 , cex.names = 0.7)

################################################

ESTUDOS CAMBADOS POR PARROQUIAS

Filtrado de datos.

Temos que aportar a que parroquia se refire en cada momento. Usamos unha librería para a parte do fct_collapse onde créase unha columna xuntando en 3 clases que son estudios baixos(ou sen eles), medios e altos. Ademais faise un data.frame cos porcentaxes.

################################################
library(forcats) #librería

datosbos$estudos <- fct_collapse(as.character(datosbos$`C. INE`), "Baixos ou sen estudos" = c("10", "20","21","22"), "Estudos medios"        = c("30", "31", "32"), "Estudos altos" = c("40", "41", "42", "44", "45", "46", "48"))
datosestcamb<-datosbos[datosbos$`Cod. Parroquia`==100000,]#Selección parroquia
Estudoscamb = table(datosestcamb$`C. INE`)
EstudosSectorcamb <- table(datosestcamb$estudos) #Contar frecuencias.
Sectorcamb <- round(100 * EstudosSectorcamb / sum(EstudosSectorcamb), 1) #Porcentaxes ver que están ben.
df_temporal <- as.data.frame(Sectorcamb)#Creamos un data.frame
names(df_temporal) <- c("nivel", "persoas")#Colocamos uns nomes as categorias.
df_temporal$porcentaxe <-round(100*df_temporal$persoas/sum(df_temporal$persoas),1)
################################################

Gráfico de barras estudos por parroquia

Agora aplícase un código case igual ao anterior.

################################################
barplot ( Estudoscamb , main =" Distribucion da poboacion por
grupos de estudos Parroquia Cambados" , xlab = " Niveis de
estudos " , ylab = "Numero de Habitantes " , ylim =c (0 ,1000) , col =" steelblue " ,las =1 , cex.names = 0.7) # centro da táboa

################################################

Gráfico de sectores por parroquia

Outro gráfico que pode ter interese e facer un gráfico de sectores usando as categorias que definíronse antes.

################################################ 
library(ggplot2) 
ggplot(df_temporal, aes(x = "", y = persoas, fill = nivel)) +   geom_bar(stat = "identity", width = 1, color = "white") +   coord_polar("y", start = 0) +   theme_void() +    geom_text(aes(label = paste0(nivel, "\n (", porcentaxe, "%)")),              position = position_stack(vjust = 0.5),              size = 4) +   labs(title = "Distribución da poboación por nivel de estudos parroquía Cambados",        fill = "Nivel Educativo") +   scale_fill_brewer(palette = "Pastel1") #Gráfico de sectores 

################################################

Mapa parroquias baixos estudos.

O código que se utiliza para o mapa precisa das seguintes librarías. Na primeira parte optimizase a parte de calcular cada parte de parroquia por separado e faise todo xunto. Logo faise unha tradución dos códigos aos que ten asociado o mapa.

################################################
library(sf)
library(ggplot2)
library(dplyr)

totais  <- table(datosbos$`Cod. Parroquia`) #Táboa frecuencias Parroquias
estudosbaixosactuais <- datosbos[datosbos$estudos=="Baixos ou sen estudos",]
baixos  <- table(estudosbaixosactuais$`Cod. Parroquia`)
porcentaxes_baixos <- round(100 * (as.vector(baixos) / as.vector(totais)), 1)
codigos_limpos <- as.numeric(names(totais)) / 100000
datos_estudos_mapa <- data.frame(id_simplificado = codigos_limpos, porcentaxe = porcentaxes_baixos)
traductor_codigos <- c(
  "1" = 3600601, 
  "2" = 3600602, 
  "3" = 3600603, 
  "4" = 3600604, 
  "5" = 3600605
)
datos_estudos_mapa$id_oficial <- as.numeric(traductor_codigos[as.character(datos_estudos_mapa$id_simplificado)])
mapa_cambados <- st_read("Parroquias.shp")
## Reading layer `Parroquias' from data source 
##   `C:\Users\IVAN\Downloads\PRACTICAS CAMBADOS\carpetarstudio\Parroquias.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 3791 features and 13 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 475443.4 ymin: 4628906 xmax: 686706.1 ymax: 4849646
## Projected CRS: ETRS89 / UTM zone 29N
mapa_final <- mapa_cambados %>%
  filter(CodCONC == 36006) %>% 
  left_join(datos_estudos_mapa, by = c("CodPARRO" = "id_oficial"))
################################################

É importante que o código anterior se poda executar, por ter a librería de parroquía descargada, para realizar agora o mapa. No documento de Latex aparece referenciada.

################################################
ggplot(data = mapa_final) +
geom_sf(aes(fill = porcentaxe), color = "white", size = 0.5) +
# Escala de vermellos: as parroquias con maior porcentaxe son dunha tonalidade máis escura.
scale_fill_distiller(palette = "Reds", direction = 1,
labels = function(x) paste0(x, "%")) +
theme_minimal() +

geom_sf_text(aes(label = Parroquia), size = 1.5, fontface = "bold", check_overlap = TRUE) +
labs(
title = "Porcentaxes de poboación con baixos estudos en Cambados",
subtitle = "Distribución porcentual por parroquias",
fill = "% Baixos Estudos",
caption = "Gráfico mapa con cores"
) +
theme(
axis.text = element_blank(),
axis.title = element_blank(),
panel.grid = element_blank(),
plot.title = element_text(face = "bold", size = 14)
)

################################################

RELACION PARROQUIA NIVEL DE ESTUDOS.

CÓDIGO CÁLCULOS

Neste apartado comézase co cálculo da táboa de continxencia e da matriz Eij para sacar o valor de D.

###########################################
Nij = table ( datosbos$`C. INE` , datosbos$`Cod. Parroquia` ) # centro táboa
n = sum ( Nij ) # Total
Ni. <- table(datosbos$`C. INE` ) # Marxinal dereita
N.j <- table(datosbos$`Cod. Parroquia`) # Marxinal abaixo
Eij= Ni.%*%t(N.j)/ n # Producto matricial con trasposta
D = sum((Nij-Eij)^2/Eij) # D =650.4665
D
## [1] 650.4665
qchisq ( p = 0.99 , df = 52) # 78.61576
## [1] 78.61576
pchisq ( q = D , df = 52) # 1
## [1] 1
#############################################

TÁBOAS Nij, Eij E RESIDUOS

Táboa Nij

Para mostrar as táboas úsase o seguinte código acompañado de kable para que as táboas salgan cun tamaño modificado e poidan entrar ao compilalas.

#install.packages("knitr") #Instala se non o tes
library(knitr)
taboa_Nij <- kable(addmargins(Nij))
taboa_Nij
1e+05 2e+05 3e+05 4e+05 5e+05 Sum
10 67 9 12 4 15 107
20 951 235 189 53 279 1707
21 9 3 1 0 2 15
22 473 133 194 35 159 994
30 725 68 235 19 104 1151
31 539 328 429 57 325 1678
32 239 107 109 25 103 583
40 600 65 148 16 87 916
41 377 98 140 19 117 751
42 333 72 91 15 83 594
44 70 26 34 1 23 154
45 10 3 2 0 5 20
46 492 51 121 11 86 761
48 167 22 34 6 34 263
Sum 5052 1220 1739 261 1422 9694

Táboa Eij

taboa_Eij <- kable(addmargins(Eij))
taboa_Eij
1e+05 2e+05 3e+05 4e+05 5e+05 Sum
10 55.762740 13.466062 19.194657 2.8808541 15.695688 107
20 889.598102 214.827729 306.217557 45.9590468 250.397566 1707
21 7.817207 1.887766 2.690840 0.4038581 2.200330 15
22 518.020219 125.095936 178.312977 26.7623272 145.808541 994
30 599.840314 144.854549 206.477099 30.9893749 168.838663 1151
31 874.484836 211.178048 301.015267 45.1782546 246.143594 1678
32 303.828760 73.371157 104.583969 15.6966165 85.519497 583
40 477.370745 115.279554 164.320611 24.6622653 134.366825 916
41 391.381473 94.514133 134.721374 20.2198267 110.163194 751
42 309.561378 74.755519 106.557252 15.9927790 87.133072 594
44 80.256654 19.381060 27.625954 4.1462760 22.590056 154
45 10.422942 2.517021 3.587786 0.5384774 2.933774 20
46 396.592944 95.772643 136.515267 20.4890654 111.630081 761
48 137.061688 33.098824 47.179389 7.0809779 38.579121 263
Sum 5052.000000 1220.000000 1739.000000 261.0000000 1422.000000 9694

Táboa residuos

taboa_residuos<-kable(Nij-Eij) 
taboa_residuos
1e+05 2e+05 3e+05 4e+05 5e+05
10 11.237260 -4.4660615 -7.194656 1.1191459 -0.6956881
20 61.401898 20.1722715 -117.217557 7.0409532 28.6024345
21 1.182794 1.1122344 -1.690840 -0.4038581 -0.2003301
22 -45.020219 7.9040644 15.687023 8.2376728 13.1914586
30 125.159686 -76.8545492 28.522901 -11.9893749 -64.8386631
31 -335.484836 116.8219517 127.984733 11.8217454 78.8564060
32 -64.828760 33.6288426 4.416030 9.3033835 17.4805034
40 122.629255 -50.2795544 -16.320611 -8.6622653 -47.3668248
41 -14.381473 3.4858675 5.278626 -1.2198267 6.8368063
42 23.438622 -2.7555189 -15.557252 -0.9927790 -4.1330720
44 -10.256654 6.6189396 6.374046 -3.1462760 0.4099443
45 -0.422942 0.4829792 -1.587786 -0.5384774 2.0662265
46 95.407056 -44.7726429 -15.515267 -9.4890654 -25.6300805
48 29.938312 -11.0988240 -13.179389 -1.0809779 -4.5791211

MIRADA AO PASADO

FILTRADO DE DATOS

Para recoller a xente fai 10 anos tense que facer o seguinte código.

#################################################
datos$ano_movemento<-as.POSIXlt(datos$`Fecha Efectiva`)$year + 1900 #Ano movemento
datos_decada_pasada<-datos[datos$ano_movemento<=2016,] #Collemos movementos anteriores a 2017.
datos_ultimos_decada_pasada<-datos_decada_pasada[!duplicated(datos_decada_pasada$NIA,fromLast = TRUE),] #Recollemos só os últimos movementos
datos_persoas_antigo<-datos_ultimos_decada_pasada[datos_ultimos_decada_pasada$C.Var.!="B",] #Quitar as persoas no grupo B ( mortes , emigrados oudesactualizados )
summary(datos_persoas_antigo) #14573 persoas
##      C. INE         C.Var.           Cod. Lugar.       Cod. Mov         Cod. Pais Nac. 
##  Min.   : 0.00   Length:14573       Min.   :101601   Length:14573       Min.   :101.0  
##  1st Qu.:20.00   Class :character   1st Qu.:101601   Class :character   1st Qu.:108.0  
##  Median :20.00   Mode  :character   Median :101601   Mode  :character   Median :108.0  
##  Mean   :23.22                      Mean   :224547                      Mean   :117.9  
##  3rd Qu.:31.00                      3rd Qu.:307201                      3rd Qu.:108.0  
##  Max.   :48.00                      Max.   :517801                      Max.   :437.0  
##                                                                         NA's   :3      
##  Cod. Parroquia      F. Alta                        F. Nacimiento                   
##  Min.   :100000   Min.   :1974-11-24 00:00:00.000   Min.   :1900-04-15 00:00:00.00  
##  1st Qu.:100000   1st Qu.:1996-05-01 00:00:00.000   1st Qu.:1956-04-14 18:00:00.00  
##  Median :100000   Median :1996-05-01 00:00:00.000   Median :1973-07-19 12:00:00.00  
##  Mean   :219811   Mean   :2001-08-23 12:49:09.564   Mean   :1973-04-12 18:45:45.20  
##  3rd Qu.:300000   3rd Qu.:2007-07-21 00:00:00.000   3rd Qu.:1990-11-04 12:00:00.00  
##  Max.   :500000   Max.   :2025-09-22 00:00:00.000   Max.   :2021-07-15 00:00:00.00  
##                                                     NA's   :1                       
##    F.Ult.Mov.                     Fecha Efectiva                  
##  Min.   :1996-05-01 00:00:00.00   Min.   :1985-01-10 00:00:00.00  
##  1st Qu.:2013-01-31 00:00:00.00   1st Qu.:2013-01-31 00:00:00.00  
##  Median :2016-09-30 00:00:00.00   Median :2016-09-07 00:00:00.00  
##  Mean   :2015-06-13 16:39:41.39   Mean   :2014-12-18 08:58:31.80  
##  3rd Qu.:2016-09-30 00:00:00.00   3rd Qu.:2016-09-30 00:00:00.00  
##  Max.   :2026-07-21 00:00:00.00   Max.   :2016-12-31 00:00:00.00  
##                                                                   
##    Fecha Mod.                          NIA               Sexo       ano_movemento 
##  Min.   :1996-05-01 00:00:00.00   Min.   :      1   Min.   :1.000   Min.   :1985  
##  1st Qu.:2013-01-31 00:00:00.00   1st Qu.:   5743   1st Qu.:1.000   1st Qu.:2013  
##  Median :2016-09-30 00:00:00.00   Median :  11168   Median :6.000   Median :2016  
##  Mean   :2015-04-12 11:54:13.17   Mean   :  63556   Mean   :3.569   Mean   :2014  
##  3rd Qu.:2016-09-30 00:00:00.00   3rd Qu.:  17376   3rd Qu.:6.000   3rd Qu.:2016  
##  Max.   :2026-07-21 00:00:00.00   Max.   :1010324   Max.   :6.000   Max.   :2016  
## 
#################################################

GRÁFICO

A creación da táboa e o gráfico de barras e semellante aos xa creados anteriormente.

#################################################
taboa_decada_pasada<-table(datos_persoas_antigo$`C. INE`)
barplot(taboa_decada_pasada , main = "Poboación por grupos de estudos fai 10 anos " , xlab = " Niveis de estudos " , ylab = "Número de Habitantes " , ylim = c (0 ,6000) , col="steelblue" ,las=1 , cex.names = 0.7)

#################################################

INMIGRANTES

VERIFICAR QUE EXISTE RELACION CO NIVEL DE ESTUDOS

Filtrado de datos

No filtrado para ver se existe relación vanse recoller só aos inmigrantes extranseiros.

###########################################
inmi<-datos_persoas_antigo[datos_persoas_antigo$`Cod. Pais Nac.`!=108,] #Só extranseiros
taboainmi<-table(inmi$`Cod. Pais Nac.`,inmi$`C. INE`) #Táboa
###########################################

Estudo matemático

Fanse os cálculos como previamente.

#################################################
Nij = taboainmi
n = sum ( Nij ) # Total
Ni. <- table(inmi$`Cod. Pais Nac.` ) # Marxinal dereita
N.j <- table(inmi$`C. INE`) # Marxinal abaixo
Eij= Ni.%*%t(N.j)/ n # Producto matricial con trasposta
k=length(Ni.) #27
r=length(N.j) #12
D = sum((Nij-Eij)^2/Eij) # D=453.7664
graos=(k-1)*(r-1)#286
D
## [1] 1050.971
graos
## [1] 770
qchisq ( p = 0.99 , df = graos) # 344.5604
## [1] 864.2226
pchisq ( q = D , df = graos ) # 1
## [1] 1
#################################################

Táboa residuos

Crease a táboa igual que no apartado 4. Debese ter compilado previamente os dous códigos. Se non compila revisa a libraría usada nunha anterior táboa.

#################################################
kable(Nij-Eij)
0 10 20 21 22 30 31 32 40 41 42 44 45 46 48
101 -0.3371869 -0.1637765 2.4971098 -0.0144509 -0.4431599 -1.1560694 -0.2023121 -0.0722543 -0.6840077 -0.1637765 -0.1011561 -0.0385356 -0.0048170 0.9132948 -0.0289017
102 -0.0674374 -0.0327553 -0.3005780 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 0.8631985 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
103 -1.4161850 -0.6878613 -3.3121387 -0.0606936 -0.8612717 5.1445087 1.1502890 -0.3034682 0.1271676 1.3121387 -0.4248555 -0.1618497 -0.0202312 -0.3641618 -0.1213873
104 0.9094412 0.9845857 0.6820809 -0.0895954 1.2524085 2.8323699 -1.2543353 0.5520231 -3.2408478 -1.0154143 -0.6271676 -0.2389210 -0.0298651 -0.5375723 -0.1791908
107 -0.0674374 -0.0327553 -0.3005780 -0.0028902 -0.0886320 0.7687861 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
110 0.9094412 -0.0154143 -2.3179191 -0.0895954 -2.7475915 3.8323699 0.7456647 -0.4479769 -1.2408478 -0.0154143 -0.6271676 1.7610790 -0.0298651 0.4624277 -0.1791908
112 -0.0674374 -0.0327553 -0.3005780 -0.0028902 0.9113680 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
113 -0.2023121 -0.0982659 -0.9017341 -0.0086705 -0.2658960 -0.6936416 -0.1213873 -0.0433526 1.5895954 -0.0982659 -0.0606936 -0.0231214 -0.0028902 0.9479769 -0.0173410
115 -0.6184971 -0.7861272 -1.2138728 -0.0693642 -0.1271676 -1.5491329 2.0289017 -0.3468208 2.7167630 -0.7861272 0.5144509 -0.1849711 -0.0231214 -0.4161850 0.8612717
117 -0.0674374 -0.0327553 -0.3005780 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 -0.1368015 0.9672447 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
121 -0.0789981 0.4759152 -3.8092486 -0.0462428 -0.4181118 -1.6994220 0.3526012 -0.2312139 3.8111753 1.4759152 -0.3236994 0.8766859 -0.0154143 -0.2774566 -0.0924855
122 -0.0674374 -0.0327553 -0.3005780 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 0.8631985 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
123 -2.3275530 6.4123314 15.2543353 -0.2283237 -3.0019268 -1.2658960 -2.1965318 -0.1416185 -6.8073218 -1.5876686 -1.5982659 -0.6088632 -0.0761079 -1.3699422 -0.4566474
125 -0.8766859 -0.4258189 -1.9075145 -0.0375723 -0.1522158 0.9942197 -0.5260116 -0.1878613 2.2215800 -0.4258189 -0.2630058 -0.1001927 -0.0125241 1.7745665 -0.0751445
126 -3.3506744 -2.5703276 -9.7630058 -0.3150289 -5.6608863 0.7976879 9.5895954 2.4248555 6.0886320 5.4296724 -1.2052023 -0.8400771 0.8949904 -0.8901734 -0.6300578
127 0.3256262 1.6724470 -2.0057803 -0.0289017 -0.8863198 1.6878613 -0.4046243 -0.1445087 0.6319846 -0.3275530 -0.2023121 -0.0770713 -0.0096339 -0.1734104 -0.0578035
128 4.9768786 2.0173410 -3.0173410 -0.0867052 4.3410405 -2.9364162 -1.2138728 0.5664740 -3.1040462 0.0173410 -0.6069364 -0.2312139 -0.0289017 -0.5202312 -0.1734104
131 -0.2697495 -0.1310212 -0.2023121 -0.0115607 -0.3545279 0.0751445 -0.1618497 -0.0578035 0.4527938 -0.1310212 -0.0809249 -0.0308285 -0.0038536 0.9306358 -0.0231214
132 -0.1579961 -1.0481696 -4.6184971 -0.0924855 -0.8362235 -3.3988439 5.7052023 0.5375723 0.6223507 0.9518304 2.3526012 -0.2466281 -0.0308285 0.4450867 -0.1849711
133 -0.2023121 -0.0982659 -0.9017341 0.9913295 0.7341040 -0.6936416 -0.1213873 -0.0433526 0.5895954 -0.0982659 -0.0606936 -0.0231214 -0.0028902 -0.0520231 -0.0173410
139 -0.0674374 -0.0327553 -0.3005780 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 0.8631985 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
141 -0.0674374 0.9672447 -0.3005780 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
144 -0.1348748 -0.0655106 -0.6011561 -0.0057803 -0.1772640 1.5375723 -0.0809249 -0.0289017 -0.2736031 -0.0655106 -0.0404624 -0.0154143 -0.0019268 -0.0346821 -0.0115607
154 -0.0674374 -0.0327553 -0.3005780 -0.0028902 0.9113680 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
203 -0.1348748 -0.0655106 0.3988439 -0.0057803 -0.1772640 -0.4624277 -0.0809249 -0.0289017 0.7263969 -0.0655106 -0.0404624 -0.0154143 -0.0019268 -0.0346821 -0.0115607
210 -0.0674374 -0.0327553 -0.3005780 -0.0028902 -0.0886320 0.7687861 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
211 -0.0674374 -0.0327553 0.6994220 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
214 -0.0674374 -0.0327553 -0.3005780 -0.0028902 0.9113680 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
220 -0.0674374 -0.0327553 0.6994220 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
228 0.8978805 -0.5067437 7.1734104 0.8670520 2.9229287 -1.6358382 -1.8612717 -0.6647399 -3.2928709 -1.5067437 -0.9306358 -0.3545279 -0.0443160 -0.7976879 -0.2658960
234 -0.0674374 -0.0327553 -0.3005780 -0.0028902 0.9113680 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
239 -1.0115607 -0.4913295 2.4913295 -0.0433526 2.6705202 0.5317919 -0.6069364 -0.2167630 -2.0520231 -0.4913295 -0.3034682 -0.1156069 -0.0144509 -0.2601156 -0.0867052
241 -0.1348748 -0.0655106 0.3988439 -0.0057803 0.8227360 -0.4624277 -0.0809249 -0.0289017 -0.2736031 -0.0655106 -0.0404624 -0.0154143 -0.0019268 -0.0346821 -0.0115607
302 -1.0789981 0.4759152 -0.8092486 -0.0462428 0.5818882 -3.6994220 0.3526012 0.7687861 0.8111753 0.4759152 -0.3236994 -0.1233141 -0.0154143 0.7225434 1.9075145
303 -0.3371869 -0.1637765 -1.5028902 -0.0144509 2.5568401 -1.1560694 -0.2023121 -0.0722543 1.3159923 -0.1637765 -0.1011561 -0.0385356 -0.0048170 -0.0867052 -0.0289017
315 -0.4720617 -0.2292871 -1.1040462 -0.0202312 -0.6204239 1.3815029 -0.2832370 -0.1011561 2.0423892 -0.2292871 -0.1416185 -0.0539499 -0.0067437 -0.1213873 -0.0404624
317 -0.1348748 -0.0655106 -0.6011561 -0.0057803 0.8227360 -0.4624277 -0.0809249 -0.0289017 -0.2736031 -0.0655106 0.9595376 -0.0154143 -0.0019268 -0.0346821 -0.0115607
321 -0.2023121 -0.0982659 0.0982659 -0.0086705 -0.2658960 1.3063584 -0.1213873 -0.0433526 -0.4104046 -0.0982659 -0.0606936 -0.0231214 -0.0028902 -0.0520231 -0.0173410
323 1.3256262 -0.3275530 -2.0057803 -0.0289017 -0.8863198 0.6878613 -0.4046243 -0.1445087 2.6319846 -0.3275530 -0.2023121 -0.0770713 -0.0096339 -0.1734104 -0.0578035
326 2.4489403 -0.7533719 4.0867052 -0.0664740 -1.0385356 -1.3179191 -0.9306358 -0.3323699 -0.1464355 -0.7533719 -0.4653179 -0.1772640 -0.0221580 -0.3988439 -0.1329480
340 -3.3949904 0.3795761 3.9537572 -0.2312139 -3.0905588 3.5028902 -3.2369942 -1.1560694 2.0558767 1.3795761 0.3815029 -0.6165703 -0.0770713 -0.3872832 0.5375723
341 -0.0674374 -0.0327553 -0.3005780 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 0.8631985 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
342 3.5048170 -0.2119461 -2.1213873 -0.1069364 1.7206166 -6.5549133 -1.4971098 -0.5346821 7.9383430 -1.2119461 -0.7485549 -0.2851638 -0.0356455 0.3583815 -0.2138728
343 -1.9672447 -0.4412331 1.7745665 0.8728324 -0.8998073 -1.1734104 -0.7803468 1.3641618 2.9807322 -0.4412331 -0.8901734 0.6608863 -0.0423892 -0.7630058 -0.2543353
344 -0.0674374 -0.0327553 0.6994220 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
345 -0.4046243 -0.1965318 1.1965318 -0.0173410 0.4682081 -1.3872832 -0.2427746 -0.0867052 0.1791908 -0.1965318 0.8786127 -0.0462428 -0.0057803 -0.1040462 -0.0346821
347 0.3256262 -0.3275530 -1.0057803 -0.0289017 3.1136802 -1.3121387 0.5953757 -0.1445087 -1.3680154 0.6724470 -0.2023121 -0.0770713 -0.0096339 -0.1734104 -0.0578035
348 5.5240848 -2.0597303 5.3930636 -0.5346821 -2.3969171 18.2254335 -1.4855491 -0.6734104 -24.3082852 -0.0597303 3.2572254 -0.4258189 -0.1782274 -0.2080925 -0.0693642
350 -0.9556840 -0.9499037 7.2832370 -0.0838150 0.4296724 -0.7052023 -1.1734104 -0.4190751 -1.9672447 0.0500963 -0.5867052 -0.2235067 -0.0279383 -0.5028902 -0.1676301
351 -2.4508671 0.8381503 -9.8381503 -0.1907514 -4.8497110 -2.2601156 0.3294798 1.0462428 8.9710983 -1.1618497 3.6647399 2.4913295 -0.0635838 2.8554913 0.6184971
404 -0.0674374 -0.0327553 0.6994220 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
407 0.9210019 -0.5240848 2.1907514 -0.0462428 5.5818882 -3.6994220 -0.6473988 -0.2312139 -2.1888247 -0.5240848 -0.3236994 -0.1233141 -0.0154143 -0.2774566 -0.0924855
410 -0.0674374 -0.0327553 -0.3005780 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 0.8631985 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
411 -0.0674374 -0.0327553 0.6994220 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 -0.1368015 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
433 -0.0674374 -0.0327553 -0.3005780 -0.0028902 -0.0886320 -0.2312139 -0.0404624 -0.0144509 0.8631985 -0.0327553 -0.0202312 -0.0077071 -0.0009634 -0.0173410 -0.0057803
437 1.8651252 -0.0655106 -0.6011561 -0.0057803 -0.1772640 -0.4624277 -0.0809249 -0.0289017 -0.2736031 -0.0655106 -0.0404624 -0.0154143 -0.0019268 -0.0346821 -0.0115607
#################################################

REGRESIÓN ESTUDOS E INMIGRACIÓN

Filtrado de datos

Este filtrado é o máis denso polo que vaise realizar en dúas partes. Primeiro faise unha columna que teña o ano da modificación feita e se definen varios vectores vacios. Faise co valor 30 porque é a cantidade de anos que imos a avaliar. As outras categorías que están comentadas foron outras variables que probei por se o lector quixese indagar máis.

#################################################
datos$ano_base<-as.POSIXlt(datos$`Fecha Efectiva`)$year+1900 
numerohabitantesano<-numeric(30)
inmigrantes<-numeric(30)
#inmigrantesp<-numeric(30) #Inmigrantes de todo o mundo (España incluido) última modificación chegar.
#inmigrantest<-numeric(30) #Inmigrantes fóra de España que a última modificación foi chegar.
estudosbaixos<-numeric(30)
#persoaslistas<-numeric(30) #Nivel de estudos alto.
#inmigrantes_europa<-numeric(30) #Inmigrantes Europa (sen España)
#inmigrantes_africa<-numeric(30) #Inmigrantes África
#inmigrantes_sudamerica<-numeric(30) #Inmigrantes Sudamérica.
#inmigrantes_baixos<-numeric(30) #Inmigrantes Sudamérica e África.
#################################################

Agora faise un bucle no que se vai avanzando ano a ano e se producen os cálculos de cada elemento dos vectores. Se descomentouse algún numeric descomenta o código asociado aqui.

#################################################
for (i in 0:30){
  datos_antigos<-datos[datos$ano_base<=1996+i,] #Datos en x ano e anteriores.
  datos_limpos_antigos <- datos_antigos[!duplicated(datos_antigos$NIA,fromLast = TRUE),] #Quitar datos duplicados
  datos_persoas_antigos <- datos_limpos_antigos[datos_limpos_antigos$C.Var.!="B",] #Quitar xente no CVAR=B.
  numerohabitantesano[i]<-nrow(datos_persoas_antigos) #Numero de persoas ano
  ano_persoa<-as.POSIXlt(datos_persoas_antigos$`F. Nacimiento`)$year + 1900 #Ano nacemento
  datos_persoas_antigos$edad<-(1996+i)-ano_persoa #
  datos_persoas_antigos<-datos_persoas_antigos[!is.na(datos_persoas_antigos$`Cod. Pais Nac.`) ,]
  #datos_persoas_antigos<-datos_persoas_antigos[datos_persoas_antigos$edad>=18 ,]
  datos_persoas_antigos<-datos_persoas_antigos[!is.na(datos_persoas_antigos$`Cod. Mov`) ,]
  inmigrantes[i]<-sum(datos_persoas_antigos$`Cod. Pais Nac.`!=108)
  #inmigrantesp[i]<-sum(datos_persoas_antigos$`Cod. Mov`=="CR") 
  #inmigrantest[i]<-sum(datos_persoas_antigos$`Cod. Pais Nac.`!=108 & datos_persoas_antigos$`Cod. Mov`=="CR")
  estudosbaixos[i]<-sum(datos_persoas_antigos$`C. INE`>=10 & datos_persoas_antigos$`C. INE`<=22)
  #persoaslistas[i]<-sum(datos_persoas_antigos$`C. INE`>=40)
  #inmigrantes_europa[i]<-sum(datos_persoas_antigos$`Cod. Pais Nac.`<=144 & datos_persoas_antigos$`Cod. Pais Nac.`!=108)
  #inmigrantes_africa[i]<-sum(datos_persoas_antigos$`Cod. Pais Nac.`>=203 & datos_persoas_antigos$`Cod. Pais Nac.`<=241)
  #inmigrantes_sudamerica[i]<-sum(datos_persoas_antigos$`Cod. Pais Nac.`>=303 & datos_persoas_antigos$`Cod. Pais Nac.`<=351)
  #inmigrantes_baixos[i]<-sum(datos_persoas_antigos$`Cod. Pais Nac.`>=303 & datos_persoas_antigos$`Cod. Pais Nac.`<=351 & datos_persoas_antigos$`C. INE`>=10 & datos_persoas_antigos$`C. INE`<=22)

}
#################################################

Cálculos previos regresión lineal inmigrantes e baixos estudos

Fanse os cálculos previos.

###########################################
x=inmigrantes 
y=estudosbaixos 
n=length(x) #Número de valores
modelo=lm(y~x) #Cálculo modelo lineal.
modelo #Beta0gorro Beta1gorro
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##   12784.781       -4.192
modelo$residuals #Residuos da aproximación de cada elemento
##          1          2          3          4          5          6          7          8 
## -1027.5954  -825.1826  -689.5780  -466.6013  -330.5432   119.5729   245.9450   484.0728 
##          9         10         11         12         13         14         15         16 
##   875.0669  1385.9912  1828.7933  2167.4037  2338.9559  2361.8745  1901.3280  1811.7000 
##         17         18         19         20         21         22         23         24 
##  1229.0664  -971.7418 -1182.1255 -1785.6313 -1739.1488 -1760.4337 -1624.6896 -1700.0443 
##         25         26         27         28         29         30 
## -1656.3699 -1221.0445  -770.4866  -226.3240   404.9083   822.8617
sigma2.gorro=sum(modelo$residuals^2)/(n-2) #Cálculo varianza método.
sigma2.gorro #s^2
## [1] 1997805
sqrt(sigma2.gorro) #Desviación típica 
## [1] 1413.437
cor(x,y) #Coeficiente correlación de Pearson 
## [1] -0.7934764
cor(x,y)^2 #Coeficiente R^2 
## [1] 0.6296048
###########################################

Gráfico regresión lineal inmigrantes e estudos baixos

A partir dos datos faise o gráfico. Cambiando os x e y dos cálculos e os límites pódense facer as gráficas coas outras categorías.

###########################################
plot(x, y, pch=19, xlab="Número de inmigrantes", ylab="Persoas con estudos baixos",xlim=c(0,2000), ylim=c(0,12000), main="Comparativa inmigrantes e persoas con baixos estudos",las=1) #Debuxo puntos.
abline(modelo, lwd=2, col="blue") #Recta regresión

###########################################

Ver que o gráfico non cumpre linealidade

Co test de Harvey vemos se existe linealidade. Se non compila executar de novo ou ver se se ten o paquete instalado.

###########################################
#install.packages("lmtest")
library(lmtest)
# Test de Harvey-Collier
# H0: Linealidade modelo.
harvtest(modelo, order.by = ~ x)#p-valor=0.007009
## 
##  Harvey-Collier test
## 
## data:  modelo
## HC = 2.9185, df = 27, p-value = 0.007009
###########################################

REGRESIÓN CO TEMPO

Regresión inmigrantes e tempo

Fanse os cálculos previos cambiando x e y.

###########################################
x=1997:2026 #Anos de cada recollida de datos variable independente
y=inmigrantes #Inmigrantes variable dependente
n=length(x) #Número de valores.

modelo=lm(y~x) #Cálculo modelo lineal.
modelo #Valor de beta0gorro e beta1gorro
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##   -93878.90        47.15
modelo$residuals #Residuos da aproximación de cada elemento
##           1           2           3           4           5           6           7           8 
##   -3.984946  -28.133111  -51.281275  -46.429440  -51.577605  -14.725769  -33.873934  -23.022099 
##           9          10          11          12          13          14          15          16 
##   28.829737   64.681572  115.533407  165.385243  173.237078  136.088914  106.940749   87.792584 
##          17          18          19          20          21          22          23          24 
##   -4.355580  -50.503745  -99.651910 -133.800074 -141.948239 -154.096403 -145.244568 -173.392733 
##          25          26          27          28          29          30 
## -180.540897  -95.689062  -14.837227   90.014609  210.866444  267.718280
sigma2.gorro=sum(modelo$residuals^2)/(n-2) #Cálculo varianza método.
sigma2.gorro #s^2
## [1] 14828.86
sqrt(sigma2.gorro) #Desviación típica 
## [1] 121.7738
cor(x,y) #Coeficiente correlación de Pearson 
## [1] 0.9608694
cor(x,y)^2 #Coeficiente R^2 
## [1] 0.92327
###########################################

Créase o gráfico:

###########################################
plot(x, y, pch=19, xlab="Ano", ylab="Inmigrantes",xlim=c(1996,2027), ylim=c(0,3000), main="Variación inmigrantes ao longo do tempo") #Debuxo puntos.
abline(modelo, lwd=2, col="blue") #Recta reegresión

###########################################

Compróbase que cumple as hipóteses.

###########################################
# Test de Harvey-Collier
# H0: Linealidade modelo.
harvtest(modelo, order.by = ~ x)#p-valor
## 
##  Harvey-Collier test
## 
## data:  modelo
## HC = 0.31215, df = 27, p-value = 0.7573
# Aceptamos H0.
# Test de Breusch-Pagan
# H0: Residuos son homocedásticos (varianza constante)
bptest(modelo) #p-valor
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo
## BP = 11.226, df = 1, p-value = 0.0008065
#install.packages("sandwich")
library(sandwich)
# Obter un resumo do modelo cos p-valores correxidos para a heterocedasticidade
coeftest(modelo, vcov = vcovHC(modelo, type = "HC3")) #pvalores moi pequenos
## 
## t test of coefficients:
## 
##                Estimate  Std. Error t value  Pr(>|t|)    
## (Intercept) -93878.8998   5996.2773 -15.656 2.227e-15 ***
## x               47.1482      2.9888  15.775 1.841e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Test de Durbin-Watson
# H0: Los residuos son independientes (autocorrelación igual a cero)
dwtest(modelo) #p-valor
## 
##  Durbin-Watson test
## 
## data:  modelo
## DW = 0.1749, p-value = 2.116e-15
## alternative hypothesis: true autocorrelation is greater than 0
# Test de Shapiro-Wilk 
# H0: Los residuos siguen una distribución normal
shapiro.test(modelo$residuals) #p-valor
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 0.95969, p-value = 0.3041
###########################################

Aquí fanse os 4 test para mirar as hipóteses da regresión. Ademais, míranse as significacións dos estimadores para poder argumentar contra ao test de homocedasticidade. No documento de Latex redáctase sobre isto.

### Regresión estudos baixos e tempo

Análogo ao anterior.

###########################################
x=1997:2026 #Anos de cada recollida de datos variable independente
y=estudosbaixos #Persoas baixos estudos
n=length(x) #Número de valores
modelo=lm(y~x) #Cálculo modelo lineal.
modelo #Valor de beta0gorro e beta1gorro
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##    482540.9       -235.5
modelo$residuals #Residuos da aproximación de cada elemento
##           1           2           3           4           5           6           7           8 
## -1560.39140 -1218.85636  -948.32132  -707.78628  -512.25124  -178.71620    65.81884   296.35387 
##           9          10          11          12          13          14          15          16 
##   507.88891   906.42395  1173.95899  1341.49403  1518.02907  1734.56411  1434.09915  1462.63419 
##          17          18          19          20          21          22          23          24 
##  1304.16923  -665.29574  -631.76070 -1054.22566  -935.69062  -868.15558  -731.62054  -651.08550 
##          25          26          27          28          29          30 
##  -539.55046  -422.01542  -272.48039  -129.94535    32.58969   250.12473
sigma2.gorro=sum(modelo$residuals^2)/(n-2) #Cálculo varianza método.
sigma2.gorro #s^2
## [1] 940712.8
sqrt(sigma2.gorro) #Desviación típica s
## [1] 969.9035
cor(x,y) #Coeficiente correlación de Pearson 
## [1] -0.9086203
cor(x,y)^2 #Coeficiente R^2 
## [1] 0.8255909
###########################################
###########################################
plot(x, y, pch=19, xlab="Ano", ylab="Persoas estudos baixos",xlim=c(1996,2027), ylim=c(0,11000), main="Variación persoas con estudos baixos ao longo do tempo") #Debuxo puntos.
abline(modelo, lwd=2, col="blue") #Recta regresión

###########################################

Agora non funciona ben a regresión lineal.

Regresión cuadrática e cúbica

Buscase usar regresión cuadrática ou cúbica.

###########################################
x=inmigrantes
y=estudosbaixos
orden <- order(x)
modelo_poli2 <- lm(y ~ poly(x, 2, raw = TRUE))
plot(x, y, pch = 16, col = "black", ylim=c(0,12000),main = "Ajuste Polinómico de Grao 2",)
lines(x[orden], predict(modelo_poli2)[orden], col ="blue", lwd = 3)

###########################################
###########################################
x=inmigrantes
y=estudosbaixos
orden <- order(x)
modelo_poli3 <- lm(y ~ poly(x, 3, raw = TRUE))
plot(x, y, pch = 16, col = "black", ylim=c(0,12000),main = "Ajuste Polinómico de Grao 3",)
lines(x[orden], predict(modelo_poli3)[orden], col = "blue", lwd = 3)

###########################################

EMIGRANTES

FILTRADO DE DATOS

Como en todos os anteriores faise un novo filtrado de datos. Neste realízase un filtrado case análogo ao de inmigrantes.

###########################################
emigrantes<-numeric(30)
emigrantes_listos<-numeric(30)
for (i in 0:30){
datos_antigos<-datos[datos$ano_base==1996+i,] 
datos_limpos_antigos <- datos_antigos[!duplicated(datos_antigos$NIA,fromLast = TRUE),]
ano_persoa<-as.POSIXlt(datos_limpos_antigos$`F. Nacimiento`)$year + 1900
datos_limpos_antigos$edad<-(1996+i)-ano_persoa
datos_limpos_antigos<-datos_limpos_antigos[!is.na(datos_limpos_antigos$edad) ,]
datos_limpos_antigos<-datos_limpos_antigos[!is.na(datos_limpos_antigos$`Cod. Mov`) ,]
datos_limpos_antigos<-datos_limpos_antigos[!is.na(datos_limpos_antigos$`C.Var.`) ,]
emigrantes_datos<-datos_limpos_antigos[datos_limpos_antigos$C.Var.=="B" & datos_limpos_antigos$`Cod. Mov`=="CR",] 
emigrantes[i]<-sum(emigrantes_datos$edad<=65)
emigrantes_listos[i]<-sum(emigrantes_datos$edad<=65 & emigrantes_datos$`C. INE`>=40)
}
###########################################

REGRESIÓN LINEAL PORCENTAXE EMIGRANTES E ANOS

Nesta sección faise o porcentaxe de emigrantes con bos estudos e os emigrantes totais cada ano e vese como varia ese porcentaxe. Primeiro intenta facerse unha regresión lineal.

###########################################
porcentaxe_emigrantes<-(emigrantes_listos/emigrantes)*100
x=1997:2026
y=porcentaxe_emigrantes

modelo=lm(y~x) #Cálculo modelo lineal.
modelo #Valor de beta0gorro e beta1gorro
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##   -2959.733        1.481
modelo$residuals #Residuos da aproximación de cada elemento
##          1          2          3          4          5          6          7          8 
##  3.3622603  6.2125650  5.9631508  3.1502228  3.2491353  3.4381137 -0.6592290  3.5640609 
##          9         10         11         12         13         14         15         16 
## -1.0904516  0.8010924 -1.9225876 -7.7903555 -7.2119940 -4.9959429 -2.9628512 -6.3922033 
##         17         18         19         20         21         22         23         24 
## -8.5352494 -3.5503312 -5.9324945 -6.2006871  0.5519453  3.1322491  0.2260920  0.1057439 
##         25         26         27         28         29         30 
##  1.5595229 -1.3899305  0.7353517  9.8694009  3.1485479  9.5648527
sigma2.gorro=sum(modelo$residuals^2)/(n-2) #Cálculo varianza método.
sigma2.gorro #s^2
## [1] 24.88258
sqrt(sigma2.gorro) #Desviación típica s
## [1] 4.988244
cor(x,y) #Coeficiente correlación de Pearson 
## [1] 0.9360722
cor(x,y)^2 #Coeficiente R^2
## [1] 0.8762312
###########################################

Agora pásase ao gráfico.

###########################################
plot(x, y, xlab="Ano",ylab="Porcentaxe de persoas con bos estudos emigrantes",pch = 16,  col = "black", main = "Regresión lineal porcentaxe emigrantes e anos") #Puntos
abline(modelo, lwd=2, col="blue") #Recta reegresión

###########################################

Outra vez seméllase que non se cumpre a linealidade do modelo vexámolo:

###########################################
# Test de Harvey-Collier
# H0: Linealidade modelo.
harvtest(modelo, order.by = ~ x)#p-valor=0.006752
## 
##  Harvey-Collier test
## 
## data:  modelo
## HC = 2.9339, df = 27, p-value = 0.006752
#Prueba usar grado 2
resettest(modelo, power = 1:2, type = "fitted")
## 
##  RESET test
## 
## data:  modelo
## RESET = 26.785, df1 = 2, df2 = 26, p-value = 4.84e-07
###########################################

Este último comando de resettest serve para ver se un modelo (neste caso o cuadrático) é mellor que outro (o lineal neste caso). Neste caso da que sí polo que facemos a regresión cuadrática. Non se empregou en puntos anteriores pero evidentemente se podería. ## CAMBIO A REGRESIÓN CUADRÁTICA

###########################################
modelo_poli2 <- lm(y ~ poly(x, 2, raw = TRUE)) #Regresión grao 2
plot(x, y, xlab="Ano",ylab="Porcentaxe de persoas con bos estudos emigrantes",pch = 16,  col = "black", main = "Regresión de grao 2 porcentaxe emigrantes e anos") #Puntos
lines(x, predict(modelo_poli2), col = "blue", lwd = 3) #Pintar gráfico

###########################################

Aproxima moito mellor. Agora falta ver que os estimadores son significativos:

###########################################
summary(modelo_poli2)
## 
## Call:
## lm(formula = y ~ poly(x, 2, raw = TRUE))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.6372 -2.5473  0.3859  1.4203  5.0632 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              2.362e+05  3.207e+04   7.366 6.35e-08 ***
## poly(x, 2, raw = TRUE)1 -2.363e+02  3.188e+01  -7.412 5.66e-08 ***
## poly(x, 2, raw = TRUE)2  5.911e-02  7.925e-03   7.459 5.05e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.904 on 27 degrees of freedom
## Multiple R-squared:  0.9596, Adjusted R-squared:  0.9566 
## F-statistic: 320.3 on 2 and 27 DF,  p-value: < 2.2e-16
###########################################

Tamén pódese ver se cumpre as hipótesis do modelo:

###########################################
# Test de Harvey-Collier
# H0: Linealidade modelo.
resettest(modelo_poli2, power = 2:3, type = "fitted") #funciona ben
## 
##  RESET test
## 
## data:  modelo_poli2
## RESET = 1.3619, df1 = 2, df2 = 25, p-value = 0.2745
# Aceptamos H0.
# Test de Breusch-Pagan
# H0: Residuos son homocedásticos (varianza constante)
bptest(modelo_poli2) #p-valor
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_poli2
## BP = 0.6772, df = 2, p-value = 0.7128
#Rechazamos H0
#install.packages("sandwich")
library(sandwich)
# Test de Durbin-Watson
# H0: Os residuos son independentes (autocorrelación igual a cero)
dwtest(modelo_poli2) #p-valor
## 
##  Durbin-Watson test
## 
## data:  modelo_poli2
## DW = 1.7682, p-value = 0.1437
## alternative hypothesis: true autocorrelation is greater than 0
#Aceptamos H0
# Test de Shapiro-Wilk 
# H0: Os residuos seguen unha distribución normal
shapiro.test(modelo_poli2$residuals) #p-valor
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_poli2$residuals
## W = 0.95674, p-value = 0.2552
#Aceptamos H0
###########################################