MATLAB을 사용한 석유 및 가스 생산량 데이터 분석

동기

유전 및 가스전 생산성을 최적화하는 데 있어 가장 중요한 퍼즐 조각 중 하나는 과거 생산량 데이터의 분석입니다. DCA(생산감퇴곡선분석법)와 같은 견고한 생산량 데이터 분석 기법을 통해 생산 엔지니어는 감퇴율, 평균 석유 및 가스 생산율 및 누적 생산량과 같은 유정 생산성 관련 메트릭을 평가할 수 있습니다. 더 중요한 것은 이러한 기법을 통해 석유 및 가스 생산을 예측함으로써 자산의 현재 재무 성과와 장기적인 성공 가능성을 정확하게 평가할 수 있다는 점입니다.

생산량 데이터 분석 기법에서는 회귀 분석을 통해 과거 석유 및 가스 생산량 데이터에 맞는 유정 성능 파라미터를 기반으로 하는 수학적 모델에 의존합니다. 예를 들어, DCA는 기하급수적 감퇴를 나타내는 수학적 함수를 사용합니다. Arps 방정식은 석유 및 가스 업계에서 가장 널리 사용되고 광범위하게 채택되는 DCA 접근법이라 할 수 있습니다. 대부분의 DCA 모델과 마찬가지로 Arps는 생산천이분석법과 같은 다소 복잡한 기법에 비해 몇 가지 중요한 이점이 있습니다. 첫째, DCA는 계산 비용이 저렴하고 구현하기 쉽습니다. 둘째, DCA는 파라미터 수가 적기 때문에 회귀 결과를 해석하기가 더 쉽다는 특징이 있습니다. 셋째, DCA는 단일 또는 여러 유정의 방대한 과거 생산 기록과 같은 대규모 데이터셋을 처리할 수 있습니다. 그러나 다른 모델과 마찬가지로 데이터 분석, 생산량 예측 및 석유경제학에 대해 물리적으로 유효한 DCA 모델을 얻으려면 입력 데이터의 품질이 매우 중요합니다.

이 백서에서는 MATLAB®을 사용하여 석유 및 가스 생산량 데이터에 대한 DCA 기반 데이터 분석 워크플로를 개발하고 배포하는 방법을 다룰 것입니다. 또한 과거 생산량 데이터셋의 형식을 지정하고 전처리하며, 사용자 지정 회귀 모델을 만들고, 생산량 예측을 생성하며, 석유경제학 분석을 수행하는 방법에 대해서도 살펴볼 것입니다. 주요 목표는 단순하면서도 견고한 소프트웨어 개발 관행을 따라 워크플로에 수반되는 복잡성을 압축하고 해결하는 데 MATLAB이 어떻게 도움이 되는지 시연하는 것입니다. 여기서는 시연을 위해 TRRC(Texas Railroad Commission) 웹사이트에서 공개된 과거 석유 및 가스 생산 리포트를 사용할 것입니다.

섹션

생산량 데이터 분석 웹 앱

MATLAB에서 석유 및 가스 생산량 데이터 분석을 수행하는 워크플로의 주요 단계를 비롯해, 석유 및 가스 생산을 위한 보다 안정적이고 유지보수가 용이한 소프트웨어 애플리케이션을 설계하고 사용자 지정하는 데 유용한 소프트웨어 개발 및 구현에 대한 몇 가지 모범 사례를 다룰 것입니다.

앱은 온라인으로 배포되지만, 최종 사용자는 다른 기존 데스크탑 애플리케이션과 동일한 방식으로 웹 앱과 상호 작용할 수 있습니다. 그림 1에서는 과거 생산 기록을 끌어서 놓을 수 있는 앱의 Import 탭을 볼 수 있습니다. 데이터셋이 추가된 후에 앱은 다양한 데이터 전처리 작업을 수행하고 결과로 나온 데이터를 이에 맞는 플롯에 플로팅합니다. 데이터 가져오기 및 데이터 전처리와 관련된 공정은 각각 데이터 가져오기데이터 전처리 섹션에 자세히 설명되어 있습니다.

외부 파일에서 데이터를 불러오는 방법을 보여주는 유정 생산량 데이터 분석 앱의 스크린샷 2개.

그림 1. MATLAB으로 생성한 유정 생산량 데이터 분석 앱의 Import 탭.

데이터를 가져온 후 사용자는 DCA 회귀 분석을 수행할 수 있습니다. 그림 2는 회귀 설정을 조정하고 모델에 적합하도록 특정 유체상(유상 또는 기상)의 평균 생산율 또는 누적 생산량 데이터를 사용할지 여부를 선택할 수 있는 앱의 Regression 탭을 보여줍니다. 또한 앱을 사용하면 사용자가 회귀 윈도우의 시작점과 끝점을 선택할 수 있으므로 유정 개입 작업 전후와 같은 특정 관심 기간에 대한 생산 거동을 평가하기 위해 DCA 회귀를 생성하여 더 유연한 분석이 가능합니다. 모든 파라미터가 정의되면 사용자는 기본 최적화 알고리즘에 대한 데이터 피팅 옵션을 클릭하여 데이터셋에 가장 적합한 DCA 파라미터 세트를 추정할 수 있습니다. 그러면 앱에 각 유체상에 대한 결정계수(R2)와 함께 사용된 파라미터의 요약이 표시됩니다. DCA 공정에 대한 보다 자세한 내용은 생산감퇴곡선분석법 섹션에서 확인할 수 있습니다.

원본 데이터를 사용하여 DCA 회귀 모델을 실행하는 방법을 보여주는 유정 생산량 데이터 분석 앱의 스크린샷 2개.

