Bienvenidos a "Geoscience for Dummies", un espacio dedicado a la divulgación y análisis en el campo de las geociencias, creado por estudiantes y egresados del Instituto Politécnico Nacional especializados en ingeniería geofísica con énfasis en la exploración petrolera y métodos de exploración potencial. Nuestro objetivo es desmitificar y explicar de manera accesible los conceptos clave de las geociencias.

Únete al mejor blog de divulgación sobre geociencias

14229

Entradas populares

Identifación de litofacies con clustering en python

Identificación de Litofacies con registros de pozo utilizando clustering en python

Introducción Teórica

Clustering Jerárquico

El clustering jerárquico es una metodología de agrupamiento que no requiere especificar el número de clústeres por adelantado. A diferencia de otros métodos (como K-means, donde se fija previamente el número de clústeres), el clustering jerárquico construye una jerarquía de grupos, desde los más simples (donde cada punto es su propio clúster) hasta la combinación final en un único clúster que contiene todos los puntos. Esta jerarquía se representa típicamente con un dendrograma.


Dendrograma

El dendrograma es una representación gráfica en forma de árbol que muestra el proceso de fusión o división de los clústeres. En el eje vertical (generalmente) se representan las unidades o muestras (por ejemplo, profundidades con sus registros de pozo), mientras que el eje horizontal refleja la distancia (o disimilitud) a la cual se fusionan los clústeres. Al cortar el dendrograma a una cierta altura, se obtiene un número determinado de clústeres. Esta herramienta es valiosa porque ofrece una visión completa de las relaciones jerárquicas entre las muestras y permite al geocientífico identificar agrupamientos naturales de los datos.

Método del Codo (Elbow Method)

Aunque el clustering jerárquico no siempre se combina con el método del codo, este último es más conocido en métodos de clustering particionales como K-means. El método del codo consiste en ejecutar el algoritmo de clustering para diferentes valores de K, calcular la inercia o WCSS (Within-Cluster Sum of Squares) para cada K, y graficar estos resultados. El "codo" en la curva (un punto de inflexión donde agregar más clústeres no reduce significativamente la inercia) ayuda a seleccionar el número óptimo de clústeres. En el contexto jerárquico, aunque no se utiliza exactamente el mismo procedimiento, la idea de elegir un número óptimo de clústeres puede apoyarse en la observación del dendrograma, buscando un nivel de corte que produzca clústeres estables y coherentes.

Subclústeres y Caracterización Multinivel

Una vez determinados los clústeres primarios, se pueden refinar las categorías haciendo un nuevo análisis jerárquico dentro de cada uno. De esta manera, un clúster principal que representa una litofacie general puede subdividirse en subclústeres más específicos que capturen variaciones sutiles, proporcionando una caracterización multinivel de la formación. Esto es particularmente útil en la interpretación geológica, donde a menudo existen facies principales con subvariantes distinguidas por ligeras diferencias en los registros.

Importancia de la Estandarización

En el contexto de análisis de datos de pozo, las escalas de las propiedades suelen diferir sustancialmente (por ejemplo, la resistividad puede tener un rango de valores muy diferente al de la densidad). La estandarización o normalización (por ejemplo, usando StandardScaler) asegura que ninguna variable domine el análisis. Esto garantiza que el cálculo de las distancias o disimilitudes refleje el aporte equilibrado de todas las variables involucradas.


Contexto Práctico

El siguiente código en Python implementa un procedimiento de clustering jerárquico sobre datos de registros de pozo. Primero, se realiza un clustering jerárquico en todo el rango de profundidad. Luego, se elige un número de clústeres primarios (por ejemplo, 4) cortando el dendrograma a cierta altura. A continuación, cada clúster primario se subdivide en subclústeres para lograr un nivel más detallado de caracterización.

Finalmente, se generan gráficas para visualizar cómo se distribuyen los clústeres primarios y subclústeres con respecto a diferentes parámetros del pozo, así como gráficas de barras horizontales que muestran la asignación de cada profundidad a un clúster o subclúster. Además, se guardan los resultados en archivos Excel, permitiendo su posterior análisis.

Explicación Teórica y Práctica del Código

1. Lectura y Preparación de Datos

# Cargar datos desde un archivo Excel
df = pd.read_excel('Pohokura1_Data.xlsx')

# Definir el rango de profundidad
min_depth = 0
max_depth = 4400
depth_column = 'DEPTH'

# Filtrar los datos
filtered_df = df[(df[depth_column] >= min_depth) & (df[depth_column] <= max_depth)]

# Seleccionar las columnas relevantes
data_columns = ['GR', 'NPHI', 'RHOB', 'DT', 'LLD', 'LLS']
data = filtered_df[data_columns]

En este bloque se filtra el intervalo de profundidad de interés y se seleccionan las propiedades relevantes para el análisis.

2. Estandarización

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

Se escalan los datos para asegurar que cada registro contribuya equitativamente a la métrica de distancia.

3. Clustering Jerárquico y Dendrograma

