viernes, 31 de octubre de 2025

Datos. Estadística.

Análisis bivariado

Regresión lineal (simple)



He dejado el estudio de la regresión lineal para el final de este limitado estudio de la estadística descriptiva  por considerar que se sitúa en el límite entre ésta y la estadística inferencial o de análisis causal; en el límite por sus pretensiones, pero sin superarlo.

Realmente existen otras razones para este tratamiento en este momento, no siendo la menos importante el disponer de los conocimientos previos necesarios para entender de qué estamos hablando y cómo podemos analizar e interpretar los datos que obtengamos (1).

Dada una distribución bivariada, tanto su representación gráfica como el uso de una serie (ya vista) de estadísticos nos permiten apreciar la existencia de cierto grado de relación entre las dos variables intervinientes. Esta relación puede ser de diferente grado de intensidad, pero no es suficiente que lo sea débilmente si lo que pretendemos es identificarla como lineal, lo que implica que puede ser descrita matemáticamente mediante una función (lineal) conocida. Esta función dibuja una recta, de lo que deriva su nombre: regresión lineal.

Cuando el grado de relación entre ambas variables es débil, podemos decir que ambas variables son independientes. En ese caso no existe ninguna función matemática que pueda ser aplicada (2).

El objetivo final de todo análisis de regresión es determinar cómo se relacionan dos variables y establecer una función matemática que permita predecir su comportamiento futuro (3). El objetivo de la regresión lineal es, como no puede ser de otro modo, encontrar la función de la recta que mejor se ajuste a la nube de puntos (mínimo error) como base para realizar predicciones.

Se trata, pues, de predecir el comportamiento de la variable endógena (dependiente o explicada) a partir de la variable exógena (independiente o explicativa); pero como no contamos con una definición causal de la relación entre las dos variables, hemos de asumir que ambas pueden ser tratadas indistintamente como endógenas y exógenas, por lo que definiremos dos funciones, aunque trabajemos con una de ellas:
  • y = a + bx (x como variables independiente)
  • x = a + by (y como variables independiente)
... siendo (4)
  • y la variable dependiente (valor a predecir)
  • x la variable independiente (valor que influye en el valor de y)
  • a la ordenada al origen, esto es, valor de y cuando x = 0
  • b la pendiente o cambio en y por cada unidad de cambio en x
También debemos asumir que no existe una distribución lineal exacta, que ninguna recta puede pasar por todos los puntos que dibuja la distribución real. Por ello nos vemos limitados a elegir, de entre todas las rectas posibles, aquella que reduce al mínimo el error o diferencia entre el valor real y el esperado (para y, e =yi -yi'). Dado que esta diferencia puede ser positiva o negativa, utilizamos su suma al cuadrado (Sum(yi -yi')2) como fórmula para el cálculo del error cuadrático total.

Aceptando como objetivo el error cuadrático mínimo, el problema de la regresión lineal se limita a calcular los valores de a y de b.
  • Para a = Md(y) - (Sxy/Sx2) * Md(x)
  • Para b = Sxy/Sx2