그림 2. 자동화된 DCA 회귀가 Regression 탭에서 수행됩니다.

DCA 모델을 기반으로 석유 및 가스 생산량 예상을 생성하려면 사용자가 향후 몇 년에 대해 예측하려는지만 정의하면 앱에서 두 유체상에 대한 평균 생산율과 총 생산량을 별도로 계산합니다. 그림 3에서 볼 수 있듯이, 이 앱에서 사용자는 슬라이더 또는 숫자 텍스트 필드를 사용하여 예상 시간을 연 단위로 지정할 수 있습니다. 기본 예측 시간 옵션이 수정되면 평균 생산율 및 누적 생산량 그래프가 자동으로 업데이트됩니다.

Forecast 탭에서 누적 생산량과 함께 향후 석유 및 가스 생산율을 보여주는 유정 생산량 데이터 분석 앱의 스크린샷.

그림 3. 과거 생산량 데이터 및 예상 석유 및 가스 생산율과 누적 생산량을 표시하는 Forecast 탭.

생산량 예측 데이터를 기반으로 석유경제학 분석을 수행하는 것이 이 생산량 데이터 분석 워크플로의 마지막 단계입니다. 석유경제학은 자산 관리자가 현장 규모 분석부터 개별 유정 분석에 이르는 모든 단계에서 정보에 입각한 의사 결정을 내리는 데 사용됩니다. 앱에서 새로운 예측을 생성하기 위해 데이터는 Economics 탭으로 즉시 전송되며 여기서 사용자는 세금, CAPEX(자본적 지출), OPEX(영업 비용), 석유 및 가스 가격과 같은 파라미터를 수정할 수 있습니다. 다음으로 앱은 내부적으로 NPV, 손익분기점, 경기침체점(해당하는 경우), 내부수익률 및 투자자본수익률을 계산하여 그래프의 NPV(순현재가치) 곡선을 자동으로 업데이트합니다. 그림 4는 현금흐름이 음에서 양으로 전환되고(손익분기점), 최댓값(최대 NPV)에 도달한 후 쇠퇴하기 시작하는 NPV 곡선의 예를 보여주며, 이 시점 이후부터는 유정을 운영하기에 너무 비싸다는 것을 의미합니다. 앱은 또한 추정 실현 날짜와 함께 가장 높은 예상 NPV도 표시합니다. 이러한 구현에 대한 자세한 내용은 경제적 분석 섹션에서 다룰 것입니다.

프로젝트의 추정 누적 현금흐름을 보여주는 유정 생산량 데이터 분석 앱의 스크린샷.

그림 4. NPV 곡선을 보여주는 Economic Analysis 탭.

석유 및 가스 생산량 데이터 분석 워크플로를 실행하기 위해 개발한 웹 앱에서 사용된 MATLAB의 몇 가지 소프트웨어 개발 기능을 살펴보겠습니다.

섹션

소프트웨어 아키텍처

이전 섹션에서 이 앱의 컴포넌트는 한 컴포넌트의 입력이 다른 컴포넌트의 출력에 따라 달라지는 선형 관계를 나타내는 것을 보셨을 겁니다. 예를 들어, DCA 탭은 Import 탭에서 제공하는 데이터에 따라 달라지며, 이 데이터는 사용자가 제공하는 데이터셋에 따라 달라집니다. Forecast 탭이 DCA 탭에서 산출된 DCA 모델에 따라 달라지는 것과 마찬가지로, Economics 탭은 Forecast 탭에서 산출된 생산량 예측에 따라 달라집니다. 이는 파이프 및 필터 소프트웨어 아키텍처 패턴의 전형적인 예입니다. 이 잘 알려진 소프트웨어 아키텍처를 고려하여, 애플리케이션 로직은 그 디자인 패턴 개념을 기반으로 합니다. 표 1은 컴포넌트 또는 필터와 그 책임, 입력 및 출력에 대해 설명합니다.

표 1. 소프트웨어 컴포넌트 및 책임.
컴포넌트 책임 입력 출력
데이터 가져오기
  • 외부 데이터셋의 생산 이력 기록을 MATLAB으로 구문 분석
  • 데이터 및 메타데이터 분할 처리
  • 평균 비율, 유동 시간 및 누적 생산량과 같은 종속 변수 계산
  • TRRC 템플릿을 사용한 석유 및 가스 생산량 데이터셋
  • 입력 데이터셋의 원시 숫자 데이터가 포함된 테이블
데이터 전처리
  • 원시 생산량 데이터가 포함된 테이블 읽기
  • 보간 기법을 사용한 누락 항목 또는 유효하지 않은 항목(예: NaN, inf) 제거 및 교체
  • 이상값 검출 및 제거, 이후 보간 기법을 사용하여 교체
  • 원시 숫자 데이터가 포함된 테이블
  • 정리된 숫자 데이터가 포함된 테이블
생산감퇴곡선분석법
  • 평균 생산율 및 누적 생산량에 대한 Arps DCA 모델의 수학적 회귀 구현
  • 사용자가 회귀에 대한 관심 시간 범위 선택 가능
  • 정리된 숫자 데이터가 포함된 테이블
  • 상에 대한 회귀 파라미터가 포함된 구조체
  • 상에 대한 회귀 파라미터가 포함된 구조체
생산량 예측
  • 유상과 기상 모두에 대한 생산량 예측 생성
  • 사용자가 예측 시간을 연 단위로 정의 가능
  • 상에 대한 DCA 회귀 파라미터
  • 상에 대한 DCA 회귀 파라미터
  • 석유 및 가스 생산량 예측이 포함된 테이블
