Estudio de caso: análisis exploratorio de datos
Contents
Estudio de caso: análisis exploratorio de datos#
La empresa A&A Ltda, empieza un proceso de implementación de Machine Learning, usted ha sido designado para una de las tareas más importante dentro del proyecto, el cual consisten en realizar el análisis exploratorio de los datos y documentar los resultados encontrados, generando un informe que involucre los procedimientos y los resultados. El archivo que se analizara corresponde a precios de viviendas y locales para la venta y la colección de datos cuenta con variables que se ven involucradas en ese valor. La información se encuentra en el siguiente enlace la cual usted debe descargar e importar con la herramienta anaconda, el archivo lo puede exportar en formato CSV.
El informe debe dar cuenta de:
Procedimiento para la importación del archivo en formato CSV
Plante una pregunta objetivo
Total, de Registros
Total, de columnas
Detallado de cada columna
Identificar cuáles de las columnas son categóricas y numéricas
Identifique en que columnas existen valores nulos
Identifique si existen registros duplicados
Realice un reporte estadístico de los datos numéricos (media, moda, mediana, desviación estándar, cuartiles, entre otros que considere)
Identifique columnas con valores erróneos
Utilice gráficos para identificar valores atípicos
Realice histogramas de frecuencia
Use la herramienta para gráficos para determinar correlación entre variables
Realice y explique la eliminación de datos nulos y duplicados
Agrupe columnas que considere pueden generar información importante
Cree nuevas columnas a partir de las existentes
Identifique columnas que no aportan de acuerdo con su pregunta objetivo
Realice conclusiones sobre las variables que considere tienen mayor relevancia
Dejar documentado usando gráficos y capturas de pantalla todo el proceso realizado.
Se importa pandas
import pandas as pd
Solución#
1) Procedimiento para la importación del archivo en formato CSV#
filename = 'Inmuebles_Disponibles_Para_La_Venta.csv'
data = pd.read_csv(filename)
# se ajusta el precio dividido entre 1000_000 para entender mejor la información
data['Precio'] = data['Precio']/1000_000;
2) Plantee una pregunta objetivo#
Describir el mercado actual de viviendas en Colombia comparando el valor de precios por estrato y localidad
3) Total, de Registros#
totalregistros = data['Codigo'].count()
print(f'total registros {totalregistros}')
# en forma alternativa
data.shape[0]
total registros 459
459
4) Total de columnas#
totalcolumnas = data.shape[1];
print(f'total columnas {totalcolumnas}')
total columnas 12
5) Detallado de cada columna#
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 459 entries, 0 to 458
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Codigo 459 non-null int64
1 Ciudad 459 non-null object
2 Departamento 459 non-null object
3 Barrio 58 non-null object
4 Direccion 459 non-null object
5 Area Terreno 459 non-null int64
6 Area Construida 459 non-null int64
7 Detalle Disponibilidad 459 non-null object
8 Estrato 459 non-null object
9 Precio 459 non-null float64
10 Tipo de Inmueble 459 non-null object
11 Datos Adicionales 101 non-null object
dtypes: float64(1), int64(3), object(8)
memory usage: 43.2+ KB
6) Identificar cuáles de las columnas son categóricas y numéricas#
info = data.dtypes
res = dict((key, 'Numérica') if value == 'int64' else (key, 'Categórica') for key, value in info.items())
# se muestra como un dataframe
pd.DataFrame({'Columna': res.keys(),'tipo': res.values()})
Columna | tipo | |
---|---|---|
0 | Codigo | Numérica |
1 | Ciudad | Categórica |
2 | Departamento | Categórica |
3 | Barrio | Categórica |
4 | Direccion | Categórica |
5 | Area Terreno | Numérica |
6 | Area Construida | Numérica |
7 | Detalle Disponibilidad | Categórica |
8 | Estrato | Categórica |
9 | Precio | Categórica |
10 | Tipo de Inmueble | Categórica |
11 | Datos Adicionales | Categórica |
7) Identifique en que columnas existen valores nulos#
with_null = dict()
for key, value in data.isna().sum().items():
if value > 0:
with_null[key] = value
pd.DataFrame({'Columnas': with_null.keys(), 'Nulos':with_null.values() })
Columnas | Nulos | |
---|---|---|
0 | Barrio | 401 |
1 | Datos Adicionales | 358 |
8) Identifique si existen registros duplicados#
newdata = data.drop_duplicates()
# Se hace una segunda prueba con multiples columnas
newdata = newdata.drop_duplicates(subset=['Ciudad','Departamento','Barrio','Direccion'])
duplicados = data.shape[0]- newdata.shape[0]
if duplicados == 0:
print('No se encontraron datos repetidos')
else:
print(f'Hay {duplicados} registros duplicados, se procede a reemplazar la variable data con con contenidos de newdata')
data = newdata
Hay 12 registros duplicados, se procede a reemplazar la variable data con con contenidos de newdata
print(f'El estudio se realizará con {data.shape[0]} filas')
El estudio se realizará con 447 filas
9) Realice un reporte estadístico de los datos numéricos (media, moda, mediana, desviación estándar, cuartiles, entre otros que considere)#
data.describe()
Codigo | Area Terreno | Area Construida | Precio | |
---|---|---|---|---|
count | 447.000000 | 4.470000e+02 | 4.470000e+02 | 4.470000e+02 |
mean | 17664.713647 | 1.623169e+06 | 1.157737e+04 | 7.634667e+06 |
std | 2522.621125 | 1.860924e+07 | 1.286606e+05 | 3.261003e+07 |
min | 2330.000000 | 0.000000e+00 | 0.000000e+00 | 6.333900e+04 |
25% | 18137.500000 | 0.000000e+00 | 0.000000e+00 | 1.257250e+05 |
50% | 18295.000000 | 0.000000e+00 | 0.000000e+00 | 1.621500e+05 |
75% | 18479.500000 | 0.000000e+00 | 0.000000e+00 | 9.918750e+05 |
max | 19361.000000 | 3.217197e+08 | 2.272400e+06 | 4.523379e+08 |
import matplotlib.pyplot as plt
fig = data.boxplot("Precio", by="Departamento");
muestras = data.shape[0];
plt.ylabel('precio');
plt.suptitle('');
plt.xticks(rotation=75);
plt.title(f'Boxplot valor por condición {muestras} muestras');
Estudio de precio por cuidad y tipo de inmueble#
Siempre y cuando la muestra total sea representativa (mas de 15 muestras)
norepre = dict()
for tipoinmueble in data['Tipo de Inmueble'].unique():
muestras = data[data['Tipo de Inmueble'] == tipoinmueble].shape[0]
if muestras < 11:
norepre[tipoinmueble] = muestras
continue
fig = data[data['Tipo de Inmueble'] == tipoinmueble].boxplot("Precio", by="Departamento")
plt.ylabel('precio')
plt.suptitle('')
plt.xticks(rotation=75);
plt.title(f'Tipo inmueble {tipoinmueble} sobre {muestras} muestras')
print('Inmuebles no representativos por categoría')
pd.DataFrame({'Tipo inmueble':norepre.keys(),'muestras':norepre.values()})
Inmuebles no representativos por categoría
Tipo inmueble | muestras | |
---|---|---|
0 | LOTE COMERCIAL | 3 |
1 | CLINICA | 2 |
2 | HOTEL | 1 |
3 | FINCA | 5 |
4 | LOTE MIXTO | 6 |
5 | LOTE INDUSTRIAL | 3 |
6 | EDIFICIO VIVIENDA | 1 |
7 | CASA | 9 |
8 | LOTE CON CONSTRUCCION | 7 |
9 | LOTE AGRICOLA | 5 |
10 | EDIFICIO | 2 |
11 | APARTAMENTO | 5 |
12 | LOTE NO URBANIZABLE | 1 |
13 | LOTE | 6 |
14 | GARAJE | 2 |
import matplotlib.pyplot as plt
# se identifica la cantida de diferenes departamentos en la muestra
def showbycity(departamento, minimo = 11):
dpto = departamento.upper()
muestras = data[data['Departamento'] == dpto].shape[0]
if muestras < minimo:
return (dpto, muestras)
fig = data[data['Departamento'] == dpto].boxplot("Precio",by="Ciudad")
plt.ylabel('Precio')
plt.xticks(rotation=45);
plt.suptitle('')
plt.title(f'{dpto} valor por condición, {muestras} muestras')
Estudio comparativo de variación de precios por cuidad#
# se identifican todas las cuidades
res = dict()
for departamento in data['Departamento'].unique():
val = showbycity(departamento, minimo=10)
if val is None:
continue
res[val[0]] = val[1]
print('Omitidos en este punto por cantidad de muestras insuficientes')
pd.DataFrame({'Departamento': res.keys() , 'Muestras':res.values()})
Omitidos en este punto por cantidad de muestras insuficientes
Departamento | Muestras | |
---|---|---|
0 | BOYACÁ | 2 |
1 | ATLÁNTICO | 8 |
2 | CAUCA | 2 |
3 | NORTE DE SANTANDER | 3 |
4 | TOLIMA | 3 |
5 | SANTANDER | 2 |
6 | CHOCÓ | 2 |
7 | CASANARE | 3 |
8 | CÓRDOBA | 1 |
Estudio comparativo de variación de precios por estrato#
Se convierte los valores de estrato a numéricos en una nueva columna, para que muestre los gráficos en orden
data['Estrato'].unique()
mapa={'UNO':1,
'DOS':2,
'TRES':3,
'CUATRO':4,
'CINCO':5,
'SEIS':6,
'RURAL': 8,
'COMERCIAL':9,
'INDUSTRIAL':10,
}
data['Estrato_num'] = data.apply(lambda row: mapa[row.Estrato], axis = 1)
data.head(5)
Codigo | Ciudad | Departamento | Barrio | Direccion | Area Terreno | Area Construida | Detalle Disponibilidad | Estrato | Precio | Tipo de Inmueble | Datos Adicionales | Estrato_num | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2330 | BOGOTA | CUNDINAMARCA | SANTA MATILDE | CL 10 SUR # 34B-24 LT 2 MZ X-46 (SANTA MATILDE... | 559804 | 0 | COMERCIALIZABLE CON RESTRICCION | TRES | 1.342810e+08 | LOTE VIVIENDA | NaN | 3 |
1 | 2363 | BOGOTA | CUNDINAMARCA | TINTALA | KR 84 CON CL 10 LT # 8 DE SAN JUAN DE CASTILLA... | 302079 | 0 | COMERCIALIZABLE CON RESTRICCION | TRES | 3.285750e+07 | LOTE COMERCIAL | ESTE INMUEBLE PRESENTA ZONA DE RESERVA VIAL, Q... | 3 |
2 | 2575 | SOGAMOSO | BOYACÁ | CENTRO | CRA. 10 #11- 78/80 Ó CL 12 # 9 - 77/85 Ó CALLE... | 165508 | 726900 | COMERCIALIZABLE CON RESTRICCION | CUATRO | 1.376828e+08 | CLINICA | ESTE INMUEBLE SE COMERCIALIZARÁ A TRAVÉS DE SU... | 4 |
3 | 2669 | LA CALERA | CUNDINAMARCA | LA CALERA | LOTE 3 PARCELACIÓN LOS CERROS HACIENDA SAN RAFAEL | 3000000 | 0 | COMERCIALIZABLE CON RESTRICCION | RURAL | 5.520000e+06 | LOTE VIVIENDA | NaN | 8 |
4 | 4408 | BOGOTA | CUNDINAMARCA | SUBA | DG 140 # 67 - 30 IN 6 (ZONA DE AFECTACIÓN PLAN... | 1774266 | 0 | COMERCIALIZABLE CON RESTRICCION | COMERCIAL | 1.380382e+08 | LOTE VIVIENDA | NaN | 9 |
10) Identifique columnas con valores erróneos#
Para este punto uno de los validadores corresponde al área de terreno debe se mayor a cero, también el áre construida. Los reportes de los registros con valores erróneos se haran en archivos locales en formato csv
sin_area = data[data['Area Terreno'] == 0]['Area Terreno'].count();
print(f'Cantidad de registros sin area {sin_area}')
Cantidad de registros sin area 423
11) Utilice gráficos para identificar valores atípicos#
Ya se pueden visualizar en los puntos representados en los boxplot del punto anterior
# se busca relacion entre el estrato y el valor de la vivenda
ax = data.boxplot('Precio', by='Estrato_num');
plt.suptitle('');
plt.ylim(0,100_000_000)# se modifican los límites para observar mejor los datos
plt.ylabel('Valor')
plt.xlabel('Estrato')
#plt.xticks(rotation=45);
ax.set_xticklabels(mapa.keys(), rotation='vertical', fontsize=10);
12) Realice histogramas de frecuencia#
Se graficarán:
Cantidad de reportes por estrato
Cantidad de reportes por departamento
Rango de valores de vivienda
# se define el rango de valores a graficar
from math import ceil
bins = 100
minimo = data['Precio'].min(axis=0);
maximo = data['Precio'].max(axis=0);
def get_hist_values(data, minimo, maximo, bins):
values = list();
delta = ceil((maximo -minimo)/bins);
initvalue = minimo;
endvalue = minimo + delta;
names = []
inits = []
ended = []
cantidad = []
k=1
while initvalue < maximo:
localmax = initvalue + delta + 0.01
names.append(k)
inits.append(initvalue)
ended.append(localmax)
cantidad.append(data[(data['Precio'] >= initvalue) & (data['Precio'] < localmax)].shape[0])
initvalue = localmax
k +=1
print('Datos para construir el histograma');
res = pd.DataFrame({'id': names, 'cantidad': cantidad, 'inicial': inits,'final':ended});
return res
res = get_hist_values(data, minimo, maximo, bins)
res.head(20)
Datos para construir el histograma
id | cantidad | inicial | final | |
---|---|---|---|---|
0 | 1 | 364 | 63339.00 | 4586085.01 |
1 | 2 | 25 | 4586085.01 | 9108831.02 |
2 | 3 | 12 | 9108831.02 | 13631577.03 |
3 | 4 | 9 | 13631577.03 | 18154323.04 |
4 | 5 | 6 | 18154323.04 | 22677069.05 |
5 | 6 | 5 | 22677069.05 | 27199815.06 |
6 | 7 | 3 | 27199815.06 | 31722561.07 |
7 | 8 | 2 | 31722561.07 | 36245307.08 |
8 | 9 | 1 | 36245307.08 | 40768053.09 |
9 | 10 | 2 | 40768053.09 | 45290799.10 |
10 | 11 | 2 | 45290799.10 | 49813545.11 |
11 | 12 | 1 | 49813545.11 | 54336291.12 |
12 | 13 | 1 | 54336291.12 | 58859037.13 |
13 | 14 | 0 | 58859037.13 | 63381783.14 |
14 | 15 | 1 | 63381783.14 | 67904529.15 |
15 | 16 | 2 | 67904529.15 | 72427275.16 |
16 | 17 | 1 | 72427275.16 | 76950021.17 |
17 | 18 | 0 | 76950021.17 | 81472767.18 |
18 | 19 | 0 | 81472767.18 | 85995513.19 |
19 | 20 | 0 | 85995513.19 | 90518259.20 |
Con base en el punto anterior se nota que la mayor cantida de datos, 429, está hasta el valor de 76950021, por lo que se ajusta este como el valor límite y se corre nuevamente la función
res = get_hist_values(data, minimo, 76950021 , bins=200)
res.head(20)
#ax.set_xticklabels(res['inicial'], rotation='vertical', fontsize=10);
# se procede a graficar
Datos para construir el histograma
id | cantidad | inicial | final | |
---|---|---|---|---|
0 | 1 | 325 | 63339.00 | 447773.01 |
1 | 2 | 7 | 447773.01 | 832207.02 |
2 | 3 | 7 | 832207.02 | 1216641.03 |
3 | 4 | 5 | 1216641.03 | 1601075.04 |
4 | 5 | 6 | 1601075.04 | 1985509.05 |
5 | 6 | 4 | 1985509.05 | 2369943.06 |
6 | 7 | 2 | 2369943.06 | 2754377.07 |
7 | 8 | 1 | 2754377.07 | 3138811.08 |
8 | 9 | 0 | 3138811.08 | 3523245.09 |
9 | 10 | 4 | 3523245.09 | 3907679.10 |
10 | 11 | 2 | 3907679.10 | 4292113.11 |
11 | 12 | 2 | 4292113.11 | 4676547.12 |
12 | 13 | 3 | 4676547.12 | 5060981.13 |
13 | 14 | 3 | 5060981.13 | 5445415.14 |
14 | 15 | 7 | 5445415.14 | 5829849.15 |
15 | 16 | 0 | 5829849.15 | 6214283.16 |
16 | 17 | 2 | 6214283.16 | 6598717.17 |
17 | 18 | 2 | 6598717.17 | 6983151.18 |
18 | 19 | 1 | 6983151.18 | 7367585.19 |
19 | 20 | 0 | 7367585.19 | 7752019.20 |
ax = plt.bar(res['id'], res['cantidad']);
plt.ylabel("Cantidad");
plt.xlabel('Precios');
plt.title('histograma distribución de precios');
# gráfica ampliada
res = get_hist_values(data, minimo, 447773.01 , bins=200)
res.head(20)
Datos para construir el histograma
id | cantidad | inicial | final | |
---|---|---|---|---|
0 | 1 | 1 | 63339.00 | 65262.01 |
1 | 2 | 0 | 65262.01 | 67185.02 |
2 | 3 | 1 | 67185.02 | 69108.03 |
3 | 4 | 2 | 69108.03 | 71031.04 |
4 | 5 | 0 | 71031.04 | 72954.05 |
5 | 6 | 0 | 72954.05 | 74877.06 |
6 | 7 | 59 | 74877.06 | 76800.07 |
7 | 8 | 0 | 76800.07 | 78723.08 |
8 | 9 | 0 | 78723.08 | 80646.09 |
9 | 10 | 0 | 80646.09 | 82569.10 |
10 | 11 | 0 | 82569.10 | 84492.11 |
11 | 12 | 1 | 84492.11 | 86415.12 |
12 | 13 | 1 | 86415.12 | 88338.13 |
13 | 14 | 0 | 88338.13 | 90261.14 |
14 | 15 | 0 | 90261.14 | 92184.15 |
15 | 16 | 0 | 92184.15 | 94107.16 |
16 | 17 | 0 | 94107.16 | 96030.17 |
17 | 18 | 0 | 96030.17 | 97953.18 |
18 | 19 | 0 | 97953.18 | 99876.19 |
19 | 20 | 8 | 99876.19 | 101799.20 |
# se procede a graficar
axis = plt.bar(res['id'], res['cantidad']);
plt.title('Histograma distribución de presios ampliado')
plt.ylabel("Cantidad");
plt.xlabel('Precios');
#plt.tick_params(axis='x', length=0)
Función para mejorar automáticamente el rango para hacer el estudio, sacando los datos abs#
Para ello el rango a utilizar será
límite inferior: Q2-1.5*IQR
Límite superior: Q3+1.5*IQR
Donde Q2: es el cuartil 2, Q3: es el cuartil 3, IQR es el rango intercuartílico
Función para mejorar el cálculo del número de bins en forma automática#
Si bien el número de bins se puede poner de forma manual sería recomendable poder hacerlo de forma automática, para ello se utilizará la fórmula de Sturge’s rule
import numpy as np
def get_rango(data: pd.DataFrame, colname: str):
res = data[colname].describe()
q2 = res['25%']
q3 = res['75%']
iqr = q3-q2
minvalue = q2-1.5*iqr;
maxvalue = q3+1.5*iqr;
bins = int(np.ceil(np.log2(data.shape[0])) + 1)
return (max([0,minvalue]), maxvalue, max([1, bins]))
maximo, minimo, bins = get_rango(data, 'Precio');
print(f'Rango sugerido para el histograma {maximo} - {minimo}, intervalos = {bins} ')
Rango sugerido para el histograma 0 - 2291100.0, intervalos = 10
res = get_hist_values(data, maximo, minimo, bins)
res.head(20)
Datos para construir el histograma
id | cantidad | inicial | final | |
---|---|---|---|---|
0 | 1 | 285 | 0.00 | 229110.01 |
1 | 2 | 40 | 229110.01 | 458220.02 |
2 | 3 | 4 | 458220.02 | 687330.03 |
3 | 4 | 4 | 687330.03 | 916440.04 |
4 | 5 | 4 | 916440.04 | 1145550.05 |
5 | 6 | 4 | 1145550.05 | 1374660.06 |
6 | 7 | 3 | 1374660.06 | 1603770.07 |
7 | 8 | 4 | 1603770.07 | 1832880.08 |
8 | 9 | 2 | 1832880.08 | 2061990.09 |
9 | 10 | 3 | 2061990.09 | 2291100.10 |
axis = plt.bar(res['id'], res['cantidad']);
plt.title('Histograma distribución de precios')
plt.ylabel("Cantidad");
plt.xlabel('Indicador de precios');
13 Use la herramienta para gráficos para determinar correlación entre variables#
Del análisis de eliminaron las columnas de área y area construida por tener mas de 400 datos con valor cero
import seaborn as sns
corr = data[['Estrato_num','Codigo','Precio','Departamento']].corr()
sns.heatmap(corr, linewidths=0.5, annot=True);
Con base en la gráfica se puede notar que la mayor relación está entre el estrato y el código de la vivienda, sin embargo como este último es solo un consecutivo se puede concluir que por falta de información en cuanto a las áreas no es posible concluir sobre una relación al respecto
14) Realice y explique la eliminación de datos nulos y duplicados#
Desde el punto 8 se eliminaron los datos duplicados y en el punto 7 se presentaron las columnas con valores nulos, ahora se procederá a buscar los datos nulos en cuanto al precio
data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 447 entries, 0 to 458
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Codigo 447 non-null int64
1 Ciudad 447 non-null object
2 Departamento 447 non-null object
3 Barrio 57 non-null object
4 Direccion 447 non-null object
5 Area Terreno 447 non-null int64
6 Area Construida 447 non-null int64
7 Detalle Disponibilidad 447 non-null object
8 Estrato 447 non-null object
9 Precio 447 non-null float64
10 Tipo de Inmueble 447 non-null object
11 Datos Adicionales 92 non-null object
12 Estrato_num 447 non-null int64
dtypes: float64(1), int64(4), object(8)
memory usage: 48.9+ KB
Se filtran los contenidos con filas que tengan valores nulos en alguna de las columnas
columns = [k for (k, value) in data.items()]
dt = data
for k in columns:
dt = dt[dt[k].notnull()];
dt.count()
#dropped = data.dropna(how='all', axis=1);
#dropped
Codigo 37
Ciudad 37
Departamento 37
Barrio 37
Direccion 37
Area Terreno 37
Area Construida 37
Detalle Disponibilidad 37
Estrato 37
Precio 37
Tipo de Inmueble 37
Datos Adicionales 37
Estrato_num 37
dtype: int64
Resultado filas sin ningún valor nulo#
dt.head(min([10,dt.shape[0]]))
Codigo | Ciudad | Departamento | Barrio | Direccion | Area Terreno | Area Construida | Detalle Disponibilidad | Estrato | Precio | Tipo de Inmueble | Datos Adicionales | Estrato_num | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2363 | BOGOTA | CUNDINAMARCA | TINTALA | KR 84 CON CL 10 LT # 8 DE SAN JUAN DE CASTILLA... | 302079 | 0 | COMERCIALIZABLE CON RESTRICCION | TRES | 3.285750e+07 | LOTE COMERCIAL | ESTE INMUEBLE PRESENTA ZONA DE RESERVA VIAL, Q... | 3 |
2 | 2575 | SOGAMOSO | BOYACÁ | CENTRO | CRA. 10 #11- 78/80 Ó CL 12 # 9 - 77/85 Ó CALLE... | 165508 | 726900 | COMERCIALIZABLE CON RESTRICCION | CUATRO | 1.376828e+08 | CLINICA | ESTE INMUEBLE SE COMERCIALIZARÁ A TRAVÉS DE SU... | 4 |
11 | 10106 | BARRANQUILLA | ATLÁNTICO | CENTRO | CALLE 39 NO 43 58 62 LC 1 | 0 | 0 | COMERCIALIZABLE CON RESTRICCION | DOS | 8.000330e+06 | LOCAL | DESEAS INVERTIR ESTA ES LA OPORTUNIDAD LOCAL E... | 2 |
12 | 11335 | CALI | VALLE DEL CAUCA | CIUDADELA CHIPICHAPE | LT B PARTE DEL PREDIO CHIPICHAPE | 43039968 | 0 | COMERCIALIZABLE FIDUCIA | RURAL | 1.667784e+07 | LOTE VIVIENDA | CISA VENDE SOLO LOS DERECHOS FIDUCIARIOS DEL 0... | 8 |
14 | 11786 | VILLA RICA | CAUCA | PARQUE INDUSTRIAL CAUCADESA | BG 20 ET I PARQUE INDUSTRIAL CAUCADESA KM 43 ... | 3035300 | 1198100 | COMERCIALIZABLE CON RESTRICCION | INDUSTRIAL | 7.090341e+07 | BODEGA | BODEGA EN PROINDIVISO. CON BUENAS ESPECIFICACI... | 10 |
15 | 11787 | SANTANDER DE QUILICHAO | CAUCA | PARQUE IND CAUCADESA | LT 8 ET I PARQUE INDUSTRIAL CAUCADESA | 4612600 | 0 | COMERCIALIZABLE CON RESTRICCION | RURAL | 1.416213e+07 | LOTE INDUSTRIAL | LOTE TERRENO NETO , EN PROINDIVISO, SEMI-URBAN... | 8 |
16 | 12112 | CALIMA EL DARIEN | VALLE DEL CAUCA | VEREDA PALERMO | RESERVA FORESTAL LT 1A | 218786300 | 0 | COMERCIALIZABLE FIDUCIA | RURAL | 2.406650e+07 | LOTE MIXTO | CISA VENDE DERECHOS FIDUCIARIOS DEL 9.48%\n\nF... | 8 |
17 | 12113 | CALIMA EL DARIEN | VALLE DEL CAUCA | VEREDA PALERMO | LT 4 | 7114300 | 74533 | COMERCIALIZABLE FIDUCIA | RURAL | 2.700092e+07 | LOTE VIVIENDA | CISA VENDE DERECHOS FIDUCIARIOS DEL 9.48%\n\nF... | 8 |
18 | 12114 | CALIMA EL DARIEN | VALLE DEL CAUCA | VEREDA PALERMO | LT 1B | 17598200 | 0 | COMERCIALIZABLE FIDUCIA | RURAL | 2.704525e+07 | LOTE VIVIENDA | CISA VENDE DERECHOS FIDUCIARIOS DEL 9.48%\n\nF... | 8 |
19 | 12115 | CALIMA EL DARIEN | VALLE DEL CAUCA | VEREDA PALERMO | LT 1C | 6400000 | 70000 | COMERCIALIZABLE FIDUCIA | RURAL | 1.042887e+07 | LOTE VIVIENDA | LOTE DE TERRENO QUE HACE PARTE DEL PROYECTO CA... | 8 |
15) Agrupe columnas que considere pueden generar información importante#
16) Cree nuevas columnas a partir de las existentes#
Se creará una columna nivel que agrupa las columnas de estrato y barrio
data['Nivel'] = data.apply(lambda row: f'{row.Estrato_num} - {row.Barrio}', axis=1)
data.head(10)
Codigo | Ciudad | Departamento | Barrio | Direccion | Area Terreno | Area Construida | Detalle Disponibilidad | Estrato | Precio | Tipo de Inmueble | Datos Adicionales | Estrato_num | Nivel | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2330 | BOGOTA | CUNDINAMARCA | SANTA MATILDE | CL 10 SUR # 34B-24 LT 2 MZ X-46 (SANTA MATILDE... | 559804 | 0 | COMERCIALIZABLE CON RESTRICCION | TRES | 1.342810e+08 | LOTE VIVIENDA | NaN | 3 | 3 - SANTA MATILDE |
1 | 2363 | BOGOTA | CUNDINAMARCA | TINTALA | KR 84 CON CL 10 LT # 8 DE SAN JUAN DE CASTILLA... | 302079 | 0 | COMERCIALIZABLE CON RESTRICCION | TRES | 3.285750e+07 | LOTE COMERCIAL | ESTE INMUEBLE PRESENTA ZONA DE RESERVA VIAL, Q... | 3 | 3 - TINTALA |
2 | 2575 | SOGAMOSO | BOYACÁ | CENTRO | CRA. 10 #11- 78/80 Ó CL 12 # 9 - 77/85 Ó CALLE... | 165508 | 726900 | COMERCIALIZABLE CON RESTRICCION | CUATRO | 1.376828e+08 | CLINICA | ESTE INMUEBLE SE COMERCIALIZARÁ A TRAVÉS DE SU... | 4 | 4 - CENTRO |
3 | 2669 | LA CALERA | CUNDINAMARCA | LA CALERA | LOTE 3 PARCELACIÓN LOS CERROS HACIENDA SAN RAFAEL | 3000000 | 0 | COMERCIALIZABLE CON RESTRICCION | RURAL | 5.520000e+06 | LOTE VIVIENDA | NaN | 8 | 8 - LA CALERA |
4 | 4408 | BOGOTA | CUNDINAMARCA | SUBA | DG 140 # 67 - 30 IN 6 (ZONA DE AFECTACIÓN PLAN... | 1774266 | 0 | COMERCIALIZABLE CON RESTRICCION | COMERCIAL | 1.380382e+08 | LOTE VIVIENDA | NaN | 9 | 9 - SUBA |
5 | 5017 | RICAURTE | CUNDINAMARCA | CONDOMINIO CAMPESTRE MONACO | LT 1 TAMBACU HO GIRARDOT RESORT | 2500263 | 514200 | COMERCIALIZABLE FIDUCIA | COMERCIAL | 1.040734e+08 | HOTEL | NaN | 9 | 9 - CONDOMINIO CAMPESTRE MONACO |
6 | 5287 | BOGOTA | CUNDINAMARCA | NaN | LT # 899/900/901/902/903/904/905/906 CEMENTERI... | 2240 | 0 | COMERCIALIZABLE | COMERCIAL | 5.143040e+05 | LOTE COMERCIAL | LOS COSTOS POR CONCEPTO DE TRASPASO DE PROPIED... | 9 | 9 - nan |
7 | 5616 | CHIA | CUNDINAMARCA | VEREDA FONQUETA | FINCA SAN ANTONIO DE LOS VIENTOS - VEREDA FONQ... | 1113000 | 57000 | COMERCIALIZABLE CON RESTRICCION | RURAL | 2.785554e+07 | FINCA | NaN | 8 | 8 - VEREDA FONQUETA |
8 | 7394 | BITUIMA | CUNDINAMARCA | VEREDA DE CAMBULAR | FINCA BUENAVISTA Y BUENOS AIRES | 18000000 | 0 | COMERCIALIZABLE CON RESTRICCION | RURAL | 4.806000e+06 | FINCA | NaN | 8 | 8 - VEREDA DE CAMBULAR |
9 | 7539 | TENJO | CUNDINAMARCA | NaN | CHURUGUACO LA GUACA | 0 | 0 | COMERCIALIZABLE CON RESTRICCION | RURAL | 6.369860e+06 | FINCA | NaN | 8 | 8 - nan |
17) Identifique columnas que no aportan de acuerdo con su pregunta objetivo#
Acorde con la información analizada se idenfica que las columnas que no aportan para el análisis son
Codigo
Area - porque la mayoría son datos sin reportar o cero
Detalle Disponibilidad
Direccion
18) Realice conclusiones sobre las variables que considere tienen mayor relevancia#
Conclusiones:
No se pudo realizar el análisis concluyente por no porder calcular el valor por metro cuadrado
La mayor cantidad de datos reportador fueron hast 458_220 millones
La mayor variablidad de precios se encuentra en el sector rural.
La mayor información disponible está para los locales con 301 muestras.
Para realizar una compra se deberá completar la información de las áreas y tomar una mejor desición con base en la evidencia
19) Dejar documentado usando gráficos y capturas de pantalla todo el proceso realizado.#
Se hizo por este medio