library(haven)
escuelas <- read_sas("CY08MSP_SCH_QQQ.SAS7BDAT", NULL)
View(escuelas)
tabla_frecuencias <- table(escuelas$CNT)
print(tabla_frecuencias)
##
## ALB ARE ARG AUS AUT BEL BGR BRA BRN CAN CHE CHL COL CRI CZE DEU DNK DOM ESP EST
## 274 840 457 743 302 285 202 598 54 863 260 230 262 198 430 257 347 253 966 196
## FIN FRA GBR GEO GRC GTM HKG HRV HUN IDN IRL ISL ISR ITA JAM JOR JPN KAZ KHM KOR
## 241 282 451 267 230 290 163 180 262 410 170 134 193 344 147 260 182 571 183 186
## KSV LTU LVA MAC MAR MDA MEX MKD MLT MNE MNG MYS NLD NOR NZL PAN PER PHL POL PRT
## 229 292 225 46 178 265 280 111 46 63 195 199 154 265 169 215 336 188 240 224
## PRY PSE QAT QAZ QUR ROU SAU SGP SLV SRB SVK SVN SWE TAP THA TUR URY USA UZB VNM
## 281 273 229 199 164 262 193 164 290 183 288 345 262 182 279 196 222 154 202 178
df <- as.data.frame(tabla_frecuencias)
colnames(df) = c("iso_a3","Frecuencia")
# Ver la matriz de frecuencias
print(df)
## iso_a3 Frecuencia
## 1 ALB 274
## 2 ARE 840
## 3 ARG 457
## 4 AUS 743
## 5 AUT 302
## 6 BEL 285
## 7 BGR 202
## 8 BRA 598
## 9 BRN 54
## 10 CAN 863
## 11 CHE 260
## 12 CHL 230
## 13 COL 262
## 14 CRI 198
## 15 CZE 430
## 16 DEU 257
## 17 DNK 347
## 18 DOM 253
## 19 ESP 966
## 20 EST 196
## 21 FIN 241
## 22 FRA 282
## 23 GBR 451
## 24 GEO 267
## 25 GRC 230
## 26 GTM 290
## 27 HKG 163
## 28 HRV 180
## 29 HUN 262
## 30 IDN 410
## 31 IRL 170
## 32 ISL 134
## 33 ISR 193
## 34 ITA 344
## 35 JAM 147
## 36 JOR 260
## 37 JPN 182
## 38 KAZ 571
## 39 KHM 183
## 40 KOR 186
## 41 KSV 229
## 42 LTU 292
## 43 LVA 225
## 44 MAC 46
## 45 MAR 178
## 46 MDA 265
## 47 MEX 280
## 48 MKD 111
## 49 MLT 46
## 50 MNE 63
## 51 MNG 195
## 52 MYS 199
## 53 NLD 154
## 54 NOR 265
## 55 NZL 169
## 56 PAN 215
## 57 PER 336
## 58 PHL 188
## 59 POL 240
## 60 PRT 224
## 61 PRY 281
## 62 PSE 273
## 63 QAT 229
## 64 QAZ 199
## 65 QUR 164
## 66 ROU 262
## 67 SAU 193
## 68 SGP 164
## 69 SLV 290
## 70 SRB 183
## 71 SVK 288
## 72 SVN 345
## 73 SWE 262
## 74 TAP 182
## 75 THA 279
## 76 TUR 196
## 77 URY 222
## 78 USA 154
## 79 UZB 202
## 80 VNM 178
world <- ne_countries(scale = "medium", returnclass = "sf")
world_datos <- world %>%
left_join(df, by = "iso_a3") %>% #O el nombre correcto de tu columna
mutate(Frecuencia = ifelse(is.na(Frecuencia), 0, Frecuencia))
ggplot(data = world_datos) +
geom_sf(aes(fill = Frecuencia)) +
scale_fill_gradient(low = "white", high = "red") +
theme_minimal() +
labs(title = "Valores por país (número escuelas)", fill = "Frecuencia")