경제적 분석
  • 유상 및 기상에 대한 생산량 예측을 기반으로 경제적 계산 수행
  • 석유 및 가스 가격, 감가상각, 세금, CAPEX 및 OPEX 등 사용자가 정의할 수 있는 경제적 분석 메트릭
  • 석유 및 가스 생산량 예측이 포함된 테이블
  • 경제적 파라미터 값이 포함된 구조체
  • 경제적 분석 결과가 포함된 구조체

이러한 컴포넌트 외에도 매우 중요한 두 가지 모듈, 분석과 결과를 구축했습니다. 이러한 어셈블리 컴포넌트는 공정에서 특정 부분의 주요 임무를 공동으로 처리합니다. 그림 5는 이 소프트웨어 아키텍처를 보여줍니다.

생산량 데이터 분석 워크플로의 5단계인 데이터 가져오기, 전처리, 회귀, 예측 및 경제적 분석을 보여주는 워크플로 다이어그램.

그림 5. 생산량 데이터 분석을 위한 소프트웨어 아키텍처.

파이프 및 필터 아키텍처는 복잡한 워크플로를 독립적이고 협력적인 컴포넌트로 분할하여 소프트웨어를 쉽게 디버그하고 유지 관리할 수 있는 등 여러 가지 이점을 제공합니다. 또한 새 컴포넌트를 추가하여 프로그램의 기능을 확장할 수 있는데, 새 컴포넌트에 파이프 또는 커넥터와 호환되는 API(애플리케이션 프로그래밍 인터페이스)가 있어야 한다는 요구사항만 충족하면 됩니다. 예로 Results 서브시스템을 확장하는 한 가지 방법은 MATLAB Report Generator™를 사용하는 리포트 컴포넌트를 포함하여 생산 엔지니어 또는 자산 관리자를 염두에 두고 특별히 설계된 리포트를 생성하는 것입니다.

섹션

표본 생산량 데이터

우리는 TRRC의 Public GIS Viewer 툴을 사용하여 남텍사스에 분포한 Eagle Ford Shale의 원유 생성 구간 전체에서 무작위로 선택한 200개의 유정 모집단을 만들었습니다. 그런 다음, Mapping Toolbox™를 사용하여 누적 석유 생산량에 대한 거품 플롯을 생성했습니다.

TRRC의 Public GIS Viewer 툴을 사용하여 남텍사스에 분포한 Eagle Ford Shale의 원유 생성 구간 전체에서 무작위로 선택한 200개의 유정 모집단을 생성했습니다. 그런 다음, Mapping Toolbox를 사용하여 그림 6에 보이는 누적 석유 생산량에 대한 거품 플롯을 만들었습니다.

텍사스의 Eagle Ford에 있는 유정의 위치를 보여주는 지도. 유정은 2024년 1월 기준 누적 생산량을 나타내기 위해 색으로 구분된 거품으로 표시됩니다.

그림 6. 미국 남텍사스의 Eagle Ford Shale에 분포한 200개 이상 유정 모집단의 위치.

그림 7에는 이 모집단의 Lower Eagle Ford 지층에서 석유를 생산하는 Karnes County 유정의 일일 평균 석유 생산량이 나와 있습니다. 여기서 주목할 점은 일일 석유 생산율의 감퇴인데, 이는 멱법칙 감쇠와 매우 유사하며 Arps DCA가 설명하고자 하는 바와 정확히 일치합니다.

수 년에 걸친 텍사스의 Lower Eagle Ford에 분포한 여러 유정의 일일 평균 석유 생산량을 플로팅하는 그래프.

그림 7. 미국 남텍사스의 Lower Eagle Ford 지층에 분포한 200개 이상 유정의 일일 평균 석유 생산량.

본 백서에서 다루는 생산량 데이터 분석 방법에서는 앞서 언급한 전체 유정 모집단에서 유정 하나를 무작위로 선택했습니다. 익명성을 유지하기 위해 여기서는 이 유정을 “표본 유정”이라고 간단히 지칭하겠습니다. 운영자, 위치 등과 같은 유정 메타데이터는 공개되지 않습니다.

섹션

생산량 데이터 분석 워크플로

이전 섹션에서는 웹 앱에 채택된 생산량 데이터 분석 워크플로의 토대를 마련했습니다. 이 섹션에서는 소프트웨어 아키텍처 섹션에서 언급한 컴포넌트의 소프트웨어 구현에 중점을 두고 MATLAB을 사용하여 모든 컴포넌트에 필요한 기능을 구성하는 방법을 집중적으로 설명하겠습니다. 사용자가 컴퓨터 프로그래밍에 대한 기본 지식이 있다고 가정하고, 이러한 단계에 대한 자세한 내용을 담은 추가 자료 링크를 본 문서에 포함했습니다.

워크플로는 5개의 하위 섹션으로 나뉩니다. 데이터 가져오기에서는 TRRC 데이터셋을 MATLAB으로 가져오는 공정 및 이런 특정 유형의 데이터 구조와 관련된 문제를 다룹니다. 데이터 전처리에서는 데이터 정리 및 이상값 탐지를 위해 MATLAB에서 사용할 수 있는 다양한 옵션을 살펴보고 이 공정을 자동화하는 방법에 대해 설명합니다. Arps DCA와 같은 MATLAB의 맞춤형 회귀 모델에 대한 정의와 생산량 예측에 대한 이런 모델의 응용 사례는 각각 생산감퇴곡선분석법생산량 예측에 대한 하위 섹션에서 다룹니다. 마지막으로, 경제적 분석에서는 사용자 정의 경제 지표를 활용해 석유 및 가스 생산량 예측에서 재무적 인사이트를 얻는 방법을 다룹니다.

데이터 가져오기

