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.
Neste primeiro apartado vaise mostrar como se filtraron os datos para o traballo do nivel de estudos de Cambados.
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
####################################################
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
####################################################
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.
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.
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
##
####################################################
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.
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.
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
##################################################
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.
##################################################
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)
##################################################
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")
##################################################
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
##################################################
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()
###########################################
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 .
######################################
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
################################################
################################################
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)
################################################
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)
################################################
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
################################################
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
################################################
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)
)
################################################
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
#############################################
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 |
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 |
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 |
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
##
#################################################
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)
#################################################
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
###########################################
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
#################################################
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 |
#################################################
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)
}
#################################################
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
###########################################
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
###########################################
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
###########################################
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.
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)
###########################################
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)
}
###########################################
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
###########################################