load("estudiantesPISAfiltrados.R")
estudiantes <- datosPisaEstudiantes_filtrado
rm(datosPisaEstudiantes_filtrado)
tabla_frecuencias.es <- table(estudiantes$CNT)
print(tabla_frecuencias.es)
##
## ALB ARE ARG AUS AUT BEL BGR BRA BRN CAN CHE CHL COL
## 5087 22717 11274 12974 6012 7810 5616 9868 5535 20405 6710 5716 7342
## CRI CZE DEU DNK DOM ESP EST FIN FRA GBR GEO GRC HKG
## 5284 8268 5336 5757 6403 29727 6300 9889 6559 11345 5946 6282 5630
## HRV HUN IDN IRL ISL ISR ITA JAM JOR JPN KAZ KOR KSV
## 6054 6021 13253 5532 3169 5868 10455 3535 7283 5735 19688 6388 5582
## LTU LVA MAC MAR MDA MEX MKD MLT MNE MNG MYS NLD NOR
## 7118 5221 4381 6684 6102 6229 6150 2957 5585 6950 6984 4722 6186
## NZL PAN PER PHL POL PRT PSE QAT QAZ QUR ROU SAU SGP
## 4481 3897 6810 7118 5901 6683 7408 6876 6539 3597 7233 6630 6564
## SLV SRB SVK SVN SWE TAP THA TUR URY USA UZB
## 6261 6297 5586 6429 5868 5795 8410 7238 6297 4100 7066
df.es <- as.data.frame(tabla_frecuencias.es)
colnames(df.es) = c("iso_a3","Frecuencia.es")
world_datos <- world %>%
left_join(df.es, by = "iso_a3") %>% #O el nombre correcto de tu columna
mutate(Frecuencia.es = ifelse(is.na(Frecuencia.es), 0, Frecuencia.es))
ggplot(data = world_datos) +
geom_sf(aes(fill = Frecuencia.es)) +
scale_fill_gradient2(low = "white", high = "red") +
theme_minimal() +
labs(title = "Valores por país (número estudiantes)", fill = "Frecuencia")