MATLAB의 강력한 데이터 가져오기 기능을 사용하면 Excel® 스프레드시트, CSV(쉼표로 구분된 값) 파일, 이미지 파일, 오디오 및 비디오 파일 등과 같은 일반적인 데이터형을 사용한 작업이 더욱 쉬워집니다. 로컬 저장 데이터를 주로 살펴보긴 하지만, MATLAB에는 Amazon® Web Services, Microsoft® Azure®, Google Cloud Platform™(클라우드에서 MATLAB 및 Simulink 사용하기 참조) 등의 클라우드 서비스에 대한 내장 인터페이스 외에도 Database Toolbox™를 통해 관계형 및 NoSQL 데이터베이스가 제공된다는 점을 강조하고 싶습니다.

표본 유정 데이터셋 준비

표본 유정의 석유 및 가스 생산 기록은 TRRC 템플릿의 서식을 따르는 로컬 CSV 파일에 보관됩니다. CSV 파일의 테이블을 읽고 MATLAB으로 바로 가져올 수 있지만, 이 특정 템플릿에는 몇 가지 문제점이 있습니다. 첫째, 수치 데이터(예: 순 석유 및 가스 생산량)와 메타데이터(운영자의 이름, 위치 등)가 혼합되어 있습니다. 둘째, 특정 데이터 점이 누락되어 NO RPT로 표시됩니다. 마지막으로, 날짜/시간 형식은 특정 리포트가 기록된 정확한 날짜를 표시하지 않기 때문에 다소 특이합니다. 표본 유정 데이터셋의 스크린샷은 그림 8에 나와 있습니다.

표본의 부분 생산 이력 로그를 보여주는 Excel 스크린샷.

그림 8. 표본 유정의 생산량 이력을 보여주는 가져오기 툴.

이러한 문제에도 불구하고, MATLAB은 가져오기 툴을 통해 이러한 데이터셋을 문제없이 처리할 수 있습니다. 이는 각 열에 해당하는 데이터형을 표시하고 관심 데이터 범위를 정의하며 데이터 항목이 누락된 행을 포함할지 여부를 선택하여 가져오기 파라미터를 추가로 사용자 지정할 수 있는 그래픽 애플리케이션입니다.

여기서는 적절한 데이터형으로 Number를 선택하고 테이블에서 석유 및 가스 생산량 데이터를 강조 표시하는 것으로 시작했습니다. 그런 다음, MATLAB이 보고 날짜를 올바르게 읽고 처리할 수 있도록 열 1의 값에 대한 사용자 지정 날짜/시간 유형을 정의했습니다. 이렇게 한 후 관심 데이터셋인 열 1, 2, 4의 이름을 각각 reportDates, netOil, netGas로 바꾸었습니다.

사용자 지정 가져오기 함수 만들기

표본 유정의 데이터셋을 준비하고 올바르게 가져오는 데 필요한 단계를 수행한 후, MATLAB의 코드 생성 기능을 사용하여 앞서 설명한 데이터 준비 단계를 자동으로 수행하는 함수 wellDataParser를 만들었습니다. wellDataParser 함수를 사용하면 MATLAB 명령줄에서 바로 CSV 파일의 TRRC 데이터셋을 가져올 수 있습니다. 이 함수는 소프트웨어 아키텍처 섹션에서 설명한 바와 같이 이후 분석에 사용할 수 있는 원시 데이터가 포함된 테이블을 반환합니다.

wellDataParser는 화이트박스 함수로 생성되므로 더 많은 기능을 지원하도록 수정할 수 있습니다. 예를 들어, 그림 9와 같이 특정 보고 날짜의 마지막 날을 계산하고 reportDates의 모든 보고 날짜를 리팩터링했습니다.

wellDataParser 함수를 통해 가져온 데이터를 보여주는 명령 창의 스크린샷 2개.

그림 9. wellDataParser의 출력 테이블.

전문가 팁: 데이터저장소를 Parallel Computing Toolbox™와 함께 사용하면 수백 또는 수천 개의 TRRC 데이터셋을 동시에 가져올 수 있습니다.

데이터 전처리

지난 섹션에서 살펴보았듯이, 데이터셋에는 Inf 또는 NaN 값과 같이 유효하지 않은 요소나 누락된 요소가 포함되는 경우가 가끔 있습니다. 이러한 요소는 내장 MATLAB 함수 rmmissing을 데이터셋에 적용하여 쉽게 제거할 수 있습니다. 그러나 데이터에는 외관 검사로는 식별하기 힘든 이상값도 포함될 수도 있습니다.

생산량 데이터셋 정리

다행히도, 데이터 정리기 앱을 사용하면 일관적이지 않은 데이터를 정리할 수 있습니다. 이 앱은 데이터를 탐색하고 시각화하며 이상값 탐지를 위한 규칙을 정의합니다. 그림 10은 표본 유정의 netOilnetGas를 시각적으로 분석하는 데이터 정리기 앱의 스냅샷을 보여줍니다. 데이터 수집을 제거하는 데 필요한 작업을 정의한 후, 우리는 데이터 정리기 앱을 사용하여 앱에서 수행한 전처리 작업을 포함하는 사용자 지정 함수 wellDataCleaner를 만들었습니다.

데이터 정리 절차를 보여주는 데이터 정리기 앱의 스크린샷.

그림 10. 데이터 정리기 앱.

데이터 증강

