<jupyter_start><jupyter_text>Taller Análisis de Datos con Python  Cargue del archivoPrimero vamos a cargar el archivo con la ayuda de la librería de pandas Importo la librería de pandas<jupyter_code>import pandas as pd<jupyter_output><empty_output><jupyter_text>Leo el archivo<jupyter_code>data = pd.read_csv('DataSet.csv',sep=';')<jupyter_output><empty_output><jupyter_text>Análisis Exploratorio Exploramos el dataset con estos métodos de la librería de pandas* df.head()* df.tail()* df.info()* df.shape* df.columns* df.describe()* df.value_counts()* df.unique()* df.nunique()<jupyter_code>data.head()
#Exploramos las 5 primeras líneas de mis datos
data.tail()
#Exploramos las 5 últimas líneas de mis datos
data.info()
#Nos da información sobre un DataFrame, incluido el tamaño,  
#las columnas (nombre, tipo de dato y cantidad de registros no nulos) 
#resumen de tipos de datos por columna y el uso de memoria.
data.isnull().any()
#Permite ver para cada columna del dataframe si existe algún valor nulo
#Mostrará falso si no hay ningún valor nulo
#Mostrará verdadero si existe al menos un registro nulo
data.isna().sum()
#Muestra la cantidad de registros nulos de cada columna
#También funciona así:
#data.isnull().sum()
data.shape
#Indica el tamaño del dataframe
#(filas,columnas)
data.columns
#Muestra los nombres de las columnas del dataframe
data.describe()

#Genera estadísticas descriptivas incluyendo aquellas que resumen 
# la tendencia central, la dispersión y la forma de la distribución de un 
#conjunto de datos, excluyendo los valores de NaN.<jupyter_output><empty_output><jupyter_text>Para seleccionar **una** columna del dataframe ponemos entre corchetes [ ] y comillas simples o dobles "" el nombre de la columna que queremos, así:```nombre_dataframe['Nombre_Columna']```<jupyter_code>#Aquí seleccionaremos los primeros 5 resgistros de la columna trabajo
data['Trabajo'].head()<jupyter_output><empty_output><jupyter_text>Los siguientes análisis se aplicarán en la columna ***Trabajo*** del dataframe<jupyter_code>data['Trabajo'].value_counts(dropna=False)

#Muestra el recuento de valores únicos en orden descendente, de modo que 
#el primer elemento sea el que se presente con mayor frecuencia. 
#Excluye los valores NA por defecto, por lo que se incluye el argumento
# dropna = False para que muestre también la cantidad de valores nulos
data['Trabajo'].unique()

#Muestra los valores únicos de las columnas por orden de apareción
#Esto NO ordena.
data['Trabajo'].nunique(dropna=False)

#Cuenta los valores únicos de las columnas, ignorando los valores nulos
# se incluye el argumento dropna = False
# para que considere también los valores nulos<jupyter_output><empty_output><jupyter_text>Limpieza (parte 1) Ya que la cantidad de nulos es muy poca los eliminaremos del dataframe. Para hacerlo es necesario sobre escribir el dataframe actual<jupyter_code>data = data.dropna()

#Al escribir 'data =' estamos sobrescribiendo el dataframe

#dropna nos permite eliminar las filas del dataframe donde existen valores nulos
data.shape
#Observamos que nuestro dataframe tiene menos filas respecto al incio del ejercicio
data.isnull().any()
#Observamos también que ya todas las columnas están en 'Falso'
#lo que indica que ninguna tiene valores nulos
data.isnull().sum()
#Aquí también vemos que ya no existen valores nulos
data['Medio_de_Comunicación'].unique()
#Vemos los valores únicos de la columna 'medio de comunicación'<jupyter_output><empty_output><jupyter_text>Como seleccionar una parte del dataframe Ahora vamos a elimar las columnas que están duplicadas o que no aportan a nuestro análisisPara hacerlo, primero debemos aprender a filtrar el data set.El método ***.loc[ ]*** que se usa así:```nombre_dataframe.loc[ ]```nos ayuda a hacerlo. Dentro de los corchetes indicaremos la cantidad de filas y columnas que deseamos seleccionar.```nombre_dataframe.loc[filas, columnas]``` **Ejemplos**<jupyter_code>#Para seleccionar todas las filas y todas las columnas usamos dos puntos:
data.loc[:,:]
#Para seleccionar la segunda fila (o sea la fila con índice 1) ponemos 1
# y para todas las columnas usamos dos puntos:
data.loc[1,:]<jupyter_output><empty_output><jupyter_text>**Seleccionar un rango de filas:**Si quiero seleccionar un rango de filas se realiza indicando los índices de los registros, es decir los números que aparecen en la primera columna del dataframe y cuya columna no tiene nombre. Para filtrar todas las columnas seguimos usando los dos puntos (:), así:```nombre_dataframe[índice_incio , índice_fin : ]```**Nota:**Si quiero filtrar desde el inicio o hasta el final no es necesario indicar el índice.Ejemplo:*   Desde el índice 400 hasta el final```nombre_dataframe.loc[400:, :]```*   Desde el inico hasta el índice 30```nombre_dataframe.loc[:30, :]```<jupyter_code>#Voy a filtrar los índices del 3 al 10 y todas las columnas