conteo <- escuelas %>%
group_by(CNT, SC013Q01TA) %>%
summarise(cantidad = n(), .groups = "drop")
library(tidyr)
# Pivotear el conteo para tener SC013Q01TA como columnas
conteo_2 <- conteo %>%
pivot_wider(
names_from = SC013Q01TA, # Los valores que quieres como nombres de columna
values_from = cantidad, # Los valores que irán en las celdas
values_fill = 0 # Opcional: rellena los NA con 0
)
conteo_df = as.data.frame(conteo_2)
colnames(conteo_df) = c("país", "publica", "privada", "sin_datos")
conteo_df$total <- conteo_df$publica + conteo_df$privada + conteo_df$sin_datos
tipo_es_por = data.frame(
iso_a3 = conteo_df$país,
publica_relativa = conteo_df$publica / conteo_df$total,
privada_relativa = conteo_df$privada / conteo_df$total,
sin_datos_relativa = conteo_df$sin_datos / conteo_df$total
)
tipo_es_por
## iso_a3 publica_relativa privada_relativa sin_datos_relativa
## 1 ALB 0.8613139 0.113138686 0.025547445
## 2 ARE 0.2964286 0.583333333 0.120238095
## 3 ARG 0.6630197 0.315098468 0.021881838
## 4 AUS 0.5208614 0.397039031 0.082099596
## 5 AUT 0.8344371 0.129139073 0.036423841
## 6 BEL 0.1368421 0.217543860 0.645614035
## 7 BGR 0.9158416 0.024752475 0.059405941
## 8 BRA 0.7424749 0.105351171 0.152173913
## 9 BRN 0.7407407 0.259259259 0.000000000
## 10 CAN 0.8690614 0.064889919 0.066048667
## 11 CHE 0.8423077 0.065384615 0.092307692
## 12 CHL 0.3304348 0.639130435 0.030434783
## 13 COL 0.7404580 0.213740458 0.045801527
## 14 CRI 0.7424242 0.146464646 0.111111111
## 15 CZE 0.8953488 0.102325581 0.002325581
## 16 DEU 0.7859922 0.035019455 0.178988327
## 17 DNK 0.6916427 0.207492795 0.100864553
## 18 DOM 0.6007905 0.154150198 0.245059289
## 19 ESP 0.5962733 0.347826087 0.055900621
## 20 EST 0.9336735 0.066326531 0.000000000
## 21 FIN 0.9253112 0.070539419 0.004149378
## 22 FRA 0.7163121 0.191489362 0.092198582
## 23 GBR 0.6274945 0.310421286 0.062084257
## 24 GEO 0.8801498 0.112359551 0.007490637
## 25 GRC 0.9000000 0.056521739 0.043478261
## 26 GTM 0.4620690 0.493103448 0.044827586
## 27 HKG 0.0797546 0.650306748 0.269938650
## 28 HRV 0.9666667 0.027777778 0.005555556
## 29 HUN 0.6564885 0.232824427 0.110687023
## 30 IDN 0.5780488 0.421951220 0.000000000
## 31 IRL 0.0000000 0.000000000 1.000000000
## 32 ISL 0.0000000 0.000000000 1.000000000
## 33 ISR 0.0000000 0.000000000 1.000000000
## 34 ITA 0.8197674 0.139534884 0.040697674
## 35 JAM 0.6598639 0.088435374 0.251700680
## 36 JOR 0.8307692 0.169230769 0.000000000
## 37 JPN 0.7142857 0.285714286 0.000000000
## 38 KAZ 0.9211909 0.078809107 0.000000000
## 39 KHM 0.9398907 0.060109290 0.000000000
## 40 KOR 0.6451613 0.354838710 0.000000000
## 41 KSV 0.8253275 0.061135371 0.113537118
## 42 LTU 0.9486301 0.044520548 0.006849315
## 43 LVA 0.9022222 0.017777778 0.080000000
## 44 MAC 0.0000000 0.000000000 1.000000000
## 45 MAR 0.8764045 0.117977528 0.005617978
## 46 MDA 0.9811321 0.015094340 0.003773585
## 47 MEX 0.8535714 0.146428571 0.000000000
## 48 MKD 0.9009009 0.063063063 0.036036036
## 49 MLT 0.3043478 0.586956522 0.108695652
## 50 MNE 0.0000000 0.000000000 1.000000000
## 51 MNG 0.8717949 0.128205128 0.000000000
## 52 MYS 0.9246231 0.075376884 0.000000000
## 53 NLD 0.3896104 0.448051948 0.162337662
## 54 NOR 0.0000000 0.000000000 1.000000000
## 55 NZL 0.9349112 0.065088757 0.000000000
## 56 PAN 0.6046512 0.144186047 0.251162791
## 57 PER 0.7321429 0.267857143 0.000000000
## 58 PHL 0.8138298 0.186170213 0.000000000
## 59 POL 0.9208333 0.079166667 0.000000000
## 60 PRT 0.8348214 0.165178571 0.000000000
## 61 PRY 0.7971530 0.185053381 0.017793594
## 62 PSE 0.9413919 0.058608059 0.000000000
## 63 QAT 0.4890830 0.510917031 0.000000000
## 64 QAZ 0.6884422 0.010050251 0.301507538
## 65 QUR 0.9695122 0.024390244 0.006097561
## 66 ROU 0.9732824 0.007633588 0.019083969
## 67 SAU 0.7823834 0.212435233 0.005181347
## 68 SGP 0.9085366 0.091463415 0.000000000
## 69 SLV 0.7551724 0.189655172 0.055172414
## 70 SRB 0.9672131 0.032786885 0.000000000
## 71 SVK 0.8680556 0.100694444 0.031250000
## 72 SVN 0.9391304 0.017391304 0.043478261
## 73 SWE 0.0000000 0.000000000 1.000000000
## 74 TAP 0.7087912 0.291208791 0.000000000
## 75 THA 0.8602151 0.139784946 0.000000000
## 76 TUR 0.8724490 0.122448980 0.005102041
## 77 URY 0.8423423 0.157657658 0.000000000
## 78 USA 0.9220779 0.025974026 0.051948052
## 79 UZB 0.9950495 0.004950495 0.000000000
## 80 VNM 0.9157303 0.073033708 0.011235955
world_datos <- world %>%
left_join(tipo_es_por, by = "iso_a3")
ggplot(data = world_datos) +
geom_sf(aes(fill = sin_datos_relativa)) +
scale_fill_gradient(low = "white", high = "red", na.value = NA) + theme_minimal() +
labs(title = "Valores por país (número estudiantes)", fill = "Frecuencia")