이제 데이터셋이 정리되었습니다. 다음 단계는 DCA 회귀 분석을 수행할 변수, 즉 가동 시간(즉, 유동 시간), 일일 평균 석유 및 가스 생산율, 누적 석유 및 가스 생산량을 정의하는 것입니다. wellDataCleaner는 화이트박스 함수이므로 누락된 특징 flowTime, oilRate, gasRate, cumOil, cumGas를 계산하는 데 필요한 코드를 추가하여 소프트웨어 아키텍처 계획의 요구사항에 부합하도록 출력 테이블에 삽입했습니다. 그림 11은 표본 유정에 대해 전처리된 테이블을 보여줍니다.

정리 및 증강된 데이터를 보여주는 명령 창의 스크린샷.

그림 11. 정리 및 증강 후 표본 유정의 생산량.

소프트웨어 아키텍처 진행 상황

그림 12에는 생산량 데이터 분석 파이프라인의 개발 단계가 나와 있습니다. 여기서 사용자 지정 MATLAB 함수 wellDataParserwellDataCleaner는 데이터 가져오기와 데이터 전처리를 위한 소프트웨어 컴포넌트를 나타냅니다. 이 그림에서 파란색 화살표는 원시 테이블을 나타내는 것으로, 이는 전자 함수(wellDataParser)의 결과이며 후자 함수(wellDataCleaner)의 입력으로 사용됩니다. MATLAB에서 이 두 부분의 관계는 다음과 같이 얻을 수 있습니다.

>> well = wellDataParser("sampleWellData.csv"); 

>> well = wellDataCleaner(well); 

위의 코드는 데이터 가져오기 및 데이터 전처리 컴포넌트를 연결하는 파이프를 명확하게 보여줍니다. wellDataCleaner가 새 객체를 반환하는 대신 있는 유정 객체를 수정하여 메모리를 효과적으로 활용하는 것을 볼 수 있습니다.

완료 중인 데이터 가져오기 및 데이터 전처리 컴포넌트를 보여주는 다이어그램.

그림 12. 데이터 가져오기 및 데이터 전처리 컴포넌트는 데이터 수집과 정리를 자동화하기 위해 MATLAB에서 생성된 함수를 사용하여 모델링됩니다.

전문가 팁: MATLAB은 데이터 정리기 앱 사용에 대한 다양한 예제를 제공합니다. 더 자세한 내용은 MATLAB 문서를 참조하십시오.

생산감퇴곡선분석법

많은 실무자는 석유 및 가스 생산량 데이터 분석에서 Arps 방정식을 DCA의 표준 모델로 간주합니다. 가장 널리 사용되는 방정식은 시간 경과에 따른 일일 평균 생산량의 감퇴를 세 가지 회귀 파라미터인 초기 비율 \( q_{i} \)(볼륨/일), 감퇴율 \( D \)(1/일), \( b \)-인자 및 기준 시간 \( t_{i} \)(일)에 대한 함수로 표현하는 생산율 기반 쌍곡선 감퇴 방정식입니다. 이 방정식은 다음과 같이 정의됩니다.

\( q(t; t_{i}) = \frac{q_{i}}{[1 \ + \ bD(t \ - \ t_{i})]^{\frac{1}{b}}} \)

방정식 1.

여기서, \( q(t; t_{i}) \)는 \( t > t_{i} \)일 때의 생산율을 나타냅니다. 누적 생산량과 관련된 두 번째 방정식은 기준 시간 \( t_{i} \)에서 시간 \(t\) > \( t_{i} \)까지 시간에 대해 방정식 1을 적분하면 구할 수 있습니다. 결과적으로 생산 기반 Arps 방정식은 다음과 같이 정의됩니다.

\( Q(t; t_{i}) = Q_{i} + \frac{q_{i}^{b}}{D(b \ - \ 1)}(q^{1-b}(t; t_{i}) - q_{i}^{1-b}) \)

방정식 2.

여기서, \( Q(t;t_{i}) \)는 \( t>t_{i} \)일 때의 누적 생산량을 나타냅니다. 방정식 2가 시작 누적 생산량 \( Q(t_{i}) ≡ Q_{i} \)을 파라미터로 포함하는 것을 볼 수 있습니다. 이 파라미터는 유정의 생산량 기록에서 얻거나 추가 회귀 파라미터로 정의할 수 있습니다. 표 2에는 DCA 분석을 위해 채택한 단위가 있습니다.

[1bbl = 0.158987m3 = 5.61458ft3]
표 2. 생산량 데이터 분석의 단위 체계.
유체 생산율 누적 생산량
석유

일일 배럴 (bbl/day)

배럴 (bbl)

가스

일일 백만 표준 입방피트 (MMscf/day)

일 백만 표준 입방피트 (MMscf)

DCA 회귀 모델 만들기

Curve Fitting Toolbox™의 곡선 피팅기를 사용하여 각 유체상에 대해 방정식 1과 2를 기반으로 맞춤형 DCA 회귀 모델을 독립적으로 만들었습니다. 여기서는 작업 공간에 well 테이블이 있다는 가정하에, 일일 평균 석유 생산량에 대한 생산율 기반 DCA 회귀 개발에 사용된 네 단계를 살펴볼 것입니다.

  • 1단계: well을 가져와 well.flowTimewell.oilRate에 각각 x 및 y 데이터를 할당합니다. 석유 생산량은 약 120일 시점에서 정점에 도달한 후 감퇴하기 시작하므로 이 시점 이전의 데이터는 포함하지 않아야 합니다.
  • 2단계: 사용자 지정 수식 옵션을 사용하여 생산율 기반 DCA 모델을 만듭니다. MATLAB은 올바른 방식으로 회귀를 수행하려 시도하지만, 이는 하나 이상의 회귀 파라미터가 0에 너무 가까워지거나 음수가 되거나 극도로 커짐으로써 발생하는 수렴 문제로 인해 실패할 가능성이 높습니다. 각 파라미터에 대해 물리적으로 유의미한 경계를 정의하여 이 문제를 해결할 수 있습니다. 각 파라미터에 대한 초기 추측이 우수하면 알고리즘이 더 빨리 수렴하는 데 도움이 됩니다.
  • 3단계: 연산의 요약 통계를 확인하고 결과 회귀 파라미터가 합리적이며 지정된 범위 내에 있는지 확인합니다. MATLAB이 그 값과 95% 신뢰구간을 표시합니다. 그 결과로 산출되는 오차제곱합, R2 및 RMSE(RMS 오차)를 통해 회귀 적합도를 더욱 잘 이해할 수 있습니다. MATLAB에서는 이 요약 통계를 적합도(gof)라고 합니다.
  • 4단계: 내보내기 옵션을 사용하여 gof 통계와 함께 결과로 산출된 회귀 모델을 포함하는 함수를 생성합니다.

