100% encontró este documento útil (1 voto)
1K vistas

Python Data Analysis-Packt (2021) - Español

Este documento presenta una introducción al análisis de datos con Python. Sección 1 cubre las bibliotecas básicas de Python como NumPy y pandas. Sección 2 cubre técnicas de visualización de datos y limpieza. Capítulos específicos cubren estadísticas básicas, álgebra lineal, visualización con Matplotlib y Seaborn, e introducciones a Bokeh y Jupyter Notebooks.

Cargado por

osmer
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
1K vistas

Python Data Analysis-Packt (2021) - Español

Este documento presenta una introducción al análisis de datos con Python. Sección 1 cubre las bibliotecas básicas de Python como NumPy y pandas. Sección 2 cubre técnicas de visualización de datos y limpieza. Capítulos específicos cubren estadísticas básicas, álgebra lineal, visualización con Matplotlib y Seaborn, e introducciones a Bokeh y Jupyter Notebooks.

Cargado por

osmer
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 445

Tabla de contenido

Prefacio 1

Sección 1: Base para el análisis de datos


Capítulo 1: Introducción a las bibliotecas de Python 7
Comprender el análisis de datos 8
El proceso estándar de análisis de datos 9
El proceso KDD 10
SEMMA 11
CRISP-DM 12
Comparación del análisis de datos y la ciencia de datos 14
Los roles de los analistas de datos y los científicos de datos 14
Las habilidades de los analistas de datos y científicos de datos 15
Instalación de Python 3 17
Instalación y configuración de Python en Windows 17
Instalación y configuración de Python en Linux 18
Instalación y configuración de Python en Mac OS X con un instalador de GUI 18
Instalación y configuración de Python en Mac OS X con brew 18
Software utilizado en este libro 19
Uso de IPython como shell 20
Lectura de páginas del manual 23
Dónde encontrar ayuda y referencias a las bibliotecas de análisis de datos de Python 24
Usando JupyterLab 24
Uso de los cuadernos de Jupyter 26
Funciones avanzadas de los cuadernos Jupyter 27
Atajos de teclado 28
Instalación de otros kernels 29
Ejecución de comandos de shell 30
Extensiones para Notebook 30
Resumen 36
Capítulo 2: NumPy y pandas 37
Requerimientos técnicos 38
Entendiendo las matrices NumPy 38
Características de la matriz 41
Seleccionar elementos de matriz 42
Tipos de datos numéricos de matriz NumPy 43
objetos dtype 45
Códigos de caracteres de tipo de datos 46
Tabla de contenido

constructores dtype 47
atributos dtype 47
Manipulación de formas de matrices El 48
apilamiento de matrices NumPy 50
Partición de matrices NumPy 53
Cambiar el tipo de datos de matrices 55
NumPy Crear vistas y copias NumPy 56
Cortar matrices NumPy 58
Matrices de difusión de indexación 60
booleana y sofisticada 61
Creación de pandas DataFrames Comprensión 63
de pandas Series Lectura y consulta de los sesenta y cinco

datos de Quandl Descripción de pandas 68


DataFrames Agrupación y unión de pandas 72
DataFrame Trabajo con valores perdidos 75
79
Creando tablas dinámicas 81
Lidiar con las fechas 83
Resumen 85
Referencias 85
Capítulo 3: Estadísticas 86
Requerimientos técnicos 87
Comprender los atributos y sus tipos 87
Tipos de atributos 87
Atributos discretos y continuos 89
Medir la tendencia central 89
Significar 89
Modo 90
Mediana 91
Medición de la dispersión 91
Asimetría y curtosis 95
Comprender las relaciones mediante el uso de coeficientes de covarianza y
correlación. 96
Coeficiente de correlación de Pearson Coeficiente 97
de correlación de rango de Spearman Coeficiente 98
de correlación de rango de Kendall 98
Teorema del límite central 98
Recolectando muestras 100
Realización de pruebas paramétricas 101
Realización de pruebas no paramétricas 107
Resumen 113
Capítulo 4: Álgebra lineal 114

[ii]
Tabla de contenido

Requerimientos técnicos 115


Ajuste a polinomios con 115
determinante numérico 117
Encontrar el rango de una matriz 117
Matriz inversa usando NumPy 118
Resolver ecuaciones lineales usando NumPy 119
Descomponer una matriz usando SVD Eigenvectors 120
y Eigenvalues usando NumPy Generando 122
números aleatorios 123
Distribución binomial 124
Distribución normal 126
Probando la normalidad de los datos usando SciPy 127
Crear una matriz enmascarada usando el resumen del subpaquete 131
numpy.ma 133

Sección 2: Análisis de datos exploratorios y limpieza de datos

Capítulo 5: Visualización de datos 135


Requerimientos técnicos 135
Visualización usando Matplotlib 136
Accesorios para cartas 137
Gráfico de dispersión 139
Gráfico de línea 140
Gráfico circular 142
Gráfico de barras 143
Gráfico de histograma 144
Gráfico de burbujas 146
pandas tramando 148
Visualización avanzada usando el paquete Seaborn 150
lm parcelas 151
Parcelas de barras 154
Parcelas de distribución 155
Diagramas de caja 156
Gráficos de KDE 157
Tramas de violín 158
Contar parcelas 159
Parcelas conjuntas 161
Mapas de calor 162
Par parcelas 164
Visualización interactiva con Bokeh 166
Trazar un gráfico simple 166
Glifos 168
Diseños 169

[iii]
Tabla de contenido

Diseño anidado usando diseños de filas y columnas 173


Varias parcelas 175
Interacciones 177
Ocultar política de clics 177
Política de silenciar clics 179
Anotaciones 180
Herramienta de desplazamiento 183
Widgets 184
Panel de pestañas 185
Deslizador 186
Resumen 189
Capítulo 6: Recuperar, procesar y almacenar datos 190
Requerimientos técnicos 191
Lectura y escritura de archivos CSV con NumPy 191
Lectura y escritura de archivos CSV con pandas 192
Lectura y escritura de datos de Excel Lectura y 194
escritura de datos de JSON Lectura y escritura 195
de datos de HDF5 Lectura y escritura de datos 196
de tablas HTML Lectura y escritura de datos de 197
Parquet 198
Leer y escribir datos de un objeto pickle pandas 199
Acceso ligero con sqllite3 200
Leer y escribir datos desde MySQL 201
Insertar un DataFrame completo en la base de datos 204
Lectura y escritura de datos de MongoDB 205
Lectura y escritura de datos de Cassandra 206
Lectura y escritura de datos de Redis 207
PonyORM 208
Resumen 209
Capítulo 7: Limpieza de datos desordenados 210
Requerimientos técnicos 211
Explorando datos 211
Filtrar datos para eliminar el ruido 214
Filtración por columna 215
Filtración por hileras 217
Manejo de valores perdidos 220
Eliminando los valores perdidos 221
Completando un valor faltante 221
Manejo de valores atípicos 223
Técnicas de codificación de funciones 226
Codificación one-hot 226
Codificación de etiquetas 228
Codificador ordinal 229

[iv]
Tabla de contenido

Escala de características 230


Métodos para escalar características 231
Transformación de características 234
División de funciones 235
Resumen 236
Capítulo 8: Procesamiento de señales y series de tiempo 237
Requerimientos técnicos 238
Los módulos statsmodels 238
Promedios móviles 239
Funciones de ventana 242
Definición de cointegración 244
Descomposición STL 246
Autocorrelación 248
Modelos autorregresivos 250
Modelos ARMA 254
Generación de señales periódicas 257
Análisis de Fourier 259
Resumen de filtrado de 262
análisis espectral 264

Sección 3: Profundización en el aprendizaje automático

Capítulo 9: Aprendizaje supervisado: análisis de regresión 266


Requerimientos técnicos 267
Regresión lineal 267
Regresión lineal múltiple 269
Comprender la multicolinealidad 269
Eliminar la multicolinealidad 270
Variables ficticias 272
Desarrollar un modelo de regresión lineal Evaluar 274
el desempeño del modelo de regresión 276
R-cuadrado 276
MSE 277
MAE 277
RMSE 278
Ajuste de modelos de regresión de 279
regresión polinomial para clasificación 282
Regresión logística 282
Características del modelo de regresión logística 284
Tipos de algoritmos de regresión logística 285
Ventajas y desventajas de la regresión logística 285
Implementación de regresión logística con scikit-learn 286
Resumen 288

[v]
Tabla de contenido

Capítulo 10: Aprendizaje supervisado: técnicas de clasificación 289


Requerimientos técnicos 290
Clasificación 290
Clasificación de Naive Bayes 292
Clasificación del árbol de 296
decisiones Clasificación KNN 299
Clasificación SVM 302
Terminología 302
Dividir conjuntos de entrenamiento y prueba 305
Holdout 305
Método Bootstrap de 306
validación cruzada de K-fold 306
Evaluación del desempeño del modelo de clasificación 307
Matriz de confusión 307
Precisión 310
Precisión 311
Recordar 311
Medida F 311
Curva ROC y 312
resumen AUC 315
Capítulo 11: Aprendizaje no supervisado: PCA y agrupación en clústeres 316
Requerimientos técnicos 317
Aprendizaje sin supervisión 317
Reducir la dimensionalidad de los datos 318
PCA 319
Realización de PCA 320
Agrupación 323
Encontrar la cantidad de clústeres 324
El método del codo 325
El método de la silueta 327
Particionamiento de datos mediante agrupación en clústeres de 329
k-means Agrupación jerárquica 332
Agrupación en clústeres DBSCAN 336
Agrupación espectral 338
Evaluación del rendimiento de la agrupación en clústeres 341
Evaluación de desempeño interno 342
El índice de Davies-Bouldin 342
El coeficiente de silueta 342
Evaluación externa del desempeño 343
La puntuación de Rand 343
La puntuación de Jaccard 343
Medida F o puntuación F1 344
La puntuación de Fowlkes-Mallows 344
Resumen 347

[vi]
Tabla de contenido

Sección 4: PNL, análisis de imágenes y computación en


paralelo
Capítulo 12: Análisis de datos textuales 349
Requerimientos técnicos 350
Instalación de la normalización 350
NLTK y SpaCy Text 351
Tokenización 352
Eliminar palabras vacías 356
Etiquetado POS de derivación y 358
lematización 360
Reconocer entidades 361
Análisis de dependencias 362
Creación de una nube de palabras 363
Bolsa de palabras 365
TF-IDF 366
Análisis de sentimiento mediante clasificación de texto 367
Clasificación mediante clasificación 368
BoW mediante TF-IDF 373
Similitud de texto 376
Similitud de Jaccard 377
Similitud de coseno 378
Resumen 379
Capítulo 13: Análisis de datos de imagen 380
Requerimientos técnicos 381
Instalación de OpenCV 381
Entender los datos de la imagen 382
Imágenes binarias 382
Imágenes en escala de grises 383
Imágenes en color 383
Modelos de color 384
Dibujando en imágenes 387
Escribir en imágenes 392
Cambiar el tamaño de las imágenes 393
Voltear imágenes 395
Cambiar el brillo 398
Desenfocar una imagen 399
Detección de rostro 403
Resumen 407
Capítulo 14: Computación en paralelo usando Dask 408
Computación paralela usando tipos de 409
datos Dask Dask 410

[vii]
Tabla de contenido

Matrices Dask 411


Dask DataFrames 412
Indexación de DataFrame 413
Filtrar datos 416
Agrupar por 417
Conversión de un DataFrame de pandas en un DataFrame de Dask 418
Conversión de un DataFrame de Dask en un DataFrame de pandas 418
Bolsas Dask 419
Crear una Dask Bag usando elementos iterables de Python Crear 419
una Dask Bag usando un archivo de texto 420
Almacenamiento de una Dask Bag en un archivo de texto 421
Almacenamiento de una Dask Bag en un DataFrame 421
Dask retrasado 422
Procesamiento previo de datos a escala 424
Escalado de funciones en Dask 424
Codificación de funciones en Dask 426
Aprendizaje automático a escala 428
Computación en paralelo usando scikit-learn 429
Reimplementación de algoritmos de ML para Dask 431
Regresión logística 431
Agrupación 433
Resumen 435
Índice de otros libros que puede 437
disfrutar 440

[viii]
Prefacio
El análisis de datos le permite generar valor a partir de datos pequeños y grandes al descubrir nuevos
patrones y tendencias, y Python es una de las herramientas más populares para analizar una amplia
variedad de datos. Con este libro, comenzará a usar Python para el análisis de datos mediante la
exploración de las diferentes fases y metodologías utilizadas en el análisis de datos, y aprenderá a usar
bibliotecas modernas del ecosistema de Python para crear canales de datos eficientes.

Comenzando con los fundamentos esenciales de análisis estadístico y de datos usando Python, realizará
análisis y modelado de datos complejos, manipulación de datos, limpieza de datos y visualización de datos
usando ejemplos fáciles de seguir. Luego, aprenderá a realizar análisis de series de tiempo y
procesamiento de señales utilizando modelos ARMA. A medida que avanza, se familiarizará con el
procesamiento inteligente y el análisis de datos mediante algoritmos de aprendizaje automático como
regresión, clasificación,Análisis de componentes principales (PCA) y agrupación. En los capítulos finales,
trabajará en ejemplos del mundo real para analizar datos de texto e imágenes utilizandoprocesamiento
natural del lenguaje (PNL) y técnicas de análisis de imágenes, respectivamente. Finalmente, el libro
demostrará la computación paralela usando Dask.

Al final de este libro de análisis de datos, estará equipado con las habilidades que necesita para preparar datos
para el análisis y crear visualizaciones de datos significativas con el fin de pronosticar valores a partir de los datos.

para quien es este libro


Este libro está dirigido a analistas de datos, analistas de negocios, estadísticos y científicos de datos que buscan
aprender a usar Python para el análisis de datos. Los estudiantes y las facultades académicas también
encontrarán este libro útil para aprender y enseñar el análisis de datos de Python utilizando un enfoque práctico.
Un conocimiento básico de matemáticas y un conocimiento práctico de Python lo ayudarán a comenzar con este
libro.

Que cubre este libro


Capítulo 1, Introduccióna las bibliotecas de Python, explica el proceso de análisis de datos y la
instalación exitosa de las bibliotecas de Python y Anaconda. Además, hablaremos de Jupyter
Notebook y sus funciones avanzadas.
Prefacio

Capitulo 2, NumPy y Pandas, presenta NumPy y Pandas. Este capítulo proporciona una descripción
general básica de las matrices NumPy, Pandas DataFrames y sus funciones asociadas.

Capítulo 3, Estadísticas, ofrece una descripción general rápida de las estadísticas descriptivas e inferenciales.

Capítulo 4, Álgebra lineal, ofrece una descripción general rápida del álgebra lineal y sus funciones
asociadas NumPy y SciPy.

Capítulo 5, Visualización de datos, nos presenta las bibliotecas de visualización matplotlib, seaborn,
Pandas plotting y bokeh.

Capítulo 6, Recuperar,
procesar y almacenar datos, explica cómo leer y escribir varios formatos
de datos, como CSV, Excel, JSON, HTML y Parquet. Además, discutiremos cómo adquirir datos
de bases de datos relacionales y NoSQL.

Capítulo 7, Limpieza de datos desordenados, explica cómo preprocesar datos sin procesar y realizar ingeniería de
funciones.

Capítulo 8, Procesamiento de señales y series de tiempo, contiene series de tiempo y ejemplos de procesamiento de señales
que utilizan ventas, producción de cerveza y conjuntos de datos del ciclo de las manchas solares. En este capítulo, usaremos
principalmente los modelos NumPy, SciPy y stats.

Capítulo 9, Aprendizaje supervisado: análisis de regresión, explica la regresión lineal y la regresión


logística en detalle con ejemplos adecuados utilizando la biblioteca scikit-learn.

Capítulo 10, Aprendizaje supervisado: técnicas de clasificación, explica varias técnicas de clasificación, como
Bayes ingenuo, árbol de decisión, K vecinos más cercanos y SVM. Además, discutiremos las medidas de
evaluación del desempeño del modelo.

Capítulo 11, Aprendizaje no supervisado: PCA y agrupación en clústeres, ofrece una discusión detallada sobre la
reducción de dimensionalidad y técnicas de agrupamiento. Además, evaluaremos el rendimiento de la agrupación en
clústeres.

Capítulo 12, Analizar datos textuales, ofrece una descripción general rápida del preprocesamiento de texto, la
ingeniería de funciones, el análisis de opiniones y la similitud de texto. Este capítulo utiliza principalmente las
bibliotecas NLTK, SpaCy y scikit-learn.

Capítulo 13, Analizar datos de imagen, ofrece una descripción general rápida de las operaciones de procesamiento de imágenes

mediante OpenCV. Además, hablaremos sobre la detección de rostros.

Capítulo 14, Computación


en paralelo con Dask, explica cómo realizar el preprocesamiento de datos y el
modelado de aprendizaje automático en paralelo con Dask.

[2]
Prefacio

Para aprovechar al máximo este libro


La ejecución de los ejemplos de código proporcionados en este libro requiere la instalación de Python 3.5 o
posterior en Mac OS X, Linux o Microsoft Windows. En este libro, usaremos frecuentemente SciPy, NumPy,
Pandas, scikit-learn, statsmodels, matplotlib y seaborn. El Capítulo 1, Introducción a las bibliotecas de
Python, proporciona instrucciones para la instalación y consejos avanzados para que pueda trabajar sin
problemas. Además, el proceso de instalación de bibliotecas específicas y adicionales se explica en los
capítulos respectivos. La instalación de Bokeh se explica en el Capítulo 5, Visualización de datos. De manera
similar, la instalación de NLTK y SpaCy se explica en el Capítulo 12, Análisis de datos textuales.

También podemos instalar cualquier biblioteca o paquete que desee explorar utilizando el pepita
mando. Necesitamos ejecutar el siguiente comando con privilegios de administrador:

$ pip install <nombre de la biblioteca>

También podemos instalarlo desde nuestro Jupyter Notebook con! (signo de exclamación) antes delpepita
mando:

! pip install <nombre de la biblioteca>

Para desinstalar una biblioteca de Python o un paquete instalado con pepita, use el siguiente comando:

$ pip desinstalar <nombre de la biblioteca>

Si está utilizando la versión digital de este libro, le recomendamos que escriba el código usted mismo o
acceda al código a través del repositorio de GitHub (enlace disponible en la siguiente sección). Hacerlo le
ayudará a evitar posibles errores relacionados con la copia y pegado de código.

Descargue los archivos de código de ejemplo


Puede descargar los archivos de código de ejemplo para este libro desde GitHub en https: / / github.
com / PacktPublishing / Python- Análisis de datos- Tercera edición. En caso de que haya una actualización de
el código, se actualizará en el repositorio de GitHub existente.

También tenemos otros paquetes de códigos de nuestro amplio catálogo de libros y videos disponibles.
a https: / / github. com / PacktPublishing /. ¡Échales un vistazo!

[3]
Prefacio

Descarga las imágenes en color


También proporcionamos un archivo PDF que tiene imágenes en color de las capturas de pantalla / diagramas utilizados en
este libro. Puedes descargarlo aquí:
https://static.packt-cdn.com/downloads/9781789955248_ColorImages.pdf.

Convenciones utilizadas
En este libro, encontrará varios estilos de texto y convenciones que se utilizan a lo largo de este libro. A continuación,
mostramos algunos ejemplos de estos estilos. Las palabras de código en el texto, los nombres de las tablas de la base de
datos, los nombres de las carpetas, los nombres de los archivos, las extensiones de archivos, las rutas, las URL ficticias, la
entrada del usuario y los identificadores de Twitter se muestran a continuación: "La otra convención lapandas El proyecto
insiste en que es el importar pandas como pd declaración de importación ".

Un bloque de código se establece de la siguiente manera:

# Creando una matriz


importar numpy como np

a = np.array ([2,4,6,8,10])

imprimir (a)

Cualquier entrada o salida de la línea de comandos se escribe de la siguiente manera:

$ mkdir
$ cd css

Negrita: Indica un término nuevo, una palabra importante o palabras que ve en la pantalla. Por ejemplo, las palabras en
menús o cuadros de diálogo aparecen en el texto de esta manera. A continuación, se muestra un ejemplo: "Seleccionar
Información del sistema desde el Administración panel."

Las advertencias o notas importantes aparecen así.

Los consejos y trucos aparecen así.

[4]
Prefacio

Ponerse en contacto
Los comentarios de nuestros lectores es siempre bienvenido.

Retroalimentación general: Si tiene preguntas sobre cualquier aspecto de este libro, mencione el título del
libro en el asunto de su mensaje y envíenos un correo electrónico a [email protected].

Errata: Aunque hemos tomado todas las precauciones para garantizar la precisión de nuestro contenido,
se producen errores. Si ha encontrado un error en este libro, le agradeceríamos que nos lo informara.
Por favor visitawww.packtpub.com/support/errata, seleccionando su libro, haciendo clic en el enlace
Formulario de envío de erratas e ingresando los detalles.

Piratería: Si encuentra copias ilegales de nuestros trabajos en cualquier forma en Internet, le


agradeceríamos que nos proporcionara la dirección de ubicación o el nombre del sitio web. Por
favor contáctenos [email protected] con un enlace al material.

Si está interesado en convertirse en autor: Si hay un tema en el que tiene experiencia


y está interesado en escribir o contribuir a un libro, por favor
visitar autores.packtpub.com.

Reseñas
Por favor, deje una reseña. Una vez que haya leído y utilizado este libro, ¿por qué no dejar una reseña en
el sitio donde lo compró? Los lectores potenciales pueden ver y utilizar su opinión imparcial para tomar
decisiones de compra, nosotros en Packt podemos entender lo que piensa sobre nuestros productos y
nuestros autores pueden ver sus comentarios sobre su libro. ¡Gracias!

Para obtener más información sobre Packt, visite packt.com.

[5]
Sección 1: Fundación para los datos
-
Análisis
El objetivo principal de esta sección es desarrollar habilidades fundamentales de análisis de datos para el alumno.
Estas habilidades involucran el Jupyter Notebook y bibliotecas básicas de Python como NumPy, Pandas, Scipy y
statsmodels. Además, esta sección se centra en el conocimiento subjetivo de la estadística y el álgebra lineal para
desarrollar capacidades matemáticas.

Esta sección incluye los siguientes capítulos:

Capítulo 1, Introducción a las bibliotecas de


PythonCapitulo 2, NumPy y pandasCapítulo 3,
Estadísticas
Capítulo 4, Álgebra lineal
Empezando con Python
-
Bibliotecas
Como ya sabe, Python se ha convertido en uno de los lenguajes estándar más populares y es un paquete
completo para operaciones basadas en la ciencia de datos. Python ofrece numerosas bibliotecas, como NumPy,
Pandas, SciPy, Scikit-Learn, Matplotlib, Seaborn y Plotly. Estas bibliotecas proporcionan un ecosistema completo
para el análisis de datos que utilizan los analistas de datos, científicos de datos y analistas comerciales. Python
también ofrece otras características, como flexibilidad, facilidad de aprendizaje, desarrollo más rápido, una gran
comunidad activa y la capacidad de trabajar en aplicaciones numéricas, científicas y de investigación complejas.
Todas estas características lo convierten en la primera opción para el análisis de datos.

En este capítulo, nos centraremos en varios procesos de análisis de datos, como KDD, SEMMA y CRISP-DM.
Después de esto, proporcionaremos una comparación entre el análisis de datos y la ciencia de datos, así como
los roles y diferentes conjuntos de habilidades para analistas de datos y científicos de datos. Finalmente,
cambiaremos nuestro enfoque y comenzaremos a instalar varias bibliotecas de Python, IPython, Jupyter Lab y
Jupyter Notebook. También veremos varias funciones avanzadas de Jupyter Notebooks.

En este capítulo introductorio, cubriremos los siguientes temas:

Comprender el análisis de datos


El proceso estándar de análisis de
datos El proceso KDD
SEMMA
CRISP-DM
Comparación del análisis de datos y la ciencia de datos

Las habilidades de los analistas de datos y científicos de datos


Instalación de Python 3
Software utilizado en este libro
Uso de IPython como shell
Introducción a las bibliotecas de Python Capítulo 1

Uso de Jupyter Lab


Uso de los cuadernos de Jupyter
Funciones avanzadas de los cuadernos Jupyter

¡Empecemos!

Comprender el análisis de datos


El siglo XXI es el siglo de la información. Vivimos en la era de la información, lo que significa que casi todos los
aspectos de nuestra vida diaria generan datos. No solo esto, sino que las operaciones comerciales, las
operaciones gubernamentales y las publicaciones sociales también están generando una gran cantidad de datos.
Estos datos se acumulan día a día debido a que se generan continuamente datos de actividades comerciales,
gubernamentales, científicas, de ingeniería, de salud, sociales, climáticas y ambientales. En todos estos dominios
de la toma de decisiones, necesitamos un sistema sistemático, generalizado, eficaz y flexible para el proceso
analítico y científico para que podamos obtener información sobre los datos que se están generando.

En el mundo inteligente de hoy, el análisis de datos ofrece un proceso de toma de decisiones eficaz para las
operaciones comerciales y gubernamentales. El análisis de datos es la actividad de inspeccionar, preprocesar,
explorar, describir y visualizar el conjunto de datos dado. El principal objetivo del proceso de análisis de datos es
descubrir la información necesaria para la toma de decisiones. El análisis de datos ofrece múltiples enfoques,
herramientas y técnicas, todos los cuales se pueden aplicar a diversos dominios, como los negocios, las ciencias
sociales y las ciencias fundamentales.

Veamos algunas de las bibliotecas de análisis de datos fundamentales del ecosistema Python:

NumPy: Esta es una forma corta de Python numérico. Es la biblioteca científica más
poderosa disponible en Python para manejar arreglos, matrices y métodos
multidimensionales con el fin de calcular matemáticas de manera eficiente.
Ciencia: Esta es también una poderosa biblioteca de computación científica para
realizar operaciones científicas, matemáticas y de ingeniería.
Pandas: Esta es una biblioteca de exploración y manipulación de datos que ofrece
estructuras de datos tabulares como DataFrames y varios métodos para el análisis y la
manipulación de datos.
Scikit-aprender: Significa "Kit de herramientas científicas para el aprendizaje automático". Es una
biblioteca de aprendizaje automático que ofrece una variedad de algoritmos supervisados y no
supervisados, como regresión, clasificación, reducción de dimensionalidad, análisis de conglomerados
y detección de anomalías.

[8]
Introducción a las bibliotecas de Python Capítulo 1

Matplotlib: Esta es una biblioteca de visualización de datos central y es la biblioteca base para
todas las demás bibliotecas de visualización en Python. Ofrece diagramas, gráficos, tablas y figuras
en 2D y 3D para la exploración de datos. Se ejecuta sobre NumPy y SciPy.
Seaborn: Se basa en Matplotlib y ofrece gráficos fáciles de dibujar, de alto
nivel, interactivos y más organizados.
Plotly: Plotly es una biblioteca de visualización de datos. Ofrece gráficos interactivos y de alta calidad,
como gráficos de dispersión, gráficos de líneas, gráficos de barras, histogramas, diagramas de caja,
mapas de calor y subtramas.

Las instrucciones de instalación para las bibliotecas y el software necesarios se proporcionarán a lo


largo de este libro cuando sean necesarios. Mientras tanto, analicemos varios procesos de análisis
de datos, como el proceso estándar, KDD, SEMMA y CRISP-DM.

El proceso estándar de análisis de datos


El análisis de datos se refiere a investigar los datos, encontrar información significativa a partir de ellos y
sacar conclusiones. El objetivo principal de este proceso es recopilar, filtrar, limpiar, transformar, explorar,
describir, visualizar y comunicar los conocimientos de estos datos para descubrir información para la toma
de decisiones. Generalmente, el proceso de análisis de datos se compone de las siguientes fases:

1. Recolectando datos: Recopile y recopile datos de varias fuentes.


2. Procesamiento previo de datos: Filtre, limpie y transforme los datos en el formato
requerido.
3. Analizar y encontrar información valiosa: Explore, describa y visualice los datos y
encuentre ideas y conclusiones.
4. Interpretaciones de Insights: Comprenda los conocimientos y descubra el impacto que tiene
cada variable en el sistema.
5. Narración: Comunique sus resultados en forma de historia para que un lego
pueda entenderlos.

[9]
Introducción a las bibliotecas de Python Capítulo 1

Podemos resumir estos pasos del proceso de análisis de datos a través del siguiente diagrama de
proceso:

En esta sección, hemos cubierto el proceso estándar de análisis de datos, que enfatiza la búsqueda de
información interpretable y su conversión en una historia de usuario. En la siguiente sección,
discutiremos el proceso KDD.

El proceso KDD
los KDD acrónimo significa descubrimiento de conocimiento a partir de datos o Descubrimiento de
conocimiento en bases de datos. Mucha gente trata a KDD como un sinónimo de minería de datos. La minería
de datos se conoce como el proceso de descubrimiento de conocimientos de patrones interesantes. El objetivo
principal de KDD es extraer o descubrir patrones interesantes ocultos de grandes bases de datos, almacenes de
datos y otros repositorios web y de información. El proceso KDD tiene siete fases principales:

1. Limpieza de datos: En esta primera fase, los datos se preprocesan. Aquí, se elimina el ruido, se
manejan los valores faltantes y se detectan los valores atípicos.
2. Integración de datos: En esta fase, los datos de diferentes fuentes se combinan e
integran mediante la migración de datos y las herramientas ETL.
3. Selección de datos: En esta fase se recogen datos relevantes para la tarea de análisis.

[10]
Introducción a las bibliotecas de Python Capítulo 1

4. Transformación de datos: En esta fase, los datos se diseñan en la forma adecuada


requerida para el análisis.
5. Procesamiento de datos: En esta fase, se utilizan técnicas de minería de datos para descubrir patrones
útiles y desconocidos.
6. Evaluación de patrones: En esta fase se evalúan los patrones extraídos.
7. Presentación de conocimientos: Después de la evaluación del patrón, el
conocimiento extraído debe visualizarse y presentarse a los empresarios para la
toma de decisiones.

El proceso completo de KDD se muestra en el siguiente diagrama:

KDD es un proceso iterativo para mejorar la calidad, la integración y la transformación de los datos para
obtener un sistema más mejorado. Ahora, analicemos el proceso SEMMA.

SEMMA
los SEMMA la forma completa del acrónimo es Muestra, Explorar, Modificar, Modelo, y Evaluar. Este
proceso de minería de datos secuencial es desarrollado por SAS. El proceso SEMMA tiene cinco fases
principales:

1. Muestra: En esta fase, identificamos diferentes bases de datos y las fusionamos. Después de
esto, seleccionamos la muestra de datos que es suficiente para el proceso de modelado.
2. Explorar: En esta fase, entendemos los datos, descubrimos las relaciones entre las variables,
visualizamos los datos y obtenemos interpretaciones iniciales.
3. Modificar: En esta fase, los datos se preparan para modelar. Esta fase implica lidiar con
los valores perdidos, detectar valores atípicos, transformar características y crear
nuevas características adicionales.
4. Modelo: En esta fase, la principal preocupación es seleccionar y aplicar diferentes
técnicas de modelado, como regresión lineal y logística, redes de retropropagación,
KNN, máquinas de vectores de soporte, árboles de decisión y Random Forest.
5. Evaluar: En esta última fase, los modelos predictivos que se han desarrollado se evalúan
utilizando medidas de evaluación del desempeño.

[11]
Introducción a las bibliotecas de Python Capítulo 1

El siguiente diagrama muestra este proceso:

El diagrama anterior muestra los pasos involucrados en el proceso SEMMA. SEMMA enfatiza la
construcción y evaluación de modelos. Ahora, analicemos el proceso CRISP-DM.

CRISP-DM
CRISP-DMLa forma completa es Proceso CRoss-InduStry para minería de datos. CRISP-DM es un
proceso bien definido, bien estructurado y probado para proyectos de aprendizaje automático, minería de
datos e inteligencia empresarial. Es un enfoque sólido, flexible, cíclico, útil y práctico para resolver
problemas comerciales. El proceso descubre información valiosa oculta o patrones de varias bases de
datos. El proceso CRISP-DM tiene seis fases principales:

1. Comprensión empresarial: En esta primera fase, el objetivo principal es comprender el


escenario empresarial y los requisitos para diseñar una meta analítica y un plan de
acción inicial.
2. Comprensión de datos: En esta fase, el objetivo principal es comprender los datos y su proceso de
recopilación, realizar controles de calidad de los datos y obtener conocimientos iniciales.
3. Preparación de datos: En esta fase, el objetivo principal es preparar datos listos para el análisis.
Esto implica el manejo de valores perdidos, detección y manejo de valores atípicos, normalización
de datos e ingeniería de características. Esta fase es la que más tiempo requiere para los
científicos / analistas de datos.
4. Modelado: Esta es la fase más emocionante de todo el proceso, ya que aquí es donde
se diseña el modelo con fines de predicción. Primero, el analista debe decidir la técnica
de modelado y desarrollar modelos basados en datos.
5. Evaluación: Una vez que se ha desarrollado el modelo, es hora de evaluar y probar el
rendimiento del modelo en los datos de validación y prueba utilizando medidas de
evaluación del modelo como MSE, RMSE, R-Square para regresión y precisión, precisión,
recuperación y la medida F1.
6. Despliegue: En esta fase final, el modelo que se eligió en el paso anterior se implementará en
el entorno de producción. Esto requiere un esfuerzo en equipo de científicos de datos,
desarrolladores de software, expertos en DevOps y profesionales de negocios.

[12]
Introducción a las bibliotecas de Python Capítulo 1

El siguiente diagrama muestra el ciclo completo del proceso CRISP-DM:

El proceso estándar se enfoca en descubrir ideas y hacer interpretaciones en forma de historia, mientras
que KDD se enfoca en el descubrimiento de patrones basados en datos y en visualizarlos. SEMMA se
enfoca principalmente en tareas de construcción de modelos, mientras que CRISP-DM se enfoca en la
comprensión e implementación del negocio. Ahora que conocemos algunos de los procesos que rodean
el análisis de datos, comparemos el análisis de datos y la ciencia de datos para descubrir cómo se
relacionan, así como qué los hace diferentes entre sí.

[13]
Introducción a las bibliotecas de Python Capítulo 1

Comparación del análisis de datos y la ciencia de datos


El análisis de datos es el proceso en el que se exploran los datos para descubrir patrones que nos ayuden a tomar
decisiones comerciales. Es uno de los subdominios de la ciencia de datos. Los métodos y herramientas de análisis
de datos son ampliamente utilizados en varios dominios comerciales por analistas de negocios, científicos de
datos e investigadores. Su principal objetivo es mejorar la productividad y
beneficios. El análisis de datos extrae y consulta datos de diferentes fuentes, realiza análisis de datos
exploratorios, visualiza datos, prepara informes y los presenta a las autoridades de toma de decisiones
comerciales.

Por otro lado, la ciencia de datos es un área interdisciplinaria que utiliza un enfoque científico para extraer conocimientos
de datos estructurados y no estructurados. La ciencia de datos es una unión de todos los términos, incluido el análisis de
datos, la minería de datos, el aprendizaje automático y otros dominios relacionados. La ciencia de datos no solo se limita
al análisis de datos exploratorios y se utiliza para desarrollar modelos y algoritmos de predicción, como el precio de las
acciones, el clima, las enfermedades, los pronósticos de fraude y las recomendaciones, como las recomendaciones de
películas, libros y música.

Los roles de los analistas de datos y los científicos de datos


Un analista de datos recopila, filtra, procesa y aplica los conceptos estadísticos necesarios para capturar
patrones, tendencias y conocimientos de los datos y preparar informes para la toma de decisiones. El principal
objetivo del analista de datos es ayudar a las empresas a resolver problemas comerciales utilizando patrones y
tendencias descubiertos. El analista de datos también evalúa la calidad de los datos y maneja los problemas
relacionados con la adquisición de datos. Un analista de datos debe ser competente en la redacción de
consultas SQL, la búsqueda de patrones, el uso de herramientas de visualización y el uso de herramientas de
informes Microsoft Power BI, IBM Cognos, Tableau, QlikView, Oracle BI y más.

Los científicos de datos son más técnicos y matemáticos que los analistas de datos. Los científicos de datos están orientados a
la investigación y al mundo académico, mientras que los analistas de datos están más orientados a las aplicaciones. Se espera
que los científicos de datos predigan un evento futuro, mientras que los analistas de datos extraen información significativa de
los datos. Los científicos de datos desarrollan sus propias preguntas, mientras que los analistas de datos encuentran
respuestas a preguntas determinadas. Finalmente, los científicos de datos se enfocan enQue es lo que va a pasar, mientras
que los analistas de datos se centran en Qué ha pasado hasta ahora. Podemos resumir estos dos roles usando la siguiente
tabla:

Características Científico de datos Analista de datos

Predecir eventos y escenarios futuros Descubra información valiosa a partir de


Fondo
basados en datos los datos.
Formular preguntas que puedan beneficiar al Resuelve las dudas comerciales para
Papel
negocio. tomar decisiones.

[14]
Introducción a las bibliotecas de Python Capítulo 1

Trabajar con datos estructurados


Tipo de datos Trabajar solo con datos
y no estructurados
Programación Programación avanzada estructurados Programación básica
Conocimiento de estadísticas, algoritmos de
Conocimiento de estadísticas, SQL y
Conjunto de habilidades aprendizaje automático, PNL y aprendizaje
visualización de datos.
profundo

R, Python, SAS, Hadoop, Spark, Excel, SQL, R, Tableau y


TensorFlow y Keras QlikView
Instrumentos

Ahora que sabemos qué define a un analista de datos y a un científico de datos, así como en qué se
diferencian entre sí, echemos un vistazo a las diversas habilidades que necesitaría para convertirse en
uno de ellos.

Las habilidades de los analistas de datos y los


científicos de datos
Un analista de datos es alguien que descubre información a partir de los datos y crea valor a partir de ellos. Esto ayuda a los
responsables de la toma de decisiones a comprender cómo se está desempeñando el negocio. Los analistas de datos deben
adquirir las siguientes habilidades:

Análisis de datos exploratorios (EDA): EDA es una habilidad esencial para los analistas de datos.
Ayuda a inspeccionar datos para descubrir patrones, probar hipótesis y asegurar suposiciones.

Base de datos relacional: El conocimiento de al menos una de las herramientas de bases de datos
relacionales, como MySQL o Postgre, es obligatorio. SQL es imprescindible para trabajar en bases de datos
relacionales.
Herramientas de visualización y BI: Una imagen habla más que las palabras. Las imágenes
tienen un mayor impacto en los humanos y las imágenes son una opción clara y fácil para
representar los conocimientos. Las herramientas de visualización y BI como Tableau, QlikView, MS
Power BI e IBM Cognos pueden ayudar a los analistas a visualizar y preparar informes.
Hoja de cálculo: El conocimiento de MS Excel, WPS, Libra o Google Sheets es
obligatorio para almacenar y administrar datos en forma tabular.
Habilidades de narración y presentación: El arte de contar historias es otra habilidad necesaria.
Un analista de datos debe ser un experto en conectar hechos de datos con una idea o un incidente
y convertirlos en una historia.

[ 15 ]
Introducción a las bibliotecas de Python Capítulo 1

Por otro lado, el trabajo principal de un científico de datos es resolver problemas utilizando datos. Para hacer
esto, necesitan comprender los requisitos del cliente, su dominio, su espacio de problemas y asegurarse de
que obtienen exactamente lo que realmente quieren. Las tareas que realizan los científicos de datos varían de
una empresa a otra. Algunas empresas utilizan analistas de datos y ofrecen el título de científico de datos solo
para glorificar la designación del puesto. Algunos combinan tareas de analista de datos con ingenieros de
datos y ofrecen la designación de científicos de datos; otros los asignan a tareas intensivas en aprendizaje
automático con visualizaciones de datos.

La tarea del científico de datos varía según la empresa. Algunos emplean a científicos de datos
como analistas de datos reconocidos y combinan sus responsabilidades con los ingenieros de
datos. Otros les dan la tarea de realizar una visualización intensiva de datos en las máquinas.

Un científico de datos tiene que ser un experto en todos los oficios y desempeñar múltiples funciones, incluidas las de
analista de datos, estadístico, matemático, programador, ML o ingeniero de PNL. La mayoría de las personas no son lo
suficientemente capacitadas o no son expertas en todos estos oficios. Además, adquirir las habilidades necesarias
requiere mucho esfuerzo y paciencia. Es por eso que la ciencia de datos no se puede aprender en 3 o 6 meses.
Aprender ciencia de datos es un viaje. Un científico de datos debe tener una amplia variedad de habilidades, como las
siguientes:

Matemáticas y Estadística: La mayoría de los algoritmos de aprendizaje automático se basan en


matemáticas y estadísticas. El conocimiento de las matemáticas ayuda a los científicos de datos a desarrollar
soluciones personalizadas.

Bases de datos: El conocimiento de SQL permite a los científicos de datos interactuar con la base de datos
y recopilar los datos para realizar predicciones y recomendaciones.
Aprendizaje automático: Conocimiento de técnicas de aprendizaje automático supervisado, como
análisis de regresión, técnicas de clasificación y técnicas de aprendizaje automático no supervisado,
como análisis de conglomerados, detección de valores atípicos y reducción de dimensionalidad.

Habilidades en programación: El conocimiento de la programación ayuda a los científicos de datos a


automatizar las soluciones sugeridas. Se recomienda tener conocimientos de Python y R.
Habilidades de narración y presentación.: Comunicar los resultados en forma de
narración a través de presentaciones de PowerPoint.
Tecnología de Big Data: El conocimiento de plataformas de big data como Hadoop y Spark ayuda
a los científicos de datos a desarrollar soluciones de big data para empresas a gran escala.
Herramientas de aprendizaje profundo: Las herramientas de aprendizaje profundo como Tensorflow y
Keras se utilizan en análisis de imágenes y PNL.

[ dieciséis ]
Introducción a las bibliotecas de Python Capítulo 1

Además de estos conjuntos de habilidades, también se obtiene conocimiento de paquetes / herramientas de


web scraping para extraer datos de diversas fuentes y marcos de aplicaciones web como Flask o Django para
diseñar soluciones de prototipos. Se trata de las habilidades de los profesionales de la ciencia de datos.

Ahora que hemos cubierto los conceptos básicos del análisis de datos y la ciencia de datos, profundicemos en la
configuración básica necesaria para comenzar con el análisis de datos. En la siguiente sección, aprenderemos cómo
instalar Python.

Instalación de Python 3
El archivo de instalación para instalar Python 3 se puede descargar fácilmente desde el sitio web oficial
(https: / / www. python. org / downloads /) para Windows, Linux y Mac de 32 o 64 bits
sistemas. El instalador se puede instalar haciendo doble clic en él. Este instalador también tiene un IDE
llamado "IDLE" que se puede utilizar para el desarrollo. Profundizaremos en cada uno de los sistemas
operativos en las próximas secciones.

Instalación y configuración de Python en Windows


Este libro se basa en la última versión de Python 3. Todo el código que se usará en este libro está escrito
en Python 3, por lo que necesitamos instalar Python 3 antes de que podamos comenzar a codificar. Python
es un lenguaje de código abierto, distribuido y disponible gratuitamente. También tiene licencia para uso
comercial. Hay muchas implementaciones de Python, incluidas implementaciones y distribuciones
comerciales. En este libro, nos centraremos en la implementación estándar de Python, que se garantiza
que es compatible con NumPy.

Puede descargar Python 3.9.x desde el sitio web oficial de Python: https: //
www.python.org/downloads/. Aquí puede encontrar archivos de instalación para
Windows, Linux, Mac OS X y otras plataformas de SO. Puede encontrar
instrucciones para instalar y usar Python para varios sistemas operativos
a https: / / docs. python. org / 3. 7 / using / index. html.

Necesita tener Python 3.5.xo superior instalado en su sistema. La fecha de finalización de Python
2.7 se trasladó de 2015 a 2020, pero en el momento de escribir este artículo, la comunidad de
Python no admitirá ni mantendrá Python 2.7.

En el momento de escribir este libro, teníamos Python 3.8.3 instalado como requisito previo en nuestro
Máquina virtual de Windows 10: https: / / www. python. org / ftp / python / 3. 8. 3 / python- 3. 8. 3. exe.

[17]
Introducción a las bibliotecas de Python Capítulo 1

Instalación y configuración de Python en Linux


La instalación de Python en Linux es significativamente más fácil en comparación con otros sistemas operativos. Para instalar las
bibliotecas fundamentales, ejecute la siguiente instrucción de línea de comandos:

$ pip3 instalar numpy scipy pandas matplotlib jupyter notebook

Puede ser esencial ejecutar el sudo comando antes del comando anterior si no tiene
suficientes derechos en la máquina que está utilizando.

Instalación y configuración de Python en Mac OS X con un


instalador de GUI
Python se puede instalar a través del archivo de instalación del sitio web oficial de Python. El archivo del
instalador se puede descargar desde su página web oficial (https: / / www. python. org / downloads / mac- osx /)
para macOS. Este instalador también tiene un IDE llamado "IDLE" que se puede utilizar para el
desarrollo.

Instalación y configuración de Python en Mac OS X con


brew
Para sistemas Mac, puede usar el administrador de paquetes Homebrew para instalar Python.
Facilitará la instalación de las aplicaciones necesarias para desarrolladores, investigadores y
científicos. lospreparar la instalación El comando se usa para instalar otra aplicación, como instalar
python3 o cualquier otro paquete de Python, como NLTK o SpaCy.

Para instalar la versión más reciente de Python, debe ejecutar el siguiente comando en una
Terminal:

$ brew instalar python3

[18]
Introducción a las bibliotecas de Python Capítulo 1

Después de la instalación, puede confirmar la versión de Python que ha instalado ejecutando el


siguiente comando:

$ python3 --versión
Python 3.7.4

También puede abrir Python Shell desde la línea de comando ejecutando el siguiente
comando:

$ python3

Ahora que sabemos cómo instalar Python en nuestro sistema, profundicemos en las herramientas reales que
necesitaremos para comenzar el análisis de datos.

Software utilizado en este libro


Analicemos el software que se utilizará en este libro. En este libro, usaremos Anaconda
IDE para analizar datos. Antes de instalarlo, entendamos qué es Anaconda.

Un programa de Python puede ejecutarse fácilmente en cualquier sistema que lo tenga instalado. Podemos
escribir un programa en un Bloc de notas y ejecutarlo en el símbolo del sistema. También podemos escribir y
ejecutar programas Python en diferentes IDE, como Jupyter Notebook, Spyder y PyCharm. Anaconda es un
paquete de código abierto disponible gratuitamente que contiene varios IDE de manipulación de datos y varios
paquetes como NumPy, SciPy, Pandas, Scikit-learn, etc. para fines de análisis de datos. Anaconda se puede
descargar e instalar fácilmente, de la siguiente manera:

1. Descargue el instalador de https: / / www. anaconda. com / distribution /.


2. Seleccione el sistema operativo que está utilizando.
3. En la sección Python 3.7, seleccione la opción de instalador de 32 bits o 64 bits y comience a
descargar.
4. Ejecute el instalador haciendo doble clic en él.
5. Una vez completada la instalación, verifique su programa en el Comienzo menú o
busque Anaconda en el Comienzo menú.

[19]
Introducción a las bibliotecas de Python Capítulo 1

Anaconda también tiene un Anaconda Navigator, que es una aplicación GUI de escritorio que se
puede usar para iniciar aplicaciones como Jupyter Notebook, Spyder, Rstudio, Visual Studio Code y
JupyterLab:

Ahora, echemos un vistazo a IPython, un entorno informático basado en shell para el análisis de datos.

Usando IPython como shell


IPython es un shell interactivo que equivale a un entorno informático interactivo como Matlab o
Mathematica. Este caparazón interactivo fue creado con el propósito de una rápida
experimentación. Es una herramienta muy útil para los profesionales de datos que realizan
pequeños experimentos.

El shell de IPython ofrece las siguientes características:

Fácil acceso a los comandos del sistema.


Fácil edición de comandos en línea.
Finalización de tabulación, que le ayuda a encontrar comandos y acelerar su tarea.

[20]
Introducción a las bibliotecas de Python Capítulo 1

Historial de comandos, que le ayuda a ver los comandos utilizados anteriormente.


Ejecute fácilmente scripts de Python externos.
Depuración sencilla con el depurador de Python.

Ahora, ejecutemos algunos comandos en IPython. Para iniciar IPython, use el siguiente
comando en la línea de comando:

$ ipython3

Cuando ejecute el comando anterior, aparecerá la siguiente ventana:

Ahora, entendamos y ejecutemos algunos comandos que proporciona el shell de IPython:

Comandos de historial: los historia comando utilizado para comprobar la lista de comandos
utilizados anteriormente. La siguiente captura de pantalla muestra cómo utilizarhistoriacomando
en IPython:

[21]
Introducción a las bibliotecas de Python Capítulo 1

Comandos del sistema: También podemos ejecutar comandos del sistema desde IPython
usando el signo de exclamación (!). Aquí, el comando de entrada después del signo de
exclamación se considera un comando del sistema. Por ejemplo, !fecha mostrará la fecha
actual del sistema, mientras que!pwd mostrará el directorio de trabajo actual:

Función de escritura: Podemos escribir funciones como las escribiríamos en


cualquier IDE, como Jupyter Notebook, Python IDLE, PyCharm o Spyder. Veamos
un ejemplo de función:

Salga de Ipython Shell: Puede salir o salir del shell de IPython usando dejar() o
Salida() o CTRL + D:

También puede salir del shell de IPython usando el dejar() mando:

[22]
Introducción a las bibliotecas de Python Capítulo 1

En esta subsección, hemos visto algunos comandos básicos que podemos usar en el shell de IPython.
Ahora, analicemos cómo podemos usar elayuda comando en el shell de IPython.

Lectura de páginas del manual


En el shell de IPython, podemos abrir una lista de comandos disponibles usando el ayuda mando. No
es obligatorio escribir el nombre completo de la función. Puede escribir algunos caracteres iniciales y
luego presionar elpestaña y encontrará la palabra que está buscando. Por ejemplo, usemos el
arreglar() función. Hay dos formas en que podemos encontrar ayuda sobre las funciones:

Utilice la función de ayuda: Vamos a escribir ayuda y escriba algunos caracteres iniciales de la función.
Después de eso, presione elpestaña , seleccione una función con las teclas de flecha y presione la tecla
Ingresar llave:

Utilice un signo de interrogación: También podemos usar un signo de interrogación después del nombre
de la función. La siguiente captura de pantalla muestra un ejemplo de esto:

En esta subsección, analizamos la ayuda y la compatibilidad con el signo de interrogación que se proporciona para las
funciones del módulo. También podemos obtener ayuda de la documentación de la biblioteca. Analicemos cómo obtener
documentación para el análisis de datos en las bibliotecas de Python.

[23]
Introducción a las bibliotecas de Python Capítulo 1

Dónde encontrar ayuda y referencias a las bibliotecas de análisis


de datos de Python
La siguiente tabla enumera los sitios web de documentación para las bibliotecas de análisis de datos de Python
que hemos discutido en este capítulo:

Paquetes / Software Descripción


NumPy https: / / numpy. org / doc / https: / / docs. scipy. org /
Ciencia doc / https: / / pandas. pydata. org / docs / Https: / /
Pandas matplotlib. Org / 3. 2. 1 / contenido. Html https: / /
Matplotlib seaborn. Pydata. Org /
Seaborn
Scikit-aprender https: / / scikit- learn. org / stable / https: / / www.
Anaconda anaconda. com / distribution /

También puede encontrar respuestas a varias preguntas de programación de Python relacionadas con NumPy,
SciPy, Pandas, Matplotlib, Seaborn y Scikit-learn en la plataforma StackOverflow. También puede plantear problemas
relacionados con las bibliotecas mencionadas anteriormente en GitHub.

Usando JupyterLab
JupyterLab es una interfaz de usuario basada en web de próxima generación. Ofrece una combinación de análisis de datos y
herramientas de desarrollo de productos de aprendizaje automático, como un editor de texto, portátiles, consolas de código y
terminales. Es una herramienta flexible y poderosa que debería formar parte del conjunto de herramientas de cualquier analista
de datos:

[24]
Introducción a las bibliotecas de Python Capítulo 1

Puede instalar JupyterLab usando conda, pip, o pipenv.

Para instalar usando conda, podemos usar el siguiente comando:

$ conda install -c conda-forge jupyterlab

Para instalar usando pepita, podemos usar el siguiente comando:

$ pip instalar jupyterlab

Para instalar usando pipenv, podemos usar el siguiente comando:

$ pipenv instalar jupyterlab

En esta sección, hemos aprendido cómo instalar Jupyter Lab. En la siguiente sección, nos centraremos en los
cuadernos de Jupyter.

[25]
Introducción a las bibliotecas de Python Capítulo 1

Uso de los cuadernos de Jupyter


Jupyter Notebook es una aplicación web que se utiliza para crear cuadernos de análisis de datos que
contienen código, texto, figuras, enlaces, ecuaciones matemáticas y gráficos. Recientemente, la comunidad
presentó la próxima generación de Jupyter Notebooks basados en la web, llamada JupyterLab. Puede echar
un vistazo a estas colecciones de cuadernos en los siguientes enlaces:

https: / / github. com / jupyter / jupyter / wiki / Una- galería- de- interesantes-Jupyter-
Cuadernos
https: / / nbviewer. jupyter. org /

A menudo, estos cuadernos se utilizan como herramientas educativas o para demostrar el software Python.
Podemos importar o exportar cuadernos desde código simple de Python o desde el formato de cuaderno
especial. Los portátiles se pueden ejecutar localmente o podemos ponerlos a disposición en línea ejecutando
un servidor de portátiles dedicado. Ciertas soluciones de computación en la nube, como Wakari, PiCloud y
Google Colaboratory, le permiten ejecutar cuadernos en la nube.

"Jupyter" es un acrónimo que significa Julia, Python y R. Inicialmente, los desarrolladores lo


implementaron para estos tres lenguajes, pero ahora se usa para varios otros lenguajes,
incluidos C, C ++, Scala, Perl, Go, PySpark y Haskell:

[26]
Introducción a las bibliotecas de Python Capítulo 1

Jupyter Notebook ofrece las siguientes características:

Tiene la capacidad de editar código en el navegador con la sangría adecuada. Tiene


la capacidad de ejecutar código desde el navegador.
Tiene la capacidad de mostrar la salida en el navegador.
Puede representar gráficos, imágenes y videos en la salida de la celda.
Tiene la capacidad de exportar código en formato PDF, HTML, Python y LaTex.

También podemos usar Python 2 y 3 en Jupyter Notebooks ejecutando los siguientes


comandos en el indicador de Anaconda:

# Para Python 2.7


conda crear -n py27 python = 2.7 ipykernel

# Para Python 3.5


conda crear -n py35 python = 3.5 ipykernel

Ahora que conocemos varias herramientas y bibliotecas y también hemos instalado Python,
pasemos a algunas de las funciones avanzadas de la herramienta más utilizada, Jupyter
Notebooks.

Funciones avanzadas de los cuadernos Jupyter


Jupyter Notebook ofrece varias funciones avanzadas, como atajos de teclado, instalación de otros
núcleos, ejecución de comandos de shell y uso de varias extensiones para operaciones de análisis de
datos más rápidas. Comencemos y comprendamos estas características una por una.

[27]
Introducción a las bibliotecas de Python Capítulo 1

Atajos de teclado
Los usuarios pueden encontrar todos los comandos de acceso directo que se pueden utilizar dentro de Jupyter
Notebook seleccionando el Atajos de teclado opción en el Ayudar menú o usando el Cmd + Mayús + P tecla de
acceso directo. Esto hará que aparezca la barra de selección rápida, que contiene todos los comandos de atajos,
junto con una breve descripción de cada uno. Es fácil de usar la barra y los usuarios pueden usarla cuando
olvidan algo:

[28]
Introducción a las bibliotecas de Python Capítulo 1

Instalación de otros núcleos


Jupyter tiene la capacidad de ejecutar múltiples núcleos para diferentes idiomas. Es muy fácil configurar
un entorno para un idioma en particular en Anaconda. Por ejemplo, un kernel R se puede configurar
usando el siguiente comando en Anaconda:

$ conda install -cr r-essentials

El kernel R debería aparecer, como se muestra en la siguiente captura de pantalla:

[29]
Introducción a las bibliotecas de Python Capítulo 1

Ejecutar comandos de shell


En Jupyter Notebook, los usuarios pueden ejecutar comandos de shell para Unix y Windows. El caparazón ofrece
una interfaz de comunicación para hablar con la computadora. ¡El usuario necesita poner! (un signo de
exclamación) antes de ejecutar cualquier comando:

Extensiones para Notebook


Las extensiones de notebook (o nbextensions) agregan más funciones en comparación con las notebooks básicas de Jupyter.
Estas extensiones mejoran la experiencia y la interfaz del usuario. Los usuarios pueden seleccionar fácilmente cualquiera de las
extensiones seleccionando elNBextensiones pestaña.

Instalar nbextension en Jupyter Notebook usando conda, ejecute el siguiente comando:

conda install -c conda-forge jupyter_nbextensions_configurator

Instalar nbextension en Jupyter Notebook usando pepita, ejecute el siguiente comando:

pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install

[30]
Introducción a las bibliotecas de Python Capítulo 1

Si obtiene errores de permiso en macOS, simplemente ejecute el siguiente comando:

pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install --user

Todas las nbextensiones configurables se mostrarán en una pestaña diferente, como se muestra en la
siguiente captura de pantalla:

Ahora, exploremos algunas características útiles de las extensiones de Notebook:

Retaguardia: Esto proporciona un menú de autocompletado para cada pulsación de tecla que se
realiza en las celdas y se comporta como PyCharm:

[31]
Introducción a las bibliotecas de Python Capítulo 1

Tabla de contenido: Esta extensión muestra todos los títulos en la barra lateral o en el
menú de navegación. Es redimensionable, arrastrable, plegable y acoplable:

Tiempo de ejecución: Esta extensión muestra cuándo se ejecutaron las celdas y cuánto
tiempo tomará completar el código de la celda:

Corrector ortográfico: El corrector ortográfico comprueba y verifica la ortografía que está


escrita en cada celda y resalta las palabras escritas incorrectamente.

[32]
Introducción a las bibliotecas de Python Capítulo 1

Selector de variables: Esta extensión realiza un seguimiento del espacio de trabajo del usuario.
Muestra los nombres de todas las variables que creó el usuario, junto con su tipo, tamaño, forma
y valor.

Diapositivas: Los resultados del cuaderno se pueden comunicar a través de Presentación de diapositivas. Esta es una gran
herramienta para contar historias. Los usuarios pueden convertir fácilmente Jupyter Notebooks en diapositivas sin el uso de
PowerPoint. Como se muestra en la siguiente captura de pantalla, la presentación de diapositivas se puede iniciar usando el
Diapositivas opción en la barra de herramientas de la celda del menú Ver:

[33]
Introducción a las bibliotecas de Python Capítulo 1

Jupyter Notebook también le permite mostrar u ocultar cualquier celda en Presentación de diapositivas. Después de agregar el
Diapositivas opción a la barra de herramientas de la celda del menú de vista, puede utilizar una Tipo de diapositiva lista
desplegable en cada celda y seleccione varias opciones, como se muestra en la siguiente captura de pantalla:

Incrustar documentos PDF: Los usuarios de Jupyter Notebook pueden agregar fácilmente
documentos PDF. Se debe ejecutar la siguiente sintaxis para documentos PDf:

desde IPython.display importar IFrame IFrame ('https://arxiv.org/pdf/


1811.02141.pdf', ancho = 700, alto = 400)

Esto da como resultado la siguiente salida:

[34]
Introducción a las bibliotecas de Python Capítulo 1

Incorporación de videos de Youtube: Los usuarios de Jupyter Notebook pueden agregar fácilmente
videos de YouTube. Se debe ejecutar la siguiente sintaxis para agregar videos de YouTube:

desde IPython.display importar YouTubeVideo YouTubeVideo


('ukzFI9rgwfU', ancho = 700, alto = 400)

[35]
Introducción a las bibliotecas de Python Capítulo 1

Esto da como resultado la siguiente salida:

Con eso, ahora comprende el análisis de datos, el proceso que lleva a cabo y las funciones
que conlleva. También ha aprendido a instalar Python y a utilizar Jupyter Lab y Jupyter
Notebook. Aprenderá más sobre varias bibliotecas de Python y técnicas de análisis de datos
en los próximos capítulos.

Resumen
En este capítulo, hemos discutido varios procesos de análisis de datos, incluidos KDD, SEMMA y
CRISP-DM. Luego discutimos los roles y habilidades de los analistas de datos y científicos de datos.
Después de eso, instalamos NumPy, SciPy, Pandas, Matplotlib, IPython, Jupyter Notebook, Anaconda
y Jupyter Lab, todos los cuales usaremos en este libro. En lugar de instalar todos esos módulos,
puede instalar Anaconda o Jupyter Lab, que tiene incorporados NumPy, Pandas, SciPy y Scikit-learn.

Luego, hicimos funcionar un programa de adición de vectores y aprendimos cómo NumPy ofrece un
rendimiento superior en comparación con las otras bibliotecas. Exploramos la documentación disponible y
los recursos en línea. Además, hablamos de Jupyter Lab, Jupyter Notebook y sus características.

En el próximo capítulo, Capítulo 2, NumPy y Pandas, echaremos un vistazo a NumPy y Pandas bajo
el capó y exploraremos algunos de los conceptos fundamentales que rodean las matrices y
DataFrames.

[36]
NumPy y pandas
-
Ahora que hemos entendido el análisis de datos, su proceso y su instalación en diferentes
plataformas, es hora de aprender sobre las matrices NumPy y pandas DataFrames. Este capítulo
lo familiariza con los fundamentos de las matrices NumPy ypandas DataFrames. Al final de este
capítulo, tendrá un conocimiento básico de las matrices NumPy ypandasDataFrames y sus
funciones relacionadas.

pandas lleva el nombre de datos de panel (un término econométrico) y análisis de datos de Python y es una
popular biblioteca de Python de código abierto. Aprenderemos sobre básicopandas funcionalidades,
estructuras de datos y operaciones en este capítulo. El oficialpandas la documentación insiste en nombrar
el proyecto pandas en todas las letras minúsculas. La otra convención lapandas El proyecto insiste en que es
el importar pandas como pd declaración de importación.

En este capítulo, nuestro enfoque estará en los siguientes temas:

Comprensión de las matrices NumPy Tipos de

datos numéricos de matrices NumPy

Manipulación de formas de matrices

El apilamiento de matrices NumPy


Particionamiento de matrices NumPy
Cambiar el tipo de datos de matrices
NumPy Crear vistas y copias NumPy Cortar
matrices NumPy
Matrices de difusión de indexación
booleana y sofisticada
Creando pandas Comprensión de
DataFrames pandas Serie Lectura y
consulta de los datos de Quandl
Describiendo pandas DataFrames
NumPy y pandas Capitulo 2

Agrupar y unir pandas DataFrames


Trabajar con valores perdidos
Creando tablas dinámicas
Lidiar con las fechas

Requerimientos técnicos
Este capítulo tiene los siguientes requisitos técnicos:

Puede encontrar el código y el conjunto de datos en el siguiente enlace de GitHub: https: / /


github. com / PacktPublishing / Python- Análisis de datos- Tercera edición / tree / master /
Chapter02.
Todos los bloques de código están disponibles en ch2.ipynb.

Este capítulo utiliza cuatro archivos CSV (WHO_first9cols.csv, dest.csv,


purchase.csv, y tips.csv) con fines de práctica.
En este capítulo, usaremos NumPy, pandas y bibliotecas Quandl Python.

Entendiendo las matrices NumPy


NumPy se puede instalar en una PC usando pepita o elaborar cerveza pero si el usuario está utilizando
Jupyter Notebook, no es necesario instalarlo. NumPy ya está instalado en Jupyter Notebook. Le sugeriré
que utilice Jupyter Notebook como su IDE porque estamos ejecutando todo el código en Jupyter
Notebook. Ya lo hemos mostrado enCapítulo 1,Introducción a las bibliotecas de Python, cómo instalar
Anaconda, que es una suite completa para el análisis de datos. Las matrices NumPy son una serie de
elementos homogéneos. Homogéneo significa que la matriz tendrá todos los elementos del mismo tipo
de datos. Creemos una matriz usando NumPy. Puede crear una matriz utilizando elformación() función con
una lista de elementos. Los usuarios también pueden corregir el tipo de datos de una matriz. Los posibles
tipos de datos sonbool, int, flotar, largo, doble, y
doble largo.

Veamos cómo crear una matriz vacía:


# Creando una matriz
importar numpy como np
a = np.array ([2,4,6,8,10]) imprimir
(a)

Producción:
[2 4 6 8 10]

[38]
NumPy y pandas Capitulo 2

Otra forma de crear una matriz NumPy es con arange (). Crea una matriz NumPy espaciada
uniformemente. Se pueden pasar tres valores (inicio, parada y paso) alarange (iniciar, [detener],
paso) función. El inicio es el valor inicial del rango, la parada es el último valor del rango y el paso es
el incremento en ese rango. El parámetro de parada es obligatorio. En el siguiente ejemplo, hemos
utilizado1 como el comienzo y 11 como parámetro de parada. losnaranja (1,11) La función devolverá
de 1 a 10 valores con un paso porque el paso es, por defecto, 1. El arreglar() La función genera un
valor que es uno menos que el valor del parámetro de parada. Entendamos esto a través del
siguiente ejemplo:

# Creando una matriz usando arange ()


importar numpy as np a =
np.arange (1,11)
imprimir (a)

Producción:
[1 2 3 4 5 6 7 8 9 10]

Aparte de la formación() y arange () funciones, hay otras opciones, comoceros (), unos (), completo (),
ojo (), y aleatorio(), que también se puede usar para crear una matriz NumPy, ya que estas
funciones son marcadores de posición iniciales. Aquí hay una descripción detallada de cada
función:

ceros (): los ceros ()La función crea una matriz para una dimensión determinada con todos los
ceros.
unos(): los unos() La función crea una matriz para una dimensión dada con todos.

llenos (): los lleno() La función genera una matriz con valores constantes.ojos(): los
ojo() La función crea una matriz de identidad.aleatorio(): los aleatorio() La función
crea una matriz con cualquier dimensión dada.

Entendamos estas funciones a través del siguiente ejemplo:


importar numpy como np

# Crea una matriz de todos los ceros


p = np.zeros ((3,3))
imprimir (p)

# Crea una matriz de todos


q = np.ones ((2,2))
imprimir (q)

# Crea una matriz constante


r = np. completo ((2,2), 4)

[39]
NumPy y pandas Capitulo 2

imprimir (r)

# Crea una matriz de identidad de 2x2


s = np.eye (4)
huellas dactilares)

# Crea una matriz llena de valores aleatorios


t = np.random.random ((3,3)) print (t)

Esto da como resultado la siguiente salida:

[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]

[[1. 1.]
[1. 1.]]

[[4 4]
[4 4]]

[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]

[[0.16681892 0.00398631 0.61954178]


[0.52461924 0.30234715 0.58848138]
[0.75172385 0.17752708 0.12665832]]

En el código anterior, hemos visto algunas funciones integradas para crear matrices con valores todos
cero, valores todos uno y valores todos constantes. Después de eso, hemos creado la matriz de identidad
usando elojo() función y una matriz aleatoria utilizando la random.random ()función. Veamos algunas otras
características de la matriz en la siguiente sección.

[40]
NumPy y pandas Capitulo 2

Características de la matriz

En general, las matrices NumPy son un tipo homogéneo de estructura de datos que tiene los mismos tipos de
elementos. El principal beneficio de una matriz es la certeza del tamaño de almacenamiento debido al mismo tipo
de elementos. Una lista de Python usa un bucle para iterar los elementos y realizar operaciones en ellos. Otro
beneficio de las matrices NumPy es ofrecer operaciones vectorizadas en lugar de iterar cada elemento y realizar
operaciones en él. Las matrices NumPy se indexan como una lista de Python y comienzan desde 0. NumPy utiliza
una API C optimizada para el procesamiento rápido de las operaciones de la matriz.

Hagamos una matriz usando el arange () función, como hicimos en la sección anterior, y
verifiquemos su tipo de datos:

# Creando una matriz usando arange ()


importar numpy as np a =
np.arange (1,11)

imprimir (tipo (a))


imprimir (un tipo de letra)

Producción:
<clase 'numpy.ndarray'> int64

Cuando usas escribe(), vuelve numpy.ndarray. Esto significa que el escribe() La función devuelve el
tipo de contenedor. Cuando usasdtype (), volverá int64, ya que es el tipo de los elementos.
También puede obtener la salida comoint32 si está utilizando Python de 32 bits. Ambos casos
usan números enteros (32 y 64 bits). Las matrices NumPy unidimensionales también se conocen
como vectores.

Averigüemos la forma del vector que produjimos hace unos minutos:


imprimir (una forma)
Producción: (10,)

Como puede ver, el vector tiene 10 elementos con valores que van del 1 al 10. El formala propiedad
de la matriz es una tupla; en este caso, es una tupla de un elemento, que contiene la longitud en
cada dimensión.

[41]
NumPy y pandas Capitulo 2

Seleccionar elementos de matriz


En esta sección, veremos cómo seleccionar los elementos de la matriz. Veamos un ejemplo de una matriz
2 * 2:

a = np.array ([[5,6], [7,8]]) imprimir


(a)

Producción:
[[5 6]
[7 8]]

En el ejemplo anterior, la matriz se crea utilizando el formación() función con la lista de entrada de
listas.

Seleccionar elementos de matriz es bastante simple. Solo necesitamos especificar el índice de la matriz comoa
[m, n]. Aquí, metro es el índice de fila y norte es el índice de columna de la matriz. Ahora seleccionaremos cada
elemento de la matriz uno por uno como se muestra en el siguiente código:

imprimir (a [0,0])
Producción: 5

imprimir (a [0,1])
Producción: 6

printa ([1,0])
Producción: 7

printa ([1,1])
Producción: 8

En el ejemplo de código anterior, hemos intentado acceder a cada elemento de una matriz utilizando índices de matriz.
También puede comprender esto mediante el diagrama que se menciona aquí:

[42]
NumPy y pandas Capitulo 2

En el diagrama anterior, podemos ver que tiene cuatro bloques y cada bloque representa el
elemento de una matriz. Los valores escritos en cada bloque muestran sus índices.

En esta sección, hemos entendido los fundamentos de las matrices. Ahora, pasemos a las matrices de tipos
de datos numéricos.

Tipos de datos numéricos de matriz NumPy


Python ofrece tres tipos de tipos de datos numéricos: tipo entero, tipo flotante y tipo complejo. En la
práctica, necesitamos más tipos de datos para operaciones de computación científica con precisión,
rango y tamaño. NumPy ofrece una gran cantidad de tipos de datos con tipos y números matemáticos.
Veamos la siguiente tabla de tipos numéricos de NumPy:

Tipo de datos Detalles


Este es un tipo booleano que almacena un poco y toma Cierto o Falso
bool
valores.
inti Los enteros de plataforma pueden ser int32 o int64.Los valores de
int8 almacenamiento de bytes van desde -128 para 127.Esto almacena números
int16 enteros que van desde -32768 para 32767.Esto almacena números enteros
int32 que van desde -2 ** 31 para 2 ** 31 -1.Esto almacena números enteros que
int64 van desde -2 ** 63 para 2 ** 63 -1.Esto almacena enteros sin signo que van
uint8 desde 0 para 255.Esto almacena enteros sin signo que van desde 0 para
uint16 65535.Esto almacena enteros sin signo que van desde 0 para 2 ** 32 - 1.Esto

uint32 almacena enteros sin signo que van desde 0 para 2 ** 64 - 1.


uint64
Flotador de media precisión; bit de signo con exponente de 5 bits y mantisa de
float16
10 bits.

Flotador de precisión simple; bit de signo con exponente de 8 bits y mantisa de 23


float32
bits.

Flotador de doble precisión; bit de signo con exponente de 11 bits y mantisa de


float64 o flotador
52 bits.
El número complejo almacena dos flotantes de 32 bits: número real e
complex64
imaginario.
complex128 o El número complejo almacena dos flotantes de 64 bits: número real e
complejo imaginario.

[43]
NumPy y pandas Capitulo 2

Para cada tipo de datos, existe una función de conversión coincidente:

imprimir (np.float64 (21))


Producción: 21,0

imprimir (np.int8 (21.0))


Producción: 42

imprimir (np.bool (21))


Producción: Cierto

imprimir (np.bool (0))


Producción: Falso

imprimir (np.bool (21.0))


Producción: Cierto

imprimir (np.float (verdadero))


Producción: 1.0

imprimir (np.float (falso))


Producción: 0.0

Muchas funciones tienen un argumento de tipo de datos, que con frecuencia es opcional:

arr = np. rango (1,11, dtype= np.float32) imprimir


(arr)

Producción:
[1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]

Es importante tener en cuenta que no se le permite convertir un número complejo en un entero.


Si intenta convertir tipos de datos complejos en números enteros, obtendráError de tecleado.
Veamos el siguiente ejemplo:

np.int (42.0 + 1.j)

Esto da como resultado la siguiente salida:

[44]
NumPy y pandas Capitulo 2

Obtendrá el mismo error si intenta convertir un número complejo en un punto flotante.

Pero puede convertir valores flotantes en números complejos configurando piezas individuales.
También puede extraer las piezas con elverdadero y imag atributos. Veamos eso usando el
siguiente ejemplo:

C= complejo (42, 1)
imprimir (c)

Producción: (42 + 1j)

imprimir (c.real, c.imag)

Producción: 42,0 1,0

En el ejemplo anterior, ha definido un número complejo utilizando el complejo()método.


Además, ha extraído los valores reales e imaginarios utilizando elverdadero y imagatributos.
Saltemos ahora adtype objetos.

objetos dtype
Hemos visto en secciones anteriores del capítulo que dtype nos dice el tipo de elementos individuales de
una matriz. Los elementos de la matriz NumPy tienen el mismo tipo de datos, lo que significa que todos
los elementos tienen el mismodtype. dtypeLos objetos son instancias del numpy.dtype clase:

# Creando una matriz


importar numpy como np
a = np.array ([2,4,6,8,10])

imprimir (un tipo de letra)


Producción: 'int64 '

dtype Los objetos también nos dicen el tamaño del tipo de datos en bytes usando el tamaño del artículo propiedad:

imprimir (a.dtype.itemsize)
Producción:8

[45]
NumPy y pandas Capitulo 2

Códigos de caracteres de tipo de datos


Se incluyen códigos de caracteres para compatibilidad con versiones anteriores de Numeric. Numeric es
el predecesor de NumPy. No se recomienda su uso, pero el código se proporciona aquí porque aparece
en varias ubicaciones. Deberías usar eldtype objeto en su lugar. La siguiente tabla enumera varios tipos
de datos diferentes y los códigos de caracteres relacionados con ellos:

Escribe Código de carácter

Entero I
Entero sin signo tu
Flotador de precisión simple F
Flotador de doble precisión D
Bool B
Complejo D
Cuerda S
Unicode U
Vacío V

Echemos un vistazo al siguiente código para producir una matriz de flotantes de precisión simple:

# Crea una matriz numpy usando la función arange ()


var1 = np.arange (1,11, dtype = 'f') print
(var1)

Producción:
[1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]

Asimismo, el siguiente código crea una matriz de números complejos:

print (np.arange (1,6, dtype = 'D'))

Producción:
[1. + 0.j, 2. + 0.j, 3. + 0.j, 4. + 0.j, 5. + 0.j]

[46]
NumPy y pandas Capitulo 2

constructores dtype
Hay muchas formas de crear tipos de datos utilizando constructores. Los constructores se utilizan para
crear instancias o asignar un valor a un objeto. En esta sección, entenderemos la creación de tipos de datos
con la ayuda de un ejemplo de datos de punto flotante:

Para probar un flotante Python general, use lo siguiente:

imprimir (np.dtype (flotante))


Producción: float64

Para probar un flotante de precisión simple con un código de carácter, use lo siguiente:

imprimir (np.dtype ('f'))


Producción: float32

Para probar un flotante de doble precisión con un código de carácter, use lo siguiente:

imprimir (np.dtype ('d'))


Producción: float64

Para probar un dtype constructor con un código de dos caracteres, utilice lo siguiente:

imprimir (np.dtype ('f8'))


Producción: float64

Aquí, el primer carácter representa el tipo y un segundo carácter es un número que


especifica el número de bytes del tipo, por ejemplo, 2, 4 u 8.

atributos dtype
los dtype class ofrece varios atributos útiles. Por ejemplo, podemos obtener información sobre el
código de carácter de un tipo de datos usando eldtype atributo:

# Crear matriz numpy


var2 = np.array ([1,2,3], dtype = 'float64')

imprimir (var2.dtype.char)

Producción: 'D'

los escribe atributo corresponde al tipo de objeto de los elementos de la matriz:

imprimir (var2.dtype.type)

Producción: <clase 'numpy.float64'>

[47]
NumPy y pandas Capitulo 2

Ahora que sabemos todo sobre los distintos tipos de datos utilizados en las matrices NumPy,
comencemos a manipularlos en la siguiente sección.

Manipulación de formas de matriz


En esta sección, nuestro enfoque principal es la manipulación de matrices. Aprendamos algo nuevo de Python
funciones de NumPy, como reshape (), aplanar (), ravel (), transpose (), yresize ():

remodelar () cambiará la forma de la matriz:

# Crea una matriz


arr = np. rango (12)
imprimir (arr)

Producción: [ 0 1 2 3 4 5 6 7 8 9 10 11]

# Remodelar la dimensión de la matriz


new_arr = arr.reshape (4,3)

imprimir (new_arr)

Producción: [[ 0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[9, 10, 11]]

# Remodelar la dimensión de la matriz


new_arr2 = arr.reshape (3,4)

imprimir (new_arr2)

Producción:
matriz ([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11]])

Otra operación que se puede aplicar a las matrices es aplanar(). aplanar()


transforma una matriz n-dimensional en una matriz unidimensional:

# Crea una matriz


arr = np.arange (1,10) .reshape (3,3) print
(arr)

Producción:

[48]
NumPy y pandas Capitulo 2

[[1 2 3]
[4 5 6]
[7 8 9]]

imprimir (arr.flatten ())

Producción:
[1 2 3 4 5 6 7 8 9]

los enmarañar() función es similar a la aplanar() función. También transforma una


matriz n-dimensional en una matriz unidimensional. La principal diferencia es que
aplanar() devuelve la matriz real mientras enmarañar() devuelve la referencia de la
matriz original. losenmarañar() La función es más rápida que la aplanar() función
porque no ocupa memoria extra:

imprimir (arr.ravel ())

Producción:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

los transponer() función es una función algebraica lineal que transpone la


matriz bidimensional dada. La palabra transponer significa convertir filas en
columnas y columnas en filas:

# Transponer la matriz
imprimir (arr.transpose ())

Producción:
[[1 4 7]
[2 5 8]
[3 6 9]]

los redimensionar () La función cambia el tamaño de la matriz NumPy. Esto es


similar aremodelar () pero cambia la forma de la matriz original:

# cambiar el tamaño de la matriz


tamaño arr. (1,9)
imprimir (arr)

Producción:[[1 2 3 4 5 6 7 8 9]]

En todo el código de esta sección, hemos visto funciones integradas como reshape (), aplanar (), ravel (),
transpose (), y redimensionar () para manipular el tamaño. Ahora es el momento de aprender sobre el
apilamiento de matrices NumPy.

[49]
NumPy y pandas Capitulo 2

El apilamiento de matrices NumPy


NumPy ofrece una pila de matrices. Apilar significa unir las mismas matrices dimensionales junto con un
nuevo eje. El apilado se puede realizar de forma horizontal, vertical, en columnas, en filas o en
profundidad:

Apilamiento horizontal: En el apilamiento horizontal, las mismas matrices


dimensionales se unen junto con un eje horizontal utilizando el hstack () y
concatenar()funciones. Veamos el siguiente ejemplo:

arr1 = np.arange (1,10) .reshape (3,3) print


(arr1)

Producción:
[[1 2 3]
[4 5 6]
[7 8 9]]

Hemos creado una matriz de 3 * 3; es hora de crear otra matriz de 3 * 3:

arr2 = 2 * arr1
imprimir (arr2)

Producción:
[[2 4 6]
[8 10 12]
[14 16 18]]

Después de crear dos matrices, realizaremos un apilamiento horizontal:

# Apilamiento horizontal
arr3 = np.hstack ((arr1, arr2)) print
(arr3)

Producción:
[[1 2 3 2 4 6]
[4 5 6 8 10 12] [7 8 9 14
16 18]]

En el código anterior, dos matrices se apilan horizontalmente a lo largo de la X eje. los


concatenar() La función también se puede utilizar para generar el apilado horizontal con el
valor del parámetro del eje 1:

# Apilado horizontal usando la función concatenar ()


arr4 = np.concatenar ((arr1, arr2), eje = 1) imprimir
(arr4)

[50]
NumPy y pandas Capitulo 2

Producción:
[[1 2 3 2 4 6]
[4 5 6 8 10 12] [7 8 9 14
16 18]]

En el código anterior, se han apilado dos matrices horizontalmente usando el


concatenar() función.

Apilamiento vertical: En el apilamiento vertical, las mismas matrices dimensionales


se unen junto con un eje vertical utilizando el vstack () y concatenar() funciones.
Veamos el siguiente ejemplo:

# Apilado vertical
arr5 = np.vstack ((arr1, arr2)) print
(arr5)

Producción:
[[1 2 3]
[4 5 6]
[7 8 9]
[2 4 6]
[8 10 12]
[14 16 18]]

En el código anterior, dos matrices se apilan verticalmente a lo largo de la y eje. losconcatenar() La


función también se puede utilizar para generar apilamiento vertical con el valor del parámetro del
eje 0:

arr6 = np.concatenar ((arr1, arr2), eje = 0) imprimir


(arr6)

Producción:
[[1 2 3]
[4 5 6]
[7 8 9]
[2 4 6]
[8 10 12]
[14 16 18]]

En el código anterior, dos matrices se apilan verticalmente usando el


concatenar() función.

[51]
NumPy y pandas Capitulo 2

Apilamiento en profundidad: En el apilamiento en profundidad, las mismas matrices dimensionales se


unen junto con un tercer eje (profundidad) utilizando el dstack () función. Veamos el siguiente ejemplo:

arr7 = np.dstack ((arr1, arr2)) print


(arr7)

Producción:
[[[1 2]
[2 4]
[3 6]]

[[4 8]
[5 10]
[6 12]]

[[7 14]
[8 16]
[9 18]]]

En el código anterior, dos matrices se apilan en profundidad junto con un tercer eje
(profundidad).

Apilamiento de columnas: El apilamiento de columnas apila matrices unidimensionales de secuencia


múltiple como columnas en una única matriz bidimensional. Veamos un ejemplo de apilamiento de
columnas:

# Crear matriz 1-D


arr1 = np. rango (4,7)
imprimir (arr1)

Producción: [4, 5, 6]

En el bloque de código anterior, hemos creado una matriz NumPy unidimensional.

# Crear matriz 1-D


arr2 = 2 * arr1
imprimir (arr2)

Producción: [ 8, 10, 12]

En el bloque de código anterior, hemos creado otra matriz NumPy


unidimensional.

# Crear pila de columnas


arr_col_stack = np.column_stack ((arr1, arr2)) print
(arr_col_stack)

[52]
NumPy y pandas Capitulo 2

Producción:
[[4 8]
[5 10]
[6 12]]

En el código anterior, hemos creado dos matrices unidimensionales y las hemos apilado
en columnas.

Apilamiento de filas: El apilamiento de filas apila matrices unidimensionales de secuencia múltiple


como filas en una única matriz bidimensional. Veamos un ejemplo de apilamiento de filas:

# Crear pila de filas


arr_row_stack = np.row_stack ((arr1, arr2)) print
(arr_row_stack)

Producción:
[[4 5 6]
[8 10 12]]

En el código anterior, dos matrices unidimensionales se apilan en filas.

Veamos ahora cómo particionar una matriz NumPy en múltiples submatrices.

Particionamiento de matrices NumPy


Las matrices NumPy se pueden dividir en varias submatrices. NumPy ofrece tres tipos de funciones de división:
vertical, horizontal y en profundidad. Todas las funciones de división se dividen por defecto en matrices del
mismo tamaño, pero también podemos especificar la ubicación de la división. Veamos cada una de las funciones
en detalle:

División horizontal: En división horizontal, la matriz dada se divide en norte


submatrices iguales a lo largo del eje horizontal usando el hsplit () función. Veamos
cómo dividir una matriz:

# Crea una matriz


arr = np.arange (1,10) .reshape (3,3) print
(arr)

Producción:
[[1 2 3]
[4 5 6]
[7 8 9]]

# Peroform división horizontal


arr_hor_split = np.hsplit (arr, 3)

[53]
NumPy y pandas Capitulo 2

imprimir (arr_hor_split)

Producción:
[matriz ([[1],
[4],
[7]]), matriz ([[2],
[5],
[8]]), matriz ([[3],
[6],
[9]])]

En el código anterior, el hsplit (arreglo, 3) La función divide la matriz en tres


submatrices. Cada parte es una columna de la matriz original.

División vertical: En división vertical, la matriz dada se divide en norte


submatrices iguales a lo largo del eje vertical usando el vsplit () y separar()
funciones. losseparar funcionar con eje = 0 realiza la misma operación que el vsplit
()función:

# división vertical
arr_ver_split = np.vsplit (arr, 3)

imprimir (arr_ver_split)

Producción:
[matriz ([[1, 2, 3]]), matriz ([[4, 5, 6]]), matriz ([[7, 8, 9]])]

En el código anterior, el vsplit (arreglo, 3) La función divide la matriz en tres


submatrices. Cada parte es una fila de la matriz original. Veamos otra función,
separar(), que se puede utilizar como una división vertical y horizontal, en el siguiente
ejemplo:

# dividir con eje = 0


arr_split = np.split (arr, 3, eje = 0)

imprimir (arr_split)

Producción:
[matriz ([[1, 2, 3]]), matriz ([[4, 5, 6]]), matriz ([[7, 8, 9]])]

# dividir con eje = 1


arr_split = np.split (arr, 3, eje = 1)

Producción:
[matriz ([[1],
[4],
[7]]), matriz ([[2],

[54]
NumPy y pandas Capitulo 2

[5],
[8]]), matriz ([[3],
[6],
[9]])]

En el código anterior, el split (arreglo, 3) La función divide la matriz en tres


submatrices. Cada parte es una fila de la matriz original. La salida dividida es
similar a lavsplit () funcionar cuando eje = 0 y la salida dividida es similar a la
hsplit () funcionar cuando eje = 1.

Cambiar el tipo de datos de las matrices NumPy


Como hemos visto en las secciones anteriores, NumPy admite múltiples tipos de datos,
comoint, flotar, y números complejos. losastype () función convierte el tipo de datos de la
matriz. Veamos un ejemplo delastype () función:

# Crea una matriz


arr = np.arange (1,10) .reshape (3,3) print
("Matriz de enteros:", arr)

# Cambiar el tipo de datos de la matriz


arr = arr.astype (flotante)

# matriz de impresión
print ("Float Array:", arr)

# Verifique el nuevo tipo de datos de la matriz


print ("Tipo de datos modificado:", tipo de arreglo)

En el código anterior, creamos una matriz NumPy y verificamos su tipo de datos usando
el dtype atributo.

Cambiemos el tipo de datos de una matriz usando el astype () función:

# Cambiar el tipo de datos de la matriz


arr = arr.astype (flotante)

# Verifique el nuevo tipo de datos de la matriz


imprimir (tipo de arreglo)

Producción:
float64

[55]
NumPy y pandas Capitulo 2

En el código anterior, hemos cambiado el tipo de datos de la columna de entero a flotante usando
astype ().

los Listar() La función convierte una matriz NumPy en una lista de Python. Veamos un ejemplo
delListar() función:

# Crea una matriz


arr = np. rango (1,10)

# Convertir la matriz NumPy a la lista de Python


list1 = arr.tolist ()
imprimir (lista1)

Producción:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

En el código anterior, hemos convertido una matriz en un objeto de lista de Python usando el
Listar() función.

Creación de vistas y copias de NumPy


Algunas de las funciones de Python devuelven una copia o una vista de la matriz de entrada. Una copia de Python
almacena la matriz en otra ubicación, mientras que una vista usa el mismo contenido de memoria. Esto significa que
las copias son objetos separados y se tratan como una copia profunda en Python. Las vistas son la matriz base original
y se tratan como una copia superficial. A continuación, se muestran algunas propiedades de las copias y las vistas:

Las modificaciones en una vista afectan los datos originales, mientras que las modificaciones en una
copia no afectan la matriz original.
Las vistas utilizan el concepto de memoria compartida. Las copias

requieren espacio adicional en comparación con las vistas. Las copias

son más lentas que las vistas.

Entendamos el concepto de copiar y ver usando el siguiente ejemplo:


# Crear matriz NumPy
arr = np.arange (1,5) .reshape (2,2) print (arr)

Producción:
[[1, 2],
[3, 4]]

[56]
NumPy y pandas Capitulo 2

Después de crear una matriz NumPy, realicemos operaciones de copia de objetos:

# Crear una tarea sin copia solamente


arr_no_copy = arr

# Crear copia profunda


arr_copy = arr.copy ()

# Crea una copia superficial usando Ver


arr_view = arr.view ()

print ("Matriz original:", id (arr)) print ("Asignación:", id


(arr_no_copy)) print ("Copia profunda:", id (arr_copy))
print ("Copia superficial (Ver):", id (arr_view))

Producción:
Matriz original: 140426327484256
Asignación: 140426327484256
Copia profunda: 140426327483856
Copia superficial (vista): 140426327484496

En el ejemplo anterior, puede ver que la matriz original y la matriz asignada tienen el mismo ID de
objeto, lo que significa que ambos apuntan al mismo objeto. Tanto las copias como las vistas tienen
diferentes ID de objeto; ambos tendrán objetos diferentes, pero los objetos de vista harán referencia a la
misma matriz original y una copia tendrá una réplica diferente del objeto.

Continuemos con este ejemplo y actualicemos los valores de la matriz original y verifiquemos su
impacto en las vistas y copias:

# Actualiza los valores de la matriz original


arr [1] = [99,89]

# Compruebe los valores de la vista de matriz


print ("Ver matriz: \ n", arr_view)

# Verifique los valores de la copia de la matriz


print ("Matriz copiada: \ n", arr_copy)

Producción:
Ver matriz:
[[1 2]
[99 89]]
Matriz copiada:
[[1 2]
[3 4]]

[57]
NumPy y pandas Capitulo 2

En el ejemplo anterior, podemos concluir de los resultados que la vista es la matriz original. Los
valores cambiaron cuando actualizamos la matriz original y la copia es un objeto separado porque
sus valores siguen siendo los mismos.

Cortar matrices NumPy


Cortar en NumPy es similar a las listas de Python. La indexación prefiere seleccionar un solo valor, mientras que la
división se usa para seleccionar varios valores de una matriz.

Las matrices NumPy también admiten la indexación y el corte negativos. Aquí, el signo negativo
indica la dirección opuesta y la indexación comienza desde el lado derecho con un valor inicial de
- 1:

Veamos esto usando el siguiente código:


# Crear matriz NumPy
arr = np. rango (0,10)
imprimir (arr)

Producción: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

En la operación de corte, usamos el símbolo de dos puntos para seleccionar la colección de valores. El corte
toma tres valores: inicio, parada y paso:

imprimir (arr [3: 6])


Producción: [3, 4, 5]

Esto se puede representar de la siguiente manera:

[58]
NumPy y pandas Capitulo 2

En el ejemplo anterior, hemos utilizado 3 como índice inicial y 6 como índice de detención:

imprimir (arr [3:])


Producción: matriz ([3, 4, 5, 6, 7, 8, 9])

En el ejemplo anterior, solo se proporciona el índice inicial. 3 es el índice inicial. Esta operación de
corte seleccionará los valores desde el índice inicial hasta el final de la matriz:

imprimir (arr [-3:])


Producción: matriz ([7, 8, 9])

Esto se puede representar de la siguiente manera:

En el ejemplo anterior, la operación de división seleccionará valores desde el tercer valor desde el lado
derecho de la matriz hasta el final de la matriz:

imprimir (arr [2: 7: 2])


Producción: matriz ([2, 4,6])

Esto se puede representar de la siguiente manera:

En el ejemplo anterior, el índice de inicio, fin y paso son 2, 7 y 2, respectivamente. Aquí, la


operación de corte selecciona valores del segundo índice al sexto índice (uno menos que el valor de
parada) con un incremento de 2 en el valor del índice. Entonces, la salida será 2, 4 y 6.

[59]
NumPy y pandas Capitulo 2

Indexación booleana y elegante


Las técnicas de indexación nos ayudan a seleccionar y filtrar elementos de una matriz NumPy. En esta
sección, nos centraremos en la indexación booleana y sofisticada. La indexación booleana usa una
expresión booleana en lugar de los índices (entre corchetes) para filtrar la matriz NumPy. Esta indexación
devuelve elementos que tienen un valor verdadero para la expresión booleana:

# Crear matriz NumPy


arr = np.arange (21,41,2) print ("Orignial
Array: \ n", arr)

# Indexación booleana
print ("Después de la condición booleana:", arr [arr> 30])

Producción:
Matriz original:
[21 23 25 27 29 31 33 35 37 39]
Después de la condición booleana: [31 33 35 37 39]

La indexación elegante es un tipo especial de indexación en el que los elementos de una matriz se seleccionan mediante
una matriz de índices. Esto significa que pasamos la matriz de índices entre paréntesis. La indexación elegante también
admite matrices multidimensionales. Esto nos ayudará a seleccionar y modificar fácilmente un conjunto complejo de
matrices multidimensionales. Veamos un ejemplo de la siguiente manera para comprender la indexación elegante:

# Crear matriz NumPy


arr = np.arange (1,21) .reshape (5,4) print
("Orignial Array: \ n", arr)

# Seleccionando 2da y 3ra fila


índices = [1,2]
print ("Primera y segunda fila seleccionadas: \ n", arr [índices])

# Seleccionando 3ª y 4ª fila
índices = [2,3]
print ("Tercera y cuarta fila seleccionadas: \ n", arr [índices])

Producción:

Matriz original:
[[1 2 3 4]
[5 6 7 8]
[9 10 11 12]
[13 14 15 16]
[17 18 19 20]]
Primera y segunda fila
seleccionadas: [[5 6 7 8]

[60]
NumPy y pandas Capitulo 2

[9 10 11 12]]
3.ª y 4.ª filas seleccionadas: [[9 10
11 12]
[13 14 15 16]]

En el código anterior, creamos una matriz de 5 * 4 y seleccionamos las filas usando índices
enteros. También puede visualizar o internalizar esta salida en el siguiente diagrama:

Podemos ver el código para esto de la siguiente manera:

# Crear índices de filas y columnas


fila = np.array ([1, 2]) col =
np.array ([2, 3])

print ("Subarreglo seleccionado:", arr [fila, columna])

Producción:
Subarreglo seleccionado: [7 12]

El ejemplo anterior da como resultado el primer valor, [1,2], y segundo valor, [2,3], como índice
de fila y columna. La matriz seleccionará el valor en el primer y segundo valor de índice, que
son 7 y 12.

Arreglos de radiodifusión
Las listas de Python no admiten operaciones aritméticas de vectorización directa. NumPy ofrece una operación
de matriz vectorizada más rápida en comparación con las operaciones basadas en bucles de lista de Python.
Aquí, todas las operaciones de bucle se realizan en C en lugar de Python, lo que lo hace más rápido. La
funcionalidad de transmisión verifica un conjunto de reglas para aplicar funciones binarias, como suma, resta y
multiplicación, en diferentes formas de una matriz.

[61]
NumPy y pandas Capitulo 2

Veamos un ejemplo de transmisión:

# Crear matriz NumPy


arr1 = np.arange (1,5) .reshape (2,2) print
(arr1)

Producción:
[[1 2]
[3 4]]

# Cree otra matriz NumPy


arr2 = np.arange (5,9) .reshape (2,2) print
(arr2)

Producción:
[[5 6]
[7 8]]

# Suma dos matrices


imprimir (arr1 + arr2)

Producción:
[[6 8]
[10 12]]

En los tres ejemplos anteriores, podemos ver la adición de dos matrices del mismo tamaño. Este concepto
se conoce como radiodifusión:

# Multiplica dos matrices


imprimir (arr1 * arr2)

Producción:
[[5 12]
[21 32]]

En el ejemplo anterior, se multiplicaron dos matrices. Realicemos la suma y la


multiplicación con un valor escalar:
# Agrega un valor de escala
imprimir (arr1 + 3)

Producción:
[[4 5]
[6 7]]

# Multiplica con un valor escalar


imprimir (arr1 * 3)

[62]
NumPy y pandas Capitulo 2

Producción:
[[3 6]
[9 12]]

En los dos ejemplos anteriores, la matriz se suma y se multiplica por un valor escalar.

Creando Pandas DataFrames


los pandas La biblioteca está diseñada para trabajar con un panel o datos tabulares. pandas es una
herramienta rápida, altamente eficiente y productiva para manipular y analizar cadenas, datos
numéricos, de fecha y hora y de series de tiempo. pandas proporciona estructuras de datos como
DataFrames y Series. Apandas DataFrame es una estructura de datos tabular, bidimensional etiquetada e
indexada con una cuadrícula de filas y columnas. Sus columnas son de tipos heterogéneos. Tiene la
capacidad de trabajar con diferentes tipos de objetos, realizar operaciones de agrupación y unión,
manejar valores perdidos, crear tablas dinámicas y lidiar con fechas. ApandasDataFrame se puede crear
de varias formas. Creemos un DataFrame vacío:

# Importar biblioteca de pandas


importar pandas como pd

# Crear DataFrame vacío


df = pd.DataFrame ()

# Encabezado del marco de datos.


df.head ()

Producción:
_

En el ejemplo anterior, hemos creado un DataFrame vacío. Creemos un DataFrame usando un


diccionario de la lista:

# Crear diccionario de lista


data = {'Nombre': ['Vijay', 'Sundar', 'Satyam', 'Indira'], 'Edad': [23, 45,
46, 52]}

# Crea el DataFrame de pandas


df = pd.DataFrame (datos)

# Encabezado del marco de datos.


df.head ()

Producción:
Nombre Edad
0 Vijay 23

[63]
NumPy y pandas Capitulo 2

1 Sundar 45
2 Satyam 46
3 Indira 52

En el código anterior, hemos utilizado un diccionario de la lista para crear un DataFrame. Aquí, las
claves del diccionario son equivalentes a columnas y los valores se representan como una lista que
es equivalente a las filas del DataFrame. Creemos un DataFrame usando la lista de diccionarios:

# Pandas DataFrame por listas de dictados.


# Inicializar datos en listas.
data = [{'Nombre': 'Vijay', 'Edad': 23}, {'Nombre': 'Sundar', 'Edad': 25}, {'Nombre': 'Shankar', 'Edad': 26} ]

# Crea DataFrame.
df = pd.DataFrame (datos, columnas = ['Nombre', 'Edad'])

# Imprimir encabezado del marco de datos


df.head ()

En el código anterior, el DataFrame se crea usando una lista de diccionarios. En la lista, cada elemento es
un diccionario. Cada clave es el nombre de la columna y el valor es el valor de celda de una fila. Creemos
un DataFrame usando una lista de tuplas:

# Creando DataFrame usando la lista de tuplas.


datos = [('Vijay', 23), ('Sundar', 45), ('Satyam', 46), ('Indira', 52)]

# Crear marco de datos


df = pd.DataFrame (datos, columnas = ['Nombre', 'Edad'])

# Imprimir encabezado del marco de datos


df.head ()

Producción:
Nombre Edad
0 Vijay 23
1 Sundar 25
2 Shankar 26

[64]
NumPy y pandas Capitulo 2

En el código anterior, el DataFrame se crea usando una lista de tuplas. En la lista, cada elemento es
una tupla y cada tupla es equivalente a la fila de columnas.

Entendiendo la serie pandas


pandas La serie es una estructura de datos secuenciales unidimensionales que puede manejar cualquier tipo de
datos, como cadenas, numéricos, de fecha y hora, listas de Python y diccionarios con etiquetas e índices. La serie
es una de las columnas de un DataFrame. Podemos crear una serie usando un diccionario de Python, una matriz
NumPy y un valor escalar. También veremos elpandas Características y propiedades de la serie en la última parte
de la sección. Creemos una serie de Python:

Usando un diccionario de Python: Crea un objeto de diccionario y pásalo al objeto


Serie. Veamos el siguiente ejemplo:

# Creando Pandas Series usando Diccionario


dict1 = {0: 'Ajay', 1: 'Jay', 2: 'Vijay'}

# Crear series de pandas


serie = pd.Series (dict1)

# Mostrar series
serie

Producción:
0 Ajay
1 Arrendajo

2 Vijay
dtype: objeto

Usando una matriz NumPy: Cree un objeto de matriz NumPy y páselo al objeto
Series. Veamos el siguiente ejemplo:

# Cargar bibliotecas Pandas y NumPy


importar pandas como pd
importar numpy como np

# Crear matriz NumPy


arr = np.array ([51,65,48,59, 68])

# Crear series de pandas


series = pd.Series (arr) series

Producción:

[ sesenta y cinco ]
NumPy y pandas Capitulo 2

0 51
1 sesenta y cinco

2 48
3 59
4 68
dtype: int64

Usando un solo valor escalar: Para crear un pandas Series con un valor escalar, pase el
valor escalar y la lista de índices a un objeto Series:

# cargar Pandas y NumPy


importar pandas como pd
importar numpy como np

# Crear series de pandas


series = pd.Series (10, index = [0, 1, 2, 3, 4, 5]) series

Producción:
0 10
1 10
2 10
3 10
4 10
5 10
dtype: int64

Exploremos algunas características de pandas Serie:

También podemos crear una serie seleccionando una columna, como país, que es la
primera columna del archivo de datos. Luego, muestre el tipo de objeto actualmente
en el ámbito local:

# Importar pandas
importar pandas como pd

# Cargar datos usando read_csv ()


df = pd.read_csv ("WHO_first9cols.csv")

# Mostrar 5 registros iniciales


df.head ()

[66]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

En el código anterior, hemos leído el WHO_first9cols.csv archivo usando el


read_csv () función. Puede descargar este archivo desde el siguiente GitHub
localización:https: / / github. com / PacktPublishing / Python- Análisis de datos- Tercero-
Edición / árbol / maestro / Capítulo02. En la salida, puede ver los cinco primeros registros en el
WHO_first9cols conjunto de datos usando el cabeza() función:

# Selecciona una serie


country_series = df ['País']

# comprobar el tipo de datos de la serie


tipo (country_series)

Producción:
pandas.core.series.Series

los pandas La estructura de datos en serie comparte algunos de los atributos comunes de DataFrames y
también tiene un nombre atributo. Explore estas propiedades de la siguiente manera:

# Muestra la forma de DataFrame


print ("Forma:", df.shape)

Producción:
Forma: (202, 9)

Revisemos la lista de columnas de un DataFrame:

# Verifique la lista de columnas de DataFrame


print ("Lista de columnas:", df.columns)

Producción:Lista de columnas: Índice (['Country', 'CountryID', 'Continent', 'Tasa de


fecundidad adolescente (%)',
'Tasa de alfabetización de adultos (%)',
'Ingreso nacional bruto per cápita (PPA en dólares internacionales)', 'Tasa neta de
matriculación en la escuela primaria de mujeres (%)', 'Tasa neta de matriculación
en la escuela primaria de varones (%)',

[67]
NumPy y pandas Capitulo 2

'Población (en miles) total'], dtype = 'objeto')

Comprobemos los tipos de datos de las columnas de DataFrame:

# Mostrar los tipos de datos de las columnas


print ("Tipos de datos:", df.dtypes)

Producción:
Tipos de datos: País
objeto
CountryID
int64
Continente
int64
Tasa de fecundidad adolescente (%)
float64
Tasa de alfabetización de adultos (%)
float64
Ingreso nacional bruto per cápita (PPA en dólares internacionales)
float64
Tasa neta de matriculación en la escuela primaria de mujeres (%)
float64
Tasa neta de matriculación en la escuela primaria de hombres (%)
float64
Población (en miles) total
float64
dtype: objeto

3. Veamos el corte de un pandas Serie:

# Rebanado de la serie Pandas


country_series [-5:]

Producción:
197 Vietnam
198 Cisjordania y Gaza
199 Yemen
200 Zambia
201 Zimbabue
Nombre: País, dtipo: objeto

Ahora que sabemos cómo usar pandas Series, pasemos a usar Quandl para trabajar en bases de
datos.

[68]
NumPy y pandas Capitulo 2

Leer y consultar los datos de Quandl


En la última sección, vimos pandas DataFrames que tienen una estructura tabular similar a las bases de datos
relacionales. Ofrecen operaciones de consulta similares en DataFrames. En esta sección, nos centraremos en
Quandl. Quandl es una empresa con sede en Canadá que ofrece datos financieros comerciales y alternativos
para analistas de datos de inversión. Quandl comprende la necesidad de contar con analistas cuantitativos
financieros y de inversión. Proporciona datos mediante API, R, Python o Excel.

En esta sección, recuperaremos el conjunto de datos Sunspot de Quandl. Podemos usar una API o
descargar los datos manualmente en formato CSV.

Primero instalemos el paquete Quandl usando pepita:

$ pip3 instalar Quandl

Si desea instalar la API, puede hacerlo descargando instaladores de https: / / pypi. python.
org / pypi / Quandlo ejecutando el comando anterior.

El uso de la API es gratuito, pero está limitado a 50 llamadas a la API por día. Si
necesita más llamadas a la API, deberá solicitar una clave de autenticación. El código
de este tutorial no usa una clave. Debería ser sencillo cambiar el código para usar una
clave o leer un archivo CSV descargado. Si tiene dificultades, consulte elDónde
encontrar ayuda y referencias sección en Capítulo 1, Introducción a las bibliotecas de
Pythono busque en los documentos de Python en https: /
/docs. python. org / 2 /.

Echemos un vistazo a cómo consultar datos en un pandas Marco de datos:

1. Como primer paso, obviamente tenemos que descargar los datos. Después de importar la API de Quandl,
obtenga los datos de la siguiente manera:

importar quandl
manchas solares = quandl.get ("SIDC / MANCHAS SOLARES_A")

2. El cabeza() y cola() Los métodos tienen un propósito similar al de los comandos de Unix
con el mismo nombre. Seleccione el primeronorte y última norte registros de un
DataFrame, donde norte es un parámetro entero:

sunspots.head ()

[69]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

Echemos un vistazo al cola funcionan de la siguiente manera:

manchas solares cola ()

Esto da como resultado la siguiente salida:

los cabeza() y cola() Los métodos nos dan la primera y las últimas cinco filas de los datos de las
manchas solares, respectivamente.

3. Filtrar columnas: pandas ofrece la posibilidad de seleccionar columnas. Seleccionemos


columnas en unpandas Marco de datos:

# Seleccionar columnas
sunspots_filtered = sunspots [['Número total medio anual de manchas
solares', 'Indicador definitivo / provisional']]

# Mostrar los 5 mejores registros


sunspots_filtered.head ()

[70]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

4. Filtrar filas: pandas ofrece la posibilidad de seleccionar filas. Seleccionemos filas en un


pandas Marco de datos:

# Seleccionar filas usando índice


manchas solares ["20020101": "20131231"]

Esto da como resultado la siguiente salida:

[71]
NumPy y pandas Capitulo 2

5. Filtrado booleano: Podemos consultar datos usando condiciones booleanas similares a las
DÓNDE condición de cláusula de SQL. Filtremos los datos mayores que la media aritmética:

# Filtro booleano
manchas solares [manchas solares ['Número total medio anual de manchas solares']>
manchas solares ['Número total medio anual de manchas solares']. mean ()]

Esto da como resultado la siguiente salida:

Describiendo pandas DataFrames


los pandas DataFrame tiene una docena de métodos estadísticos. La siguiente tabla enumera estos
métodos, junto con una breve descripción de cada uno:

Método Descripción
describe Este método devuelve una pequeña tabla con estadísticas descriptivas.
contar Este método devuelve el número de elementos que no son NaN.

Este método calcula la desviación absoluta media, que es una medida robusta similar
enojado
a la desviación estándar.
Este método devuelve la mediana. Esto es equivalente al valor en el 50th
mediana
percentil.
min Este método devuelve el valor mínimo.

[72]
NumPy y pandas Capitulo 2

max Este método devuelve el valor máximo.


modo Este método devuelve el modo, que es el valor que ocurre con más frecuencia.
Este método devuelve la desviación estándar, que mide la dispersión. Es la raíz
std
cuadrada de la varianza.
var Este método devuelve la varianza.
Este método devuelve asimetría. La asimetría es indicativa de la simetría de
sesgar
distribución.
kurt Este método devuelve curtosis. La curtosis es indicativa de la forma de distribución.

Utilizando los mismos datos utilizados en la sección anterior, demostraremos estos métodos
estadísticos:

# Describe el conjunto de datos


df.describe ()

Esto da como resultado la siguiente salida:

los describir() El método mostrará la mayoría de las medidas estadísticas descriptivas para todas las
columnas:

# Contar el número de observación


df.count ()

[73]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

los contar() El método cuenta el número de observaciones en cada columna. Nos ayuda a verificar los valores que
faltan en el conjunto de datos. A excepción de las tres columnas iniciales, todas las columnas tienen valores
perdidos. De manera similar, puede calcular la mediana, la desviación estándar, la desviación media absoluta, la
varianza, la asimetría y la curtosis:

# Calcular la mediana de todas las columnas


df.median ()

Esto da como resultado la siguiente salida:

Podemos calcular la desviación de todas las columnas de la siguiente manera:

# Calcule la desviación estándar de todas las columnas


df.std ()

[74]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

El ejemplo de código anterior calcula la desviación estándar para cada columna numérica.

Agrupar y unir pandas DataFrame


La agrupación es una especie de operación de agregación de datos. El término de agrupación se toma de una
base de datos relacional. El software de base de datos relacional utilizaagrupar por palabra clave para agrupar
tipos similares de valores en una columna. Podemos aplicar funciones agregadas en grupos como media,
mínima, máxima, recuento y suma. lospandas DataFrame también ofrece tipos similares de capacidades. Las
operaciones de agrupación se basan en la estrategia dividir-aplicar-combinar. Primero divide los datos en
grupos y aplica la operación agregada, como media, mínima, máxima, recuento y suma, en cada grupo y
combina los resultados de cada grupo:

# Agrupar por DataFrame sobre la base de la columna Continente


df.groupby ('Continente'). mean ()

Esto da como resultado la siguiente salida:

[75]
NumPy y pandas Capitulo 2

Agrupemos ahora los DataFrames también en función de las tasas de alfabetización:

# Agrupar por DataFrame sobre la base del continente y seleccionar alfabetización de adultos
índice(%)
df.groupby ('Continente'). mean () ['Tasa de alfabetización de adultos (%)']

Esto da como resultado la siguiente salida:

En el ejemplo anterior, se calculó la tasa de alfabetización de adultos promedio por continente en


porcentaje. También puede agrupar en función de varias columnas pasando una lista de columnas al
agrupar por() función.

Join es una especie de operación de fusión para bases de datos tabulares. El concepto de unión se toma de la
base de datos relacional. En las bases de datos relacionales, las tablas se normalizaron o desglosaron para
reducir la redundancia y la inconsistencia, y la combinación se utiliza para seleccionar la información de varias
tablas. Un analista de datos necesita combinar datos de múltiples fuentes.pandas también ofrece la
funcionalidad de unir para unir múltiples DataFrames usando el unir() función.

Para entender cómo unirse, tomaremos un caso de uso de una empresa de taxis. Estamos usando dos archivos:
dest.csv y tips.csv. Cada vez que un conductor deja a un pasajero en su destino, insertaremos un registro
(número de empleado y destino) en el dest.csv expediente. Siempre que los conductores reciben una propina,
insertamos el registro (número de empleado y monto de la propina) en eltips.csv expediente. Puede descargar
ambos archivos desde el siguiente enlace de GitHub:https: / /
github. com / PacktPublishing / Python- Data- Analysis- Third- Edition / tree / master / Python- Data-
Analysis- Third- Edition / Ch2:

# Importar pandas
importar pandas como pd

# Cargar datos usando read_csv ()


dest = pd.read_csv ("dest.csv")

# Mostrar DataFrame
dest.head ()

[76]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

En el bloque de código anterior, hemos leído el dest.csv archivo usando el read_csv ()


método:

# Cargar datos usando read_csv ()


tips = pd.read_csv ("tips.csv")

# Mostrar DataFrame
tips.head ()

Esto da como resultado la siguiente salida:

En el bloque de código anterior, hemos leído el tips.csv archivo usando el read_csv ()método.
Ahora veremos los distintos tipos de combinaciones de la siguiente manera:

Unir internamente: La unión interna es equivalente a la operación de intersección de un


conjunto. Seleccionará solo registros comunes en ambos DataFrames. Para realizar una
combinación interna, use elunir() función con los DataFrames y el atributo común en el
parámetro y el valor interno para mostrar el parámetro. lossobre El parámetro se utiliza
para proporcionar el atributo común basado en la unión que se realizará y cómodefine el
tipo de unión:

# Únase a DataFrames usando Inner Join


df_inner = pd.merge (dest, tips, on = 'EmpNr', how = 'inner') df_inner.head
()

[77]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

Unión externa completa: La unión externa equivale a una operación de unión del conjunto.
Fusiona los DataFrames derecho e izquierdo. Tendrá todos los registros de ambos DataFrames y
rellena los NaN donde no se encontrará la coincidencia:

# Únase a DataFrames usando Outer Join


df_outer = pd.merge (dest, tips, on = 'EmpNr', how = 'outside')
df_outer.head ()

Esto da como resultado la siguiente salida:

Unión exterior derecha: En la combinación externa derecha, se seleccionarán todos los registros del
lado derecho del DataFrame. Si los registros coincidentes no se pueden encontrar en el DataFrame
izquierdo, entonces se rellena con NaN:

# Únase a DataFrames usando la combinación externa derecha


df_right = pd.merge (dest, tips, on = 'EmpNr', how = 'right') df_right.head ()

Esto da como resultado la siguiente salida:

[78]
NumPy y pandas Capitulo 2

Izquierda combinación externa: En la combinación externa izquierda, se seleccionarán todos los registros del
lado izquierdo del DataFrame. Si los registros coincidentes no se pueden encontrar en el DataFrame correcto,
entonces se rellena con NaN:

# Únase a DataFrames usando Unión externa izquierda


df_left = pd.merge (dest, tips, on = 'EmpNr', how = 'left') df_left.head ()

Esto da como resultado la siguiente salida:

Ahora pasaremos a verificar los valores faltantes en los conjuntos de datos.

Trabajar con valores perdidos


La mayoría de los conjuntos de datos del mundo real son desordenados y ruidosos. Debido a su desorden y ruido,
muchos valores están defectuosos o faltan.pandas ofrece muchas funciones integradas para lidiar con los valores
faltantes en DataFrames:

Verifique los valores faltantes en un DataFrame: pandas 'isnull () La función comprueba la


existencia de valores nulos y devuelve Cierto o Falso, dónde Cierto es para nulo y Falso es para
valores no nulos. lossuma() la función sumará todos los Ciertovalores y devuelve el recuento
de valores perdidos. Hemos probado dos formas de contar los valores faltantes; ambos
muestran el mismo resultado:

# Cuente los valores faltantes en DataFrame


pd.isnull (df) .sum ()

El siguiente es el segundo método:


df.isnull (). sum ()

[79]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

Eliminar los valores perdidos: Un enfoque muy ingenuo para lidiar con los valores
perdidos es descartarlos con fines de análisis. pandas tiene el dropna () función para
eliminar o eliminar dichas observaciones del DataFrame. Aquí elinplace = True atributo
realiza los cambios en el DataFrame original:

# Elimina todos los valores faltantes


df.dropna (inplace = True)

df.info ()

Esto da como resultado la siguiente salida:

Aquí, el número de observaciones se reduce de 202 a 118.

Completa los valores faltantes: Otro enfoque consiste en completar los valores faltantes con valores
cero, medios, medianos o constantes:

# Rellene los valores faltantes con 0


df.fillna (0, inplace = True)

df.info ()

[80]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

Aquí, hemos llenado los valores perdidos con 0. Se trata de manejar los valores
perdidos.

En la siguiente sección, nos centraremos en las tablas dinámicas.

Creando tablas dinámicas


Una tabla dinámica es una tabla de resumen. Es el concepto más popular en Excel. La mayoría de los analistas de
datos lo utilizan como una herramienta útil para resumir sus resultados.pandas ofrece el tabla dinámica()función
para resumir DataFrames. Un DataFrame se resume mediante una función agregada, como media, mínima,
máxima o suma. Puede descargar el conjunto de datos del
siguiente enlace de GitHub: https: / / github. com / PacktPublishing / Python- Data- Analysis-Third-
Edition / tree / master / Python- Data- Analysis- Third- Edition / Ch2:

# Importar pandas
importar pandas como pd

# Cargar datos usando read_csv ()


compra = pd.read_csv ("compra.csv")

# Mostrar 10 registros iniciales


cabeza de compra (10)

[81]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

En el bloque de código anterior, hemos leído el purchase.csv archivo usando el read_csv ()


método.

Ahora, resumiremos el marco de datos usando el siguiente código:

# Resumir el marco de datos usando la tabla dinámica


pd.pivot_table (compra, valores = 'Número', índice = ['Clima',],
columnas = ['Comida'], aggfunc = np.sum)

Esto da como resultado la siguiente salida:

En el ejemplo anterior, el compra DataFrame se resume. Aquí,índice es elClima columna,


columnas es el Comida columna y valores es la suma agregada de laNúmero columna.
aggfun se inicializa con el np.sum parámetro. Es hora de aprender a lidiar con las citas en
pandas DataFrames.

[82]
NumPy y pandas Capitulo 2

Lidiar con las fechas


Lidiar con las fechas es complicado y complicado. Puede recordar el error Y2K, el próximo problema de 2038 y las
zonas horarias que enfrentan diferentes problemas. En los conjuntos de datos de series de tiempo, nos encontramos
con fechas.pandas ofrece rangos de fechas, vuelve a muestrear datos de series de tiempo y realiza operaciones
aritméticas de fechas.

Cree un rango de fechas a partir del 1 de enero de 2020, con una duración de 45 días, de la siguiente manera:

pd.date_range ('01-01-2000 ', períodos = 45, frecuencia =' D ')

Producción:
DatetimeIndex (['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
'2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08', '2000-01-09',
'2000-01-10', '2000 -01-11 ',' 2000-01-12 ',' 2000-01-13 ',' 2000-01-14 ','
2000-01-15 ',' 2000-01-16 ',' 2000-01 -17 ',' 2000-01-18 ',' 2000-01-19 ','
2000-01-20 ',' 2000-01-21 ',' 2000-01-22 ',' 2000-01-23 ',' 2000-01-24 ','
2000-01-25 ',' 2000-01-26 ',' 2000-01-27 ',' 2000-01-28 ',' 2000-01-29 ',
'2000-01-30', '2000-01-31', '2000-02-01', '2000-02-02', '2000-02-03',
'2000-02-04', '2000 -02-05 ',' 2000-02-06 ',' 2000-02-07 ',' 2000-02-08 ','
2000-02-09 ',' 2000-02-10 ',' 2000-02 -11 ',' 2000-02-12 ','2000-02-13',
'2000-02-14'],

dtype = 'datetime64 [ns]', freq = 'D')

Enero tiene menos de 45 días, por lo que la fecha de finalización cae en febrero, como puede comprobarlo usted
mismo.

rango de fechas() Los parámetros de frecuencia pueden tomar valores como B para la frecuencia de los días hábiles, W
para frecuencia semanal, H para frecuencia horaria, METRO para frecuencia de minutos, S para la segunda frecuencia,L
para frecuencia de milisegundos, y U para frecuencia de microsegundos. Para obtener más detalles, puede
consulte la documentación oficial en https: / / pandas. pydata. org / pandas-docs / stable / user_
guide / timeseries. html.

rango de fechas de los pandas: los rango de fechas() La función genera secuencias de fecha y
hora con un intervalo de frecuencia fijo:

# Función de rango de fechas


pd.date_range ('01-01-2000 ', períodos = 45, frecuencia =' D ')

[83]
NumPy y pandas Capitulo 2

Esto da como resultado la siguiente salida:

to_datetime (): to_datetime () convierte una cadena de marca de tiempo en fecha y hora:

# Convertir argumento a fecha y hora


pd.to_datetime ('1/1/1970')

Producción: Marca de tiempo ('1970-01-01 00:00:00')

Podemos convertir una cadena de marca de tiempo en un objeto de fecha y hora en el formato especificado:

# Convertir argumento a fecha y hora en formato especificado


pd.to_datetime (['20200101', '20200102'], formato = '% Y% m% d')

Producción:
DatetimeIndex (['2020-01-01', '2020-01-02'], dtype = 'datetime64 [ns]', freq = None)

Manejo de una cadena de formato desconocido: El formato de entrada desconocido puede provocar
errores de valor. Podemos manejar esto usando un parámetro de errores conobligar. obligarestablecerá
cadenas no válidas en NaT:

# Error de valor
pd.to_datetime (['20200101', 'no es una fecha'])

Producción:
ValueError: ('Formato de cadena desconocido:', 'no es una fecha')

# Error de valor de manejo


pd.to_datetime (['20200101', 'no es una fecha'], errores = 'coaccionar')

Producción:
DatetimeIndex (['2020-01-01', 'NaT'], dtype = 'datetime64 [ns]', freq = None)

[84]
NumPy y pandas Capitulo 2

En el ejemplo anterior, la segunda fecha aún no es válida y no se puede convertir en un objeto de fecha
y hora. El parámetro de errores nos ayudó a manejar tales errores ingresando el valorNaT (no es un
momento).

Resumen
En este capítulo, hemos explorado las bibliotecas NumPy y pandas. Ambas bibliotecas ayudan a lidiar con
matrices y DataFrames. Las matrices NumPy tienen la capacidad de trabajar con matrices n-dimensionales.
Hemos aprendido sobre varias propiedades y operaciones de la matriz. Nuestro enfoque principal está en los
tipos de datos, el tipo de datos como un objeto, remodelación, apilamiento, división, corte e indexación.

También nos enfocamos en el pandas biblioteca para el análisis de datos de Python. Vimos comopandas
imita la funcionalidad de la tabla de la base de datos relacional. Ofrece funcionalidad para consultar,
agregar, manipular y unir datos de manera eficiente.

NumPy y pandas funcionan bien juntos como herramienta y permiten realizar análisis de datos básicos. En
este punto, es posible que tenga la tentación de pensar quepandas es todo lo que necesitamos para el análisis
de datos. Sin embargo, hay más en el análisis de datos de lo que parece.

Habiendo aprendido los fundamentos, es hora de proceder al análisis de datos con las
funciones estadísticas de uso común en Capítulo 3, Estadísticas. Esto incluye el uso de
conceptos estadísticos.

Se le anima a leer los libros mencionados en el Referencias sección para explorar


NumPy y pandas con más detalle y profundidad.

Referencias
Ivan Idris, Libro de cocina de NumPy - Segunda edición, Packt Publishing, 2015. Ivan Idris,
Aprendizaje de NumPy Array, Packt Publishing, 2014. Ivan Idris, NumPy: Guía para
principiantes - Tercera edición, Packt Publishing, 2015.
L. (L.-H.) Chin y T. Dutta, NumPy: imprescindibles, Packt Publishing, 2016.
T. Petrou, Libro de cocina de Pandas, Packt Publishing, 2017.
F. Anthony, Dominando pandas, Packt Publishing, 2015.
M. Heydt, Dominando pandas para las finanzas, Packt Publishing, 2015.
T. Hauck, Aplicaciones con uso intensivo de datos con pandas instructivo, Packt Publishing, 2013.

M. Heydt, Aprendiendo pandas, Packt Publishing, 2015.

[85]
Estadísticas
-
Análisis exploratorio de datos (EDA) es el primer paso hacia el análisis de datos y la construcción de un modelo de
aprendizaje automático. Las estadísticas proporcionan conocimientos fundamentales y un conjunto de herramientas
para el análisis de datos exploratorio o descriptivo. Este capítulo está diseñado para que esté listo para los datos. Para
cualquier tipo de función profesional de datos, debe comprender los datos del mundo real que generalmente son
ruidosos, tienen valores perdidos y se recopilan de varias fuentes.

Antes de realizar cualquier tipo de preprocesamiento y análisis, debe familiarizarse con los datos
presentes, y las estadísticas son la única herramienta que lo ayudará aquí. Esto hace que la
estadística sea una habilidad primaria y muy necesaria para los profesionales de datos, ayudándoles
a obtener conocimientos iniciales y una comprensión de los datos. Por ejemplo, la media aritmética
de las horas de trabajo mensuales de un empleado puede ayudarnos a comprender la carga de un
empleado en una organización. De manera similar, la desviación estándar de las horas de trabajo
mensuales puede ayudarnos a inferir el rango de horas de trabajo. La correlación entre dos variables
como la presión arterial y la edad de los pacientes puede ayudarnos a comprender la relación entre
la presión arterial y la edad. Los métodos de muestreo pueden resultar útiles en cualquier tipo de
recopilación de datos primarios.

En este capítulo, cubriremos los siguientes temas:

Comprender los atributos y sus tipos


Medir la tendencia central
Medición de la dispersión
Asimetría y curtosis
Comprensión de las relaciones mediante el uso de coeficientes de covarianza y correlación
Teorema del límite central
Recolectando muestras
Realización de pruebas paramétricas
Realización de pruebas no paramétricas
Estadísticas Capítulo 3

Requerimientos técnicos
Para este capítulo, está disponible la siguiente información técnica:

Puede encontrar el código y el conjunto de datos en el siguiente enlace de GitHub: https: / /


github. com / PacktPublishing / Python- Data- Analysis- Third- Edition / tree / master /
Chapter03.
Todos los bloques de código están disponibles en ch3.ipynb.

En este capítulo, usaremos las bibliotecas NumPy, Pandas y SciPy Python.

Comprender los atributos y sus tipos


Los datos son la recopilación de hechos y estadísticas en bruto, como números, palabras y observaciones. Un atributo
es una columna, un campo de datos o una serie que representa las características de un objeto y también se conoce
como variable, característica o dimensión. Los estadísticos usan el términovariable, mientras que los ingenieros de
aprendizaje automático prefieren el término característica. El términodimensión se utiliza en el almacenamiento de
datos, mientras que los profesionales de bases de datos utilizan el término atributo.

Tipos de atributos
El tipo de datos de los atributos es más crucial para el análisis de datos porque ciertas situaciones
requieren ciertos tipos de datos. El tipo de datos de los atributos ayuda a los analistas a seleccionar el
método correcto para el análisis de datos y los gráficos de visualización. La siguiente lista muestra los
distintos atributos:

1. Atributos nominales: Nominal se refiere a nombres o etiquetas de variables categorizadas. El


valor de un atributo nominal puede ser el símbolo o el nombre de los elementos. Los valores
son categóricos, cualitativos y de naturaleza desordenada, como el nombre del producto, el
nombre de la marca, el código postal, el estado, el sexo y el estado civil. Encontrar los valores
medios y medianos de los valores cualitativos y categóricos no tendrá ningún sentido, pero
los analistas de datos pueden calcular la moda, que es el valor más común.

2. Atributos ordinales: Ordinal se refiere a nombres o etiquetas con un orden o clasificación


significativa, pero se desconoce la magnitud de los valores. Estos tipos de atributos miden solo las
cualidades subjetivas. Es por eso que se utilizan en encuestas para calificaciones de satisfacción del
cliente, calificaciones de productos y reseñas de calificaciones de películas. Las calificaciones de
satisfacción del cliente aparecen en el siguiente orden:
1: muy insatisfecho
2: Algo insatisfecho

[87]
Estadísticas Capítulo 3

3: neutral
4: Satisfecho
5: Muy satisfecho

Otro ejemplo podría ser el tamaño de una bebida: pequeña, mediana o grande. Los atributos
ordinales solo se pueden medir a través de la moda y la mediana. La media no se puede calcular
para atributos ordinales debido a su naturaleza cualitativa. Los atributos ordinales también se
pueden volver a crear mediante la discretización de una variable cuantitativa dividiendo sus valores
en un rango de números finitos.

3. Atributos numéricos: Un atributo numérico se presenta cuantitativamente como valores enteros o reales.
Los atributos numéricos pueden ser de dos tipos: escalados por intervalos o escalados por razones.

Los atributos de escala de intervalo se miden en una escala ordenada de unidades de igual
tamaño. Se puede calcular la diferencia significativa entre los dos valores de un atributo de
escala de intervalo, y esto permite una comparación entre los dos valores, por ejemplo, el año
de nacimiento y la temperatura en°C. El principal problema con los valores de atributo en escala
de intervalo es que no tienen un "cero verdadero", por ejemplo, si la temperatura en °C es 0,
entonces no significa que la temperatura no exista. Los datos en escala de intervalo pueden
sumar y restar, pero no pueden multiplicar y dividir porque no hay un cero verdadero. También
podemos calcular el valor medio de un atributo de escala de intervalo, además de la mediana y
la moda.

Los atributos de escala de relación se miden en una escala ordenada de unidades de igual tamaño,
similar a una escala de intervalo con un punto cero inherente. Algunos ejemplos de atributos de
escala proporcional son la altura, el peso, la latitud, la longitud, los años de experiencia y el número
de palabras de un documento. Podemos realizar multiplicaciones y divisiones, y calcular la diferencia
entre valores en escala de razón. También podemos calcular medidas de tendencia central como la
media, la mediana y la moda. Las escalas de temperatura Celsius y Fahrenheit se miden en una
escala de intervalo, mientras que la escala de temperatura Kelvin se mide en una escala de relación
porque tiene un verdadero punto cero.

[88]
Estadísticas Capítulo 3

Atributos discretos y continuos


Hay varias formas de clasificar los atributos. En la subsección anterior, hemos visto atributos
nominales, ordinales y numéricos. En esta subsección, veremos otro tipo de clasificación de
atributos. Aquí hablaremos de atributos discretos o continuos. Una variable discreta acepta
solo un número finito contable, como cuántos estudiantes hay en una clase, cuántos
automóviles se venden y cuántos libros se publican. Se puede obtener contando números. Una
variable continua acepta un número infinito de valores posibles, como el peso y la altura de los
estudiantes. Se puede obtener midiendo.

Una variable discreta acepta valores integrales, mientras que una variable continua acepta valores reales.
En otras palabras, podemos decir que una variable discreta acepta valores cuya fracción no tiene sentido,
mientras que una variable continua acepta valores cuya fracción tiene sentido. Un atributo discreto usa un
número limitado de valores, mientras que un atributo continuo usa un número ilimitado de valores.

Después de comprender los atributos y sus tipos, es hora de centrarse en las descripciones
estadísticas básicas, como las medidas de tendencia central.

Medir la tendencia central


La tendencia central es la tendencia de los valores agrupados alrededor de los promedios, como los
valores de la media, la moda y la mediana de los datos. El principal objetivo de la tendencia central es
calcular el valor central de las observaciones. La tendencia central determina el resumen descriptivo y
proporciona información cuantitativa sobre un grupo de observaciones. Tiene la capacidad de representar
un conjunto completo de observaciones. Veamos cada tipo de medida de tendencia central en detalle en
las próximas secciones.

Significar
El valor medio es la media aritmética o promedio, que se calcula mediante la suma de observaciones
dividida por el número de observaciones. Es sensible a los valores atípicos y al ruido, con el
resultado de que siempre que se agregan valores poco comunes o inusuales a un grupo, su media
se desvía del valor central típico. Suponga x1, X ,. . . , Xnorte es norte observaciones. los
2

La fórmula para la media de estos valores se muestra aquí:

[89]
Estadísticas Capítulo 3

Calculemos el valor medio de la columna de puntuación de habilidad de comunicación usando el pandasbiblioteca, de


la siguiente manera:

# Importar biblioteca de pandas


importar pandas como pd

# Crear marco de datos


sample_data = {'nombre': ['John', 'Alia', 'Ananya', 'Steve', 'Ben'],
'gender': ['M', 'F', 'F', 'M', 'M'], 'communication_skill_score': [40, 45,
23, 39, 39], 'quantitative_skill_score': [38, 41 , 42, 48, 32]}

data = pd.

# encontrar la media de la columna communication_skill_score


datos ['communcation_skill_score']. mean (eje = 0)

Producción:
37,2

En el bloque de código anterior, hemos creado un DataFrame llamado datos que tiene cuatro
columnasname, gender, communication_skill_score, y
puntuación_cualitativa_cuantitativa) y calculó la media usando el media (eje = 0)
función. Aquí,eje = 0 representa la media a lo largo de las filas.

Modo
La moda es el elemento de mayor ocurrencia en un grupo de observaciones. El valor de la moda aparece
con frecuencia en los datos y se utiliza principalmente para valores categóricos. Si todos los valores de un
grupo son únicos o no se repiten, no hay modo. También es posible que más de un valor tenga la misma
frecuencia de aparición. En tales casos, puede haber múltiples modos.

Calculemos el valor del modo de la columna de puntuación de habilidad de comunicación usando el pandasbiblioteca, de la
siguiente manera:

# modo de búsqueda de la columna communication_skill_score


datos ['communcation_skill_score']. mode ()

Producción:
39

[90]
Estadísticas Capítulo 3

En el bloque de código anterior, hemos calculado el modo de la columna de puntuación de habilidad de


comunicación usando el modo() función. Calculemos otra medida de tendencia central: la mediana.

Mediana
La mediana es el punto medio o el valor medio en un grupo de observaciones. También se le llama el 50th
percentil. La mediana se ve menos afectada por los valores atípicos y el ruido que la media, y es por eso que se
considera una medida estadística más adecuada para informar. Está muy cerca de un valor central típico.
Calculemos el valor mediano de la columna de puntuación de habilidad de comunicación usando elpandas
biblioteca, de la siguiente manera:

# encontrar la mediana de la columna communication_skill_score


datos ['communcation_skill_score']. median ()

Producción:
39,0

En el bloque de código anterior, hemos calculado la mediana de la columna de puntuación de


habilidad de comunicación utilizando la mediana() función. Comprendamos las medidas de dispersión
y calculémoslas en la siguiente sección.

Medición de la dispersión
Como hemos visto, la tendencia central presenta el valor medio de un grupo de observaciones pero no
proporciona la imagen general de una observación. Las métricas de dispersión miden la desviación en las
observaciones. Las métricas de dispersión más populares son el rango,rango intercuartil (IQR), varianza
y desviación estándar. Estas métricas de dispersión valoran la variabilidad en las observaciones o la
extensión de las observaciones. Veamos cada medida de dispersión en detalle, de la siguiente manera:

Distancia: El rango es la diferencia entre el valor máximo y mínimo de una observación.


Es fácil de calcular y de comprender. Su unidad es la misma que la unidad de
observaciones. Calculemos el rango de puntajes de habilidades de comunicación, de la
siguiente manera:

[91]
Estadísticas Capítulo 3

rango_columna = datos ['puntaje_de_comunicación_de_comunicación']. max () - datos


['puntaje_de_comunicación_de_comunicación']. min ()
imprimir (rango_columna)

Producción:
22

En el bloque de código anterior, hemos calculado el rango de puntuaciones de


habilidades de comunicación al encontrar la diferencia entre las puntuaciones máximas y
mínimas. Las puntuaciones máximas y mínimas se calcularon utilizando lamax () y min ()
funciones.

IQR: IQR es la diferencia entre el tercer y el primer cuartil. Es fácil de calcular y de


comprender. Su unidad es la misma que la unidad de observaciones. Mide el 50% medio en la
observación. Representa el rango donde se encuentra la mayor parte de la observación. IQR
también se conoce como medio o medio 50%, o H-spread. Calculemos el IQR de las
puntuaciones de las habilidades de comunicación de la siguiente manera:

# Primer cuartil
q1 = datos ['communcation_skill_score']. quantile (.25)

# Tercer cuartil
q3 = datos ['communcation_skill_score']. quantile (.75)

# Relación entre cuartiles


iqr = q3-q1
imprimir (iqr)

Producción:
1.0

En el bloque de código anterior, hemos calculado el IQR de los puntajes de habilidades de


comunicación al encontrar la diferencia entre el primer y tercer cuartil de puntajes. Tanto
el primer como el tercer cuartil se calcularon utilizando lacuantil (.25) y
cuantil (0,75) funciones.

[92]
Estadísticas Capítulo 3

Diferencia: La varianza mide la desviación de la media. Es el valor promedio de la


diferencia al cuadrado entre los valores observados y la media. El principal problema con
la varianza es su unidad de medida debido a que eleva al cuadrado la diferencia entre las
observaciones y la media. Asumamos x1 , X ,. . . , Xnorte están norte
2

observaciones. La fórmula para la varianza de estos valores será la


siguiente:

Calculemos la varianza de las puntuaciones de las habilidades de comunicación de la siguiente manera:

# Varianza de communication_skill_score
datos ['communcation_skill_score']. var ()

Producción:
69,2

En el bloque de código anterior, hemos calculado la varianza de los puntajes de habilidades de


comunicación usando el var () función.

Desviación Estándar: Esta es la raíz cuadrada de la varianza. Su unidad es la misma que para
las observaciones originales. Esto hace que sea más fácil para un analista evaluar la desviación
exacta de la media. El valor más bajo de la desviación estándar representa la menor distancia
de observaciones de la media; esto significa que las observaciones están menos difundidas. El
valor más alto de la desviación estándar representa una gran distancia de observaciones de la
media, es decir, las observaciones están muy dispersas. La desviación estándar está
representada matemáticamente por la letra griega sigma(Σ). Suponga x1, X ,. . . , Xnorte están 2

norte observaciones. La fórmula del estándar


La desviación de estos valores es la siguiente:

[93]
Estadísticas Capítulo 3

Calculemos la desviación estándar de las puntuaciones de las habilidades de comunicación de la siguiente manera:

# Desviación estándar de communication_skill_score


datos ['communcation_skill_score']. std ()

Producción:
8.318653737234168

En el bloque de código anterior, hemos calculado la desviación estándar de los puntajes de


habilidades de comunicación utilizando el std () función.

También podemos intentar describir la función para obtener todas las estadísticas de
resumen en un solo comando. losdescribir() La función devuelve el recuento, la media, la
desviación estándar, el primer cuartil, la mediana, el tercer cuartil y los valores mínimo y
máximo para cada columna numérica en el DataFrame, y se ilustra en el siguiente bloque
de código:

# Describe el marco de datos


data.describe ()

Producción:
communcation_skill_score puntuación_cuantitativa_skill
contar 5.000000 5.000000
significar 37.200000 40.200000
std 8.318654 5.848077
min 23.000000 32.000000
25% 39.000000 38.000000
50% 39.000000 41.000000
75% 40.000000 42.000000
max 45.000000 48.000000

En el bloque de código anterior, hemos generado un resumen estadístico descriptivo de los datos
utilizando el describir() método.

[94]
Estadísticas Capítulo 3

Asimetría y curtosis
La asimetría mide la simetría de una distribución. Muestra cuánto se desvía la distribución de una
distribución normal. Sus valores pueden ser cero, positivos y negativos. Un valor cero representa una
forma perfectamente normal de una distribución. La asimetría positiva se muestra con las colas que
apuntan hacia la derecha, es decir, los valores atípicos están sesgados hacia la derecha y los datos apilados
a la izquierda. La asimetría negativa se muestra con las colas que apuntan hacia la izquierda, es decir, los
valores atípicos están sesgados a la izquierda y los datos se apilan a la derecha. La asimetría positiva
ocurre cuando la media es mayor que la mediana y la moda. La asimetría negativa ocurre cuando la media
es menor que la mediana y la moda. Calculemos la asimetría en el siguiente bloque de código:

# asimetría de la columna communication_skill_score


datos ['communcation_skill_score']. skew ()

Producción:
- 1.704679180800373

En el bloque de código anterior, hemos calculado la asimetría de la columna de puntuación de habilidad de


comunicación utilizando la sesgar() método.

La curtosis mide el tamaño de la cola (grosor de la cola) en comparación con una distribución normal. La curtosis
alta es de cola pesada, lo que significa que hay más valores atípicos presentes en las observaciones y los valores
bajos de curtosis son de cola ligera, lo que significa que hay menos valores atípicos presentes en las
observaciones. Hay tres tipos de formas de curtosis: mesocúrtica, platicúrtica y leptocurtica. Vamos a definirlos
uno por uno, de la siguiente manera:

Una distribución normal que tiene cero curtosis se conoce como distribución
mesocúrtica.
Una distribución platicúrtica tiene un valor de curtosis negativo y es de cola fina en
comparación con una distribución normal.
Una distribución leptocúrtica tiene un valor de curtosis superior a 3 y tiene una cola grasa en
comparación con una distribución normal.

[95]
Estadísticas Capítulo 3

Veamos el tipo de formas de curtosis en el siguiente diagrama:

Un histograma es un medio eficaz para presentar asimetría y curtosis. Calculemos la curtosis de la columna
de puntuación de habilidad de comunicación, de la siguiente manera:

# curtosis de la columna communication_skill_score


datos ['communcation_skill_score']. kurtosis ()

Producción:
3.6010641852384015

En el bloque de código anterior, hemos calculado la curtosis de la columna de puntuación de


habilidad de comunicación usando la curtosis () método.

Comprender las relaciones mediante el uso de


coeficientes de covarianza y correlación.
Medir la relación entre las variables será útil para que los analistas de datos comprendan la dinámica
entre las variables; por ejemplo, un gerente de recursos humanos debe comprender la fuerza de la
relación entre el puntaje de desempeño del empleado y el puntaje de satisfacción. La estadística
ofrece dos medidas de covarianza y correlación para comprender la relación entre variables. La
covarianza mide la relación entre un par de variables. Muestra el grado de cambio en las variables,
es decir, cómo el cambio en una variable afecta a la otra variable. Su valor varía de -infinito a +
infinito. El problema de la covarianza es que no proporciona conclusiones efectivas porque no está
normalizada. Encontremos la relación entre la puntuación de habilidad de comunicación y
cuantitativa usando covarianza, de la siguiente manera:

# Covarianza entre columnas de marco de datos


data.cov ()

[96]
Estadísticas Capítulo 3

Esto da como resultado la siguiente salida:

En el bloque de código anterior, la covarianza se calcula utilizando el cov () método. Aquí, la


salida de este método es la matriz de covarianza.

Coeficiente de correlación de Pearson


La correlación muestra cómo se correlacionan las variables entre sí. La correlación ofrece una mejor
comprensión que la covarianza y es una versión normalizada de la covarianza. La correlación varía de -1 a
1. Un valor negativo representa el aumento en una variable, lo que provoca una disminución en otras
variables o variables que se mueven en la misma dirección. Un valor positivo representa el aumento en
una variable, lo que provoca un aumento en otra variable, o una disminución en una variable causa
disminuciones en otra variable. Un valor cero significa que no hay relación entre la variable o que las
variables son independientes entre sí. Eche un vistazo al siguiente fragmento de código:

# Correlación entre columnas de dataframe


data.corr (método = 'pearson')

Esto da como resultado la siguiente salida:

Los 'método' El parámetro puede tomar uno de los siguientes tres parámetros:

pearson: Coeficiente de correlación estándarKendall:


Coeficiente de correlación tau de Kendalllancero:
Coeficiente de correlación de rango de Spearman

[97]
Estadísticas Capítulo 3

Coeficiente de correlación de rango de Spearman


El coeficiente de correlación de rango de Spearman es el coeficiente de correlación de Pearson en los
rangos de las observaciones. Es una medida no paramétrica para la correlación de rango. Evalúa la fuerza
de la asociación entre dos variables clasificadas. Las variables clasificadas son números ordinales,
ordenados. Primero, clasificamos las observaciones y luego calculamos la correlación de rangos. Puede
aplicarse a variables ordinales continuas y discretas. Cuando la distribución de datos está sesgada o un
valor atípico se ve afectado, se usa la correlación de rango de Spearman en lugar de la correlación de
Pearson porque no tiene supuestos para la distribución de datos.

Coeficiente de correlación de rango de Kendall


El coeficiente de correlación de rango de Kendall o el coeficiente tau de Kendall es una estadística
no paramétrica que se utiliza para medir la asociación entre dos variables ordinales. Es un tipo de
correlación de rango. Mide la similitud o disimilitud entre dos variables. Si ambas variables son
binarias, entonces Pearson = Spearman = tau de Kendall.

Hasta ahora, hemos visto temas de estadística descriptiva como medidas centrales, medidas de
dispersión, medidas de distribución y medidas de relación variable. Es hora de pasar a los temas de la
estadística inferencial, como el teorema del límite central, las técnicas de muestreo y las pruebas
paramétricas y no paramétricas.

Teorema del límite central


Los métodos de análisis de datos implican la prueba de hipótesis y la decisión de intervalos de confianza. Todas
las pruebas estadísticas asumen que la población se distribuye normalmente. El teorema del límite central es el
núcleo de la prueba de hipótesis. De acuerdo con este teorema, la distribución muestral se aproxima a una
distribución normal con un aumento en el tamaño de la muestra. Además, la media de la muestra se acerca a las
medias de la población y la desviación estándar de la muestra se reduce. Este teorema es esencial para trabajar
con estadísticas inferenciales, lo que ayuda a los analistas de datos a descubrir cómo las muestras pueden ser
útiles para obtener información sobre la población.

[98]
Estadísticas Capítulo 3

¿Proporciona respuestas a preguntas como qué tamaño de muestra debe tomarse o qué
tamaño de muestra es una representación precisa de la población? Puede comprender esto
con la ayuda del siguiente diagrama:

En el diagrama anterior, puede ver cuatro histogramas para diferentes tamaños de muestra
50, 100, 200 y 500. Si observa aquí, a medida que aumenta el tamaño de la muestra, el histograma se
aproxima a una curva normal. Aprendamos técnicas de muestreo en la siguiente sección.

[99]
Estadísticas Capítulo 3

Recolectando muestras
Una muestra es un pequeño conjunto de la población que se utiliza con fines de análisis de datos. El
muestreo es un método o proceso de recopilación de datos de muestra de diversas fuentes. Es la parte
más crucial de la recopilación de datos. El éxito de un experimento depende de qué tan bien se recopilen
los datos. Si algo sale mal con el muestreo, afectará enormemente las interpretaciones finales. Además, es
imposible recopilar datos para toda la población. El muestreo ayuda a los investigadores a inferir la
población de la muestra y reduce el costo de la encuesta y la carga de trabajo para recopilar y administrar
datos. Hay muchas técnicas de muestreo disponibles para diversos fines. Estas técnicas se pueden
clasificar en dos categorías: muestreo probabilístico y muestreo no probabilístico, que se describen con
más detalle aquí:

Muestreo de probabilidad: Con esta técnica, se realiza una selección aleatoria de todos
los encuestados de la población, con igual probabilidad de la muestra seleccionada.
Estos tipos de técnicas de muestreo requieren más tiempo y son más costosos e
incluyen lo siguiente:
Muestreo aleatorio simple: Con esta técnica, cada encuestado se
selecciona al azar, lo que significa que cada encuestado tiene las mismas
posibilidades de ser seleccionado. Es un método simple y directo; por
ejemplo, se seleccionan al azar 20 productos de 500 productos para
realizar pruebas de calidad.
Muestreo estratificado: Con esta técnica, toda la población se divide en
pequeños grupos conocidos como estratos que se basan en algunos
criterios de similitud. Estos estratos pueden tener un tamaño desigual. Esta
técnica mejora la precisión al reducir el sesgo de selección.
Muestreo sistemático: Con esta técnica, los encuestados se seleccionan
a intervalos regulares. En otras palabras, podemos decir que los
encuestados se seleccionan en orden sistemático de la población
objetivo, como cadanortea encuestado de la población.
Muestreo por conglomerados: Con esta técnica de muestreo, toda la
población se divide en grupos o secciones. Los grupos se forman en función
del género, la ubicación, la ocupación, etc. Estos grupos completos se utilizan
para el muestreo en lugar del encuestado individual.

[100]
Estadísticas Capítulo 3

Muestreo no probabilístico: Este muestreo selecciona de forma no aleatoria a todos los


encuestados de la población, con una probabilidad desigual de la muestra seleccionada. Su
resultado puede estar sesgado. Dichos tipos de técnicas de muestreo son más económicas y
convenientes e incluyen lo siguiente:
Muestreo de conveniencia: Ésta es la técnica más sencilla para la recopilación de
datos. Selecciona a los encuestados en función de su disponibilidad y voluntad de
participar. Los estadísticos prefieren esta técnica para la encuesta inicial debido al
costo y la rápida recopilación de datos, pero los resultados son más propensos a
sesgos.
Muestra deliberada: Esto también se conoce como muestreo por juicio porque
depende del juicio del estadístico. Los estadísticos deciden en tiempo de
ejecución quién participará en la encuesta en función de ciertas características
predefinidas. Los reporteros de noticias utilizan esta técnica para seleccionar a
las personas cuyas opiniones desean obtener.
Muestreo de cuotas: Esta técnica predefine las propiedades de los estratos y las
proporciones de la muestra. Los encuestados de la muestra se seleccionan hasta que se
alcanza una proporción definitiva. Se diferencia del muestreo estratificado en términos
de estrategia de selección; selecciona elementos en estratos mediante muestreo
aleatorio.
Muestreo de bolas de nieve: Esta técnica se utiliza en una situación en la que encontrar
encuestados en una población es poco común y difícil de rastrear, en áreas como la
inmigración ilegal o el VIH. Los estadísticos se ponen en contacto con los voluntarios
para llegar a las víctimas. También se conoce como muestreo de referencia porque la
persona inicial que participa en la encuesta se refiere a otra persona que se ajusta a la
descripción de la muestra.

En esta sección, hemos visto los métodos de muestreo y sus tipos: muestreo probabilístico y muestreo
no probabilístico. Ahora es el momento de pasar a las técnicas de prueba de hipótesis. En las próximas
secciones, nos centraremos en las pruebas de hipótesis paramétricas y no paramétricas.

Realización de pruebas paramétricas


La hipótesis es el tema central principal de la estadística inferencial. En esta sección, nos centraremos en las
pruebas paramétricas. El supuesto básico de una prueba paramétrica es la distribución estadística subyacente.
La mayoría de los métodos estadísticos elementales son de naturaleza paramétrica. Las pruebas paramétricas
se utilizan para datos cuantitativos y continuos. Los parámetros son cantidades numéricas que representan a
toda la población. Las pruebas paramétricas son más potentes y fiables que las no paramétricas. La hipótesis se
desarrolla sobre los parámetros de distribución de la población. A continuación, se muestran algunos ejemplos
de pruebas paramétricas:

[101]
Estadísticas Capítulo 3

Una prueba t es una especie de prueba paramétrica que se utiliza para verificar si existe una
diferencia significativa entre las medias de los dos grupos en cuestión. Es la estadística inferencial
más utilizada que sigue la distribución normal. Una prueba t tiene dos tipos: una prueba t de una
muestra y una prueba t de dos muestras. Se utiliza una prueba t de una muestra para verificar si
hay una diferencia significativa entre una muestra y las medias de la población hipotética.
Tomemos a 10 estudiantes y verifiquemos si su peso promedio es de 68 kg o no utilizando una
prueba t, de la siguiente manera:

importar numpy como np

de scipy.stats importar ttest_1samp

# Crear datos
datos = np.array ([63, 75, 84, 58, 52, 96, 63, 55, 76, 83])

# Encontrar media
mean_value = np.mean (datos)

print ("Mean:", mean_value)

Producción:

Media: 70,5

En el bloque de código anterior, creamos una matriz del peso de 10 estudiantes y


calculamos su media aritmética usando numpy.mean ().

Realicemos una prueba t de una muestra, de la siguiente manera:

# Realice la prueba t de una muestra


t_test_value, p_value = ttest_1samp (datos, 68)

print ("Valor P:", valor_p)

print ("Valor de la prueba t:", t_test_value)

# 0.05 o 5% es el nivel de significancia o alfa.


si p_value <0.05:

print ("Hipótesis rechazada")

demás:
print ("Hipótesis aceptada")

Producción:

Valor P: 0.5986851106160134

[102]
Estadísticas Capítulo 3

Valor de la prueba t: 0.5454725779039431


Hipótesis aceptada

En el bloque de código anterior, hemos probado la hipótesis nula (el peso promedio de 10
estudiantes es 68 kg) usando ttest_1samp (). Los resultados de salida han demostrado que se
acepta la hipótesis nula con un intervalo de confianza del 95%, lo que significa que el peso
promedio de 10 estudiantes es de 68 kg.

Se utiliza una prueba t de dos muestras para comparar la diferencia significativa entre dos grupos
independientes. Esta prueba también se conoce como prueba t de muestras independientes. Comparemos
el peso promedio de dos grupos de estudiantes independientes, de la siguiente manera:

Hipótesis nula H0: Las medias de la muestra son iguales — μ 1 = μ 2

Hipótesis alternativa Ha: Las medias de la muestra no son iguales — μ 1 > μ 2 o μ 2 > μ 1

Eche un vistazo al siguiente bloque de código:

de scipy.stats importar ttest_ind

# Crea matrices numpy


data1 = np.array ([63, 75, 84, 58, 52, 96, 63, 55, 76, 83])

data2 = np.array ([53, 43, 31, 113, 33, 57, 27, 23, 24, 43])

En el bloque de código anterior, hemos creado dos matrices de pesos de 10 estudiantes. Realicemos una

prueba t de dos muestras, de la siguiente manera:

# Comparar muestras

stat, p = ttest_ind (datos1, datos2)

imprimir ("valores p:", p)

imprimir ("prueba t:", estadística)

# 0.05 o 5% es el nivel de significancia o alfa.

si p <0,05:

print ("Hipótesis rechazada")

demás:

print ("Hipótesis aceptada")

[103]
Estadísticas Capítulo 3

Producción:
Valores p: 0.015170931362451255
Prueba t: 2.6835879913819185 Hipótesis
rechazada

En el bloque de código anterior, hemos probado el peso promedio de la hipótesis de dos


grupos utilizando el ttest_ind () método, y los resultados muestran que la hipótesis nula se
rechaza con un intervalo de confianza del 95%, lo que significa que las medias muestrales son
diferentes.

Una prueba t de muestras pareadas es una prueba t de muestras dependientes, que se utiliza para
decidir si la diferencia media entre dos observaciones del mismo grupo es cero; por ejemplo, para
comparar la diferencia en el nivel de presión arterial de un grupo de pacientes antes y después de
algún tratamiento farmacológico. Esto es equivalente a una prueba t de una muestra y también se
conoce como prueba t de muestra dependiente. Realicemos una prueba t pareada para evaluar el
impacto del tratamiento de pérdida de peso. Hemos recopilado el peso de los pacientes antes y
después del tratamiento. Esto se puede representar mediante la siguiente hipótesis:

Hipótesis nula H0: La diferencia media entre las dos muestras dependientes es 0.

Hipótesis alternativa Ha: La diferencia media entre las dos muestras


dependientes no es 0.

Eche un vistazo al siguiente bloque de código:

# prueba emparejada
de scipy.stats importar ttest_rel

# Pesos antes del tratamiento


data1 = np.array ([63, 75, 84, 58, 52, 96, 63, 65, 76, 83])

# Pesos después del tratamiento


data2 = np.array ([53, 43, 67, 59, 48, 57, 65, 58, 64, 72])

En el bloque de código anterior, hemos creado dos matrices de pesos de 10 pacientes antes y después
del tratamiento. Realicemos una prueba t de muestra pareada, de la siguiente manera:

# Comparar pesos

stat, p = ttest_rel (datos1, datos2)

imprimir ("valores p:", p)

imprimir ("prueba t:", estadística)

[104]
Estadísticas Capítulo 3

# 0.05 o 5% es el nivel de significancia o alfa.

si p <0,05:
print ("Hipótesis rechazada")

demás:

print ("Hipótesis aceptada")

Producción:
Valores p: 0.013685575312467715
Prueba t: 3.0548295044306903 Hipótesis
rechazada

En el bloque de código anterior, hemos probado la hipótesis del peso promedio de dos grupos
antes y después del tratamiento usando el ttest_rel () método. Los resultados muestran que la
hipótesis nula se rechaza con un intervalo de confianza del 95%, lo que significa que el
tratamiento para adelgazar tiene un impacto significativo en el peso del paciente.

ANOVA: Una prueba t solo se ocupa de dos grupos, pero a veces tenemos más de dos
grupos o varios grupos al mismo tiempo para comparar. ANOVA (Análisis de variación)
es una prueba de inferencia estadística que se utiliza para comparar varios grupos.
Analiza la varianza entre y dentro de varios grupos y prueba varias hipótesis nulas al
mismo tiempo. Por lo general, compara más de dos conjuntos de datos y verifica la
significación estadística. Podemos utilizar ANOVA de tres formas: ANOVA de una vía,
ANOVA de dos vías y ANOVA multivariante de N vías.
Con el método ANOVA unidireccional, comparamos varios grupos en función de una sola
variable independiente; por ejemplo, una empresa de TI desea comparar la productividad de
varios grupos o equipos de empleados en función de la puntuación de rendimiento. En nuestro
ejemplo, comparamos el desempeño de los empleados en una empresa de TI con sede en tres
ubicaciones: Mumbai, Chicago y Londres. Aquí, realizaremos una prueba ANOVA unidireccional
y comprobaremos una diferencia significativa en el rendimiento. Definamos las hipótesis nula
y alternativa, de la siguiente manera:

Hipótesis nula H0: No hay diferencia entre la puntuación media de


rendimiento de varias ubicaciones.

Hipótesis alternativa Ha: Existe una diferencia entre la puntuación


media de rendimiento de varias ubicaciones.

Eche un vistazo al siguiente bloque de código:

de scipy.stats importar f_oneway

# Puntuaciones de rendimiento de la ubicación de Mumbai

[105]
Estadísticas Capítulo 3

mumbai = [0.14730927, 0.59168541, 0.85677052, 0.27315387,


0.78591207,0.52426114, 0.05007655, 0.64405363, 0.9825853, 0.62667439]

# Puntuaciones de rendimiento de la ubicación de Chicago


chicago = [0.99140754, 0.76960782, 0.51370154, 0.85041028,
0.19485391,0.25269917, 0.19925735, 0.80048387, 0.98381235, 0.5864963]

# Puntuaciones de rendimiento de la ubicación de Londres


Londres = [0.40382226, 0.51613408, 0.39374473, 0.0689976,
0.28035865,0.56326686, 0.66735357, 0.06786065, 0.21013306, 0.86503358]

En el bloque de código anterior, hemos creado tres listas de puntuaciones de desempeño de los
empleados para tres ubicaciones: Mumbai, Chicago y Londres.

Realicemos una prueba ANOVA unidireccional, de la siguiente manera:

# Comparar resultados usando ANOVA de una vía


stat, p = f_oneway (mumbai, chicago, londres)

print ("valores p:", p)

print ("ANOVA:", stat)

si p <0,05:
print ("Hipótesis rechazada")

demás:

print ("Hipótesis aceptada")

Producción:
valores p: 0,27667556390705783
ANOVA: 1,3480446381965452 Hipótesis
aceptada

En el bloque de código anterior, hemos probado la hipótesis de que no hay diferencia entre la
puntuación media de rendimiento de varias ubicaciones utilizando elf_oneway () método. Los
resultados anteriores muestran que la hipótesis nula se acepta con un intervalo de confianza
del 95%, lo que significa que no hay una diferencia significativa entre la puntuación media de
rendimiento de todas las ubicaciones.

[106]
Estadísticas Capítulo 3

Con el método ANOVA bidireccional, comparamos varios grupos en función de dos variables
independientes, por ejemplo, si una empresa de TI desea comparar la productividad de
varios grupos o equipos de empleados en función de las horas de trabajo y la complejidad
del proyecto.
En ANOVA de N vías, comparamos múltiples grupos basados en norte Variables independientes: por
ejemplo, si una empresa de TI desea comparar la productividad de varios grupos o equipos de
empleados en función de las horas de trabajo, la complejidad del proyecto, la capacitación de los
empleados y otros beneficios e instalaciones de los empleados.

En esta sección, hemos explorado las pruebas paramétricas como la prueba t y las pruebas ANOVA en
detalle. Pasemos a la prueba de hipótesis no paramétrica.

Realización de pruebas no paramétricas


Una prueba no paramétrica no se basa en ninguna distribución estadística; por eso se conoce como prueba de
hipótesis "sin distribución". Las pruebas no paramétricas no tienen parámetros de población. Estos tipos de
pruebas se utilizan para ordenar y clasificar las observaciones y requieren métodos especiales de clasificación y
conteo. A continuación, se muestran algunos ejemplos de pruebas no paramétricas:

A Prueba de chi-cuadrado está determinada por una diferencia significativa o una relación entre
dos variables categóricas de una sola población. En general, esta prueba evalúa si las distribuciones
de variables categóricas difieren entre sí. También se conoce como prueba de bondad de ajuste de
chi-cuadrado o prueba de chi-cuadrado para la independencia. Un valor pequeño del estadístico Chi-
Cuadrado significa que los datos observados se ajustan a los datos esperados, y un valor mayor del
estadístico Chi-Cuadrado significa que los datos observados no se ajustan a los datos esperados. Por
ejemplo, el impacto del género en la preferencia de voto o el impacto del tamaño de la empresa en
la cobertura del seguro de salud se puede evaluar mediante una prueba de Chi-Cuadrado:

Aquí, O es el valor observado, mi es el valor esperado y "I"es la" yoth"posición en la


tabla de contingencia.

[107]
Estadísticas Capítulo 3

Entendamos la prueba de chi-cuadrado con un ejemplo. Supongamos que hicimos una


encuesta en una empresa de 200 empleados y les preguntamos sobre su calificación más
alta como Bachillerato, Secundaria superior, Graduado, Postgrado, y la comparamos con
niveles de desempeño como Promedio y Sobresaliente. Aquí están las hipótesis y los
criterios de contingencia:

Hipótesis nula H0: Las dos variables categóricas son independientes, es decir, el
desempeño de los empleados es independiente del nivel de calificación más alto.

Hipótesis alternativa Ha: Las dos variables categóricas no son independientes, es


decir, el desempeño de los empleados no es independiente del nivel de calificación
más alto.

La tabla de contingencia se puede representar de la siguiente manera:

Escuela secundaria Secundaria superior Graduado Postgrado


Promedio 20 dieciséis 13 7
Sobresaliente 31 40 50 13

Realicemos una prueba de chi-cuadrado y verifiquemos una diferencia significativa en la


asociación entre las variables, de la siguiente manera:

de scipy.stats importar chi2_contingency

# Empleados con desempeño promedio


promedio = [20, 16, 13, 7]

# Empleados de desempeño sobresaliente


sobresaliente = [31, 40, 60, 13]

# mesa de contingencia
contingency_table = [promedio, sobresaliente]

En el bloque de código anterior, creamos dos listas de empleados con desempeño


promedio y sobresaliente y creamos una tabla de contingencia.

Realicemos una prueba de Chi-Cuadrado, de la siguiente manera:

# Aplicar prueba
stat, p, dof, esperado = chi2_contingency (contingency_table)

imprimir ("valores p:", p)

si p <0,05:
print ("Hipótesis rechazada")

[108]
Estadísticas Capítulo 3

demás:

print ("Hipótesis aceptada")

Producción:
valores p: 0.059155602774381234
Hipótesis aceptada

En el bloque de código anterior, hemos probado la hipótesis de que el desempeño de los


empleados es independiente del nivel de calificación más alto. Los resultados anteriores
muestran que la hipótesis nula se acepta con un intervalo de confianza del 95%, lo que
significa que el desempeño del empleado es independiente del nivel de calificación más alto.

los Prueba U de Mann-Whitney es la contraparte no paramétrica de la prueba t para dos


muestras. No asume que la diferencia entre las muestras se distribuya normalmente. La
prueba U de Mann-Whitney se usa cuando la observación es ordinal y no se cumplieron las
suposiciones de la prueba t, por ejemplo, al comparar dos grupos de preferencias de prueba
de películas de sus clasificaciones de películas dadas. Comparemos dos grupos de
clasificaciones de películas utilizando los siguientes criterios:

Hipótesis nula H0: No hay diferencia entre las dos distribuciones


de muestra.

Hipótesis alternativa Ha: Existe una diferencia entre las dos distribuciones de
muestra.

Eche un vistazo al siguiente bloque de código:

de scipy.stats import mannwhitneyu

# Sample1

datos1 = [7,8,4,9,8]

# Sample2

datos2 = [3,4,2,1,1]

En el bloque de código anterior, hemos creado dos listas de datos. Realicemos

una prueba U de Mann-Whitney, de la siguiente manera:

# Aplicar prueba

stat, p = mannwhitneyu (datos1, datos2)

[109]
Estadísticas Capítulo 3

imprimir ("valores p:", p)

# 0.01 o 1% es el nivel de significancia o alfa.

si p <0,01:

print ("Hipótesis rechazada")

demás:
print ("Hipótesis aceptada")

Producción:
valores p: 0,007666581056801412
Hipótesis rechazada

En el bloque de código anterior, hemos probado la hipótesis de que existe


no hay diferencia entre la distribución de dos grupos de clasificación de películas utilizando el
mannwhitneyu () método. Los resultados muestran que la hipótesis nula se rechaza con un intervalo
de confianza del 99%, lo que significa que hay una diferencia significativa entre los dos grupos de
clasificación de películas.

los Prueba de rango con signo de Wilcoxon compara dos muestras pareadas. Es una
versión no paramétrica equivalente de la prueba t pareada. Prueba la hipótesis nula de si las
dos muestras emparejadas pertenecen a la misma distribución o no, por ejemplo, para
comparar la diferencia entre dos observaciones de tratamiento para múltiples grupos.
Comparemos la diferencia entre dos observaciones de tratamiento utilizando los siguientes
criterios:

Hipótesis nula H0: No hay diferencia entre las distribuciones muestrales


dependientes.

Hipótesis alternativa Ha: Existe una diferencia entre las distribuciones


muestrales dependientes.

Eche un vistazo al siguiente bloque de código:

de scipy.stats importar wilcoxon

# Muestra-1
datos1 = [1, 3, 5, 7, 9]

# Muestra-2 después del tratamiento


datos2 = [2, 4, 6, 8, 10]

En el bloque de código anterior, hemos creado dos listas de datos.

[110]
Estadísticas Capítulo 3

Realicemos una prueba de rango con signo de Wilcoxon, de la siguiente manera:

# Solicitar
stat, p = wilcoxon (datos1, datos2)

imprimir ("valores p:", p)

# 0.01 o 1% es el nivel de significancia o alfa.

si p <0,01:

print ("Hipótesis rechazada")

demás:
print ("Hipótesis aceptada")

Producción:
valores p: 0.025347318677468252
Hipótesis aceptada

En el bloque de código anterior, hemos probado la hipótesis de que existe


no hay diferencia entre la distribución de los grupos antes y después del tratamiento
utilizando el Wilcoxon () método. Los resultados anteriores muestran que la hipótesis nula se
acepta con un intervalo de confianza del 99%, lo que significa que no hay diferencia
significativa entre los grupos antes y después del tratamiento.

los Kruskal-Wallis test es la versión no paramétrica de ANOVA de una vía, para evaluar
si las muestras pertenecen a la misma distribución o no. Compara dos o más muestras
independientes. Extiende el límite de la prueba U de Mann-Whitney, que compara solo
dos grupos. Comparemos tres grupos de muestra usando el siguiente código:

de scipy.stats importar kruskal

# Muestra de datos-1
x = [38, 18, 39, 83, 15, 38, 63, 1, 34, 50]

# Muestra de datos-2
y = [78, 32, 58, 59, 74, 77, 29, 77, 54, 59]

# Muestra de datos-3
z = [117, 92, 42, 79, 58, 117, 46, 114, 86, 26]

[111]
Estadísticas Capítulo 3

En el bloque de código anterior, hemos creado tres listas de datos. Realicemos una prueba de Kruskal-Wallis,
de la siguiente manera:

# Aplicar la prueba de kruskal-wallis


stat, p = kruskal (x, y, z)

imprimir ("valores p:", p)

# 0.01 o 1% es el nivel de significancia o alfa.

si p <0,01:

print ("Hipótesis rechazada")

demás:
print ("Hipótesis aceptada")

Producción:
valores p: 0.01997922369138151
Hipótesis aceptada

En el bloque de código anterior, hemos probado la hipótesis de que no hay diferencia


entre los tres grupos de muestra utilizando la kruskal () método. Los resultados anteriores
muestran que la hipótesis nula se acepta con un intervalo de confianza del 99%, lo que
significa que no hay diferencia entre los tres grupos de muestra. Comparemos las
pruebas paramétricas y no paramétricas, de la siguiente manera:

Características Pruebas paramétricas Pruebas no paramétricas


Estadística de prueba Distribución Arbitrario o "sin distribución"
Tipo de atributo Numérico Nominal y ordinal
Medidas de tendencia central Significar Mediana
Pruebas de correlación Correlación de Pearson Correlación de Spearman
Información sobre población Información completa Sin información

En la tabla anterior, ha visto ejemplos de pruebas paramétricas y no paramétricas basadas en


diversas características, como estadística de prueba, tipo de atributo, medidas de tendencia
central, pruebas de correlación e información de población. Finalmente, llegaste hasta el final. En
este capítulo, hemos explorado los fundamentos de la estadística descriptiva e inferencial con
Python.

[112]
Estadísticas Capítulo 3

Resumen
Los fundamentos básicos de las estadísticas proporcionarán la base para el análisis de datos, facilitando
cómo se describen y comprenden los datos. En este capítulo, ha aprendido los conceptos básicos de las
estadísticas, como los atributos y sus diferentes tipos, como nominal, ordinal y numérico. También ha
aprendido sobre la media, la mediana y la moda para medir la tendencia central. Las medidas de rango,
IQR, varianza y desviación estándar se utilizan para estimar la variabilidad en los datos; la asimetría y la
curtosis se utilizan para comprender la distribución de datos; La covarianza y la correlación se utilizan para
comprender la relación entre las variables. También ha visto temas de estadística inferencial como el
teorema del límite central, la recopilación de muestras y las pruebas paramétricas y no paramétricas.
También ha realizado una codificación práctica sobre conceptos estadísticos utilizando elpandas y
scipy.stats Bibliotecas.

El próximo capítulo, Capítulo 4, Álgebra lineal, nos ayudará a aprender cómo resolver el sistema lineal de
ecuaciones, encontrar valores propios y vectores propios, y aprender sobre distribución binomial y normal,
pruebas de normalidad y matrices enmascaradas utilizando los paquetes de Python NumPy y SciPy.

[113]
Álgebra lineal
-
Tanto el álgebra lineal como la estadística son la base de cualquier tipo de actividad de análisis de datos.
Las estadísticas nos ayudan a obtener una comprensión descriptiva inicial y a hacer inferencias a partir de
los datos. En el capítulo anterior, hemos entendido las medidas estadísticas descriptivas e inferenciales
para el análisis de datos. Por otro lado, el álgebra lineal es una de las materias matemáticas fundamentales
que es la base central para cualquier profesional de datos. El álgebra lineal es útil para trabajar con
vectores y matrices. La mayoría de los datos están disponibles en forma de vector o matriz. El
conocimiento profundo del álgebra lineal ayuda a los analistas de datos y a los científicos de datos a
comprender el flujo de trabajo del aprendizaje automático y los algoritmos de aprendizaje profundo, lo
que les brinda la flexibilidad de diseñar y modificar los algoritmos según las necesidades de su negocio.
Por ejemplo, si quiere trabajar conanálisis de componentes principales (PCA) debe conocer los
conceptos básicos de Autovalores y Autovectores, o si desea desarrollar un sistema de recomendación
debe conocer valor singular de descomposición (SVD). Una sólida formación en matemáticas y
estadística facilitará una transición más fluida al mundo del análisis de datos.

Este capítulo se centra principalmente en los conceptos centrales del álgebra lineal, como polinomios,
determinante, matriz inversa; resolver ecuaciones lineales; Valores propios y vectores propios; SVD;
números al azar; distribuciones binomiales y normales; pruebas de normalidad; y matrices
enmascaradas. También podemos realizar estas operaciones en Python usando los paquetes NumPy y
SciPy. NumPy y SciPy ofrecenlinalg paquete para operaciones de álgebra lineal.

En este capítulo, cubriremos los siguientes temas:

Ajuste a polinomios con


determinante numérico
Encontrar el rango de una matriz
Matriz inversa usando NumPy
Resolver ecuaciones lineales usando NumPy
Descomponer una matriz usando vectores propios
SVD y valores propios usando NumPy
Álgebra lineal Capítulo 4

Generación de números
aleatorios Distribución binomial
Distribución normal
Probando la normalidad de los datos usando SciPy Creando una matriz
enmascarada usando el numpy.ma subpaquete

Requerimientos técnicos
Para este capítulo, está disponible la siguiente información técnica:

Puede encontrar el código y el conjunto de datos en el siguiente enlace de GitHub: https: / /


github. com / PacktPublishing / Python- Data- Analysis- Third- Edition / tree / master /
Chapter04.
Todos los bloques de código están disponibles en ch4.ipynb.

En este capítulo, usaremos las bibliotecas NumPy, SciPy, Matplotlib y Seaborn


Python.

Ajuste a polinomios con NumPy


Los polinomios son expresiones matemáticas con estrategias no negativas. Ejemplos de funciones
polinomiales son funciones lineales, cuadráticas, cúbicas y cuárticas. NumPy ofrece lapolyfit ()
función para generar polinomios usando mínimos cuadrados. Esta función tomaX- coordinar, y-
coordenadas y grados como parámetros, y devuelve una lista de coeficientes polinomiales.

NumPy también ofrece polyval () para evaluar el polinomio en valores dados. Esta función toma
coeficientes de polinomios y matrices de puntos y devuelve valores resultantes de polinomios.
Otra función eslinspace (), que genera una secuencia de valores igualmente separados. Toma el
inicio, la parada y el número de valores entre el rango de inicio y parada y devuelve valores
igualmente separados en el intervalo cerrado.

Veamos un ejemplo para generar y evaluar polinomios usando NumPy, de la siguiente manera:

# Importar las bibliotecas necesarias NumPy, polyinomial y matplotlib


importar numpy como np
importar matplotlib.pyplot como plt

# Genera dos vectores aleatorios


v1 = np.random.rand (10)

[115]
Álgebra lineal Capítulo 4

v2 = np.random.rand (10)

# Crea una secuencia de valores igualmente separados


secuencia = np.linspace (v1.min (), v1.max (), num = len (v1) * 10)

# Ajustar los datos a los datos de ajuste polinomial con 4 grados del polinomio
coefs = np.polyfit (v1, v2, 3)

# Evaluar polinomio en una secuencia dada


polynomial_sequence = np.polyval (coefs, secuencia)

# trazar la curva polinomial


plt.plot (secuencia, secuencia_polinomial)

# Mostrar trama
plt.show ()

Esto da como resultado la siguiente salida:

El gráfico que se muestra en la captura de pantalla anterior cambiará en cada iteración utilizando el programa
escrito anteriormente. La razón de esta fluctuación es la generación de valores aleatorios de vectores.

Pasemos al siguiente tema: Determinante. Realizaremos la mayoría de las operaciones de


álgebra lineal usando lanumpy.linalg subpaquete. NumPy ofrece lalinalg subpaquete para álgebra
lineal. Podemos usar álgebra lineal para operaciones matriciales como inversa, rango, valores
propios, vectores propios, resolución de ecuaciones lineales y regresión lineal.

[116]
Álgebra lineal Capítulo 4

Determinante
El determinante es el concepto más esencial del álgebra lineal. Es un valor escalar que se calcula a partir
de una matriz cuadrada. El determinante es una operación fundamental que nos ayuda en la matriz
inversa y en la resolución de ecuaciones lineales. Los determinantes solo se calculan para matrices
cuadradas. Una matriz cuadrada tiene el mismo número de filas y columnas. losnumpy.linalg El
subpaquete proporciona el det () función para calcular el determinante de una matriz de entrada dada.
Calculemos el determinante en el siguiente bloque de código:

# Importar numpy
importar numpy como np

# Crear matriz usando NumPy


mat = np.mat ([[2,4], [5,7]]) print
("Matriz: \ n", mat)

# Calcular determinante
print ("Determinante:", np.linalg.det (mat))

Esto da como resultado la siguiente salida:

Matriz:
[[2 4]
[5 7]]
Determinante: -5.999999999999998

En el bloque de código anterior, hemos calculado el determinante de una matriz dada usando
elnp.linalg.det () método. Entendamos un concepto más de álgebra lineal, que es el rango, y
calculémoslo usando elnumpy.linalg subpaquete.

Encontrar el rango de una matriz


El rango es un concepto muy importante cuando se trata de resolver ecuaciones lineales. El rango de una
matriz representa la cantidad de información que se mantiene en la matriz. Un rango más bajo significa
menos información y un rango más alto significa una gran cantidad de información. El rango se puede
definir como el número de filas o columnas independientes de una matriz. losnumpy.linalgEl subpaquete
proporciona el rango_matriz () función. losrango_matriz () La función toma la matriz como entrada y
devuelve el rango calculado de la matriz. Veamos un ejemplo delrango_matriz () función en el siguiente
bloque de código:

# importar bibliotecas requeridas


importar numpy como np
de numpy.linalg importar matrix_rank

[117]
Álgebra lineal Capítulo 4

# Crea una matriz


mat = np.array ([[5, 3, 1], [5, 3, 1], [1, 0, 5]])

# Calcular el rango de la matriz


print ("Matrix: \ n", mat) print ("Rango:",
matrix_rank (mat))

Esto da como resultado la siguiente salida:

Matriz:
[[5 3 1]
[5 3 1]
[1 0 5]]
Rango: 2

En el bloque de código anterior, el rango_matriz () funcion de numpy.linalg se utiliza para


generar el rango de la matriz. Veamos otro concepto importante del álgebra lineal: matriz
inversa.

Matriz inversa usando NumPy


Una matriz es una secuencia rectangular de números, expresiones y símbolos organizados en
filas y columnas. La multiplicación de una matriz cuadrada y su inversa es igual a la matriz
identidad I. Podemos escribirla usando la siguiente ecuación:

Automóvil club británico-1= Yo

los numpy.linalg El subpaquete proporciona una función para una operación inversa: el inv ()
función. Invirtamos una matriz usando elnumpy.linalg subpaquete. Primero, creamos una matriz
usando elestera() función y luego encontrar la inversa de la matriz usando la inv ()función, como
se ilustra en el siguiente bloque de código:

# Importar numpy
importar numpy como np

# Crear matriz usando NumPy


mat = np.mat ([[2,4], [5,7]]) print
("Matriz de entrada: \ n", mat)

# Encuentra matriz inversa


inverso = np.linalg.inv (mat) print
("Inverso: \ n", inverso)

[118]
Álgebra lineal Capítulo 4

Esto da como resultado la siguiente salida:

Matriz de entrada:
[[2 4]
[5 7]]
Inverso:
[[-1.16666667 0.66666667]
[0.83333333 -0.33333333]]

En el bloque de código anterior, hemos calculado la inversa de una matriz usando la inv ()
función de la numpy.linalg subpaquete.

Si la matriz de entrada dada no es una matriz cuadrada y una matriz singular,


generará un LinAlgError error. Si lo desea, puede probar elinv ()funcionar
manualmente. Dejaré esto como una actividad para ti.

Resolver ecuaciones lineales usando NumPy


Las operaciones matriciales pueden transformar un vector en otro vector. Estas operaciones nos ayudarán
a encontrar la solución para ecuaciones lineales. NumPy proporcionaresolver() función para resolver
ecuaciones lineales en la forma de Ax = B. Aquí, A es la matriz n * n, B es una matriz unidimensional y x es
el vector unidimensional desconocido. También usaremos elpunto() función para calcular el producto
escalar de dos matrices de números de punto flotante.

Resolvamos un ejemplo de ecuaciones lineales, como sigue:

1. Cree la matriz A y la matriz B para una ecuación dada, como esta:

x1 + x2 = 200
3x1 + 2x2 = 450

Esto se ilustra en el siguiente bloque de código

# Cree la matriz A y el Vector B usando NumPy


A = np.mat ([[1,1], [3,2]]) print
("Matriz A: \ n", A)

B = np.array ([200,450]) print


("Vector B:", B)

[119]
Álgebra lineal Capítulo 4

Esto da como resultado la siguiente salida:

Matriz A:
[[1 1]
[3 2]]
Vector B: [200 450]

En el bloque de código anterior, hemos creado una matriz de 2 * 2 y un vector.

2. Resuelve una ecuación lineal usando el resolver() función, así:

# Resolver ecuaciones lineales


solution = np.linalg.solve (A, B) print ("Vector de
solución x:", solución)

Esto da como resultado la siguiente salida:

Vector de solución x: [50. 150.]

En el bloque de código anterior, hemos resuelto una ecuación lineal usando el


resolver()función de la numpy.linalg subpaquete.

3. Verifique la solución usando el punto() función, así:

# Comprueba la solución
print ("Resultado:", np.dot (A, solución))

Esto da como resultado la siguiente salida:

Resultado: [[200. 450.]]

En el bloque de código anterior, hemos evaluado la solución usando el punto() función. Puede ver el
producto escalar de A y la solución es equivalente a B. Hasta ahora, hemos visto el determinante, el
rango, el inverso y cómo resolver ecuaciones lineales. Pasemos a SVD para la descomposición
matricial.

Descomposición de una matriz usando SVD


La descomposición de la matriz es el proceso de dividir una matriz en partes. También se conoce
como factorización matricial. Hay muchos métodos de descomposición de matrices disponibles,
comoinferior superior (LU) descomposición, QR descomposición (donde Q es ortogonal y R es
triangular superior), descomposición de Cholesky y SVD.

[120]
Álgebra lineal Capítulo 4

El autoanálisis descompone una matriz en vectores y valores. SVD descompone una matriz en las siguientes
partes: vectores singulares y valores singulares. SVD se usa ampliamente en procesamiento de señales, visión
por computadora,procesamiento natural del lenguaje (PNL) y aprendizaje automático, por ejemplo, sistemas
de recomendación y modelado de temas en los que la SVD es ampliamente aceptada e implementada en
soluciones comerciales de la vida real. Eche un vistazo a lo siguiente:

Aquí, A es un metro X norte matriz singular izquierda, Σ es una nxn matriz diagonal, V es un mxn matriz
singular derecha, y VT es la transposición de la V. numpy.linalg subpaquete ofrece elsvd () función para
descomponer una matriz. Veamos un ejemplo de SVD, de la siguiente manera:

# importar bibliotecas requeridas


importar numpy como np
de scipy.linalg importar svd

# Crea una matriz


mat = np.array ([[5, 3, 1], [5, 3, 0], [1, 0, 5]])

# Realice la descomposición de la matriz usando SVD


U, Sigma, V_transpose = svd (tapete)

print ("Matriz Singular Izquierda:", U) print ("Matriz


Diagonal:", Sigma) print ("Matriz Singular Derecha:",
V_transpose)

Esto da como resultado la siguiente salida:

Matriz singular izquierda: [[-0.70097269 -0.06420281 -0.7102924]


[-0.6748668 - 0,26235919 0.68972636]
[-0.23063411 0,9628321 0.14057828]]

Matriz diagonal: [8.42757145 4.89599358 0.07270729]

Matriz singular derecha: [[-0.84363943 -0.48976369 -0.2200092]


[-0,13684207 -0,20009952 0,97017237] [0,51917893
-0,84858218 -0,10179157]]

En el bloque de código anterior, hemos descompuesto la matriz dada en tres partes: Izquierda
Matriz singular, Matriz diagonal, y Matriz singular derecha utilizando el svd ()
función de la scipy.linalg subpaquete.

[121]
Álgebra lineal Capítulo 4

Autovectores y autovalores usando NumPy


Los vectores propios y los valores propios son las herramientas necesarias para comprender el mapeo
lineal y la transformación. Los valores propios son soluciones de la ecuación Ax = λx. Aquí, A es la matriz
cuadrada, x es el vector propio y λ son los valores propios. losnumpy.linalg El subpaquete proporciona dos
funciones, eig () y eigvals (). los eig () La función devuelve una tupla de autovalores y autovectores, y eigvals
() devuelve los valores propios.

Los autovectores y autovalores son los fundamentos centrales del álgebra lineal. Los autovectores y
autovalores se utilizan en SVD, agrupamiento espectral y PCA.

Calculemos los autovectores y autovalores de una matriz, como sigue:

Crea la matriz usando NumPy estera() función, así:

# Importar numpy
importar numpy como np

# Crear matriz usando NumPy


mat = np.mat ([[2,4], [5,7]]) print
("Matriz: \ n", mat)

Esto da como resultado la siguiente salida:

Matriz: [[2 4]
[5 7]]

Calcule autovectores y autovalores usando el eig () función, así:

# Calcular los autovalores y autovectores


autovalores, autovectores = np.linalg.eig (mat) print
("Autovalores:", autovalores)
print ("Autovectores:", autovectores)

Esto da como resultado la siguiente salida:

Valores propios: [-0,62347538 9,62347538]

Vectores propios: [[-0.83619408 -0.46462222]


[0.54843365 -0.885509]]

[122]
Álgebra lineal Capítulo 4

En los dos bloques anteriores, hemos creado una matriz 2 * 2 y hemos calculado los
autovectores y los autovalores usando el eig () función de la numpy.linalgsubpaquete.

Calcule los valores propios usando el eigvals () función, así:

# Calcular valores propios


autovalores = np.linalg.eigvals (mat) print
("Autovalores:", autovalores)

Esto da como resultado la siguiente salida:

Valores propios: [-0,62347538 9,62347538]

En el fragmento de código anterior, hemos calculado los valores propios utilizando el eigvals ()
función de la numpy.linalg subpaquete. Después de realizar la descomposición propia, veremos
cómo generar números aleatorios y una matriz.

Generando números aleatorios


Los números aleatorios ofrecen una variedad de aplicaciones como simulación Monte Carlo, criptografía,
inicialización de contraseñas y procesos estocásticos. No es fácil generar números aleatorios reales, por lo
que, en realidad, la mayoría de las aplicaciones utilizan números pseudoaleatorios. Los pseudo números son
adecuados para la mayoría de los propósitos, excepto en algunos casos raros. Se pueden generar números
aleatorios a partir de datos discretos y continuos. losnumpy.random ()La función generará una matriz de
números aleatorios para el tamaño de entrada dado de la matriz.

El generador de números aleatorios central se basa en el Mersenne Twister


algoritmo (consulte https: / / en. wikipedia. org / wiki / Mersenne_ twister).

Veamos un ejemplo de generación de números aleatorios, como sigue:

# Importar numpy
importar numpy como np

# Crea una matriz con valores aleatorios


random_mat = np.random.random ((3,3)) print
("Matriz aleatoria: \ n", random_mat)

Esto da como resultado la siguiente salida:

Matriz aleatoria: [[0.90613234 0.83146869 0.90874706]

[123]
Álgebra lineal Capítulo 4

[0.59459996 0.46961249 0.61380679]


[0.89453322 0.93890312 0.56903598]]

En el ejemplo anterior, hemos generado una matriz aleatoria de 3 * 3 usando el


numpy.random.random () función. Probemos otras distribuciones para la generación de
números aleatorios, como distribuciones binomiales y normales.

Distribución binomial
La distribución binomial modela el número de ensayos repetidos con la misma probabilidad en
cada ensayo. Aquí, cada ensayo es independiente y tiene dos resultados posibles, éxito y fracaso,
que pueden ocurrir en cada cliente. La siguiente fórmula representa la distribución binomial:

Aquí, pyq son las probabilidades de éxito y fracaso, n es el número de intentos y X es el


número del resultado deseado.

los numpy.random el subpaquete proporciona un binomio() función que genera muestras


basadas en la distribución binomial para ciertos parámetros, número de ensayos y
probabilidad de éxito.

Consideremos una casa de juego del siglo XVII en la que se puede apostar a lanzar ocho piezas y lanzar
nueve monedas. Si obtienes cinco o más caras, entonces ganas; de lo contrario, perderás. Escribamos el
código para esta simulación para 1000 monedas usando elbinomio() función, de la siguiente manera:

# Importar bibliotecas requeridas


importar numpy como np
importar matplotlib.pyplot como plt

# Cree un vector numpy de tamaño 5000 con valor 0


saldo_efectivo = np.zeros (5000)

saldo_de_caja [0] = 500

# Genera números aleatorios usando Binomial


samples = np.random.binomial (9, 0.5, size = len (cash_balance))

# Actualizar el saldo de caja


para i en el rango (1, len (cash_balance)):

[124]
Álgebra lineal Capítulo 4

si las muestras [i] <5:


saldo_de_cabro [i] = saldo_de_caja [i - 1] - 1 más:

saldo_de_caja [i] = saldo_de_caja [i - 1] + 1

# Trace el saldo de caja actualizado


plt.plot (np.arange (len (saldo_de_efectivo)), saldo_de_caja) plt.show ()

Esto da como resultado la siguiente salida:

En el bloque de código anterior, primero creamos el saldo en efectivo matriz de tamaño 500 con valores
cero y actualizamos el primer valor con 500. Luego, generamos valores entre 0 y 9 usando el binomio()
función. Después de esto, actualizamos elsaldo en efectivo matriz basada en los resultados de los
lanzamientos de monedas y trazó el saldo de efectivo utilizando la biblioteca Matplotlib.

En cada ejecución, el código generará diferentes resultados o recorridos aleatorios. Si desea que la
caminata sea constante, debe usar el valor de semilla en elbinomio() función. Probemos otra forma
de distribución para el generador de números aleatorios: distribución normal.

[125]
Álgebra lineal Capítulo 4

Distribución normal
Las distribuciones normales ocurren con frecuencia en escenarios de la vida real. Una distribución
normal también se conoce como curva de campana debido a su forma característica. La función de
densidad de probabilidad modela la distribución continua. losnumpy.random El subpaquete ofrece
muchas distribuciones continuas como beta, gamma, logística, exponencial, multivariante normal y
distribución normal. losnormal() las funciones encuentran muestras de distribución gaussiana o normal.

Escribamos código para visualizar la distribución normal usando el normal() función, de la siguiente
manera:

# Importar biblioteca requerida


importar numpy como np
importar matplotlib.pyplot como plt

tamaño_muestra = 225000

# Genere una muestra de valores aleatorios usando una distribución normal


muestra = np.random.normal (tamaño = tamaño_muestra)

# Crear histograma
n, bins, patch_list = plt.hist (sample, int (np.sqrt (sample_size)), densidad = True)

# Establecer parámetros
mu, sigma = 0,1

x = contenedores

y = 1 / (sigma * np.sqrt (2 * np.pi)) * np.exp (- (bins - mu) ** 2 / (2 * sigma ** 2))

# Trazar línea gráfica (o curva de campana)


plt.plot (x, y, color = 'rojo', lw = 2)
plt.show ()

[126]
Álgebra lineal Capítulo 4

Esto da como resultado la siguiente salida:

Aquí, hemos generado valores aleatorios usando el normal() función de la numpy. aleatoriosubpaquete y
muestra los valores utilizando un histograma y un diagrama de línea o curva de campana o teórico
función de densidad de probabilidad (PDF) con media 0 y desviación estándar de 1.

Probando la normalidad de los datos usando SciPy


Una distribución normal se usa comúnmente a gran escala en operaciones científicas y estadísticas. Según el
teorema del límite central, a medida que aumenta el tamaño de la muestra, la distribución de la muestra se
aproxima a una distribución normal. La distribución normal es bien conocida y fácil de usar. En la mayoría de los
casos, se recomienda confirmar la normalidad de los datos, especialmente en los métodos paramétricos,
asumiendo que los datos tienen una distribución gaussiana. Hay muchas pruebas de normalidad que existen en
la literatura, como la prueba de Shapiro-Wilk, la prueba de Anderson-Darling y la prueba de D'Agostino-Pearson.
losscipy.stats El paquete ofrece la mayoría de las pruebas de normalidad.

En esta sección, aprenderemos cómo aplicar pruebas de normalidad en datos. Estamos usando tres muestras
de datos aleatorios de tamaño pequeño, mediano y grande. Generemos las muestras de datos para las tres
muestras usando elnormal() función, de la siguiente manera:

# Importar biblioteca requerida


importar numpy como np

# crear muestras pequeñas, medianas y grandes para la prueba de normalidad

[127]
Álgebra lineal Capítulo 4

small_sample = np.random.normal (loc = 100, scale = 60, size = 15)


medium_sample = np.random.normal (loc = 100, scale = 60, size = 100)
large_sample = np.random.normal (loc = 100, escala = 60, tamaño = 1000)

Ahora exploraremos varias técnicas para verificar la normalidad de los datos:

1. Usando un histograma: Un histograma es el método más fácil y rápido para verificar la


normalidad de los datos. Divide los datos en contenedores y cuenta la observación en cada
contenedor. Finalmente, visualiza los datos. Aquí estamos usandodistplot () desde el marinero
biblioteca para trazar el histograma y la estimación de la densidad del kernel. Veamos un
ejemplo de histograma para una pequeña muestra, como sigue:

# Histograma para pequeño


importar seaborn como sns
importar matplotlib.pyplot como plt

# Crear diagrama de distribución


sns.distplot (muestra_pequeña)

sns.distplot (muestra_pequeña)

plt.show ()

Esto da como resultado la siguiente salida:

[128]
Álgebra lineal Capítulo 4

Veamos un ejemplo del histograma para una muestra media, como sigue:

# Histograma para medio


importar seaborn como sns
importar matplotlib.pyplot como plt

# Crear diagrama de distribución


sns.distplot (muestra_media)

plt.show ()

Esto da como resultado la siguiente salida:

Veamos un ejemplo del histograma para una muestra grande, como sigue:

# Histograma para grandes


importar seaborn como sns
importar matplotlib.pyplot como plt

# Crear diagrama de distribución


sns.distplot (muestra_grande)

plt.show ()

[129]
Álgebra lineal Capítulo 4

Esto da como resultado la siguiente salida:

En las tres gráficas anteriores, podemos observar que a medida que aumenta el tamaño de la muestra, la curva se
convierte en una curva normal. Los histogramas pueden ser una buena herramienta para probar la normalidad de los
datos.

2. Prueba de Shapiro-Wilk: Esta prueba se utiliza para evaluar la normalidad de los datos. En
Python, elshapiro () función de la scipy.stats El subpaquete se puede utilizar para evaluar la
normalidad. losshapiro () La función devolverá tuplas de dos valores: estadísticas de prueba y
valor p. Veamos el siguiente ejemplo:

# Importar función shapiro


de scipy.stats importar shapiro

# Aplicar la prueba de Shapiro-Wilk


print ("Prueba de Shapiro-Wilk para muestras pequeñas:", shapiro (small_sample)) print
("Prueba de Shapiro-Wilk para muestras medianas:"
", shapiro (muestra_media))
print ("Prueba de Shapiro-Wilk para muestras grandes:", shapiro (large_sample))

[130]
Álgebra lineal Capítulo 4

Esto da como resultado la siguiente salida:

Prueba de Shapiro-Wilk para muestras pequeñas: (0.9081739783287048,


0.2686822712421417)
Prueba de Shapiro-Wilk para muestra media: (0,9661878347396851,
0,011379175819456577)
Prueba de Shapiro-Wilk para muestras grandes: (0.9991633892059326,
0.9433153867721558)

En el bloque de código anterior, puede ver que los conjuntos de datos pequeños y grandes tienen valores
p mayores que 0.05, por lo que como la hipótesis nula no la rechazó, esto significa que la muestra parece
una distribución Gaussiana o normal; mientras que para el conjunto de datos medio, el valor p es menor
que 0.05, por lo que la hipótesis nula lo ha rechazado, lo que significa que la muestra no parece una
distribución Gaussiana o normal.

De manera similar, podemos probar la prueba de Anderson-Darling y la prueba de D'Agostino-Pearson


para la normalidad usando el Anderson () y normaltest () funciones de la scipy.statssubpaquete. Te dejo
esto como una actividad. En visualización, también podemos probar el diagrama de caja ycuantil-cuantil
(QQ) trazar técnicas para evaluar la normalidad de los datos. Aprenderemos la técnica del diagrama de
caja en el próximo capítulo,Capítulo 5, Visualización de datos. Pasemos al concepto de matriz
enmascarada.

Creando una matriz enmascarada usando el


subpaquete numpy.ma
En la mayoría de las situaciones, los datos de la vida real son ruidosos y confusos. Contiene muchos espacios o
caracteres faltantes en los datos. Las matrices enmascaradas son útiles en tales casos y resuelven el problema. Las
matrices enmascaradas pueden contener valores no válidos y faltantes. losnumpy.ma El subpaquete ofrece toda la
funcionalidad requerida por la matriz enmascarada. En esta sección del capítulo, usaremos la imagen de la cara como
fuente de imagen original y realizaremos operaciones de máscara de registro.

Eche un vistazo al siguiente bloque de código:

# Importar biblioteca requerida


importar numpy como np
de scipy.misc import face import
matplotlib.pyplot como plt

face_image = face ()
mask_random_array = np.random.randint (0, 3, size = face_image.shape)

fig, ax = plt.subplots (nrows = 2, ncols = 2)

[131]
Álgebra lineal Capítulo 4

# Mostrar la imagen original


plt. subparcela (2,2,1)
plt.imshow (face_image)
plt.title ("Imagen original") plt.axis
('desactivado')

# Mostrar matriz enmascarada


masked_array = np.ma.array (face_image, mask = mask_random_array) plt.subplot
(2,2,2)
plt.title ("Matriz enmascarada")
plt.imshow (Matriz_masked)
plt.axis ('off')

# Operación de registro en imagen original


plt. subparcela (2,2,3)
plt.title ("Registrar operación en original") plt.imshow (np.ma.log
(face_image) .astype ('uint8')) plt.axis ('off')

# Operación de registro en matriz enmascarada


plt. subparcela (2,2,4)
plt.title ("Registrar operación en enmascarado") plt.imshow
(np.ma.log (matriz_masked) .astype ('uint8')) plt.axis ('off')

# Mostrar las subtramas


plt.show ()

Esto da como resultado la siguiente salida:

[132]
Álgebra lineal Capítulo 4

En el bloque de código anterior, primero cargamos la imagen de la cara desde el scipy.miscsubpaquete y creó
una máscara aleatoria utilizando el randint () función. Luego, aplicamos la máscara aleatoria en la imagen de la
cara. Después de esto, aplicamos la operación de registro en la imagen de la cara original y la imagen de la cara
enmascarada. Finalmente, mostramos todas las imágenes en 2 * 2 subtramas. También puede probar una serie
de operaciones de máscara en la imagen desde elnumpy.ma subpaquete. Aquí, solo nos enfocamos en la
operación de registro de la matriz enmascarada. Se trata de conceptos básicos de álgebra lineal. Es hora de
pasar a los conceptos de visualización de datos en el próximo capítulo.

Resumen
Finalmente, podemos concluir que materias matemáticas como el álgebra lineal son la columna vertebral de
todos los algoritmos de aprendizaje automático. A lo largo del capítulo, nos hemos centrado en conceptos
esenciales de álgebra lineal para mejorarlo como profesional de datos. En este capítulo, aprendió mucho sobre
conceptos de álgebra lineal usando los subpaquetes NumPy y SciPy. Nuestro enfoque principal fue en
polinomios, determinante, matriz inversa; resolver ecuaciones lineales; Valores propios y vectores propios; SVD;
números al azar; distribuciones binomiales y normales; pruebas de normalidad; y matrices enmascaradas.

El próximo capítulo, Capítulo 5, Visualización de datos, trata sobre el tema importante de visualizar datos con
Python. La visualización es algo que hacemos a menudo cuando comenzamos a analizar datos. Ayuda a
mostrar relaciones entre variables en los datos. Al visualizar los datos, también podemos hacernos una
idea de sus propiedades estadísticas.

[133]
Sección 2: Análisis de datos
-
exploratorios y limpieza de datos
El principal objetivo de esta sección es desarrollar Análisis exploratorio de datos (EDA) y habilidades de
limpieza de datos para el alumno. Estas habilidades comprenden visualización de datos, extracción de datos y
preprocesamiento. Esta sección utilizará principalmente matplotlib, seaborn, Bokeh, pandas, scikitlearn, NumPy
y SciPy. También se centra en el procesamiento de señales y el análisis de series de tiempo.

Esta sección incluye los siguientes capítulos:

Capítulo 5, Visualización de datosCapítulo 6, Recuperar,

procesar y almacenar datosCapítulo 7, Limpieza de datos


desordenadosCapítulo 8, Procesamiento de señales y series de
tiempo
Visualización de datos
-
La visualización de datos es el paso inicial en el sistema de análisis de datos hacia la comprensión y
comunicación de información fácilmente. Representa información y datos en forma gráfica utilizando
elementos visuales como tablas, gráficos, diagramas y mapas. Ayuda a los analistas a comprender
patrones, tendencias, valores atípicos, distribuciones y relaciones. La visualización de datos es una forma
eficaz de gestionar una gran cantidad de conjuntos de datos.

Python ofrece varias bibliotecas para la visualización de datos, como Matplotlib, Seaborn y Bokeh. En este
capítulo, primero nos centraremos en Matplotlib, que es la biblioteca básica de Python para la
visualización. Después de Matplotlib, exploraremos Seaborn, que usa Matplotlib y ofrece gráficos
estadísticos avanzados y de alto nivel. Al final, trabajaremos en la visualización interactiva de datos
utilizando Bokeh. También exploraremospandas Graficado. La siguiente es una lista de temas que se
tratarán en este capítulo:

Visualización usando Matplotlib


Visualización avanzada con el paquete Seaborn
Visualización interactiva con Bokeh

Requerimientos técnicos
Este capítulo tiene los siguientes requisitos técnicos:

Puede encontrar el código y los conjuntos de datos en el siguiente enlace de GitHub: https: / /
github. com / PacktPublishing / Python- Data- Analysis- Third- Edition / tree / master /
Chapter05.
Todos los bloques de código están disponibles en el ch5.ipynb expediente. Este capítulo utiliza solo
un archivo CSV (HR_comma_sep.csv) con fines de práctica.
En este capítulo, usaremos Matplotlib, pandas Bibliotecas Seaborn y Bokeh
Python.
Visualización de datos Capítulo 5

Visualización usando Matplotlib


Como sabemos, una imagen vale más que mil palabras. Los humanos comprenden mejor las cosas
visuales. La visualización ayuda a presentar cosas a cualquier tipo de audiencia y puede explicar
fácilmente un fenómeno complejo en términos sencillos. Python ofrece un par de bibliotecas de
visualización, como Matplotlib, Seaborn y Bokeh.

Matplotlib es el módulo de Python más popular para la visualización de datos. Es una biblioteca base para
la mayoría de los módulos de visualización avanzados de Python, como Seaborn. Ofrece funciones
integradas flexibles y fáciles de usar para crear figuras y gráficos.

En Anaconda, Matplotlib ya está instalado. Si aún encuentra un error, puede instalarlo de las
siguientes maneras.

Podemos instalar Matplotlib con pepita como sigue:

pip instalar matplotlib

Para Python 3, podemos usar el siguiente comando:

pip3 instalar matplotlib

También puede simplemente instalar Matplotlib desde su terminal o símbolo del sistema usando el
siguiente comando:

conda instalar matplotlib

Para crear una trama muy básica en Matplotlib, necesitamos invocar el trama() función en
elmatplotlib.pyplot subpaquete. Esta función produce un gráfico bidimensional para una
sola lista o varias listas de puntos con conocidosX y y coordenadas.

El siguiente código de demostración está en el ch5.ipynb archivo en el paquete de código de este libro, que
puede encontrar en el siguiente enlace de GitHub: https: / / github. com / PacktPublishing /
Python-Data- Analysis- Third- Edition / blob / master / Chapter05 / Ch5. ipynb.

Veamos un pequeño código de demostración para visualizar el diagrama de líneas:

# Agrega la biblioteca esencial matplotlib


importar matplotlib.pyplot como plt
importar numpy como np

# crea los datos


a = np.linspace (0, 20)

# Dibuja la trama
plt.plot (a, a + 0.5, label = 'lineal')

[136]
Visualización de datos Capítulo 5

# Mostrar el gráfico
plt.show ()

Esto da como resultado la siguiente salida:

En el bloque de código anterior, primero estamos importando los módulos Matplotlib y NumPy.
Después de esto, estamos creando los datos usando elespacio de línea () función de NumPy y
graficando estos datos usando el trama() función de Matplotlib. Finalmente, estamos mostrando la
figura usando elshow() función.

Hay dos componentes básicos de una gráfica: la figura y los ejes. La figura es un recipiente en el
que se dibuja todo. Contiene componentes como gráficos, subparcelas, ejes, títulos y una leyenda.
En la siguiente sección, nos centraremos en estos componentes, que actúan como accesorios para
gráficos.

Accesorios para cartas


En el matplotlib módulo, podemos agregar títulos y etiquetas de ejes a un gráfico. Podemos agregar un título
utilizando plt.title () y etiquetas usando plt.xlabel () y plt.ylabel ().

[137]
Visualización de datos Capítulo 5

Múltiples gráficos significan múltiples objetos, como líneas, barras y dispersión. Los puntos de diferentes series
se pueden mostrar en un solo gráfico. Las leyendas o series de gráficos reflejan lay eje. Una leyenda es un cuadro
que aparece en el lado derecho o izquierdo de un gráfico y muestra lo que representa cada elemento del gráfico.
Veamos un ejemplo donde vemos cómo usar estos accesorios en nuestras tablas:

# Agregue las bibliotecas requeridas


importar matplotlib.pyplot como plt

# Crea los datos


x = [1,3,5,7,9,11]
y = [10,25,35,33,41,59]

# Tracemos los datos


plt.plot (x, y, label = 'Serie-1', color = 'azul')

# Crea los datos


x = [2,4,6,8,10,12]
y = [15,29,32,33,38,55]

# Trazar los datos


plt.plot (x, y, label = 'Serie-2', color = 'rojo')

# Agregar etiqueta X en el eje X


plt.xlabel ("etiqueta X")

# Agregar etiqueta X en el eje X


plt.ylabel ("etiqueta Y")

# Agregue el título al gráfico


plt.title ("Gráfico de líneas de Python múltiple")

# Agregar leyenda al gráfico


plt.legend ()

# Mostrar la trama
plt.show ()

[138]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el gráfico anterior, se muestran dos líneas en un solo gráfico. Hemos utilizado dos parámetros
adicionales:etiqueta y color - en el trama() función. losetiqueta parámetro define el nombre de la serie
y color define el color del gráfico de líneas. En las próximas secciones, nos centraremos en
diferentes tipos de parcelas. Exploraremos un diagrama de dispersión en la siguiente sección.

Gráfico de dispersión
Los diagramas de dispersión dibujan puntos de datos utilizando coordenadas cartesianas para mostrar los valores de
los valores numéricos. También representan la relación entre dos valores numéricos. Podemos crear un diagrama de
dispersión en Matplotlib usando eldispersión() función, de la siguiente manera:

# Agrega la biblioteca esencial matplotlib


importar matplotlib.pyplot como plt

# crea los datos


x = [1,3,5,7,9,11]
y = [10,25,35,33,41,59]

# Dibuja el gráfico de dispersión


plt.scatter (x, y, c = 'azul', marcador = '*', alfa = 0.5)

# Agregue la etiqueta en el eje X


plt.xlabel ("etiqueta X")

[139]
Visualización de datos Capítulo 5

# Agregue la etiqueta en el eje X


plt.ylabel ("etiqueta Y")

# Agrega el título al gráfico


plt.title ("Ejemplo de gráfico de dispersión")

# Mostrar el gráfico
plt.show ()

Esto da como resultado la siguiente salida:

En el diagrama de dispersión anterior, el dispersión() La función toma valores del eje xy del eje y. En nuestro
ejemplo, estamos trazando dos listas:X y y. También podemos utilizar parámetros opcionales como Cpor el color,
alfa para la transparencia de los marcadores, que oscilan entre 0 y 1, y marcadorpara la forma de los puntos en
el diagrama de dispersión, como *, o, o cualquier otro símbolo. En la siguiente sección, nos centraremos en la
gráfica lineal.

Gráfico de línea
Un gráfico de líneas es un gráfico que muestra una línea entre dos variables. Tiene una secuencia de puntos de
datos unidos por un segmento:

# Agrega la biblioteca esencial matplotlib


importar matplotlib.pyplot como plt

[140]
Visualización de datos Capítulo 5

# crea los datos


x = [1,3,5,7,9,11]
y = [10,25,35,33,41,59]

# Dibuja el gráfico de líneas


plt.plot (x, y)

# Agregue la etiqueta en el eje X


plt.xlabel ("etiqueta X")

# Agregue la etiqueta en el eje X


plt.ylabel ("etiqueta Y")

# Agregue el título al gráfico


plt.title ("Ejemplo de gráfico de líneas")

# Mostrar el gráfico
plt.show ()

Esto da como resultado la siguiente salida:

En el programa de trazado de líneas anterior, el trama() La función toma valores del eje xy del eje y. En la
siguiente sección, aprenderemos a trazar un gráfico circular.

[141]
Visualización de datos Capítulo 5

Gráfico circular

Un gráfico circular es un gráfico circular que se divide en piezas en forma de cuña. Cada
pieza es proporcional al valor que representa. El valor total del pastel es 100 por ciento:

# Agrega la biblioteca esencial matplotlib


importar matplotlib.pyplot como plt

# crea los datos


materias = ["Matemáticas", "Ciencias", "Habilidades de comunicación", "Aplicación
informática"]
puntuaciones = [85,62,57,92]

# Trazar el gráfico circular


plt.pie (partituras,
etiquetas = sujetos,
colores = ['r', 'g', 'b', 'y'], ángulo de
inicio = 90,
sombra = Verdadero,
explotar = (0,0.1,0,0),
autopct = '% 1.1f %%')

# Agregar título al gráfico


plt.title ("Rendimiento del estudiante")

# Dibuja el gráfico
plt.show ()

Esto da como resultado la siguiente salida:

[142]
Visualización de datos Capítulo 5

En el código anterior del gráfico circular, especificamos valores, etiquetas, colores, ángulo de sobresalto, sombra,
explosión, y autopct. En nuestro ejemplo, valores son las puntuaciones del alumno en cuatro materias y etiquetas
es la lista de nombres de materias. También podemos especificar la lista de colores para las puntuaciones de las
materias individuales. losángulo inicial parámetro especifica el primer valor del ángulo, que es de 90 grados; esto
significa que la primera línea es vertical.

Opcionalmente, también podemos utilizar el sombra parámetro para especificar la sombra del sector circular y el
explotar parámetro para extraer una lista de sectores del valor binario. Si queremos sacar una segunda porción
de pastel, entonces una tupla de valores sería (0, 0.1, 0, 0). Pasemos ahora al gráfico de barras.

Gráfico de barras

Un diagrama de barras es una herramienta visual para comparar los valores de varios grupos. Se puede
dibujar horizontal o verticalmente. Podemos crear un gráfico de barras usando elbar() función:

# Agrega la biblioteca esencial matplotlib


importar matplotlib.pyplot como plt

# crea los datos


movie_ratings = [1,2,3,4,5] rating_counts =
[21,45,72,89,42]

# Trazar los datos


plt.bar (movie_ratings, rating_counts, color = 'azul')

# Agregar etiqueta X en el eje X


plt.xlabel ("Clasificaciones de películas")

# Agregar etiqueta X en el eje X


plt.ylabel ("Frecuencia de clasificación")

# Agregar un título al gráfico


plt.title ("Distribución de clasificación de películas")

# Muestra la trama
plt.show ()

[143]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el programa de gráfico de barras anterior, el bar() la función toma X-valores del eje, y-valores del eje y un
color. En nuestro ejemplo, estamos trazando clasificaciones de películas y su frecuencia. Las clasificaciones de
películas están en elX eje y la frecuencia nominal está en el y eje. También podemos especificar el color de las
barras en el gráfico de barras usando elcolor parámetro. Veamos otra variante del diagrama de barras en la
siguiente subsección.

Gráfico de histograma
Un histograma muestra la distribución de una variable numérica. Creamos un histograma usando elhist ()
método. Muestra la distribución de probabilidad de una variable continua. Un histograma solo funciona con una
sola variable, mientras que un gráfico de barras funciona con dos variables:

# Agrega la biblioteca esencial


importar matplotlib.pyplot como plt

# Crea los datos


employee_age = [21,28,32,34,35,35,37,42,47,55]

# Crear contenedores para histograma


contenedores = [20,30,40,50,60]

# Trazar el histograma

[144]
Visualización de datos Capítulo 5

plt.hist (employee_age, bins, rwidth = 0.6)

# Agregar etiqueta X en el eje X


plt.xlabel ("Edad del empleado")

# Agregar etiqueta X en el eje X


plt.ylabel ("Frecuencia")

# Agregar título al gráfico


plt.title ("Distribución de edad de los empleados")

# Muestra la trama
plt.show ()

Esto da como resultado la siguiente salida:

En el histograma anterior, el hist () la función toma valores, contenedores, y rwidth. En nuestro ejemplo, graficamos la
edad del empleado y usamos un contenedor de 10 años. Estamos comenzando nuestro contenedor de 20 a 60 con un
tamaño de contenedor de 10 años. Estamos usando un ancho de barra relativo de 0.6, pero puede elegir cualquier
tamaño para un ancho más grueso o más delgado. Ahora es el momento de saltar al gráfico de burbujas, que puede
manejar múltiples variables en un gráfico bidimensional.

[145]
Visualización de datos Capítulo 5

Gráfico de burbujas
Un diagrama de burbujas es un tipo de diagrama de dispersión. No solo dibuja puntos de datos utilizando coordenadas
cartesianas, sino que también crea burbujas en los puntos de datos. Bubble muestra la tercera dimensión de una
trama. Muestra tres valores numéricos: dos valores están en elX y y ejes y el tercero es el tamaño de los puntos de
datos (o burbujas):

# Importar los módulos requeridos


importar matplotlib.pyplot como plt
importar numpy como np

# Establecer el tamaño de la figura


plt.figure (figsize = (8,5))

# Crea los datos


paises =
['Qatar', 'Luxemburgo', 'Singapur', 'Brunei', 'Irlanda', 'Noruega', 'Emiratos Árabes Unidos', 'Kuwait']

poblaciones = [2781682,
604245,5757499,428963,4818690,5337962,9630959,4137312]
gdp_per_capita = [130475, 106705, 100345, 79530, 78785, 74356,69382, 67000]

# escale el ingreso per cápita del PIB para disparar las burbujas en el gráfico
scaled_gdp_per_capita = np.divide (gdp_per_capita, 80)

colores = np.random.rand (8)

# Dibuja el diagrama de dispersión


plt.scatter (países, poblaciones, s = scaled_gdp_per_capita, c = colors, cmap = "Blues",
edgecolors = "gray", alpha = 0.5)

# Agregar etiqueta X en el eje X


plt.xlabel ("Países")

# Agregar etiqueta Y en el eje X


plt.ylabel ("Población")

# Agregar título al gráfico


plt.title ("Gráfico de burbujas")

# rotar x etiqueta para una visualización clara


plt.xticks (rotación = 45)

# Muestra la trama
plt.show ()

[146]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el gráfico anterior, se crea un gráfico de burbujas utilizando la función de dispersión. Aquí lo


importante es els (tamaño) parámetro de la función de dispersión. Asignamos una tercera variable,
scaled_gdp_per_capita, al Talla parámetros. En el gráfico de burbujas anterior, los países están en elX eje,
la población está en el y eje, y el PIB per cápita se muestra por el tamaño del punto de dispersión o
burbuja. También asignamos un color aleatorio a las burbujas para hacerlas atractivas y más
comprensibles. Por el tamaño de la burbuja, puede ver fácilmente que Qatar tiene el PIB per cápita más
alto y Kuwait tiene el PIB per cápita más bajo. En todas las secciones anteriores, nos hemos centrado en la
mayoría de los gráficos y gráficos de Matplotlib. Ahora, veremos cómo podemos trazar los gráficos
usando elpandas módulo.

[147]
Visualización de datos Capítulo 5

pandas tramando
los pandas la biblioteca ofrece la trama() método como envoltorio de la biblioteca Matplotlib. lostrama() El
método nos permite crear parcelas directamente en pandas DataFrames. El seguimientotrama() Los
parámetros del método se utilizan para crear los gráficos:

amable: Un parámetro de cadena para el tipo de gráfico, como línea, barra, barra, hist, cuadro,
KDE, circular, área o dispersión.
figsize: Esto define el tamaño de una figura en una tupla de (ancho, alto).
título: Esto define el título del gráfico.red: Parámetro booleano para la
línea de cuadrícula del eje.leyenda: Esto define la leyenda.xticks: Esto
define la secuencia de tics del eje x.yticks: Esto define la secuencia de tics
del eje y.

Creemos un diagrama de dispersión usando el parcela de pandas () función:

# Importar los módulos requeridos


importar pandas como pd
importar matplotlib.pyplot como plt

# Creemos un marco de datos


df = pd.DataFrame ({
'nombre': ['Ajay', 'Malala', 'Abhijeet', 'Yming', 'Desilva', 'Lisa'], 'edad':
[22,72,25,19,42,38],
'género': ['M', 'F', 'M', 'M', 'M', 'F'],
'país': ['India', 'Pakistán', 'Bangladesh', 'China', 'Srilanka', 'Reino Unido'],
'ingresos': [2500,3800,3300,2100,4500,5500]
})

# Crea un diagrama de dispersión


df.plot (tipo = 'dispersión', x = 'edad', y = 'ingresos', color = 'rojo', título = 'Edad Vs Ingresos')

# Mostrar figura
plt.show ()

[148]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En la trama anterior, el trama() la función toma tipo, x, y, color, y título valores. En nuestro
ejemplo, estamos trazando el diagrama de dispersión entre edad e ingresos usando el
amableparámetro como 'dispersión'. los la edad y ingreso las columnas se asignan a la X y y
parámetros. El color del punto de dispersión y el título del gráfico se asignan alcolor ytítulo
parámetros:

importar matplotlib.pyplot como plt


importar pandas como pd

# Crear diagrama de barras


df.plot (kind = 'bar', x = 'name', y = 'age', color = 'blue')

# Mostrar figura
plt.show ()

[149]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En la trama anterior, el trama() la función toma tipo, x, y, color, y título valores. En nuestro ejemplo,
estamos trazando la gráfica de barras entre la edad y los ingresos usando elamableparámetro
como 'bar'. los nombre y la edad las columnas se asignan a la X y y parámetros. El color del punto
de dispersin se asigna alcolor parámetro. Esto se trata depandasGraficado. Ahora, a partir de la
siguiente sección, veremos cómo visualizar los datos usando la biblioteca Seaborn.

Visualización avanzada usando el paquete


Seaborn
La visualización puede ser útil para comprender fácilmente patrones y conceptos complejos. Representa
las percepciones en formato pictórico. En las secciones anteriores, hemos aprendido sobre Matplotlib
para visualización. Ahora, exploraremos la nueva biblioteca de Seaborn para gráficos estadísticos
avanzados y de alto nivel. Seaborn es una biblioteca de Python de código abierto para una visualización
estadística atractiva e interactiva de alto nivel. Seaborn utiliza Matplotlib como biblioteca base y ofrece
visualizaciones más simples, fáciles de entender, interactivas y atractivas.

[150]
Visualización de datos Capítulo 5

En el paquete de software Anaconda, puede instalar la biblioteca Seaborn de la siguiente manera:

Instale Seaborn con pepita:

pip instalar seaborn

Para Python 3, use el siguiente comando:

pip3 instalar seaborn

Simplemente puede instalar Seaborn desde su terminal o símbolo del sistema usando lo
siguiente:

conda instalar seaborn

Si lo está instalando en el Jupyter Notebook, debe colocar el! firmar antes delpepita
mando. Aquí hay un ejemplo:

! pip instalar seaborn

Saltemos al lm parcela de Seaborn.

lm parcelas
los lm plot traza la dispersión y ajusta el modelo de regresión en ella. Un diagrama de dispersión es la
mejor manera de comprender la relación entre dos variables. Su visualización de salida es una distribución
conjunta de dos variables.lmplot () toma dos nombres de columna - X y y - como una cadena y variable
DataFrame. Veamos el siguiente ejemplo:

# Importar las bibliotecas requeridas


importar pandas como pd
importar seaborn como sns
importar matplotlib.pyplot como plt

# Crear DataFrame
df = pd.DataFrame ({'x': [1,3,5,7,9,11], 'y': [10,25,35,33,41,59]})

# Crear lmplot
sns.lmplot (x = 'x', y = 'y', datos = df)

# Mostrar figura
plt.show ()

[151]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

Por defecto, lmplot () se ajusta a la línea de regresión. También podemos eliminar esto
configurando elfit_reg parámetro como Falso:

# Crear lmplot
sns.lmplot (x = 'x', y = 'y', data = df, fit_reg = False)

# Mostrar figura
plt.show ()

[152]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

Tomemos un conjunto de datos de HR Analytics e intentemos trazar lmplot ():

# Cargar el conjunto de datos


df = pd.read_csv ("HR_comma_sep.csv")

# Crear lmplot
sns.lmplot (x = 'nivel_de_saatisfacción', y = 'última_evaluación', datos = gl, ajuste_reg =
Falso, tono = 'izquierda')

# Mostrar figura
plt.show ()

[153]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el ejemplo anterior, last_evaluation es el desempeño evaluado del empleado,


nivel_de_saatisfacción es el nivel de satisfacción del empleado en la empresa, yizquierda significa si
el empleado dejó la empresa o no. nivel_de_saatisfacción ylast_evaluation fueron dibujados en el X y
y ejes, respectivamente. La tercera variable a la izquierda se pasa en elmatiz parámetro. losmatiz La
propiedad se utiliza para el tono de color. Estamos pasando unizquierda variable como matiz.
Podemos ver claramente en el diagrama que los empleados que se han ido están distribuidos en
tres grupos. Pasemos ahora a los diagramas de barras.

Parcelas de barras

gráfico de barras () ofrece la relación entre una variable categórica y una continua. Utiliza barras
rectangulares con longitudes variables:

# Importar las bibliotecas requeridas


importar pandas como pd
importar seaborn como sns
importar matplotlib.pyplot como plt

[154]
Visualización de datos Capítulo 5

# Crear DataFrame
df = pd.DataFrame ({'x': ['P', 'Q', 'R', 'S', 'T', 'U'], 'y': [10,25,35,33, 41,59]})

# Crear lmplot
sns.barplot (x = 'x', y = 'y', datos = df)

# Mostrar figura
plt.show ()

Esto da como resultado la siguiente salida:

En el ejemplo anterior, el diagrama de barras se crea utilizando el bar() función. Se necesitan dos columnas:
X y y - y un DataFrame como entrada. En la siguiente sección, veremos cómo trazar una gráfica de
distribución.

Parcelas de distribución
Esto traza una distribución univariante de variables. Es una combinación de un histograma con el tamaño del
contenedor predeterminado y unEstimación de la densidad del kernel (KDE) trama. En nuestro ejemplo,distplot
()tomará el nivel_de_saatisfacción columna de entrada y trazar la distribución de la misma. Aquí, la distribución
denivel_de_saatisfacción tiene dos picos:

# Cree una gráfica de distribución (también conocida como histograma)


sns.distplot (df.satisfaction_level)

# Mostrar figura
plt.show ()

[155]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el bloque de código anterior, hemos creado la gráfica de distribución usando distplot (). Es
hora de pasar al diagrama de caja.

Diagramas de caja

El diagrama de caja, también conocido como diagrama de caja-bigotes, es uno de los mejores diagramas para
comprender la distribución de cada variable con sus cuartiles. Puede ser horizontal o vertical. Muestra distribución
de cuartiles en una caja, que se conoce como bigote. También muestra el mínimo, el máximo y los valores atípicos
en los datos. Podemos crear fácilmente un diagrama de caja usando Seaborn:

# Crear diagrama de caja


sns.boxplot (data = df [['nivel_de_saatisfacción', 'última_evaluación']])

# Mostrar figura
plt.show ()

[156]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el ejemplo anterior, hemos utilizado dos variables para el diagrama de caja. Aquí, el diagrama
de caja indica que el rango denivel_de_saatisfacción es más alto que last_evaluation(rendimiento).
Pasemos a la trama de KDE en Seaborn.

Gráficos de KDE
los kde () La función traza la estimación de la densidad de probabilidad de una variable continua
dada. Es un estimador de tipo no paramétrico. En nuestro ejemplo, elkde () la función toma un
parámetro, nivel_de_saatisfacción, y traza el KDE:

# Crear gráfico de densidad


sns.kdeplot (df.satisfaction_level)

# Mostrar figura
plt.show ()

[157]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el bloque de código anterior, hemos creado una gráfica de densidad usando kdeplot (). En la siguiente sección,
veremos otro diagrama de distribución, que es una combinación de un diagrama de caja y de densidad, conocido
como diagrama de violín.

Tramas de violín
Los diagramas de violín son una forma combinada de diagramas de caja y KDE, que ofrecen un análisis fácil
de entender de la distribución:

# Crear trama de violín


sns.violinplot (data = df [['nivel_de_saatisfacción', 'última_evaluación']])

# Mostrar figura
plt.show ()

[158]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el ejemplo anterior, hemos utilizado dos variables para la trama del violín. Aquí, podemos concluir que
el rango denivel_de_saatisfacción es más alto que last_evaluation(rendimiento) y ambas variables tienen
dos picos en la distribución. Después de trabajar en las parcelas de distribución, veremos cómo podemos
combinar lasagrupar por operación y diagrama de caja en un solo diagrama usando un diagrama de
recuento.

Contar parcelas
countplot () es un tipo especial de diagrama de barras. Muestra la frecuencia de cada variable categórica. También se
conoce como histograma para variables categóricas. Hace que las operaciones sean muy simples en comparación con
Matplotlib. En Matplotlib, para crear un gráfico de recuento, primero debemos agrupar por la columna de categoría y
contar la frecuencia de cada clase. Después de eso, este recuento es consumido por el gráfico de barras de Matplotlib.
Pero el gráfico de recuento de Seaborn ofrece una sola línea de código para trazar la distribución:

# Crear gráfico de recuento (también conocido como histograma)


sns.countplot (x = 'salario', data = df)

# Mostrar figura
plt.show ()

[159]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el ejemplo anterior, contamos el salario variable. loscontar() La función toma una sola columna y
DataFrame. Entonces, podemos concluir fácilmente del gráfico que la mayoría de los empleados
tienen salarios bajos y medios. También podemos usarmatiz como segunda variable. Veamos el
siguiente ejemplo:

# Crear gráfico de recuento (también conocido como histograma)


sns.countplot (x = 'salario', data = df, hue = 'left')

# Mostrar figura
plt.show ()

[160]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el ejemplo anterior, podemos ver que izquierda se utiliza como tono o tono de color. Esto
indica que la mayoría de los empleados con el salario más bajo abandonaron la empresa.
Veamos otra gráfica importante para visualizar la relación y distribución de dos variables.

Parcelas conjuntas
La trama conjunta es una visualización de varios paneles; muestra la relación bivariada y la distribución
de variables individuales en un solo gráfico. También podemos trazar un KDE usando elamable
parámetro de jointplot (). Al establecer el amable parámetro como "kde ", podemos dibujar el diagrama
de KDE. Veamos el siguiente ejemplo:

# Cree un diagrama conjunto usando la estimación de densidad de kernel (kde)


sns.jointplot (x = 'nivel_de_saatisfacción', y = 'última_evaluación', data = df, kind = "kde")

# Mostrar figura
plt.show ()

[161]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En la gráfica anterior, hemos creado la gráfica conjunta usando jointplot () y también agregó el kde
trazar usando un amable parámetro como "kde ". Pasemos a mapas de calor para una visualización más
diversa.

Mapas de calor
Heatmap ofrece una representación de cuadrícula bidimensional. La celda individual de la cuadrícula
contiene un valor de la matriz. La función de mapa de calor también ofrece anotaciones en cada celda:

# Importar biblioteca requerida


importar seaborn como sns

# Leer datos de iris usando la función load_dataset ()


data = sns.load_dataset ("iris")

# Encuentra correlación

[162]
Visualización de datos Capítulo 5

cor_matrix = data.corr ()

# Crear mapa de calor


sns.heatmap (cor_matrix, annot = True)

# Mostrar figura
plt.show ()

Esto da como resultado la siguiente salida:

En el ejemplo anterior, el conjunto de datos Iris se carga usando load_dataset () y la correlación se calcula
utilizando el corr () función. loscorr () La función devuelve la matriz de correlación. Esta matriz de
correlación se traza utilizando elmapa de calor() función para la vista de cuadrícula de la matriz de
correlación. Toma dos parámetros: la matriz de correlación yannot. los anotar el parámetro se pasa como
Verdadero. En la gráfica, podemos ver una matriz simétrica, y todos los valores en la diagonal son unos, lo
que indica una correlación perfecta de una variable consigo misma. También podemos establecer un
nuevo mapa de color usando elcmap parámetro para diferentes colores:

# Crear mapa de calor


sns.heatmap (cor_matrix, annot = True, cmap = "YlGnBu")

# Mostrar figura
plt.show ()

[163]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el mapa de calor anterior, hemos cambiado el mapa de color usando el cmap parámetro para
diferentes colores. Aquí, estamos usando elYlGnBu (amarillo, verde y azul) paracmap. Ahora,
pasaremos a la gráfica de pares para un análisis exploratorio más rápido.

Par parcelas
Seaborn ofrece un análisis de datos exploratorio rápido con relaciones y distribución individual utilizando un diagrama de pares.
Un diagrama de pares ofrece una distribución única mediante un histograma y una distribución conjunta mediante un diagrama
de dispersión:

# Cargar datos de iris usando la función load_dataset ()


data = sns.load_dataset ("iris")

# Crear una parcela


sns.pairplot (datos)

# Mostrar figura
plt.show ()

[164]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el ejemplo anterior, el conjunto de datos Iris se carga usando load_dataset () y ese conjunto de datos
se pasa al parplot () función. En la trama, crea unnorte por norte matriz o una cuadrícula de gráficos. La
diagonal muestra la distribución de las columnas y los elementos no diagonales de la cuadrícula
muestran el diagrama de dispersión para comprender la relación entre todas las variables.

[165]
Visualización de datos Capítulo 5

En las secciones anteriores, hemos visto cómo utilizar los gráficos de Seaborn. Ahora, saltaremos a
otra biblioteca de visualización importante, que es Bokeh. En las próximas secciones, dibujaremos
gráficos interactivos y versátiles utilizando la biblioteca Bokeh.

Visualización interactiva con Bokeh


Bokeh es una biblioteca de visualización interactiva, de alta calidad, versátil, enfocada y más poderosa para datos
de transmisión y de gran volumen. Ofrece gráficos, diagramas, diseños y paneles interactivos y enriquecidos para
los navegadores web modernos. Su salida se puede asignar a un cuaderno, HTML o servidor.

Tanto las bibliotecas Matplotlib como Bokeh tienen intenciones diferentes. Matplotlib se enfoca en la
visualización estática, simple y rápida, mientras que Bokeh se enfoca en una visualización altamente
interactiva, dinámica, basada en la web y de calidad. Matplotlib se usa generalmente para publicar imágenes,
mientras que Bokeh es para una audiencia web. En las secciones restantes de este capítulo, aprenderemos el
trazado básico con Bokeh. Podemos crear imágenes más interactivas para la exploración de datos usando
Bokeh.

La forma más sencilla de instalar la biblioteca Bokeh es con el paquete de distribución de Anaconda. Para
instalar Bokeh, use el siguiente comando:

conda instalar bokeh

También podemos instalarlo usando pepita. Para instalar Bokeh usando pepita, use el siguiente comando:

pip instalar bokeh

Trazar un gráfico simple


Tracemos una primera y sencilla trama usando Bokeh. Primero, necesitamos importar el básicobokeh.plotting módulo.
losoutput_notebook () La función define que la trama se representará en el Jupyter Notebook. losfigura El objeto se
utiliza como uno de los objetos principales para dibujar tablas y gráficos. losfigura El objeto se centra en el título, el
tamaño, la etiqueta, las cuadrículas y el estilo de la trama. losfigura El objeto también se ocupa del estilo de la trama, el
título, las etiquetas de los ejes, los ejes, las cuadrículas y varios métodos para agregar datos:

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show

# Crea los datos

[166]
Visualización de datos Capítulo 5

x = [1,3,5,7,9,11]
y = [10,25,35,33,41,59]

# Salida a cuaderno
output_notebook ()

# Instancia de una figura


fig = figure (plot_width = 500, plot_height = 350)

# Cree un diagrama de marcador de círculo de dispersión al representar los círculos


fig.circle (x, y, size = 10, color = "red", alpha = 0.7)

# Muestra la trama
mostrar (fig)

Esto da como resultado la siguiente salida:

[167]
Visualización de datos Capítulo 5

Después de configurar el figura objeto, crearemos un diagrama de marcadores de círculo de dispersión utilizando
una función de círculo. loscirculo() la función tomará X y y valores. También toma parámetros de tamaño, color y
alfa. losshow() La función finalmente trazará la salida una vez que se agreguen todas las características y datos al
gráfico.

Glifos
Bokeh usa un glifo visual, que se refiere a los círculos, líneas, triángulos, cuadrados, barras, diamantes
y otros gráficos de formas. El glifo es un símbolo único que se utiliza para transmitir información en
forma pictórica. Creemos un diagrama de línea usando ellínea() función:

# Importar los módulos requeridos


de bokeh.plotting import figure, output_notebook, show

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show

# Crea los datos


x_values = [1,3,5,7,9,11] y_values =
[10,25,35,33,41,59]

# Salida a cuaderno
output_notebook ()

# Instancia de una figura


p = figura (plot_width = 500, plot_height = 350)

# crear un diagrama de línea


p.line (valores_x, valores_y, ancho_línea = 1, color = "azul")

# Muestra la trama
mostrar (p)

[168]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el ejemplo anterior, el línea() la función toma el X- y y-valores del eje. También se necesitaancho
de línea y color valores de la línea. En la siguiente sección, nos centraremos en los diseños para
múltiples parcelas.

Diseños
Bokeh ofrece diseños para organizar gráficos y widgets. Los diseños organizan más de un gráfico en un solo
panel para visualizaciones interactivas. También permiten configurar los modos de tamaño para cambiar el
tamaño de los gráficos y los widgets según el tamaño del panel. El diseño puede ser de los siguientes tipos:

Disposición de filas: Organiza todas las parcelas en una fila o en forma horizontal.Diseño de
columna: Organiza todas las parcelas en columna o en vertical.Diseño anidado: Esta es una
combinación de diseños de filas y columnas.Diseño de cuadrícula: Esto le ofrece una cuadrícula
de matrices para organizar los gráficos en formato.

[169]
Visualización de datos Capítulo 5

Veamos un ejemplo de diseño de fila:

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting importar output_notebook, mostrar desde
bokeh.layouts importar fila, columna

# Importar conjunto de datos de flores de iris como pandas DataFrame


de bokeh.sampledata.iris importar flores como df

# Salida a cuaderno
output_notebook ()

# Instancia de una figura


fig1 = figure (plot_width = 300, plot_height = 300) fig2 = figure
(plot_width = 300, plot_height = 300) fig3 = figure (plot_width = 300,
plot_height = 300)

# Crea un diagrama de marcador de dispersión renderizando los círculos


fig1.circle (df ['petal_length'], df ['sepal_length'], size = 8, color = "green", alpha = 0.5)

fig2.circle (df ['petal_length'], df ['sepal_width'], tamaño = 8, color = "azul", alfa = 0.5)

fig3.circle (df ['petal_length'], df ['petal_width'], tamaño = 8, color = "rojo", alfa = 0.5)

# Crear diseño de fila


row_layout = fila (figura 1, figura 2, figura 3)

# Muestra la trama
mostrar (row_layout)

[170]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En este diagrama de diseño, hemos importado los diseños de filas y columnas, hemos cargado los datos de Iris
de los datos de muestra de Bokeh y hemos creado una instancia de los tres figura objetos con ancho y alto de
parcela, creó los tres marcadores de círculo de dispersión en cada objeto de figura y creó el diseño de fila. Este
diseño de fila tomará elfigura objetos como entrada y se dibuja utilizando el show()función. También podemos
crear un diseño de columna creando un diseño de columna en lugar de un diseño de fila, como se muestra:

# Crear diseño de columna


col_layout = columna (fig1, fig2, fig3)

# Muestra la trama
mostrar (col_layout)

[171]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

[172]
Visualización de datos Capítulo 5

En el gráfico anterior, hemos creado el diseño de columnas de tres gráficos. Pasemos a los diseños
anidados para obtener visualizaciones más potentes.

Diseño anidado usando diseños de filas y columnas


Un diseño anidado es la combinación de varios diseños de filas y columnas. Veamos el
ejemplo que se da aquí para una mejor comprensión práctica:

# Importar los módulos requeridos


de bokeh.plotting import figure, output_notebook, show

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show
desde bokeh.layouts importar fila, columna

# Importar conjunto de datos de flores de iris como pandas DataFrame


de bokeh.sampledata.iris importar flores como df

# Salida a cuaderno
output_notebook ()

# Instancia de una figura


fig1 = figure (plot_width = 300, plot_height = 300) fig2 = figure
(plot_width = 300, plot_height = 300) fig3 = figure (plot_width = 300,
plot_height = 300)

# Crea un diagrama de marcador de dispersión renderizando los círculos


fig1.circle (df ['petal_length'], df ['sepal_length'], size = 8, color = "green", alpha = 0.5)

fig2.circle (df ['petal_length'], df ['sepal_width'], tamaño = 8, color = "azul", alfa = 0.5)

fig3.circle (df ['petal_length'], df ['petal_width'], tamaño = 8, color = "rojo", alfa = 0.5)

# Crear diseño anidado


nasted_layout = fila (figura 1, columna (figura 2, figura 3))

# Muestra la trama
mostrar (nasted_layout)

[173]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

Aquí, puede ver que el diseño de la fila tiene dos filas. En el primero,Figura 1 se asigna y la segunda fila tiene el
diseño de columna de Figura 2 y Fig. 3. Entonces, este diseño se convierte en un diseño de 2 * 2, en el que la
primera columna tiene solo un componente y la segunda columna tiene dos componentes.

[174]
Visualización de datos Capítulo 5

Varias parcelas
También se pueden crear múltiples gráficos y objetos usando un diseño de cuadrícula. Un diseño de cuadrícula organiza los
gráficos y los objetos del widget en forma de matriz de filas y columnas. Toma una lista de objetos de figura para cada fila.
También podemos usarNinguno como marcador de posición:

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show
desde bokeh.layouts import gridplot

# Importar conjunto de datos de flores de iris como pandas DataFrame


de bokeh.sampledata.iris importar flores como df

# Salida a cuaderno
output_notebook ()

# Instancia de una figura


fig1 = figure (plot_width = 300, plot_height = 300) fig2 = figure
(plot_width = 300, plot_height = 300) fig3 = figure (plot_width = 300,
plot_height = 300)

# Crea un diagrama de marcador de dispersión renderizando los círculos


fig1.circle (df ['petal_length'], df ['sepal_length'], size = 8, color = "green", alpha = 0.5)

fig2.circle (df ['petal_length'], df ['sepal_width'], tamaño = 8, color = "azul", alfa = 0.5)

fig3.circle (df ['petal_length'], df ['petal_width'], tamaño = 8, color = "rojo", alfa = 0.5)

# Crea un diseño de cuadrícula


grid_layout = gridplot ([[fig1, fig2], [None, fig3]])

# Muestra la trama
mostrar (grid_layout)

[175]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

El diseño anterior es similar al diseño anidado. Aquí hemos importadogrillaplot ().Organiza los componentes en
filas y columnas. El gráfico de cuadrícula ha tomado una lista de figuras de filas. Los primeros elementos de la
lista sonFigura 1 y Figura 2. Los segundos elementos son Ninguno y Fig. 3.Cada elemento es una fila en la matriz
de la cuadrícula. losNinguno El marcador de posición se utiliza para dejar la celda vacía o sin componentes.

[176]
Visualización de datos Capítulo 5

Los modos de dimensionamiento pueden ayudarnos a configurar figuras con opciones de cambio de tamaño. Bokeh ofrece los
siguientes modos de tamaño:

reparado: Esto conserva el mismo ancho y alto originales.


stretch_width: Esto se extiende al ancho disponible según el tipo del otro
componente. No mantiene la relación de aspecto.
stretch_height: Esto se extiende a la altura disponible según el tipo del otro
componente. No mantiene la relación de aspecto.
estirar_ambos: Esto estira tanto el ancho como el alto según el tipo del otro
componente sin mantener la relación de aspecto original.
ancho_escala: Esto se extiende al ancho disponible según el tipo del otro
componente mientras se mantiene la relación de aspecto original.
altura_escala: Esto se extiende a la altura disponible según el tipo del otro
componente mientras se mantiene la relación de aspecto original.
scale_both: Esto estira tanto el ancho como el alto según el tipo del otro
componente mientras se mantiene la relación de aspecto original.

Después de aprender sobre diseños y gráficos múltiples, es hora de aprender sobre interacciones para
visualizaciones interactivas.

Interacciones
Bokeh ofrece leyendas interactivas para gráficos procesables en tiempo de ejecución. Las leyendas se pueden
ocultar o silenciar haciendo clic en los gráficos de glifos. Podemos activar estos modos activando elclick_policy
propiedad y haciendo clic en la entrada de la leyenda.

Ocultar política de clics


La política de Ocultar clic oculta los glifos deseables al hacer clic en la entrada de la leyenda. Veamos un ejemplo de
una política para ocultar clics:

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show
desde bokeh.models importar CategoricalColorMapper

# Importar conjunto de datos de flores de iris como pandas DataFrame


de bokeh.sampledata.iris importar flores como df

[177]
Visualización de datos Capítulo 5

# Salida a cuaderno
output_notebook ()

# Crea una instancia de un objeto de figura


fig = figure (plot_width = 500, plot_height = 350, title = "Longitud del pétalo Vs. Ancho del pétalo",

x_axis_label = 'petal_length', y_axis_label = 'petal_width')

# Crea un diagrama de marcador de dispersión renderizando los círculos


para especie, color en zip (['setosa', 'virginica', 'versicolor'], ['azul', 'verde', 'rojo']):

data = df [df.species == specie]


fig.circle ('petal_length', 'petal_width', size = 8, color = color, alpha = 0.7, legend_label = specie,
source = data)

# Establezca la ubicación de la leyenda y haga clic en la política


fig.legend.location = 'top_left'
fig.legend.click_policy = "ocultar"

# Muestra la trama
mostrar (fig)

Esto da como resultado la siguiente salida:

[178]
Visualización de datos Capítulo 5

Aquí, podemos establecer la política de clics con el legend.click_policy parámetro de la figuraobjeto.


Además, necesitamos ejecutar unpor bucle de cada tipo de glifo o elemento de leyenda en el que hace clic.
En nuestro ejemplo, estamos ejecutando unpor bucle para tipos de especies y colores. Al hacer clic en
cualquier especie de la leyenda, filtrará los datos y ocultará ese glifo.

Política de silenciar clics


La política de silenciar clic silencia el glifo haciendo clic en una entrada de leyenda. Aquí, el siguiente código
muestra el glifo deseable con una intensidad alta y glifos poco interesantes usando una intensidad más baja
en lugar de ocultar todo el glifo. Veamos un ejemplo de una política de clics mudos:

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show
desde bokeh.models importar CategoricalColorMapper

# Importar conjunto de datos de flores de iris como pandas DataFrame


de bokeh.sampledata.iris importar flores como df

# Salida a cuaderno
output_notebook ()

# Crea una instancia de un objeto de figura


fig = figure (plot_width = 500, plot_height = 350, title = "Longitud del pétalo Vs. Ancho del pétalo",

x_axis_label = 'petal_length', y_axis_label = 'petal_width')

# Crea un diagrama de marcador de dispersión renderizando los círculos


para especie, color en zip (['setosa', 'virginica', 'versicolor'], ['azul', 'verde', 'rojo']):

data = df [df.species == specie]


fig.circle ('petal_length', 'petal_width', size = 8, color = color, alpha = 0.7, legend_label = specie,
source = data,
muted_color = color, muted_alpha = 0.2)

# Establezca la ubicación de la leyenda y haga clic en la política


fig.legend.location = 'top_left'
fig.legend.click_policy = "mudo"

# Muestra la trama
mostrar (fig)

[179]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

Aquí, podemos establecer la política de clic mudo con el legend.click_policy parámetro para silenciar objetos
de figura. Además, necesitamos ejecutar elpor bucle de cada tipo de glifo o elemento de leyenda en el que
hace clic. En nuestro ejemplo, estamos ejecutando unpor bucle para tipos de especies y colores. Al hacer
clic en cualquier especie de la leyenda, filtrará los datos y ocultará ese glifo. Además de eso, necesitamos
agregar unmuted_color y muted_alpha parámetro al marcador de círculo de dispersión.

Anotaciones
Bokeh ofrece varias anotaciones para obtener información complementaria para las visualizaciones.
Ayuda al espectador agregando la siguiente información:

Títulos: Esta anotación proporciona un nombre a la trama.


Etiquetas de eje: Esta anotación proporciona etiquetas al eje. Nos ayuda a comprender
lo queX y y los ejes representan.

[180]
Visualización de datos Capítulo 5

Leyendas: Esta anotación representa la tercera variable a través del color o la forma y nos ayuda a
vincular características para facilitar la interpretación.
Barras de color: Las barras de color se crean usando ColorMapper con la paleta de colores.

Veamos un ejemplo de anotación:

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show
desde bokeh.models importar CategoricalColorMapper

# Importar conjunto de datos de flores de iris como pandas DataFrame


de bokeh.sampledata.iris importar flores como df

# Salida a cuaderno
output_notebook ()

# Crear mapeador de colores para columna categórica


color_mapper = CategoricalColorMapper (factores = ['setosa', 'virginica', 'versicolor'], paleta =
['azul', 'verde', 'rojo'])

color_dict = {'campo': 'especie', 'transformar': color_mapper}

# Crea una instancia de un objeto de figura


p = figura (plot_width = 500, plot_height = 350, title = "Longitud del pétalo Vs. Ancho del pétalo",

x_axis_label = 'petal_length', y_axis_label = 'petal_width')

# Crea un diagrama de marcador de dispersión renderizando los círculos


p.circle ('petal_length', 'petal_width', size = 8, color = color_dict, alpha = 0.5, legend_group =
'especie', fuente = df)

# Establecer la ubicación de la leyenda


p.legend.location = 'top_left'

# Muestra la trama
mostrar (p)

[181]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el ejemplo anterior, CategoricalColorMapper se importa y los objetos se crean definiendo factores


o elementos únicos en las especies de iris y sus respectivos colores. Se crea un diccionario de colores
definiendo elcampo y transformar parámetros para el mapeador. Necesitamos definir el título de la
figura;x_axis_label y y_axis_label se definieron dentro de lafigura objeto. La leyenda se define en la
función de marcador de dispersión circular con la columna de especies y su ubicación se define
utilizando el atributo de ubicación delfigura objeto con
arriba a la izquierda.

[182]
Visualización de datos Capítulo 5

Herramienta de desplazamiento

La herramienta de desplazamiento muestra la información relacionada siempre que el puntero del mouse se coloca
sobre un área en particular. Veamos ejemplos para comprender las gráficas flotantes:

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show
desde bokeh.models importar CategoricalColorMapper desde
bokeh.models importar HoverTool

# Importar conjunto de datos de flores de iris como pandas DataFrame


de bokeh.sampledata.iris importar flores como df

# Salida a cuaderno
output_notebook ()

# Crear mapeador de colores para columna categórica


mapper = CategoricalColorMapper (factores = ['setosa', 'virginica', 'versicolor'],

paleta = ['azul', 'verde', 'rojo'])

color_dict = {'campo': 'especie', 'transformar': mapeador}

# Crear hovertool y especificar la información flotante


hover = HoverTool (tooltips = [('Tipo de especie', '@ especie'),
('Longitud de pétalo de IRIS', '@ longitud de pétalo'),
('Ancho de pétalo de IRIS', '@ancho de pétalo')])

# Crea una instancia de un objeto de figura


p = figura (plot_width = 500, plot_height = 350, title = "Longitud del pétalo Vs. Ancho del pétalo",

x_axis_label = 'petal_length', y_axis_label = 'petal_width', tools = [hover,


'pan', 'wheel_zoom'])

# Crea un diagrama de marcador de dispersión renderizando los círculos


p.circle ('petal_length', 'petal_width', size = 8, color = color_dict, alpha = 0.5, legend_group =
'especie', fuente = df)

# Establecer la ubicación de la leyenda


p.legend.location = 'top_left'

# Muestra la trama
mostrar (p)

[183]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el ejemplo anterior, hemos importado HoverTool de bokeh.modelos y creó su objeto


definiendo la información que se mostrará al pasar el mouse. En nuestro ejemplo, hemos
definido información en la lista de tuplas. Cada tupla tiene dos argumentos. El primero es para
la etiqueta de la cadena y el segundo es para el valor real (precedido por @). Este objeto
flotante se pasa alfigura objetos instrumentos parámetro.

Widgets
Los widgets ofrecen interacción en tiempo real en la interfaz. Los widgets tienen la capacidad de modificar
y actualizar gráficos en tiempo de ejecución. Pueden ejecutar un servidor Bokeh o una aplicación HTML
independiente. Para usar widgets, debe especificar la funcionalidad. Se puede anidar dentro del diseño.
Hay dos enfoques para agregar la funcionalidad de los widgets al programa:

Devolución de llamada de CustomJS

Con el servidor Bokeh y el controlador de eventos de configuración, como al hacer clic o onchange
evento

[184]
Visualización de datos Capítulo 5

Panel de pestañas

Los paneles de pestañas nos permiten crear múltiples gráficos y diseños en una sola ventana. Veamos un ejemplo
de un panel de pestañas:

# Importar los módulos requeridos


de la figura de importación de bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show
de bokeh.models.widgets importar pestañas del
panel de importación de bokeh.models.widgets

# Importar conjunto de datos de flores de iris como pandas DataFrame


de bokeh.sampledata.iris importar flores como df

# Salida a cuaderno
output_notebook ()

# Instancia de una figura


fig1 = figura (plot_width = 300, plot_height = 300) fig2 = figure
(plot_width = 300, plot_height = 300)

# Crea un diagrama de marcador de dispersión renderizando los círculos


fig1.circle (df ['petal_length'], df ['sepal_length'], size = 8, color = "green", alpha = 0.5)

fig2.circle (df ['petal_length'], df ['sepal_width'], tamaño = 8, color = "azul", alfa = 0.5)

# Crear paneles
tab1 = Panel (child = fig1, title = 'tab1') tab2 = Panel
(child = fig2, title = 'tab2')

# Crear pestaña colocando paneles en ella


tab_layout = Pestañas (tabs = [tab1, tab2])

# Muestra la trama
mostrar (tab_layout)

[185]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el código anterior, hemos creado los dos paneles pasando figura objetos a un parámetro hijo y
título a un título parámetro a Panel. Ambos paneles se combinan en una lista y se pasan al Pestañas
objeto de diseño. EstaPestañas El objeto es mostrado por el show() función. Puede cambiar la
pestaña simplemente haciendo clic en ella.

Deslizador

Un control deslizante es una barra de seguimiento gráfica que controla el valor moviéndolo en una escala
horizontal. Podemos cambiar los valores del gráfico sin afectar su formato. Veamos un ejemplo de un control
deslizante:

# Importar los módulos requeridos


de la figura de importación bokeh.plotting
desde bokeh.plotting import output_notebook desde
bokeh.plotting import show
desde bokeh.models importar CustomJS
desde bokeh.models importar ColumnDataSource
desde bokeh.models import Slider
desde la columna de importación bokeh.layouts

# Mostrar salida en el cuaderno

[186]
Visualización de datos Capítulo 5

output_notebook ()

# Crear lista de datos


x = [x para x en el rango (0, 100)] y = x

# Crear un DataFrame
df = ColumnDataSource (datos = {"x_values": x, "y_values": y})

# Crea una instancia del objeto Figure


fig = Figura (plot_width = 350, plot_height = 350)

# Crea una gráfica de línea


fig.line ('x_values', 'y_values', source = df, line_width = 2.5, line_alpha = 0.8)

# Crea una devolución de llamada usando CustomJS


callback = CustomJS (args = dict (fuente = df), código = "" "
var data = source.data; var f =
cb_obj.value
var valores_x = datos ['valores_x'] var
valores_y = datos ['valores_y']
para (var i = 0; i <x_values.length; i ++) {
y_values [i] = Math.pow (x_values [i], f)
}
source.change.emit ();
"" ")

slider_widget = Slider (start = 0.0, end = 10, value = 1, step = .1, title = "Display power of x")

slider_widget.js_on_change ('valor', devolución de llamada)

# Crear diseño
slider_widget_layout = columna (figura, slider_widget)

# Mostrar el diseño
mostrar (slider_widget_layout)

[187]
Visualización de datos Capítulo 5

Esto da como resultado la siguiente salida:

En el código anterior, el Bokeh deslizador () la función toma inicio, fin, valor, paso, título, y devolución de llamada
CustomJS como entrada. En nuestro ejemplo, estamos creando un gráfico de líneas y cambiando suy variable
por el poder de la X variable usando la barra deslizante. Podemos crear el control deslizante pasandoinicio, fin,
valor, paso, título, y una devolución de llamada de CustomJS al Deslizadorobjeto. Necesitamos centrarnos en la
devolución de llamada de CustomJS. Toma el DataFrame de origen, obtiene el valor del control deslizante
usandocb_obj.value, y actualiza sus valores usando el change.emit ()función. Estamos actualizandoy_value en el
por bucle encontrando su potencia usando el valor del control deslizante.

[188]
Visualización de datos Capítulo 5

Resumen
En este capítulo, discutimos la visualización de datos mediante el trazado con Matplotlib, pandasSeaborn y Bokeh.
Cubrimos varios gráficos, como gráficos de líneas, gráficos circulares, gráficos de barras, histogramas, gráficos de
dispersión, gráficos de caja, gráficos de burbujas, mapas de calor, gráficos KDE, gráficos de violín, gráficos de recuento,
gráficos conjuntos y gráficos de pares. Nos enfocamos en accesorios para gráficos, como títulos, etiquetas, leyendas,
diseños, subtramas y anotaciones. Además, aprendimos acerca de la visualización interactiva utilizando diseños,
interacciones, herramientas flotantes y widgets de Bokeh.

El próximo capítulo, Capítulo 6, Recuperar, procesar y almacenar datos, nos enseñará habilidades de lectura
y escritura de datos de diversas fuentes, como archivos, objetos y bases de datos relacionales y NoSQL.
Aunque algunas personas no consideran estas habilidades para el análisis de datos, un analista de datos
independiente o asistente debe saber cómo pueden obtener datos de varios formatos de archivo y bases
de datos con fines de análisis.

[189]
Recuperación, procesamiento y
-
Almacenamiento de datos

Los datos se pueden encontrar en todas partes, en todas las formas y formas. Podemos obtenerlo de la web, sensores de
IoT, correos electrónicos, FTP y bases de datos. También podemos recopilarlo nosotros mismos en un experimento de
laboratorio, encuestas electorales, encuestas de marketing y encuestas sociales. Como profesional de datos, debe saber
cómo manejar una variedad de conjuntos de datos, ya que es una habilidad muy importante. Discutiremos la
recuperación, el procesamiento y el almacenamiento de varios tipos de datos en este capítulo. Este capítulo ofrece una
descripción general de cómo adquirir datos en varios formatos, como CSV, Excel, JSON, HDF5, Parquet ypepinillo.

A veces, necesitamos almacenar o guardar los datos antes o después del análisis de datos. También
aprenderemos cómo acceder a datos de relacionales yNoSQL (No solo SQL) bases de datos comosqlite3,
MySQL, MongoDB, Cassandra y Redis. En el mundo de la web del siglo XXI, las bases de datos NoSQL
están experimentando un crecimiento sustancial en big data y aplicaciones web. Proporcionan una base
de datos más flexible, rápida y sin esquemas. Las bases de datos NoSQL pueden almacenar datos en
varios formatos, como estilo de documento, orientado a columnas, objetos, gráficos, tuplas o una
combinación.

Los temas cubiertos en este capítulo se enumeran a continuación:

Lectura y escritura de archivos CSV con NumPy Lectura y


escritura de archivos CSV con pandas Lectura y escritura de
datos de Excel Lectura y escritura de datos de JSON Lectura
y escritura de datos de HDF5 Lectura y escritura de datos
de tablas HTML Lectura y escritura de datos de Parquet
Lectura y escritura de datos de a pandas encurtidos objeto
Acceso ligero con sqllite3Leer y escribir datos desde MySQL
Recuperar, procesar y almacenar datos Capítulo 6

Lectura y escritura de datos de MongoDB


Lectura y escritura de datos de Cassandra
Lectura y escritura de datos de Redis
PonyORM

Requerimientos técnicos
Este capítulo tiene los siguientes requisitos técnicos:

Puede encontrar el código y el conjunto de datos en el siguiente enlace de GitHub: https: / /


github. com / PacktPublishing / Python- Análisis de datos- Tercera edición / tree / master /
Chapter06.
Todos los bloques de código están disponibles en el ch6.ipynb expediente.

Este capítulo utiliza archivos CSV (demo.csv, product.csv, demo_sample_df.csv,


my_first_demo.csv, y employee.csv), Archivos de Excel (employee.xlsx,
employee_performance.xlsx, y new_employee_details.xlsx), Archivos JSON (
employee.json y employee_demo.json), un archivo HTML(país.html), a pepinillo
expediente (demo_obj.pkl), un archivo HDF5
(empleado.h5), y un archivo Parquet (empleado.parquet) con fines de práctica.
En este capítulo, usaremos el pandas, pickle, pyarrow, sqlite3, pymysql, conector
mysql, pymongo, cassandra-driver, y redis Bibliotecas de Python.

Leer y escribir archivos CSV con NumPy


En Capitulo 2, NumPy y pandas, analizamos la biblioteca NumPy en detalle y exploramos muchas
funcionalidades. NumPy también tiene funciones para leer y escribir archivos CSV y obtener resultados
en una matriz NumPy. losgenfromtxt () La función nos ayudará a leer los datos y la savetxt () La función
nos ayudará a escribir los datos en un archivo. losgenfromtxt ()La función es lenta en comparación con
otras funciones debido a su operación en dos etapas. En la primera etapa, lee los datos en un tipo de
cadena, y en la segunda etapa, convierte el tipo de cadena en tipos de datos adecuados.genfromtxt ()
tiene los siguientes parámetros:

fname: Cuerda; nombre de archivo o ruta del archivo.

delimitador: Cuerda; valor de cadena separado opcional. De forma predeterminada, toma


espacios en blanco consecutivos.
skip_header: Entero; opcional, número de líneas que desea omitir desde el inicio del
archivo.

[191]
Recuperar, procesar y almacenar datos Capítulo 6

Veamos un ejemplo de lectura y escritura de archivos CSV:

# función de importación genfromtxt


desde numpy import genfromtxt

# Leer archivo separado por comas


product_data = genfromtxt ('demo.csv', delimiter = ',')

# mostrar 5 registros iniciales


imprimir (product_data)

Esto da como resultado la siguiente salida:

[[14. 32. 33.]


[24. 45. 26.]
[27. 38. 39.]]

En el ejemplo de código anterior, estamos leyendo el demo.csv archivo usando el genfromtxt ()


método del módulo NumPy:

# import numpy
importar numpy como np

# Crea una matriz de muestra


sample_array = np.asarray ([[1,2,3], [4,5,6], [7,8,9]])

# Escribe una matriz de muestra en un archivo CSV


np.savetxt ("my_first_demo.csv", sample_array, delimiter = ",")

En el ejemplo de código anterior, estamos escribiendo el my_first_demo.csv archivo


usando elsavetxt () método del módulo NumPy.

Veamos cómo podemos leer archivos CSV usando el pandas módulo en la siguiente sección.

Leer y escribir archivos CSV con pandas


los pandas la biblioteca proporciona una variedad de opciones de lectura y escritura de archivos.
En esta sección, aprenderemos a leer y escribir archivos CSV. Para leer un archivo CSV, usaremos
elread_csv () método. Veamos un ejemplo:

# importar pandas
importar pandas como pd

# Leer archivo CSV


sample_df = pd.read_csv ('demo.csv', sep = ',', header = Ninguno)

[192]
Recuperar, procesar y almacenar datos Capítulo 6

# mostrar 5 registros iniciales


sample_df.head ()

Esto da como resultado la siguiente salida:

Ahora podemos guardar el marco de datos como un archivo CSV usando el siguiente código:

# Guardar DataFrame en archivo CSV


sample_df.to_csv ('demo_sample_df.csv')

En el código de muestra anterior, hemos leído y guardado el archivo CSV usando el read_csv ()y
to_csv (0) métodos de la pandas módulo.

los read_csv () El método tiene los siguientes argumentos importantes:

filepath_or_buffer: Proporciona una ruta de archivo o URL como una cadena para leer un archivo.

sep: Proporciona un separador en la cadena, por ejemplo, coma como ',' y punto y
coma como ';'. El separador predeterminado es una coma ','.
delim_whitespace: Argumento alternativo para un separador de espacios en blanco. Es una
variable booleana. El valor predeterminado paradelim_whitespace es Falso.
encabezamiento: Se utiliza para identificar los nombres de las columnas. El valor predeterminado es
inferir.
nombres: Puede pasar una lista de nombres de columna. El valor predeterminado paranombres es Ninguno.

En pandas un DataFrame también se puede exportar en un archivo CSV usando el to_csv () método. Los archivos CSV
son archivos de valores separados por comas. Este método puede ejecutarse con un solo argumento (nombre de
archivo como una cadena):

path_or_buf: La ruta del archivo o la ubicación donde se exportará el archivo.sep: Este es un delimitador que

se utiliza para los archivos de salida.encabezamiento: Para incluir nombres de columna o una lista de alias

de columna (valor predeterminado:


Cierto).
índice: Para escribir un índice en el archivo (valor predeterminado: Cierto).

[193]
Recuperar, procesar y almacenar datos Capítulo 6

Para obtener más parámetros y descripciones detalladas, visite https: / / pandas. pydata. org / pandas-
docs / stable / reference / api / pandas. DataFrame. to_ csv. html. Veamos como podemos leer
Archivos de Excel usando el pandas módulo en la siguiente sección.

Leer y escribir datos desde Excel


Los archivos de Excel son archivos muy utilizados en el ámbito empresarial. Los archivos de Excel se pueden
leer fácilmente en Pythonpandas utilizando el read_excel () función. losread_excel () La función toma una ruta de
archivo y sheet_name parámetros para leer los datos:

# Leer archivo de Excel


df = pd.read_excel ('empleado.xlsx', sheet_name = 'rendimiento')

# mostrar 5 registros iniciales


df.head ()

Esto da como resultado la siguiente salida:

Los objetos DataFrame se pueden escribir en hojas de Excel. Podemos usar elpara sobresalir() función para
exportar objetos DataFrame a una hoja de Excel. Sobre todo, elpara sobresalir() los argumentos de la función
son los mismos que to_csv () excepto por el sheet_name argumento:

df.to_excel ('desempeño_empleado.xlsx')

En el ejemplo de código anterior, hemos exportado un solo DataFrame a una hoja de Excel. También
podemos exportar múltiples DataFrames en un solo archivo con diferentes nombres de hoja. También
podemos escribir más de un DataFrame en un solo archivo de Excel (cada DataFrame en diferentes hojas)
usandoExcelWriter, como se muestra:

# Leer archivo de Excel


emp_df = pd.read_excel ('employee.xlsx', sheet_name = 'employee_details')

[194]
Recuperar, procesar y almacenar datos Capítulo 6

# escribir múltiples marcos de datos en un solo archivo de Excel


con pd.ExcelWriter ('new_employee_details.xlsx') como escritor:
emp_df.to_excel (escritor, sheet_name = 'employee')
df.to_excel (writer, sheet_name = 'perfromance')

En el ejemplo de código anterior, hemos escrito varios DataFrames en un solo archivo de Excel.
Aquí, cada DataFrame almacena en una hoja diferente usando elExcelWriter función. Veamos cómo
podemos leer los archivos JSON usando elpandas módulo en la siguiente sección.

Leer y escribir datos desde JSON


JSON (Notación de objetos JavaScript) Los archivos son un formato ampliamente utilizado para
intercambiar datos entre aplicaciones web y servidores. Actúa como un intercambiador de datos y es
más legible en comparación con XML.pandas ofrece el read_json función para leer datos JSON yto_json ()
para escribir datos JSON:

# Leyendo archivo JSON


df = pd.read_json ('empleado.json')

# mostrar 5 registros iniciales


df.head ()

Esto da como resultado la siguiente salida:

En el ejemplo de código anterior, hemos leído el archivo JSON usando el read_json ()método.
Veamos cómo escribir un archivo JSON:

# Escribiendo DataFrame en un archivo JSON


df.to_json ('employee_demo.json', orient = "columnas")

[195]
Recuperar, procesar y almacenar datos Capítulo 6

En el ejemplo de código anterior, hemos escrito el archivo JSON usando el to_json ()método. En
elto_json () método, el orientar El parámetro se usa para manejar el formato de cadena de
salida. orientar ofrece formatos de registro, columna, índice y valor. Puede explorarlo con más
detalle en la página web oficial, enhttps: / / pandas. pydata. org / pandas-
docs / version / 0. 24. 2 / reference / api / pandas. DataFrame. to_ json. html. Es hora de saltar
en archivos HDF5. En la siguiente sección, veremos cómo leer y escribir archivos HDF5 usando el
pandas módulo.

Leer y escribir datos desde HDF5


HDF representa Formato de datos jerárquico. HDF está diseñado para almacenar y administrar
grandes cantidades de datos con alto rendimiento. Ofrece procesamiento y almacenamiento de E / S
rápidos de datos heterogéneos. Hay varios formatos de archivo HDF disponibles, como HDF4 y HDF5.
HDF5 es lo mismo que un objeto de diccionario que lee y escribepandas DataFrames. Utiliza la
biblioteca PyTablesread_hdf () función para leer el archivo HDF5 y el to_hdf ()función para escribir:

# Escribir DataFrame en hdf5


df.to_hdf ('employee.h5', 'table', append = True)

En el ejemplo de código anterior, hemos escrito el formato de archivo HDF usando el to_hdf ()método. '
mesa' es un parámetro de formato utilizado para el formato de tabla. El formato de tabla puede
funcionar más lento pero ofrece operaciones más flexibles, como buscar y seleccionar. losadjuntar El
parámetro se utiliza para agregar datos de entrada al archivo de datos existente:

# Leer un archivo hdf5


df = pd.read_hdf ('empleado.h5', 'tabla')

# mostrar 5 registros iniciales


df.head ()

Esto da como resultado la siguiente salida:

[196]
Recuperar, procesar y almacenar datos Capítulo 6

En el ejemplo de código anterior, hemos leído el formato de archivo HDF usando el read_hdf ()
método. Veamos cómo leer y escribir tablas HTML desde un sitio web en la siguiente sección.

Leer y escribir datos de tablas HTML


Las tablas HTML almacenan filas en <tr> ... </tr> etiqueta y cada fila tiene su correspondiente<td> ... </
td> celdas para mantener valores. Enpandas también podemos leer las tablas HTML desde un archivo
o URL. losread_html () La función lee una tabla HTML de un archivo o URL y devuelve tablas HTML en
una lista de pandas DataFrames:

# Leyendo la tabla HTML de la URL dada


table_url =
'https://en.wikipedia.org/wiki/List_of_sovereign_states_and_dependent_terri tories_in_North_America'

df_list = pd.read_html (table_url)

print ("Número de DataFrames:", len (df_list))

Esto da como resultado la siguiente salida:

Número de DataFrames: 7

En el ejemplo de código anterior, hemos leído la tabla HTML de una página web determinada
usando el read_html () método. read_html () devolverá todas las tablas como una lista de DataFrames.
Revisemos uno de los DataFrames de la lista:

# Verifique el primer DataFrame


df_list [0] .head ()

Esto da como resultado la siguiente salida:

[197]
Recuperar, procesar y almacenar datos Capítulo 6

En el ejemplo de código anterior, mostramos los cinco registros iniciales de la primera tabla disponible
en la página web dada. De manera similar, también podemos escribir objetos DataFrame como tablas
HTML usandoto_html (). to_html ()renderiza el contenido como una tabla HTML:

# Escribir DataFrame en HTML sin formato


df_list [1] .to_html ('país.html')

Con el ejemplo de código anterior, podemos convertir cualquier DataFrame en una página HTML que
contenga el DataFrame como una tabla.

Leer y escribir datos de Parquet


El formato de archivo Parquet proporciona serialización en columnas para pandas DataFrames. Lee y
escribe DataFrames de manera eficiente en términos de almacenamiento y rendimiento y comparte
datos entre sistemas distribuidos sin pérdida de información. El formato de archivo Parquet no admite
columnas numéricas y duplicadas.

Hay dos motores que se utilizan para leer y escribir archivos Parquet en pandas: pyarrow y el fastparquet
motor. pandasEl motor de parquet predeterminado es pyarrow; si pyarrow no está disponible, entonces
usa fastparquet. En nuestro ejemplo, estamos usando pyarrow. Vamos a instalar
pyarrow utilizando pepita:

pip instalar pyarrow

También puede instalar el pyarrow motor en el Jupyter Notebook poniendo un! antes depepita
palabra clave. Aquí hay un ejemplo:

! pip instalar pyarrow

Escribamos un archivo usando el pyarrow motor:

# Escriba en un archivo de parquet.


df.to_parquet ('empleado.parquet', motor = 'pyarrow')

En el ejemplo de código anterior, hemos escrito el usando to_parquet () Archivo de


parquet y el pyarrow motor:

# Leer archivo de parquet


employee_df = pd.read_parquet ('employee.parquet', engine = 'pyarrow')

# mostrar 5 registros iniciales


empleado_df.head ()

[198]
Recuperar, procesar y almacenar datos Capítulo 6

Esto da como resultado la siguiente salida:

En el ejemplo de código anterior, hemos leído el archivo Parquet usando read_parquet () y el pyarrow
motor. read_parquet () ayuda a leer los formatos de archivo Parquet. Veamos cómo leer y escribir los
datos usandopepinillo archivos en la siguiente sección.

Leer y escribir datos de un objeto


pickle pandas
En el paso de preparación de datos, usaremos varias estructuras de datos como diccionarios, listas,
matrices o DataFrames. A veces, es posible que queramos guardarlos para referencia futura o enviárselos
a otra persona. Aquí unpepinillo el objeto entra en la imagen. pepinillo serializa los objetos para
guardarlos y se pueden volver a cargar en cualquier momento. pandas ofrecen dos funciones:read_pickle ()
para cargar pandas objetos y to_pickle () para guardar objetos de Python:

# importar pandas
importar pandas como pd

# Leer archivo CSV


df = pd.read_csv ('demo.csv', sep = ',', header = Ninguno)

# Guardar objeto DataFrame en archivo pickle


df.to_pickle ('demo_obj.pkl')

En el código anterior, leemos el demo.csv archivo usando el read_csv () método consep y


encabezamiento parámetros. Aquí, hemos asignadosep con una coma y encabezamiento conNinguno.
Finalmente, hemos escrito el conjunto de datos en un pepinillo objeto usando el to_pickle ()método.
Veamos como leerpepinillo objetos usando el pandas Biblioteca:

# Leer objeto DataFrame del archivo pickle pickle_obj =


pd.read_pickle ('demo_obj.pkl')

[199]
Recuperar, procesar y almacenar datos Capítulo 6

# mostrar 5 registros iniciales


pickle_obj.head ()

Esto da como resultado la siguiente salida:

En el código anterior, hemos leído el pepinillo objetos usando el read_pickle () método.

Acceso ligero con sqllite3


SQLite es un motor de base de datos de código abierto. Ofrece varias características como ejecución más rápida,
procesamiento ligero, arquitectura sin servidor, cumplimiento de ACID, menos administración, alta estabilidad y
transacciones confiables. Es la base de datos más popular y ampliamente implementada en el mundo de los
dispositivos móviles y la informática. También se conoce como base de datos relacional incorporada porque se
ejecuta como parte de su aplicación. SQLite es una base de datos más ligera y no ofrece funciones completas. Se
utiliza principalmente para almacenar y procesar datos pequeños de forma local, como aplicaciones móviles y de
escritorio. Las principales ventajas de SQLite son que es fácil de usar, eficiente y ligero, y puede integrarse en la
aplicación.

Podemos leer y escribir datos en Python desde el sqlite3 módulo. No necesitamos descargar e instalar
sqlite3 ya que ya está disponible en todas las distribuciones estándar de Python. Consqlite3, podemos
almacenar la base de datos en un archivo o mantenerla en la RAM.sqlite3 nos permite escribir cualquier
base de datos usando SQL sin ningún servidor de aplicaciones de terceros. Veamos el siguiente
ejemplo para comprender la conectividad de la base de datos:

# Importar sqlite3
importar sqlite3

# Crear conexión. Esto creará la conexión con el empleado.


base de datos. Si la base de datos no existe, creará la base de datos conn = sqlite3.connect
('employee.db')

# Crear cursor
cur = conn.cursor ()

# Ejecute la consulta SQL y cree la tabla de la base de datos

[200]
Recuperar, procesar y almacenar datos Capítulo 6

cur.execute ("crear tabla emp (eid int, salario int)")

# Ejecute la consulta SQL y escriba los datos en la base de datos


cur.execute ("insertar en valores emp (105, 57000)")

# cometer la transacción
con.commit ()

# Ejecute la consulta SQL y lea los datos de la base de datos


cur.execute ('seleccionar * de emp')

# Obtener registros
imprimir (cur.fetchall ())

# Cerrar la conexión a la base de datos


conn.close ()

Producción:
[(105, 57000)]

Aquí, estamos usando el sqlite3 módulo. Primero, importamos el módulo y creamos una conexión
usando elconectar() método. losconectar() el método tomará el nombre y la ruta de la base de
datos; si la base de datos no existe, creará la base de datos con el nombre dado y en la ruta de
ubicación dada. Una vez que haya establecido una conexión con la base de datos, debe crear el
Cursor objeto y ejecute la consulta SQL usando elejecutar() método. Podemos crear una tabla en el
ejecutar() método, como se indica en el ejemplo emp tabla, que se crea en la base de datos de
empleados. De manera similar, podemos escribir los datos usando elejecutar() método con un
insertar Argumento de consulta y enviar los datos a la base de datos utilizando el cometer()
método. Los datos también se pueden extraer utilizando elejecutar() método pasando el Seleccione
consulta como argumento y se obtiene usandofetchall () y el fetchone () método. fetchone () extrae
un solo registro yfetchall () extrae todos los registros de una tabla de base de datos.

Leer y escribir datos desde MySQL


MySQL es una base de datos tabular o relacional rápida, de código abierto y fácil de usar. Es adecuado para
aplicaciones de pequeñas y grandes empresas. Es muy amigable con las aplicaciones de desarrollo web basadas
en bases de datos. Hay muchas formas de acceder a los datos en Python desde MySQL. Conectores como
MySQLdb,mysqlconnector, y pymysql están disponibles para la conectividad de la base de datos MySQL. Para
este propósito de conectividad, debe instalar una base de datos relacional MySQL y elmysql-python conector. Los
detalles de configuración de MySQL están disponibles en su
sitio web: https: / / www. mysql. com / downloads /.

[201]
Recuperar, procesar y almacenar datos Capítulo 6

Puedes usar el pymysql conector como biblioteca cliente y se puede instalar usando pepita:

pip instalar pymysql

Podemos establecer una conexión con los siguientes pasos:

1. Importe la biblioteca.
2. Cree una conexión a la base de datos.
3. Cree un objeto de cursor.
4. Ejecute la consulta SQL.
5. Obtenga los registros o la respuesta para la actualización o inserte el registro.
6. Cierre la conexión.

En nuestros ejemplos, estamos probando la conectividad de la base de datos usando mysqlconnecter y


pymysql. Antes de ejecutar el script de conectividad de la base de datos, el primer paso es diseñar y crear
una base de datos y luego crear una tabla en MySQL.

Creemos una base de datos usando la siguiente consulta:

>> crear empleado de base de datos

Cambie la base de datos a la base de datos de empleados:

>> utilizar empleado

Cree una tabla en la base de datos:

>> crear tabla emp (eid int, salario int);

Ahora podemos insertar y recuperar los registros de una tabla en MySQL. Veamos el siguiente ejemplo
para comprender la conectividad de la base de datos:

# importar módulo conector pymysql


importar pymysql

# Crea un objeto de conexión usando el método connect ()


connection = pymysql.connect (host = 'localhost', # dirección IP del servidor de base de datos
MySQL
user = 'root', # nombre de usuario contraseña = 'root', #
contraseña db = 'emp', # nombre de la base de datos
charset = 'utf8mb4', # conjunto de caracteres cursorclass =
pymysql.cursors.DictCursor) #

tipo de cursor

tratar:

[202]
Recuperar, procesar y almacenar datos Capítulo 6

con connection.cursor () como cur:


# Inyectar un registro en la base de datos
sql_query = "INSERT INTO` emp` (`eid`,` salario`) VALUES (% s,% s) "cur.execute
(sql_query, (104,43000))

# Confirme la inserción del registro explícitamente.


connection.commit ()

con connection.cursor () como cur:


# Leer registros de la tabla de empleados
sql_query = "SELECT * FROM` emp`
"cur.execute (sql_query)
table_data = cur.fetchall () print
(table_data)
excepto:
print ("Excepción ocurrida")
finalmente:
connection.close ()

Aquí, estamos usando el pymysql módulo. Primero, importamos el módulo y creamos una conexión. los
conectar() La función tomará la dirección del host, que es localhost, en nuestro caso (también podemos usar
la dirección IP de la base de datos remota), nombre de usuario, contraseña, nombre de la base de datos,
juego de caracteres y clase de cursor.

Después de establecer la conexión, podemos leer o escribir los datos. En nuestro ejemplo, estamos
escribiendo los datos usando elinsertar Consulta SQL y recuperándola usando el Seleccione consulta. En la
consulta de inserción, estamos ejecutando la consulta y pasando el argumento que queremos ingresar a la
base de datos, y confirmando los resultados en la base de datos usando elcometer()método. Cuando
leemos los registros usando la consulta de selección, obtendremos una cierta cantidad de registros.
Podemos extraer esos registros usando elfetchone () y fetchall () funciones. losfetchone () El método extrae
solo registros individuales y el fetchall () El método extrae varios registros de una tabla de base de datos.

Una cosa más; aquí, todas las operaciones de lectura y escritura se realizan en untratar bloque y la
conexión se cierra en el bloque final. También podemos probar uno más
módulo mysql.connector para conectividad MySQL y Python. Se puede instalar usando
pepita:

pip instalar mysql-conector-python

Veamos el siguiente ejemplo para comprender la conectividad de la base de datos:

# Importar el conector requerido


importar mysql.connector
importar pandas como pd

[203]
Recuperar, procesar y almacenar datos Capítulo 6

# Establecer una conexión de base de datos a mysql


conexión = mysql.connector.connect (usuario = 'raíz', contraseña = 'raíz', host = 'localh ost', base de
datos = 'emp')

# Crea un cursor
cur = conexión.cursor ()

# Ejecutando consulta sql


cur.execute ("seleccionar * de emp")

# Obtenga todos los registros e imprímalos uno por uno


registros = cur.fetchall ()
para i en registros:
imprimir (i)

# Cree un DataFrame a partir de registros recuperados.


df = pd.DataFrame (registros)

# Asignar nombres de columna a DataFrame


df.columns = [i [0] para i en cur.description]

# cierra la conexión
connection.close ()

En el ejemplo de código anterior, nos estamos conectando a Python con la base de datos MySQL usando el
mysql.connector módulo y el enfoque y los pasos para recuperar datos son los mismos que con el pymysql
módulo. También estamos escribiendo los registros extraídos en unpandasDataFrame simplemente
pasando los registros obtenidos al objeto DataFrame y asignando nombres de columna de la descripción
del cursor.

Insertar un DataFrame completo en la base de datos


En el programa anterior, se inserta un solo registro utilizando el insertar mando. Si queremos insertar
varios registros, necesitamos ejecutar un ciclo para insertar los múltiples registros en la base de datos.
También podemos utilizar elto_sql () función para insertar varios registros en una sola línea de código:

# Importar el motor sqlalchemy


desde sqlalchemy import create_engine

# Crear instancia de objeto de motor


en = create_engine ("mysql + pymysql: // {usuario}: {pw} @ localhost / {db}"
. formato (usuario = "root",
pw = "raíz",
db = "emp"))

[204]
Recuperar, procesar y almacenar datos Capítulo 6

# Inserte todo el marco de datos en la base de datos


df.to_sql ('emp', con = en, if_exists = 'append', chunksize = 1000, index = False)

En el ejemplo de código anterior, crearemos un motor para una conexión de base de datos con nombre de
usuario, contraseña y parámetros de base de datos. losto_sql () La función escribe varios registros del
DataFrame en una base de datos SQL. Tomará el nombre de la tabla, elestafaparámetro para el objeto de
motor de conexión, el if_exists parámetro para verificar si los datos se agregarán a una nueva tabla o se
reemplazarán con una nueva tabla, y tamaño de porción para escribir datos en lotes.

Leer y escribir datos de MongoDB


MongoDB es una base de datos no relacional (NoSQL) orientada a documentos. Utiliza una notación similar a JSON,
BSON (Notación de objetos binarios) para almacenar los datos. MongoDB ofrece las siguientes características:

Es un software de base de datos gratuito, de código abierto y multiplataforma.


Es fácil de aprender, puede crear aplicaciones más rápidas, admite esquemas
flexibles, maneja diversos tipos de datos y tiene la capacidad de escalar en un entorno
distribuido.
Trabaja sobre conceptos de documentos.
Tiene una base de datos, colección, documento, campo y clave primaria.

Podemos leer y escribir datos en Python desde MongoDB usando el Pymongo conector. Para este
propósito de conectividad, necesitamos instalar MongoDB y elPymongo conector. Puede descargar
MongoDB desde su portal web oficial:https: / / www. mongodb. com / downloadcenter / community.
PyMongo es una biblioteca cliente Python MongoDB pura que se puede instalar usando pepita:

pip instalar pymongo

Probemos la conectividad de la base de datos usando pymongo:

# Importar pymongo
importar pymongo

# Crear cliente mongo


cliente = pymongo.MongoClient ()

# Obtener base de datos


db = client.employee

[205]
Recuperar, procesar y almacenar datos Capítulo 6

# Obtener la colección de la base de datos


colección = db.emp

# Escribe los datos usando el método insert_one ()


employee_salary = {"eid": 114, "salario": 25000}
collection.insert_one (employee_salary)

# Crea un marco de datos con datos obtenidos


datos = pd.DataFrame (lista (colección.find ()))

Aquí, estamos tratando de extraer datos de la colección de bases de datos en MongoDB creando un
cliente Mongo, insertando datos, extrayendo detalles de la colección y asignándolos al DataFrame.
Veamos cómo crear una conexión de base de datos con la base de datos en columnas Cassandra en
la siguiente sección.

Leer y escribir datos de Cassandra


Cassandra es escalable, altamente disponible, duradera y tolerante a fallas, tiene una sobrecarga administrativa
más baja, tiene una lectura y escritura más rápida y es una base de datos resistente orientada a columnas. Es
más fácil de aprender y configurar. Proporciona soluciones para problemas bastante complejos. También admite
la replicación en varios centros de datos. Muchas grandes empresas, por ejemplo, Apple, eBay y Netflix usan
Cassandra.

Podemos leer y escribir datos en Python desde Cassandra usando el cassandra-chofer


conector. Para este propósito de conectividad, necesitamos instalar Cassandra y
cassandradriver conectores. Puedes descargar Cassandra desde su sitio web oficial:http: / /
cassandra. apache. org / download /. cassandra-choferes un cliente puro de Python Cassandra
biblioteca que se puede instalar usando pepita:

pip instalar cassandra-driver

Probemos la conectividad de la base de datos usando cassandra-conductor:

# Importar el clúster
desde el clúster de importación cassandra.cluster

# Creando un objeto de clúster


cluster = Cluster ()

# Cree conexiones llamando a Cluster.connect ():


conn = cluster.connect ()

# Ejecutar la consulta de inserción


conn.execute ("" "INSERT INTO employee.emp_details (eid, ename, age) VALUES

[206]
Recuperar, procesar y almacenar datos Capítulo 6

(% (eid) s,% (ename) s,% (age) s) "" ", {'eid': 101, 'ename':" Steve Smith ", 'age': 42})

# Ejecutar la consulta de selección


filas = conn.execute ('SELECCIONAR * DE empleado.emp_details')

# Imprime los resultados


para emp_row en filas:
print (emp_row.eid, emp_row.ename, emp_row.age)

# Crea un marco de datos con datos obtenidos


data = pd.DataFrame (filas)

Aquí, estamos tratando de extraer datos de la base de datos de Cassandra creando un objeto de clúster,
creando una conexión usando el conectar() , ejecutando una inserción y seleccionando los datos de la
consulta. Después de ejecutar la consulta, estamos imprimiendo los resultados y asignando los registros
extraídos alpandas Marco de datos. Pasemos ahora a otra base de datos NoSQL: Redis.

Leer y escribir datos de Redis


Redis es una base de datos NoSQL de código abierto. Es una base de datos de valores clave, en memoria,
extremadamente rápida y de alta disponibilidad. También se puede utilizar como caché o actuar como intermediario de
mensajes. Inmemory significa que usa RAM para el almacenamiento de datos y maneja datos de mayor tamaño usando
memoria virtual. Redis ofrece un servicio de caché o almacenamiento permanente. Redis admite una variedad de
estructuras de datos, como cadenas, conjuntos, listas, mapas de bits, índices geoespaciales e hiperregistros. Redis puede
manejar datos geoespaciales, de transmisión y de series de tiempo. Se ofrece con servicios en la nube como AWS y
Google Cloud.

Podemos leer y escribir datos en Python desde Redis usando el conector de Redis. Para este
propósito de conectividad, necesitamos instalar Redis y el conector Redis. Tú puedes descargar
Redis desde el siguiente enlace: https: / / github. com / rgl / redis / downloads. Redis es un puro
Biblioteca cliente de Python Redis que se puede instalar usando pepita:

pip instalar redis

Probemos la conectividad de la base de datos usando Redis:

# Módulo de importación
importar redis

# Crear conexión
r = redis.Redis (host = 'localhost', puerto = 6379, db = 0)

# Configuración de par clave-valor

[207]
Recuperar, procesar y almacenar datos Capítulo 6

r.set ('eid', '101')

# Obtener valor para la clave dada


valor = r.get ('eid')

# Imprime el valor
imprimir (valor)

Aquí, estamos tratando de extraer datos de la base de datos de valores clave de Redis. Primero, hemos
creado una conexión con la base de datos. Estamos configurando los pares clave-valor en la base de
datos de Redis usando elcolocar() método y también hemos extraído el valor utilizando el obtener()
método con el parámetro clave dado.

Finalmente, es hora de pasar al último tema de este capítulo, que es PonyORM para mapeo
relacional de objetos (ORM).

PonyORM
PonyORM es un poderoso paquete ORM que está escrito en Python puro. Es rápido y fácil de usar y realiza
operaciones con el mínimo esfuerzo. Proporciona optimización automática de consultas y un editor de
esquema de base de datos GUI. También admite la gestión automática de transacciones, el almacenamiento en
caché automático y claves compuestas. PonyORM utiliza expresiones generadoras de Python, que se traducen
en SQL. Podemos instalarlo usandopepita:

$ pip instalar pony

Veamos un ejemplo de ORM usando poni:

# Importar módulo pony


de la importación de pony.orm *

# Crear base de datos


db = Base de datos ()

# Definir entidades
clase Emp (db.Entity):
eid = PrimaryKey (int, auto = True) salario
= Required (int)

# Verificar la definición de la entidad


mostrar (Emp)

# Vincular entidades a la base de datos MySQL


db.bind ('mysql', host = 'localhost', usuario = 'root', passwd = '12345', db = 'empleado')

[208]
Recuperar, procesar y almacenar datos Capítulo 6

# Genere asignaciones requeridas para entidades


db.generate_mapping (create_tables = True)

# activa el modo de depuración


sql_debug (verdadero)

# Seleccione los registros de las entidades Emp o la tabla emp


seleccione (e para e en Emp) [:]

# Mostrar los valores de todos los atributos


seleccione (e para e en Emp) [:]. mostrar ()

Producción:
eid | salario
---+------
104 | 43000
104 | 43000

En el ejemplo de código anterior, estamos realizando ORM. Primero, hemos creado unBase de datos
objeto y entidades definidas utilizando un Emp clase. Después de eso, hemos adjuntado las entidades a
la base de datos usandodb.bind (). Podemos vincularlo con cuatro bases de datos: sqlite, mysql,
postgresql, y oráculo. En nuestro ejemplo, usamos MySQL y pasamos los detalles de su credencial, como
el nombre de usuario, la contraseña y el nombre de la base de datos. Podemos realizar el
mapeo de entidades con datos usando generate_mapping (). los create_tables = Verdadero
El argumento crea las tablas si no existe. sql_debug (verdadero) activará el modo de depuración. los
Seleccione() La función traduce un generador de Python en una consulta SQL y devuelve unponi
objeto. Estaponi el objeto se convertirá en una lista de entidades utilizando el operador de división([:])
y el show() La función mostrará todos los registros de forma tabular.

Resumen
En este capítulo, aprendimos sobre la recuperación, el procesamiento y el almacenamiento de datos en
diferentes formatos. Hemos analizado la lectura y escritura de datos de varios formatos de archivo y
fuentes, como CSV, Excel, JSON, HDF5, HTML,pepinillo, table y archivos Parquet. También aprendimos a
leer y escribir desde varias bases de datos relacionales y NoSQL, como SQLite3, MySQL, MongoDB,
Cassandra y Redis.

El próximo capítulo, Capítulo 7, Limpieza de datos desordenados, trata sobre el tema importante del preprocesamiento
de datos y la ingeniería de funciones con Python. El capítulo comienza con un análisis de datos exploratorio y conduce
al filtrado, manejo de valores perdidos y valores atípicos. Después de la limpieza, la atención se centrará en la
transformación de datos, como la codificación, el escalado y la división.

[209]
Limpieza de datos desordenados
-
Los analistas de datos y los científicos pasan la mayor parte de su tiempo limpiando datos y preprocesando conjuntos
de datos desordenados. Si bien se habla menos de esta actividad, es una de las actividades más realizadas y una de las
habilidades más importantes para cualquier profesional de datos. Dominar la habilidad de la limpieza de datos es
necesario para cualquier aspirante a científico de datos. La limpieza y el preprocesamiento de datos es el proceso de
identificación, actualización y eliminación de datos corruptos o incorrectos. La limpieza y el procesamiento previo dan
como resultado datos de alta calidad para un análisis sólido y sin errores. Los datos de calidad pueden superar los
algoritmos complejos y superar a los algoritmos simples y menos complejos. En este contexto, alta calidad significa
datos precisos, completos y consistentes. La limpieza de datos es un conjunto de actividades como el manejo de valores
perdidos, eliminación de valores atípicos, codificación de características, escalado, transformación y división.

Este capítulo se centra en la limpieza, manipulación y disputa de datos. La preparación de datos, la


manipulación, la disputa y el munging son términos para lo mismo, y el objetivo principal es limpiar los
datos para obtener información valiosa. Comenzaremos explorando los datos de los empleados y luego
comenzaremos a filtrar los datos y manejar los valores perdidos y los valores atípicos. Después de la
limpieza, nos centraremos en realizar actividades de transformación de datos como codificar, escalar y
dividir. Mayormente estaremos usandopandas y scikit-learn en este capítulo.

En este capítulo, cubriremos los siguientes temas:

Explorando datos
Filtrado de datos para eliminar el ruido
Manejo de valores perdidos
Manejo de valores atípicos

Técnicas de codificación de características

Escalado de características

Transformación de características

División de funciones

¡Empecemos!
Limpieza de datos desordenados Capítulo 7

Requerimientos técnicos
Los siguientes son los requisitos técnicos para este capítulo:

Puede encontrar el código y los conjuntos de datos que se utilizarán en este capítulo en este
repositorio de GitHub del libro en https: / / github. com / PacktPublishing / Python-
Data- Analysis- Third- Edition / tree / master / Chapter07.
Todo el código está disponible en el ch7.ipynb expediente. Este capítulo utiliza solo un
archivo CSV (employee.csv) con fines de práctica.
En este capítulo, usaremos el pandas y scikit-learn Bibliotecas de Python, así
que asegúrese de tenerlas instaladas.

Explorando datos
En esta sección, exploraremos los datos realizando Análisis exploratorio de datos (EDA). EDA es el
componente más crítico e importante del proceso de análisis de datos. EDA ofrece los siguientes
beneficios:

Proporciona una visión inicial de los datos y su contexto.


Captura información rápida e identifica los impulsores potenciales de los datos para el
análisis predictivo. Encuentra las consultas y preguntas que pueden responderse para
la toma de decisiones.
Evalúa la calidad de los datos y nos ayuda a construir la hoja de ruta para la limpieza y el
preprocesamiento de datos.
Encuentra valores perdidos, valores atípicos y la importancia de las características para el
análisis. EDA utiliza estadísticas descriptivas y técnicas de visualización para explorar datos.

En EDA, el primer paso es leer el conjunto de datos. Podemos leer el conjunto de datos usandopandas.
lospandas la biblioteca ofrece varias opciones para leer datos. Puede leer archivos en varios formatos,
como CSV, Excel, JSON, parquet, HTML y pickle. Todos estos métodos se trataron en el capítulo anterior.
Después de leer los datos, podemos explorar los datos. Esta exploración inicial nos ayudará a
comprender los datos y a obtener información sobre el dominio. Comencemos con el proceso de EDA.

[211]
Limpieza de datos desordenados Capítulo 7

Primero, leeremos el employee.csv archivo (puede encontrar este archivo en el Capítulo 7 carpeta de
el repositorio de GitHub de este libro en https: / / github. com / PacktPublishing / Python- Data-
Analysis- Third- Edition / blob / master / Chapter07 / employee. csv):

# importar pandas
importar pandas como pd

# Leer los datos usando csv


datos = pd.read_csv ('empleado.csv')

Echemos un vistazo a los primeros cinco registros en el archivo usando el cabeza() método:

# Ver los 5 registros iniciales


data.head ()

Esto da como resultado la siguiente salida:

De manera similar, veamos los últimos cinco registros usando el cabeza() método:

# Ver los últimos 5 registros


data.tail ()

Esto da como resultado la siguiente salida:

[212]
Limpieza de datos desordenados Capítulo 7

Podemos comprobar la lista de columnas usando el columnas atributo:

# Imprimir lista de columnas en los datos


imprimir (columnas de datos)

Esto da como resultado la siguiente salida:

Índice (['nombre', 'edad', 'ingresos', 'sexo', 'departamento', 'grado',


'performance_score'], dtype = 'objeto')

Veamos la lista de columnas usando la forma del DataFrame usando el formaatributo:

# Imprime la forma de un DataFrame


imprimir (data.shape)

Esto da como resultado la siguiente salida:

(9, 7)

Como podemos ver, el conjunto de datos tiene 9 filas y 7 columnas.

Podemos verificar el esquema de la tabla, sus columnas, filas, tipos de datos y valores faltantes en el
DataFrame usando el siguiente código:

# Verifique la información de DataFrame


data.info ()

Esto da como resultado la siguiente salida:

En el resultado anterior, puede ver que hay 7 columnas en los datos. De estas 7 columnas, 3
columnas (edad, ingresos y sexo) tienen valores perdidos. De estas 7 columnas, 4 son objetos, 2 son
flotantes y 1 es un número entero.

[213]
Limpieza de datos desordenados Capítulo 7

Ahora, echemos un vistazo a las estadísticas descriptivas de los datos usando el describirfunción. Esta
función describirá objetos numéricos. En nuestro ejemplo, las puntuaciones de edad, ingresos y
rendimiento describirán el recuento, la media, la desviación estándar, el mínimo y el máximo y el
primer, segundo y tercer cuartiles:

# Consulta las estadísticas descriptivas


data.describe ()

Esto da como resultado la siguiente salida:

En el bloque de código anterior, hemos verificado los valores estadísticos descriptivos de los datos
usando el describir() función. A partir de estos resultados, podemos interpretar que la edad del empleado
oscila entre los 23 y los 54 años. Aquí, la edad media es 40 años y la edad media es 45 años. De manera
similar, podemos sacar conclusiones para los puntajes de ingresos y desempeño. Ahora que hemos
descrito los datos, aprendamos a filtrar el ruido de los datos.

Filtrar datos para eliminar el ruido


En las últimas dos décadas, el tamaño de los datos de empresas y agencias gubernamentales ha aumentado
debido a la digitalización. Esto también provocó un aumento de la coherencia, errores y valores perdidos. El
filtrado de datos es responsable de manejar estos problemas y optimizarlos para su administración, informes y
predicciones. El proceso de filtrado aumenta la precisión, relevancia, integridad, consistencia y calidad de los
datos al procesar conjuntos de datos sucios, desordenados o burdos. Es un paso muy importante para cualquier
tipo de gestión de datos porque puede hacer o deshacer una ventaja competitiva en el negocio. Los científicos
de datos deben dominar la habilidad del filtrado de datos. Los diferentes tipos de datos necesitan diferentes
tipos de tratamiento. Es por eso que se debe adoptar un enfoque sistemático para el filtrado de datos.

[214]
Limpieza de datos desordenados Capítulo 7

En la sección anterior, aprendimos sobre la exploración de datos, mientras que en esta sección,
aprenderemos sobre el filtrado de datos. Los datos se pueden filtrar por columnas o por filas.
Explorémoslos uno por uno.

Filtración por columna


En esta subsección, aprenderemos cómo filtrar datos por columnas. Podemos filtrar columnas
usando elfiltrar() método. losrebanar []. filtrar()El método selecciona las columnas cuando se pasan
como una lista de columnas. Eche un vistazo al siguiente ejemplo:

# Filtrar columnas
data.filter (['nombre', 'departamento'])

Esto da como resultado la siguiente salida:

Del mismo modo, también podemos filtrar columnas mediante la división. Al dividir, una sola columna no
necesita una lista, pero cuando estamos filtrando varias columnas, entonces deberían estar en la lista. La salida
de una sola columna es una serie pandas. Si queremos la salida como un DataFrame, entonces necesitamos
poner el nombre de la columna única en una lista. Eche un vistazo al siguiente ejemplo:

# Columna de filtro "nombre"


datos ['nombre']

0 Allen Smith
1 S Kumar
2 Jack Morgan
3 Ying Chin
4 Dheeraj Patel

[215]
Limpieza de datos desordenados Capítulo 7

5 Satyam Sharma
6 James Authur
7 Josh Wills
8 Pato leo
Nombre: nombre, dtipo: objeto

En el ejemplo anterior, hemos seleccionado una sola columna sin pasarla a la lista y la
salida es una serie pandas.

Ahora, seleccionemos una sola columna usando una lista de Python:

# Columna de filtro "nombre"


datos [['nombre']]

Esto da como resultado la siguiente salida:

Como puede ver, se puede seleccionar una sola columna usando una lista de Python. La salida de este filtro es
un DataFrame de pandas con una sola columna.

Ahora, filtremos varias columnas del DataFrame de pandas:


# Filtra dos columnas: nombre y departamento
datos [['nombre', 'departamento']]

[216]
Limpieza de datos desordenados Capítulo 7

Esto da como resultado la siguiente salida:

Como puede ver, hemos filtrado las dos columnas sin usar el filtrar() función.

Filtración por hileras


Ahora, filtremos los datos por filas. Podemos filtrar datos usando índices, cortes y condiciones. En
índices, debe pasar el índice del registro, mientras que para cortar, debemos pasar el rango de
corte. Eche un vistazo al siguiente ejemplo:

# Seleccionar filas para el índice específico


data.filter ([0,1,2], eje = 0)

Esto da como resultado la siguiente salida:

En el ejemplo anterior, hemos filtrado los datos basados en índices. El

siguiente es un ejemplo de filtrado de datos por división:

# Filtrar datos usando segmentación


datos [2: 5]

[217]
Limpieza de datos desordenados Capítulo 7

Esto da como resultado la siguiente salida:

En la filtración basada en condiciones, tenemos que aprobar algunas condiciones entre corchetes,
[] o corchetes, (). Para un solo valor, usamos la condición == (doble igual a), mientras que para
valores múltiples, usamos laes en() función y pasar la lista de valores. Echemos un vistazo al
siguiente ejemplo:

# Filtrar datos por valor específico


datos [departamento de datos == 'Ventas']

Esto da como resultado la siguiente salida:

En el código anterior, filtramos las ventas del departamento en la primera línea de código
usando == (doble igual a) como condición. Ahora, filtremos varias columnas usando eles en()
función:

# Seleccionar datos para múltiples valores


datos [data.department.isin (['Ventas', 'Finanzas'])]

Esto da como resultado la siguiente salida:

[218]
Limpieza de datos desordenados Capítulo 7

En el ejemplo anterior, filtramos el departamento de ventas y finanzas del departamento usando


el es en() función.

Ahora, veamos las condiciones> = y <= para variables continuas. Podemos tener condiciones
únicas o múltiples. Echemos un vistazo al siguiente ejemplo:

# Filtrar empleado que tiene más de 700 puntajes de desempeño


datos [(data.performance_score> = 700)]

Esto da como resultado la siguiente salida:

En el ejemplo anterior, filtramos a los empleados en función de su puntuación de desempeño


(performance_score> = 700). Ahora, filtremos los datos usando múltiples condiciones:

# Filtrar empleados que tienen más de 500 y menos de 700 puntajes de desempeño
datos [(data.performance_score> = 500) & (data.performance_score <700)]

Esto da como resultado la siguiente salida:

También podemos probar el consulta() método. Este método consulta las columnas mediante una
expresión booleana. Veamos un ejemplo:

# Empleado de filtro que tiene una puntuación de rendimiento inferior a 500


data.query ('performance_score <500')

[219]
Limpieza de datos desordenados Capítulo 7

Esto da como resultado la siguiente salida:

En el ejemplo anterior, filtramos los empleados que tienen puntuaciones de desempeño inferiores a
500. Ahora, aprendamos a manejar los valores perdidos.

Manejo de valores perdidos


Los valores perdidos son los valores que están ausentes de los datos. Los valores ausentes pueden ocurrir debido a
errores humanos, preocupaciones de privacidad o el valor que no fue completado por el encuestado que completó la
encuesta. Este es el problema más común en la ciencia de datos y el primer paso del preprocesamiento de datos. Los
valores faltantes afectan el rendimiento de un modelo de aprendizaje automático. Los valores faltantes se pueden
manejar de las siguientes formas:

Elimine los registros de valor que faltan.


Complete el valor faltante manualmente.
Complete los valores faltantes utilizando las medidas de tendencia central, como media,
mediana y moda. La media se usa para imputar la característica numérica, la mediana se
usa para imputar la característica ordinal y la moda o el valor más alto se usa para
imputar la característica categórica.
Complete el valor más probable utilizando modelos de aprendizaje automático como
regresión, árboles de decisión, KNN.

Es importante comprender que, en algunos casos, los valores perdidos no afectarán los datos. Por ejemplo, los
números de la licencia de conducir, los números de la seguridad social o cualquier otro número de
identificación único no afectarán los modelos de aprendizaje automático porque no se pueden usar como
funciones en el modelo.

En las siguientes subsecciones, veremos cómo se pueden manejar los valores perdidos con más detalle.
Primero, aprenderemos cómo eliminar los valores perdidos.

[220]
Limpieza de datos desordenados Capítulo 7

Eliminando los valores perdidos


En Python, los valores perdidos se pueden eliminar usando el dropna () función. dropna toma un argumento:
cómo. cómopuede tomar dos valores: todos o alguna. algunaelimina ciertas filas que contienen NAN o valores
perdidos, mientras que todos elimina todas las filas que contienen NAN o valores faltantes:

# Elimina las filas de valor que faltan usando la función dropna ()


# Leer los datos

datos = pd.read_csv ('empleado.csv') datos


= datos.dropna ()
datos

Esto da como resultado la siguiente salida:

Esto resume el conjunto de datos como un marco de datos.

Completando un valor faltante


En Python, los valores perdidos se pueden eliminar usando el fillna () función. losfillna ()La función
toma un valor que queremos llenar en el lugar que falta. Podemos completar los valores faltantes
usando la media, la mediana y la moda:

# Leer los datos


datos = pd.read_csv ('empleado.csv')

# Complete todos los valores que faltan en la columna de edad con la media de la columna de edad
data ['edad'] = data.age.fillna (data.age.mean ()) datos

[221]
Limpieza de datos desordenados Capítulo 7

Esto da como resultado la siguiente salida:

En el ejemplo anterior, los valores faltantes en la columna de edad se han completado con el valor
medio de la columna de edad. Aprendamos a completar los valores faltantes usando la mediana:

# Complete todos los valores faltantes en la columna de ingresos con una mediana de
columna de ingresos
data ['ingresos'] = data.income.fillna (data.income.median ()) datos

Esto da como resultado la siguiente salida:

[222]
Limpieza de datos desordenados Capítulo 7

En el ejemplo anterior, los valores faltantes en la columna de ingresos se han completado con el valor
mediano de la columna de ingresos. Aprendamos a completar los valores perdidos usando el modo:

# Complete todos los valores faltantes en la columna de género (columna de categoría) con
el modo de la columna de género data ['gender'] = data ['gender']. fillna (data
['gender']. mode () [0]) data

Esto da como resultado la siguiente salida:

En el ejemplo de código anterior, los valores faltantes en la columna de género se han completado con el valor de
modo de la columna de género. Como ha visto, la media, la mediana y el modo nos ayudan a manejar los valores
faltantes en pandas DataFrames. En la siguiente sección, nos centraremos en cómo manejar los valores atípicos.

Manejo de valores atípicos


Los valores atípicos son aquellos puntos de datos que están distantes de la mayoría de los puntos similares; en otras palabras,
podemos decir que los valores atípicos son entidades que son diferentes de la multitud. Los valores atípicos causan problemas
cuando se trata de construir modelos predictivos, como largos tiempos de entrenamiento del modelo, poca precisión, un
aumento en la varianza del error, una disminución en la normalidad y una reducción en el poder de las pruebas estadísticas.

[223]
Limpieza de datos desordenados Capítulo 7

Hay dos tipos de valores atípicos: univariados y multivariados. Los valores atípicos univariados se pueden encontrar
en distribuciones de una sola variable, mientras que los multivariados se pueden encontrar en espacios n-
dimensionales. Podemos detectar y manejar valores atípicos de las siguientes formas:

Diagrama de caja: Podemos usar un diagrama de caja para crear un montón de puntos de datos a través
de cuartiles. Agrupa los puntos de datos entre el primer y tercer cuartil en un cuadro rectangular. El
diagrama de caja también muestra los valores atípicos como puntos individuales utilizando el rango
intercuartílico.
Gráfico de dispersión: Un gráfico de dispersión muestra los puntos (o dos variables) en el
gráfico bidimensional. Una variable se coloca en el eje x, mientras que la otra se coloca en el
eje y.
Puntuación Z: La puntuación Z es una especie de enfoque paramétrico para detectar valores atípicos.
Asume una distribución normal de los datos. El valor atípico se encuentra en la cola de la distribución
de la curva normal y está lejos de la media:

Rango intercuartil (IQR): IQR es una medida estadística sólida de la dispersión de datos. Es la
diferencia entre el tercer y el primer cuartil. Estos cuartiles se pueden visualizar en un
diagrama de caja. Esto también se conoce como propagación media, 50% central o
propagación H:

Percentil: Un percentil es una medida estadística que divide los datos en 100 grupos de igual
tamaño. Su valor indica el porcentaje de población por debajo de ese valor. Por ejemplo, el
percentil 95 significa que el 95% de las personas se incluyen en esta categoría.

Dejemos algunos valores atípicos usando la desviación estándar y la media:

# Eliminación de valores atípicos mediante la desviación estándar


# Leer los datos
datos = pd.read_csv ('empleado.csv')

# Eliminación de valores atípicos mediante la desviación estándar


límite_uperior = datos ['puntuación_de_rendimiento']. media () + 3 *
datos ['puntuación_de_sempeño']. std ()
lower_limit = data ['performance_score']. mean () - 3 *

[224]
Limpieza de datos desordenados Capítulo 7

datos ['performance_score']. std ()


data = data [(data ['performance_score'] <upper_limit) & (data
['performance_score']> lower_limit)]
datos

Esto da como resultado la siguiente salida:

En el ejemplo anterior, manejamos los valores atípicos utilizando la desviación estándar


y la media. Estamos usando como límite superior y
como límite inferior para filtrar los valores atípicos. También podemos intentar
los valores de percentiles para eliminar los valores atípicos. Echemos un vistazo al siguiente ejemplo:

# Leer los datos


datos = pd.read_csv ('empleado.csv')

# Elimine las observaciones atípicas usando percentiles


upper_limit = data ['performance_score']. quantile (.99) lower_limit = data
['performance_score']. quantile (.01) data = data [(data
['performance_score'] <límite_superior) & (datos ['performance_score'] >
límite_inferior)]
datos

Esto da como resultado la siguiente salida:

[225]
Limpieza de datos desordenados Capítulo 7

En el ejemplo de código anterior, manejamos los valores atípicos usando percentiles. Eliminamos los valores
atípicos usando un percentil de 1 para el límite inferior y un percentil de 99 para el límite superior. Esto nos
ayuda a manejar valores atípicos en pandas DataFrames. En la siguiente sección, nos centraremos en cómo
realizar la codificación de funciones.

Técnicas de codificación de funciones


Los modelos de aprendizaje automático son modelos matemáticos que requieren valores numéricos y enteros para el
cálculo. Estos modelos no pueden funcionar con características categóricas. Es por eso que a menudo necesitamos
convertir características categóricas en numéricas. El rendimiento del modelo de aprendizaje automático se ve afectado
por la técnica de codificación que utilizamos. Los valores categóricos van de 0 a N-1 categorías.

Codificación one-hot
La codificación one-hot transforma la columna categórica en etiquetas y divide la columna en varias
columnas. Los números se reemplazan por valores binarios como unos o ceros. Por ejemplo,
digamos que, en elcolor variable, hay tres categorías; es decir,rojo verde,y azul. Estas tres categorías
están etiquetadas y codificadas en columnas binarias, como se muestra en el siguiente diagrama:

La codificación one-hot también se puede realizar utilizando el get_dummies () función. Usemos el


get_dummies () funcionar como un ejemplo:

# Leer los datos


datos = pd.read_csv ('empleado.csv')
# Codificación ficticia
encoded_data = pd.get_dummies (datos ['género'])

# Unir el _data codificado con el marco de datos original


datos = datos.join (datos_codificados)

[226]
Limpieza de datos desordenados Capítulo 7

# Verifique los 5 primeros registros del marco de datos


data.head ()

Esto da como resultado la siguiente salida:

Aquí, podemos ver dos columnas adicionales, F y M. Ambas columnas son columnas ficticias que
fueron agregadas por el codificador booleano. También podemos realizar la misma tarea con
OneHotEncoderdesde el scikit-learn módulo. Veamos un ejemplo de usoOneHotEncoder.

# Importar un codificador activo


desde sklearn.preprocessing import OneHotEncoder

# Inicializar el objeto codificador one-hot


onehotencoder = OneHotEncoder ()

# Complete todos los valores faltantes en la columna de ingresos (columna de categoría) con el modo
de columna de edad
datos ['género'] = datos ['género']. fillna (datos ['género']. modo () [0])

# Encaja y transforma la columna de género


onehotencoder.fit_transform (datos [['género']]). toarray ()

Esto da como resultado la siguiente salida:

matriz ([[1., 0.],


[1., 0.],
[0., 1.],
[1., 0.],
[1., 0.],
[1., 0.],
[1., 0.],
[1., 0.],
[0., 1.]])

En el ejemplo de código anterior, importamos OneHotEncoder, inicializó su objeto, y luego ajustó y


transformó el modelo en la columna de género. Podemos ver que la matriz de salida tiene dos columnas
para empleados masculinos y femeninos.

[227]
Limpieza de datos desordenados Capítulo 7

Codificación de etiquetas
La codificación de etiquetas también se conoce como codificación de números enteros. La codificación entera
reemplaza los valores categóricos con valores numéricos. Aquí, los valores únicos en las variables se reemplazan
con una secuencia de valores enteros. Por ejemplo, digamos que hay tres categorías: rojo, verde y azul. Estas
tres categorías se codificaron con valores enteros; es decir,rojo es 0, verde es 1, y azul es 2.

Echemos un vistazo al siguiente ejemplo de codificación de etiquetas:

# Importar pandas
importar pandas como pd

# Leer los datos


datos = pd.read_csv ('empleado.csv')

# Importar LabelEncoder
desde sklearn.preprocessing import LabelEncoder

# Crear una instancia del objeto Label Encoder


label_encoder = LabelEncoder ()

# Ajustar y transformar la columna


encoded_data = label_encoder.fit_transform (datos ['departamento'])

# Imprime el codificado
imprimir (datos_codificados)

Esto da como resultado la siguiente salida:

[2 1 0 0 2 1 2 1 0 2]

En el ejemplo anterior, realizamos una codificación de etiquetas simple.

En el siguiente ejemplo, estamos codificando la columna del departamento usando el


LabelEncoder clase. Primero, debemos importar e inicializar elLabelEncoder object y luego ajustar
y transformar la columna que queremos codificar. Realicemos la transformación inversa en las
etiquetas codificadas:

# Realizar codificación inversa


codificación_inversa = codificador_etiqueta.transformación_inversa ([0, 0, 1, 2])

# Imprimir codificación inversa


imprimir (codificación_inversa)

[228]
Limpieza de datos desordenados Capítulo 7

Esto da como resultado la siguiente salida:

['Finanzas' 'Finanzas' 'Operaciones' 'Ventas']

En el ejemplo anterior, invertimos la codificación de los valores codificados usando


transformación_inversa (). También podemos utilizar la codificación one-hot con variables
numéricas. Aquí, cada valor numérico único se codifica en una variable binaria equivalente.

Codificador ordinal
La codificación ordinal es similar a la codificación de etiquetas, excepto que hay un orden para la codificación. La
codificación de salida comenzará desde 0 y terminará en uno menos que el tamaño de las categorías. Veamos
un ejemplo que contiene calificaciones de empleados como G0, G1, G2, G3 y G4. Estos cinco grados se han
codificado con valores enteros ordinales; es decir,G0 es 0, G1 es 1, G2 es 2, G3 es
3, y G4 es 4. Podemos definir el orden de los valores como una lista y pasarlo al parámetro de
categoría. El codificador ordinal utiliza valores enteros o numéricos para codificar. Aquí, los valores
enteros y numéricos son de naturaleza ordinal. Esta codificación ayuda a los algoritmos de
aprendizaje automático a aprovechar esta relación ordinal.

Echemos un vistazo a lo siguiente Codificador ordinal ejemplo:

# Importar pandas y OrdinalEncoder


importar pandas como pd
desde sklearn.preprocessing import OrdinalEncoder

# Cargar los datos


datos = pd.read_csv ('empleado.csv')

# Inicializar OrdinalEncoder con orden


order_encoder = OrdinalEncoder (categorías = ['G0', 'G1', 'G2', 'G3', 'G4'])

# encajar y transformar el grado


datos ['grade_encoded'] = label_encoder.fit_transform (datos ['grado'])

# Verifique los 5 registros principales del marco de datos


data.head ()

[229]
Limpieza de datos desordenados Capítulo 7

Esto da como resultado la siguiente salida:

El ejemplo anterior es similar al LabelEncoder ejemplo, excepto por el orden de los valores que
se pasaron cuando el Codificador ordinal se inicializó el objeto. En este ejemplo, elcategorias los
parámetros se pasaron junto con el calificación orden en el momento de la inicialización.

Escala de características
En la vida real, la mayoría de las funciones tienen diferentes rangos, magnitudes y unidades, como la edad entre 0-200
y el salario entre 0 y miles o millones. Desde el punto de vista de un analista de datos o un científico de datos, ¿cómo
podemos comparar estas características cuando están en diferentes escalas? Las características de gran magnitud
pesarán más en los modelos de aprendizaje automático que las características de menor magnitud. Afortunadamente,
el escalado de funciones o la normalización de funciones pueden resolver estos problemas.

La escala de características trae todas las características al mismo nivel de magnitud. Esto no es obligatorio
para todo tipo de algoritmos; algunos algoritmos claramente necesitan datos escalados, como los que se
basan en medidas de distancia euclidiana, como K-vecino más cercano y el algoritmo de agrupación Kmeans.

[230]
Limpieza de datos desordenados Capítulo 7

Métodos para escalar características


Ahora, veamos los diversos métodos que podemos usar para escalar características:

Normalización de escala estándar o puntuación Z: Este método calcula los valores escalados de
una característica mediante el uso de la desviación estándar y media de esa característica. Es más
adecuado para datos distribuidos normalmente. Suponga que es la media y es la desviación
estándar de la columna de características. Esto da como resultado la siguiente fórmula:

Echemos un vistazo al siguiente ejemplo de escala estándar:

# Importar StandardScaler (o normalización de puntuación z)


desde sklearn.preprocessing import StandardScaler

# Inicializar el Escalador estándar


escalador = Escalador estándar ()

# Para escalar datos


scaler.fit (data ['performance_score']. values.reshape (-1,1)) data ['performance_std_scaler']
= scaler.transform (data ['performance_s core']. values.reshape (-1,1))

data.head ()

Esto da como resultado la siguiente salida:

Aquí, necesitamos importar e inicializar el Escalador estándar objeto. Después de la


inicialización, debemos realizar operaciones de ajuste y transformación en la columna que
queremos escalar.

[231]
Limpieza de datos desordenados Capítulo 7

Escala mínima-máxima: Este método transforma linealmente los datos originales en el


rango dado. Conserva las relaciones entre los datos escalados y los datos originales. Si
la distribución no se distribuye normalmente y el valor de la desviación estándar es muy
pequeño, entonces el escalador mínimo-máximo funciona mejor ya que es más sensible
a los valores atípicos. Digamos que es el valor mínimo y es
el valor máximo de una columna de características, mientras que y son los
nuevo mínimo y nuevo máximo. Esto da como resultado la siguiente fórmula:

Echemos un vistazo al siguiente ejemplo de escala mínima-máxima:

# Importar MinMaxScaler
desde sklearn.preprocessing import MinMaxScaler

# Inicializar MinMaxScaler
escalador = MinMaxScaler ()

# Para escalar datos


scaler.fit (data ['performance_score']. values.reshape (-1,1)) data
['performance_minmax_scaler'] = scaler.transform (data ['performanc e_score'].
valores.reshape (-1,1))
data.head ()

Esto da como resultado la siguiente salida:

Aquí, necesitamos importar e inicializar el MinMaxScaler objeto. Después de la inicialización,


debemos realizar las operaciones de ajuste y transformación en la columna que queremos
escalar.

[232]
Limpieza de datos desordenados Capítulo 7

Escalado robusto: Este método es similar al método del escalador mínimo-máximo. En lugar
de mínimo-máximo, este método utiliza un rango intercuartílico. Por eso es resistente a
valores atípicos. Suponga que y son el primer y tercer cuartiles de la columna x. Esta
da como resultado la siguiente fórmula:

Echemos un vistazo al siguiente ejemplo de escala robusta:

# Importar RobustScaler
desde sklearn.preprocessing import RobustScaler

# Inicializar el RobustScaler
escalador = RobustScaler ()

# Para escalar datos


scaler.fit (data ['performance_score']. values.reshape (-1,1)) data
['performance_robust_scaler'] = scaler.transform (data ['performanc e_score'].
valores.reshape (-1,1))

# Ver los 5 registros iniciales


data.head ()

Esto da como resultado la siguiente salida:

[233]
Limpieza de datos desordenados Capítulo 7

Aquí, necesitamos importar e inicializar el Escalador robusto objeto. Después de la inicialización,


debemos ajustar y transformar la columna que queremos escalar.

Transformación de características
La transformación de características altera las características para que estén en la forma requerida. También reduce
el efecto de valores atípicos, maneja datos sesgados y hace que el modelo sea más robusto. La siguiente lista
muestra los diferentes tipos de transformación de características:

La transformación logarítmica es la transformación matemática más común utilizada para transformar


datos asimétricos en una distribución normal. Antes de aplicar la transformación logarítmica, asegúrese de
que todos los valores de datos solo contengan valores positivos; de lo contrario, arrojará una excepción o
un mensaje de error.
La transformación de cuadrados y cubos tiene un efecto moderado en la forma de distribución. Se puede
utilizar para reducir la asimetría hacia la izquierda.

La transformación de raíz cuadrada y cúbica tiene un efecto de transformación bastante


fuerte en la forma de distribución, pero es más débil que los logaritmos. Se puede aplicar a
datos sesgados.
La discretización también se puede utilizar para transformar una columna numérica o atributo. Por
ejemplo, la edad de un grupo de candidatos se puede agrupar en intervalos como 0-10, 11-20, etc.
También podemos utilizar la discretización para asignar etiquetas conceptuales en lugar de
intervalos como jóvenes, adultos y personas mayores.

Si la característica está sesgada a la derecha o positivamente o agrupada en valores más bajos, entonces podemos
aplicar la raíz cuadrada, raíz cúbica y transformaciones logarítmicas, mientras que si la característica está sesgada a la
izquierda o sesgada negativamente o agrupada en valores más altos, entonces puede aplicar el cubo, el cuadrado, etc.

Echemos un vistazo a un ejemplo de transformación de discretización:

# Leer los datos


datos = pd.read_csv ('empleado.csv')

# Crear función de grado de rendimiento


def performance_grade (puntuación):
si la puntuación> = 700:
devuelve 'A'
puntuación elif <700 y puntuación> = 500:
devuelve 'B'
demás:
devuelve 'C'

[234]
Limpieza de datos desordenados Capítulo 7

# Aplicar la función de grado de rendimiento en todo el DataFrame usando apply ()


función.
data ['performance_grade'] = data.performance_score.apply (performance_grade)

# Ver los 5 registros iniciales


data.head ()

Esto da como resultado la siguiente salida:

En el ejemplo anterior, cargamos el conjunto de datos y creamos el performance_grade ()


función. losperformance_grade () la función toma el puntaje de desempeño y lo convierte en
calificaciones; es decir,A, B, y C.

División de funciones
La división de funciones ayuda a los analistas de datos y a los científicos de datos a crear más funciones nuevas para el
modelado. Permite que los algoritmos de aprendizaje automático comprendan características y descubran información
potencial para la toma de decisiones; por ejemplo, dividir las características del nombre en nombre, segundo nombre y
apellido y dividir una dirección en número de casa, localidad, punto de referencia, área, ciudad, país y código postal.

Las características compuestas, como las columnas de cadenas y fechas, violan los principios de los datos ordenados. La
división de características es una buena opción si desea generar más características a partir de una característica
compuesta. Podemos utilizar los componentes de una columna para hacer esto. Por ejemplo, a partir de un objeto de
fecha, podemos obtener fácilmente el año, el mes y el día de la semana. Estas características pueden afectar
directamente al modelo de predicción. No existe una regla general cuando se trata de dividir las funciones en
componentes; esto depende de las características de la función:

# Divida la columna de nombre en nombre y apellido


data ['first_name'] = data.name.str.split ("") .map (lambda var: var [0]) data ['last_name'] =
data.name.str.split ("") .map ( lambda var: var [1])

[235]
Limpieza de datos desordenados Capítulo 7

# Verifique los 5 mejores registros


data.head ()

Esto da como resultado la siguiente salida:

En el ejemplo anterior, dividimos la columna de nombre usando el separar() y mapa()funciones. los


separar() La función divide la columna de nombre usando un espacio, mientras que la mapa()La
función asigna la primera cadena dividida al primer nombre y la segunda cadena dividida al
apellido.

Resumen
En este capítulo, exploramos el preprocesamiento de datos y la ingeniería de funciones con Python. Esto le ayudó
a adquirir habilidades importantes para el análisis de datos. El enfoque principal de este capítulo fue limpiar y
filtrar datos sucios. Comenzamos con EDA y discutimos el filtrado de datos, el manejo de valores perdidos y
valores atípicos. Después de esto, nos enfocamos en tareas de ingeniería de características como transformación,
codificación de características, escalado de características y división de características. Luego exploramos varios
métodos y técnicas que podemos usar cuando se trata de ingeniería de funciones.

En el próximo capítulo, Capítulo 8, Procesamiento de señales y series de tiempo, nos centraremos en la


importancia del procesamiento de señales y los datos de series de tiempo en Python. Comenzaremos este
capítulo analizando datos de series de tiempo y discutiendo promedios móviles, autocorrelaciones, modelos
autorregresivos y modelos ARMA. Luego, veremos el procesamiento de señales y discutiremos la
transformada de Fourier, la transformada espectral y el filtrado de señales.

[236]
Procesamiento de señales y tiempo
-
Serie
El procesamiento de señales es un subdominio de la ingeniería eléctrica y las matemáticas aplicadas.
Cubre el análisis y procesamiento de variables relacionadas con el tiempo o variables que cambian
con el tiempo, como señales analógicas y digitales. Las señales analógicas son señales no
digitalizadas, como señales de radio o teléfono. Las señales digitales son señales digitalizadas,
discretas y muestreadas en el tiempo, como las señales de computadoras y dispositivos digitales. El
análisis de series de tiempo es la categoría de procesamiento de señales que se ocupa de listas de
observaciones ordenadas o secuenciales. Estos datos se pueden ordenar por hora, por día, por
semana, por mes o por año. El componente de tiempo en la serie de tiempo juega un papel muy
importante. Necesitamos extraer todas las relaciones en los datos con respecto al tiempo. Hay
muchos ejemplos relacionados con el análisis de series de tiempo, como la producción y venta de un
producto,

En este capítulo, nuestro enfoque principal es el procesamiento de señales y las operaciones de series de tiempo
utilizando NumPy, SciPy, pandas y statsmodels Bibliotecas. Este capítulo será útil para que los analistas de datos
comprendan las tendencias y patrones y pronostiquen las ventas, los precios de las acciones, la producción, la
población, las precipitaciones y la temperatura del clima.

Cubriremos los siguientes temas en este capítulo:

los statsmodels modulos


Medias móviles
Funciones de ventana
Definición de cointegración
Descomposición STL
Autocorrelación
Modelos autorregresivos
Procesamiento de señales y series de tiempo Capítulo 8

Modelos ARMA
Generación de señales periódicas
Análisis de Fourier
Filtrado de análisis espectral

Requerimientos técnicos
Este capítulo tiene los siguientes requisitos técnicos:

Puede encontrar el código y el conjunto de datos en el siguiente enlace de GitHub: https: / /


github. com / PacktPublishing / Python- Data- Analysis- Third- Edition / tree / master /
Chapter08.
Todos los bloques de código están en el Ch8.ipynb expediente.

Este capítulo utiliza dos archivos CSV (beer_production.csv y sales.csv) con fines
de práctica.
En este capítulo, usaremos el pandas y bibliotecas Python de Scikit-learn.

Los módulos de statsmodels


statsmodels es un módulo de Python de código abierto que ofrece funcionalidad para varias
operaciones estadísticas, como valores centrales (media, moda y mediana), medidas de
dispersión (desviación estándar y varianza), correlaciones y pruebas de hipótesis.

Vamos a instalar statsmodels utilizando pepita y ejecuta el siguiente comando:

pip3 instalar statsmodels

statsmodels proporciona el statsmodels.tsa submódulo para operaciones de series de


tiempo.statsmodels.tsa proporciona métodos y técnicas útiles de series de tiempo, como
autorregresión, autocorrelación, autocorrelación parcial, promedios móviles,
SimpleExpSmoothing, lineal de Holt, Holt-Winters, ARMA, ARIMA, vector autorregresivo (
VAR) y muchas funciones de ayuda, que exploraremos en las próximas secciones.

[238]
Procesamiento de señales y series de tiempo Capítulo 8

Medias móviles
Las medias móviles, o medias móviles, son filtros de series de tiempo que filtran las respuestas impulsivas
promediando el conjunto o la ventana de observaciones. Utiliza conceptos de tamaño de ventana y encuentra el
promedio de los deslizamientos de ventana continuos para cada período. La media móvil simple se puede representar
de la siguiente manera:

Hay varios tipos de medias móviles disponibles, como medias móviles centradas, dobles y
ponderadas. Encontremos la media móvil usando ellaminación() , pero antes de eso, primero
cargaremos los datos y los visualizaremos:

# importar bibliotecas necesarias


importar pandas como pd
importar statsmodels.api como sm
importar matplotlib.pyplot como plt

# Leer conjunto de datos


sales_data = pd.read_csv ('sales.csv')

# Configuración del tamaño de la figura


plt.figure (figsize = (10,6))

# Trazar datos de ventas originales


plt.plot (sales_data ['Hora'], sales_data ['Ventas'], label = "Ventas-Original")

# Rotar xlabels
plt.xticks (rotación = 60)

# Agregar leyendas
plt.legend ()

# mostrar el gráfico
plt.show ()

[239]
Procesamiento de señales y series de tiempo Capítulo 8

Esto da como resultado la siguiente salida:

En el código anterior, hemos leído el conjunto de datos de ventas de 36 meses desde enero de 2017
hasta diciembre de 2019 y lo trazamos usando Matplotlib. Ahora, calcularemos la media móvil
usando la función móvil:

# Media móvil con ventana 3


sales_data ['3MA'] = sales_data ['Ventas']. rolling (ventana = 3) .mean ()

# Media móvil con ventana 5


sales_data ['5MA'] = sales_data ['Ventas']. rolling (window = 5) .mean ()

# Configuración del tamaño de la figura


plt.figure (figsize = (10,6))

# Trazar datos de ventas originales


plt.plot (sales_data ['Hora'], sales_data ['Ventas'], etiqueta = "Ventas-Original", color = "azul")

# Trazar 3-Promedio móvil de datos de ventas


plt.plot (sales_data ['Time'], sales_data ['3MA'], label = "3-Moving

[240]
Procesamiento de señales y series de tiempo Capítulo 8

Promedio (3MA) ", color =" verde ")

# Trazar 5-Promedio móvil de datos de ventas


plt.plot (sales_data ['Time'], sales_data ['5MA'], label = "5-Media móvil (5MA)", color =
"rojo")

# Rotar xlabels
plt.xticks (rotación = 60)

# Agregar leyendas
plt.legend ()

# Mostrar la trama
plt.show ()

Esto da como resultado la siguiente salida:

En el código anterior, calculamos los promedios móviles 3 y 5 usando la media móvil y mostramos el
gráfico de líneas usando Matplotlib. Ahora, veamos diferentes tipos de funciones de ventana para
promedios móviles en la siguiente sección.

[241]
Procesamiento de señales y series de tiempo Capítulo 8

Funciones de ventana
NumPy ofrece varias opciones de ventana que pueden calcular pesos en una ventana móvil como hicimos
en la sección anterior.

La función de ventana utiliza un intervalo para el análisis espectral y el diseño de filtros (para más
información de antecedentes, consulte http: / / en. wikipedia. org / wiki / función Window_). los
La ventana del vagón es una ventana rectangular con la siguiente fórmula:

w (n) = 1

La ventana triangular tiene forma de triángulo y tiene la siguiente fórmula:

Aquí, L puede ser igual a norte, norte+1, o norte–1.

Si el valor de L es norte–1, se conoce como ventana de Bartlett y tiene la siguiente fórmula:

En el pandas módulo, el DataFrame.rolling () La función proporciona la misma funcionalidad


utilizando la win_type parámetro para diferentes funciones de ventana. Otro parámetro es la
ventana para definir el tamaño de la ventana, que es fácil de configurar como se muestra en la
sección anterior. Usemos elwin_type parámetro y pruebe diferentes funciones de ventana:

# importar bibliotecas necesarias


importar pandas como pd
importar statsmodels.api como sm
importar matplotlib.pyplot como plt

[242]
Procesamiento de señales y series de tiempo Capítulo 8

# Leer conjunto de datos


sales_data = pd.read_csv ('sales.csv', index_col = "Hora")

# Aplicar todas las ventanas en DataFrame dado


sales_data ['boxcar'] = sales_data.Sales.rolling (3, win_type = 'boxcar'). mean () sales_data ['triang'] =
sales_data.Sales.rolling (3, win_type = 'triang'). mean () sales_data ['hamming'] =
sales_data.Sales.rolling (3, win_type
= 'hamming'). mean ()
sales_data ['blackman'] = sales_data.Sales.rolling (3, win_type = 'blackman').
mean ()

# Trace la media móvil de todas las ventanas


sales_data.plot (kind = 'line', figsize = (10,6))

Esto da como resultado la siguiente salida:

En el bloque de código anterior, hemos trazado la media móvil para diferentes funciones de ventana,
como la ventana de vagón, triangular, hamming y Blackman, usando elwin_type parámetro en el
laminación() función. Ahora, aprendamos cómo encontrar una correlación entre dos series de tiempo
usando la cointegración.

[243]
Procesamiento de señales y series de tiempo Capítulo 8

Definición de cointegración
La cointegración es como una correlación que puede verse como una métrica superior para definir la relación
de dos series de tiempo. La cointegración es el comportamiento estacionario de la combinación lineal de dos
series de tiempo. De esta forma, la tendencia de la siguiente ecuación debe ser estacionaria:

y (t) - ax (t)

Piense en un hombre borracho y su perro paseando. La correlación nos dice si van en la misma dirección.
La cointegración nos dice algo sobre la distancia en el tiempo entre el hombre y su perro. Mostraremos la
cointegración utilizando series de tiempo generadas aleatoriamente y datos reales. losDickey-Fuller
aumentado (ADF) prueba pruebas para una raíz unitaria en una serie de tiempo y se puede utilizar para
determinar la estacionariedad de series de tiempo.

Veamos un ejemplo para entender la cointegración de dos series temporales.

Puede consultar el código completo para este ejemplo en el siguiente enlace de GitHub: https: / /
github. com / PacktPublishing / Python- Análisis de datos- Tercera edición / blob / master /
Chapter08 / Ch8. ipynb.

Comencemos con la demostración de cointegración:

1. Importe las bibliotecas necesarias y defina la siguiente función para calcular la


estadística ADF:

# Importar biblioteca requerida


importar statsmodels.api como sm
importar pandas como pd
importar statsmodels.tsa.stattools como ts
importar numpy como np

# Calcular la función ADF


def calc_adf (x, y):
resultado = sm.OLS (x, y) .fit () return
ts.adfuller (result.resid)

2. Cargue los datos de Sunspot en una matriz NumPy:

# Leer el conjunto de datos


data = sm.datasets.sunspots.load_pandas (). data.values N = len (datos)

[244]
Procesamiento de señales y series de tiempo Capítulo 8

3. Genere una onda sinusoidal y calcule la cointegración del seno consigo mismo:

# Cree una onda sinusoidal y aplique la prueba ADF


t = np.linspace (-2 * np.pi, 2 * np.pi, N) seno = np.sin
(np.sin (t))
print ("AutoADF", calc_adf (seno, seno))

El código debe imprimir lo siguiente:

ADF automático (-5.0383000037165746e-16, 0.95853208606005591, 0, 308, {'5%':


-2.8709700936076912, '1%': -3.4517611601803702, '10% ':
- 2.5717944160060719}, -21533.113655477719)

En los resultados impresos, el primer valor representa la métrica ADF y el segundo valor
representa el valor p. Como puede ver, el valor p es muy alto. Los siguientes valores son el
retraso y el tamaño de la muestra. El diccionario al final proporciona los valores de distribución
t para este tamaño de muestra exacto.

4. Ahora, agregue ruido al seno para demostrar cómo influirá el ruido en la señal:

# Aplique la prueba ADF en seno y seno con ruido


ruido = np.random.normal (0, .01, N)
print ("ADF seno con ruido", calc_adf (seno, seno + ruido))

Con el ruido obtenemos los siguientes resultados:

ADF sinusoidal con ruido (-7.4535502402193075, 5.5885761455106898e- 11,


3, 305, {'5%': -2.8710633193086648, '1%': -3.4519735736206991, '10% ':
-2.5718441306100512}, -1855.0243977703672)

El valor p se ha reducido considerablemente. La métrica ADF aquí, -7,45, es menor que todos
los valores críticos del diccionario. Todos estos son argumentos sólidos para rechazar la
cointegración.

5. Generemos un coseno de mayor magnitud y desplazamiento. Nuevamente, agreguemos ruido:

# Aplique la prueba ADF en seno y coseno con ruido


coseno = 100 * np.cos (t) + 10

print ("ADF seno vs coseno con ruido", calc_adf (seno, coseno + ruido))

[245]
Procesamiento de señales y series de tiempo Capítulo 8

Se imprimen los siguientes valores:

ADF seno vs coseno con ruido (-17,927224617871534,


2.8918612252729532e-30, 16, 292, {'5%': -2.8714895534256861, '1%':
- 3.4529449243622383, '10% ': -2.5720714378870331},
- 11017.837238220782)

Del mismo modo, tenemos sólidos argumentos para rechazar la cointegración. La comprobación
de la cointegración entre el seno y las manchas solares da el siguiente resultado:

print ("Seno vs manchas solares", calc_adf (seno, datos))

Se imprimen los siguientes valores:

Seno vs manchas solares (-6.7242691810701016, 3.4210811915549028e-09, 16, 292,

{'5%': -2.8714895534256861, '1%': -3.4529449243622383, '10% ':


-2.5720714378870331}, -1102.5867415291168)

Los niveles de confianza son aproximadamente los mismos para los pares utilizados
aquí porque dependen del número de puntos de datos, que no varía mucho. El
resultado se resume en la siguiente tabla:

Par Valor p estadístico 5% 1% 10% Rechazo


Seno con uno mismo - 5.03E-16 0.95 - 2,87 -3,45 -2,57 No
Seno versus seno con ruido Seno - 7,45 5.58E-11 -2.87 -3.45 -2.57 Sí
versus coseno con ruido Seno - 17,92 2.89E-30 -2.87 -3.45 -2.57 Sí
versus manchas solares - 6,72 3,42E-09 -2,87 -3,45 -2,57 Sí

En la tabla anterior, se resumen los resultados para las cuatro ondas sinusoidales y se discute
su nivel de significancia con rechazo / aceptación. Pasemos ahora a otro tema importante del
capítulo, que es la descomposición STL de cualquier serie temporal.

Descomposición STL
STL representa Descomposición estacional y de tendencias usando LOESS. STL es un método de
descomposición de series de tiempo que puede descomponer una señal observada en una tendencia,
estacionalidad y residual. Puede estimar relaciones no lineales y manejar cualquier tipo de estacionalidad.
los statsmodels.tsa.seasonal subpaquete ofrece el estacional_decomponer método
para dividir una señal de entrada dada en tendencia, estacionalidad y residual.

[246]
Procesamiento de señales y series de tiempo Capítulo 8

Veamos el siguiente ejemplo para comprender la descomposición de STL:

# importar bibliotecas necesarias


importar pandas como pd
importar matplotlib.pyplot como plt
de statsmodels.tsa.seasonal import season_decompose

# Leer el conjunto de datos


data = pd.read_csv ('beer_production.csv') data.columns
= ['fecha', 'datos']

# Cambiar el tipo de datos a pandas datetime


datos ['fecha'] = pd.to_datetime (datos ['fecha']) datos =
datos.set_index ('fecha')

# Descomponer los datos


descomposed_data = estacional_decompose (datos, modelo = 'multiplicativo')

# Trazar datos descompuestos


descomposed_data.plot ()

# Mostrar la trama
plt.show ()

Esto da como resultado la siguiente salida:

[247]
Procesamiento de señales y series de tiempo Capítulo 8

En el bloque de código anterior, la señal de serie de tiempo dada se descompone en


componentes tendenciales, estacionales y residuales usando el descomposición_estacional ()
función de la statsmodels módulo. Pasemos ahora a la autocorrelación para comprender la
relación entre una serie temporal y su serie rezagada.

Autocorrelación
La autocorrelación, o correlación rezagada, es la correlación entre una serie de tiempo y su serie
rezagada. Indica la tendencia en el conjunto de datos. La fórmula de autocorrelación se puede definir de
la siguiente manera:

Podemos calcular la autocorrelación usando el NumPy correlación() función para calcular la


autocorrelación real de los ciclos de manchas solares. También podemos visualizar directamente la
gráfica de autocorrelación usando elautocorrelation_plot () función. Calculemos la autocorrelación y
visualicémosla:

# importar bibliotecas necesarias


importar pandas como pd
importar numpy como np
importar statsmodels.api como sm
importar matplotlib.pyplot como plt

# Leer el conjunto de datos


datos = sm.datasets.sunspots.load_pandas (). datos

# Calcule la autocorrelación usando numpy


dy = datos.SUNACTIVIDAD - np.mean (datos.SUNACTIVIDAD)
dy_square = np.sum (dy ** 2)

# Correlación cruzada
sun_correlated = np.correlate (dy, dy, mode = 'full') / dy_square resultado =
sun_correlated [int (len (sun_correlated) / 2):]

# Muestra el gráfico
plt.plot (resultado)

# Mostrar cuadrícula
plt.grid (verdadero)

[248]
Procesamiento de señales y series de tiempo Capítulo 8

# Agregar etiquetas
plt.xlabel ("Retraso")

plt.ylabel ("Autocorrelación")
# Mostrar el gráfico
plt.show ()

Esto da como resultado la siguiente salida:

En el bloque de código anterior, hemos visto un ejemplo de autocorrelación usando el módulo


NumPy. Calculemos la gráfica de autocorrelación producida porpandas:

de pandas.plotting import autocorrelation_plot

# Trazar usando la función pandas


autocorrelation_plot (datos.SUNACTIVIDAD)

[249]
Procesamiento de señales y series de tiempo Capítulo 8

Esto da como resultado la siguiente salida:

En el bloque de código anterior, hemos producido una gráfica de autocorrelación usando el


autocorrelation_plot () función de la pandas Biblioteca. Es más fácil dibujar la gráfica de autocorrelación
usando elpandas biblioteca en comparación con la biblioteca NumPy. Pasemos ahora a modelos
autorregresivos para la predicción de series de tiempo.

Modelos autorregresivos
Los modelos autorregresivos son modelos de series de tiempo que se utilizan para predecir incidentes
futuros. La siguiente fórmula muestra esto:

En la fórmula anterior, C es una constante y el último término es un componente aleatorio, también


conocido como ruido blanco.

[250]
Procesamiento de señales y series de tiempo Capítulo 8

Construyamos el modelo de autorregresión usando el statsmodels.tsa subpaquete:

1. Importe las bibliotecas y lea el conjunto de datos:

# importar bibliotecas necesarias


de statsmodels.tsa.ar_model import AR
de sklearn.metrics importar mean_absolute_error de
sklearn.metrics importar mean_squared_error importar
matplotlib.pyplot como plt
importar statsmodels.api como sm
desde math import sqrt

# Leer el conjunto de datos


datos = sm.datasets.sunspots.load_pandas (). datos

2. Divida los datos de Sunspot en trenes y conjuntos de prueba:

# Dividir datos en tren y conjunto de prueba


train_ratio = 0.8

train = data [: int (train_ratio * len (data))] test = data


[int (train_ratio * len (data)):]

3. Entrene y ajuste el modelo autorregresivo:

# Entrenamiento del modelo de autorregresión


ar_model = AR (tren.SUNACTIVIDAD)
ar_model = ar_model.fit ()

# imprimir retrasos y
print ("Número de retrasos:", ar_model.k_ar) print ("Coeficientes
del modelo: \ n", ar_model.params)

Esto da como resultado la siguiente salida:

Número de retrasos: 15
Coeficientes del modelo:
constante 9.382322
L1.SUNACTIVIDAD 1.225684
L2.SUNACTIVIDAD - 0.512193
L3.SUNACTIVIDAD - 0.130695
L4.SUNACTIVIDAD 0.193492
L5.SUNACTIVIDAD - 0.168907
L6.SUNACTIVIDAD 0.054594
L7.SUNACTIVIDAD - 0.056725
L8.SUNACTIVIDAD 0.109404
L9.SUNACTIVIDAD 0.108993
L10.SUNACTIVIDAD -0.117063

[251]
Procesamiento de señales y series de tiempo Capítulo 8

L11.SUNACTIVIDAD 0.200454
L12.SUNACTIVIDAD -0.075111
L13.SUNACTIVIDAD -0.114437
L14.SUNACTIVIDAD 0.177516
L15.SUNACTIVIDAD -0.091978
dtipo: float64

En el código anterior, hemos leído el conjunto de datos de Sunspot y lo hemos dividido en dos partes:
conjuntos de entrenamiento y de prueba. Luego, construimos el modelo autorregresivo creando una
instancia y ajustando un modelo. Hagamos predicciones y evaluemos el rendimiento del modelo.

4. Realice predicciones y evalúe el modelo:

# hacer predicciones
start_point = len (tren)
punto_final = punto_inicio + len (prueba) -1
pred = ar_model.predict (start = start_point, end = end_point, dynamic =
False)

# Calcular errores
mae = mean_absolute_error (test.SUNACTIVITY, pred) mse =
mean_squared_error (test.SUNACTIVITY, pred) rmse = sqrt (mse)

imprimir ("MAE:", mae)


imprimir ("MSE:", mse)
imprimir ("RMSE:", rmse)

Esto da como resultado la siguiente salida:

MAE: 31.17846098350052
MSE: 1776.9463826165913
RMSE: 42.15384184883498

En el bloque de código anterior, hicimos las predicciones en el conjunto de datos de


prueba y evaluamos el rendimiento del modelo usando Error absoluto medio (MAE),
Error medio cuadrado (MSE), y Error cuadrático medio (RMSE). Tracemos la gráfica
lineal de la serie original y la serie de predicción.

5. Grafiquemos la serie original y la predicha para comprender mejor los resultados del
pronóstico:

# Configuración del tamaño de la figura


plt.figure (figsize = (10,6))

# Trazar datos de prueba


plt.plot (test.SUNACTIVITY, label = 'Original-Series')

[252]
Procesamiento de señales y series de tiempo Capítulo 8

# Plotear predicciones
plt.plot (pred, color = 'red', label = 'Predicted Series')

# Agregar leyendas
plt.legend ()

# Mostrar la trama
plt.show ()

Esto da como resultado la siguiente salida:

En la gráfica anterior, podemos ver la serie original y la serie predicha usando el modelo
autorregresivo. Después de generar el modelo autorregresivo, necesitamos saltar a un enfoque
más avanzado para la predicción de series de tiempo, que esMedia móvil autorregresiva (ARMA).

[253]
Procesamiento de señales y series de tiempo Capítulo 8

Modelos ARMA
El modelo ARMA combina autorregresión y medias móviles. El modelo ARMA se conoce
comúnmente como ARMA (pag,q), dónde pag es el orden de la parte autorregresiva, y qes el
orden de la media móvil:

En la fórmula anterior, al igual que en la fórmula del modelo autorregresivo, tenemos un componente constante
y uno de ruido blanco; sin embargo, también intentamos ajustar los componentes de ruido retrasados:

1. Importe las bibliotecas y lea el conjunto de datos:

# importar bibliotecas necesarias


importar statsmodels.api como sm
de statsmodels.tsa.arima_model importar ARMA de
sklearn.metrics importar mean_absolute_error de
sklearn.metrics importar mean_squared_error importar
matplotlib.pyplot como plt
desde la raíz cuadrada de importación matemática

# Leer el conjunto de datos


data = sm.datasets.sunspots.load_pandas (). data data.drop
('YEAR', axis = 1, inplace = True)

2. Divida los datos de Sunspot en trenes y conjuntos de prueba:

# Dividir datos en tren y conjunto de prueba


train_ratio = 0.8
train = data [: int (train_ratio * len (data))] test = data
[int (train_ratio * len (data)):]

3. Entrene y ajuste el modelo autorregresivo:

# Entrenamiento del modelo de autorregresión


arma_model = ARMA (tren, orden = (10,1))
arma_model = arma_model.fit ()

[254]
Procesamiento de señales y series de tiempo Capítulo 8

4. Realice predicciones y evalúe el modelo:

# hacer predicciones
start_point = len (tren)
punto_final = punto_inicio + len (prueba) -1
pred = arma_model.predict (punto_inicio, punto_final)

# Calcular errores
mae = mean_absolute_error (test.SUNACTIVITY, pred) mse =
mean_squared_error (test.SUNACTIVITY, pred) rmse = sqrt (mse)

imprimir ("MAE:", mae)


imprimir ("MSE:", mse)
imprimir ("EMSE:", rmse)

Esto da como resultado la siguiente salida:

MAE: 33.95457845540467
MSE: 2041.3857010355755
EMSE: 45.18169652675268

5. Grafiquemos la serie original y la predicha para comprender mejor los resultados del
pronóstico:

# Configuración del tamaño de la figura


plt.figure (figsize = (10,6))

# Trazar datos de prueba


plt.plot (prueba, etiqueta = 'Serie original')

# Plotear predicciones
plt.plot (pred, color = 'red', label = 'Predicted Series')

# Agregar leyendas
plt.legend ()

# Mostrar la trama
plt.show ()

[255]
Procesamiento de señales y series de tiempo Capítulo 8

Esto da como resultado la siguiente salida:

En el código anterior, hemos leído el conjunto de datos de Sunspot y lo hemos dividido en dos partes:
conjuntos de entrenamiento y de prueba. Luego, construimos el modelo ARMA creando una instancia y
ajustando un modelo. Hicimos las predicciones en el conjunto de datos de prueba y evaluamos el rendimiento
del modelo utilizando MAE, MSE y RMSE. Finalmente, vimos el diagrama de líneas para la serie original y la serie
de predicción. Pasemos a un tema más importante, que es la generación de señales periódicas.

[256]
Procesamiento de señales y series de tiempo Capítulo 8

Generando señales periódicas


Muchos fenómenos naturales son regulares y confiables, como un reloj preciso. Algunos fenómenos
exhiben patrones que parecen regulares. Un grupo de científicos encontró tres ciclos en la actividad de
las manchas solares con la transformada de Hilbert-Huang (verhttps: / / en. wikipedia. org /
wiki / Hilbert% E2% 80% 93 Transformada Huang_). Los ciclos tienen una duración de 11, 22 y 100
años, aproximadamente. Normalmente, simularíamos una señal periódica usando funciones trigonométricas
como una función sinusoidal. Probablemente recuerde un poco de trigonometría de la escuela secundaria. Eso
es todo lo que necesitamos para este ejemplo. Dado que tenemos tres ciclos, parece razonable crear un modelo
que sea una combinación lineal de tres funciones sinusoidales. Esto solo requiere un pequeño ajuste del código
para el modelo autorregresivo:

1. Cree funciones de modelo, error y ajuste:

# Importar bibliotecas requeridas


importar numpy como np
importar statsmodels.api como sm
desde scipy.optimize import leastsq import
matplotlib.pyplot as plt

# Crear función de modelo


def modelo (p, t):
C, p1, f1, phi1, p2, f2, phi2, p3, f3, phi3 = p
return C + p1 * np.sin (f1 * t + phi1) + p2 * np.sin (f2 * t + phi2) + p3 * np.sin (f3 * t
+ phi3)

# Crear función de error


def error (p, y, t):
return y - modelo (p, t)

# Crear función de ajuste


def ajuste (y, t):
p0 = [y.mean (), 0, 2 * np.pi / 11, 0, 0, 2 * np.pi / 22, 0, 0, 2 * np.pi / 100, 0]

params = leastsq (error, p0, args = (y, t)) [0] return params

2. Carguemos el conjunto de datos:

# Cargar el conjunto de datos


data_loader = sm.datasets.sunspots.load_pandas () sunspots =
data_loader.data ["SUNACTIVITY"]. valores años = data_loader.data
["YEAR"]. valores

[257]
Procesamiento de señales y series de tiempo Capítulo 8

3. Aplicar y ajustar el modelo:

# Aplicar y ajustar el modelo


cutoff = int (.9 * len (manchas solares))
params = fit (manchas solares [: corte], años [: corte]) print
("Params", params)

pred = modelo (parámetros, años [corte:]) actual


= manchas solares [corte:]

4. Imprima los resultados:

print ("Error cuadrático medio", np.sqrt (np.mean ((actual - pred) **


2)))
print ("Error absoluto medio", np.mean (np.abs (actual - pred))) print ("Error
porcentual absoluto medio", 100 *
np.mean (np.abs (actual - pred) / actual)) mid =
(actual + pred) / 2
print ("Error porcentual absoluto medio simétrico", 100 *
np.mean (np.abs (actual - pred) / mid)) print ("Coeficiente de
determinación", 1 - ((real - pred)
* * 2) .sum () / ((real - actual.media ()) ** 2) .sum ())

Esto da como resultado la siguiente salida:

Parámetros [47.1880006 28.89947462 0.56827279 6.51178464 4.55214564


0,29372076 -14,30924768 -18,16524123 0,06574835
- 4.37789476]
Error cuadrático medio 59,56205597915569 Error
absoluto medio 44,58158470150657
Error porcentual absoluto medio 65,16458348768887 Error porcentual
absoluto medio simétrico 78,4480696873044 Coeficiente de
determinación -0,3635315489903188

La primera línea muestra los coeficientes del modelo que intentamos. Tenemos un MAE de 44, lo que
significa que, en promedio, estamos fuera de esa cantidad en cualquier dirección. También
queremos que el coeficiente de determinación sea lo más cercano posible a 1 para tener un buen
ajuste. En cambio, obtenemos un valor negativo, que no es deseable. Creemos un gráfico para
comprender los resultados en detalle.

5. Trace la serie original y predicha:

rango_año = cargador_datos.data ["AÑO"]. valores [corte:]

# Trace los puntos de datos reales y previstos


plt.plot (rango_año, actual, 'o', label = "Manchas solares") plt.plot
(rango_año, pred, 'x', label = "Predicción") plt.grid (Verdadero)

[258]
Procesamiento de señales y series de tiempo Capítulo 8

# Agregar etiquetas
plt.xlabel ("AÑO")
plt.ylabel ("SUNACTIVIDAD")

# Agregar leyenda
plt.legend ()

# Mostrar el gráfico
plt.show ()

Esto da como resultado la siguiente salida:

Del gráfico anterior, podemos concluir que el modelo no puede capturar el patrón real de la serie. Es
por eso que obtenemos un coeficiente de determinación negativo o R cuadrado. Ahora, veremos
otra técnica importante para el análisis de series de tiempo, el análisis de Fourier.

análisis de Fourier
El análisis de Fourier utiliza el concepto de serie de Fourier ideado por el matemático Joseph Fourier. La
serie de Fourier es un método matemático utilizado para representar funciones como una serie infinita
de términos de seno y coseno. Las funciones en cuestión pueden ser de valor real o complejo:

[259]
Procesamiento de señales y series de tiempo Capítulo 8

Para el análisis de Fourier, el algoritmo más competente es Transformada rápida de Fourier (FFT). FFT
descompone una señal en señales de diferentes frecuencias. Esto significa que produce un espectro de
frecuencia de una señal determinada. Las bibliotecas SciPy y NumPy proporcionan funciones para FFT.

los rfft () La función realiza FFT en datos de valor real. También podríamos haber utilizado elfft ()
función, pero da una advertencia en este conjunto de datos de Sunspot. losfftshift () La función
mueve el componente de frecuencia cero a la mitad del espectro.

Veamos el siguiente ejemplo para entender FFT:

1. Importe las bibliotecas y lea el conjunto de datos:

# Importar biblioteca requerida


importar numpy como np
importar statsmodels.api como sm importar
matplotlib.pyplot como plt desde scipy.fftpack
importar rfft desde scipy.fftpack importar
fftshift

# Leer el conjunto de datos


datos = sm.datasets.sunspots.load_pandas (). datos

# Crear onda sinusoidal


t = np.linspace (-2 * np.pi, 2 * np.pi, len
(data.SUNACTIVITY.values))
mid = np.ptp (data.SUNACTIVITY.values) / 2 seno =
medio + medio * np.sin (np.sin (t))

2. Calcule la FFT para ondas sinusoidales y manchas solares:

# Calcular FFT para onda sinusoidal


sine_fft = np.abs (fftshift (rfft (seno)))
print ("Índice de FFT de seno máximo", np.argsort (sine_fft) [- 5:])

# Calcular FFT para el conjunto de datos de manchas solares


transform = np.abs (fftshift (rfft (data.SUNACTIVITY.values))) print ("Índices de máxima
FFT de manchas solares", np.argsort (transformado) [- 5:])

3. Cree las subtramas:

# Crear subtramas
fig, axs = plt.subplots (3, figsize = (12,6), sharex = True) fig.suptitle
('Power Specturm')
axs [0] .plot (data.SUNACTIVITY.values, label = "Manchas solares") axs
[0] .plot (sine, lw = 2, label = "Sine")
axs [0] .legend () # Establecer leyendas axs [1] .plot (transformado, etiqueta =
"Manchas solares transformadas")

[260]
Procesamiento de señales y series de tiempo Capítulo 8

axs [1] .legend () # Establecer leyendas axs [2] .plot (sine_fft, lw = 2, label
= "Transformed Sine") axs [2] .legend () # Establecer leyendas

# Mostrar el gráfico
plt.show ()

Esto da como resultado la siguiente salida:

En el código anterior, primero leemos el conjunto de datos de Sunspot y creamos la onda sinusoidal. Después de
eso, calculamos la FFT para la onda sinusoidal y laSUNACTIVIDAD columna. Finalmente, trazamos los tres gráficos
para la serie original y la onda sinusoidal y las manchas solares y la onda sinusoidal transformadas.

[261]
Procesamiento de señales y series de tiempo Capítulo 8

Filtrado de análisis espectral


En la sección anterior, discutimos el espectro de amplitud del conjunto de datos. Ahora es el momento de
explorar el espectro de potencia. El espectro de potencia de cualquier señal física puede mostrar la
distribución de energía de la señal. Podemos cambiar fácilmente el código y mostrar el espectro de
potencia cuadrando la señal transformada usando la siguiente sintaxis:

plt.plot (transformado ** 2, label = "Power Spectrum")

También podemos trazar el espectro de fase usando la siguiente sintaxis de Python:

plt.plot (np.angle (transformado), label = "Phase Spectrum")

Veamos el código completo para el espectro de fase y potencia del conjunto de datos Sunspot:

1. Importe las bibliotecas y lea el conjunto de datos:

# Importar biblioteca requerida


importar numpy como np
importar statsmodels.api como sm desde
scipy.fftpack importar rfft desde scipy.fftpack
importar fftshift importar matplotlib.pyplot
como plt

# Leer el conjunto de datos


datos = sm.datasets.sunspots.load_pandas (). datos

2. Calcular FFT, espectro, y Fase:

# Calcular FFT
transformado = fftshift (rfft (datos.SUNACTIVIDAD.valores))

# Espectro de potencia de cómputo


potencia = transformado ** 2

# Fase de cálculo
fase = np.angle (transformado)

3. Cree la subtrama:

# Crear subtramas
fig, axs = plt.subplots (3, figsize = (12,6), sharex = True) fig.suptitle
('Power Specturm')
axs [0] .plot (data.SUNACTIVITY.values, label = "Manchas solares") axs
[0] .legend () # Establecer leyendas
axs [1] .plot (power, label = "Power Spectrum") axs
[1] .legend () # Establecer leyendas

[262]
Procesamiento de señales y series de tiempo Capítulo 8

axs [2] .plot (phase, label = "Phase Spectrum") axs


[2] .legend () # Establecer leyendas

# Mostrar el gráfico
plt.show ()

Esto da como resultado la siguiente salida:

En el código anterior, primero leemos el conjunto de datos de Sunspot y calculamos la FFT para el
SUNACTIVIDAD columna. Después de esto, calculamos la potencia y el espectro de fase para la FFT
transformada. Finalmente, trazamos las tres gráficas para la serie original y los espectros de fase y
potencia usando subparcelas.

[263]
Procesamiento de señales y series de tiempo Capítulo 8

Resumen
En este capítulo, los ejemplos de series de tiempo que usamos fueron datos de ciclos anuales de manchas
solares, datos de ventas y producción de cerveza. Aprendimos que es común intentar derivar una relación entre
un valor y otro punto de datos o una combinación de puntos de datos con un número fijo de períodos en el
pasado en la misma serie de tiempo. Aprendimos cómo los promedios móviles convierten la tendencia de
variación aleatoria en una tendencia suave usando un tamaño de ventana. Aprendimos como el
DataFrame.rolling () la función proporciona win_type parámetros de cadena para diferentes funciones de ventana.
La cointegración es similar a la correlación y es una métrica para definir la relación de dos series de tiempo.
También nos centramos en la descomposición de STL, la autocorrelación, la autorregresión, el modelo ARMA, el
análisis de Fourier y el filtrado del análisis espectral.

El próximo capítulo, Capítulo 9, Aprendizaje supervisado: análisis de regresión, se centrará en los temas
importantes del análisis de regresión y la regresión logística en Python. El capítulo comienza con
regresión lineal múltiple, multicolinealidad, variables ficticias y medidas de evaluación del modelo. En las
últimas secciones del capítulo, la atención se centrará en la regresión logística.

[264]
Sección 3: Profundización en
-
Aprendizaje automático
El principal objetivo de esta sección es profundizar en los algoritmos de aprendizaje automático y
desarrollar modelos predictivos. Esta sección se centra en los métodos de regresión, clasificación,
PCA y agrupación. Esta sección utilizará principalmente pandas y scikit-learn.

Esta sección incluye los siguientes capítulos:

Capítulo 9, Aprendizaje supervisado: análisis de regresiónCapítulo 10,


Aprendizaje supervisado: técnicas de clasificaciónCapítulo 11,
Aprendizaje no supervisado: PCA y agrupación en clústeres
Aprendizaje supervisado -
-
Análisis de regresión
La regresión es el algoritmo más popular en estadística y aprendizaje automático. En el campo del aprendizaje
automático y la ciencia de datos, el análisis de regresión es un miembro del dominio de aprendizaje automático
supervisado que nos ayuda a predecir variables continuas como los precios de las acciones, los precios de la vivienda, las
ventas, las precipitaciones y la temperatura. Como gerente de ventas en una tienda de electrónica, por ejemplo, diga
que necesita predecir las ventas de las próximas semanas para todo tipo de productos, como televisores,
acondicionadores de aire, computadoras portátiles, refrigeradores y muchos más. Muchos factores pueden afectar sus
ventas, como las condiciones climáticas, los festivales, la estrategia de promoción, las ofertas de la competencia, etc. El
análisis de regresión es una de las herramientas que puede ayudarlo a identificar la importancia de factores que son
importantes para tomar decisiones en la tienda.

El análisis de regresión identifica cómo la variable dependiente depende de las variables independientes.
Por ejemplo, digamos que, como funcionario de educación, desea identificar el impacto de las actividades
deportivas, las clases inteligentes, la proporción maestro-alumno, las clases adicionales y la capacitación
de los maestros en los resultados de los estudiantes.Mínimo cuadrado ordinario (OLS) minimiza el error
de la suma de cuadrados (o varianza del error) para encontrar la función de mejor ajuste. Predice el
resultado más probable en las condiciones dadas. El principal objetivo de este capítulo es aprender los
fundamentos deRegresión lineal múltiple (MLR), multicolinealidad, variables ficticias, regresión y
medidas de evaluación del modelo como R-cuadrado, Error medio cuadrado (MSE), Error absoluto medio
(MAE), y Error cuadrático medio (RMSE). Otro objetivo es crear un modelo de clasificación de regresión
logística.

Los temas cubiertos en este capítulo se enumeran a continuación:

Regresión lineal
Comprender las variables ficticias de
multicolinealidad
Desarrollar un modelo de regresión lineal
Evaluar el desempeño del modelo de regresión
Aprendizaje supervisado: análisis de regresión Capítulo 9

Ajuste de modelos de regresión de


regresión polinomial para clasificación
Regresión logística
Implementando regresión logística usando scikit-learn

Requerimientos técnicos
Este capítulo tiene los siguientes requisitos técnicos:

Puede encontrar el código y los conjuntos de datos en el siguiente enlace de GitHub: https: / /
github. com / PacktPublishing / Python- Análisis de datos- Tercera edición / tree / master /
Chapter09.
Todos los bloques de código están disponibles en el ch9.ipynb expediente.

Este capítulo utiliza tres archivos CSV (Advertising.csv, bloodpress.txt,y


diabetes.csv) con fines de práctica.
En este capítulo, usaremos Matplotlib, pandas Bibliotecas Python de Seaborn y
scikit-learn.

Regresión lineal
La regresión lineal es una especie de algoritmo de predicción y ajuste de curvas. Se utiliza para descubrir la
asociación lineal entre una columna dependiente (o objetivo) y una o más columnas independientes (o variables
predictoras). Esta relación es determinista, lo que significa que predice la variable dependiente con cierta
cantidad de error. En el análisis de regresión, la variable dependiente es continua y las variables independientes
de cualquier tipo son continuas o discretas. La regresión lineal se ha aplicado a varios tipos de problemas
comerciales y científicos, por ejemplo, el precio de las acciones, el precio del petróleo crudo, las ventas, el precio
de la propiedad y las predicciones de la tasa de crecimiento del PIB. En el siguiente gráfico, podemos ver cómo la
regresión lineal puede ajustar los datos en un espacio bidimensional:

[267]
Aprendizaje supervisado: análisis de regresión Capítulo 9

El objetivo principal es encontrar la línea de mejor ajuste para comprender la relación entre
variables con mínimo error. El error en la regresión es la diferencia entre los valores pronosticados y
reales. Los coeficientes de regresión se estiman mediante el método MCO. MCO intenta minimizar la
suma de cuadrados de los residuos. Veamos la ecuación del modelo de regresión:

Aquí, X es la variable independiente y y es una variable dependiente. coeficiente las X, y (la letrason
deintersecciones griega
las
pronunciada como épsilon) es un término de error que actuará como una variable aleatoria.

Los parámetros de regresión lineal se estiman mediante MCO. MCO es un método que se usa
ampliamente para estimar el intercepto y los coeficientes de regresión. Reduce la suma de
cuadrados de los residuos (o error), que es la diferencia entre lo predicho y lo real.

Después de tener una idea sobre la regresión lineal, ahora es el momento de aprender sobre MLR.

[268]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Regresión lineal múltiple


MLR es una forma generalizada de regresión lineal simple. Es un método estadístico que se utiliza para
predecir la variable objetivo continua en función de múltiples características o variables explicativas. El
principal objetivo de MLR es estimar la relación lineal entre las múltiples características y la variable
objetivo. MLR tiene una amplia variedad de aplicaciones en escenarios de la vida real. El modelo MLR se
puede representar como una ecuación matemática:

Aquí, son las variables independientes y es una variable dependiente.


las intersecciones son coeficientes de X y (la letra griega pronunciada como épsilon) es un error
término que actuará como variable aleatoria.

Ahora que sabemos qué es la regresión lineal, pasemos a la multicolinealidad.

Comprender la multicolinealidad
La multicolinealidad representa las muy altas intercorrelaciones o inter-asociación entre las
variables independientes (o predictoras).

La multicolinealidad tiene lugar cuando las variables independientes del análisis de regresión múltiple
están altamente asociadas entre sí. Esta asociación se debe a una alta correlación entre variables
independientes. Esta alta correlación provocará un problema en los resultados de la predicción del
modelo de regresión lineal. Es el supuesto básico del análisis de regresión lineal para evitar la
multicolinealidad para obtener mejores resultados:

Ocurre por el uso inadecuado de variables ficticias.


También ocurre por la repetición de variables similares.
También se debe a variables sintetizadas de otras variables en los datos. Puede
ocurrir debido a una alta correlación entre variables.

La multicolinealidad provoca los siguientes problemas:

Causa dificultad para estimar los coeficientes de regresión con precisión y los
coeficientes se vuelven más susceptibles a variaciones menores en el modelo.
También puede provocar un cambio en los signos y magnitudes del coeficiente.
Causa dificultad para evaluar la importancia relativa de las variables independientes.

[269]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Eliminar la multicolinealidad
La multicolinealidad se puede detectar mediante lo siguiente:

El coeficiente de correlación (o matriz de correlación) entre variables independientesFactor de


inflación de la varianza (VIF) Valores propios

Los coeficientes de correlación o matrices de correlación nos ayudarán a identificar una alta correlación
entre variables independientes. Usando el coeficiente de correlación, podemos detectar fácilmente la
multicolinealidad al verificar la magnitud del coeficiente de correlación:

# Importar pandas
importar pandas como pd

# Leer el conjunto de datos de presión arterial


data = pd.read_csv ("bloodpress.txt", sep = '\ t')

# Ver los mejores registros en los datos


data.head ()

Esto da como resultado la siguiente salida:

En el bloque de código anterior, leemos el bloodpress.txt datos usando el read_csv ()función. También
verificamos los registros iniciales del conjunto de datos. Este conjunto de datos tieneBP, edad, peso, BSA,
Dur, pulso, y Estrés los campos. Comprobemos la multicolinealidad en el conjunto de datos usando la
matriz de correlación:

# Importar seaborn y matplotlib


importar seaborn como sns
importar matplotlib.pyplot como plt

# Matriz de correlación

[270]
Aprendizaje supervisado: análisis de regresión Capítulo 9

corr = data.corr ()

# Trazar mapa de calor en matriz de correlación


sns.heatmap (corr, annot = True, cmap = 'YlGnBu')

# mostrar la trama
plt.show ()

Esto da como resultado la siguiente salida:

En el ejemplo anterior, estamos encontrando la correlación entre múltiples variables usando la


matriz de correlación. Cargamos elbloodpress.txt archivo y encontró la correlación utilizando el corr
() función. Finalmente, visualizamos la matriz de correlación usando el
mapa de calor() función.

Aquí, BP (Presión arterial) es la variable dependiente o objetivo, y el resto de las columnas son variables
o características independientes. Podemos ver esoPeso y BSA (Área superficial del cuerpo) tienen una
alta correlación. Necesitamos eliminar una variable (ya seaPeso o BSA) para eliminar la multicolinealidad.
En nuestro caso, el peso es más fácil de medir en comparación con BSA, por lo que los expertos elegirán
el peso y quitarán el BSA.

[271]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Variables ficticias
Las variables ficticias son variables categóricas independientes que se utilizan en el análisis de regresión.
También se conoce como variable booleana, indicadora, cualitativa, categórica y binaria. Las variables
ficticias convierten una variable categórica connorte valores distintos en norte–1 variables ficticias. Solo
toma los valores binarios 1 y 0, que son equivalentes a existencia e inexistencia.

pandas ofrece el get_dummies () función para generar los valores ficticios.


Entendamos elget_dummies () función a través de un ejemplo:

# Importar módulo pandas


importar pandas como pd

# Crear marco de datos de pandas


data = pd.DataFrame ({'Género': ['F', 'M', 'M', 'F', 'M']})

# Verifique los 5 mejores registros


data.head ()

Esto da como resultado la siguiente salida:

Género
0 F
1 METRO

2 METRO

3 F
4 METRO

En el bloque de código anterior, hemos creado el DataFrame con el Género columna y


generó la variable ficticia usando la get_dummies () función. Veamos un ejemplo en el
siguiente código:
# Codificación ficticia
encoded_data = pd.get_dummies (data ['Sexo'])

# Verifique los 5 primeros registros del marco de datos


encoded_data.head ()

[272]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Esto da como resultado la siguiente salida:

FM
010
101
201
310
401

Aquí, en el ejemplo anterior, el get_dummies () La función genera dos columnas, lo que


significa una columna separada para cada valor.

Podemos eliminar una columna para evitar la colinealidad usando el drop_first = Verdadero argumento y
soltar primero el norte–1 maniquíes de norte niveles categóricos eliminando el primer nivel:

# Codificación ficticia
encoded_data = pd.get_dummies (data ['Género'], drop_first = True)

# Verifique los 5 primeros registros del marco de datos


encoded_data.head ()

Esto da como resultado la siguiente salida:

METRO

00
11
21
30
41

En el bloque de código anterior, hemos creado las variables ficticias para el Género columna usando
el get_dummies () funcionar con el drop_first = Verdadero parámetro. Esto ha eliminado la primera
columna y dejaNORTE-1 columnas. Aprendamos ahora cómo implementar el modelo de regresión
lineal usando elscikit-learn Biblioteca.

[273]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Desarrollar un modelo de regresión lineal


Después de comprender los conceptos de análisis de regresión, multicolinealidad y variables ficticias, es
hora de adquirir experiencia práctica con el análisis de regresión. Aprendamos a construir el modelo de
regresión usando el kit de herramientas científicas para el aprendizaje automático (scikitlearn):

1. Primero cargaremos el conjunto de datos usando el read_csv () función:

# Importar pandas
importar pandas como pd

# Leer el conjunto de datos usando el método read_csv


df = pd.read_csv ("Publicidad.csv")

# Ver los 5 primeros registros en los datos


df.head ()

Esto da como resultado la siguiente salida:

Ahora que hemos cargado el Advertising.csv conjunto de datos usando read_csv () y


verificó los registros iniciales usando el cabeza() función, dividiremos los datos en dos
partes: variable dependiente o objetivo y variables o características independientes.

2. En este paso, dividiremos los datos dos veces:

Dividir en dos partes: variable dependiente o objetivo y variables o


características independientes.
Divida los datos en conjuntos de prueba y entrenamiento. Esto se puede hacer usando el
siguiente código:

# Variables o características independientes

[274]
Aprendizaje supervisado: análisis de regresión Capítulo 9

X = df [['TV', 'Radio', 'Periódico']]

# Variable dependiente o objetivo


y = df. Ventas

Después de dividir las columnas en partes variables dependientes e independientes, dividiremos los
datos en conjuntos de prueba y de tren en una proporción de 75:25 usando
train_test_split (). La relación se puede especificar mediante el test_sizeparámetro y
estado_aleatorio se utiliza como valor inicial para reproducir la misma división de datos
cada vez. Siestado_aleatorio es Ninguno, luego dividirá aleatoriamente los registros cada
vez, lo que dará diferentes medidas de rendimiento:

# Vamos a importar el método train_test_split


de sklearn.model_selection importar train_test_split

# Distribuya las características (X) y las etiquetas (y) en dos partes de entrenamiento
y conjuntos de prueba
X_train, X_test, y_train, y_test = train_test_split (X, y, test_size = 0.25,
random_state = 0)

En el bloque de código anterior, hemos dividido los datos en dos partes (conjuntos de entrenamiento y de
prueba) en una proporción de 75:25 o 3: 1.

3. Vamos a importar el Regresión lineal modelar, crear su objeto y ajustarlo al conjunto de datos
de entrenamiento (Tren_X, tren_y). Después de ajustar el modelo, podemos predecir los
valores de los datos de prueba (X_prueba). Podemos ver la intersección y el coeficiente de la
ecuación de regresión usando el interceptar_ y coef_ atributos:

# Importar modelo de regresión lineal


de sklearn.linear_model import LinearRegression
# Crear modelo de regresión lineal
lin_reg = Regresión lineal ()

# Ajustar el modelo de regresión lineal


lin_reg.fit (X_train, y_train)

# Predecir los valores dados en el conjunto de pruebas


predicciones = lin_reg.predict (X_test)

# Imprime la intersección y los coeficientes


print ("Intercepción:", lin_reg.intercept_) print
("Coeficientes:", lin_reg.coef_)

[275]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Esto da como resultado la siguiente salida:

Intercepción: 2.8925700511511483
Coeficientes: [0.04416235 0.19900368 0.00116268]

En el código anterior, preparamos el modelo de regresión lineal, realizamos las predicciones en


conjuntos de prueba y mostramos las intersecciones y los coeficientes. En la próxima sección,
evaluaremos el desempeño del modelo de regresión utilizando medidas de evaluación del modelo
como R-cuadrado y funciones de error.

Evaluación del rendimiento del modelo de regresión


En esta sección, revisaremos las medidas de evaluación de regresión para comprender el nivel de desempeño de
un modelo de regresión. La evaluación de modelos es uno de los aspectos clave de cualquier proceso de
construcción de modelos de aprendizaje automático. Nos ayuda a evaluar cómo funcionará nuestro modelo
cuando lo pongamos en producción. Usaremos las siguientes métricas para la evaluación del modelo:

R-cuadrado
MSE
MAE
RMSE

R-cuadrado
R cuadrado (o coeficiente de determinación) es una medida de evaluación del modelo estadístico que evalúa la
bondad de un modelo de regresión. Ayuda a los analistas de datos a explicar el rendimiento del modelo en
comparación con el modelo base. Su valor se encuentra entre 0 y 1. Un valor cercano a 0 representa un modelo
deficiente, mientras que un valor cercano a 1 representa un ajuste perfecto. A veces, R-cuadrado da como
resultado un valor negativo. Esto significa que su modelo es peor que el modelo base promedio. Podemos
explicar R cuadrado usando la siguiente fórmula:

[276]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Entendamos todos los componentes uno por uno:

Regresión de suma de cuadrados (SSR): Esto estima la diferencia entre el


valor pronosticado y la media de los datos.
Suma de errores al cuadrado (SSE): Estima el cambio entre el valor original o
genuino y el valor pronosticado.
Suma total de cuadrados (SST): Este es el cambio entre el valor original o
genuino y la media de los datos.

MSE
MSE es una abreviatura de error cuadrático medio. Se explica como el cuadrado de cambio entre los
valores originales y pronosticados y el promedio entre ellos para todos los valores:

Aquí, es el valor original y es el valor pronosticado.

MAE
MAE es una abreviatura de error absoluto medio. Se explica como el cambio absoluto entre los
valores originales y pronosticados y el promedio entre ellos para todos los valores:

Aquí, está el valor original y es el valor pronosticado.

[277]
Aprendizaje supervisado: análisis de regresión Capítulo 9

RMSE
RMSE es una abreviatura de la raíz del error cuadrático medio. Se explica como la raíz cuadrada de
MSE:

Evaluemos el rendimiento del modelo en un conjunto de datos de prueba. En la sección anterior,


predijimos los valores para el conjunto de prueba. Ahora, compararemos los valores predichos con los
valores reales del conjunto de prueba (y_prueba). scikit-learn ofrece la métrica clase para evaluar los
modelos. Para la evaluación del modelo de regresión, tenemos métodos para R-cuadrado, MSE, MAE y
RMSE. Cada uno de los métodos toma dos entradas: los valores reales del conjunto de prueba y los
valores predichos (y_test y y_pred). Evaluemos el desempeño del modelo de regresión lineal:

# Importar las bibliotecas requeridas


importar numpy como np
de sklearn.metrics importar mean_absolute_error de
sklearn.metrics importar mean_squared_error de
sklearn.metrics importar r2_score

# Evaluar el error absoluto medio


print ('Mean Absolute Error (MAE):', mean_absolute_error (y_test, predictions))

# Evaluar el error cuadrático medio


print ("Error cuadrático medio (MSE):", error_medio_cuadrado (prueba_y, predicciones))

# Evaluar el error cuadrático medio de la raíz


print ("Root Mean Squared Error (RMSE):", np.sqrt (mean_squared_error (y_test, predictions)))

# Evaluar R-cuadrado
print ("R-Cuadrado:", r2_score (y_test, predictions))

Esto da como resultado la siguiente salida:

Error absoluto medio (MAE): 1.300032091923545 Error


cuadrático medio (MSE): 4.0124975229171
Error cuadrático medio (RMSE): 2.003121944095541 Cuadrado R:
0.8576396745320893

[278]
Aprendizaje supervisado: análisis de regresión Capítulo 9

En el ejemplo, hemos evaluado el modelo de regresión lineal utilizando MAE, MSE, RMSE y
R-cuadrado. Aquí, R cuadrado es 0,85, lo que indica que el modelo explica el 85% de
variabilidad de los datos.

Ajuste de la regresión polinomial


La regresión polinomial es un tipo de análisis de regresión que se utiliza para adaptar las relaciones no
lineales entre variables dependientes e independientes. En este tipo de regresión, las variables se
modelan comonortegrado de polinomio. Se utiliza para comprender la tasa de crecimiento de varios
fenómenos, como los brotes epidémicos y el crecimiento de las ventas. Entendamos la ecuación de la
regresión polinomial:

Aquí, es la variable independiente y es una variable dependiente. los intercepta, ...

, son un coeficiente de X y (la letra griega pronunciada como épsilon) es un término de error que
actuará como una variable aleatoria.

Veamos un ejemplo para entender en detalle el concepto de polinomio:

# importar bibliotecas
importar matplotlib.pyplot como plt
importar numpy como np

# Crea listas X e Y
X = [1,2,3,4,5,6,7,8,9,10] y =
[9,10,12,16,22,28,40,58,102,200]

# Trazar diagrama de dispersión


plt.scatter (X, y, color = 'rojo') plt.title
('Regresión polinomial') plt.xlabel ('Eje X')

plt.ylabel ('Eje y')

[279]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Esto da como resultado la siguiente salida:

En el código anterior, mostramos un conjunto de datos que tiene una relación polinomial. Veamos cómo
podemos mapear esta relación en el análisis de regresión:

# importar bibliotecas
importar pandas como pd
de sklearn.preprocessing importar PolynomialFeatures de
sklearn.linear_model importar LinearRegression

# Preparar conjunto de datos


data = pd.DataFrame ({"X": [1,2,3,4,5,6,7,8,9,10], "y":
[9,10,12,16,22,28, 40,58,102,200]})

X = datos [['X']] y = datos [['y']]

# Aplicar características polinómicas


polynomial_reg = PolynomialFeatures (grado = 6) X_polynomial
= polyinomial_reg.fit_transform (X)

# Aplicar modelo de regresión lineal


linear_reg = LinearRegression () linear_reg.fit (X_polynomial,
y) predicciones = linear_reg.predict (X_polynomial)

# Graficar los resultados


plt.scatter (X, y, color = 'rojo')

[280]
Aprendizaje supervisado: análisis de regresión Capítulo 9

plt.plot (X, predicciones, color = 'rojo') plt.title


('Regresión polinomial') plt.xlabel ('Eje X')

plt.ylabel ('Eje y')

Esto da como resultado la siguiente salida:

En el código anterior, hemos leído el conjunto de datos de relaciones polinomiales, convertido el X


columna en un polinomio nortecolumna de grado usando PolynomialFeatures (), y luego aplicó
regresión lineal en X_polinomio y etiqueta. La gráfica de salida anterior muestra que el modelo
resultante captura el desempeño. Ahora es el momento de pasar a otro tipo de modelo de
regresión, que se puede utilizar con fines de clasificación.

[281]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Modelos de regresión para clasificación


La clasificación es la técnica más utilizada en el área del aprendizaje automático y estadístico. La mayoría de los problemas de
aprendizaje automático son problemas de clasificación, como la detección de correos electrónicos no deseados, el análisis del
riesgo financiero, el análisis de abandono y el descubrimiento de clientes potenciales.

La clasificación puede ser de dos tipos: clasificación binaria y de clases múltiples. Las variables de
destino de clasificación binaria tienen solo dos valores: 0 y 1 o sí o no. Ejemplos de clasificación
binaria son si un cliente comprará un artículo o no, si el cliente cambiará o abandonará otra marca o
no, detección de spam, predicción de enfermedades y si un solicitante de préstamo incumplirá o no.
La clasificación de clases múltiples tiene más de dos clases, por ejemplo, para categorías de artículos
de noticias, las clases pueden ser deportes, política, negocios y muchas más.

La regresión logística es uno de los métodos de clasificación, aunque su nombre termina con regresión.
Es un método de clasificación de clases binarias de uso común. Es un algoritmo básico de aprendizaje
automático para todo tipo de problemas de clasificación. Encuentra la asociación entre variables
dependientes (o objetivo) y conjuntos de variables independientes (o características). En la siguiente
sección, veremos la regresión logística en detalle.

Regresión logística
La regresión logística es un tipo de algoritmo de aprendizaje automático supervisado que se utiliza para
pronosticar un resultado binario y clasificar las observaciones. Su variable dependiente es una variable
binaria con dos clases: 0 o 1. Por ejemplo, se puede utilizar para detectar si un solicitante de préstamo
incumplirá o no. Es un tipo de regresión único en el que la variable dependiente o objetivo es binaria.
Calcula un logaritmo de la razón de posibilidades de la variable objetivo, que representa la probabilidad de
que ocurra un evento, por ejemplo, la probabilidad de que una persona padezca diabetes.

[282]
Aprendizaje supervisado: análisis de regresión Capítulo 9

La regresión logística es un tipo de regresión lineal simple donde la variable dependiente o objetivo es
categórica. Utiliza la función sigmoidea en el resultado de la predicción de la regresión lineal. También
podemos usar el algoritmo de regresión logística para múltiples clases objetivo. Para problemas de clases
múltiples, se denomina regresión logística multinomial. La regresión logística multinomial es una
modificación de la regresión logística; utiliza la función softmax en lugar de la función de activación
sigmoidea:

La función sigmoidea también se conoce como función logística o curva en forma de S. Traza valores de
entrada entre los rangos 0 y 1, lo que representa la probabilidad de que ocurra un evento. Si la curva se
mueve hacia el infinito positivo, entonces el resultado se convierte en 1 y si la curva se mueve hacia el
infinito negativo, entonces el resultado se convierte en 1. Veamos la fórmula para la función sigmoidea y
la ecuación de regresión logística:

La siguiente fórmula muestra la ecuación de regresión logística:

[283]
Aprendizaje supervisado: análisis de regresión Capítulo 9

El término en el Iniciar sesión() La función se conoce como razón de probabilidades o "probabilidades". La razón de
probabilidades es la razón entre la probabilidad de que ocurra un evento y la probabilidad de que no ocurra un evento.
En el siguiente gráfico, puede ver cómo se comporta la salida de la regresión logística:

Podemos ver que la proporción cae aproximadamente alrededor de 0.5 aquí. Exploremos la regresión logística un
poco más en las próximas subsecciones.

Características del modelo de regresión logística


En esta subsección, nos centraremos en las características básicas y los supuestos de la
regresión logística. Entendamos las siguientes características:

La variable dependiente o objetivo debe ser de naturaleza binaria.


No debe haber multicolinealidad entre variables independientes. Los
coeficientes se estiman utilizando la máxima verosimilitud. La regresión
logística sigue la distribución de Bernoulli.
No hay un R cuadrado para la evaluación del modelo. El modelo se evaluó mediante
concordancia, estadística KS.

[284]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Tipos de algoritmos de regresión logística


Hay varios tipos de algoritmos de regresión logística disponibles para diferentes casos de uso y
escenarios. En esta sección, nos centraremos en la regresión logística binaria, multinomial y
ordinal. Veamos cada uno de ellos y entendamos dónde podemos utilizarlos:

Modelo de regresión logística binaria:

En el modelo de regresión logística binaria, la columna dependiente o objetivo tiene solo


dos valores, como si un préstamo será predeterminado o no, un correo electrónico es
spam o no, o un paciente es diabético o no diabético.

Modelo de regresión logística multinomial:

En un modelo de regresión logística multinomial, una columna dependiente o


objetivo tiene tres o más de tres valores, como predecir la especie de flor de iris
y predecir la categoría de artículos de noticias, como política, negocios y
deportes.

Regresión logística ordinal:

En el modelo de regresión logística ordinal, una variable dependiente tendrá clases


ordinales o de secuencia, como clasificaciones de películas y hoteles.

Ventajas y desventajas de la regresión


logística
El modelo de regresión logística no solo proporciona una predicción (0 o 1), sino que también proporciona las
probabilidades de los resultados, lo que nos ayuda a comprender la confianza de una predicción. Es fácil de
implementar y comprender y es interpretable.

Una gran cantidad de variables independientes aumentará la cantidad de varianza explicada, lo que da como
resultado un sobreajuste del modelo. La regresión logística no puede funcionar con relaciones no lineales.
Tampoco funcionará bien con variables de características altamente correlacionadas (o variables
independientes).

[285]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Implementando regresión logística usando


scikit-learn
Ahora que sabe todo sobre la regresión logística, impleméntelo en Python usando elscikit-learn
Biblioteca. Creemos un modelo usando la clasificación ingenua de Bayes. Lo haremos siguiendo los
siguientes pasos:

1. Primero importaremos el conjunto de datos y las bibliotecas requeridas usando el siguiente


código:

# Importar bibliotecas
importar pandas como pd
# leer el conjunto de datos
diabetes = pd.read_csv ("diabetes.csv")

# Mostrar los 5 mejores registros


diabetes.head ()

Esto da como resultado la siguiente salida:

En nuestro ejemplo anterior, estamos leyendo el conjunto de datos de diabetes de los indios Pima. Este conjunto de datos
no proporciona los nombres de las columnas, por lo que tenemos que hacerlo.

2. En el read_csv () función, pasaremos el encabezado a Ninguno y nombres a la lista


de columnas que se creó antes de leer el archivo CSV:

# Dividir el conjunto de datos en dos partes: conjunto de características y etiqueta de destino


feature_set = ['embarazada', 'insulina', 'bmi', 'edad',
'glucosa', 'bp', 'pedigree']

features = diabetes [feature_set]

target = diabetes.label

[286]
Aprendizaje supervisado: análisis de regresión Capítulo 9

# Partición de datos en un conjunto de pruebas y entrenamiento


de sklearn.model_selection importar train_test_split feature_train, feature_test,
target_train, target_test = train_test_split (features, target, test_size = 0.3, random_state
= 1)

Después de cargar el conjunto de datos, necesitamos dividir el conjunto de datos en características de columna
independientes (conjunto de características) y objetivos de columna dependientes (o etiqueta). Después de esto, el
conjunto de datos se dividirá en conjuntos de entrenamiento y prueba. Ahora, tanto la columna dependiente como
la independiente se dividen en conjuntos de prueba y de entrenamiento (feature_train,
feature_test, target_train, y prueba_objetivo) utilizandotrain_test_split ().
train_test_split ()toma dependiente y
DataFrames independientes, test_size y estado_aleatorio. Aquí, test_size decidirá la relación de la
división de prueba de tren (es decir, una test_size valor de 0,3 significa que el 30% del conjunto
de pruebas y el 70% restante será el conjunto de entrenamiento), yestado_aleatorio se utiliza
como valor inicial para reproducir la misma división de datos cada vez. Siestado_aleatorio es
Ninguno, luego dividirá aleatoriamente los registros cada vez, lo que dará diferentes medidas
de rendimiento:

# importar modelo scikit-learn de regresión logística


desde sklearn.linear_model importar LogisticRegression desde
sklearn.metrics importar precision_score

# instanciar el modelo
logreg = LogisticRegression (solver = 'lbfgs')

# ajustar el modelo con datos


logreg.fit (feature_train, target_train)

# Pronostique la variable objetivo para un conjunto de datos de prueba dado


predicciones = logreg.predict (feature_test)

# Evaluar el desempeño del modelo usando una medida de precisión


print ("Precisión del modelo de regresión logística:", precision_score
(target_test, predictions))

Esto da como resultado la siguiente salida:

Precisión del modelo de regresión logística: 0,7835497835497836

Ahora, estamos listos para crear un modelo de regresión logística. Primero, importaremos elRegresión
logística class y crear su objeto o modelo. Este modelo encajará en el conjunto de datos de
entrenamiento (X_train y y_train). Después del entrenamiento, el modelo está listo para hacer
predicciones usando el predecir() método. scikit-learn'smétrica La clase ofrece varios métodos para la
evaluación del desempeño, como la precisión. lospuntuación_de_precisión () los métodos tomarán
etiquetas reales (y_prueba) y etiquetas predichas (y_pred).

[287]
Aprendizaje supervisado: análisis de regresión Capítulo 9

Resumen
En este capítulo, descubrimos algoritmos de análisis de regresión. Esto lo beneficiará al adquirir una
habilidad importante para el análisis de datos predictivos. Ha adquirido una comprensión de conceptos
tales como análisis de regresión, multicolinealidad, variables ficticias, medidas de evaluación de
regresión y regresión logística. El capítulo comenzó con regresiones lineales y múltiples simples.
Después de regresiones lineales y múltiples simples, nuestro enfoque principal fue la multicolinealidad,
el desarrollo de modelos y las medidas de evaluación de modelos. En secciones posteriores, nos
enfocamos en la regresión logística, características, tipos de regresión y su implementación.

El próximo capítulo, Capítulo 10, Aprendizaje supervisado: técnicas de clasificación, se centrará en la


clasificación, sus técnicas, la estrategia de división del tren-prueba y las medidas de evaluación del
desempeño. En secciones posteriores, la atención se centrará en la división de datos, la matriz de confusión y
las medidas de evaluación del desempeño, como exactitud, precisión, recuperación, puntuación F1, ROC y
AUC.

[288]
Aprendizaje supervisado -
--
Técnicas de clasificación
La mayoría de los problemas de aprendizaje automático del mundo real utilizan el aprendizaje supervisado. En el
aprendizaje supervisado, el modelo aprenderá de un conjunto de datos de entrenamiento etiquetado. Una etiqueta es
una variable objetivo que queremos predecir. Es una información adicional que ayuda a tomar decisiones o predicciones,
por ejemplo, qué solicitud de préstamo es segura o arriesgada, si un paciente padece una enfermedad o no, los precios
de la vivienda y las puntuaciones de elegibilidad crediticia. Estas etiquetas actúan como un supervisor o maestro para el
proceso de aprendizaje. Los algoritmos de aprendizaje supervisado pueden ser de dos tipos: clasificación o regresión. Un
problema de clasificación tiene una variable objetivo categórica, como el estado de una solicitud de préstamo como
seguro o riesgoso, si un paciente sufre de una "enfermedad" o "no enfermedad", o si un cliente es "potencial" o "no
potencial".

Este capítulo se centra en el aprendizaje automático supervisado y cubre específicamente las técnicas de
clasificación. Este capítulo utilizará principalmente scikit-learn. Se profundizará en técnicas básicas de
clasificación, como el ingenuo Bayes,Máquinas de vectores de soporte (SVM), K-vecino más cercano (KNN) y
árboles de decisión. Además, se centra en las estrategias de división de pruebas y en los métodos y parámetros
de evaluación de modelos.

Los temas de este capítulo se enumeran a continuación:

Clasificación
Clasificación de Naive Bayes
Clasificación del árbol de
decisiones Clasificación KNN
Clasificación SVM
Dividir conjuntos de entrenamiento y prueba

Evaluación del rendimiento del modelo de


clasificación, curva ROC y AUC
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Requerimientos técnicos
Este capítulo tiene los siguientes requisitos técnicos:

Puede encontrar el código y los conjuntos de datos en el siguiente enlace de GitHub: https: / /
github. com / PacktPublishing / Python- Análisis de datos- Tercera edición / tree / master /
Chapter10.
Todos los bloques de código están disponibles en el ch10.ipynb expediente. Este
capítulo utiliza solo un archivo CSV (diabetes.csv) con fines de práctica. En este
capítulo, usaremos elpandas y scikit-learn Bibliotecas de Python.

Clasificación
Como analista de datos de atención médica, su trabajo consiste en identificar a los pacientes o
enfermos que tienen una mayor probabilidad de padecer una enfermedad en particular, por
ejemplo, diabetes o cáncer. Estas predicciones le ayudarán a tratar a los pacientes antes de que
ocurra la enfermedad. De manera similar, un gerente de ventas y marketing desea predecir los
clientes potenciales que tienen más posibilidades de comprar un producto. Este es el proceso de
categorizar a los clientes en dos o más categorías conocidas como clasificación. El modelo de
clasificación predice la etiqueta de clase categórica, como si el cliente es potencial o no. En el proceso
de clasificación, el modelo se entrena con los datos disponibles, hace predicciones y evalúa el
rendimiento del modelo. Los modelos desarrollados se denominan clasificadores. Esto significa que
tiene tres etapas: entrenamiento, predicción y evaluación.Área bajo curva (AUC). La clasificación
tiene una variedad de aplicaciones en varios dominios, como banca, finanzas, servicios al ciudadano,
atención médica, análisis de texto, identificación de imágenes y detección de objetos.

Como analista, primero debe definir el problema que desea resolver mediante la clasificación y luego identificar
las características potenciales que predicen las etiquetas con precisión. Las características son las columnas o
atributos responsables de la predicción. En los problemas de predicción de la diabetes, los analistas de salud
recopilarán información del paciente, como la edad, la rutina de ejercicios, los hábitos de comer comida
chatarra, el consumo de alcohol y las características o características del hábito de fumar. Estas características se
utilizarán para predecir si el paciente sufrirá diabetes. Puede ver en el siguiente diagrama cómo se pueden
clasificar los datos en dos clases usando una línea:

[290]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Los procesos de aprendizaje automático y minería de datos tienen varios pasos: recopilación de datos,
preprocesamiento de datos, división de prueba de tren, generación de modelos y evaluación. Hemos visto
modelos de análisis de datos como KDD, SEMMA y CRISP-DM. En clasificación, solo nos enfocamos en la división
de prueba de tren, generación de modelo y evaluación.

El modelo de clasificación tiene tres etapas: división de prueba de tren, generación de modelo y evaluación de modelo.
En la etapa de división de prueba de tren, los datos se dividen en dos partes: conjuntos de entrenamiento y prueba. En
el entrenamiento, el conjunto de entrenamiento se usa para generar el modelo, y las pruebas se usan en la etapa de
evaluación del modelo para evaluar el desempeño del modelo usando métricas de evaluación como exactitud, error,
precisión y recuperación. Puedes ver el proceso de clasificación en el siguiente diagrama:

En el diagrama anterior, se presentan los pasos del proceso de clasificación. Ahora que entendemos el
proceso de clasificación, es hora de aprender las técnicas de clasificación. En la siguiente sección, nos
centraremos en el algoritmo de clasificación de Bayes ingenuo.

[291]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Clasificación ingenua de Bayes


Naive Bayes es un método de clasificación basado en el teorema de Bayes. El teorema de Bayes lleva el nombre
de su inventor, el estadístico Thomas Bayes. Es una técnica rápida, precisa, robusta, fácil de entender e
interpretable. También puede funcionar más rápido en grandes conjuntos de datos. Naive Bayes se implementa
de manera efectiva en aplicaciones de minería de texto, como clasificación de documentos, predicción de
opiniones de clientes y filtrado de spam.

El clasificador ingenuo de Bayes se llama ingenuo porque asume la independencia condicional de clase. La
independencia condicional de clase significa que cada columna de características es independiente de las demás
características restantes. Por ejemplo, en el caso de determinar si una persona tiene diabetes o no, depende de
sus hábitos alimenticios, su rutina de ejercicios, la naturaleza de su profesión y su estilo de vida. Incluso si las
características están correlacionadas o dependen unas de otras, Bayes ingenuo seguirá asumiendo que son
independientes. Entendamos la fórmula del teorema de Bayes:

Aquí, y es el objetivo y X es el conjunto de características. p (y) y p (X) son las probabilidades previas
independientemente de la evidencia. Esto significa la probabilidad de que ocurran eventos antes de que se vea
la evidencia.p (y | X)es la probabilidad posterior del evento X después de que se ve la evidencia. Es la
probabilidad dey evidencia dada X. p (X | y) es la probabilidad posterior del evento y después de que se ve la
evidencia. Es la probabilidad deX evidencia dada y. Tomemos un ejemplo de la ecuación anterior:

Aquí, estamos encontrando la probabilidad de que un paciente sufra de diabetes según su frecuencia
de tabaquismo utilizando el teorema de Bayes.

Veamos el funcionamiento del ingenuo algoritmo de clasificación de Bayes. Asume ese conjunto de datosD tieneX
características y etiqueta y. Las características pueden ser n-dimensionales,X=X1, X2, X3 ... Xn. Etiquetay puede tener
metro clases C1, C2, C3 ...Cm. Funcionará de la siguiente manera:

1. Calcule las probabilidades previas, y , para las etiquetas de clase dadas.

2. Calcule las probabilidades posteriores, y, con cada atributo para cada


clase:

[292]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

3. Multiplica la probabilidad posterior de la misma clase, :

4. Si el atributo es categórico, debe haber varios registros de clase en


con valor, dividido por los registros del conjunto de datos.
5. Si el atributo es continuo, se calcula utilizando la distribución gaussiana:

6. Multiplica la probabilidad previa, pag(y), por la probabilidad posterior de paso 3:

7. Encuentre la clase con la probabilidad máxima para el conjunto de características de entrada dado. Esta
clase será nuestra predicción final.

Ahora, creemos un modelo usando la clasificación ingenua de Bayes en Python:

1. Cargue el conjunto de datos de diabetes de los indios Pima (https: / / github. com /
PacktPublishing / Python- Análisis de datos- Tercera edición / blob / master /
Capítulo 09 / diabetes. Csv) usando las siguientes líneas de código:

# Importar bibliotecas
importar pandas como pd
# leer el conjunto de datos
diabetes = pd.read_csv ("diabetes.csv")

# Mostrar los 5 mejores registros


diabetes.head ()

[293]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Esto da como resultado la siguiente salida:

Por lo tanto, hemos importado pandas y leer el conjunto de datos. En el ejemplo anterior, estamos
leyendo el conjunto de datos de diabetes de los indios Pima.

2. Ahora dividiremos el conjunto de datos en dos partes, de la siguiente manera:

# dividir el conjunto de datos en dos partes: conjunto de características y etiqueta de destino


feature_set = ['embarazada', 'insulina', 'bmi', 'edad', 'glucosa', 'bp', 'pedigree'] features =
diabetes [feature_set] target = diabetes.label

# particionar los datos en un conjunto de entrenamiento y prueba


de sklearn.model_selection importar train_test_split

feature_train, feature_test, target_train, target_test = \ train_test_split (features, target,


test_size = 0.3, random_state = 1)

Después de cargar el conjunto de datos, lo dividimos en una columna de etiqueta o dependiente(objetivo)


y columnas independientes o de características (conjunto de características). Después de esto, el conjunto
de datos se dividirá en conjuntos de prueba y de tren. Ahora, tanto la columna dependiente como la
independiente se dividen en conjuntos de prueba y de tren (feature_train,
feature_test, target_train, y prueba_objetivo) utilizandotrain_test_split ().
train_test_split ()toma dependiente y
DataFrames independientes, test_size y estado_aleatorio. Aquí, test_size decidirá la proporción de
la división de prueba de tren (es decir, test_size 0.3 significa que el 30% es el conjunto de prueba
y el 70% restante de los datos será el conjunto de entrenamiento), yestado_aleatorio se utiliza
como valor inicial para reproducir la misma división de datos cada vez. Siestado_aleatorio es
Ninguno, luego, dividirá aleatoriamente los registros cada vez, lo que dará diferentes medidas
de rendimiento.

3. Ahora construiremos el modelo de clasificación ingenuo de Bayes:

# Importar modelo Gaussiano Naive Bayes


de sklearn.naive_bayes importar GaussianNB

[294]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

# Crea un clasificador gaussiano


modelo = GaussianNB ()

# Entrene al modelo usando los conjuntos de entrenamiento


model.fit (feature_train, target_train)

# Pronostique la variable objetivo para un conjunto de datos de prueba dado


predicciones = model.predict (feature_test)

Aquí, hemos creado un modelo ingenuo de Bayes. Primero, importaremos elGaussianNBclass y


crear su objeto o modelo. Este modelo encajará en el conjunto de datos de entrenamiento
(feature_train, target_train). Después del entrenamiento, el modelo está listo para hacer
predicciones usando el predecir() método.

4. Finalmente, evaluaremos el desempeño del modelo:

# Módulo de métricas de importación para evaluación de desempeño


de sklearn.metrics importar precision_score de
sklearn.metrics importar precision_score de
sklearn.metrics importar recall_score de sklearn.metrics
importar f1_score
# Calcular la precisión del modelo
print ("Precisión:", precision_score (target_test, predictions))

# Calcular la precisión del modelo


print ("Precisión:", precision_score (target_test, predictions))

# Calcular recuperación de modelo


print ("Recall:", recall_score (target_test, predictions))

# Calcular la puntuación f1 del modelo


print ("F1-Score:", f1_score (target_test, predictions))

Esto da como resultado la siguiente salida:

Precisión: 0,7748917748917749
Precisión: 0,7391304347826086
Recuperación: 0,6
Puntuación F1: 0,6623376623376623

scikit-learn's métrica La clase ofrece varios métodos para la evaluación del desempeño, por ejemplo,
exactitud, precisión, recuperación y métricas de puntuación F1. Estos métodos tomarán etiquetas de
destino reales (prueba_objetivo) y etiquetas predichas (predicciones). Entenderemos estas métricas en
detalle en el Evaluación del desempeño del modelo de clasificación sección.

[295]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Naive Bayes es un método de predicción simple, rápido, preciso y fácil de entender. Tiene un costo de cálculo
más bajo y puede funcionar con grandes conjuntos de datos. Naive Bayes también se puede emplear en
problemas de clasificación de clases múltiples. El clasificador ingenuo de Bayes funciona mejor en comparación
con la regresión logística cuando los datos tienen un supuesto de independencia de clase.

El ingenuo Bayes sufre de la problema de frecuencia cero. Frecuencia cero significa que si falta alguna categoría
en la función, tendrá un recuento de frecuencia cero. Este problema se resuelve mediante la corrección
laplaciana. La corrección laplaciana (o transformación de Laplace) es un tipo de técnica de suavizado que
agregará un registro para cada clase de modo que el recuento de frecuencia de la clase faltante se convierta en 1,
por lo que las probabilidades del teorema de Bayes no se verán afectadas. Otro problema con el ingenuo Bayes
es su suposición de independencia condicional de clase, ya que es prácticamente imposible que todos los
predictores sean completamente independientes. En esta sección, hemos aprendido acerca de la clasificación
ingenua de Bayes. Ahora es el momento de aprender sobre el algoritmo de clasificación del árbol de decisiones.

Clasificación del árbol de decisión


Un árbol de decisiones es una de las técnicas de clasificación más conocidas. Puede emplearse para ambos tipos
de problemas de aprendizaje supervisado (problemas de clasificación y regresión). Es una estructura de árbol
similar a un diagrama de flujo e imita el pensamiento a nivel humano, lo que facilita su comprensión e
interpretación. También le hace ver la lógica detrás de la predicción, a diferencia de los algoritmos de caja negra
como las SVM y las redes neuronales.

El árbol de decisiones tiene tres componentes básicos: el nodo interno, la rama y los nodos hoja.
Aquí, cada nodo terminal representa una característica, el enlace representa la regla de decisión o la
regla de división y la hoja proporciona el resultado de la predicción. El primer nodo inicial o maestro
del árbol es el nodo raíz. Divide los datos en función de características o valores de atributos. Aquí,
dividimos los datos y nuevamente dividimos los datos restantes de forma recursiva hasta que todos
los elementos se refieren a la misma clase o no quedan más columnas. Los árboles de decisión se
pueden emplear en ambos tipos de problemas: clasificación y regresión. Hay muchos algoritmos de
árbol de decisión disponibles, por ejemplo, CART, ID3, C4.5 y CHAID. Pero aquí, nos centramos
principalmente en CART e ID3 porque en scikit-learn, estos son los dos que están disponibles. Dejar'

[296]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

CARRO representa Árbol de clasificación y regresión. CART utiliza el índice de Gini para seleccionar la
mejor columna. El índice de Gini es la diferencia entre la suma de las probabilidades cuadradas de cada
clase de 1. La característica o columna con el valor mínimo del índice de Gini se selecciona como
característica de división o partición. El valor del índice de Gini se encuentra en el rango de 0 y 1. Si el valor
del índice de Gini es 0, indica que todos los elementos pertenecen a una clase, y si el valor del índice de
Gini es exactamente 1, indica que todos los elementos son distribuidos aleatoriamente. Un valor de 0,5 del
índice de Gini indica la distribución equitativa de elementos en algunas clases:

ID3 representa Dicotomizador iterativo 3. Utiliza la ganancia de información o la entropía como medida
de selección de atributos. La entropía fue inventada por Shannon y mide la cantidad de impureza o
aleatoriedad en un conjunto de datos. La ganancia de información mide las variaciones entre la entropía
antes de la partición y la entropía media después de la partición del conjunto de datos para una columna
específica. La característica o atributo con el mayor valor de ganancia de información se seleccionará
como característica o atributo de división. Si la entropía es 0, indica que existe una sola clase, y si la
entropía es 1, indica que los elementos están distribuidos por igual:

[297]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

El árbol de decisiones es muy intuitivo y fácil de entender, interpretar y explicar a las partes interesadas. No es
necesario normalizar funciones y algoritmos sin distribución. Los árboles de decisión también se utilizan para
predecir los valores perdidos. Tienen la capacidad de capturar patrones no lineales. Los árboles de decisión
pueden sobreajustarse y son sensibles a datos ruidosos. Los árboles de decisión están sesgados con datos
desequilibrados, por lo que antes de aplicar árboles de decisión, debemos equilibrar el conjunto de datos. Los
árboles de decisión son más costosos en términos de tiempo y complejidad.

Trabajemos en un árbol de decisiones usando scikit-learn y realicemos un conjunto de datos de predicción. Después de esto,
estaremos listos para la construcción del modelo:

1. Primero, debe importar pandas y cargue el conjunto de datos de Pimas


usando elread_csv () método que ya vimos en la última sección.

2. Después de esto, necesitamos dividir el conjunto de datos en conjuntos de datos de entrenamiento y prueba
similares a lo que realizamos en la sección anterior.

3. Ahora, crearemos el modelo de clasificación del árbol de decisiones:

# Modelo de árbol de decisión de importación


de sklearn.tree importar DecisionTreeClassifier

# Crear un objeto clasificador de árbol de decisión


clf = DecisionTreeClassifier ()

# Entrena el modelo usando el conjunto de datos de entrenamiento


clf = clf.fit (feature_train, target_train)

# Predecir la respuesta para el conjunto de datos de prueba


predicciones = clf.predict (feature_test)

Aquí, hemos creado un modelo de árbol de decisiones. Primero, importaremos el


DecisionTreeClassifier class y crear su objeto o modelo. Este modelo encajará en el conjunto de
datos de entrenamiento (feature_train, target_train). Después del entrenamiento, el modelo
está listo para hacer predicciones usando el predecir() método.

4. Ahora evaluaremos el desempeño del modelo:

# Módulo de métricas de importación para evaluación de desempeño


de sklearn.metrics importar precision_score de
sklearn.metrics importar precision_score de
sklearn.metrics importar recall_score de sklearn.metrics
importar f1_score

# Calcular la precisión del modelo


print ("Precisión:", precision_score (target_test, predictions))

[298]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

# Calcular la precisión del modelo


print ("Precisión:", precision_score (target_test, predictions))

# Calcular recuperación de modelo


print ("Recall:", recall_score (target_test, predictions))

# Calcular la puntuación f1 del modelo


print ("F1-Score:", f1_score (target_test, predictions))

Esto da como resultado la siguiente salida:

Precisión: 0,7229437229437229
Precisión: 0,6438356164383562
Recordatorio: 0,5529411764705883
Puntuación F1: 0,5949367088607594

En el ejemplo anterior, el rendimiento del modelo se evalúa mediante exactitud, precisión, recuperación y
puntuación F1.

Después de obtener una comprensión completa de los árboles de decisión, pasemos a la clasificación KNN.

Clasificación KNN
KNN es un algoritmo de clasificación simple, fácil de comprender y de implementar. También se puede
utilizar para problemas de regresión. KNN se puede emplear en muchos casos de uso, como
recomendaciones de artículos y problemas de clasificación. Específicamente, puede sugerir películas en
Netflix, artículos en Medium, candidatos en naukari.com, productos en eBay y videos en YouTube. En
clasificación, se puede utilizar para clasificar instancias como, por ejemplo, institutos bancarios que
pueden clasificar el préstamo de candidatos riesgosos, o científicos políticos pueden clasificar votantes
potenciales.

KNN tiene tres propiedades básicas, que son aprendizaje no paramétrico, aprendizaje perezoso y aprendizaje
basado en instancias. No paramétrico significa que el algoritmo no tiene distribución y no se necesitan
parámetros como la media y la desviación estándar. Aprendiz perezoso significa que KNN no entrena el modelo;
es decir, el modelo se entrena en la fase de prueba. Esto hace que el entrenamiento sea más rápido pero las
pruebas más lentas. También consume más tiempo y memoria. El aprendizaje basado en instancias significa que
el resultado previsto se basa en la similitud con sus vecinos más cercanos. No crea ecuaciones abstractas o reglas
de predicción; en su lugar, almacena todos los datos y consulta cada registro.

[299]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

El algoritmo de clasificación KNN encuentra el k instancias más similares del conjunto de datos de
entrenamiento y la mayoría decide la etiqueta predicha de las características de entrada dadas. El
clasificador KNN realizará los siguientes pasos para hacer predicciones:

1. Calcule la distancia para una observación de entrada con todas las observaciones en el conjunto de datos de
entrenamiento.

2. Encuentra el K vecinos más cercanos superiores ordenando la distancia con todas las instancias en orden
ascendente.
3. Realizar votaciones sobre el K vecinos más cercanos y predecir la etiqueta con la
mayoría de votos.

Esto se representa mejor con el siguiente diagrama:

Trabajemos en un clasificador KNN usando scikit-learn y realicemos una predicción en un conjunto de datos:

1. Cargue el conjunto de datos de diabetes de los indios Pima.

Primero, necesita importar pandas y cargue el conjunto de datos usando el read_csv ()


método que ya hemos visto en el Clasificación ingenua de Bayes sesión.

2. Divida el conjunto de datos.

Después de esto, debemos dividir el conjunto de datos en dos conjuntos, un conjunto de entrenamiento y
otro de prueba, como hicimos en el Clasificación ingenua de Bayes sección.

3. Construya el modelo de clasificación KNN.

[300]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Ahora, estamos listos para la construcción de modelos:

# Importar modelo KNN


de sklearn.neighbors importar KNeighborsClassifier

# Crea un objeto clasificador KNN


model = KNeighborsClassifier (n_neighbors = 3)

# Entrena el modelo usando el conjunto de datos de entrenamiento


model.fit (feature_train, target_train)

# Predecir la variable de destino para el conjunto de datos de prueba


predicciones = model.predict (feature_test)

En el bloque de código anterior, importamos el KNeighborsClassifier class y creó su objeto


o modelo. Aquí, hemos tomado 3 vecinos como parámetro de entrada para el modelo. Si
no especificamos el número de vecinos como parámetro de entrada, el modelo elegirá 5
vecinos por defecto. Este modelo encajará en el conjunto de datos de entrenamiento (
feature_train, target_train). Después del entrenamiento, el modelo está listo para hacer
predicciones usando el predecir() método.

4. Evalúe el desempeño del modelo:

# Módulo de métricas de importación para evaluación de desempeño


de sklearn.metrics importar precision_score de
sklearn.metrics importar precision_score de
sklearn.metrics importar recall_score de sklearn.metrics
importar f1_score

# Calcular la precisión del modelo


print ("Precisión:", precision_score (target_test, predictions))

# Calcular la precisión del modelo


print ("Precisión:", precision_score (target_test, predictions))

# Calcular recuperación de modelo


print ("Recall:", recall_score (target_test, predictions))

# Calcular la puntuación f1 del modelo


print ("F1-Score:", f1_score (target_test, predictions))

Esto da como resultado la siguiente salida:

Precisión: 0,7532467532467533
Precisión: 0,7058823529411765
Recuperación: 0,5647058823529412
Puntuación F1: 0,6274509803921569

[301]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

En el ejemplo anterior, el rendimiento del modelo se evalúa mediante exactitud, precisión, recuperación y
puntuación F1.

Después de comprender el algoritmo de clasificación KNN, es hora de aprender sobre el algoritmo de


clasificación SVM.

Clasificación SVM
Los SVM son los algoritmos de aprendizaje automático más preferidos y favoritos por muchos científicos de
datos debido a su precisión con menos potencia de cálculo. Se emplean tanto para problemas de regresión como
de clasificación. También ofrecen un truco del kernel para modelar relaciones no lineales. SVM tiene una
variedad de casos de uso, como detección de intrusiones, clasificación de texto, detección de rostros y
reconocimiento de escritura a mano.

SVM es un modelo discriminativo que genera hiperplanos óptimos con un gran margen en el
espacio n-dimensional para separar puntos de datos. La idea básica es descubrir elHiperplano
marginal máximo (MMH) que separa perfectamente los datos en clases determinadas. El margen
máximo significa la distancia máxima entre los puntos de datos de ambas clases.

Terminología
Ahora exploraremos parte de la terminología que entra en la clasificación de SVM:

Hiperplano: Hyperplane es un límite de decisión que se utiliza para distinguir entre dos clases. La
dimensionalidad del hiperplano se decide por el número de características. También se conoce
como plano de decisión.
Vectores de apoyo: Los vectores de soporte son los puntos más cercanos al
hiperplano y ayudan en la orientación del hiperplano maximizando el margen.
Margen: El margen es la brecha máxima entre los puntos más cercanos. Cuanto mayor sea
el margen, mejor se considerará la clasificación. El margen se puede calcular por la distancia
perpendicular desde la línea del vector de soporte.

El objetivo principal de una SVM es elegir el hiperplano con el límite más grande posible entre
los vectores de soporte. El SVM encuentra el MMH en las siguientes dos etapas:

1. Cree hiperplanos que separen los puntos de datos de la mejor manera posible.
2. Seleccione el hiperplano con el hiperplano de margen máximo:

[302]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

El algoritmo SVM es un clasificador más rápido y preciso en comparación con Bayes ingenuo. Funciona
mejor con un mayor margen de separación. SVM no es favorable para grandes conjuntos de datos. Su
rendimiento también depende del tipo de kernel utilizado. Funciona mal con clases superpuestas.

Trabajemos en clasificadores de vectores de soporte usando scikit-learn y realizar un conjunto de datos de predicción.
Después de esto, dividiremos el conjunto de datos en dos conjuntos de entrenamiento y pruebas como hicimos en el
Clasificación ingenua de Bayes sección. Después de esto, estamos listos con la construcción del modelo:

1. Cargue el conjunto de datos de diabetes de los indios Pima.

Primero, necesita importar pandas y cargue el conjunto de datos usando el read_csv ()


método que ya vimos en el Clasificación ingenua de Bayes sesión.

2. Divida el conjunto de datos.

Después de esto, necesitamos dividir el conjunto de datos en dos conjuntos, un conjunto de entrenamiento y
prueba, como hicimos en el clasificación ingenua de Bayes sección.

3. Construya el modelo de clasificación SVM.

Ahora, estamos listos con la construcción de modelos:

# Importar modelo SVM


desde sklearn import svm

# Crea un objeto clasificador SVM


clf = svm.SVC (kernel = 'lineal')

# Entrene al modelo usando los conjuntos de entrenamiento

[303]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

clf.fit (feature_train, target_train)

# Predecir la variable de destino para el conjunto de datos de prueba


predicciones = clf.predict (feature_test)

En el bloque de código anterior, importaremos el svm módulo y crear susvm.SVC () objeto


o modelo. Aquí, hemos pasado ellineal núcleo. También puede pasar otro kernel, como
poli, rbf, o sigmoideo. Si no especificamos el kernel, seleccionará rbf por defecto como
kernel. El núcleo lineal creará un hiperplano lineal para separar a los pacientes diabéticos
de los no diabéticos. Este modelo encajará en el conjunto de datos de entrenamiento (
feature_train, target_train). Después del entrenamiento, el modelo está listo para hacer
predicciones usando el predecir() método.

4. Evalúe el desempeño del modelo:

# Módulo de métricas de importación para evaluación de desempeño


de sklearn.metrics importar precision_score de
sklearn.metrics importar precision_score de
sklearn.metrics importar recall_score de sklearn.metrics
importar f1_score

# Calcular la precisión del modelo


print ("Precisión:", precision_score (target_test, predictions))

# Calcular la precisión del modelo


print ("Precisión:", precision_score (target_test, predictions))

# Calcular recuperación de modelo


print ("Recall:", recall_score (target_test, predictions))

# Calcular la puntuación f1 del modelo


print ("F1-Score:", f1_score (target_test, predictions))

Esto da como resultado la siguiente salida:

Precisión: 0,7835497835497836
Precisión: 0,7868852459016393
Recuperación: 0,5647058823529412
Puntuación F1: 0,6575342465753424

En el ejemplo anterior, el rendimiento del modelo se evaluará mediante métricas como exactitud, precisión,
recuperación y puntuación F1. Después de comprender todos estos clasificadores, es hora de ver las estrategias
de división del conjunto de entrenamiento y prueba.

[304]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Dividir conjuntos de entrenamiento y prueba


Los científicos de datos deben evaluar el rendimiento de un modelo, superar el sobreajuste y ajustar los
hiperparámetros. Todas estas tareas requieren algunos registros de datos ocultos que no se utilizaron en la fase de
desarrollo del modelo. Antes del desarrollo del modelo, los datos deben dividirse en algunas partes, como conjuntos de
entrenamiento, prueba y validación. El conjunto de datos de entrenamiento se usa para construir el modelo. El conjunto
de datos de prueba se utiliza para evaluar el rendimiento de un modelo que se entrenó en el conjunto de trenes. El
conjunto de validación se utiliza para encontrar los hiperparámetros. Veamos las siguientes estrategias para la división
de prueba de tren en las siguientes subsecciones:

Método de espera
Método Bootstrap de
validación cruzada de K-fold

Holdout
En este método, el conjunto de datos se divide aleatoriamente en dos partes: un conjunto de entrenamiento y
prueba. Generalmente, esta relación es 2: 1, lo que significa 2/3 para entrenamiento y 1/3 para pruebas. También
podemos dividirlo en diferentes proporciones, como 6: 4, 7: 3 y 8: 2:

# particionar los datos en un conjunto de entrenamiento y prueba


de sklearn.model_selection importar train_test_split

# tren dividido y equipo de prueba


feature_train, feature_test, target_train, target_test = train_test_split (features, target,
test_size = 0.3, random_state = 1)

En el ejemplo anterior, test_size = 0.3 representa el 30% para el conjunto de prueba y el 70% para el conjunto de
entrenamiento. train_test_split () divide el conjunto de datos en 7: 3.

[305]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Validación cruzada de K-fold


En este enfoque, los datos se dividen en k particiones de aproximadamente el mismo tamaño. Se
entrenarákmodelos y evaluarlos usando cada partición. En cada iteración, una partición se mantendrá
para la prueba y el restok las particiones se utilizan colectivamente con fines de formación. La precisión de
la clasificación será el promedio de todas las precisiones. También asegura que el modelo no se
sobreajuste:

En validación cruzada estratificada, k las particiones se dividen con aproximadamente la misma


distribución de clases. Esto significa que conserva los porcentajes de cada clase en cada partición.

Método Bootstrap
Bootstrap es una técnica de remuestreo. Realiza un muestreo de forma iterativa a partir del conjunto de datos
con reemplazo. El muestreo con reemplazo hará selecciones aleatorias. Requiere el tamaño de la muestra y el
número de iteraciones. En cada iteración, selecciona los registros de manera uniforme. Cada registro tiene las
mismas posibilidades de ser seleccionado nuevamente. Las muestras que no se seleccionan se conocen como
muestras "fuera de bolsa". Entendamos el bootstrap usando el siguiente diagrama:

[306]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

En el diagrama anterior, podemos ver que cada elemento tiene la misma posibilidad de selección en cada
muestra de arranque. Pasemos a otro tema importante de la clasificación, que es la evaluación del
modelo de clasificación. El siguiente tema nos ayuda a evaluar el desempeño del modelo de clasificación.

Evaluación del desempeño del modelo de


clasificación
Hasta ahora hemos aprendido a crear modelos de clasificación. Crear un modelo de clasificación de
aprendizaje automático no es suficiente; como analista empresarial o de datos, también desea evaluar
su rendimiento para poder implementarlo en proyectos en vivo.

scikit-learn ofrece varias métricas, como una matriz de confusión, exactitud, precisión, recuperación y
puntuación F1, para evaluar el rendimiento de un modelo.

Matriz de confusión
Una matriz de confusión es un enfoque que proporciona una breve declaración de los resultados de la
predicción en un problema de clasificación binario y de clases múltiples. Supongamos que tenemos que
averiguar si una persona tiene diabetes o no. El concepto detrás de la matriz de confusión es encontrar
el número de pronósticos correctos y erróneos, que se resumen y separan en cada clase. Aclara toda la
confusión relacionada con el desempeño de nuestro modelo de clasificación. Esta matriz de 2x2 no solo
muestra el error que está cometiendo nuestro clasificador, sino que también representa qué tipo de
errores se están cometiendo. Se utiliza una matriz de confusión para hacer un análisis completo de los
datos estadísticos más rápido y también hacer que los resultados sean más legibles y comprensibles a
través de una visualización clara de los datos. Contiene dos filas y columnas, como se muestra en la
siguiente lista. Dejar'

Verdadero Positivo (TP): Esto representa los casos que se pronostican como sí y en
realidad, los casos son Sí; por ejemplo, los hemos pronosticado como casos fraudulentos
y en realidad son fraudulentos.
Verdadero negativo (Tennesse): Esto representa los casos que se pronostican como No y en
realidad, los casos son No; por ejemplo, los hemos pronosticado como casos no fraudulentos
y, en realidad, no son fraudulentos.

[307]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Falso positivo (FP): Esto representa los casos que se pronostican como sí y en realidad, los
casos son No; por ejemplo, los hemos pronosticado como casos fraudulentos y en realidad no
son fraudulentos. Este tipo de clase de incidente representa un error de Tipo I.

Falso negativo (FN): Esto representa los casos que se pronostican como No y en realidad, los
casos son No; por ejemplo, los hemos pronosticado como casos no fraudulentos y, en
realidad, son fraudulentos. Este tipo de clase de incidente representa un error de Tipo II.

Tomemos un ejemplo de un problema de detección de fraude:

En el ejemplo anterior, hemos tomado dos clases de fraude: sí y No. sí indica actividad fraudulenta y
No indica actividad no fraudulenta. El número total de registros previstos es825, lo que significa que
se probaron 825 transacciones. En todos estos 825 casos, el modelo o clasificador pronosticó 550
vecessí y 275 veces No. En realidad, los casos fraudulentos reales son 525 y los casos no
fraudulentos son 300.

[308]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Creemos una matriz de confusión en Python usando scikit-learn:

# Importar bibliotecas
importar pandas como pd

# leer el conjunto de datos


diabetes = pd.read_csv ("diabetes.csv")

# dividir el conjunto de datos en dos partes: conjunto de características y etiqueta de destino


feature_set = ['embarazada', 'insulina', 'bmi', 'edad',
'glucosa', 'bp', 'pedigree']
features = diabetes [feature_set]

target = diabetes.label

# particionar los datos en un conjunto de entrenamiento y prueba


de sklearn.model_selection importar train_test_split feature_train, feature_test,
target_train, target_test = train_test_split (features, target, test_size = 0.3, random_state
= 1)

# importar modelo scikit-learn de regresión logística


de sklearn.linear_model import LogisticRegression
de sklearn.metrics, importe precision_score # para la evaluación del rendimiento

# instanciar el modelo
logreg = LogisticRegression (solver = 'lbfgs')

# ajustar el modelo con datos


logreg.fit (feature_train, target_train)

# Pronostique la variable objetivo para un conjunto de datos de prueba dado


predicciones = logreg.predict (feature_test)

# Obtener probabilidad de predicción


predictions_prob = logreg.predict_proba (feature_test) [::, 1]

# Importar la matriz de confusión


de sklearn.metrics importar plot_confusion_matrix

# Plotear matriz de confusión


plot_confusion_matrix (logreg, feature_test, target_test, values_format = 'd')

[309]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Esto da como resultado la siguiente salida:

En el ejemplo anterior, hemos cargado los datos y los hemos dividido en dos partes: conjuntos de
entrenamiento y prueba. Después de esto, realizamos el entrenamiento del modelo usando regresión logística
como hicimos en el capítulo anterior. Aquí, para trazar la matriz de confusión, hemos utilizado la
plot_confusion_matrix () método con el objeto de modelo, el conjunto de características de prueba, el conjunto
de etiquetas de prueba y valores_formato parámetros.

Precisión
Ahora, encontraremos la precisión del modelo calculada a partir de la matriz de confusión. Nos dice qué
tan preciso es nuestro modelo predictivo:

[310]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Precisión
Cuando el modelo predijo Sí, ¿con qué frecuencia fue correcto? Este es el porcentaje de casos positivos del total
de casos previstos en el conjunto de datos. En términos simples, podemos entender la precisión como "Hasta
qué nivel nuestro modelo es correcto cuando dice que es correcto":

Recordar
Cuando es en realidad Sí, con qué frecuencia predijo el modelo ¿Sí? Esto también se conoce como sensibilidad.
Este es el porcentaje de casos positivos de todos los casos reales totales presentes en el conjunto de datos:

Medida F
La medida F se considera una de las mejores formas de evaluar el modelo. En muchas áreas de la ciencia de
datos, el rendimiento del modelo de competencia se evalúa mediante la medida F. Es un medio armónico de
precisión y recuerdo. Cuanto mayor sea el valor de la puntuación F1, mejor se considerará el modelo. La
puntuación F1 proporciona el mismo peso que la precisión y la recuperación, lo que significa que indica un
equilibrio entre ambos:

[311]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Un inconveniente de la medida F es que asigna la misma ponderación a la precisión y la memoria, pero en


algunos ejemplos, una debe ser más alta que la otra, razón por la cual la puntuación F1 puede no ser una
métrica exacta.

En las secciones anteriores, hemos visto algoritmos de clasificación como Bayes ingenuo, árboles de
decisión, KNN y SVM. Hemos evaluado el rendimiento del modelo utilizando scikitlearn's
puntuación_de_precisión () para la precisión del modelo, precisión_score () para la precisión del modelo,
recall_score () para recuperar el modelo, y f1_score () para el modelo F1-score.

También podemos imprimir el informe de clasificación para profundizar en los detalles y comprender el
modelo de clasificación. Creemos el informe de confusión:

# informe de clasificación de importación


de sklearn.metrics importar clasificación_report

# Crear informe de clasificación


imprimir (informe_clasificación (prueba_objetivo, predicciones,
nombres_objetivo = ['Sí (1)', 'No (0)']))

Esto da como resultado la siguiente salida:

En el código anterior, hemos impreso el informe de la matriz de confusión utilizando elconfusión_report () método con
etiquetas de conjunto de prueba, conjunto de predicción o etiquetas predichas y parámetros de lista de valores
objetivo.

Curva ROC y AUC


La curva AUC-ROC es una herramienta para medir y evaluar el rendimiento de los modelos de clasificación.
República de China (Características de funcionamiento del receptor) es una visualización pictórica del
rendimiento del modelo. Traza un gráfico de probabilidad bidimensional entre la tasa de FP (o 1 especificidad)
y la tasa de TP (o sensibilidad). También podemos representar el área cubierta por un modelo con un solo
número usando AUC:

[312]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Creemos la curva ROC usando el módulo scikit-learn:


# import plot_roc_curve
de sklearn.metrics importar plot_roc_curve

plot_roc_curve (logreg, feature_test, target_test)

Esto da como resultado la siguiente salida:

[313]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

En el ejemplo anterior, hemos dibujado la gráfica ROC plot_roc_curve () método con el objeto de modelo, el conjunto de
características de prueba y los parámetros del conjunto de etiquetas de prueba.

En la curva ROC, el AUC es una medida de divisibilidad. Nos informa sobre la capacidad de
distinción de clases del modelo. Cuanto mayor sea el valor AUC, mejor será el modelo para
distinguir entre "fraude" y "no fraude". Para un clasificador ideal, el AUC es igual a 1:

Calculemos una puntuación AUC de la siguiente manera:

# Importar puntuación AUC ROC


de sklearn.metrics importar roc_auc_score

# Calcule el área bajo la curva ROC


auc = roc_auc_score (objetivo_prueba, predicciones_prob)

# Imprimir valor de auc


print ("Area Under Curve:", auc)

Esto da como resultado la siguiente salida:

Área bajo curva: 0.8628525382755843

scikit-learn's métrica clase ofrece una medida de evaluación del desempeño AUC.roc_auc_score ()
los métodos tomarán etiquetas reales (y_prueba) y probabilidad predicha
(y_pred_prob).

[314]
Aprendizaje supervisado: técnicas de clasificación Capítulo 10

Resumen
En este capítulo, descubrimos la clasificación, sus técnicas, la estrategia de división del tren y la prueba y las
medidas de evaluación del desempeño. Esto lo beneficiará al adquirir una habilidad importante para el análisis de
datos predictivos. Ha visto cómo desarrollar clasificadores lineales y no lineales para análisis predictivo usando
scikit-learn. En los temas anteriores del capítulo, comprendió los conceptos básicos de la clasificación y los
algoritmos de aprendizaje automático, como la clasificación ingenua de Bayes, la clasificación del árbol de
decisiones, KNN y SVM. En secciones posteriores, vio enfoques de división de datos y medidas de evaluación del
rendimiento del modelo, como puntaje de precisión, puntaje de precisión, puntaje de recuperación, puntaje F1,
curva ROC y puntaje AUC.

El próximo capítulo, Capítulo 11, Aprendizaje no supervisado: PCA y agrupación en clústeres, se concentrará en los
temas importantes de las técnicas de aprendizaje automático sin supervisión y las técnicas de reducción de
dimensionalidad en Python. El capítulo comienza con la reducción de dimensiones y el análisis de componentes
principales. En las últimas secciones del capítulo, la atención se centrará en los métodos de agrupación en
clústeres como k-medias, jerárquico, DBSCAN y agrupamiento espectral.

[315]
Aprendizaje no supervisado - PCA
--
y agrupación
El aprendizaje no supervisado es una de las ramas más importantes del aprendizaje automático. Nos permite hacer
predicciones cuando no tenemos etiquetas de destino. En el aprendizaje no supervisado, el modelo aprende solo a
través de características porque el conjunto de datos no tiene una columna de etiqueta de destino. La mayoría de los
problemas de aprendizaje automático comienzan con algo que ayuda a automatizar el proceso. Por ejemplo, cuando
desee desarrollar un modelo de predicción para detectar pacientes con diabetes, necesita un conjunto de etiquetas de
destino para cada paciente en su conjunto de datos. En las etapas iniciales, organizar las etiquetas de destino para
cualquier problema de aprendizaje automático no es una tarea fácil, porque requiere cambiar el proceso comercial para
obtener las etiquetas, ya sea mediante el etiquetado interno manual o la recopilación de datos nuevamente con
etiquetas.

En este capítulo, nuestro enfoque está en aprender sobre técnicas de aprendizaje no supervisadas que pueden manejar
situaciones en las que las etiquetas de destino no están disponibles. Cubriremos especialmente las técnicas de reducción
de dimensionalidad y las técnicas de agrupamiento. La reducción de dimensionalidad se utilizará cuando tengamos una
gran cantidad de características y queremos reducir esa cantidad. Esto reducirá la complejidad del modelo y el costo de
capacitación porque significa que podemos lograr los resultados que queremos con solo algunas características.

Las técnicas de agrupación encuentran grupos en los datos en función de la similitud. Estos grupos representan
esencialmenteclasificación no supervisada. En la agrupación, las clases o etiquetas para las observaciones de
características se encuentran sin supervisión. La agrupación en clústeres es útil para diversas operaciones comerciales,
como la búsqueda cognitiva, las recomendaciones, la segmentación y la agrupación de documentos.

Estos son los temas de este capítulo:

Aprendizaje sin supervisión


Reducir las dimensiones de los datos
Análisis de componentes principales
Agrupación
Particionamiento de datos mediante agrupación en clústeres de k-means
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Agrupación jerárquica agrupación

en clústeres DBSCAN

Agrupación espectral
Evaluación del rendimiento de la agrupación en clústeres

Requerimientos técnicos
Este capítulo tiene los siguientes requisitos técnicos:

Puede encontrar el código y los conjuntos de datos en el siguiente enlace de GitHub: https: / /
github. com / PacktPublishing / Python- Análisis de datos- Tercera edición / tree / master /
Chapter11.
Todos los bloques de código están disponibles en el ch11.ipynb expediente. Este
capítulo utiliza solo un archivo CSV (diabetes.csv) con fines de práctica. En este capítulo,
usaremos las bibliotecas de Python pandas y scikit-learn.

Aprendizaje sin supervisión


El aprendizaje no supervisado significa aprender mediante la observación, no con el ejemplo. Este tipo de
aprendizaje funciona con datos sin etiquetar. La reducción de la dimensionalidad y la agrupación son ejemplos
de este tipo de aprendizaje. La reducción de dimensionalidad se utiliza para reducir una gran cantidad de
atributos a unos pocos que pueden producir los mismos resultados. Hay varios métodos disponibles para reducir
la dimensionalidad de los datos, comoanálisis de componentes principales (PCA), t-SNE, transformación de
ondículas y selección de subconjuntos de atributos.

El término grupo significa un grupo de elementos similares que están estrechamente relacionados entre sí. La
agrupación en clústeres es un enfoque para generar unidades o grupos de elementos que son similares entre sí. Esta
similitud se calcula en función de ciertas características o características de los artículos. Podemos decir que un clúster
es un conjunto de puntos de datos que son similares a otros en su clúster y diferentes a los puntos de datos de otros
clústeres. La agrupación en clústeres tiene numerosas aplicaciones, como la búsqueda de documentos, inteligencia
empresarial, seguridad de la información y
sistemas de recomendación:

[317]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

En el diagrama anterior, podemos ver cómo la agrupación coloca los registros de datos u observaciones en unos
pocos grupos, y la reducción de la dimensionalidad reduce la cantidad de características o atributos. Veamos
cada uno de estos temas en detalle en las próximas secciones.

Reducir la dimensionalidad de los datos


Reducir la dimensionalidad, o reducción de la dimensionalidad, implica reducir un gran número de
atributos o columnas (características) a un número menor de atributos. El objetivo principal de esta técnica
es obtener el mejor número de características para clasificación, regresión y otros enfoques no
supervisados. En el aprendizaje automático, nos enfrentamos a un problema llamado la maldición de la
dimensionalidad. Aquí es donde hay una gran cantidad de atributos o características. Esto significa más
datos, lo que genera modelos complejos y problemas de sobreajuste.

La reducción de la dimensionalidad nos ayuda a lidiar con la maldición de la dimensionalidad. Puede transformar
datos de forma lineal y no lineal. Las técnicas para las transformaciones lineales incluyen PCA, análisis
discriminante lineal y análisis factorial. Las transformaciones no lineales incluyen técnicas como t-SNE, mapas
propios de Hesse, incrustación espectral y mapeo de características isométricas. La reducción de dimensionalidad
ofrece los siguientes beneficios:

Filtra características redundantes y menos importantes.


Reduce la complejidad del modelo con datos menos dimensionales.
Reduce los costos de memoria y computación para la generación de
modelos. Visualiza datos de alta dimensión.

[318]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

En la siguiente sección, nos centraremos en una de las técnicas de reducción de dimensiones importantes y
populares, PCA.

PCA
En el aprendizaje automático, se considera que tener una gran cantidad de datos significa tener un modelo de
buena calidad para la predicción, pero un gran conjunto de datos también plantea el desafío de una mayor
dimensionalidad (o la maldición de la dimensionalidad). Provoca un aumento de la complejidad de los modelos
de predicción debido a la gran cantidad de atributos. PCA es el método de reducción de dimensionalidad más
utilizado y nos ayuda a identificar patrones y correlaciones en el conjunto de datos original para transformarlo
en un conjunto de datos de menor dimensión sin pérdida de información.

El concepto principal de PCA es el descubrimiento de relaciones y correlaciones invisibles entre atributos


en el conjunto de datos original. Los atributos altamente correlacionados son tan similares que resultan
redundantes. Por lo tanto, PCA elimina esos atributos redundantes. Por ejemplo, si tenemos 200 atributos
o columnas en nuestros datos, se nos hace muy difícil continuar, con una cantidad tan grande de atributos.
En tales casos, necesitamos reducir ese número a 10 o 20 variables. Otro objetivo de PCA es reducir la
dimensionalidad sin afectar la información significativa. Parapag-datos dimensionales, la ecuación PCA se
puede escribir de la siguiente manera:

Los componentes principales son una suma ponderada de todos los atributos. Aquí, los
son los
atributos del conjunto de datos original y son los pesos de los atributos.

Pongamos un ejemplo. Consideremos las calles de una ciudad determinada como atributos y
digamos que desea visitar esta ciudad. Ahora la pregunta es, ¿cuántas calles visitarás? Obviamente,
querrás visitar las calles principales o populares de la ciudad, que digamos que son 10 de las 50
calles disponibles. Estas 10 calles te darán la mejor comprensión de esa ciudad. Estas calles son
entonces componentes principales, ya que explican bastante la variación en los datos (las calles de la
ciudad).

[319]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Realización de PCA
Realicemos PCA desde cero en Python:

1. Calcule la matriz de correlación o covarianza de un conjunto de datos dado.


2. Encuentre los autovalores y autovectores de la matriz de correlación o covarianza.
3. Multiplique la matriz de autovectores por el conjunto de datos original y obtendrá la matriz de
componentes principales.

Implementemos PCA desde cero:

1. Comenzaremos importando bibliotecas y definiendo el conjunto de datos:

# Importar numpy
importar numpy como np
# Importar módulo de álgebra lineal
de scipy import linalg as la
# Crear conjunto de datos
datos = np.array ([[7., 4., 3.], [4., 1., 8.],

[6., 3., 5.],


[8., 6., 1.],
[8., 5., 7.],
[7., 2., 9.],
[5., 3., 3.],
[9., 5., 8.],
[7., 4., 5.],
[8., 2., 2.]])

2. Calcule la matriz de covarianza:

# Calcular la matriz de covarianza


# Centre sus datos
datos - = datos.mean (eje = 0)
cov = np.cov (datos, rowvar = False)

3. Calcule los valores propios y el vector propio de la matriz de covarianza:

# Calcular autovalores y autovector de la matriz de covarianza


evals, evecs = la.eig (cov)

4. Multiplique la matriz de datos original por la matriz de vectores propios:

# Multiplica la matriz de datos original con la matriz de vectores propios.

# Ordene los valores Eigen y el vector y seleccione componentes


num_components = 2

[320]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

sorted_key = np.argsort (evals) [:: - 1] [: num_components] evals, evecs =


evals [sorted_key], evecs [:, sorted_key]

print ("Eigenvalues:", evals) print


("Eigenvector:", evecs)
print ("Valores propios ordenados y seleccionados:", evals) print
("Vector propio clasificado y seleccionado:", evecs)

# Multiplica los datos originales y el vector Eigen


componentes_principales = np.dot (datos, evecs) print ("Componentes
principales:", componentes_principales)

Esto da como resultado la siguiente salida:

Autovalores: [0.74992815 + 0.j 3.67612927 + 0.j 8.27394258 + 0.j] Autovector:


[[-0.70172743 0.69903712 -0.1375708] [0.70745703 0.66088917 -0.25045969]

[0.08416157 0.27307986 0.95830278]]

Valores propios ordenados y seleccionados: [8.27394258 + 0.j 3.67612927 + 0.j]

Vector propio ordenado y seleccionado: [[-0,1375708 0,69903712] [-0,25045969


0,66088917]
[0.95830278 0.27307986]]

Componentes principales: [[-2.15142276 -0.17311941]


[3.80418259 -2.88749898]
[0,15321328 -0,98688598]
[-4,7065185 1,30153634]
[1,29375788 2,27912632]
[4,0993133 0,1435814]
[-1,62582148 -2,23208282]
[2,11448986 3,2512433]
[-0,2348172 0,37304031] -1,0

Aquí, hemos calculado una matriz de componentes principales desde cero. Primero, centramos los datos y
calculamos la matriz de covarianza. Después de calcular la matriz de covarianza, calculamos los
autovalores y autovectores. Finalmente, elegimos dos componentes principales (el número de
componentes debe ser igual al número de valores propios mayor que 1) y multiplicamos los datos
originales por los vectores propios clasificados y seleccionados. También podemos realizar PCA usando la
biblioteca scikit-learn.

Realicemos PCA usando scikit-learn en Python:

# Importar pandas y PCA


importar pandas como pd

[321]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

# Importar análisis de componentes principales


de sklearn.decomposition import PCA

# Crear conjunto de datos


datos = np.array ([[7., 4., 3.], [4., 1., 8.],

[6., 3., 5.],


[8., 6., 1.],
[8., 5., 7.],
[7., 2., 9.],
[5., 3., 3.],
[9., 5., 8.],
[7., 4., 5.],
[8., 2., 2.]])

# Cree y ajuste el modelo PCA transformado


pca_model = PCA (n_components = 2) componentes =
pca_model.fit_transform (datos) componentes_df =
pd.DataFrame (datos = componentes,

columnas = ['componente_principal_1', 'componente_principal_2']) imprimir


(componentes_df)

Esto da como resultado la siguiente salida:

componente_principal_1 componente_principal_2

0 2,151423 -0,173119
1-3.804183 -2.887499
2 -0,153213 -0,986886
3 4.706518 1.301536
4 -1.293758 2.279126
5 -4,099313 0,143581
6 1.625821 -2.232083
7 -2.114490 3.251243
8 0,234817 0,373040
9 2.746377 -1.068940

En el código anterior, realizamos PCA utilizando la biblioteca scikit-learn. Primero, creamos el


conjunto de datos y instanciamos el objeto PCA. Después de esto, realizamosfit_transform ()y
generó los componentes principales.

Todo se trataba de PCA. Ahora es el momento de aprender sobre otro concepto de aprendizaje sin supervisión,
la agrupación.

[322]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Agrupación
Agrupar significa agrupar elementos que son similares entre sí. Agrupar productos similares, agrupar
artículos o documentos similares y agrupar clientes similares para la segmentación del mercado son
ejemplos de agrupación. El principio básico de la agrupación en clústeres es minimizar la distancia entre
grupos y maximizar la distancia entre grupos. La distancia intra-grupo es la distancia entre elementos de
datos dentro de un grupo y la distancia entre grupos es la distancia entre diferentes grupos. Los puntos
de datos no están etiquetados, por lo que la agrupación es una especie de problema sin supervisión. Hay
varios métodos para agrupar y cada método utiliza una forma diferente de agrupar los puntos de datos. El
siguiente diagrama muestra cómo se agrupan las observaciones de datos mediante la agrupación en
clústeres:

Como estamos combinando puntos de datos similares, la pregunta que surge aquí es cómo encontrar la
similitud entre dos puntos de datos para poder agrupar objetos de datos similares en el mismo grupo.
Para medir la similitud o disimilitud entre los puntos de datos, podemos usar medidas de distancia como
la distancia euclidiana, de Manhattan y de Minkowski:

[323]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Aquí, la fórmula de la distancia calcula la distancia entre dos vectores k-dimensionales, xI y


yI.

Ahora sabemos qué es la agrupación en clústeres, pero la pregunta más importante es, ¿cuántos
grupos se deben considerar al agrupar los datos? Ese es el mayor desafío para la mayoría de los
algoritmos de agrupamiento. Hay muchas formas de decidir el número de clústeres. Analicemos
esos métodos en la siguiente sección.

Encontrar la cantidad de clústeres


En esta sección, nos centraremos en el problema más fundamental de los algoritmos de agrupación en clústeres,
que es descubrir la cantidad de clústeres en un conjunto de datos; no hay una respuesta definitiva. Sin embargo,
no todos los algoritmos de agrupación requieren un número predefinido de agrupaciones. En la agrupación
jerárquica y DBSCAN, no es necesario definir el número de agrupaciones, pero en k-medias, kmedoides y
agrupación espectral, necesitamos definir la cantidad de agrupaciones. Seleccionar el valor correcto para el
número de clústeres es complicado, así que veamos un par de métodos para determinar el mejor número de
clústeres:

El método del codo


El método de la silueta

Veamos estos métodos en detalle.

[324]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

El método del codo


El método del codo es un método bien conocido para encontrar el mejor número de agrupaciones. En
este método, nos centramos en el porcentaje de varianza para los diferentes números de
conglomerados. El concepto central de este método es seleccionar la cantidad de grupos que agregar
otro grupo no debería causar un gran cambio en la varianza. Podemos trazar un gráfico para la suma de
cuadrados dentro de un grupo usando el número de grupos para encontrar el valor óptimo. La suma de
cuadrados también se conoce comoSuma de cuadrados dentro del clúster (WCSS) o inercia:

Aquí está el centroide del clúster y los puntos de datos en cada clúster:

Como puede ver, en k = 3, el gráfico comienza a aplanarse significativamente, por lo que elegiríamos 3 como
el número de grupos.

[325]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Encontremos el número óptimo de clústeres usando el método del codo en Python:

# importar pandas
importar pandas como pd

# importar matplotlib
importar matplotlib.pyplot como plt

# importar K-medias
de sklearn.cluster importar KMeans

# Crear un DataFrame
data = pd.DataFrame ({"X": [12,15,18,10,8,9,12,20], "Y":
[6,16,17,8,7,6,9,18] })
wcss_list = []

# Ejecutar un bucle para diferentes valores de número de clúster


para i en el rango (1, 6):
# Crea y ajusta el modelo KMeans
kmeans_model = KMeans (n_clusters = i, random_state = 123)
kmeans_model.fit (datos)
# Agregue el WCSS o la inercia de los clústeres al score_list
wcss_list.append (kmeans_model.inertia_)

# Trace la inercia (WCSS) y el número de grupos


plt.plot (rango (1, 6), wcss_list, marcador = '*')

# establecer título de la trama


plt.title ('Selección del número óptimo de clústeres usando el método de codo')

# Establecer etiqueta del eje x


plt.xlabel ('Número de clústeres K')

# Establecer etiqueta del eje y


plt.ylabel ('Suma de cuadrados dentro del clúster (inercia)')

# Mostrar gráfico
plt.show ()

[326]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Esto da como resultado la siguiente salida:

En el ejemplo anterior, creamos un DataFrame con dos columnas, X y Y. Generamos los clústeres
usando K-significa y calculó el WCSS. Después de esto, graficamos el número de conglomerados y
la inercia. Como puede ver en k = 2, el gráfico comienza a aplanarse significativamente, por lo que
elegiríamos 2 como el mejor número de grupos.

El método de la silueta
El método de silueta evalúa y valida los datos del clúster. Encuentra qué tan bien se clasifica cada punto de
datos. El gráfico de la puntuación de la silueta nos ayuda a visualizar e interpretar qué tan bien los puntos
de datos están estrechamente agrupados dentro de sus propios grupos y separados de los demás. Nos
ayuda a evaluar la cantidad de clústeres. Su puntuación varía de -1 a +1. Un valor positivo indica un grupo
bien separado y un valor negativo indica puntos de datos asignados incorrectamente. Cuanto más positivo
sea el valor, más puntos de datos proceden de los conglomerados más cercanos; un valor de cero indica
puntos de datos que están en la línea de separación entre dos grupos. Veamos la fórmula para la
puntuación de la silueta:

[327]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

aI es la distancia media del Ith punto de datos de otros puntos dentro del clúster.

BI es la distancia media del Iel punto de datos de otros puntos del clúster.

Esto significa que podemos decir fácilmente que Si) estaría entre [-1, 1]. Entonces, paraSi) estar cerca de 1, aIdebe ser
muy pequeño en comparación con BI, es decir,mi. aI << bI.

Encontremos el número óptimo de clústeres usando la puntuación de silueta en Python:

# importar pandas
importar pandas como pd

# importar matplotlib para visualización de datos


importar matplotlib.pyplot como plt

# importar k-means para realizar agrupaciones


de sklearn.cluster importar KMeans

# Importar puntuación de silueta


de sklearn.metrics importar silhouette_score

# Crear un DataFrame
data = pd.DataFrame ({"X": [12,15,18,10,8,9,12,20], "Y":
[6,16,17,8,7,6,9,18] })
score_list = []

# Ejecutar un bucle para diferentes valores de número de clúster


para i en el rango (2, 6):
# Crea y ajusta el modelo KMeans
kmeans_model = KMeans (n_clusters = i, random_state = 123)
kmeans_model.fit (datos)
# Hacer predicciones
pred = kmeans_model.predict (datos)
# Calcular la puntuación de silueta
score = silhouette_score (datos, pred, métrica = 'euclidiana')

# Agregue la puntuación de silueta de los grupos a la lista de puntuaciones


score_list.append (puntuación)

# Grafique la puntuación de silueta y el número de agrupaciones


plt.bar (rango (2, 6), score_list)

# Establecer título de la trama


plt.title ('Gráfico de puntuación de silueta')

# Establecer etiqueta del eje x


plt.xlabel ('Número de clústeres K')

[328]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

# Establecer etiqueta del eje y


plt.ylabel ('Puntuaciones de silueta')

# Mostrar gráfico
plt.show ()

Esto da como resultado la siguiente salida:

En el ejemplo anterior, creamos un DataFrame con dos columnas, X y Y. Generamos clústeres con
diferentes números de clústeres en el DataFrame creado usando K significa y calculó la puntuación de
silueta. Después de esto, graficamos el número de conglomerados y las puntuaciones de silueta usando
un diagrama de barras. Como puede ver, en k = 2, la puntuación de silueta tiene el valor más alto, por lo
que elegiríamos 2 grupos. Pasemos a la técnica de agrupamiento de k-medias.

Particionamiento de datos mediante agrupación en clústeres de k-means


k-means es uno de los algoritmos de agrupación en clúster más simples, populares y conocidos. Es una especie de
método de agrupación en clústeres de particiones. Divide los datos de entrada definiendo un centro de conglomerado
inicial aleatorio basado en un número determinado de conglomerados. En la siguiente iteración, asocia los elementos
de datos al centro del conglomerado más cercano utilizando la distancia euclidiana. En este algoritmo, el centro del
grupo inicial se puede elegir de forma manual o aleatoria. k-means toma datos y el número de clústeres como entrada
y realiza los siguientes pasos:

1. Seleccione k elementos de datos aleatorios como centros iniciales de conglomerados.

2. Asigne los elementos de datos al centro de clúster más cercano.

[329]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

3. Seleccione el nuevo centro del conglomerado promediando los valores de otros elementos del conglomerado.

4. Repita los pasos 2 y 3 hasta que no haya cambios en los grupos.

Este algoritmo tiene como objetivo minimizar la suma de errores al cuadrado:

k-means es uno de los algoritmos más rápidos y robustos de su tipo. Funciona mejor con un conjunto de datos
con elementos de datos distintos y separados. Genera racimos esféricos. k-means requiere el número de
clústeres como entrada al principio. Si los elementos de datos están muy superpuestos, no funciona bien.
Captura los óptimos locales de la función de error al cuadrado. No funciona bien con datos ruidosos y no
lineales. Tampoco funciona bien con clústeres no esféricos. Creemos un modelo de agrupación en clústeres
utilizando la agrupación en clústeres de k-means:

# importar pandas
importar pandas como pd

# importar matplotlib para visualización de datos


importar matplotlib.pyplot como plt

# Importar K-medias
de sklearn.cluster importar KMeans

# Crear un DataFrame
data = pd.DataFrame ({"X": [12,15,18,10,8,9,12,20], "Y":
[6,16,17,8,7,6,9,18] })

# Defina el número de clústeres


num_clusters = 2

# Crea y ajusta el modelo KMeans


km = KMeans (n_clusters = num_clusters) km.fit
(datos)

# Predecir la variable objetivo


pred = km.predict (datos)

# Trazar los clústeres


plt.scatter (datos.X, datos.Y, c = pred, marcador = "o", cmap = "bwr_r")

# Establecer título de la trama


plt.title ('Agrupación de K-medias')

[330]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

# Establecer etiqueta del eje x


plt.xlabel ('Valores del eje X')

# Establecer etiqueta del eje y


plt.ylabel ('Valores del eje Y')

# Mostrar la trama
plt.show ()

Esto da como resultado la siguiente salida:

En el ejemplo de código anterior, importamos el KMeans class y creó su objeto o modelo. Este modelo se ajustará
al conjunto de datos (sin etiquetas). Después del entrenamiento, el modelo está listo para hacer predicciones
usando elpredecir() método. Después de predecir los resultados, graficamos los resultados del conglomerado
utilizando un diagrama de dispersión. En esta sección, hemos visto cómo funciona k-means y su implementación
usando la biblioteca scikit-learn. En la siguiente sección, veremos la agrupación jerárquica.

[331]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Agrupación jerárquica
La agrupación jerárquica agrupa elementos de datos en función de diferentes niveles de una jerarquía. Combina los
elementos en grupos basados en diferentes niveles de una jerarquía utilizando estrategias de arriba hacia abajo o de
abajo hacia arriba. Según la estrategia utilizada, la agrupación jerárquica puede ser de dos tipos
- aglomerativo o divisivo:

El tipo aglomerativo es la técnica de agrupamiento jerárquico más utilizada. Agrupa


elementos de datos similares en forma de una jerarquía basada en la similitud. Este método
también se llamaAnidación aglomerativa (INÉS). Este algoritmo comienza considerando
cada elemento de datos como un grupo individual y combina grupos en función de la
similitud. Recopila iterativamente grupos pequeños y los combina en un solo grupo grande.
Este algoritmo da su resultado en forma de estructura de árbol. Funciona de forma
ascendente; es decir, cada elemento se considera inicialmente como un grupo de un solo
elemento y en cada iteración del algoritmo, los dos grupos más similares se combinan y
forman un grupo más grande.
El agrupamiento jerárquico divisivo es un algoritmo de estrategia de arriba hacia abajo. También se
conoce comoAnálisis divisivo (DIANA). Comienza con todos los elementos de datos como un solo
gran clúster y se particiona de forma recursiva. En cada iteración, los clústeres se dividen en dos
subgrupos heterogéneos o no similares:

[332]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Para decidir qué conglomerados deben agruparse o dividirse, utilizamos varias distancias y criterios de
vinculación, como vinculación simple, completa, promedio y centroide. Estos criterios deciden la forma
del grupo. Ambos tipos de agrupación jerárquica (agrupación jerárquica aglomerativa y divisiva)
requieren un número predefinido de agrupaciones o un umbral de distancia como entrada para terminar
el proceso recursivo. Es difícil decidir el umbral de distancia, por lo que la opción más fácil es verificar el
número de grupos usando un dendrograma. Los dendrogramas nos ayudan a comprender el proceso de
agrupamiento jerárquico. Veamos cómo crear un dendrograma usando elscipy Biblioteca:

# importar pandas
importar pandas como pd

# importar matplotlib para visualización de datos


importar matplotlib.pyplot como plt

# Importar dendrograma
desde scipy.cluster.hierarchy importar dendrograma desde
scipy.cluster.hierarchy importar enlace

# Crear un DataFrame
data = pd.DataFrame ({"X": [12,15,18,10,8,9,12,20], "Y":
[6,16,17,8,7,6,9,18] })

# crear dendrograma usando el enlace de barrio


dendrogram_plot = dendrogram (linkage (data, method = 'ward'))

# Establecer título de la trama


plt.title ('Agrupación jerárquica: dendrograma')

# Establecer etiqueta del eje x


plt.xlabel ('Elementos de datos')

# Establecer etiqueta del eje y


plt.ylabel ('Distancia')

# Mostrar la trama
plt.show ()

[333]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Esto da como resultado la siguiente salida:

En el ejemplo de código anterior, creamos el conjunto de datos y generamos el dendrograma usando el enlace
de barrio. Para los dendrogramas, usamos elscipy.cluster.hierarchymódulo. Para establecer el título de la gráfica
y las etiquetas del eje, usamosmatplotlib. Para seleccionar el número de conglomerados, necesitamos dibujar
una línea horizontal sin intersecar los conglomerados y contar el número de líneas verticales para encontrar el
número de conglomerados. Creemos un modelo de agrupamiento en clústeres utilizando agrupamiento
aglomerativo:

# importar pandas
importar pandas como pd

# importar matplotlib para visualización de datos


importar matplotlib.pyplot como plt

# Importación de agrupaciones aglomerativas


de sklearn.cluster importar AgglomerativeClustering

# Crear un DataFrame
data = pd.DataFrame ({"X": [12,15,18,10,8,9,12,20], "Y":
[6,16,17,8,7,6,9,18] })

# Especifique el número de clústeres


num_clusters = 2

# Crear modelo de agrupamiento aglomerativo

[334]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

ac = AgglomerativeClustering (n_clusters = num_clusters, linkage = 'ward')

# Ajuste el modelo de agrupamiento aglomerativo


ac.fit (datos)

# Predecir la variable objetivo


pred = ac.labels_

# Trazar los clústeres


plt.scatter (datos.X, datos.Y, c = pred, marcador = "o")

# Establecer título de la trama


plt.title ('Agrupación aglomerativa')

# Establecer etiqueta del eje x


plt.xlabel ('Valores del eje X')

# Establecer etiqueta del eje y


plt.ylabel ('Valores del eje Y')

# Mostrar la trama
plt.show ()

Esto da como resultado la siguiente salida:

[335]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

En el ejemplo de código anterior, importamos el Aglomerativo class y creó su objeto o modelo. Este modelo
encajará en el conjunto de datos sin etiquetas. Después del entrenamiento, el modelo está listo para hacer
predicciones usando elpredecir() método. Después de predecir los resultados, graficamos los resultados del
conglomerado utilizando un diagrama de dispersión. En esta sección, hemos visto cómo funciona la agrupación
jerárquica y su implementación utilizando elscipy y bibliotecas scikit-learn. En la siguiente sección, veremos la
agrupación en clústeres basada en densidad.

Agrupación en clústeres DBSCAN


Los métodos de agrupamiento de particiones, como k-medias, y los métodos de agrupamiento jerárquico,
como el agrupamiento aglomerativo, son buenos para descubrir agrupaciones esféricas o convexas. Estos
algoritmos son más sensibles al ruido o valores atípicos y funcionan para clústeres bien separados:

Intuitivamente, podemos decir que un enfoque de agrupamiento basado en densidad es muy similar a cómo nosotros, como
humanos, podríamos agrupar elementos instintivamente. En todas las figuras anteriores, podemos ver rápidamente el número
de grupos o conglomerados diferentes debido a la densidad de los elementos.

Agrupación espacial basada en densidad de aplicaciones con ruido (DBSCAN) se basa en la idea de grupos y
ruido. La idea principal detrás de esto es que cada elemento de datos de un grupo o conglomerado tiene un
número mínimo de elementos de datos en un radio determinado.

[336]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

El objetivo principal de DBSCAN es descubrir la región densa que se puede calcular utilizando un
número mínimo de objetos (minPoints) y radio dado (eps). DBSCAN tiene la capacidad de generar
formas aleatorias de clústeres y lidiar con el ruido en un conjunto de datos. Además, no es necesario
alimentar el número de clústeres. DBSCAN identifica automáticamente el número de grupos en los
datos.

Creemos un modelo de agrupación en clústeres utilizando la agrupación en clústeres DBSCAN en Python:

# importar pandas
importar pandas como pd

# importar matplotlib para visualización de datos


importar matplotlib.pyplot como plt

# Importar modelo de clúster DBSCAN


desde sklearn.cluster importar DBSCAN

# importar conjunto de datos make_moons


de sklearn.datasets importar make_moons

# Genera algunos datos lunares aleatorios


características, etiqueta = make_moons (n_samples = 2000)

# Crear modelo de clúster DBSCAN


db = DBSCAN ()

# Ajuste el modelo de agrupamiento espectral


db.fit (características)

# Predecir la variable objetivo


pred_label = db.labels_

# Trazar los clústeres


plt.scatter (características [:, 0], características [:, 1], c = pred_label, marker =
"o", cmap = "bwr_r")

# Establecer título de la trama


plt.title ('Clúster DBSCAN')

# Establecer etiqueta del eje x


plt.xlabel ('Valores del eje X')

# Establecer etiqueta del eje y


plt.ylabel ('Valores del eje Y')

# Mostrar la trama
plt.show ()

[337]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Esto da como resultado la siguiente salida:

Primero, importamos el DBSCAN class y cree el conjunto de datos lunares. Después de esto, creamos el modelo
DBSCAN y lo ajustamos al conjunto de datos. DBSCAN no necesita el número de clústeres. Después del entrenamiento,
el modelo está listo para hacer predicciones usando elpredecir() método. Después de predecir los resultados,
graficamos los resultados del conglomerado utilizando un diagrama de dispersión. En esta sección, hemos visto cómo
funciona la agrupación en clústeres de DBSCAN y su implementación utilizando la biblioteca scikit-learn. En la siguiente
sección, veremos la técnica de agrupamiento espectral.

Agrupación espectral
La agrupación espectral es un método que emplea el espectro de una matriz de similitud. El espectro de
una matriz representa el conjunto de sus valores propios, y una matriz de similitud consta de puntuaciones
de similitud entre cada punto de datos. Reduce la dimensionalidad de los datos antes de la agrupación. En
otras palabras, podemos decir que la agrupación espectral crea un gráfico de puntos de datos, y estos
puntos se asignan a una dimensión inferior y se separan en grupos.

[338]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Una matriz de similitud convierte los datos para vencer la falta de convexidad en la distribución. Para cualquier
conjunto de datos, los puntos de datos pueden sernorte-dimensional, y aquí podría ser metro puntos de datos. A
partir de estosmetro puntos, podemos crear un gráfico donde los puntos son nodos y los bordes se ponderan
con la similitud entre los puntos. Una forma común de definir la similitud es con un kernel gaussiano, que es una
función no lineal de la distancia euclidiana:

La distancia de esta función varía de 0 a 1. El hecho de que esté limitada entre cero y uno es una buena
propiedad. La distancia absoluta (puede ser cualquier cosa) en la distancia euclidiana puede causar
inestabilidad y dificultad en el modelado. Puede pensar en el kernel gaussiano como una función de
normalización para la distancia euclidiana.

Después de obtener el gráfico, cree una matriz de adyacencia y coloque en cada celda de la matriz el
peso del borde. Esta es una matriz simétrica. Llamemos a la matriz de adyacencia A. Nosotros
también puede crear una matriz diagonal D de "grados", que tendrá en cada elemento la suma de
los pesos de todos los bordes vinculados al nodo I. Llamemos a esta matriz D. Para una gráfica dada G connortevértices, su norte
*norte La matriz laplaciana se puede definir de la siguiente manera:

Aquí D es la matriz de grados y A es la matriz de adyacencia del gráfico.

Ahora tenemos la matriz laplaciana del gráfico (G). Podemos calcular el espectro de una matriz de vectores
propios. Si tomamosk vectores propios menos significativos, obtenemos una representación enk
dimensiones. Los autovectores menos significativos son los asociados con los autovalores más pequeños.
Cada vector propio proporciona información sobre la conectividad del gráfico.

La idea de la agrupación espectral es agrupar los puntos utilizando estos k vectores propios como
características. Entonces, toma elk vectores propios menos significativos y tienes tu metro puntos en k
dimensiones. Ejecuta un algoritmo de agrupación en clústeres, como k-means, y luego tiene su resultado. Estak
en agrupamiento espectral está profundamente relacionado con las k-medias del kernel de Gauss. También
puede considerarlo como un método de agrupamiento en el que sus puntos se proyectan en un espacio de
dimensiones infinitas, agrupados allí, y luego utiliza esos resultados como el resultado de agrupar sus puntos.

[339]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

El agrupamiento espectral se usa cuando k-means funciona mal porque los grupos no se pueden distinguir linealmente
en su espacio original. También podemos probar otros métodos de agrupamiento, como el agrupamiento jerárquico o
el agrupamiento basado en densidad, para resolver este problema. Creemos un modelo de agrupamiento usando
agrupamiento espectral en Python:

# importar pandas
importar pandas como pd

# importar matplotlib para visualización de datos


importar matplotlib.pyplot como plt

# Importar agrupación espectral


de sklearn.cluster importar SpectralClustering

# Crear un DataFrame
data = pd.DataFrame ({"X": [12,15,18,10,8,9,12,20], "Y":
[6,16,17,8,7,6,9,18] })

# Especifique el número de clústeres


num_clusters = 2

# Crear modelo de agrupamiento espectral


sc = SpectralClustering (num_clusters, affinity = 'rbf', n_init = 100, assign_labels =
'discretizar')

# Ajuste el modelo de agrupamiento espectral


sc.fit (datos)

# Predecir la variable objetivo


pred = sc.labels_

# Trazar los clústeres


plt.scatter (datos.X, datos.Y, c = pred, marcador = "o")

# Establecer título de la trama


plt.title ('Agrupación espectral')

# Establecer etiqueta del eje x


plt.xlabel ('Valores del eje X')

# Establecer etiqueta del eje y


plt.ylabel ('Valores del eje Y')

# Mostrar la trama
plt.show ()

[340]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Esto da como resultado la siguiente salida:

En el ejemplo de código anterior, importamos el Agrupación espectral class y creó un conjunto de datos ficticio
utilizando pandas. Después de esto, creamos el modelo y lo ajustamos al conjunto de datos. Después del
entrenamiento, el modelo está listo para hacer predicciones usando elpredecir() método. En esta sección, hemos
visto cómo funciona la agrupación espectral y su implementación utilizando la biblioteca scikit-learn. En la
siguiente sección, veremos cómo evaluar el rendimiento de un algoritmo de agrupación en clústeres.

Evaluación del rendimiento de la agrupación en clústeres


La evaluación del rendimiento de la agrupación en clústeres es un paso esencial para evaluar la solidez de un
algoritmo de agrupación en un determinado conjunto de datos. Evaluar el desempeño en un entorno sin
supervisión no es una tarea fácil, pero en la literatura hay muchos métodos disponibles. Podemos clasificar
estos métodos en dos categorías amplias: evaluación de desempeño interna y externa. Aprendamos sobre estas
dos categorías en detalle.

[341]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Evaluación de desempeño interno


En la evaluación del rendimiento interno, la agrupación en clústeres se evalúa solo en función de los datos de características.
Este método no utiliza ninguna información de etiqueta de destino. Estas medidas de evaluación asignan mejores puntuaciones
a los métodos de agrupación que generan agrupaciones bien separadas. En este caso, una puntuación alta no garantiza
resultados de agrupación eficaces.

La evaluación interna del desempeño nos ayuda a comparar múltiples algoritmos de agrupamiento,
pero no significa que un algoritmo de mejor puntuación generará mejores resultados que otros
algoritmos. Las siguientes medidas de evaluación del desempeño interno se pueden utilizar para estimar
la calidad de los clústeres generados:

El índice de Davies-Bouldin
los Índice de Davies-Bouldin (BDI) es la relación entre la distancia entre grupos y la distancia entre grupos. Un
valor de DBI más bajo significa mejores resultados de agrupación. Esto se puede calcular de la siguiente
manera:

Aquí, se aplica lo siguiente:

n: el número de conglomerados cI: El centroide del clúster IσI: La distancia intra-conglomerado o la

distancia promedio de todos los elementos del conglomerado desde el centroide cI

corriente continuaI, Cj): La distancia entre grupos entre dos centroides de grupo cI y Cj

El coeficiente de silueta
El coeficiente de silueta encuentra la similitud de un elemento de un grupo con sus propios elementos de grupo y otros
grupos más cercanos. También se utiliza para encontrar el número de conglomerados, como hemos visto en otra parte
de este capítulo. Un alto coeficiente de silueta significa mejores resultados de agrupamiento. Esto se puede calcular de
la siguiente manera:

[342]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

aI es la distancia media del Ith los datos apuntan a otros puntos dentro del clúster.

BI es la distancia media del Ith los datos apuntan a otros puntos del clúster.

Entonces, podemos decir que Si) estaría entre [-1, 1]. Entonces, paraSi) estar cerca de 1, aI debe ser muy
pequeño en comparación con bI, eso es unI << bI.

Evaluación externa del desempeño


En la evaluación del desempeño externo, la agrupación en clústeres generada se evalúa utilizando las
etiquetas reales de las agrupaciones que no se utilizan en el proceso de agrupación. Es similar a un proceso de
evaluación de aprendizaje supervisado; es decir, podemos usar aquí la misma matriz de confusión para evaluar
el desempeño. Las siguientes medidas de evaluación externa se utilizan para evaluar la calidad de los clústeres
generados.

La puntuación de Rand
La puntuación Rand muestra qué tan similar es un grupo a la clasificación de referencia y calcula el
porcentaje de decisiones tomadas correctamente. Es preferible un valor más bajo porque representa
grupos distintos. Esto se puede calcular de la siguiente manera:

Aquí, se aplica lo siguiente:

TP: Número total de verdaderos positivos


TN: Número total de verdaderos negativos
FP: Número total de falsos positivos FN:
Número total de falsos negativos

La puntuación de Jaccard
La puntuación de Jaccard calcula la similitud entre dos conjuntos de datos. Va de 0 a 1. 1 significa que los
conjuntos de datos son idénticos y 0 significa que los conjuntos de datos no tienen elementos comunes. Es
preferible un valor bajo porque indica agrupaciones distintas. Esto se puede calcular de la siguiente manera:

[343]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Aquí A y B son dos conjuntos de datos.

Medida F o puntuación F1
La medida F es una media armónica de precisión y valores de recuperación. Mide tanto la precisión como la
robustez de los algoritmos de agrupación en clústeres. También intenta igualar la participación de falsos
negativos utilizando el valor de β. Esto se puede calcular de la siguiente manera:

Aquí β es el valor no negativo. β = 1 le da el mismo peso a la precisión y al recuerdo, β = 0.5 le da


el doble de peso a la precisión que al recuerdo, y β = 0 no le da importancia al recuerdo.

La puntuación de Fowlkes-Mallows
La puntuación de Fowlkes-Mallows es una media geométrica de precisión y recuerdo. Un valor alto
representa grupos similares. Esto se puede calcular de la siguiente manera:

Creemos un modelo de clúster utilizando agrupación de k-medias y evaluemos el rendimiento


utilizando las medidas de evaluación internas y externas en Python utilizando la diabetes india Pima.
conjunto de datoshttps://github.com/PacktPublishing/Python-Data-Analysis-Third-Edition/b lob /
master / Chapter11 / diabetes.csv):

# Importar bibliotecas
importar pandas como pd

# leer el conjunto de datos


diabetes = pd.read_csv ("diabetes.csv")

# Mostrar los 5 mejores registros


diabetes.head ()

[344]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Esto da como resultado la siguiente salida:

Primero, necesitamos importar pandas y leer el conjunto de datos. En el ejemplo anterior, estamos leyendo
el conjunto de datos Pima Indian Diabetes:

# dividir el conjunto de datos en dos partes: conjunto de características y etiqueta de destino


feature_set = ['embarazada', 'insulina', 'bmi', 'edad',
'glucosa', 'bp', 'pedigree']

features = diabetes [feature_set] target =


diabetes.label

Después de cargar el conjunto de datos, necesitamos dividir el conjunto de datos en columnas dependientes / de etiqueta (objetivo) y
columnas independientes / de características (conjunto de características). Después de esto, el conjunto de datos se dividirá en conjuntos
de prueba y de tren. Ahora tanto las columnas dependientes como las independientes están rotas
en trenes y conjuntos de prueba (feature_train, feature_test, target_train,
y prueba_objetivo) utilizando train_test_split (). Dividamos el conjunto de datos en partes de prueba y tren:

# particionar los datos en un conjunto de entrenamiento y prueba


de sklearn.model_selection importar train_test_split

feature_train, feature_test, target_train, target_test = train_test_split (features, target,


test_size = 0.3, random_state = 1)

Aquí, train_test_split () toma los DataFrames dependientes e independientes,test_size y


estado_aleatorio. Aquí, test_size decidirá la relación para la división de prueba de tren (teniendo un
test_size valor de 0,3 significa que el 30% de los datos irán al conjunto de prueba y el 70% restante al
conjunto de entrenamiento), y estado_aleatorio se utiliza como valor inicial para reproducir la misma
división de datos cada vez. Siestado_aleatorio es Ninguno, luego dividirá los registros de forma
aleatoria cada vez, lo que dará diferentes medidas de rendimiento:

# Importar clústeres de K-medias


de sklearn.cluster importar KMeans

[345]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

# Módulo de métricas de importación para evaluación de desempeño


de sklearn.metrics importar davies_bouldin_score de
sklearn.metrics importar silhouette_score de sklearn.metrics
importar ajustar_rand_score de sklearn.metrics importar
jaccard_score de sklearn.metrics importar f1_score

de sklearn.metrics importar fowlkes_mallows_score

# Especifique la cantidad de clústeres


num_clusters = 2

# Crea y ajusta el modelo KMeans


km = KMeans (n_clusters = num_clusters) km.fit
(feature_train)

# Predecir la variable objetivo


predicciones = km.predict (feature_test)

# Calcular medidas de evaluación del desempeño interno


print ("Índice Davies-Bouldin:", davies_bouldin_score (feature_test, predictions))

print ("Coeficiente de silueta:", silhouette_score (feature_test, predictions))

# Calcular medidas externas de evaluación del desempeño


print ("Puntaje Rand ajustado:", puntaje_y_ajustado (prueba_objetivo, predicciones))

print ("Puntaje Jaccard:", jaccard_score (target_test, predictions)) print ("F-Measure (F1-


Score):", f1_score (target_test, predictions)) print ("Fowlkes Mallows Score:",
fowlkes_mallows_score (target_test, predictions) ))

Esto da como resultado la siguiente salida:

Índice Davies-Bouldin: 0,7916877512521091 Coeficiente


de silueta: 0,5365443098840619 Puntuación Rand
ajustada: 0,03789319261940484 Puntuación Jaccard:
0,22321428571428573 Medida F (Puntuación F1):
0,36496350364963503 Puntuación de Fowlkes Mallows:
0,60412444573

Primero, importamos el KMeans y métrica módulos. Creamos un objeto o modelo k-means y lo ajustamos
al conjunto de datos de entrenamiento (sin etiquetas). Después del entrenamiento, el modelo hace
predicciones y estas predicciones se evalúan utilizando medidas internas, como el DBI y el coeficiente de
silueta, y medidas de evaluación externas, como la puntuación Rand, la puntuación Jaccard, la F-Measure y
la Fowlkes-Mallows. puntaje.

[346]
Aprendizaje no supervisado: PCA y agrupación en clústeres Capítulo 11

Resumen
En este capítulo, hemos descubierto el aprendizaje no supervisado y sus técnicas, como la reducción de
dimensionalidad y la agrupación. El enfoque principal fue el PCA para la reducción de dimensionalidad y
varios métodos de agrupamiento, como agrupamiento de k-medias, agrupamiento jerárquico, DBSCAN
y agrupamiento espectral. El capítulo comenzó con la reducción de dimensionalidad y PCA. Después de
PCA, nuestro enfoque principal fue en las técnicas de agrupación y cómo identificar el número de
agrupaciones. En secciones posteriores, pasamos a las medidas de evaluación del desempeño del
clúster, como el DBI y el coeficiente de silueta, que son medidas internas. Después de analizar las
medidas internas de agrupamiento, analizamos medidas externas como la puntuación Rand, la
puntuación Jaccard, la medida F y el índice Fowlkes-Mallows.

El próximo capítulo, Capítulo 12, Analizar datos textuales, se centrará en el análisis de texto, cubriendo el
preprocesamiento y la clasificación de texto mediante NLTK, SpaCy y scikit-learn. El capítulo comienza
explorando operaciones básicas sobre datos textuales, como la normalización de texto mediante tokenización,
eliminación de palabras vacías, derivación y lematización, etiquetado de partes del discurso, reconocimiento de
entidades, análisis de dependencias y nubes de palabras. En secciones posteriores, la atención se centrará en
los enfoques de ingeniería de características como Bolsa de palabras, presencia de términos, TF-IDF, análisis de
sentimientos, clasificación de texto y similitud de texto.

[347]
Sección 4: PNL, análisis
-
de imágenes y paralelo
Informática
El objetivo principal de esta sección es obtener una descripción general de la PNL, el análisis de imágenes y la
computación paralela. Las habilidades de PNL comprenden preprocesamiento de texto, análisis de sentimientos y
similitud de texto utilizando NLTK y SpaCy. El análisis de imágenes comprende el procesamiento de imágenes y la
detección de rostros mediante OpenCV. Esta sección también se centra en el cálculo paralelo de DataFrames,
matrices y algoritmos de aprendizaje automático.

Esta sección incluye los siguientes capítulos:

Capítulo 12, Analizar datos textualesCapítulo 13,


Analizar datos de imagenCapítulo 14,
Computación en paralelo con Dask
Analizar datos textuales
--
En la era de la información, los datos se producen a velocidades y volúmenes increíbles. Los datos
producidos no solo son de tipo estructurado o tabular, también pueden estar en una variedad de
tipos no estructurados, como datos textuales, datos de imágenes o gráficos, datos de voz y video. El
texto es un tipo de datos muy común y rico. Los artículos, blogs, tutoriales, publicaciones en redes
sociales y contenido del sitio web producen datos textuales no estructurados. Las personas envían
miles de correos electrónicos, mensajes, comentarios y tweets cada minuto. Es necesario extraer
una cantidad tan grande de datos de texto. La analítica de texto ofrece muchas oportunidades para
la gente de negocios; por ejemplo, Amazon puede interpretar los comentarios de los clientes sobre
un producto en particular, los analistas de noticias pueden analizar las tendencias de las noticias y
los últimos problemas en Twitter, y Netflix también puede interpretar reseñas de cada película y
serie web.

En este capítulo, comenzaremos con operaciones básicas de análisis de texto como tokenización, eliminación de
palabras vacías, derivación, lematización, etiquetado de PoS y reconocimiento de entidades. Después de esto,
veremos cómo visualizar su análisis de texto usando WordCloud. Veremos cómo conocer las opiniones de los
clientes sobre un producto en base a reseñas, utilizando análisis de sentimiento. Aquí, realizaremos un análisis
de sentimiento utilizando la clasificación de texto y evaluaremos el rendimiento del modelo utilizando exactitud,
precisión, recuperación y puntuación f1. Finalmente, nos centraremos en la similitud de texto entre dos
oraciones usando Jaccard y la similitud de coseno.

Los temas de este capítulo se enumeran a continuación:

Instalación de la normalización
NLTK y SpaCy Text
Tokenización
Eliminar palabras vacías
Etiquetado POS de derivación y
lematización
Analizar datos textuales Capítulo 12

Reconocer entidades
Análisis de dependencias
Crear una nube de palabras
Bolsa de palabras
TF-IDF
Análisis de sentimientos mediante clasificación de texto
Similitud de texto

Requerimientos técnicos
Este capítulo tiene los siguientes requisitos técnicos:

Puede encontrar el código y los conjuntos de datos en el siguiente enlace de GitHub: https: / /
github. com / PacktPublishing / Python- Análisis de datos- Tercera edición / tree / master /
Chapter12.
Todos los bloques de código están disponibles en el ch12.ipynb expediente. Este capítulo
utiliza solo un archivo TSV (amazon_alexa.tsv) con fines de práctica.
En este capítulo, usaremos las bibliotecas Python NLTK, SpaCy, WordCloud,
matplotlib, seaborn y scikit-learn.

Instalación de NLTK y SpaCy


NLTK es uno de los paquetes de Python más populares y esenciales para el procesamiento del lenguaje natural.
Ofrece todas las operaciones de PNL básicas y avanzadas. Comprende algoritmos comunes como tokenización,
derivación, lematización, parte del discurso y reconocimiento de entidades con nombre. Las principales
características de la biblioteca NLTK son que es de código abierto, fácil de aprender, fácil de usar, tiene una
comunidad destacada y tiene documentación bien organizada. La biblioteca NLTK se puede instalar utilizando el
instalación de pip comando que se ejecuta en la línea de comando de la siguiente manera:

pip instalar nltk

NLTK no es una biblioteca preinstalada en Anaconda. Podemos instalar directamentenltk en el Jupyter


Notebook. Podemos usar un signo de exclamación (!) Antes del comando en la celda:

! pip install nltk

[350]
Analizar datos textuales Capítulo 12

SpaCy es otro paquete de Python esencial y poderoso para PNL. Ofrece un algoritmo de PNL común, así
como funcionalidades avanzadas. Está diseñado para fines de producción y desarrolla aplicaciones para
un gran volumen de datos. La biblioteca SpaCy se puede instalar usando elinstalación de pip comando que
se ejecuta en la línea de comando de la siguiente manera:

pip instalar spacy

Después de instalar spaCy, necesitamos instalar un espacioso Modelo en idioma inglés. Podemos instalarlo
usando el siguiente comando:

python -m spacy descargar es

Spacy y su modelo en inglés no están preinstalados en Anaconda. Podemos instalar directamente


espacioso usando el siguiente código. Podemos usar el signo de exclamación (!) Antes del comando en la
celda:

! pip instalar spacy


! python -m spacy descargar es

Usando la sintaxis anterior, podemos instalar espacioso y su modelo en inglés en Jupyter


Notebooks.

Normalización de texto
La normalización de texto convierte el texto en formato estándar o canónico. Asegura la coherencia y
ayuda en el procesamiento y análisis. No existe un enfoque único para el proceso de normalización. El
primer paso en la normalización es la minúscula de todo el texto. Es el método más simple, aplicable y
eficaz para el preprocesamiento de texto. Otro enfoque podría ser el manejo de palabras mal escritas,
acrónimos, formas cortas y el uso de palabras fuera del vocabulario; por ejemplo, "super", "superb" y
"superrrr" se pueden convertir en "super". La normalización de texto maneja el ruido y las perturbaciones
en los datos de prueba y prepara datos sin ruido. También aplicamos derivación y lematización para
normalizar las palabras presentes en el texto.

Realicemos una operación de normalización básica convirtiendo el texto a minúsculas:

# Texto de entrada
párrafo = "" "Taj Mahal es uno de los hermosos monumentos. Es una de las maravillas del mundo.
Fue construido por Shah Jahan en 1631 en memoria de su tercera esposa amada Mumtaj Mahal." ""

# Conversión de párrafo en minúsculas


imprimir (párrafo.bajo ())

[351]
Analizar datos textuales Capítulo 12

Esto da como resultado la siguiente salida:

taj mahal es uno de los hermosos monumentos. es una de las maravillas del mundo. fue
construido por shah jahan en 1631 en memoria de su tercera esposa amada, mumtaj mahal.

En el bloque de código anterior, hemos convertido el párrafo de entrada dado en minúsculas


usando el más bajo() método.

En PNL, la normalización de texto se ocupa de la aleatoriedad y convierte el texto en una forma estándar que
mejora el rendimiento general de las soluciones de PNL. También reduce el tamaño de la matriz de términos del
documento al convertir las palabras en su palabra raíz. En las próximas secciones, nos centraremos en las
operaciones básicas de preprocesamiento de texto.

Tokenización
La tokenización es el paso inicial en el análisis de texto. La tokenización se define como dividir párrafos de
texto en partes más pequeñas o tokens, como oraciones o palabras, e ignorar los signos de puntuación.
La tokenización puede ser de dos tipos: tokenización de oraciones y tokenización de palabras. Un
tokenizador de oraciones divide un párrafo en oraciones y el tokenizador de palabras divide un texto en
palabras o tokens.

Tokenicemos un párrafo usando NLTK y spaCy:

1. Antes de la tokenización, importe NLTK y descargue los archivos necesarios:

# Cargando módulo NLTK


importar nltk

# descargando punkt
nltk.download ('punkt')

# descargando palabras vacías


nltk.download ('palabras vacías')

# descargando wordnet
nltk.download ('wordnet')

# downloading average_perception_tagger
nltk.download ('averaged_perceptron_tagger')

[352]
Analizar datos textuales Capítulo 12

2. Ahora, convertiremos los párrafos en oraciones usando el sent_tokenize ()


método de NLTK:

# Tokenización de sentencias
desde nltk.tokenize import sent_tokenize

párrafo = "" "Taj Mahal es uno de los hermosos monumentos. Es una de las maravillas del
mundo. Fue construido por Shah Jahan en 1631 en memoria de su tercera esposa amada
Mumtaj Mahal." ""

tokenized_sentences = sent_tokenize (párrafo) print


(tokenized_sentences)

Esto da como resultado la siguiente salida:

['El Taj Mahal es uno de los monumentos más hermosos', 'Es una de las maravillas del
mundo', 'Fue construido por Shah Jahan en 1631 en memoria de su tercera esposa
amada, Mumtaj Mahal.']

En el ejemplo anterior, tomamos un párrafo y lo pasamos como parámetro al


sent_tokenize () método. El resultado de este método será una lista de oraciones.

Tokenicemos el párrafo en oraciones usando spaCy:


# Importar espacio
importar espacio

# Cargando modelo de idioma inglés


nlp = spacy.load ("en")

# Construya la tubería nlp usando 'sentencizer'


sent_pipe = nlp.create_pipe ('sentencizer')

# Agregue la tubería del sentenciador a la tubería de nlp


nlp.add_pipe (sent_pipe)
párrafo = "" "Taj Mahal es uno de los hermosos monumentos. Es una de las maravillas del mundo.
Fue construido por Shah Jahan en 1631 en memoria de su tercera esposa amada Mumtaj Mahal."
""

# Crear objeto nlp para manejar anotaciones lingüísticas en documentos.


nlp_doc = nlp (párrafo)

# Generar lista de frases tokenizadas


tokenized_sentences = []
para la oración en nlp_doc.sents:
tokenized_sentences.append (texto de la oración) print
(tokenized_sentences)

[353]
Analizar datos textuales Capítulo 12

Esto da como resultado la siguiente salida:

['El Taj Mahal es uno de los monumentos más hermosos', 'Es una de las maravillas del mundo', 'Fue
construido por Shah Jahan en 1631 en memoria de su tercera esposa amada, Mumtaj Mahal.']

En el ejemplo anterior, primero, hemos importado el modelo de idioma inglés y lo hemos


instanciado. Después de esto, creamos la tubería NLP usandosentenciador y lo agregó a la tubería.
Finalmente, creamos el objeto NLP e iteramos a través delenvía atributo del objeto NLP para crear
una lista de oraciones tokenizadas.

Simbolicemos párrafos en palabras usando el word_tokenize () función de NLTK:

# Importar método nltk word_tokenize


de nltk.tokenize importar word_tokenize

# Dividir el párrafo en palabras


tokenized_words = word_tokenize (párrafo) print
(tokenized_words)

Esto da como resultado la siguiente salida:

['Taj', 'Mahal', 'es', 'uno', 'de', 'el', 'hermoso', 'monumento', '.', 'Es', 'es', 'uno', ' de ',' el ',' maravillas ',' de
',' el ',' mundo ','. ',' Eso ',' fue ',' construido ',' por ',' Shah ',' Jahan ' , 'en', '1631', 'en', 'memoria', 'de',
'su', 'tercera', 'amada', 'esposa', 'Mumtaj', 'Mahal', '.']

En el ejemplo anterior, tomamos un párrafo y lo pasamos como parámetro al


word_tokenize () método. El resultado de este método será una lista de palabras.

Simbolicemos el párrafo en palabras usando spaCy:

# Importar espacio
importar espacio

# Cargando modelo de idioma inglés


nlp = spacy.load ("en")

párrafo = "" "Taj Mahal es uno de los hermosos monumentos. Es una de las maravillas del mundo.
Fue construido por Shah Jahan en 1631 en memoria de su tercera esposa amada Mumtaj Mahal."
""

# Crear objeto nlp para manejar anotaciones lingüísticas en documentos.


my_doc = nlp (párrafo)

# convertir el párrafo en palabras


tokenized_words = []
para token en my_doc:

[354]
Analizar datos textuales Capítulo 12

tokenized_words.append (token.text)

imprimir (tokenized_words)

Esto da como resultado la siguiente salida:

['Taj', 'Mahal', 'es', 'uno', 'de', 'el', 'hermoso', 'monumento', '.', 'Es', 'es', 'uno', ' de ',' el ',' maravillas ',' de
',' el ',' mundo ','. ',' Eso ',' fue ',' construido ',' por ',' Shah ',' Jahan ' , 'en', '1631', 'en', 'memoria', 'de',
'su', 'tercera', 'amada', 'esposa', 'Mumtaj', 'Mahal', '.']

En el ejemplo anterior, primero importamos el modelo de idioma inglés y lo instanciamos. Después de


esto, creamos un párrafo de texto. Finalmente, creamos el objeto NLP usando párrafos de texto y lo
iteramos para crear una lista de palabras tokenizadas.

Creemos la distribución de frecuencia de las palabras tokenizadas:

# Distribución de frecuencia de importación


de nltk.probability import FreqDist

# Encuentra la distribución de frecuencia del párrafo


fdist = FreqDist (tokenized_words)

# Revisa las 5 palabras más comunes


fdist.most_common (5)

Esto da como resultado la siguiente salida:

[('de', 4), ('el', 3), ('.', 3), ('Mahal', 2), ('es', 2)]

Creemos una gráfica de distribución de frecuencia usando matplotlib:

# Importar matplotlib
importar matplotlib.pyplot como plt

# Gráfica de distribución de frecuencia


fdist.plot (20, acumulativo = Falso) plt.show
()

[355]
Analizar datos textuales Capítulo 12

Esto da como resultado la siguiente salida:

En el ejemplo anterior, hemos generado la distribución de frecuencia de tokens usando el


FreqDist clase. Después de la tokenización de oraciones y palabras, aprenderemos cómo eliminar
palabras vacías del texto dado.

Eliminar palabras vacías


Las palabras vacías se cuentan como ruido en el análisis de texto. Cualquier párrafo de texto debe tener verbos, artículos
y proposiciones. Todas estas se consideran palabras vacías. Las palabras vacías son necesarias para la conversación
humana, pero no hacen muchas contribuciones en el análisis de texto. La eliminación de palabras vacías del texto se
denomina eliminación de ruido.

Veamos cómo eliminar palabras vacías usando NLTK:

# importar las palabras vacías de nltk


de nltk.corpus importar palabras irrelevantes

# Cargar lista de palabras vacías en inglés


stopwords_set = set (stopwords.words ("inglés"))

# Eliminación de palabras vacías del texto

[356]
Analizar datos textuales Capítulo 12

lista_palabras_filtradas = []
por palabra en tokenized_words:
# filtrar palabras vacías
si la palabra no está en stopwords_set:
lista_palabras_filtradas.append (palabra)

# imprimir palabras tokenizadas


print ("Lista de palabras con token:", tokenized_words)

# imprimir palabras filtradas


print ("Lista de palabras filtradas:", lista_palabras_filtradas)

Esto da como resultado la siguiente salida:

Lista de palabras tokenizadas: ['Taj', 'Mahal', 'es', 'uno', 'de', 'el', 'hermoso', 'monumentos', '.', 'Eso',
'es', ' uno ',' de ',' el ',' maravillas ',' de ',' el ',' mundo ','. ',' Eso ',' fue ',' construido ',' por ',' Shah ' ,
'Jahan', 'en', '1631', 'en', 'memoria', 'de', 'su', 'tercera', 'amada', 'esposa', 'Mumtaj', 'Mahal', ' . ']

Lista de palabras filtradas: ['Taj', 'Mahal', 'uno', 'hermoso', 'monumentos', '.', 'Eso', 'uno', 'maravillas',
'mundo', '.', ' Ella ',' construyó ',' Shah ',' Jahan ',' 1631 ',' memoria ',' tercera ',' amada ',' esposa ','
Mumtaj ',' Mahal ','. ']

En el ejemplo anterior, primero importamos las palabras vacías y cargamos la lista de palabras en inglés.
Después de esto, iteramos la lista de palabras tokenizada que generamos en la sección anterior usando un
por bucle y filtró las palabras tokenizadas de la lista de palabras de parada utilizando el sicondición.
Guardamos las palabras filtradas en elfltered_word_list objeto de lista.

Veamos cómo eliminar palabras vacías usando spaCy:

# Importar espacio
importar espacio

# Cargando modelo de idioma inglés


nlp = spacy.load ("en")

# párrafo de texto
párrafo = "" "Taj Mahal es uno de los hermosos monumentos. Es una de las maravillas del mundo.
Fue construido por Shah Jahan en 1631 en memoria de su tercera esposa amada Mumtaj Mahal."
""

# Crear objeto nlp para manejar anotaciones lingüísticas en documentos.


my_doc = nlp (párrafo)

# Eliminación de palabras vacías del texto


filter_token_list = [] para el token
en my_doc:

[357]
Analizar datos textuales Capítulo 12

# filtrar palabras vacías


if token.is_stop == False:
filter_token_list.append (token)

print ("Lista de palabras filtradas:", filter_token_list)

Esto da como resultado la siguiente salida:

Oración filtrada: [Taj, Mahal, hermoso, monumento,., Maravillas, mundo,., Construido, Shah, Jahan,
1631, memoria, amada, esposa, Mumtaj, Mahal,.]

En el ejemplo anterior, primero importamos las palabras vacías y cargamos la lista de palabras en inglés
en la variable palabras vacías. Después de esto, iteramos el objeto NLP usando unpor bucle y filtró cada
palabra con la propiedad "is_stop " de la lista de palabras vacías usando el sicondición. Agregamos las
palabras filtradas en elfltered_token_list objeto de lista. En esta sección, hemos analizado la eliminación de
palabras vacías. Ahora es el momento de aprender sobre la derivación y la lematización para encontrar la
raíz de la palabra.

Derivado y lematización
La derivación es otro paso en el análisis de texto para la normalización a nivel de idioma. El proceso
de derivación reemplaza una palabra con su raíz. Corta los prefijos y sufijos. Por ejemplo, la palabra
conectar es la raíz de conectar, conectar y conectar. Todas las palabras mencionadas tienen una raíz
común:conectar. Tales diferencias entre la ortografía de las palabras dificultan el análisis de los
datos del texto.

La lematización es otro tipo de normalización del léxico, que convierte una palabra en su raíz. Está
estrechamente relacionado con la derivación. La principal diferencia es que la lematización considera el
contexto de la palabra mientras se realiza la normalización, pero la lematización no considera el
conocimiento contextual de la palabra. La lematización es más sofisticada que una lematización. Por
ejemplo, la palabra "gansos" se lematiza como "ganso". La lematización reduce las palabras a su lema
válido usando un diccionario. La lematización considera la parte del habla cercana a las palabras para la
normalización; por eso es difícil de implementar y más lento, mientras que las levas son más fáciles de
implementar y más rápidas pero con menos precisión.

Veamos cómo derivar y lematizar usando NLTK:


# Importar lematizador
desde nltk.stem.wordnet importar WordNetLemmatizer

# Importar Stemmer Porter


desde nltk.stem.porter import PorterStemmer

[358]
Analizar datos textuales Capítulo 12

# Crear objeto lematizador


lemmatizer = WordNetLemmatizer ()

# Crear objeto lematizador


stemmer = PorterStemmer ()

# toma una palabra de muestra


sample_word = "llorando"
print ("Palabra de muestra lematizada:", lemmatizer.lemmatize (sample_word, "v"))

print ("Palabra de muestra derivada:", stemmer.stem (sample_word))

Esto da como resultado la siguiente salida:

Palabra de muestra lematizada: llorar


Palabra de muestra derivada: cri

En el ejemplo anterior, primero importamos WordNetLemmatizer para la lematización y


instanciaron su objeto. Del mismo modo, importamosPorterStemmer para derivar una instancia de
su objeto. Después de esto, obtuvimos el lema usando ellematizar () función y la palabra derivada
usando la madre() función.

Veamos cómo obtener palabras lematizadas usando spaCy:

# Importar modelo de idioma inglés


importar espacio

# Cargando modelo de idioma inglés


nlp = spacy.load ("en")

# Crear objeto nlp para manejar anotaciones lingüísticas en documentos.


palabras = nlp ("llora llora llora")

# Encontrar palabra lematizada


para w en palabras:
print ('Palabra original:', w.text) print ('Palabra
lematizada:', w.lemma_)

Esto da como resultado la siguiente salida:

Palabra original: llorar


Palabra lematizada: llorar
Palabra original: llantos
Palabra lematizada: llorar
Palabra original: llorando
Palabra lematizada: llorar

[359]
Analizar datos textuales Capítulo 12

En el ejemplo anterior, primero importamos el modelo de idioma inglés y lo instanciamos. Después


de esto, creamos el objeto NLP y lo iteramos usando unpor círculo. En el ciclo, obtuvimos el valor de
texto y su valor de lema usando eltexto y lema_ propiedades. En esta sección, hemos analizado la
derivación y la lematización. Ahora, aprenderemos el etiquetado de PoS en el documento dado.

Etiquetado de puntos de venta

PoS significa parte del discurso. El principal objetivo del etiquetado POS es descubrir el tipo sintáctico de
palabras, como sustantivos, pronombres, adjetivos, verbos, adverbios y preposiciones. El etiquetado de
PoS encuentra la relación entre palabras dentro de una oración.

Veamos cómo obtener etiquetas POS para palabras usando NLTK:

# importar Word Tokenizer y PoS Tagger


desde nltk.tokenize import word_tokenize desde nltk
import pos_tag

# Ejemplo de oración
sentencia = "Taj Mahal es uno de los hermosos monumentos".

# Tokeniza la oración
sent_tokens = word_tokenize (oración)

# Crear etiquetas de PoS


sent_pos = pos_tag (sent_tokens)

# Imprimir tokens con PoS


imprimir (sent_pos)

Esto da como resultado la siguiente salida:

[('Taj', 'NNP'), ('Mahal', 'NNP'), ('es', 'VBZ'), ('uno', 'CD'), ('de', 'IN') , ('el', 'DT'), ('hermoso', 'JJ'),
('monumento', 'NN'), ('.', '.')]

En el ejemplo anterior, primero importamos word_tokenize y pos_tag. Después de esto, tomamos un


párrafo de texto y lo pasamos como parámetro al word_tokenize () método. El resultado de este
método será una lista de palabras. Después de esto, genere etiquetas PoS para cada token usando
elpos_tag () función.

Veamos cómo obtener etiquetas POS para palabras usando spaCy:

# Importar espacio
importar espacio

[360]
Analizar datos textuales Capítulo 12

# Cargando modelo de idioma inglés pequeño


nlp = spacy.load ("en_core_web_sm")

# Crear objeto nlp para manejar anotaciones lingüísticas en documentos.


oración = nlp (u "Taj Mahal es uno de los hermosos monumentos.")

para token en oración:


imprimir (token.text, token.pos_)

Esto da como resultado la siguiente salida:

Taj PROPN
Mahal PROPN
es VERBO
uno NUM
de ADP
el DET
hermosa ADJ
monumento sustantivo
. PUNCT

En el ejemplo anterior, primero importamos el modelo de idioma inglés y lo instanciamos. Después de


esto, creamos el objeto NLP y lo iteramos usando unpor círculo. En el ciclo, obtuvimos el valor de texto y
su valor de lema usando eltexto y pos_ propiedades. En esta sección, hemos analizado las etiquetas de
PoS. Ahora es el momento de pasar al reconocimiento de entidades con nombre en el texto.

Reconocer entidades
El reconocimiento de entidades significa extraer o detectar entidades en el texto dado. También se conoce como
Reconocimiento de entidad nombrada (NER). Una entidad se puede definir como un objeto, como una ubicación,
personas, una organización o una fecha. El reconocimiento de entidades es uno de los temas avanzados de la PNL. Se
utiliza para extraer información importante del texto.

Veamos cómo obtener entidades de texto usando spaCy:

# Importar espacio
importar espacio

# Cargar modelo en inglés para tokenizador, etiquetador, analizador y NER


nlp = spacy.load ('en')

# Párrafo de muestra
párrafo = "" "Taj Mahal es uno de los hermosos monumentos. Es una de las maravillas del mundo.
Fue construido por Shah Jahan en 1631 en memoria de su tercera esposa amada Mumtaj Mahal."
""

[361]
Analizar datos textuales Capítulo 12

# Crear objeto nlp para manejar anotaciones lingüísticas en documentos.


docs = nlp (párrafo)
entidades = [(i.text, i.label_) para i en docs.ents] imprimir
(entidades)

Esto da como resultado la siguiente salida:

[('Taj Mahal', 'PERSON'), ('Shah Jahan', 'PERSON'), ('1631', 'FECHA'), ('tercero', 'ORDINAL'),
('Mumtaj Mahal', ' PERSONA')]

En el ejemplo anterior, primero importamos spaCy y cargamos el modelo de idioma inglés. Después de
esto, creamos el objeto NLP y lo iteramos usando unpor círculo. En el ciclo, obtuvimos el valor de texto y
su valor de tipo de entidad usando eltexto y etiqueta_ propiedades. Visualicemos las entidades en el texto
usando una clase de visualización spaCy:

# Importar display para visualizar las Entidades


desde el desplazamiento de importación espacial

# Visualiza las entidades usando la función de render


Displacy.render (docs, style = "ent", jupyter = True)

Esto da como resultado la siguiente salida:

En el ejemplo anterior, importamos la clase de visualización y llamamos a su hacer() método con un


objeto de texto NLP, estilo como ent, y jupyter como Verdadero.

Análisis de dependencias
El análisis de dependencias encuentra la relación entre palabras: cómo se relacionan las palabras entre sí. Ayuda
a las computadoras a comprender oraciones para su análisis; por ejemplo, "Taj Mahal es uno de los
monumentos más bellos". No podemos entender esta oración simplemente analizando palabras. Necesitamos
profundizar y comprender el orden de las palabras, la estructura de las oraciones y las partes del discurso:

# Importar espacio
importar espacio

# Cargar modelo en inglés para tokenizador, etiquetador, analizador y NER


nlp = spacy.load ('en')

[362]
Analizar datos textuales Capítulo 12

# Crear objeto nlp para manejar anotaciones lingüísticas en documentos.


docs = nlp (oración)

# Visualiza la función de renderizado usando


Displacy.render (docs, style = "dep", jupyter = True, options = {'distancia': 150})

Esto da como resultado la siguiente salida:

En el ejemplo anterior, hemos importado la clase de visualización y hemos llamado a su hacer()método


con un objeto de texto NLP, estilo como 'dep ', jupyter como Cierto, y opciones como un diccionario con
una clave de distancia y un valor de 150. Ahora, veremos cómo visualizar datos de texto usando una
nube de palabras, según la frecuencia de la palabra en el texto.

Creando una nube de palabras


Como analista de datos, debe identificar las palabras más frecuentes y representarlas en forma gráfica a la alta
dirección. Se utiliza una nube de palabras para representar una gráfica de frecuencia de palabras. Representa la
frecuencia por el tamaño de la palabra, es decir, la palabra más frecuente parece más grande en tamaño y las
palabras menos frecuentes parecen más pequeñas. También se conoce como nube de etiquetas. Podemos
crear una nube de palabras usando elnube de palabras biblioteca en Python. Podemos instalarlo usando los
siguientes comandos:

pip instalar wordcloud

O, alternativamente, este:

conda install -c conda-forge wordcloud

[363]
Analizar datos textuales Capítulo 12

Aprendamos a crear una nube de palabras:

1. Importe bibliotecas y cargue una lista de palabras irrelevantes:

# importando todos los módulos necesarios


desde wordcloud importar WordCloud
desde wordcloud importar STOPWORDS
importar matplotlib.pyplot como plt

stopword_list = set (STOPWORDS)

párrafo = "" "Taj Mahal es uno de los hermosos monumentos. Es una de las maravillas del
mundo. Fue construido por Shah Jahan en 1631 en memoria de su tercera esposa amada
Mumtaj Mahal." ""

En el ejemplo anterior, importamos WordCloud, STOPWORDS, ymatplotlib.pyplot clases.


También creamos el conjunto de palabras vacías y definimos el texto del párrafo.

2. Crea y genera una nube de palabras:

word_cloud = WordCloud (ancho = 550, alto = 550,


background_color = 'blanco',
stopwords = stopword_list, min_font_size =
10) .generate (párrafo)

Después de esto, el WordCloud objeto con los parámetros ancho, alto,


background_color, palabras vacías, y min_font_size son creados y
generó la nube en la cadena de texto del párrafo.

3. Visualice la nube de palabras:

0. # Visualizar la trama de WordCloud


# Establecer el tamaño de la figura de wordcloud
plt.figure (figsize = (8, 6))

# Mostrar imagen
plt.imshow (word_cloud)

# Eliminar eje
plt.axis ("desactivado")

# mostrar trama
plt.show ()

[364]
Analizar datos textuales Capítulo 12

Esto da como resultado la siguiente salida:

En el ejemplo anterior, visualizamos la nube de palabras usando matplotlib.pyplot. Aprendamos a


convertir documentos de texto en un vector numérico usando Bag of Words.

Bolsa de palabras
Bolsa de palabras (Inclinarse) es una de las técnicas de ingeniería de funciones más básicas,
simples y populares para convertir texto en un vector numérico. Funciona en dos pasos: recopilar
palabras de vocabulario y contar su presencia o frecuencia en el texto. No considera la estructura
del documento ni la información contextual. Tomemos los siguientes tres documentos y
comprendamos BoW:

Documento 1: Me gusta la pizza. Documento 2:

No me gustan las hamburguesas.

Documento 3: Tanto la pizza como las hamburguesas son comida chatarra.

Ahora, crearemos el Matriz de plazos del documento (DTM). Esta matriz consta del documento
en las filas, las palabras en la columna y la frecuencia en los valores de las celdas.

I igual que Pizza hacer no hamburguesas y ambos están basura comida

Doc-1 1 1 1 0 0 0 0 0 0 0 0
Doc-2 1 1 0 1 1 1 0 0 0 0 0
Doc-3 0 0 1 0 0 1 1 1 1 1 1

[365]
Analizar datos textuales Capítulo 12

En el ejemplo anterior, generamos el DTM utilizando una sola palabra clave conocida como unigrama.
También podemos utilizar una combinación de dos palabras clave continuas, conocido como modelo
bigrama, y tres palabras clave, conocido como modelo trigrama. La forma generalizada se conoce
como modelo n-grama.

En Python, scikit-learn ofrece CountVectorizer para generar el BoW DTM. Veremos en elAnálisis de
sentimiento mediante clasificación de texto sección cómo generarlo usando scikit-learn.

TF-IDF
TF-IDF representa Término Frecuencia-Frecuencia inversa del documento. Tiene dos segmentos:
Frecuencia de término (TF) y Frecuencia de documento inversa (IDF). TF solo cuenta la ocurrencia
de palabras en cada documento. Es equivalente a BoW. TF no considera el contexto de las palabras y se
inclina hacia documentos más largos.IDF calcula valores que corresponden a la cantidad de
información que guarda una palabra.

TF-IDF es el producto escalar de ambos segmentos: TF e IDF. TF-IDF normaliza los pesos de los
documentos. Un valor más alto de TF-IDF para una palabra representa una ocurrencia más alta en ese
documento. Tomemos los siguientes tres documentos:

Documento 1: Me gusta la pizza. Documento 2:

No me gustan las hamburguesas.

Documento 3: Tanto la pizza como las hamburguesas son comida chatarra.

Ahora crearemos el DTM. Esta matriz consta del nombre del documento en los encabezados de las filas,
las palabras en los encabezados de las columnas y los valores TF-IDF en las celdas:

I igual que Pizza hacer no hamburguesas y ambos están basura comida

Doc-1 0,58 0,58 0,58 0 0 0 0 0 0 0 0


Doc-2 0,58 0,58 0 1,58 1,58 0,58 0 0 0 0 0
Doc-3 0 0 0,58 0 0 0,58 1,58 1,58 1,58 1,58 1,58

En Python, scikit-learn ofrece TfidfVectorizer para generar el TF-IDF DTM. Veamos en la


próxima sección cómo generarlo usando scikit-learn.

[366]
Analizar datos textuales Capítulo 12

Análisis de sentimiento mediante clasificación de texto


Un analista comercial o de datos debe comprender los comentarios y opiniones de los clientes sobre un producto
específico. ¿Qué les gustó o no les gustó a los clientes? ¿Y cómo van las ventas? Como analista de negocios, debe
analizar estas cosas con una precisión razonable y cuantificar los comentarios, comentarios, opiniones y tweets
de los clientes para comprender al público objetivo. El análisis de sentimientos extrae la información central del
texto y proporciona la percepción de las personas sobre los productos, servicios, marcas y temas políticos y
sociales. El análisis de sentimientos se utiliza para comprender la mentalidad de los clientes y las personas. No
solo se usa en marketing, también podemos usarlo en política, administración pública, formulación de políticas,
seguridad de la información e investigación. Nos ayuda a comprender la polaridad de los comentarios de las
personas. El análisis de sentimientos también cubre las palabras, el tono y el estilo de escritura.

La clasificación de texto puede ser uno de los enfoques utilizados para el análisis de sentimientos. Es un método
supervisado que se utiliza para detectar una clase de contenido web, artículos de noticias, blogs, tweets y
sentimientos. La clasificación tiene una gran cantidad de aplicaciones, desde marketing, finanzas, comercio
electrónico y seguridad. Primero, preprocesamos el texto, luego buscamos las características del texto
preprocesado y luego alimentamos las características y las etiquetas al algoritmo de aprendizaje automático
para hacer la clasificación. El siguiente diagrama explica la idea completa del análisis de opiniones mediante la
clasificación de texto:

Clasifiquemos los sentimientos por las reseñas de productos de Amazon Alexa. Podemos obtener datos del
Sitio web de Kaggle (https: / / www. kaggle. com / sid321axn / amazon- alexa- reseñas).

Los datos de reseñas de productos de Alexa son un archivo de valores separados por tabulaciones (archivo TSV). Estos datos
tienen cinco columnas o atributos:clasificación, fecha, variación, verificado, y realimentación.

[367]
Analizar datos textuales Capítulo 12

los clasificación La columna indica las calificaciones de los usuarios de los productos Alexa. La columna
de fecha es la fecha en la que el usuario dio la revisión. losvariación La columna representa el nombre
del modelo del producto. verificado tiene la opinión real del usuario sobre el producto.

La calificación denota la calificación otorgada por cada usuario al producto. La fecha es la fecha de la
revisión y la variación describe el nombre del modelo.verificado contiene la reseña de texto escrita por el
usuario y la columna de comentarios representa la puntuación de sentimiento, donde 1 denota un
sentimiento positivo y 0 denota un sentimiento negativo.

Clasificación mediante BoW


En esta subsección, realizaremos análisis de sentimientos y clasificación de texto basados en BoW. Aquí,
se genera una bolsa de palabras usando elscikit-learn Biblioteca. Veamos cómo realizamos el análisis de
sentimientos utilizando las funciones de BoW en los siguientes pasos:

1. Cargue el conjunto de datos:

El primer paso para crear un modelo de aprendizaje automático es cargar el conjunto de datos.
Primero leamos los datos usando los pandas.read_csv () función:

# Importar bibliotecas
importar pandas como pd

# leer el conjunto de datos


df = pd.read_csv ('amazon_alexa.tsv', sep = '\ t')

# Mostrar los 5 mejores registros


df.head ()

Esto da como resultado la siguiente salida:

En el marco de datos de salida anterior, hemos visto que el conjunto de datos de revisión de
Alexa tiene cinco columnas: clasificación, fecha, variación, verificado, y realimentación.

[368]
Analizar datos textuales Capítulo 12

2. Explore el conjunto de datos.

Tracemos el realimentación recuento de columnas para ver cuántas reseñas positivas y negativas
tiene el conjunto de datos:

# Importar seaborn
importar seaborn como sns
importar matplotlib.pyplot como plt

# Parcela de recuento
sns.countplot (x = 'comentarios', datos = df)

# Establecer etiquetas de eje X e Y


plt.xlabel ('Puntuación de opinión')
plt.ylabel ('Número de registros')

# Mostrar la gráfica usando la función show ()


plt.show ()

Esto da como resultado la siguiente salida:

En el código anterior, dibujamos el gráfico de barras para la columna de comentarios usando el


método seaborn countplot () función. Esta función cuenta y traza los valores de larealimentación
columna. En esta gráfica, podemos observar que 2.900 reseñas son positivas y 250 reseñas son
retroalimentación negativa.

[369]
Analizar datos textuales Capítulo 12

3. Generación de funciones utilizando CountVectorizer:

Generemos una matriz BoW para las reseñas de los clientes usando scikit-learn's
CountVectorizer:

# Importar CountVectorizer y RegexTokenizer


desde nltk.tokenize import RegexpTokenizer
desde sklearn.feature_extraction.text import CountVectorizer

# Crear tokenizador Regex para eliminar símbolos especiales y numéricos


valores
regex_tokenizer = RegexpTokenizer (r '[a-zA-Z] +')

# Inicializar el objeto CountVectorizer


count_vectorizer = CountVectorizer (minúsculas = True, stop_words
= 'inglés',
ngram_range = (1,1),
tokenizer = regex_tokenizer.tokenize)

# Ajustar y transformar el conjunto de datos


count_vectors = count_vectorizer.fit_transform (df
['verifundido'])

En el código anterior, creamos un RegexTokenizer objeto con una expresión regular de


entrada que elimina los caracteres y símbolos especiales. Después de esto, el
CountVectorizer Se creó el objeto y se realizó la operación de ajuste y transformación en
revisiones verificadas. Aquí,CountVectorizer toma parámetros comominúscula para
convertir palabras clave en minúsculas, Para las palabras para especificar una lista de
palabras irrelevantes específicas del idioma, ngram_range para especificar el unigrama,
bigrama o trigrama, y tokenizador se utiliza para pasar el tokenizador objeto. los
RegexTokenizer el objeto se pasa al tokenizador parámetro. Finalmente, llamamos al
fit_transform () función que convierte revisiones de texto en un DTM según los parámetros
especificados.

[370]
Analizar datos textuales Capítulo 12

4. Tren dividido y equipo de prueba:

Dividamos el conjunto de funciones y la columna de destino en feature_train,


feature_test, target_train, y prueba_objetivo utilizandotrain_test_split ().
train_test_split ()toma dependiente, independiente
marcos de datos, test_size y estado_aleatorio. Aquí, test_size decidirá la proporción de la
división de prueba de tren (es decir, test_size 0.3 significa 30% para el conjunto de prueba y el
70% restante será el conjunto de entrenamiento), y estado_aleatorio se utiliza como valor
inicial para reproducir la misma división de datos cada vez. Siestado_aleatorio esNinguno,
luego dividirá aleatoriamente los registros cada vez, lo que dará diferentes medidas de
rendimiento:

# Importar train_test_split
de sklearn.model_selection importar train_test_split

# Partición de datos en un conjunto de pruebas y entrenamiento


feature_train, feature_test, target_train, target_test = train_test_split (count_vectors,
df ['feedback'], test_size = 0.3, random_state = 1)

En el código anterior, estamos particionando el conjunto de características y la columna de destino en


feature_train, feature_test, target_train, y prueba_objetivo utilizando el
train_test_split () método.

5. Construcción de modelos de clasificación mediante regresión logística:

En esta sección, crearemos el modelo de regresión logística para clasificar los


sentimientos de revisión usando BoW (o CountVectorizer). Creemos el modelo de
regresión logística:

# importar modelo scikit-learn de regresión logística


de sklearn.linear_model import LogisticRegression

# Crear objeto de modelo de regresión logística


logreg = LogisticRegression (solver = 'lbfgs')

# ajustar el modelo con datos


logreg.fit (feature_train, target_train)

# Pronostique la variable objetivo para un conjunto de datos de prueba dado


predicciones = logreg.predict (feature_test)

[371]
Analizar datos textuales Capítulo 12

En el código anterior, importamos Regresión logística y creó elRegresión logística objeto.


Después de crear el objeto modelo, realizamos elencajar() operación en los datos de
entrenamiento y predecir() para pronosticar la opinión sobre el conjunto de datos de
prueba.

6. Evalúe el modelo de clasificación:

Evaluemos el modelo de clasificación usando el métrica clase y sus métodos


- puntuación_de_precisión, puntuación_de_precisión, y recall_score:
# Módulo de métricas de importación para evaluación de desempeño
de sklearn.metrics importar precision_score de
sklearn.metrics importar precision_score de
sklearn.metrics importar recall_score de sklearn.metrics
importar f1_score

# Evaluar el desempeño del modelo usando una medida de precisión


print ("Precisión del modelo de regresión logística:", precision_score
(target_test, predictions))

# Calcular la precisión del modelo


print ("Precisión del modelo de regresión logística:", precision_score
(target_test, predictions))

# Calcular recuperación de modelo


print ("Recuperación del modelo de regresión logística:", recall_score (target_test,
predictions))

# Calcular la puntuación f1 del modelo


print ("Puntuación F1 del modelo de regresión logística:", puntuación_f1 (prueba_objetivo,
predicciones))

Esto da como resultado la siguiente salida:

Precisión del modelo de regresión logística: 0,9428571428571428


Precisión del modelo de regresión logística: 0,952433628318584
Recuperación del modelo de regresión logística: 0,9873853211009175
Puntuación F1 del modelo de regresión logística: 0,9695945945945945

En el código anterior, hemos evaluado el rendimiento del modelo usando exactitud, precisión,
recuperación y puntaje f1 usando el métricas de scikit-learn función. Todas las medidas son superiores al
94%, por lo que podemos decir que nuestro modelo está funcionando bien y clasifica ambos niveles de
sentimiento con una buena cantidad de precisión y recuerdo.

[372]
Analizar datos textuales Capítulo 12

Clasificación mediante TF-IDF


En esta subsección, realizaremos análisis de sentimiento y clasificación de texto basados en TF-IDF.
Aquí, TF-IDF se genera utilizando elscikit-learn Biblioteca. Veamos cómo realizamos el análisis de
sentimientos utilizando las funciones de TF-IDF siguiendo los siguientes pasos:

1. Cargue el conjunto de datos:

El primer paso para crear un modelo de aprendizaje automático es cargar el conjunto de

datos. Primero leamos los datos usando los pandas.read_csv () función:

# Importar bibliotecas
importar pandas como pd

# leer el conjunto de datos


df = pd.read_csv ('amazon_alexa.tsv', sep = '\ t')

# Mostrar los 5 mejores registros


df.head ()

Esto da como resultado la siguiente salida:

En el marco de datos de salida anterior, hemos visto que el conjunto de datos de revisión de
Alexa tiene cinco columnas: clasificación, fecha, variación, verificado, y realimentación.

2. Generación de funciones utilizando TfidfVectorizer:

Generemos una matriz TF-IDF para las reseñas de los clientes usando scikit-learn's
TfidfVectorizer:

# Importar TfidfVectorizer y RegexTokenizer


desde nltk.tokenize import RegexpTokenizer
de sklearn.feature_extraction.text importar TfidfVectorizer

[373]
Analizar datos textuales Capítulo 12

# Crear tokenizador Regex para eliminar símbolos especiales y numéricos


valores
regex_tokenizer = RegexpTokenizer (r '[a-zA-Z] +')

# Inicializar el objeto TfidfVectorizer


tfidf = TfidfVectorizer (minúscula = True, stop_words = 'inglés',
ngram_range = (1,1), tokenizer = regex_tokenizer.tokenize)

# Ajustar y transformar el conjunto de datos


text_tfidf = tfidf.fit_transform (df ['verificada abundante'])

En el código anterior, creamos un RegexTokenizer objeto con una expresión regular de


entrada que elimina los caracteres y símbolos especiales. Después de esto, el
TfidfVectorizer Se creó el objeto y se realizó la operación de ajuste y transformación en
revisiones verificadas. Aquí,TfidfVectorizer toma parámetros comominúscula para convertir
palabras clave en minúsculas, Para las palabras para obtener una lista de palabras
irrelevantes específicas del idioma, ngram_range para especificar el unigrama, bigrama o
trigrama, y tokenizador se utiliza para pasar el tokenizador objeto. losRegexTokenizer el
objeto se pasa al tokenizador parámetro. Finalmente, llamamos alfit_transform () función
que convierte revisiones de texto en un DTM según los parámetros especificados.

3. Divida los conjuntos de datos de entrenamiento y prueba:

Dividamos el conjunto de funciones y la columna de destino en feature_train,


feature_test, target_train, y prueba_objetivo utilizandotrain_test_split ().
train_test_split ()toma dependiente, independiente
marcos de datos, test_size y estado_aleatorio. Dividamos el conjunto de datos en un conjunto de
entrenamiento y prueba:

# Importar train_test_split
de sklearn.model_selection importar train_test_split

# Partición de datos en un conjunto de pruebas y entrenamiento


de sklearn.model_selection importar train_test_split

feature_train, feature_test, target_train, target_test = train_test_split (text_tfidf,


df ['feedback'], test_size = 0.3, random_state = 1)

[374]
Analizar datos textuales Capítulo 12

En el código anterior, dividimos el conjunto de características y la columna de destino en


feature_train, feature_test, target_train, y prueba_objetivo utilizando el
train_test_split () método.

4. Construcción de modelos de clasificación mediante regresión logística:

En esta sección, crearemos el modelo de regresión logística para clasificar los sentimientos
de revisión utilizando TF-IDF. Creemos el modelo de regresión logística:

# importar modelo scikit-learn de regresión logística


de sklearn.linear_model import LogisticRegression

# instanciar el modelo
logreg = LogisticRegression (solver = 'lbfgs')

# ajustar el modelo con datos


logreg.fit (feature_train, target_train)

# Pronostique la variable objetivo para un conjunto de datos de prueba dado


predicciones = logreg.predict (feature_test)

En el código anterior, importamos Regresión logística y creó elRegresión logística objeto.


Después de crear el objeto modelo, realizamos unencajar() operación en los datos de
entrenamiento y predecir() para pronosticar la opinión sobre el conjunto de datos de
prueba.

5. Evalúe el modelo de clasificación:

Evaluemos el modelo de clasificación usando el métrica clase y sus métodos


- puntuación_de_precisión, puntuación_de_precisión, y recall_score:
# Módulo de métricas de importación para evaluación de desempeño
de sklearn.metrics importar precision_score de
sklearn.metrics importar precision_score de
sklearn.metrics importar recall_score de sklearn.metrics
importar f1_score

# Evaluar el desempeño del modelo usando una medida de precisión


print ("Precisión del modelo de regresión logística:", precision_score
(target_test, predictions))

# Calcular la precisión del modelo


print ("Precisión del modelo de regresión logística:", precision_score
(target_test, predictions))

# Calcular recuperación de modelo

[375]
Analizar datos textuales Capítulo 12

print ("Recuperación del modelo de regresión logística:", recall_score (target_test,


predictions))

# Calcular la puntuación f1 del modelo


print ("Puntuación F1 del modelo de regresión logística:", puntuación_f1 (prueba_objetivo,
predicciones))

Esto da como resultado la siguiente salida:

Precisión del modelo de regresión logística: 0,9238095238095239


Precisión del modelo de regresión logística: 0,923728813559322
Recuperación del modelo de regresión logística: 1,0
Modelo de regresión logística Puntuación F1: 0,960352422907489

En el código anterior, evaluamos el rendimiento del modelo usando exactitud, precisión, recuperación y
puntaje f1 usando scikit-learn métrica función. Todas las medidas son superiores al 94%, por lo que
podemos decir que nuestro modelo está funcionando bien y clasifica ambos niveles de sentimiento con
una buena cantidad de precisión y recuerdo. En esta sección, hemos analizado el análisis de opiniones
mediante la clasificación de texto. La clasificación de texto se realiza mediante las funciones BoW y TF-IDF.
En la siguiente sección, aprenderemos cómo encontrar similitudes entre dos fragmentos de texto, como
oraciones o párrafos.

Similitud de texto
La similitud de texto es el proceso de determinar los dos textos más cercanos. La similitud de texto es muy útil para
encontrar documentos, preguntas y consultas similares. Por ejemplo, un motor de búsqueda como Google usa la
similitud para encontrar la relevancia del documento, y los sistemas de preguntas y respuestas como StackOverflow o
un sistema de servicio al consumidor usan preguntas similares. Hay dos métricas comunes que se utilizan para la
similitud de texto, a saber, Jaccard y la similitud de coseno.

También podemos utilizar el método de similitud disponible en spaCy. losnlp objetos semejanzaEl
método devuelve una puntuación entre dos oraciones. Veamos el siguiente ejemplo:

# Importar espacio
importar espacio

# Cargar modelo en inglés para tokenizador, etiquetador, analizador y NER


nlp = spacy.load ('en')

# Crear documentos
doc1 = nlp (u'Me encantan las mascotas ')
doc2 = nlp (u'Odio las mascotas')

[376]
Analizar datos textuales Capítulo 12

# Encontrar similitud
imprimir (doc1.similarity (doc2))

Esto da como resultado la siguiente salida:

0,724494176985974

<ipython-input-32-f157deaa344d>: 12: UserWarning: [W007] El modelo que estás usando no tiene


cargados vectores de palabras, por lo que el resultado del método de similitud Doc. se basará en el
etiquetador, analizador y NER, que puede no dar juicios de similitud útiles. Esto puede suceder si está
usando uno de los modelos pequeños, por ejemplo, `en_core_web_sm`, que no se envía con vectores
de palabras y solo usa tensores sensibles al contexto. Siempre puede agregar sus propios vectores de
palabras o usar uno de los modelos más grandes en su lugar si está disponible.

En el bloque de código anterior, hemos encontrado la similitud entre dos oraciones usando spaCy's
semejanza() función. La función de similitud de Spacy no da mejores resultados con modelos pequeños
(como elen_core_web_sm y en modelos); por eso recibirás una advertencia:Advertencia de usuario:
[W007]. Para eliminar esta advertencia, utilice modelos más grandes como
como en_core_web_lg.

Similitud de Jaccard
La similitud de Jaccard calcula la similitud entre dos conjuntos por la proporción de palabras comunes
(intersección) a palabras totalmente únicas (unión) en ambos conjuntos. Se necesita una lista de palabras
únicas en cada oración o documento. Es útil donde la repetición de palabras no importa. La similitud de
Jaccard varía de 0 a 100%; cuanto mayor es el porcentaje, más similares son las dos poblaciones:

Veamos un ejemplo de similitud de Jaccard:

def jaccard_similarity (enviado1, enviado2):


"" "Encuentra similitudes de texto usando similitudes jaccard" ""
# Tokenizar oraciones
token1 = conjunto (sent1.split ())
token2 = conjunto (enviado2.split ())
# intersección entre tokens de dos oraciones
intersección_tokens = token1.intersection (token2)
# Unión entre tokens de dos frases
union_tokens = token1.union (token2)
# Similitud de coseno

[377]
Analizar datos textuales Capítulo 12

sim_ = float (len (intersection_tokens) / len (union_tokens)) return sim_

jaccard_similarity ('Amo a las mascotas', 'Odio a las mascotas')

Esto da como resultado la siguiente salida:

0,5

En el ejemplo anterior, hemos creado una función, jaccard_similarity (), que toma dos
argumentos, enviado1 y enviado 2. Encontrará la relación entre la intersección de palabras
clave y la unión de palabras clave entre dos oraciones.

Similitud de coseno
La similitud de coseno calcula el coseno del ángulo entre dos vectores proyectados multidimensionales.
Indica cómo se relacionan dos documentos entre sí. Se pueden hacer dos vectores de la bolsa de palabras
o TF-IDF o cualquier vector equivalente del documento. Es útil cuando importa la duplicación de palabras.
La similitud de coseno puede medir la similitud de texto independientemente del tamaño de los
documentos.

Veamos un ejemplo de similitud de coseno:

# Vamos a importar extracción de características de texto TfidfVectorizer


from sklearn.feature_extraction.text import TfidfVectorizer docs = ['Amo a las
mascotas.', 'Odio las mascotas.']

# Inicializar el objeto TfidfVectorizer


tfidf = TfidfVectorizer ()

# Ajustar y transformar los datos dados


tfidf_vector = tfidf.fit_transform (documentos)

# Importar métricas de cosine_similarity


de sklearn.metrics.pairwise importar cosine_similarity

# calcular la similitud usando la similitud del coseno


cos_sim = cosine_similarity (tfidf_vector, tfidf_vector)

imprimir (cos_sim)

[378]
Analizar datos textuales Capítulo 12

Esto da como resultado la siguiente salida:

[[1. 0.33609693]
[0.33609693 1.]]

En el ejemplo anterior, primero importamos TfidfVectorizer y generar el vector TF-IDF para


documentos dados. Después de esto, aplicamos elcoseno_similaridad () métrica en la lista de
documentos y obtenga métricas de similitud.

Resumen
En este capítulo, exploramos el análisis de texto utilizando NLTK y spaCy. El enfoque principal fue el
preprocesamiento de texto, el análisis de sentimientos y la similitud de texto. El capítulo comenzó con tareas
de preprocesamiento de texto, como normalización de texto, tokenización, eliminación de palabras vacías,
derivación y lematización. También nos enfocamos en cómo crear una nube de palabras, reconocer entidades
en un texto dado y encontrar dependencias entre tokens. En secciones posteriores, nos enfocamos en BoW,
TFIDF, análisis de sentimientos y clasificación de texto.

El próximo capítulo, Capítulo 13, Analizar datos de imagen, se centra en el procesamiento de imágenes, las operaciones básicas
de procesamiento de imágenes y la detección de rostros mediante OpenCV. El capítulo comienza con modelos de color de
imagen y operaciones de imagen como dibujar en una imagen, cambiar el tamaño de una imagen y voltear y desenfocar una
imagen. En secciones posteriores, la atención se centrará en la detección de rostros en una imagen de entrada determinada.

[379]
Analizar datos de imagen
--
Estamos en la era de la información, donde cada movimiento generará datos en una variedad de
formatos, como texto, imágenes, datos geoespaciales y videos. Los teléfonos inteligentes han
llegado a áreas rurales del mundo y la gente está capturando actividades, especialmente en
imágenes y videos, y compartiéndolas en plataformas de redes sociales. Así es como se generan
grandes cantidades de datos y la mayoría de los datos están en formatos de imagen y video. Los
institutos de investigación y la industria quieren analizar conjuntos de datos de imágenes y videos
para generar valor y crear soluciones automatizadas para reducir costos. El procesamiento de
imágenes y la visión por computadora son campos que exploran y desarrollan soluciones basadas
en imágenes y videos. Hay muchas oportunidades para la investigación, la innovación y la creación
de empresas en el área de la visión por computadora. En este capítulo,

El procesamiento de imágenes es un subconjunto de la visión por computadora. La visión por computadora es un


campo avanzado y más poderoso dentro del aprendizaje automático y la inteligencia artificial. La visión por
computadora ofrece aplicaciones enormes, como detectar objetos, clasificar imágenes y objetos, subtítulos de
imágenes y segmentación de imágenes. Una imagen se puede definir como señales bidimensionales en el
procesamiento de señales, un conjunto de puntos en 2D o 3D en geometría y una matriz NumPy bidimensional o
tridimensional en Python. El procesamiento de imágenes se refiere al procesamiento de datos de imágenes y la
realización de operaciones como dibujar, escribir, cambiar el tamaño, voltear, difuminar, cambiar el brillo y
detectar rostros. En este capítulo, nos centraremos en todas estas operaciones de procesamiento de imágenes
en detalle.

Cubriremos los siguientes temas en este capítulo:

Instalación de OpenCV
Comprensión de los modelos de color de

datos de imagen

Dibujando en imágenes
Escribir en imágenes
Cambiar el tamaño de las imágenes

Voltear imágenes
Analizar datos de imagen Capítulo 13

Cambiar el brillo
Desenfocar una imagen
Detección de rostro

Requerimientos técnicos
Este capítulo tiene los siguientes requisitos técnicos:

Puede encontrar el código, el archivo de clasificador de rostros y los conjuntos de datos en el siguiente Github
Enlace: https://github.com/PacktPublishing/Python-Data-Analysis-Third-Edition / tree /
master / Chapter13.
Todos los bloques de código están disponibles en el ch13.ipynb expediente.

Este capítulo utiliza.jpg / .jpeg archivosgoogle.jpg, image.jpg, messi.png,


nature.jpeg, barcelona.jpeg, y tajmahal.jpg) con fines de práctica.
Este capítulo utiliza un archivo XML de clasificador de caras
(haarcascade_frontalface_default.xml).
En este capítulo, usaremos las bibliotecas Python de OpenCV, NumPy y
matplotlib.

Instalación de OpenCV
OpenCV es una biblioteca de código abierto para operaciones de visión por computadora, como análisis de
imágenes y videos. OpenCV es desarrollado principalmente por Intel en C ++ y ofrece interfaces con Python, Java
y Matlab. OpenCV tiene las siguientes características:

Es una biblioteca Python de procesamiento de imágenes de código abierto.

OpenCV es la biblioteca central de Python para el procesamiento de imágenes y la visión por


computadora. OpenCV es fácil de aprender e implementar con aplicaciones web y móviles.
OpenCV en Python es una API y un contenedor de su implementación central de C ++. Es rápido
debido al código C ++ de fondo.

Podemos instalar OpenCV usando el siguiente comando:

pip instalar opencv-python

[381]
Analizar datos de imagen Capítulo 13

Usando el comando pip anterior, podemos instalar fácilmente OpenCV. OpenCV es la biblioteca más popular
para tareas de procesamiento de imágenes y visión por computadora. Ofrece varios casos de uso relacionados
con las operaciones de análisis de imágenes, como mejorar la calidad de la imagen, filtrar y transformar
imágenes, dibujar en imágenes, cambiar colores, detectar caras y objetos, identificar acciones humanas,
rastrear objetos, analizar movimiento y encontrar imágenes similares. Después de instalar la biblioteca
OpenCV, es hora de comprender los conceptos básicos del procesamiento de imágenes.

Entender los datos de la imagen


Los datos de imagen son una matriz o función bidimensional f (x, y) con coordenadas espaciales. La
amplitud de lacoordinar (x, y) se conoce como intensidad. En Python, una imagen es una matriz NumPy 2D
o 3D con valores de píxeles. Los píxeles son los elementos de imagen más pequeños y diminutos que
deciden la calidad de la imagen. Una gran cantidad de píxeles da como resultado una resolución más alta.
Además, hay varios formatos de imagen disponibles, como.jpeg, .png, .gif, y
. pelea.Estos formatos de archivo son útiles para organizar y mantener archivos de imágenes digitales.
Antes de analizar los datos de las imágenes, debemos comprender los tipos de imágenes. Los datos de imagen pueden
ser de tres tipos:

Binario
Escala de grises

Color

Imágenes binarias
Los píxeles de imagen binaria tienen solo dos colores, generalmente blanco y negro. Los píxeles de imagen binaria
solo toman valores binarios 0 o 1.

La imagen anterior es un ejemplo de imagen binaria. Tiene solo dos colores, blanco y
negro. No utiliza tonos de blanco y negro.

[382]
Analizar datos de imagen Capítulo 13

Imágenes en escala de grises


Una imagen en escala de grises parece una imagen en blanco y negro. Está representado por 8 bits por píxel,
es decir, 256 valores de intensidad o tonos que van de 0 a 255. Estos 256 tonos se mueven del negro puro al
blanco puro; 0 representa negro puro, mientras que 255 representa el color blanco.

La imagen anterior es una imagen en escala de grises. Es una imagen en blanco y negro donde los tonos pasan
del negro puro al blanco puro.

Imágenes en color
Las imágenes en color son una mezcla de los colores primarios rojo, azul y verde. Estos colores primarios
tienen la capacidad de formar nuevos colores al mezclarlos en ciertas proporciones. Cada color utiliza ocho
bits (valores de intensidad entre 0-255), es decir, 24 bits por píxel. Tomemos un ejemplo de una imagen en
color:

[383]
Analizar datos de imagen Capítulo 13

En el archivo de imagen anterior, podemos ver la mayoría de los tonos de color con diferentes intensidades.
Después de comprender el tipo de imágenes, es hora de comprender los modelos de color como RGB, CMYK,
HSV, HSL y escala de grises. Pasemos a los modelos de color.

Modelos de color
Los modelos de color son una estructura para procesar y medir la combinación de colores primarios. Nos
ayudan a explicar cómo se mostrarán los colores en la pantalla de la computadora o en el papel. Los
modelos de color pueden ser de dos tipos: aditivos o sustractivos. Los modelos aditivos se utilizan para
pantallas de computadora, por ejemplo, el modelo RGB (rojo, verde y azul), y los modelos sustractivos se
utilizan para imprimir imágenes, por ejemplo, el modelo CMYK (cian, magenta, amarillo y negro):

Hay muchos modelos distintos de RGB y CMYK, como HSV, HSL y escala de grises. HSV es un
acrónimo de tono, saturación y valor. Es un modelo de color tridimensional, que es una versión
mejorada del modelo RGB. En el modelo HSV, la parte superior del eje central es blanca, la parte
inferior es negra y los colores restantes se encuentran en el medio. Aquí, el tono es el ángulo, la
saturación es la distancia desde el eje central y el valor es la distancia desde la parte inferior del eje.

[384]
Analizar datos de imagen Capítulo 13

HSL es un acrónimo de tono, saturación y luminosidad. La principal diferencia entre HSV y


HSL es la cantidad de luminosidad y el valor de los colores desde el eje central.

Aprendamos a leer y mostrar el archivo de imagen:

# Importar la última versión cv2 de la biblioteca OpenCV


importar cv2

# Importar biblioteca numérica de Python (NumPy)


importar numpy como np

# Importar matplotlib para mostrar la imagen


importar matplotlib.pyplot como plt

# función mágica para renderizar la figura en un cuaderno


% matplotlib en línea

# Leer imagen usando la función imread ()


imagen = cv2.imread ('google.jpg')

# Comprobemos el tipo de datos de la imagen


imprimir ('Tipo de imagen:', tipo (imagen))

# Comprobemos la dimensión de la imagen


print ('Dimensión de la imagen:', image.shape)

# Vamos a mostrar la imagen


plt.imshow (imagen)
plt.show ()

[385]
Analizar datos de imagen Capítulo 13

Esto da como resultado la siguiente salida:

En el ejemplo anterior, importamos cv2, NumPy y matplotlib.pyplot. cv2es para procesamiento de


imágenes, NumPy es para matrices y matplotlib.pyplot es para mostrar una imagen. Leemos la
imagen usando elEstoy leído() función y devolvió una matriz de imágenes. Podemos comprobar su
tipo utilizando elescribe() función y su forma utilizando el forma atributo de la matriz NumPy.
Podemos mostrar la imagen usando elshow() función de lamatpltlib.pyplot módulo. La imagen
anterior no muestra los colores correctos de la imagen del logotipo de Google. Esto es porqueEstoy
leído() lee imágenes en el modelo de color BGR. Vamos a convertir BGR al modelo de color RGB
usando elcvtColor () función y pasar la bandera
cv2.COLOR_BGR2RGB:

# Convertir el espacio de color de la imagen BGR a RGB


rgb_image = cv2.cvtColor (imagen, cv2.COLOR_BGR2RGB)

# Mostrar la imagen
plt.imshow (rgb_image)
plt.show ()

Esto da como resultado la siguiente salida:

[386]
Analizar datos de imagen Capítulo 13

Aquí puede ver la imagen correcta en formato RGB. Escribamos el archivo de

imagen en un disco local usando elsoy escritura() función:

# Escribir imagen usando imwrite ()


cv2.imwrite ('imagen.jpg', imagen)

Producción: Cierto

En el bloque de código anterior, hemos escrito el archivo de imagen en un disco local con el nombre de la
imagen image.jpg. Después de comprender los modelos de color, es hora de aprender a dibujar elementos en
una imagen.

Dibujando en imágenes
Aprendamos a dibujar diferentes formas de figuras, como una línea, un cuadrado o un triángulo, en una
imagen usando OpenCV. Cuando dibujamos cualquier forma en una imagen, debemos cuidar las
coordenadas, el color y el grosor de la forma. Primero creemos una imagen en blanco con un fondo
blanco o negro:

# Importar la última versión cv2 de la biblioteca OpenCV


importar cv2

# Importar biblioteca numérica de Python (NumPy)


importar numpy como np

# Importar matplotlib para mostrar la imagen


importar matplotlib.pyplot como plt

# Función mágica para renderizar la figura en un cuaderno.


% matplotlib en línea

# Creemos una imagen negra


forma_imagen = (600,600,3)
black_image = np.zeros (shape = image_shape, dtype = np.int16)

# Muestra la imagen
plt.imshow (imagen_negra)

[387]
Analizar datos de imagen Capítulo 13

Esto da como resultado la siguiente salida:

En el ejemplo anterior, creamos una imagen en blanco con un fondo negro usando el
ceros () función del módulo NumPy. losceros () La función crea una matriz del tamaño
dado y llena la matriz con ceros.

Creemos una imagen en blanco con fondo blanco:

# Crea una imagen en blanco


forma_imagen = (600,600,3)
white_image = np.zeros (shape = image_shape, dtype = np.int16)

# Establezca cada píxel de la imagen en 255


white_image.fill (255)

# Muestra la imagen
plt.imshow (imagen_blanco)

Esto da como resultado la siguiente salida:

[388]
Analizar datos de imagen Capítulo 13

En el ejemplo anterior, creamos una imagen en blanco con un fondo blanco usando elceros ()
función del módulo NumPy y llenó la imagen con 255 para cada píxel. losceros () La función
crea una matriz del tamaño dado y llena la matriz con ceros. losllenar() La función asigna un
valor dado a todos los elementos de la matriz. Dibujemos una línea usando OpenCV en una
imagen negra:

# Dibuja una línea en la imagen negra


línea = cv2.line (imagen_negra, (599,0), (0,599), (0,255,0), 4)

# Mostrar imagen
plt.imshow (línea)

Esto da como resultado la siguiente salida:

En el ejemplo anterior, dibujamos la línea verde en la imagen negra usando el línea()función. los
línea() La función toma los siguientes argumentos: archivo de imagen, punto_inicio, punto_final, color
y grosor. En nuestro ejemplo, los puntos inicial y final son (599,0) y (0,599), la tupla de color es
(0,255,0) y el grosor es 4. De manera similar, podemos crear una línea en una imagen blanca.
Veamos el siguiente ejemplo:

# Dibujemos una línea azul en la imagen blanca

línea = cv2.line (imagen_blanco, (599,0), (0,599), (0,0,255), 4)


# Muestra la imagen
plt.imshow (línea)

Esto da como resultado la siguiente salida:

[389]
Analizar datos de imagen Capítulo 13

Veamos un ejemplo de cómo dibujar un círculo en una imagen blanca:

# Creemos una imagen en blanco


img_shape = (600,600,3)
white_image = np.zeros (shape = image_shape, dtype = np.int16)

# Establezca cada píxel de la imagen en 255


white_image.fill (255)

# Dibuja un círculo rojo en la imagen blanca


círculo = cv2.circle (imagen_blanco, (300, 300), 100, (255,0,0), 6)

# Muestra la imagen
plt.imshow (círculo)

Esto da como resultado la siguiente salida:

[390]
Analizar datos de imagen Capítulo 13

En el ejemplo anterior, creamos una imagen en blanco y dibujamos un círculo usando el


circulo()función. loscirculo() La función toma los siguientes argumentos: imagen,
coordenadas_centrales, radio, color y grosor. En nuestro ejemplo, el centro es (300, 300), el radio
es 100, una tupla de color es (255,0,0) y el grosor es 6.

Veamos un ejemplo de cómo dibujar un rectángulo en una imagen negra:

# Creemos una imagen negra


img_shape = (600,600,3)
black_image = np.zeros (shape = image_shape, dtype = np.int16)

# Dibuja un rectángulo verde sobre una imagen negra


rectángulo = cv2.rectangle (imagen_negra, (200,200), (400,500), (0,255,0), 5)

# Muestra la imagen
plt.imshow (rectángulo)

Esto da como resultado la siguiente salida:

En el ejemplo anterior, creamos una imagen negra y dibujamos un rectángulo usando elrectángulo()
función. losrectángulo() La función toma los siguientes argumentos: imagen,punto_inicio,
punto_final, color y grosor. Aquí, el grosor también tiene un argumento:1,los -1 El valor px llenará la
forma del rectángulo con el color especificado. Veamos un ejemplo de un rectángulo relleno:

# Creemos una imagen negra


img_shape = (600,600,3)
black_image = np.zeros (shape = image_shape, dtype = np.int16)

# Dibuja un rectángulo relleno de verde sobre una imagen negra


rectángulo = cv2.rectangle (imagen_negra, (200,200), (400,500), (0,255,0), - 1)

[391]
Analizar datos de imagen Capítulo 13

# Muestra la imagen
plt.imshow (rectángulo)

Esto da como resultado la siguiente salida:

En el ejemplo anterior, llenamos el rectángulo pasando valores de grosor como -1 px. En pocas palabras,
podemos decir que la línea toma principalmente los puntos inicial y final como entrada, el rectángulo
toma las coordenadas superior izquierda e inferior derecha, y el círculo toma coordenadas centrales y
valores de radio.

Escribir en imágenes
En la sección anterior, creamos varias formas en imágenes. Ahora, aprenderemos a escribir texto
en imágenes. Escribir texto en una imagen es similar a dibujar formas. Veamos un ejemplo de
escritura en una imagen:

# Creemos una imagen negra


img_shape = (600,800,3)
black_image = np.zeros (shape = image_shape, dtype = np.int16)

# Escribir en imagen negra


text = cv2.putText (black_image, 'Acción de Gracias', (10,500),
cv2.FONT_HERSHEY_SIMPLEX, 3, (255,0,0), 2, cv2.LINE_AA)

# Mostrar la imagen
plt.imshow (texto)

[392]
Analizar datos de imagen Capítulo 13

Esto da como resultado la siguiente salida:

En el ejemplo anterior, creamos una imagen en blanco con el color negro. Hemos escrito texto en
una imagen usando elputText () función. losputText () La función tomará los siguientes
argumentos: imagen, texto, coordenadas de la esquina inferior izquierda, fuente, fontScale,color,
grosor y tipo de línea.

Cambiar el tamaño de las imágenes

Cambiar el tamaño de una imagen significa cambiar la dimensión o la escala de una imagen determinada. La escala o el cambio
de tamaño se realiza desde el ancho, el alto o ambos. Una de las aplicaciones de cambiar el tamaño de las imágenes es entrenar
modelos de aprendizaje profundo donde los tamaños de imagen reducidos pueden acelerar el entrenamiento. El entrenamiento
de un modelo de aprendizaje profundo está fuera del alcance de este libro. Si está interesado, puede consultar cualquier libro de
aprendizaje profundo de Packt Publishing. Veamos un ejemplo de cómo cambiar el tamaño de una imagen:

# Importar módulo cv2


importar cv2

# Importar matplotlib para mostrar la imagen


importar matplotlib.pyplot como plt

# función mágica para renderizar la figura en un cuaderno


% matplotlib en línea

# leer imagen
imagen = cv2.imread ('tajmahal.jpg')

# Convertir el espacio de color de la imagen BGR a RGB


rgb_image = cv2.cvtColor (imagen, cv2.COLOR_BGR2RGB)

[393]
Analizar datos de imagen Capítulo 13

# Mostrar la imagen
plt.imshow (rgb_image)

Esto da como resultado la siguiente salida:

En el código anterior, leemos la imagen y la convertimos de BGR al espacio RGB. Cambiemos su


tamaño ahora usando elredimensionar () función:

# Cambiar el tamaño de la imagen


image_resized = cv2.resize (rgb_image, (200, 200)) interpolación =
cv2.INTER_NEAREST

# Mostrar la imagen
plt.imshow (tamaño_imagen)

Esto da como resultado la siguiente salida:

[394]
Analizar datos de imagen Capítulo 13

En el ejemplo anterior, leemos la imagen, convertimos BGR a color RGB usando elcvtColor () función y
cambiar el tamaño de la imagen con la redimensionar () función. losredimensionar ()La función toma los
siguientes argumentos: imagen, tamaño e interpolación. La interpolación se utiliza para escalar imágenes
sin muaré. La interpolación toma uno de los siguientes indicadores:INTER_NEAREST (para la interpolación
del vecino más cercano), INTER_LINEAR (interpolación bilineal), y INTER_AREA (remuestreo usando la
relación de área de píxeles).

Voltear imágenes
Dar la vuelta a una imagen equivale a un efecto de espejo. Aprendamos a girar una imagen en elX eje
(volteo vertical), y eje (volteo horizontal), o ambos ejes. OpenCV ofrece lavoltear() función para voltear una
imagen. losvoltear() La función tomará dos argumentos: image y flipcode. La imagen es una matriz NumPy
de valores de píxeles y el código de cambio utilizado define el tipo de cambio, como horizontal, vertical o
ambos. Los siguientes valores de flipcode son para diferentes tipos de volteretas:

Flipcode> 0 es para un giro horizontal.


Flipcode = 0 es para un giro vertical.
Flipcode <0 es para un giro horizontal y vertical.

Veamos un ejemplo de voltear una imagen:

# Importar módulo OpenCV


importar cv2

# Importar NumPy
importar numpy como np

# Importar matplotlib para mostrar la imagen


importar matplotlib.pyplot como plt

# función mágica para renderizar la figura en un cuaderno


% matplotlib en línea

# Leer imagen
imagen = cv2.imread ('messi.png')

# Convertir el espacio de color de la imagen BGR a RGB


rgb_image = cv2.cvtColor (imagen, cv2.COLOR_BGR2RGB)

# Mostrar la imagen
plt.imshow (rgb_image)

[395]
Analizar datos de imagen Capítulo 13

Esto da como resultado la siguiente salida:

Esta es la imagen original, de Lionel Messi. Voltémoslo horizontalmente usando elvoltear()


función pasando 1 como el flipcode en el voltear() función:

# Volteo de imagen (volteo horizontal)


image_flip = cv2.flip (rgb_image, 1)

# Mostrar la imagen
plt.imshow (image_flip)

Esto da como resultado la siguiente salida:

[396]
Analizar datos de imagen Capítulo 13

Esta es la imagen volteada horizontalmente. Volteemos la imagen original verticalmente:

# Volteo de imagen (volteo vertical)


image_flip = cv2.flip (rgb_image, 0)

# Mostrar la imagen
plt.imshow (image_flip)

Esto da como resultado la siguiente salida:

Puede ver la imagen volteada verticalmente. Volteemos la imagen original en ambos ejes:

# Volteo de imagen (volteo horizontal y vertical)


image_flip = cv2.flip (rgb_image, -1)

# Mostrar la imagen
plt.imshow (image_flip)

Esto da como resultado la siguiente salida:

[397]
Analizar datos de imagen Capítulo 13

Puede ver la imagen volteada vertical y horizontalmente. Después de voltear la imagen,


aprendamos a cambiar el brillo de la imagen en la siguiente sección.

Cambiar el brillo
El brillo es un término comparativo que está determinado por la percepción visual. A veces es difícil
percibir el brillo. El valor de la intensidad de los píxeles puede ayudarnos a encontrar una imagen más
brillante. Por ejemplo, si dos píxeles tienen los valores de intensidad 110 y 230, entonces el último es
más brillante.

En OpenCV, ajustar el brillo de la imagen es una operación muy básica. El brillo se puede
controlar cambiando la intensidad de cada píxel en una imagen:

# Importar la última versión cv2 de la biblioteca OpenCV


importar cv2

# Importar matplotlib para mostrar la imagen


importar matplotlib.pyplot como plt

# Función mágica para renderizar la figura en un cuaderno.


% matplotlib en línea

# Leer imagen
imagen = cv2.imread ('naturaleza.jpeg')

# Convertir el espacio de color de la imagen BGR a RGB


rgb_image = cv2.cvtColor (imagen, cv2.COLOR_BGR2RGB)

# Mostrar la imagen
plt.imshow (rgb_image)

Esto da como resultado la siguiente salida:

[398]
Analizar datos de imagen Capítulo 13

En el ejemplo de código anterior, hemos leído la imagen y convertido la imagen basada en el modelo
de color BGR en una imagen basada en el modelo de color RGB. Cambiemos el brillo de la imagen en el
siguiente bloque de código:

# establecer ponderación para alfa y beta tanto en la matriz


alpha_ = 1
beta_ = 50

# Agregue peso a la imagen original para cambiar el brillo


image_change = cv2.addWeighted (rgb_image, alpha_, np.zeros
(image.shape, image.dtype), 0, beta_)

# Mostrar la imagen
plt.imshow (cambio_imagen)

Esto da como resultado la siguiente salida:

En el ejemplo anterior, sumamos las dos matrices con el peso dado; alfa y beta usando el
addWeighted () función. addWeighted () toma los siguientes argumentos:
first_image, alpha, second_image, gamma, y beta. En nuestro ejemplo, el argumento
primera_imagen imagen de entrada y el argumento segunda_imagen es la matriz nula. Los
valores dealfa y beta son los pesos de ambas matrices y gama es 0.

Difuminar una imagen


El desenfoque es uno de los pasos cruciales del preprocesamiento de imágenes. En el preprocesamiento, la eliminación de ruido
afecta el rendimiento de los algoritmos. El desenfoque es el proceso de reducir el ruido en los datos de la imagen para lograr una
mayor precisión. El desenfoque también nos ayuda a hacernos cargo del manejo de la intensidad de los píxeles.

[399]
Analizar datos de imagen Capítulo 13

Veamos un ejemplo de desenfoque de una imagen:

# Importar módulo OpenCV


importar cv2

# Importar matplotlib para mostrar la imagen


importar matplotlib.pyplot como plt

# Función mágica para renderizar la figura en un cuaderno.


% matplotlib en línea

# Leer imagen
imagen = cv2.imread ('tajmahal.jpg')

# Convertir el espacio de color de la imagen BGR a RGB


rgb_image = cv2.cvtColor (imagen, cv2.COLOR_BGR2RGB)

# Mostrar la imagen
plt.imshow (rgb_image)

Esto da como resultado la siguiente salida:

En el ejemplo de código anterior, leemos la imagen y la convertimos de una imagen basada en BGR a RGB.
Vamos a difuminarlo usando eldifuminar() función. Blur toma dos argumentos: imagen y tamaño de kernel. los
difuminar() La función usa el método de desenfoque promedio:

# Difuminar la imagen con la función desenfoque ()


image_blur = cv2.blur (rgb_image, (15,15))

# Mostrar la imagen
plt.imshow (image_blur)

[400]
Analizar datos de imagen Capítulo 13

Esto da como resultado la siguiente salida:

En el ejemplo anterior, leemos la imagen, convertimos BGR a color RGB usando elcvtColor ()
función, y muestra la imagen. Aquí, difuminamos la imagen usando eldifuminar() función. los
difuminar() La función aplica el desenfoque promedio, que utiliza un filtro de cuadro normalizado.
losdifuminar() La función toma los siguientes argumentos: imagen y tamaño del núcleo.

Hemos visto una imagen borrosa con un desenfoque medio. Exploremos el desenfoque usando el desenfoque
gaussiano. En este desenfoque, se usa el kernel gaussiano en lugar de un filtro de caja.Desenfoque gaussiano()
tomará la imagen y el tamaño del kernel. El tamaño del kernel será una tupla del ancho y el alto. Tanto el ancho
como el alto deben ser un número positivo e impar:

# Importar módulo cv2


importar cv2

# Importar matplotlib para mostrar la imagen


importar matplotlib.pyplot como plt

# función mágica para renderizar la figura en un cuaderno


% matplotlib en línea

# leer imagen
imagen = cv2.imread ('tajmahal.jpg')

# Convertir el espacio de color de la imagen BGR a RGB


rgb_image = cv2.cvtColor (imagen, cv2.COLOR_BGR2RGB)

# Desenfocar la imagen con Desenfoque gaussiano


image_blur = cv2.GaussianBlur (rgb_image, (7,7), 0)

[401]
Analizar datos de imagen Capítulo 13

# Mostrar la imagen
plt.imshow (image_blur)

Esto da como resultado la siguiente salida:

Exploremos el desenfoque medio de la imagen dada. El desenfoque mediano toma píxeles en el


área del kernel y reemplaza el elemento central con el valor mediano.medianBlur () tomará la imagen
y el tamaño del kernel como argumento. Se recomienda que el tamaño del kernel sea un número
impar y mayor que 1, por ejemplo, 3, 5, 7, 9, 11, etc.

# Importar módulo cv2


importar cv2

# Importar matplotlib para mostrar la imagen


importar matplotlib.pyplot como plt

# Convertir el espacio de color de la imagen BGR a RGB


% matplotlib en línea

# leer imagen
imagen = cv2.imread ('tajmahal.jpg')

# Convertir el espacio de color de la imagen BGR a RGB


rgb_image = cv2.cvtColor (imagen, cv2.COLOR_BGR2RGB)

# Desenfocar la imagen usando Desenfoque medio


image_blur = cv2.medianBlur (rgb_image, 11)

# Mostrar la imagen
plt.imshow (image_blur)

[402]
Analizar datos de imagen Capítulo 13

Esto da como resultado la siguiente salida:

En el bloque de código anterior, desenfocamos la imagen usando el desenfoque medio. Aquí, usamos el
medianBlur () método para el desenfoque medio y podemos observar la imagen desenfocada en la salida.
En esta sección, discutimos las técnicas de desenfoque promedio, desenfoque gaussiano y desenfoque
medio. En la siguiente sección, aprenderemos cómo detectar rostros humanos en imágenes.

Detección de rostro
Hoy en día, todo el mundo está usando Facebook y todos deben haber visto el reconocimiento facial en una imagen en
Facebook. El reconocimiento facial identifica a quién pertenece un rostro y la detección de rostros solo encuentra rostros
en una imagen, es decir, la detección de rostros no determina a quién pertenece el rostro detectado. La detección de
rostros en una imagen de entrada determinada es una funcionalidad bastante popular en muchas aplicaciones; por
ejemplo, contar el número de personas en una imagen. En la detección de rostros, el algoritmo intenta encontrar rostros
humanos en una imagen digital.

La detección de rostros es una especie de problema de clasificación. Podemos clasificar las imágenes en dos clases,
cara o no cara. Necesitamos muchas imágenes para entrenar tal modelo para la clasificación. Afortunadamente,
OpenCV ofrece modelos previamente entrenados como el clasificador en cascada basado en funciones de Haar y el
Patrón binario local (Dolor lumbar) clasificador, entrenado en miles de imágenes. En nuestro ejemplo, usaremos la
extracción de características de Haar para detectar una cara. Veamos cómo capturar una cara en una imagen usando
OpenCV:

1. Lea la imagen y conviértala en escala de grises:

# Importar la última versión cv2 de la biblioteca OpenCV


importar cv2

[403]
Analizar datos de imagen Capítulo 13

# Importar biblioteca numérica de Python (NumPy)


importar numpy como np

# Importar matplotlib para mostrar la imagen


importar matplotlib.pyplot como plt

# función mágica para renderizar la figura en un cuaderno


% matplotlib en línea

# Leer imagen
imagen = cv2.imread ('messi.png')

# Convertir el espacio de color de la imagen BGR a escala de grises


image_gray = cv2.cvtColor (imagen, cv2.COLOR_BGR2GRAY)

# Visualización de la imagen en escala de grises


plt.imshow (image_gray, cmap = 'gris')

Esto da como resultado la siguiente salida:

En el ejemplo de código anterior, leemos la imagen de Lionel Messi y la convertimos en una


imagen en escala de grises usando el cvtColor () función.

Busquemos las caras en la imagen gris generada:

2. Cargue el archivo clasificador de caras en cascada de Haar:

# Cargue el archivo clasificador de caras en cascada haar


haar_cascade =
cv2.CascadeClassifier ('haarcascade_frontalface_default.xml')

[404]
Analizar datos de imagen Capítulo 13

3. Obtenga las coordenadas de todas las caras de la imagen:

# Obtener las coordenadas de las caras de todas las caras de la imagen


faces_cordinates = haar_cascade.detectMultiScale (image_gray, scaleFactor = 1.3,
minNeighbors = 7);

4. Dibuja un rectángulo en las caras detectadas:

# Dibuja un rectángulo en las caras detectadas


para (p, q, r, s) en faces_cordinates:
cv2.rectangle (imagen, (p, q), (p + r, q + s), (255,255,0), 2)

5. Convierta el espacio de color de la imagen BGR a RGB y muestre la imagen:

# Convertir el espacio de color de la imagen BGR a RGB


image_rgb = cv2.cvtColor (imagen, cv2.COLOR_BGR2RGB)

# Mostrar imagen de rostro detectado


plt.imshow (image_rgb)

Esto da como resultado la siguiente salida:

En el ejemplo anterior, convertimos la imagen BGR en una imagen en escala de grises. OpenCV tiene
clasificadores entrenados previamente para la detección de rostros, ojos y sonrisas. Podemos usar un archivo
XML de clasificador en cascada de rostros previamente entrenado (haarcascade_frontalface_default.xml). Puede
obtener el archivo clasificador (haarcascade_frontalface_default.xml) desde el repositorio oficial de Git:
https: / / github. com / opencv / opencv / tree / master / data / haarcascades o puede obtenerlo de
nuestro repositorio de GitHub: https: / / github. com / PacktPublishing / Python- Data- Analysis-
Third- Edition / tree / master / Chapter13.

[405]
Analizar datos de imagen Capítulo 13

Después de esto, podemos pasar la imagen al clasificador en cascada y obtener las coordenadas de la cara
en la imagen. Hemos dibujado rectángulos en estas coordenadas faciales usando elrectángulo()función.
Antes de mostrar la salida, necesitamos convertir la imagen RGB a BGR para mostrarla correctamente.
Probemos este ejemplo en una imagen con varias caras:

# Leer la imagen
imagen = cv2.imread ('barcelona.jpeg')

# Convertir imagen BGR a escala de grises


image_gray = cv2.cvtColor (imagen, cv2.COLOR_BGR2GRAY)

# Cargue el archivo clasificador de caras en cascada haar


haar_cascade = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml')

# Obtener las coordenadas de las caras de todas las caras de la imagen


faces_cordinates = haar_cascade.detectMultiScale (image_gray, scaleFactor =
1,3, minNeighbors = 5);

# Dibuja un rectángulo en las caras detectadas


para (x1, y1, x2, y2) en faces_cordinates:
cv2.rectangle (imagen, (x1, y1), (x1 + x2, y1 + y2), (255,255,0), 2)

# Convertir el espacio de color de la imagen BGR a RGB


image_rgb = cv2.cvtColor (imagen, cv2.COLOR_BGR2RGB)

# El rostro de la pantalla detectó la imagen


plt.imshow (image_rgb)

Esto da como resultado la siguiente salida:

En el ejemplo anterior, podemos ver que el programa ha detectado todas las caras en la imagen.

[406]
Analizar datos de imagen Capítulo 13

Resumen
En este capítulo, discutimos el procesamiento de imágenes usando OpenCV. El enfoque principal del capítulo fue sobre
las operaciones básicas de procesamiento de imágenes y la detección de rostros. El capítulo comenzó con una
introducción a los tipos de imágenes y modelos de color de imágenes. En secciones posteriores, la atención se centró en
operaciones de imagen como dibujar, cambiar el tamaño, voltear y desenfocar una imagen. En la última sección,
discutimos la detección de rostros en una imagen de entrada dada.

El próximo capítulo, Capítulo 14, Computación en paralelo con Dask, se centrará en el cálculo paralelo en
bibliotecas Python de ciencia de datos básica como Pandas, NumPy y scikitlearn utilizando Dask. El capítulo
comenzará con los tipos de datos de Dask, como marcos de datos, matrices y bolsas. En secciones
posteriores, cambiaremos el enfoque de dataFrames y matrices a algoritmos de aprendizaje automático, de
preprocesamiento y retrasados en paralelo utilizando Dask.

[407]
Computación en paralelo con Dask
--
Dask es una de las formas más sencillas de procesar sus datos de forma paralela. La plataforma es para los
amantes de los pandas que luchan con grandes conjuntos de datos. Dask ofrece escalabilidad de manera similar
a Hadoop y Spark y la misma flexibilidad que brindan Airflow y Luigi. Dask se puede usar para trabajar en pandas
DataFrames y matrices Numpy que no caben en la RAM. Divide estas estructuras de datos y las procesa en
paralelo mientras realiza cambios mínimos en el código. Utiliza la energía de su computadora portátil y tiene la
capacidad de ejecutarse localmente. También podemos implementarlo en grandes sistemas distribuidos a
medida que implementamos aplicaciones Python. Dask puede ejecutar datos en paralelo y procesarlos en menos
tiempo. También escala la potencia de cálculo de su estación de trabajo sin migrar a un entorno más grande o
distribuido.

El objetivo principal de este capítulo es aprender a realizar cálculos paralelos flexibles en grandes conjuntos de
datos utilizando Dask. La plataforma proporciona tres tipos de datos para la ejecución paralela: Dask Arrays,
Dask DataFrames y Dask Bags. La matriz Dask es como una matriz NumPy, mientras que Dask DataFrames son
como pandas DataFrames. Ambos pueden ejecutar datos en paralelo. Un Dask Bag es un contenedor para
objetos Python para que puedan realizar operaciones simultáneamente. Otro concepto que cubriremos en este
capítulo es Dask Delayed, que paraleliza el código. Dask también ofrece preprocesamiento de datos y desarrollo
de modelos de aprendizaje automático en modo paralelo.

En este capítulo, cubriremos los siguientes temas:

Computación paralela usando tipos de


datos Dask Dask
Dask retrasado
Procesamiento previo de datos a escala

Aprendizaje automático a escala

¡Empecemos!
Computación en paralelo con Dask Capítulo 14

Computación paralela usando Dask


Python es uno de los lenguajes de programación más populares entre los profesionales de datos. Las
bibliotecas de ciencia de datos de Python como Numpy, Pandas, Scipy y Scikit-learn pueden realizar tareas de
ciencia de datos de forma secuencial. Sin embargo, con grandes conjuntos de datos, estas bibliotecas se
volverán muy lentas debido a que no son escalables más allá de una sola máquina. Aquí es donde Dask entra en
escena. Dask ayuda a los profesionales de datos a manejar conjuntos de datos que son más grandes que el
tamaño de la RAM en una sola máquina. Dask utiliza los múltiples núcleos de un procesador o lo usa como un
entorno computarizado distribuido. Dask tiene las siguientes cualidades:

Está familiarizado con las bibliotecas de Python existentes

Ofrece una programación de tareas flexible

Ofrece un entorno único y distribuido para el cálculo paralelo Realiza


operaciones rápidas con menor latencia y sobrecarga Puede escalar
hacia arriba y hacia abajo

Dask ofrece conceptos similares a pandas, NumPy y Scikit-learn, lo que facilita el aprendizaje. Es una
biblioteca Python de computación paralela de código abierto que se ejecuta sobre pandas, Numpy y
Scikit-learn en múltiples núcleos de una CPU o múltiples sistemas. Por ejemplo, si una computadora
portátil tiene un procesador de cuatro núcleos, Dask utilizará 4 núcleos para procesar los datos. Si los
datos no caben en la RAM, se dividirán en trozos antes de procesarlos. Dask escala la capacidad de
pandas y NumPy para manejar conjuntos de datos moderadamente grandes. Entendamos cómo Dask
realiza operaciones en paralelo observando el siguiente diagrama:

[409]
Computación en paralelo con Dask Capítulo 14

Dask crea un gráfico de tareas para ejecutar un programa en modo paralelo. En el gráfico de tareas, los
nodos representan la tarea y los bordes entre los nodos representan la dependencia de una tarea sobre
otra.

Instalemos la biblioteca Dask en nuestro sistema local. De forma predeterminada, Anaconda ya tiene
Dask instalado, pero si desea reinstalar o actualizar Dask, puede usar el siguiente comando:

conda instalar dask

También podemos instalarlo usando el pepita comando, como se muestra aquí:

pip instalar dask

Con eso, hemos aprendido a instalar el dask biblioteca para ejecución rápida y en paralelo. Ahora,
veamos los tipos de datos centrales de la biblioteca Dask.

Tipos de datos Dask


En programación de computadoras, los tipos de datos son bloques de construcción básicos para escribir
cualquier tipo de funcionalidad. Nos ayudan a trabajar con diferentes tipos de variables. Los tipos de datos son
el tipo de valores que se almacenan en variables. Pueden ser primarios y secundarios.

Los tipos de datos primarios son los tipos de datos básicos como int, float y char, mientras que los tipos de
datos secundarios se desarrollan utilizando tipos de datos primarios como listas, matrices, cadenas y
DataFrames. Dask ofrece tres estructuras de datos para operaciones paralelas: DataFrames, Bags y Arrays.
Estas estructuras de datos dividen los datos en varias particiones y los distribuyen a varios nodos del
clúster. Un Dask DataFrame es una combinación de múltiples pequeños pandas DataFrames y funciona de
manera similar. Las matrices Dask son como matrices NumPy y admiten todas las operaciones de Numpy.
Finalmente, Dask Bags se utilizan para procesar grandes objetos de Python.

Ahora es el momento de explorar estos tipos de datos. Comenzaremos con Dask Arrays.

[410]
Computación en paralelo con Dask Capítulo 14

Matrices Dask
Una matriz Dask es una abstracción de la matriz n-dimensional NumPy, procesada en paralelo y
dividida en múltiples submatrices. Estas pequeñas matrices pueden estar en máquinas remotas
distribuidas o locales. Dask Arrays puede calcular arreglos de gran tamaño utilizando todos los
núcleos disponibles en el sistema. Se pueden aplicar a estadísticas, optimización, bioinformática,
dominios comerciales, ciencias ambientales y muchos más campos. También admiten muchas
operaciones NumPy, como operaciones aritméticas y escalares, operaciones de agregación, matrices
y operaciones de álgebra lineal. Sin embargo, no admiten formas desconocidas. También elListar y
clasificar Las operaciones son difíciles de realizar en paralelo. Entendamos cómo Dask Arrays
descompone los datos en una matriz NumPy y los ejecutamos en paralelo observando el siguiente
diagrama:

Como podemos ver, hay varios bloques de diferentes formas, todos los cuales representan matrices
NumPy. Estas matrices forman una matriz Dask y se pueden ejecutar en varias máquinas. Creemos una
matriz usando Dask:

# importar Dask Array


importar dask.array como da

# Cree Dask Array usando la función arange () y genere valores de 0 a


17
a = da.arange (18, trozos = 4)

# Calcule la matriz
a.compute ()

[411]
Computación en paralelo con Dask Capítulo 14

Esto da como resultado la siguiente salida:

matriz ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,17])

En el ejemplo anterior, usamos el calcular() función para obtener el resultado final. losda.arange () La
función solo creará el gráfico computacional, mientras que la calcular()La función se utiliza para
ejecutar ese gráfico. Hemos generado 18 valores con un tamaño de fragmento de 4 usando el
da.arange () función. También revisemos los fragmentos en cada partición:

# Verifique el tamaño del fragmento


trozos

Esto da como resultado la siguiente salida:

((4, 4, 4, 4, 2),)

En el ejemplo anterior, una matriz con 18 valores se particionó en cinco partes con un tamaño de
fragmento de 4, donde estos fragmentos iniciales tienen 4 valores cada uno y el último tiene 2 valores.

Dask DataFrames
Dask DataFrames son abstracciones de pandas DataFrames. Se procesan en paralelo y se dividen
en múltiples DataFrames de pandas más pequeños, como se muestra en el siguiente diagrama:

[412]
Computación en paralelo con Dask Capítulo 14

Estos pequeños DataFrames se pueden almacenar en máquinas remotas locales o distribuidas.


Dask DataFrames puede calcular DataFrames de gran tamaño utilizando todos los núcleos
disponibles en el sistema. Coordinan los DataFrames mediante la indexación y admiten
operaciones estándar de pandas comogroupby, unirse, y series de tiempo. Dask DataFrames realiza
operaciones como elementos, filas, es en(), y fecha más rápido en comparación conset_index () y
entrar() en operaciones de índice. Ahora, experimentemos con el rendimiento o la velocidad de
ejecución de Dask:

# Leer archivo csv usando pandas


importar pandas como pd
% time temp = pd.read_csv ("HR_comma_sep.csv")

Esto da como resultado la siguiente salida:

Tiempos de CPU: usuario 17,1 ms, sys: 8,34 ms, total: 25,4 ms

Tiempo de pared: 36,3 ms

En el código anterior, probamos el tiempo de lectura de un archivo usando pandas read_csv ()


función. Ahora, probemos el tiempo de lectura del Daskread_csv () función:

# Leer archivo csv usando Dask

importar dask.dataframe como dd

% tiempo df = dd.read_csv ("HR_comma_sep.csv")

Esto da como resultado la siguiente salida:

Tiempos de CPU: usuario 18,8 ms, sys: 5,08 ms, total: 23,9 ms

Tiempo de pared: 25,8 ms

En ambos ejemplos, podemos observar que el tiempo de ejecución para la lectura de datos se reduce
cuando se usa el Dask read_csv () función.

Indexación de DataFrame
Dask DataFrames admite dos tipos de índice: indexación posicional y basada en etiquetas. El principal
problema con Dask Indexing es que no mantiene la información de la partición. Esto significa que es
difícil realizar la indexación de filas; solo es posible la indexación de columnas.DataFrame.iloc solo admite
la indexación basada en números enteros, mientras que DataFrame.loc admite la indexación basada en
etiquetas. DataFrame.iloc solo selecciona columnas.

[413]
Computación en paralelo con Dask Capítulo 14

Realicemos estas operaciones de indexación en un Dask DataFrame:

1. Primero, debemos crear un DataFrame y realizar la indexación de columnas:

# Importar Dask y Pandas DataFrame


importar dask.dataframe como dd
importar pandas como pd

# Crear marco de datos de Pandas


df = pd.DataFrame ({"P": [10, 20, 30], "Q": [40, 50, 60]}, índice = ['p', 'q', 'r'])

# Crear Dask DataFrame


ddf = dd. de_pandas (df, nparticiones = 2)

# Verifique los mejores récords


ddf.head ()

Esto da como resultado la siguiente salida:

PQ

pág. 10 40

q 20 50

r 30 60

En el ejemplo anterior, creamos un DataFrame de pandas (con p, q, y r


índices y PAG y Q columnas) y lo convirtió en un Dask DataFrame.

2. El proceso de selección de columnas en Dask es similar a lo que hacemos en pandas.


Seleccionemos una sola columna en nuestro Dask DataFrame:

# Selección de columna única


ddf ['P']

Esto da como resultado la siguiente salida:

Estructura de la serie Dask:

nparticiones = 1

p int64

r ...
Nombre: P, dtype: int64
Dask Name: getitem, 2 tareas

[414]
Computación en paralelo con Dask Capítulo 14

En el código anterior, seleccionamos una sola columna pasando el nombre de la columna.


Para la selección de varias columnas, necesitamos pasar una lista de columnas.

3. Seleccionemos varias columnas en nuestro Dask DataFrame:

# Selección de múltiples columnas


ddf [['Q', 'P']]

Esto da como resultado la siguiente salida:

Estructura de Dask DataFrame:

QP

nparticiones = 1

p int64 int64

r ... ...

Dask Name: getitem, 2 tareas

Aquí, hemos seleccionado dos columnas de la lista de columnas disponibles.

4. Ahora, creemos un DataFrame con un índice entero:

# Importar Dask y Pandas DataFrame


importar dask.dataframe como dd
importar pandas como pd

# Crear marco de datos de Pandas


df = pd.DataFrame ({"X": [11, 12, 13], "Y": [41, 51, 61]})

# Crear Dask DataFrame


ddf = dd. de_pandas (df, nparticiones = 2)

# Verifique los mejores récords


ddf.head ()

Esto da como resultado la siguiente salida:

XY

0 11 41

1 12 51

2 13 61

[415]
Computación en paralelo con Dask Capítulo 14

En el código anterior, creamos un DataFrame de pandas y lo convertimos en un


Dask DataFrame usando el from_pandas () función.

5. Seleccionemos la columna requerida usando un índice entero posicional:

ddf.iloc [:, [1, 0]]. compute ()

Esto da como resultado la siguiente salida:

YX
0 41 11

1 51 12

2 61 13

En el código anterior, intercambiamos la ubicación de la columna usando iloc mientras se usa


un índice entero posicional.

6. Si intentamos seleccionar todas las filas, obtendremos un NotImplementedError, como se muestra aquí:

ddf.iloc [0: 4, [1, 0]]. compute ()

Esto da como resultado la siguiente salida:

NotImplementedError: 'DataFrame.iloc' solo admite la selección de columnas.


Debe usarse como 'df.iloc [:, column_indexer]'.

En el bloque de código anterior, podemos ver que el DataFrame.iloc solo admite la selección de
columnas.

Filtrar datos
Podemos filtrar los datos de un Dask DataFrame de manera similar a como lo haríamos para un
Pandas DataFrame. Echemos un vistazo al siguiente ejemplo:

# Importar Dask DataFrame


importar dask.dataframe como dd

# Leer archivo CSV


ddf = dd.read_csv ('HR_comma_sep.csv')

# Ver los 5 mejores registros


ddf.head (5)

[416]
Computación en paralelo con Dask Capítulo 14

Esto da como resultado la siguiente salida:

En el código anterior, leemos el archivo CSV de recursos humanos usando el read_csv ()función en
el Dask DataFrame. Esta salida solo muestra algunas de las columnas. Sin embargo, cuando
ejecute el cuaderno usted mismo, podrá ver todas las columnas disponibles. Filtremos los
empleados con salarios bajos en el conjunto de datos:

# Filtrar empleado con salario bajo


ddf2 = ddf [ddf.salary == 'bajo']

ddf2.compute (). head ()

Esto da como resultado la siguiente salida:

En el código anterior, filtramos a los empleados con salarios bajos a través de la condición entre
paréntesis.

Agrupar por
los agrupar por La operación se utiliza para agregar elementos similares. Primero, divide los datos en función de
los valores, encuentra un agregado de valores similares y combina los resultados agregados. Esto se puede ver
en el siguiente código:

# Encuentre los valores promedio de todas las columnas para el empleado que se fue o se quedó
ddf.groupby ('izquierda'). mean (). compute ()

[417]
Computación en paralelo con Dask Capítulo 14

Esto da como resultado la siguiente salida:

En el ejemplo anterior, agrupamos los datos según la columna de la izquierda (muestra un


empleado que se quedó o dejó la empresa) y los agregamos por el valor medio.

Conversión de un DataFrame de pandas en un DataFrame de Dask


Dask DataFrames se implementan en base a pandas DataFrames. Para los analistas de datos, es
necesario aprender a convertir un Dask DataFrame en un pandas DataFrame. Eche un vistazo al
siguiente código:

# Importar Dask DataFrame


desde dask importar marco de datos como dd

# Convertir pandas dataframe a dask dataframe


ddf = dd.from_pandas (pd_df, chunksize = 4)

tipo (ddf)

Esto da como resultado la siguiente salida:

dask.dataframe.core.DataFrame

Aquí, hemos utilizado el from_pandas () método para convertir un DataFrame de pandas en un


DataFrame de Dask.

Conversión de un Dask DataFrame en un pandas DataFrame


En la subsección anterior, convertimos un DataFrame de pandas en un Dask DataFrame. De manera
similar, podemos convertir un Dask DataFrame en un pandas DataFrame usando elcalcular() método,
como se muestra aquí:

# Convertir dask DataFrame en pandas DataFrame


pd_df = df.compute ()

tipo (pd_df)

[418]
Computación en paralelo con Dask Capítulo 14

Esto da como resultado la siguiente salida:

pandas.core.frame.DataFrame

Ahora, aprendamos sobre otro tema importante: Dask Bags.

Bolsas Dask
Un Dask Bag es una abstracción sobre objetos genéricos de Python. Realizamapa, filtro, plegado,y agrupar por
operaciones en la interfaz paralela de objetos Python más pequeños usando un iterador Python. Esta ejecución
es similar a PyToolz o PySpark RDD. Dask Bags es más adecuado para conjuntos de datos semiestructurados y
no estructurados, como archivos de texto, JSON y de registro. Realizan multiprocesamiento para la computación
para un procesamiento más rápido, pero no funcionan bien con la comunicación entre trabajadores. Las bolsas
son tipos inmutables de estructuras que no se pueden cambiar y son más lentas en comparación con Dask
Arrays y DataFrames. Las bolsas también funcionan lentamente en elagrupar por operación, por lo que se
recomienda que utilice doblarse en lugar de
agrupar por.

Ahora, creemos varios objetos Dask Bag y realicemos operaciones en ellos.

Creando una Dask Bag usando elementos iterables de Python


Creemos algunos objetos Dask Bag usando elementos iterables de Python:

# Importar bolsa dask


importar dask.bag como db

# Crea una bolsa de elementos de la lista


items_bag = db.from_sequence ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], nparticiones = 3)

# Tome los dos elementos iniciales


items_bag.take (2)

Esto da como resultado la siguiente salida:

(1, 2)

En el código anterior, creamos una bolsa de elementos de lista usando el from_sequence ()


método. losfrom_Sequence () El método toma una lista y la coloca en nparticionesvarias
particiones). Filtremos los números impares de la lista:

# Filtrar la bolsa de elementos de la lista

[419]
Computación en paralelo con Dask Capítulo 14

items_square = items_bag.filter (lambda x: x if x% 2! = 0 else None)

# Calcule los resultados


items_square.compute ()

Esto da como resultado la siguiente salida:

[1, 3, 5, 7, 9]

En el código anterior, filtramos los números impares de la bolsa de listas usando elfiltrar()
método. Ahora, cuadremos cada elemento de la bolsa usando elmapa función:

# Cuadre la bolsa de elementos de la lista


items_square = items_b.map (lambda x: x ** 2)

# Calcule los resultados


items_square.compute ()

Esto da como resultado la siguiente salida:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

En el código anterior, usamos el mapa() función para mapear los artículos de la bolsa. Asignamos estos
elementos a su valor cuadrado.

Creando un Dask Bag usando un archivo de texto


Podemos crear un Dask Bag usando un archivo de texto usando el Lea el texto() método, como sigue:

# Importar bolsa dask


importar dask.bag como db

# Crea una bolsa de archivo de texto


texto = db.read_text ('muestra.txt')

# Mostrar los 2 elementos iniciales del texto


text.take (2)

Esto da como resultado la siguiente salida:

('¡Hola! ¿Cómo estás? \ N', '\ n')

En el código anterior, leemos un archivo de texto en un bolsa dask objeto utilizando el Lea el texto()método.
Esto nos permitió mostrar los dos elementos iniciales en el Dask Bag.

[420]
Computación en paralelo con Dask Capítulo 14

Almacenar una Dask Bag en un archivo de texto


Guardemos una Dask Bag en un archivo de texto:

# Convierte el objeto dask bag en un archivo de texto


text.to_textfiles ('/ ruta / a / datos / *. text.gz')

Esto da como resultado la siguiente salida:

['/path/to/data/0.text.gz']

En el código anterior, to_textfiles () convertido el bolso objeto en un archivo de texto.

Almacenamiento de una bolsa Dask en un DataFrame


Guardemos una Dask Bag en un DataFrame:

# Importar bolsa dask


importar dask.bag como db

# Crea una bolsa de elementos de diccionario


dict_bag = db.from_sequence ([{'item_name': 'Egg', 'price': 5}, {'item_name': 'Bread',
'price': 20},
{'item_name': 'Leche', 'precio': 54}], nparticiones
= 2)

# Convertir objeto de bolsa en marco de datos


df = dict_bag.to_dataframe ()

# Ejecutar los resultados del gráfico


df.compute ()

Esto da como resultado la siguiente salida:

En el ejemplo anterior, creamos un Dask Bag de elementos de diccionario y lo convertimos en un


Dask DataFrame usando el to_dataframe () método. En la siguiente sección, veremos Dask retrasado.

[421]
Computación en paralelo con Dask Capítulo 14

Dask retrasado
Dask Delayed es un enfoque que podemos utilizar para paralelizar el código. Puede retrasar las llamadas a
funciones dependientes en los gráficos de tareas y proporciona al usuario un control completo sobre los procesos
paralelos al tiempo que mejora el rendimiento. Su cálculo lento nos ayuda a controlar la ejecución de funciones. Sin
embargo, esto difiere de los tiempos de ejecución de las funciones para la ejecución en paralelo.

Entendamos el concepto de Dask Delayed mirando un ejemplo:


# Importar dask retrasado y calcular
desde dask import retrasado, calcular

# Crear función retrasada


@demorado
def cube (elemento):
artículo devuelto ** 3

# Crear función retrasada


@demorado
def promedio (elementos):
devolver suma (artículos) / len (artículos)

# Crear una lista


item_list = [2, 3, 4]

# Calcular el cubo de la lista de elementos dada


cube_list = [cubo (i) para i en item_list]

# Calcular el promedio de cube_list


gráfico_cálculo = promedio (lista_cubos)

# Calcule los resultados


computation_graph.compute ()

Esto da como resultado la siguiente salida:

33,0

En el ejemplo anterior, dos métodos, cubo y promedio, fueron anotados con@ dask.delayed. Se creó
una lista de tres números y se calculó un cubo que contiene cada valor. Después de calcular el cubo
de valores de lista, calculamos el promedio de todos los valores. Todas estas operaciones son de
naturaleza perezosa y se calculan más tarde cuando se espera la salida del programador y el flujo
de ejecución se almacena en un gráfico computacional. Ejecutamos esto usando elcalcular()
método. Aquí, todas las operaciones del cubo se ejecutarán de forma paralela.

[422]
Computación en paralelo con Dask Capítulo 14

Ahora, visualizaremos el gráfico computacional. Sin embargo, antes de que podamos hacer esto,
necesitamos instalar el editor Graphviz.

En Windows, podemos instalar Graphviz usando pepita. También debemos establecer la ruta en una
variable de entorno:

pip instalar graphviz

En Mac, podemos instalarlo usando elaborar cerveza, como sigue:

brew instalar graphviz

En Ubuntu, necesitamos instalarlo en una Terminal usando el sudo apt-get mando:

sudo apt-get install graphviz

Ahora, visualicemos el gráfico computacional:

# Calcule los resultados


computation_graph.visualize ()

Esto da como resultado la siguiente salida:

[423]
Computación en paralelo con Dask Capítulo 14

En el ejemplo anterior, imprimimos un gráfico computacional usando el visualizar()método. En


este gráfico, todas las operaciones del cubo se ejecutaron de forma paralela y su resultado fue
consumido por elpromedio() función.

Procesamiento previo de datos a escala


El preprocesamiento de Dask ofrece funcionalidades de scikit-learn como escaladores, codificadores y divisiones de
entrenamiento / prueba. Estas funcionalidades de preprocesamiento funcionan bien con Dask DataFrames y Arrays, ya
que pueden ajustar y transformar datos en paralelo. En esta sección, analizaremos el escalado de características y la
codificación de características.

Escalado de funciones en Dask


Como comentamos en el Capítulo 7, Limpieza de datos desordenados, el escalado de características, también conocido como
normalización de características, se utiliza para escalar las características en el mismo nivel. Puede manejar problemas
relacionados con diferentes rangos y unidades de columnas. Dask también ofrece métodos de escalado que tienen capacidad de
ejecución paralela. Utiliza la mayoría de los métodos que ofrece scikit-learn:

Escalador Descripción
MinMaxScaler Transforma las características al escalar cada característica a un rango dado Escala

Escalador robusto las características usando estadísticas que son robustas a valores atípicos

Escalador estándar Estandariza las características eliminando la media y escalando a la varianza de la unidad

Escalemos el last_evaluation (puntaje de desempeño del empleado) del conjunto de datos de


recursos humanos:

# Importar Dask DataFrame


importar dask.dataframe como dd

# Leer archivo CSV


ddf = dd.read_csv ('HR_comma_sep.csv')

# Ver los 5 mejores registros


ddf.head (5)

[424]
Computación en paralelo con Dask Capítulo 14

Esto da como resultado la siguiente salida:

En el código anterior, leemos el archivo CSV de recursos humanos usando el read_csv ()función en
un Dask DataFrame. El resultado anterior solo muestra algunas de las columnas que están
disponibles. Sin embargo, cuando ejecute el cuaderno usted mismo, podrá ver todas las columnas
del conjunto de datos. Ahora, escalemos ellast_evalaution columna (última puntuación de
rendimiento evaluada):

# Importar MinMaxScaler
desde sklearn.preprocessing import MinMaxScaler

# Crear una instancia del objeto MinMaxScaler


escalador = MinMaxScaler (feature_range = (0, 100))

# Ajuste los datos en Scaler


scaler.fit (ddf [['última_evaluación']])

# Transforma los datos


performance_score = scaler.transform (ddf [['última_evaluación']])

# Veamos la puntuación de rendimiento escalada


performance_score

Esto da como resultado la siguiente salida:

matriz ([[26.5625],

[78.125],

[81.25],

...,

[26.5625],

[93,75],

[25. ]])

[425]
Computación en paralelo con Dask Capítulo 14

En el ejemplo anterior, escalamos el last_evaluation (última puntuación de desempeño evaluada). Lo


escalamos de un rango de 0-1 a un rango de 0-100. A continuación, veremos la codificación de
funciones en Dask.

Codificación de funciones en Dask


Como comentamos en el Capítulo 7, Limpieza de datos desordenados, la codificación de características es una
técnica muy útil para manejar características categóricas. Dask también ofrece métodos de codificación que tienen
capacidad de ejecución paralela. Utiliza la mayoría de los métodos que ofrece scikit-learn:

Codificador Descripción
Codifica etiquetas con un valor entre 0 y 1 que es menor que el número de
LabelEncoder
clases disponibles.
OneHotEncoder Codifica características enteras categóricas como una codificación one-
Codificador ordinal hot. Codifica una columna categórica como variable ordinal.

Intentemos usar estos métodos:

# Importar Dask DataFrame


importar dask.dataframe como dd

# Leer archivo CSV


ddf = dd.read_csv ('HR_comma_sep.csv')

# Ver los 5 mejores registros


ddf.head (5)

Esto da como resultado la siguiente salida:

[426]
Computación en paralelo con Dask Capítulo 14

En el código anterior, leemos el archivo CSV de recursos humanos usando el read_csv ()función en
un Dask DataFrame. El resultado anterior solo muestra algunas de las columnas que están
disponibles. Sin embargo, cuando ejecute el cuaderno usted mismo, podrá ver todas las columnas
del conjunto de datos. Ahora, escalemos ellast_evalaution columna (última puntuación de
rendimiento evaluada):

# Importar codificador Onehot


desde dask_ml.preprocessing importar categorizador desde
dask_ml.preprocessing importar OneHotEncoder desde
sklearn.pipeline importar make_pipeline

# Crear canalización con categorizador y OneHotEncoder


pipe = make_pipeline (Categorizador (), OneHotEncoder ())

# Ajustar y transformar el categorizador y OneHotEncoder


pipe.fit (ddf [['salario',]]) resultado = pipe.transform
(ddf [['salario',]])

# Ver los 5 mejores registros


result.head ()

Esto da como resultado la siguiente salida:

salario_bajo salario_medio salario_alto


0 1.0 0.0 0.0
1 0.0 1.0 0.0
2 0.0 1.0 0.0
3 1.0 0.0 0.0
4 1.0 0.0 0.0

En el ejemplo anterior, el scikit-learn la canalización se creó utilizando Categorizador ()y


OneHotEncoder (). Luego, la columna Salario de los datos de Recursos Humanos se codificó utilizando
la encajar() y transformar() métodos. Tenga en cuenta que el categorizador convertirá las columnas de
un DataFrame en tipos de datos categóricos.

Del mismo modo, también podemos codificar la columna Salario utilizando el codificador ordinal. Echemos un vistazo a
un ejemplo:

# Importar codificador Onehot


desde dask_ml.preprocessing importar categorizador desde
dask_ml.preprocessing importar OrdinalEncoder desde
sklearn.pipeline importar make_pipeline

# Crear canalización con Categorizer y OrdinalEncoder

[427]
Computación en paralelo con Dask Capítulo 14

pipe = make_pipeline (Categorizador (), OrdinalEncoder ())

# Ajustar y transformar el categorizador y OneHotEncoder


pipe.fit (ddf [['salario',]]) resultado = pipe.transform
(ddf [['salario',]])

# Veamos resultados codificados


result.head ()

Esto da como resultado la siguiente salida:

salario

00

11

21

30

40

En el ejemplo anterior, la canalización de scikit-learn se creó utilizando Categorizador () y


OrdinalEncoder (). Luego, la columna Salario de los datos de Recursos Humanos se codificó
utilizando la encajar() y transformar() métodos. Tenga en cuenta que el categorizador convertirá las
columnas de un DataFrame en tipos de datos categóricos.

Aprendizaje automático a escala


Dask ofrece servicios Dask-ML para operaciones de aprendizaje automático a gran escala utilizando Python. Dask-ML reduce el
tiempo de entrenamiento del modelo para conjuntos de datos de tamaño mediano y experimentos con ajuste de
hiperparámetros. Ofrece algoritmos de aprendizaje automático similares a scikit-learn para operaciones de aprendizaje
automático.

Podemos escalar scikit-learn de tres formas diferentes: paralelizar scikit-learn usando joblib mediante
el uso de bosque aleatorio y SVC; Reimplementar algoritmos usando Dask Arrays usando modelos
lineales generalizados, preprocesamiento y agrupamiento; y asócielo con bibliotecas distribuidas como
XGBoost y Tensorflow.

Comencemos analizando la computación paralela usando scikit-learn.

[428]
Computación en paralelo con Dask Capítulo 14

Computación paralela usando scikit-learn


Para realizar computación en paralelo usando scikit-learn en una sola CPU, necesitamos usar joblib.Esto hace
que las operaciones de scikit-learn sean computables en paralelo. losjoblib la biblioteca realiza la paralelización
en trabajos de Python. Dask puede ayudarnos a realizar operaciones paralelas en múltiples estimadores de
scikit-learn. Vamos a ver:

1. Primero, necesitamos leer el conjunto de datos. Podemos cargar el conjunto de datos usando un
DataFrame de pandas, así:

# Importar Dask DataFrame


importar pandas como pd

# Leer archivo CSV


df = pd.read_csv ('HR_comma_sep.csv')

# Ver los 5 mejores registros


df. cabeza (5)

Esto da como resultado la siguiente salida:

En el código anterior, leemos el archivo CSV de recursos humanos usando elread_csv ()


función en un Dask DataFrame. El resultado anterior solo muestra algunas de las
columnas que están disponibles. Sin embargo, cuando ejecute el cuaderno usted mismo,
podrá ver todas las columnas del conjunto de datos. Ahora, escalemos ellast_evalaution
columna (última puntuación de desempeño evaluada).

2. A continuación, debemos seleccionar las columnas dependientes e independientes. Para hacer esto,
seleccione las columnas y divida los datos en variables dependientes e independientes, de la siguiente
manera:

# seleccione la función y las columnas de destino


data = df [['nivel_de_saatisfacción', 'última_evaluación']]

label = df ['izquierda']

[429]
Computación en paralelo con Dask Capítulo 14

3. Cree un planificador y genere el modelo en paralelo. Importar eldask.distributed cliente


para crear un programador y un trabajador en una máquina local:

# Importar cliente
desde dask.distributed import Client

# Instancia del cliente


cliente = Cliente ()

4. El siguiente paso es crear un backend paralelo usando sklearn.externals.jobliby


escribe lo normal scikit-learn código:

# import dask_ml.joblib
de sklearn.externals.joblib importar paralelo_backend

con paralelo_backend ('dask'):


# Escriba aquí el código normal de scikit-learn
de sklearn.ensemble importar RandomForestClassifier de
sklearn.metrics importar precision_score
de sklearn.model_selection importar train_test_split

# Divida los datos en dos partes: conjunto de entrenamiento y prueba


X_train, X_test, y_train, y_test = train_test_split (data, label, test_size = 0.2,

estado_aleatorio = 0)
# Instanciar modelo RandomForest
modelo = RandomForestClassifier ()

# Encajar el modelo
model.fit (X_train, y_train)

# Predecir las clases


y_pred = model.predict (X_test)

# Encuentra la precisión del modelo


print ("Precisión:", puntuación_precisión (y_prueba, y_pred))

Esto da como resultado la siguiente salida:

Precisión: 0,92

El modelo de bosque aleatorio generado en paralelo anterior nos ha dado un 92% de precisión, lo cual es muy
bueno.

[430]
Computación en paralelo con Dask Capítulo 14

Reimplementación de algoritmos de AA para Dask


El equipo de desarrollo de Dask ha vuelto a implementar algunos algoritmos de aprendizaje
automático mediante Dask Arrays y DataFrames. Se han vuelto a implementar los siguientes
algoritmos:

Modelos lineales de aprendizaje automático como regresión lineal y regresión logística


Procesamiento previo con escaladores y codificadores
Algoritmos no supervisados como la agrupación en clústeres de k-medias y la agrupación espectral

En la siguiente subsección, crearemos un modelo de regresión logística y realizaremos agrupaciones


en el conjunto de datos.

Regresión logística
Construyamos un clasificador usando regresión logística:

1. Cargue el conjunto de datos en un Dask DataFrame, de la siguiente manera:

# Leer archivo CSV usando Dask


importar dask.dataframe como dd

# Leer datos de recursos humanos


ddf = dd.read_csv ("HR_comma_sep.csv")

# Veamos los 5 mejores registros


ddf.head ()

Esto da como resultado la siguiente salida:

En el código anterior, leemos el archivo CSV de recursos humanos usando elread_csv ()


función en un Dask DataFrame. El resultado anterior solo muestra algunas de las
columnas que están disponibles. Sin embargo, si ejecuta el cuaderno usted mismo, podrá
ver todas las columnas del conjunto de datos. Ahora, escalemos ellast_evalaution columna
(última puntuación de desempeño evaluada).

[431]
Computación en paralelo con Dask Capítulo 14

2. A continuación, seleccione la columna requerida para la clasificación y divídala en variables


dependientes e independientes:

data = ddf [['nivel_de_seguridad', 'última_evaluación']]. to_dask_array (le ngths = True)

label = ddf ['izquierda']. to_dask_array (longitudes = Verdadero)

3. Ahora, creemos un Regresión logística modelo. Primero, importa


Regresión logística y train_test_split. Una vez que haya importado el
bibliotecas necesarias, divida el conjunto de datos en dos partes; es decir, entrenar y probar conjuntos
de datos:

# Importar regresión logística basada en Dask


de dask_ml.linear_model import LogisticRegression

# Importar train_test_split basado en Dask


de dask_ml.model_selection importar train_test_split

# Divida los datos en un conjunto de entrenamiento y prueba


X_train, X_test, y_train, y_test = train_test_split (datos, etiqueta)

4. Cree una instancia del modelo y ajústelo a un conjunto de datos de entrenamiento. Ahora, puede predecir los datos
de prueba y calcular la precisión del modelo, de la siguiente manera:

# Crear modelo de regresión logística


modelo = LogisticRegression ()

# Encajar el modelo
model.fit (X_train, y_train)

# Predecir las clases


y_pred = model.predict (X_test)

# Encuentra la precisión del modelo


print ("Precisión:", puntuación_precisión (y_prueba, y_pred))

Esto da como resultado la siguiente salida:

Precisión: 0,7753333333333333

Como podemos ver, el modelo ofrece una precisión del 77,5%, lo que se considera
bueno.

[432]
Computación en paralelo con Dask Capítulo 14

Agrupación
Los desarrolladores de Dask también han vuelto a implementar varios algoritmos de agrupación de k-means.
Realicemos la agrupación en clústeres usando Dask:

1. Lea los datos de recursos humanos en un Dask DataFrame, de la siguiente manera:

# Leer archivo CSV usando Dask


importar dask.dataframe como dd

# Leer datos de recursos humanos


ddf = dd.read_csv ("HR_comma_sep.csv")

# Veamos los 5 mejores registros


ddf.head ()

Esto da como resultado la siguiente salida:

En el código anterior, leemos el archivo CSV de recursos humanos usando elread_csv ()


función en un Dask DataFrame. El resultado anterior solo muestra algunas de las
columnas que están disponibles. Sin embargo, cuando ejecute el cuaderno usted mismo,
podrá ver todas las columnas del conjunto de datos. Ahora, escalemos ellast_evalaution
columna (última puntuación de desempeño evaluada).

2. A continuación, seleccione la columna requerida para la agrupación en clústeres de k-medias. Hemos seleccionado el
nivel_de_saatisfacción y last_evaluation columnas aquí:

data = ddf [['nivel_de_seguridad', 'última_evaluación']].


to_dask_array (lengths = True)

3. Ahora, creemos un modelo de agrupación en clústeres de k-medias. Primero, importe k-means. Una vez que
haya importado las bibliotecas necesarias, colóquelas en el conjunto de datos y obtenga las etiquetas
necesarias. Podemos encontrar estas etiquetas usando elcalcular() método:

# Importar Kmedios basados en Dask


de dask_ml.cluster importar KMeans

# Crea el modelo Kmeans

[433]
Computación en paralelo con Dask Capítulo 14

modelo = KMeans (n_clusters = 3)

# Encajar el modelo
model.fit (datos)

# Predecir las clases


label = model.labels_

# Calcule los resultados


label.compute ()

Esto da como resultado la siguiente salida:

matriz ([0, 1, 2, ..., 0, 2, 0], dtype = int32)

En el código anterior, creamos el modelo de k-medias con tres grupos, ajustamos el


modelo y predijimos las etiquetas para el grupo.

4. Ahora, visualizaremos los resultados de k-medias usando el matplotlib Biblioteca:

# Importar matplotlib.pyplot
importar matplotlib.pyplot como plt

# Prepare x, y y cluster_labels
x = datos [:, 0] .compute ()
y = datos [:, 1] .compute ()
cluster_labels = label.compute ()

# Dibujar diagrama de dispersión


plt.scatter (x, y, c = cluster_labels)

# Agregar etiqueta en el eje X


plt.xlabel ('Nivel de satisfacción')

# Agregar etiqueta en el eje X


plt.ylabel ('Nivel de rendimiento')

# Agrega un título al gráfico


plt.title ('Grupos de empleados que dejaron la empresa')

# Muestra la trama
plt.show ()

[434]
Computación en paralelo con Dask Capítulo 14

Esto da como resultado la siguiente salida:

En el código anterior, visualizamos los clústeres usando matplotlib.pyplot. Aquí, hemos


representado el puntaje de satisfacción en el eje X, el puntaje de desempeño en el eje Y, y
hemos distinguido entre los grupos usando diferentes colores.

Resumen
En este capítulo, nos enfocamos en cómo realizar cálculos paralelos en bibliotecas Python de ciencia de
datos básica como pandas, Numpy y scikit-learn. Dask proporciona una abstracción completa para
DataFrames y Arrays para procesar conjuntos de datos moderadamente grandes en máquinas de
núcleo único / múltiple o múltiples nodos en un clúster.

Comenzamos este capítulo analizando los tipos de datos de Dask como DataFrames, Arrays y Bags.
Después de eso, nos enfocamos en Dask Delayed, preprocesamiento y algoritmos de aprendizaje
automático en un entorno paralelo.

[435]
Computación en paralelo con Dask Capítulo 14

Este fue el último capítulo de este libro, lo que significa que nuestro viaje de aprendizaje termina aquí.
Nos hemos centrado en las bibliotecas centrales de Python para el análisis de datos y el aprendizaje
automático, como pandas, Numpy, Scipy y scikit-learn. También nos hemos centrado en las bibliotecas de
Python que se pueden utilizar para análisis de texto, análisis de imágenes y cálculo paralelo como NLTK,
spaCy, OpenCV y Dask. Por supuesto, su proceso de aprendizaje no necesita detenerse aquí; siga
aprendiendo cosas nuevas y sobre los últimos cambios. Intente explorar y cambiar el código según las
necesidades de su negocio o cliente. También puede iniciar proyectos privados o personales con fines de
aprendizaje. Si no puede decidir qué tipo de proyecto desea iniciar, puede participar en los concursos de
Kaggle enhttp: / / www. kaggle. com / ¡y más!

[436]

También podría gustarte