Propiedades de la regresión lineal (simple):
  • La pendiente de la recta y sobre x es la [covarianza] (CVxy) dividida por la varianza de x, mientras que la pendiente de x sobre y es la covarianza CVxy dividida por la varianza de y.
  • La recta pasa por el punto formado por las medias Md(x) y Md(y). Este punto se llama centro de gravedad de la distribución bidimensional xy.
  • El producto de las pendientes de las rectas de regresión es igual al coeficiente de [correlación de Pearson] al cuadrado (b+b' = r2)
En todo caso, la viabilidad de la recta de regresión como representación de la distribución se obtiene calculando su bondad de ajuste o [coeficiente de determinación].


NOTAS

(1) Me refiero a los estadísticos univariados y bivariados vistos hasta el momento, sobre todo a los últimos.
(2) Por ahora daremos por válida esta formulación, pero al igual que en el caso de la correlación, también sobre estas cuestiones tendremos que volver más adelante, ya la linealidad no es la única relación posible entre variables. Posiblemente sea la preferida y deseable para ciertos estudios, pero no es la única, como veremos en su momento.
(3) De ahí que habláramos al inicio de esta entrada de que la regresión lineal no se limitaba a la descripción del comportamiento de una (o dos) variable(s).
(4) En otras formulaciones se denominan a y b como alfa y beta o se invierten las posiciones (y = ax + b); en cualquier caso, lo importante es tener claro que la pendiente (para nosotros b) multiplica a la variable independiente y a ello se le suma el valor de la ordenada de origen (para nosotros a).


Datos. Estadística.

Análisis bivariado

Correlación (coeficiente de Pearson)



Los análisis de correlación completan el estudio de la relación entre dos variables que iniciamos con la covarianza (1), constituyendo su forma más elaborada, pero también más compleja y sujeta a condiciones. No obstante se observa en la literatura cierta tendencia a simplificar y generalizar, asociando la correlación en términos generales con una de sus concreciones: la correlación entre variables continuas y el índice de correlación más común en estos casos, el coeficiente de correlación de Pearson.


Tal es así que algunos manuales sólo hablan de este coeficiente y en determinados programas (Calc, sin ir más lejos) parece entenderse que el coeficiente de correlación, así en genérico, y el de Pearson (2) son lo mismo.

Aunque se trata evidentemente de un error, tiene su razón de ser: Pearson es el coeficiente de correlación más empleado, siempre que esto es posible, y el más potente.

Su cálculo es relativamente simple, ya que requiere operaciones conocidas: se obtiene dividiendo la covarianza xy entre el producto de las desviaciones típicas de ambas variables.


Este coeficiente se puede calcular también a partir del coeficiente de determinación, ya que equivale a la raíz cuadrada de éste.

La correlación en general muestra la dependencia directa o inversa que existe entre dos variables y su intensidad. Concretamente el coeficiente de correlación de Pearson muestra la dependencia lineal entre dos variables cuantitativas continuas.

Los valores posibles van de -1 a +1, siendo altos los próximos a estos valores y bajos cuanto más próximos estén respecto a 0. En este último caso decimos que no existe correlación entre ambas variables (ambas son independientes), aunque también podría ser que esta correlación no es lineal (pero puede serlo de otro tipo).

Para valorar el grado o intensidad de la correlación podemos aplicar la siguiente escala (3):
  • Valores inferiores a +/- 0,25 suponen que no existe relación suficientemente fuerte entre x e y.
  • Valores entre 0,25 y 0,50 indican una correlación baja.
  • Valores entre 0,50 y 0,75 indican un nivel de correlación moderada
  • Y valores superiores a 0,75 indican una correlación satisfactoria.
Además en CCSS se considera que una correlación superior a 0,80 indica que existe dependencia lineal entre las variables correlacionadas.

En cualquier caso la correlación no supone causalidad, ya que puede ser casual o ser debida a la incidencia de diferentes variables no estudiadas pero intervinientes.

No finalizamos con esta entrada el estudio de la correlación, pero sí es necesario plantearla ahora es estos términos limitados y simplificados para facilitar el desarrollo actual del blog. Más adelante trataremos estas cuestiones, incluyendo las condiciones que se deben cumplir para hacer uso del coeficiente de correlación de Pearson y el estudio de otros coeficientes de correlación.







NOTAS

(1) En realidad aún nos falta tratar sobre la regresión (lineal, fundamentalmente), pero ésta plantea otro enfoque dentro del análisis bivariado, como veremos en su momento.
(2) Calc cuenta con dos fórmulas asociadas a este coeficiente, COEF.DE.CORREL() PEARSON(), que reciben los mismos parámetros y con los que se obtiene el mismo resultado.
(3) Aunque no es la única.

jueves, 30 de octubre de 2025

Datos. Estadística.

Análisis bivariado

Coeficiente de determinación



A pesar del interés que tiene la covarianza, en realidad no aporta mucha información sobre la relación, mejor sobre la fuerza de la relación entre dos variables. El coeficiente de determinación sí.


Definimos el coeficiente de determinación como la proporción de variabilidad de una variable que es explicada por otra. La primera variable es considerada como variable dependiente (y) y la segunda variable independiente (x), así que lo anterior equivale a decir que este coeficiente indica el porcentaje de varianza de y que es explicado por x (1).

El coeficiente de determinación se representa como R2 (R al cuadrado) y sus valores oscilan entre 0 y 1 (o 0% y 100%), siendo 0 la ausencia de determinación y 1 la determinación plena o perfecta (2).

La fórmula del coeficiente de determinación se describe como el cuadrado de la [covarianza] dividido por el producto de las [varianzas] de las variables. Si deseamos obtener el resultado en porcentaje deberemos multiplicar el resultado obtenido por 100.


Aplicando  esta fórmula a los datos empleados en la entrada sobre la covarianza y usando los cálculos resueltos en ese momento y la fórmula Calc para la varianza, obtenemos los siguientes resultados:

  • Covarianza al cuadrado: 1,209
  • Varianza de x : 2,813
  • Varianza de y: 1,374
  • Coeficiente de determinación: 0,3127 -> 31,27%
Y la interpretación es la que sigue: la varianza de la variable y está determinada en un 31,27% por la variable x (3).

Al contrario de la covarianza, sí disponemos de una fórmula Calc que nos permite realizar el cálculo del coeficiente de determinación...

=COEFICIENTE.R2($Datos.$D4:$V4;$Datos.$D3:$V3)

... formula con la que obtenemos el mismo resultado (R2 = 0,3127) (4)

Por lo que se refiere a Python, de momento no trataremos cómo calcular este coeficiente mediante las bibliotecas conocidas de este lenguaje, ya que no es posible hacerlo directamente (5) o, en otro caso, adelantar acontecimientos.

NOTA

(1) Aun no podemos hablar en estos términos, ya que no hemos tratado sobre la regresión, pero también podríamos definir el coeficiente de variabilidad como la proporción de variabilidad explicado por el modelo de regresión empleado para explicar la relación xy. El coeficiente de regresión es aplicable a cualquier tipo de regresión, no sólo de la lineal.
(2) Incidiendo de nuevo en el estudio de los modelos de regresión, se suelen recomendar valores superiores a 0,85 (85%) para considerar válida la ecuación obtenida. Si el resultado es menor a 0,60 (60%) se considera que ese modelo (esa ecuación) no es fiable, por lo que se recomienda probar con otra representación.
(3) Realmente esto ahora nos importa poco, dado que se trata de un mero ejercicio para la comprensión del coeficiente, pero en otro caso tendríamos que decir que este resultado nos está indicando que la relación xy es una relación débil, positiva pero débil. Podríamos confirmarlo calculando el coeficiente de correlación de Pearson que veremos próximamente (r(xy) = 0,5592).
(4) En este caso no sería necesario crear una función mediante OOo Basic ya que disponemos de la fórmula y el resultado no ofrece duda al coincidir con el que obtenemos mediante el procedimiento "manual".
(5) Sería necesario estudiar la biblioteca scikit-learn o introducir la fórmula para calcular el coeficiente de correlación de Pearson, del que aun no hemos hablado. Podríamos desarrollar un script haciendo uso de las fórmulas de calculo de la covarianza y de las varianzas, pero aportaría poco a lo explicado a partir del Calc y supondría detenernos en exceso en el desarrollo de ese script. Lo que no descarto es tratar estas cuestiones específicamente en una entrada diferenciada de la actual. 



Datos. Estadística.

Análisis bivariado

Covarianza



La covarianza es un estadístico que nos permite saber con exactitud si existe o no algún tipo de relación entre dos variables. Nos permite, pues, concretar lo que indica una tabla de contingencia.


Cuando ambas variables tienden a aumentar simultáneamente, se considera que la relación entre ambas es positiva y el resultado del estadístico >0; mientras que si una aumenta y la otra disminuye la relación es negativa y el valor del estadístico se aproxima a <0. Se considera que no existe relación si el comportamiento conjunto es aleatorio; en ese caso es valor del estadístico es 0 o próximo a 0.

Necesitamos, por tanto, disponer de una fórmula que nos permita calcular ese valor numérico. Para ello disponemos de dos procedimientos que resumimos en sus fórmulas:

La primera fórmula se refiere al cálculo de la varianza poblacional vs. muestral y diferencia entre la fórmula poblacional...



... también expresada como...

... y la fórmula muestral...



... también expresada como...


En ambos casos, de existir valores de frecuencias  superiores a 1, el producto de las diferencias se multiplica por el valor de n(ij) [(x(i)-pm(x))*(y(j)-pm(y)*n(ij)]


Una segunda formulación, simplificada, se expresa como sigue y se identifica como formulación respecto al momento (1)

Veremos a continuación y en primer lugar un ejemplo de cálculo manual de la covarianza utilizando precisamente esta última fórmula.

Supongamos el siguiente conjunto de datos derivado del registro de las variables x (horas de asistencia a clase) e y (resultados en un examen) de una determinada asignatura:


Lo primero que hacemos es convertir esta tabla de distribución en una tabla de contingencia en la que hemos obtenido las frecuencias relativas de cada par xy y ordenado los datos a partir de la variable x.


Sobre ella realizaremos el cálculo de los valores xn e yn, necesarios a su vez para el cálculo de los promedios respectivos, y de xyn, que necesitamos en función de la fórmula de la CV a aplicar.


Los resultados obtenidos...


... permiten realizar la siguiente interpretación: la covarianza x-y (CVxy) indica que existe una relación directa entre las horas de asistencia a clase y los resultados en la prueba: como tendencia se observa que a mayor número de horas de asistencia, mejores resultados.

Realmente nos falta la representación gráfica de estos datos para apreciar mejor la relación que mantienen ambas variables, así que recurrimos a las funciones Calc para crearlo obteniendo el siguiente, que no recoge el peso de las frecuencias de cada par xy, pero que nos ofrece una idea aproximada del tipo de relación que mantienen. En él observamos ciertamente una relación positiva como la descrita antes, aunque bastante matizada en los valores inferiores: realmente parece que existieran dos realidades: los valores "anómalos" iniciales (1 y 3 sesiones de asistencia) y el resto (a partir de 4), apreciándose que es en esta segunda donde se puede apreciar con mayor seguridad la tendencia que detecta el coeficiente de variación, pero no así en la primera (2).


Si trabajamos con LO-Calc (3) podremos hacer los cálculos necesarios para obtener el CV, pero no disponemos de una función específica para ello, por lo que en realidad hemos desarrollado en la explicación anterior todo lo que Calc nos puede ofrecer: herramientas para el cálculo de las medias y la obtención de los sumatorios (4).

Tampoco con Python obtenemos un resultado inequívoco, salvo que creemos nuestra propia función tomando como referencia una de las fórmulas vistas anteriormente. Lo que sí podemos obtener (en ventaja respecto a OOo Basic) es una matriz de covarianzas, en esta caso (xx)-(xy) |(yx)-(yy)

En todo caso, para la obtención de la matriz de covarianzas necesitamos importar numpy y crear un script como el siguiente (5) en el que lo fundamental es la función np_cov().

import numpy as np

x = np.array([6,6,6,1,1,4,4,4,4,4,3,3,5,5,5,5,5,5,8])
y = np.array([6,6,6,5,5,5,5,5,5,5,6,6,5,5,5,5,5,5,10])

cov_matrix = np.cov(x, y, ddof=1)
print(cov_matrix)

El resultado que obtenemos es la matriz de covarianzas antes explicada...

... en la que nos interesan los valores (repetidos (xy)-(yx) que se corresponden con 1.099, resultado muy próximo al que obtuvimos en nuestro cálculo (1,042) (6). En cualquier caso, ambos resultados evidencian lo mismo: existe cierta tendencia a que x e y se relacionen en términos positivos: a mayor número de horas de asistencia, mejores resultados en la prueba (7).

NOTA 

(1) Así la denominan Ordoñez y González (2021. pg 118)
(2) De ahí que me refiera a ellos como "anómalos", aunque este calificativo no sea adecuado. Realmente tenemos muy pocos datos (19) como para sacar conclusiones, aunque hablar en términos genéricos, usando términos como "tendencia" y similares puede ser correcto.
(3) De hecho, como vimos, es el soporte empleado para crear el gráfico, pero también las tablas para realizar los cálculos en el cálculo "manual" de CV
(4) Al no existir una fórmula específica para CV es posible que nos interese crearle mediante OOo Basic, pero no es ahora el momento.
(5) Basado en DataCamp. Tendremos ocasión de trabajar con [esta biblioteca] con más detalle.
(6) Confirmo que la diferencia se debe a la fórmula aplicada en el primer cálculo y que el resultado numpy se debe al uso de la fórmula muestras.
(7) Recuerda que los datos son inventados, aunque verosímiles, por lo que no estamos afirmando que exista esta relación en la realidad, aunque no sería descartable que así fuera. 





 

martes, 28 de octubre de 2025

Datos. Estadística

Análisis bivariado

Tabla de contingencia



El estudio bivariado o estudio conjunto de dos (o más) variables comienza con el tratamiento de los datos y presentación mediante tablas de contingencia, que es una presentación de los datos en forma de tabla de doble entrada.


Una tabla de contingencia o de frecuencias conjuntas (tercer nombre que recibe), es una representación en la que los datos son compartidos por dos o más variables.

La construcción de una tabla de contingencia depende del tipo de distribución que presenten las variables que contiene, que, como sabemos, son de tres tipos:
  • Tipo I - Cada par de valores se presenta una única vez.
  • Tipo II - Los pares de valores se presentan más de una vez
  • Tipo III - Los valores de las variables se presentan agrupados en intervalos.
Un ejemplo de tabla de contingencia, basada en la distribución de tipo II (la más frecuente) podría ser la que presenta los datos de la variable CURSO y la variable CALIFICACIÓN. 


En realidad lo que esta tabla representa no es un intento de establecer posibles relaciones entre ambas variables, sino y simplemente facilitar la lectura de los datos que contiene. Para que una tabla sea realmente una tabla de contingencia, esto es, que permita visualizar la posible relación entre dos variables en los términos "correlacionales" que se le supone, las variables presentes deben ser susceptibles de presentar este tipo de relación. Tal podría ser el caso de variables como tipo de estudios y género del alumnado, por poner un ejemplo en el que sí tiene sentido estudiar posibles relaciones entre variables (1).


Esta tabla muestra el alumnado matriculado en diferentes estudios universitarios en las universidades públicas españolas en el curso 2022/2023, diferenciando por carretas (seleccionadas subjetivamente) y sexo del alumnado. El objetivo en este caso es evidente: analizar la relación entre el tipo de estudio y el género del alumnado con la finalidad de valorar la presencia de sesgos por género (2).

Además las tablas de contingencia permiten observar las distribuciones marginales de las variables representadas, que no son otra cosa que el número de veces que aparece cada una de las variables, con independencia de los valores de las demás (3). Estos valores marginales son necesarios para el cálculo de los estadísticos univariados de cada una de las variables que contiene la tabla de contingencia, los cuales, a su vez, son necesarios para el cálculo de estadísticos bivariados.

NOTA

(1) Consulta UNIVbase. Ministerio de Ciencia, Innovación y Universidades. 
(2) No interesa en esta entrada realizar este estudio, pero los datos recogidos ofrecen información muy interesante para el estudio del sesgo por género en los estudios universitarios.
(3) La forma más sencilla de calcular las distribuciones marginales es ir sumando los valores de las filas y las columnas en la misma tabla de contingencia.

miércoles, 22 de octubre de 2025

Textos. Python.

Textos en imágenes

Obtención del texto (II)



Aunque en la entrada anterior usamos Pillow como programa de procesamiento de imágenes (con una función muy simple, por cierto: cargar la imagen), lo cierto es que lo normal es que se haga uso de OpenCV por su mayor potencia y funcionalidad, así que tendremos que incorporarlo a nuestro arsenal de recursos de automatización del acceso a textos.


Pero lo que quedó patente en la [entrada anterior] es que para lo que lo utilizamos en ese script (plenamente exitoso, por cierto), Pillow es más que suficiente, así que cuando la imagen no presente mayores dificultades y su tratamiento sea tan simple como el realizado, podemos trabajar perfectamente con esa biblioteca con total confianza. 

Otra cosa es que el tratamiento a hacer de la imagen de referencia exija actuaciones de mayor complejidad. En ese caso es posible que OpenCV ofrezca mayor rendimiento, aunque sinceramente tengo mis dudas...

En todo caso lo mejor es que también practiquemos a extraer texto de imágenes usando OpenCV. Y a ello vamos tomando como referencia esta imagen, que en principio se presenta con mayor complejidad gráfica y también con mayor utilidad (obtener el texto de páginas escaneadas de cuentos o de libros de texto o de presentaciones ppt previamente convertidas en capturas de pantalla, por ejemplo)


Este es ahora el script:

import cv2
import pytesseract

#Asociar pytesseract a Tesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# Cargar imagen
img = cv2.imread("img/img3.png")

# Convertir la imagen a escala de grises
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Aplicar threshold para convertir la imagen a binario
threshold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Pasar la imagen al progama OCR pytesseract
text = pytesseract.image_to_string(threshold_img, lang='spa')

# Imprimir el texto extraído
print(text)

Puedes apreciar que sustituimos Pillow por OpenCV (import cv2), biblioteca que usamos para cargar la imagen (img = cv2.imread("img/img3.png")), pero también para tratarla a fin de facilitar el escaneo final...
  • Primero la convertimos a escala de grises (gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
  • Y después la convertimos a binario (threshold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1])
... aunque puedes comprobar que ninguna de las dos instrucciones es estrictamente necesaria y que su uso no cambia sustancialmente el resultado (que realmente es mejorable), pero lo que aquí es poco relevante, en otros contextos puede ser la diferencia entre un buen acceso al texto o un fracaso, así que bueno es saberlo, aunque ahora parezca que nos sobra.

El resto del script (no hay mucho más, pero es importante) es igual que en el script en el que usamos Pillow:
  • La conexión entre Tesseract y pytesseractpytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
  • El escaneo de la imagen (text = pytesseract.image_to_string(threshold_img, lang='spa'))
  • Y la visualización del texto en pantalla (print(text))
También en este caso obviamos el tratamiento del texto y su posible archivo como documento. Ambas tareas quedan pendientes para aplicaciones prácticas reales.

Textos. Python

Textos en imágenes

Obtención del texto (I)



Te supongo ya dispuesto a obtener texto de una imagen, esto es, con el software correctamente instalado. Partiendo de aquí vamos a practicar la extracción de texto de imágenes partiendo de material sencillo. Ya llegará el momento de aplicarnos a fondo en contextos reales de intervención.


Para empezar, un documento sencillo y poca pretensión de nivel de logro: nos conformaremos con obtener el texto que contiene la imagen y visualizarlo en el el Shell o en el cmd. Esta es la imagen...


... y este el script que explico a continuación:

import pytesseract
from PIL import Image

#Es necesario incluir la ruta a Tesseract para trabajar con pytesseract

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# Cargar la imagen con Pillow
img = Image.open('img/img_txt.jpg')

# Extraer texto
texto = pytesseract.image_to_string(img, lang ='spa')

#Escribir el texto en pantalla
print(texto)

Como ves es un script muy simple en el que, además del módulo pytesseract también importamos la librería Pillow, concretamente su módulo básico (from PIL import Image), ya que la necesitamos para cargar la imagen (img = Image.open('img/img_txt.jpg')).

Pero fíjate (y es muy importante) que previamente deberemos incluir una instrucción que comunique pytesseract con Tesseract (existen otras opciones, pero esta es la más sencilla). De no hacerlo no funcionará el script y no obtendremos el texto.

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
 
Te recomiendo que identifiques la ubicación de Tesseract en tu ordenador (será una dirección igual o muy similar a la mía) y copies esta instrucción al inicio de tus script.

La instrucción que sigue es la clave del procedimiento (texto = pytesseract.image_to_string(img, lang ='spa')), ya que emplea la función pytesseract image_to_string() que requiere dos parámetros, la imagen sobre la que trabajar y el idioma a aplicar (recuerda que en la instalación de Tesseract seleccionaste una serie de idiomas para aplicar OCR), que en nuestro caso es el español (lang ='spa').

Ahora sólo resta visualizar el texto obtenido por pantalla (print(texto)), aunque en una situación real posiblemente lo tendríamos que manipular para mejorar su legibilidad y posteriormente archivar en un documento txt (por ejemplo).




Textos. Python.

Textos en imágenes

Recursos OCR


Cuando hemos aprendido (más o menos) a obtener el texto que contiene un documento PDF, se nos presenta un nuevo desafío: obtener el texto presente en una imagen.


Tendremos ocasión de conocer diversas casuísticas en las que esto se da, pero por ahora nos quedaremos con lo siguiente: unos padres te presentan un informe de un servicio externo en formato papel (hecho muy común) y tú lo escaneas para disponer del documento en formato digital (de paso devuelves el papel a sus dueños) y cuando vas a acceder a su contenido con tus recientes habilidades de manejo de PDF mediante PyPDF2 resulta que el contenido es inaccesible porque, vete a saber por qué, lo que el documento PDF contiene es, en realidad, una imagen.  Se te presentan tres opciones (después de que se te pase el consiguiente cabreo): volver a solicitar el documento a los padres y comprobar que escaneas correctamente el documento como texto (si es que su calidad lo permite), imprimes el documento escaneado y vuelves a intentar un escaneo correcto (si es posible...) o aprendes a obtener el texto que contiene ese PDF que milagrosamente resulta ser una imagen.

A lo mejor la tercera opción resulta ser la más complicada, pero te aseguro que es la mejor, al menos en el medio plazo.

Esta un tanto rocambolesca situación no lo es tanto en la vida real en la que obtener texto de imágenes es una funcionalidad de mucho más uso del que pensamos. En nuestro caso como SEO tendremos muchas ocasiones para comprobarlo; algunas de ellas, como dije, las trataremos en este blog.

La solución Python tiene poco de milagrosa, ya que se basa precisamente en aplicar lo que deseamos desde un principio cuando escaneamos el documento: obtener un texto mediante tecnología OCR. Esta es la base del procedimiento: incorporar un software OCR y manejarlo desde Python.

El OCR es el programa Tesseract, que puedes descargar desde [este enlace] y la biblioteca Python que necesitas para trabajar con él es pytesseract, cuya web oficial tienes en [este enlace]. Te recomiendo que te tomes las cosas con calma y que consultes ambas webs antes de proceder a la instalación del software; esto es especialmente necesario para el OCR, ya que su instalación requiere cierto cuidado y debe ser previa a la de la biblioteca Python.