나머지 DCA 회귀를 생성하기 위해 동일한 단계를 다시 진행했습니다. 결과적으로, 방정식 1과 2를 기반으로 각각 유상과 기상에 대한 DCA 회귀를 실행하기 위한 함수 getDCAParamRategetDCAParamProd를 만들고 수정할 수 있습니다. 각각의 단계를 시작할 위치를 나타내는 곡선 피팅기 앱의 스크린샷을 그림 13에서 볼 수 있습니다.

사용자 지정 회귀 모델을 보여주는 곡선 피팅기 앱의 스크린샷.

그림 13. 석유 생산율에 대한 회귀 결과를 보여주는 곡선 피팅기 앱.

표 3에서는 표본 유정의 모든 DCA 회귀 및 유체상에 대한 회귀 파라미터 및 \( R^{2} \)를 볼 수 있습니다. 누적 생산량 데이터는 일반적으로 일일 평균 생산율보다 평활하기 때문에 생산량 기반 DCA가 가장 높은 \( R^{2} \) 값을 갖는 것은 놀라운 일이 아닙니다.

표 3. 표본 유정에 대한 DCA 회귀 파라미터 요약.
  생산율 기반 DCA 생산량 기반 DCA
  석유 가스 석유 가스
\( Q_{i} \) 192095 84475.5 192095 84475.5
\( q_{i} \) 1530.6 984.06 1098.68 698.46
\( b \) 1.1398 1.279 0.9388 0.7806
\( D \) 0.0089 0.004 0.0045 0.0015
\( R^{2} \) 값 0.945 0.784 0.999 0.997

우리는 getDCAParamRategetDCAParamProd가 방정식 1과 2의 DCA 파라미터 계산을 담당하도록 설계했습니다. 그러나 이는 누적 생산성이나 일일 평균 생산량을 예측할 수는 없습니다. 따라서 DCA 회귀 파라미터를 입력으로 받고 유량율 또는 체적 등 필요한 결과를 출력할 수 있는 MATLAB 함수를 개발하여 DCA 모델을 운용화할 필요가 있습니다.

이를 위해 아키텍처에 두 개의 함수 flowRate(t,dcaParam)cumulProd(t,dcaParam)을 추가했습니다. 여기서 t는 양수 스칼라 또는 양수 스칼라로 구성된 벡터이고 dcaParam은 \( q_{i} \), \(Q_{i} \), \( b \), \(D \), \( t_{i} \)를 담은 MATLAB 구조체입니다. 이 두 함수는 유틸리티 함수로, 특정 데이터셋이 아니라 DCA 회귀 파라미터에 따라 달라집니다. 따라서 flowRatecumulProd는 모두 독립적인 유틸리티 패키지로 함께 패키징될 수 있습니다.

이러한 두 함수를 사용하여 생산량 기반 데이터셋과 생산율 기반 데이터셋에 대한 DCA 회귀를 비교했습니다. 일일 평균 석유 및 가스 생산량을 조사하기 위한 생산량 기반 및 생산율 기반 DCA 방법의 비교는 그림 14a와 14b에 나와 있습니다. 두 회귀 모델 모두 생산율 추정에서 우수한 성능을 발휘하여 상당히 유사한 결과를 산출합니다.

평균 석유 생산율과 평균 가스 생산율에 대한 데이터와 DCA 모델을 비교하는 2개의 그래프.

그림 14. 데이터와 DCA 모델 비교: (a) 평균 석유 생산율 및 (b) 평균 가스 생산율.

그림 15a와 15b는 각각 예상된 누적 석유 및 가스 생산량을 보고된 과거 생산량과 비교한 것입니다. 평균 일일 비율과 마찬가지로, 두 DCA 모델 모두 매우 유사한 결과를 보이면서 누적 생산량을 예상하는 데 효과적입니다.

누적 석유 생산량 및 누적 가스 생산량에 대한 데이터와 DCA 모델을 비교하는 2개의 그래프.

그림 15. 데이터와 DCA 모델 비교: (a) 누적 석유 생산량 및 (b) 누적 가스 생산량.

소프트웨어 아키텍처 진행 상황

그림 16은 워크플로의 현재 상태를 보여줍니다. 여기서는 DCA 컴포넌트가 예상 평균 생산율과 누적 생산량 수치를 계산하는 데 사용하는 유틸리티 소프트웨어 컴포넌트를 추가하는 것이 핵심 포인트입니다.

우리는 이 유틸리티 패키지를 컴포넌트 내에 바로 포함할 수도 있었습니다. 하지만, 유지 관리성과 책임 주도 설계를 고려하여 분리하기로 결정했습니다. 함수 시그니처가 변경되지 않는 한 컴포넌트를 독립적으로 구축하고 유지 관리할 수 있기 때문에 이 접근법을 통해 유지 관리성이 크게 향상되었습니다. 마찬가지로, 워크플로를 중단하지 않고도 향후 다른 DCA 모델을 추가할 수 있도록 유연성을 강화했습니다.