from scipy.cluster.hierarchy import dendrogram, linkage, fcluster

linked = linkage(scaled_data, method='ward')

plt.figure(figsize=(15, 10))
dendrogram(linked, orientation='top', distance_sort='ascending', show_leaf_counts=True, truncate_mode='lastp', p=12)
plt.title('Dendrograma de Clústeres Jerárquicos')
plt.xlabel('Índice de Muestra')
plt.ylabel('Distancia')
plt.grid(True)
plt.show()

Se construye el dendrograma y se visualiza. El método "Ward" minimiza la varianza dentro de los clústeres, generando clústeres más compactos. Con el dendrograma, se puede decidir cuántos clústeres primarios extraer.

4. Selección de Clústeres Primarios

num_primary_clusters = 4
primary_clusters = fcluster(linked, num_primary_clusters, criterion='maxclust')
filtered_df['Primary_Cluster'] = primary_clusters

Aquí se cortan los clústeres primarios (por ejemplo, 4 clústeres). Cada profundidad del pozo recibe una etiqueta de clúster primario.

5. Subdivisión en Subclústeres

filtered_df['Sub_Cluster'] = 0
filtered_df['Overall_Sub_Cluster'] = 0
overall_sub_cluster_id = 1

num_subclusters_dict = {
    1: 3,
    2: 3,
    3: 3,
    4: 3
}

for primary_cluster in filtered_df['Primary_Cluster'].unique():
    cluster_data = filtered_df[filtered_df['Primary_Cluster'] == primary_cluster]
    if len(cluster_data) > 1:
        cluster_scaled_data = scaler.fit_transform(cluster_data[data_columns])
        cluster_linked = linkage(cluster_scaled_data, method='ward')
        
        num_subclusters = num_subclusters_dict.get(primary_cluster, 3)
        sub_clusters = fcluster(cluster_linked, num_subclusters, criterion='maxclust')
        
        filtered_df.loc[filtered_df['Primary_Cluster'] == primary_cluster, 'Sub_Cluster'] = sub_clusters
        
        # Asignación de IDs globales
        for sub_cluster in range(1, num_subclusters + 1):
            filtered_df.loc[
                (filtered_df['Primary_Cluster'] == primary_cluster) & (filtered_df['Sub_Cluster'] == sub_cluster),
                'Overall_Sub_Cluster'
            ] = overall_sub_cluster_id
            overall_sub_cluster_id += 1

Se realiza un segundo análisis jerárquico dentro de cada clúster primario para obtener subclústeres. Esto permite una clasificación más detallada.

6. Exportación de Resultados

output_file_path_subclusters = 'clustered_well_log_data_with_subclusters.xlsx'
filtered_df.to_excel(output_file_path_subclusters, index=False)

Se exportan los resultados para integrar con otros flujos de trabajo.

7. Visualización de Resultados

El código produce diferentes visualizaciones:



  • Gráficos de dispersión: Se muestran las propiedades (por ejemplo, GR vs otras) coloreadas por clúster primario y subclúster, para evaluar la distribución de los puntos.


  • Columnas de clústeres: Se emplea un gráfico de barras horizontales para mostrar el clúster o subclúster asignado a cada profundidad.

# Ejemplo de uno de los gráficos (ver el código completo para más detalles)
fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(20, 15), sharey=True)
# ...
plt.show()

Estas visualizaciones ayudan a comprender cómo se agrupan los datos y a qué profundidad se localizan determinados clústeres, apoyando la interpretación geológica de los resultados.

Conclusiones

La combinación del clustering jerárquico con la posibilidad de generar subclústeres ofrece una poderosa herramienta para la clasificación de litofacies o electrofacies en datos de pozo. El dendrograma permite entender la estructura interna de los datos, mientras que la subdivisión en subclústeres proporciona un nivel de detalle adicional muy útil en interpretaciones complejas. Este método es flexible y puede adaptarse cambiando el número de clústeres primarios, subclústeres, o las propiedades analizadas.


Bibliografía

[1] Asquith, G., & Krygowski, D. (2004). Basic Well Log Analysis. AAPG Methods in Exploration Series. American Association of Petroleum Geologists.

[2] Rider, M., & Kennedy, M. (2011). The Geological Interpretation of Well Logs. Rider-French Consulting Ltd.

[3] Ellis, D. V., & Singer, J. M. (2007). Well Logging for Earth Scientists. Springer.

[4] Hohn, M. E. (1998). Geostatistics and Petroleum Geology. Springer.

[5] Schlumberger. (1989). Log Interpretation Principles/Applications. Schlumberger Educational Services.

[6] Serra, O. (1984). Fundamentals of Well-Log Interpretation: The Acquisition of Logging Data. Elsevier.


Publicación realizada por Hiram Arias y Emiliano Flores

Contacto


LinkedIn: Hiram Arias y Emiliano Flores


Correo: hiram0809@gmail.com y jemilianofl@gmail.com

No hay comentarios.:

Publicar un comentario