data.loc[3:10,:]<jupyter_output><empty_output><jupyter_text>**Seleccionar más de una columna**Para selecionar las columnas se hace con los nombres de las mismas entre corchetes [ ] y comillas simples ' ' o dobles " ". Para filtrar las filas se hace de la misma manera.```nombre_dataframe.loc[indice_inicio: indice fin,['nombre_col_1', 'nombre_col_2']]```<jupyter_code>#Selecionar todas las filas y las columnas
#'Tr@bajo' y 'Medio_de_Comunicación'

data.loc[:,['Tr@bajo','Medio_de_Comunicación']]
#Selecionar todas las filas con índice del 10 al 15 y las columnas
#'Tr@bajo' y 'Medio_de_Comunicación'

data.loc[10:15,['Tr@bajo','Medio_de_Comunicación']]<jupyter_output><empty_output><jupyter_text>Continuación limpieza Para borrar las columnas o filas que no quiero utilizar, debo filtrar el data por esas filas y/o columas y luego utilizar el método drop<jupyter_code>borrar = data.loc[:,['Tr@bajo','Medio_de_Comunicación','Nivel_escolaridad.1']]

#Creo un nuevo dataframe que contiene lo que quiero borrar
#En este caso las columnas Tr@bajo, Medio_de_Comunicación y Nivel_escolaridad.1
data = data.drop(borrar,axis=1)

#Al escribir 'data =' estamos sobrescribiendo el dataframe

#drop nos permite eliminar la parte del dataframe que ya almacenamos en la 
#variable borrar. Ponemos axis=1 para que borre las columnas
#También lo puedo hacer directamente sin crear otro objeto

#data = data.drop(data.loc[:,['Tr@bajo','Medio_de_Comunicación','Nivel_escolaridad.1']], axis=1)

#Sin embargo si ejecuto las dos instrucciones generaría un error porque en 
#la primera línea de código ya fueron eliminadas estas columnas
#por esto toda esta parte está comentada
data.columns
#Aquí evidenciados que efectivamente borramos las columnas
data.shape
#También vemos que disminuyó el número de columnas del dataframe
operarios = data[data['Trabajo']=='blue-collar']
operarios.shape<jupyter_output><empty_output><jupyter_text>Extraer una parte del dataframe: También podemos filtrar del dataframe una parte de los datos que cumplan una determinada característica.Por ejemplo, vamos a imaginar que soy el coordinador de la planta de producción y solo me interesan los datos de los operarios Para filtrar el data set se utiliza el siguiente código:<jupyter_code>data[data['Trabajo']=='blue-collar']<jupyter_output><empty_output><jupyter_text>Lo que hace Python es crear una máscara que indica para cada índice si cumple o no la condición así:<jupyter_code>data['Trabajo']=='blue-collar'<jupyter_output><empty_output><jupyter_text>Ahora vamos a crear una nueva variable llamada **Operarios** que va a contener el dataset filtrado por esta información<jupyter_code>operarios = data[data['Trabajo']=='blue-collar']
operarios.head()<jupyter_output><empty_output><jupyter_text>Observemos que los índices (los números de la izquierda) corresponde aún a los del dataframe anterior (el que contiene toda la información) y por esto salta del 3 al 17.Para que los índices estén desde el 0 en adelante utilizamos el método ***.reset_index()***<jupyter_code>operarios = operarios.reset_index()

operarios.head()
#Observa que ahora los índices inician desde el 0
#Se crea una nueva columna que se llama 'index'
#que guarda los indices del dataframe anterior<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08311784263021796, 'fraction_numerical': 0.005418051964043837, 'mean_word_length': 6.3702359346642465, 'pattern_counts': {'":': 0, '<': 57, '<?xml version=': 0, '>': 57, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '522060', 'license': 'MIT', 'n_tokens_mistral': 2865, 'n_tokens_neox': 2818, 'n_words': 963, 'path': 'Taller_MinTIC.ipynb', 'repo_name': 'SharonCamacho/Taller_MinTIC', 'size': '8121'}