또한 유틸리티 함수를 분리하여 유지하면 일반적으로 코드의 가독성이 좋기 때문에 누군가가 이에 대한 작업을 수행하려는 경우 각 부분이 무엇을 수행해야 하는지 정확히 알 수 있으므로 코딩 시간이 단축됩니다.

여기에 제안된 것과 같은 모듈식 소프트웨어 설계의 경우 초기 비용이 더 많이 들긴 하지만, 테스트 및 관리가 까다로운 "만능” 함수를 위해 수백 또는 수천 줄의 코드를 작성하는 것보다 유지 관리 및 확장이 훨씬 쉽습니다.

완료된 DCA의 단계를 보여주는 플로우 차트.

그림 16. DCA 컴포넌트는 유틸리티 컴포넌트를 활용합니다.

생산량 예측

이 소프트웨어 컴포넌트의 경우, 이전 섹션에서 설명한 유틸리티 함수 flowRatecumulProd를 사용하여 미래 석유 및 가스 생산량을 추정하기 위해 DCA 컴포넌트에서 도출된 회귀 파라미터를 활용했습니다. 이제 생산량 예측 생성에 필요한 모든 함수가 준비되었으므로 이를 호출하는 코드를 작성해야 했습니다.

이렇게 하는 과정에서 각 유체에 대한 well DCA 회귀 파라미터를 취하고 예측 시간을 입력 인수로 요청하는 함수 generateForecast를 만들어 다음과 같은 내부 작업을 수행함으로써 전체 생산량 예측을 생성했습니다.

  • 미래 유동 시간의 벡터 생성
  • 미래 날짜로 구성된 벡터 생성
  • 석유 및 가스 감퇴율 계산
  • 누적 석유 및 가스 생산량 계산

결과적으로 generateForecast는 생산 메트릭이 DCA 모델로 생성된 미래 예측 값이라는 점을 제외하고, 원래 입력 테이블과 동일한 형식의 새 테이블을 반환합니다.

다음 하위 섹션에서는 generateForecast의 작동 원리를 설명합니다. 생산량 예측은 마지막 보고 날짜로부터 한 달 후에 시작하여 의도한 전망 시간에 도달할 때까지 매월 보고되는 것으로 가정했습니다.

생산량 예측 생성

그림 17에는 2024년 1월 31일부터 시작하여 향후 50년간의 표본 유정에 대한 석유 및 가스 예상 생산량에 대한 결과가 나와 있습니다. 그림 17a에서 볼 수 있듯이 생산량 기반 DCA 모델은 생산율 기반 DCA 모델에 비해 시간이 지남에 따라 석유 생산량이 약간 더 가파르게 감소할 것으로 예측합니다. 그러나 그림 17b에서는 예상의 차이가 일일 평균 가스 생산량에서 더욱 두드러지는 것으로 나타납니다.

석유 감퇴율과 가스 감퇴율에 대한 DCA 기반 생산량 예측을 플로팅하는 2개의 그래프.

그림 17. DCA 기반 생산량 예측: (a) 석유 감퇴율 및 (b) 가스 감퇴율.

18a와 18b에서 볼 수 있듯이, 예측 모델 간의 차이는 누적 석유 및 가스 생산량에서 더욱 크게 나타납니다. 예상 누적 생산량의 차이는 석유 5만 배럴과 가스 3억 표준 입방피트 이상이며, 이는 전망의 경제적 평가에 불확실성을 초래할 수 있다는 점에 유의하십시오.

누적 석유 생산량 및 누적 가스 생산량에 대한 DCA 기반 생산량 예측을 플로팅하는 2개의 그래프.

그림 18. DCA 기반 생산량 예측: (a) 누적 석유 생산량 및 (b) 누적 가스 생산량.

각 모델에 따라 산출되는 생산 추정치가 달라질 수 있기 때문에, 다양한 DCA 모델을 실험해 보고 연구 중인 유전 또는 가스전의 생산 거동에 가장 일치하는 것을 선택하는 것이 매우 중요합니다. 이러한 결정을 내리는 한 가지 방법은 기존 유정의 생산량 데이터를 활용하여 모델 비교를 진행하는 것입니다. 이를 위해 DCA 컴포넌트에 더 많은 DCA 모델을 추가하는 것을 고려할 수 있지만, 그렇게 하면 함수가 더 복잡해질 수 있습니다. 이를 피하기 위해 각 객체가 DCA 모델에 대응하는 객체 지향 설계를 대신 사용할 수 있습니다. 이렇게 하면 파이프 및 필터 소프트웨어 아키텍처에서와 마찬가지로 객체를 개별적으로 관리할 수 있으므로 시스템의 유지 관리성과 안정성을 높일 수 있습니다.

소프트웨어 아키텍처 진행 상황

그림 19는 지금까지의 소프트웨어 아키텍처 진행 상황을 보여줍니다. 앞서 언급했듯이, 생산량 예측 컴포넌트는 이전 섹션에서 만든 DCA 유틸리티 패키지를 활용하여 석유 및 가스 생산량 전망을 생성합니다.

완료된 생산량 예측 컴포넌트의 단계를 보여주는 플로우 차트.

그림 19. 생산량 예측 모듈 및 관련 MATLAB 함수.

경제적 분석

