Generación de histograma de Porosidad con Python

Uso de Matplotlib y Pandas para crear un histograma

Rigoberto Chandomi https://www.linkedin.com/in/rigobertochandomi/
2024-03-31

En el análisis de datos geológicos, comprender la distribución de la porosidad de un yacimiento puede ser fundamental para la evaluación de su potencial productivo. La permeabilidad, que mide la capacidad del yacimiento para almacenar fluidos, puede variar significativamente, lo que hace útil una representación para visualizar su distribución.

En este tutorial, utilizaremos Python y la biblioteca Matplotlib para generar un histograma que nos permita visualizar la distribución de la porosidad de muestras de núcleos de un conjunto de datos. Matplotlib es una biblioteca de trazado extensamente utilizada en Python, que ofrece gran flexibilidad para crear visualizaciones de datos.

Paso 1: Instalación de Matplotlib Si aún no has instalado Matplotlib, puedes hacerlo ejecutando el siguiente comando en tu terminal o en tu Jupyter Notebook:

pip install matplotlib

Paso 2: Cargar los Datos Primero, necesitamos cargar los datos del archivo RT_md.csv. Asegúrate de que este archivo esté en la misma carpeta que tu script de Python o notebook, o proporciona la ruta completa al archivo.


import pandas as pd

data = pd.read_csv('RT_md.csv')

print(data.head())
     WELL           MD  POROSITY  PERMEABILITY        PTS    RT
0  WELL_1  4038.350098     0.201     1973.9240  34.969780  MEGA
1  WELL_1  4038.850098     0.203     1158.9270  25.350609  MEGA
2  WELL_1  4039.350098     0.207     1935.1169  33.696552  MEGA
3  WELL_1  4039.850098     0.206     1003.6810  23.001544  MEGA
4  WELL_1  4040.350098     0.190      901.4980  23.156673  MEGA

Paso 3: Creación del Histograma Ahora que tenemos los datos cargados en un DataFrame de pandas, podemos proceder a generar el histograma de la columna POROSITY


import matplotlib.pyplot as plt

# Generar el histograma
plt.figure(figsize=(10, 6))
plt.hist(data['POROSITY'], bins=20, color='skyblue', edgecolor='black');

# Configuración del gráfico
(array([ 3.,  6.,  1.,  1.,  5.,  7.,  3.,  7.,  6., 12., 12., 23., 33.,
       62., 80., 78., 62.,  3.,  0.,  2.]), array([0.017  , 0.03025, 0.0435 , 0.05675, 0.07   , 0.08325, 0.0965 ,
       0.10975, 0.123  , 0.13625, 0.1495 , 0.16275, 0.176  , 0.18925,
       0.2025 , 0.21575, 0.229  , 0.24225, 0.2555 , 0.26875, 0.282  ]), <BarContainer object of 20 artists>)
plt.title('Distribución de la Permeabilidad');
plt.xlabel('Porosidad (fracción)');
plt.ylabel('Frecuencia');


plt.grid(True, which="both", ls="--", color='0.9');
plt.show();

Matplotlib permite una amplia gama de personalizaciones. Por ejemplo, puedes cambiar el número de bins para modificar la granularidad del histograma, ajustar los colores y estilos de línea, o añadir anotaciones al gráfico.

La visualización de datos por categorías es una práctica común en la exploración de datos, ya que proporciona insights sobre cómo las características de interés se distribuyen a través de diferentes grupos. En este caso, utilizaremos la columna WELL del dataset Core_data.csv para colorear el histograma de permeabilidad, permitiéndonos observar las diferencias en la distribución de la porosidad entre los diferentes pozos.

Primero, asegurémonos de que los datos están cargados y de que hemos identificado los pozos únicos presentes en el dataset.

Para cada pozo en nuestros datos, generaremos un conjunto de barras en el histograma, utilizando un color diferente para cada uno. Para mantener la claridad visual, también incluiremos una leyenda que indique qué color corresponde a cada pozo.

wells = data['WELL'].unique()


plt.figure(figsize=(12, 8));

colors = ['blue', 'green', 'red', 'purple', 'orange', 'brown']  # Asumiendo un máximo de 6 pozos para simplificar
for i, well in enumerate(wells):
    subset = data[data['WELL'] == well];
    plt.hist(subset['POROSITY'], bins=50, color=colors[i], alpha=0.5, edgecolor='black', label=f'Pozo {well}');

plt.title('Distribución de la Permeabilidad por Pozo');
plt.xlabel('Porosidad (fracción)');
plt.ylabel('Frecuencia');
plt.legend();

plt.grid(True, which="both", ls="--", color='0.9');
plt.show();

Consideraciones Adicionales

Colores y Transparencia: Seleccionar una paleta de colores distinta y ajustar la transparencia (alpha) puede ayudar a manejar gráficos con muchas categorías o con superposiciones significativas.

Este enfoque nos permite visualizar y comparar fácilmente la distribución de la porosidad entre diferentes pozos, identificando patrones o diferencias clave que podrían ser relevantes para análisis geológicos o de producción más detallados.

Otra opción para la generación de un histograma coloreado por una variable es la función plot.hist() de pandas, el cual junto con la función pivot() se define que genera un histograma de la porosidad coloreado por pozo. Esta es una opción baste ágil para esto.


# pivot and plot
plt.figure(figsize=(12, 8))
data.pivot(columns="WELL", values="POROSITY").plot.hist(bins=100, alpha=0.5);

plt.show()

import seaborn as sns


fig, ax = plt.subplots(figsize=(10, 10))
sns.histplot(data=data, x='POROSITY', hue='WELL', stat='count', edgecolor=None);
ax.set_title('Porosidad')

Podemos observar que con pandas y seaborn creamos un histograma coloreado por una variable con muy pocas líneas de código al comparar con Matplotlib.