paises_faltantes_25 <- subset(tipo_es_por, sin_datos_relativa > 0.25)
print(paises_faltantes_25)
## iso_a3 publica_relativa privada_relativa sin_datos_relativa
## 6 BEL 0.1368421 0.21754386 0.6456140
## 27 HKG 0.0797546 0.65030675 0.2699387
## 31 IRL 0.0000000 0.00000000 1.0000000
## 32 ISL 0.0000000 0.00000000 1.0000000
## 33 ISR 0.0000000 0.00000000 1.0000000
## 35 JAM 0.6598639 0.08843537 0.2517007
## 44 MAC 0.0000000 0.00000000 1.0000000
## 50 MNE 0.0000000 0.00000000 1.0000000
## 54 NOR 0.0000000 0.00000000 1.0000000
## 56 PAN 0.6046512 0.14418605 0.2511628
## 64 QAZ 0.6884422 0.01005025 0.3015075
## 73 SWE 0.0000000 0.00000000 1.0000000
tipo_escuela <- tipo_es_por %>% anti_join(paises_faltantes_25, by = "iso_a3")
colnames(tipo_escuela) <- c("CNT", "publica", "privada", "sin_datos")
table(estudiantes$ST004D01T)
##
## 1 2
## 283078 279561
resultados <- estudiantes %>%
group_by(CNT, ST004D01T) %>%
summarise(cantidad = n(), .groups = "drop_last") %>% # Usamos drop_last para mantener el grupo CNT
mutate(frecuencia_relativa = cantidad / sum(cantidad))
colnames(resultados) = c("CNT", "Gender", "cantidad", "frecuencia_relativa")
NotasPlausibles = estudiantes %>%
select(matches("^PV|^CNT$|^CNTSCHID$|^ST004D01T$"))
NotasMedias = NotasPlausibles %>% transmute(CNT = NotasPlausibles$CNT,
CNTSCHID = NotasPlausibles$CNTSCHID,
Gender = NotasPlausibles$ST004D01T,
MathMean = rowMeans(NotasPlausibles[,3:12]),
LectureMean = rowMeans(NotasPlausibles[,13:22]),
ScienceMean = rowMeans(NotasPlausibles[,23:32]))
NotasMediasPaisGenero = NotasMedias %>% group_by(CNT,Gender) %>% summarise(
MathMean_Country = mean(MathMean, na.rm = TRUE),
LectureMean_Country = mean(LectureMean, na.rm = TRUE),
ScienceMean_Country = mean(ScienceMean, na.rm = TRUE), .groups = "drop")
NotasMediasPaisGenero <- NotasMediasPaisGenero[complete.cases(NotasMediasPaisGenero), ]
resultados_temp <- resultados %>%
select(CNT, Gender, frecuencia_relativa)
NotasMediasPaisGenero <- NotasMediasPaisGenero %>%
left_join(resultados_temp, by = c("CNT","Gender"))
NotasMediasPaisGenero$TotalMean = rowMeans(NotasMediasPaisGenero[,3:5])
NotasMediasPaisGenero <- NotasMediasPaisGenero %>%
relocate(frecuencia_relativa, .after = Gender)
NotasMediasPaisGenero %>%
group_by(Gender) %>%
summarise(MediaGlobal_TotalMean = mean(TotalMean, na.rm = TRUE))
## # A tibble: 2 × 2
## Gender MediaGlobal_TotalMean
## <dbl> <dbl>
## 1 1 436.
## 2 2 429.