워크플로의 마지막 단계는 생산량 예측을 재무 메트릭으로 변환하는 것입니다. 자산 관리자는 흔히 석유경제학이라고 지칭되는 이런 종류의 분석을 활용하여 유정을 계속 가동하거나 매각하는 등의 결정을 내립니다. 투자자들은 이 분석을 사용하여 기존 유정 매입의 타당성을 평가합니다. 그러나 석유경제학 분석의 신뢰성은 생산량 예측 및 관련 재무 메트릭의 정확성에 크게 좌우됩니다.

평가 사례 예시

한 투자자가 표본 유정 매입에 관심이 있다고 가정해 보겠습니다. 자산 소유자는 이를 180만 달러(USD)에 매각하는 데 동의했습니다. 여러분의 목표는 이 투자가 재무적으로 건전한지 파악하는 것입니다. 여러분이 더 나은 결정을 내릴 수 있도록 소유자는 다음과 같은 몇 가지 추가 정보를 제공했습니다.

  • 유정 OPEX(운영 비용): $2,000/월
  • 석유 생산세: 36%
  • 가스 생산세: 16%

또한 재무 부서에서는 분석을 위해 할인율 10%를 적용해 각각 $80/배럴과 $2.78/1,000 입방피트의 평균 석유 및 가스 가격을 고려할 것을 권장한다고 하겠습니다. 아울러 극심한 시장 변동에 직면할 경우 투자의 회복탄력성을 더욱 잘 이해하기 위해 석유 및 가스 가격에 변동성을 도입하고자 합니다.

우리는 전체적인 경제적 분석을 수행하기 위해 만든 MATLAB 함수 econAnalysis에 가격 변동성 기능을 포함시켰습니다. 이 함수는 예측 테이블 및 필수 재무 파라미터(예: 할인율, CAPEX, OPEX, 세율 등)가 포함된 MATLAB 구조체를 입력으로 받아 순현금흐름 및 누적 현금흐름, 손익분기점, 경기침체점, IRR(내부수익률)을 계산합니다. IRR 계산에는 Financial Toolbox™xirr을 사용했습니다.

수십 년 동안의 무작위 석유 및 가스 시장 가격을 플로팅하는 2개의 그래프.

그림 20. MATLAB을 사용한 석유 및 가스 가격 무작위화.

석유경제학 분석 결과

그림 21은 이 프로젝트의 결과 NPV를 보여주며 이로부터 몇 가지 결론을 도출할 수 있습니다. 첫째, 진행하기로 결정한다면 2026년 2월 11일경에 손익분기점을 달성할 수 있습니다. IRR은 프로젝트의 건전성을 나타내는 또 다른 좋은 지표입니다. 주목할 만한 또 다른 흥미로운 점은 이 프로젝트를 적어도 2053년 12월까지, 즉 거의 30년 동안 유지한다면 거의 5백만 USD의 수익을 올릴 수 있다는 것입니다. 이 분석에서는 유지 관리, 운영 비용 증가 등과 같은 관련 미래 비용을 고려하지 않으므로 낙관적인 수익에는 오해의 소지가 있을 수 있음을 유념해야 합니다. 그러나 NPV 곡선을 보면 프로젝트 시작 8년 후인 2031년 12월 31일까지 약 300만 USD의 수익을 올릴 수 있는데, 이는 166.7%의 투자 수익률에 해당합니다.

유정 매입 프로젝트에 대한 예측 누적 현금흐름을 플로팅하는 그래프로, y축은 순현재가치, x축은 예측 날짜를 나타냅니다.

그림 21. 의도한 유정 매입에 대한 결과 NPV 곡선.

소프트웨어 아키텍처 진행 상황

경제적 분석 컴포넌트가 완료되면 생산량 데이터 분석 워크플로가 완료된 것입니다. 그림 22에서 볼 수 있듯이, 석유경제학 분석 함수는 외부 유틸리티 컴포넌트를 개발하거나 통합할 필요가 없었기 때문에 이 단계에서 아키텍처는 변경되지 않았습니다. 그럼에도 불구하고 보완 모듈과 유틸리티 패키지를 추가할 수 있는 유연성은 여전히 있습니다.

데이터 분석 워크플로의 완료된 단계를 보여주는 플로우 차트.

그림 22. 생산량 데이터 분석 및 관련 MATLAB 함수 완료.

섹션

요약

본 백서에서는 석유 및 가스 생산량 데이터 분석을 자동화하기 위한 파이프 및 필터 소프트웨어 아키텍처를 개발했습니다. 워크플로의 각 단계를 분석하고 철저하게 자세히 살펴봄으로써 별도의 프로그래밍 언어로 몇 시간씩 코딩해야 했던 복잡한 작업을 MATLAB을 사용하여 어떻게 수행할 수 있었는지 보여드렸습니다.

또한 단일 함수 호출로 복잡한 작업을 완료할 수 있는 MATLAB 함수를 자동으로 생성하는 방법도 시연했습니다. 유지 관리성과 안정성 측면에서 모듈화된 소프트웨어 설계의 이점에 대해서도 설명했으며 향후 플롯과 그림을 생성하기 위한 추가 데이터 형식, 정리 기법, DCA 모델 및 기타 유틸리티 패키지가 필요할 수 있다는 점도 언급했습니다.

마지막으로, 이 백서는 입문용 자료인 만큼, 객체 지향 설계와 같은 고급 소프트웨어 설계 실무에 대해서는 의도적으로 다루지 않기로 결정했다는 점을 기억하시기 바랍니다. 하지만 MATLAB은 객체 지향 프로그래밍 언어이므로, 여러분은 본 백서에서 배운 내용을 마음껏 사용하여 클라우드 배포 및 C/C++ 코드 생성 같은 특정 활용 사례에 맞는 소프트웨어 아키텍처를 만들 수 있습니다.