ChatGPT를 활용한 Power BI 문제 해결 방법1(테이블 확장시 ‘열을 찾을 수 없습니다’)

들어가며

Power BI 데이터 분석 중 발생하는 문제를 해결하는 데 있어, 전통적으로 구글 검색을 활용해 왔습니다. 그러나 최근 ChatGPT의 등장으로, 많은 사용자들이 이전보다 더 효율적인 문제 해결 방식을 찾아 ChatGPT를 선호하게 되었습니다. 물론, ChatGPT만으로 모든 문제를 해결할 수 있는 것은 아니며, 때때로 구글 검색을 통해 해결해야 할 경우도 있습니다. 이 글은 특히 Power BI 사용자들 사이에서 아직 널리 알려지지 않은 ChatGPT의 활용법을 공유하려는 목적으로 작성되었습니다. Microsoft와의 연관성을 고려할 때, ChatGPT는 Power BI와의 호환성이 특히 뛰어난 것으로 예상됩니다.

아직 이전 포스팅을 읽지 않으신 분들은 아래를 참고하시기 바랍니다.

아파트 실거래가 파워BI 분석(1): OPEN API 승인 받기

XML문서 만들기

공공데이터포털_아파트매매실거래가_미리보기
공공데이터포털_아파트매매실거래가_미리보기


다음은 국토교통부_아파트 매매 자료 에대한 미리보기 예시 입니다. 요청변수(Request Parameter) 초기값은 LAWD_CD 11110, DEAL_YMD 201512 입니다. 즉 요청변수에 11110, 201512 두 값을 넣고 미리보기를 하였을 때, 나타나는 XML문서 입니다.

공공데이터포털실거래가OPEN-API사용신청방법17
공공데이터포털실거래가OPEN-API사용신청방법17

XML문서의 가장 상위에 있는 아래 문구를 제외하고, 나머지 부분을 복사합니다.

This XML file does not appear to have any style information associated with it. The document tree is shown below.

그리고 메모장을 열어서 붙여넣기 한 다음 11110-201212.xml 이라는 이름으로 저장합니다.

xml파일-다른이름으로저장하기
xml파일-다른이름으로저장하기

붙여넣기 한 내용은 현재 시점 2024-03-06 일자 기준으로 아래와 같을 것 입니다.

여기서 Power BI로 본 XML파일을 불러오기(Import) 하였을 때, 문제가 되는 컬럼은 거래유형, 동, 등기일자, 매도자, 매수자, 해제사유발생일, 해제여부Data가 비어있는 컬럼들 입니다.


<response>
<script/>
<header>
<resultCode>00</resultCode>
<resultMsg>NORMAL SERVICE.</resultMsg>
</header>
<body>
<items>
<item>
<거래금액> 82,500</거래금액>
<거래유형> </거래유형>
<건축년도>2008</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 사직동</법정동>
<아파트>광화문스페이스본(101동~105동)</아파트>
<월>12</월>
<일>10</일>
<전용면적>94.51</전용면적>
<중개사소재지> </중개사소재지>
<지번>9</지번>
<지역코드>11110</지역코드>
<층>11</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 60,000</거래금액>
<거래유형> </거래유형>
<건축년도>1981</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 당주동</법정동>
<아파트>롯데미도파광화문빌딩</아파트>
<월>12</월>
<일>22</일>
<전용면적>149.95</전용면적>
<중개사소재지> </중개사소재지>
<지번>145</지번>
<지역코드>11110</지역코드>
<층>8</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 130,000</거래금액>
<거래유형> </거래유형>
<건축년도>2004</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 내수동</법정동>
<아파트>킹스매너</아파트>
<월>12</월>
<일>8</일>
<전용면적>194.43</전용면적>
<중개사소재지> </중개사소재지>
<지번>110-15</지번>
<지역코드>11110</지역코드>
<층>6</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 105,000</거래금액>
<거래유형> </거래유형>
<건축년도>2004</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 내수동</법정동>
<아파트>경희궁의아침2단지</아파트>
<월>12</월>
<일>14</일>
<전용면적>124.17</전용면적>
<중개사소재지> </중개사소재지>
<지번>71</지번>
<지역코드>11110</지역코드>
<층>8</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 120,000</거래금액>
<거래유형> </거래유형>
<건축년도>2003</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 내수동</법정동>
<아파트>경희궁파크팰리스</아파트>
<월>12</월>
<일>24</일>
<전용면적>146.33</전용면적>
<중개사소재지> </중개사소재지>
<지번>95</지번>
<지역코드>11110</지역코드>
<층>4</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 17,000</거래금액>
<거래유형> </거래유형>
<건축년도>2014</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 연건동</법정동>
<아파트>이화에수풀</아파트>
<월>12</월>
<일>17</일>
<전용면적>16.98</전용면적>
<중개사소재지> </중개사소재지>
<지번>195-10</지번>
<지역코드>11110</지역코드>
<층>8</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 17,000</거래금액>
<거래유형> </거래유형>
<건축년도>2014</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 연건동</법정동>
<아파트>이화에수풀</아파트>
<월>12</월>
<일>18</일>
<전용면적>16.98</전용면적>
<중개사소재지> </중개사소재지>
<지번>195-10</지번>
<지역코드>11110</지역코드>
<층>4</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 57,000</거래금액>
<거래유형> </거래유형>
<건축년도>2006</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 명륜1가</법정동>
<아파트>렉스빌</아파트>
<월>12</월>
<일>29</일>
<전용면적>106.98</전용면적>
<중개사소재지> </중개사소재지>
<지번>19</지번>
<지역코드>11110</지역코드>
<층>3</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 44,000</거래금액>
<거래유형> </거래유형>
<건축년도>1995</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 명륜2가</법정동>
<아파트>아남1</아파트>
<월>12</월>
<일>1</일>
<전용면적>84.8</전용면적>
<중개사소재지> </중개사소재지>
<지번>4</지번>
<지역코드>11110</지역코드>
<층>18</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 52,000</거래금액>
<거래유형> </거래유형>
<건축년도>1995</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 명륜2가</법정동>
<아파트>아남1</아파트>
<월>12</월>
<일>10</일>
<전용면적>84.9</전용면적>
<중개사소재지> </중개사소재지>
<지번>4</지번>
<지역코드>11110</지역코드>
<층>12</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 49,800</거래금액>
<거래유형> </거래유형>
<건축년도>1995</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 명륜2가</법정동>
<아파트>아남1</아파트>
<월>12</월>
<일>19</일>
<전용면적>84.8</전용면적>
<중개사소재지> </중개사소재지>
<지번>4</지번>
<지역코드>11110</지역코드>
<층>1</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 41,000</거래금액>
<거래유형> </거래유형>
<건축년도>1999</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 명륜2가</법정동>
<아파트>명륜동주상복합아남아파트</아파트>
<월>12</월>
<일>19</일>
<전용면적>61.13</전용면적>
<중개사소재지> </중개사소재지>
<지번>237</지번>
<지역코드>11110</지역코드>
<층>7</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 41,000</거래금액>
<거래유형> </거래유형>
<건축년도>1999</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>두산</아파트>
<월>12</월>
<일>2</일>
<전용면적>59.95</전용면적>
<중개사소재지> </중개사소재지>
<지번>232</지번>
<지역코드>11110</지역코드>
<층>9</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 19,500</거래금액>
<거래유형> </거래유형>
<건축년도>1966</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>동대문</아파트>
<월>12</월>
<일>3</일>
<전용면적>28.8</전용면적>
<중개사소재지> </중개사소재지>
<지번>328-17</지번>
<지역코드>11110</지역코드>
<층>6</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 39,900</거래금액>
<거래유형> </거래유형>
<건축년도>2003</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>창신이수</아파트>
<월>12</월>
<일>3</일>
<전용면적>68.06</전용면적>
<중개사소재지> </중개사소재지>
<지번>23-816</지번>
<지역코드>11110</지역코드>
<층>8</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 20,800</거래금액>
<거래유형> </거래유형>
<건축년도>1966</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>동대문</아파트>
<월>12</월>
<일>7</일>
<전용면적>28.8</전용면적>
<중개사소재지> </중개사소재지>
<지번>328-17</지번>
<지역코드>11110</지역코드>
<층>3</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 27,200</거래금액>
<거래유형> </거래유형>
<건축년도>1993</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>창신쌍용2</아파트>
<월>12</월>
<일>7</일>
<전용면적>64.66</전용면적>
<중개사소재지> </중개사소재지>
<지번>703</지번>
<지역코드>11110</지역코드>
<층>3</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 39,000</거래금액>
<거래유형> </거래유형>
<건축년도>1999</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>두산</아파트>
<월>12</월>
<일>10</일>
<전용면적>59.95</전용면적>
<중개사소재지> </중개사소재지>
<지번>232</지번>
<지역코드>11110</지역코드>
<층>14</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 39,950</거래금액>
<거래유형> </거래유형>
<건축년도>1993</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>창신쌍용2</아파트>
<월>12</월>
<일>11</일>
<전용면적>115.53</전용면적>
<중개사소재지> </중개사소재지>
<지번>703</지번>
<지역코드>11110</지역코드>
<층>2</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 34,500</거래금액>
<거래유형> </거래유형>
<건축년도>1992</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>창신쌍용1</아파트>
<월>12</월>
<일>12</일>
<전용면적>79.87</전용면적>
<중개사소재지> </중개사소재지>
<지번>702</지번>
<지역코드>11110</지역코드>
<층>5</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 37,000</거래금액>
<거래유형> </거래유형>
<건축년도>1992</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>창신쌍용1</아파트>
<월>12</월>
<일>14</일>
<전용면적>79.87</전용면적>
<중개사소재지> </중개사소재지>
<지번>702</지번>
<지역코드>11110</지역코드>
<층>3</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 42,800</거래금액>
<거래유형> </거래유형>
<건축년도>1992</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>창신쌍용1</아파트>
<월>12</월>
<일>22</일>
<전용면적>106.62</전용면적>
<중개사소재지> </중개사소재지>
<지번>702</지번>
<지역코드>11110</지역코드>
<층>12</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 37,300</거래금액>
<거래유형> </거래유형>
<건축년도>1992</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>창신쌍용1</아파트>
<월>12</월>
<일>23</일>
<전용면적>79.87</전용면적>
<중개사소재지> </중개사소재지>
<지번>702</지번>
<지역코드>11110</지역코드>
<층>9</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 50,000</거래금액>
<거래유형> </거래유형>
<건축년도>1999</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 창신동</법정동>
<아파트>두산</아파트>
<월>12</월>
<일>24</일>
<전용면적>84.9</전용면적>
<중개사소재지> </중개사소재지>
<지번>232</지번>
<지역코드>11110</지역코드>
<층>4</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 12,300</거래금액>
<거래유형> </거래유형>
<건축년도>2013</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로아인스빌</아파트>
<월>12</월>
<일>2</일>
<전용면적>12.15</전용면적>
<중개사소재지> </중개사소재지>
<지번>1392-1</지번>
<지역코드>11110</지역코드>
<층>10</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 52,000</거래금액>
<거래유형> </거래유형>
<건축년도>2009</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로청계힐스테이트</아파트>
<월>12</월>
<일>3</일>
<전용면적>84.9478</전용면적>
<중개사소재지> </중개사소재지>
<지번>766</지번>
<지역코드>11110</지역코드>
<층>19</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 53,300</거래금액>
<거래유형> </거래유형>
<건축년도>2008</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로센트레빌</아파트>
<월>12</월>
<일>5</일>
<전용면적>84.92</전용면적>
<중개사소재지> </중개사소재지>
<지번>2-1</지번>
<지역코드>11110</지역코드>
<층>10</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 42,500</거래금액>
<거래유형> </거래유형>
<건축년도>2009</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로청계힐스테이트</아파트>
<월>12</월>
<일>5</일>
<전용면적>59.9426</전용면적>
<중개사소재지> </중개사소재지>
<지번>766</지번>
<지역코드>11110</지역코드>
<층>2</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 13,000</거래금액>
<거래유형> </거래유형>
<건축년도>2014</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>삼전솔하임4차</아파트>
<월>12</월>
<일>8</일>
<전용면적>15.09</전용면적>
<중개사소재지> </중개사소재지>
<지번>318-2</지번>
<지역코드>11110</지역코드>
<층>15</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 11,500</거래금액>
<거래유형> </거래유형>
<건축년도>2014</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>숭인한양LEEPS</아파트>
<월>12</월>
<일>8</일>
<전용면적>12.78</전용면적>
<중개사소재지> </중개사소재지>
<지번>1421-2</지번>
<지역코드>11110</지역코드>
<층>10</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 27,000</거래금액>
<거래유형> </거래유형>
<건축년도>1997</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>동문(비동,씨동)(494-0)</아파트>
<월>12</월>
<일>9</일>
<전용면적>59.94</전용면적>
<중개사소재지> </중개사소재지>
<지번>494</지번>
<지역코드>11110</지역코드>
<층>3</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 44,900</거래금액>
<거래유형> </거래유형>
<건축년도>2009</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로청계힐스테이트</아파트>
<월>12</월>
<일>14</일>
<전용면적>59.9426</전용면적>
<중개사소재지> </중개사소재지>
<지번>766</지번>
<지역코드>11110</지역코드>
<층>12</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 11,900</거래금액>
<거래유형> </거래유형>
<건축년도>2014</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>숭인한양LEEPS</아파트>
<월>12</월>
<일>14</일>
<전용면적>12.78</전용면적>
<중개사소재지> </중개사소재지>
<지번>1421-2</지번>
<지역코드>11110</지역코드>
<층>11</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 10,500</거래금액>
<거래유형> </거래유형>
<건축년도>2013</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>익성씨티하임</아파트>
<월>12</월>
<일>15</일>
<전용면적>15.76</전용면적>
<중개사소재지> </중개사소재지>
<지번>1392</지번>
<지역코드>11110</지역코드>
<층>13</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 10,000</거래금액>
<거래유형> </거래유형>
<건축년도>2013</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>익성씨티하임</아파트>
<월>12</월>
<일>15</일>
<전용면적>14.48</전용면적>
<중개사소재지> </중개사소재지>
<지번>1392</지번>
<지역코드>11110</지역코드>
<층>14</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 42,500</거래금액>
<거래유형> </거래유형>
<건축년도>2008</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로센트레빌</아파트>
<월>12</월>
<일>19</일>
<전용면적>59.92</전용면적>
<중개사소재지> </중개사소재지>
<지번>2-1</지번>
<지역코드>11110</지역코드>
<층>12</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 39,700</거래금액>
<거래유형> </거래유형>
<건축년도>2008</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로센트레빌</아파트>
<월>12</월>
<일>22</일>
<전용면적>59.92</전용면적>
<중개사소재지> </중개사소재지>
<지번>2-1</지번>
<지역코드>11110</지역코드>
<층>1</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 52,300</거래금액>
<거래유형> </거래유형>
<건축년도>2008</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로센트레빌</아파트>
<월>12</월>
<일>26</일>
<전용면적>84.92</전용면적>
<중개사소재지> </중개사소재지>
<지번>2-1</지번>
<지역코드>11110</지역코드>
<층>12</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 10,800</거래금액>
<거래유형> </거래유형>
<건축년도>2013</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로유케이201</아파트>
<월>12</월>
<일>31</일>
<전용면적>12.01</전용면적>
<중개사소재지> </중개사소재지>
<지번>201-11</지번>
<지역코드>11110</지역코드>
<층>7</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 52,500</거래금액>
<거래유형> </거래유형>
<건축년도>2009</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 숭인동</법정동>
<아파트>종로청계힐스테이트</아파트>
<월>12</월>
<일>31</일>
<전용면적>84.9478</전용면적>
<중개사소재지> </중개사소재지>
<지번>766</지번>
<지역코드>11110</지역코드>
<층>11</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 44,600</거래금액>
<거래유형> </거래유형>
<건축년도>1995</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 교북동</법정동>
<아파트>동아</아파트>
<월>12</월>
<일>7</일>
<전용면적>84.28</전용면적>
<중개사소재지> </중개사소재지>
<지번>101</지번>
<지역코드>11110</지역코드>
<층>10</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 115,000</거래금액>
<거래유형> </거래유형>
<건축년도>2004</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 평창동</법정동>
<아파트>벽산블루밍평창힐스</아파트>
<월>12</월>
<일>2</일>
<전용면적>210.53</전용면적>
<중개사소재지> </중개사소재지>
<지번>45</지번>
<지역코드>11110</지역코드>
<층>2</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 164,500</거래금액>
<거래유형> </거래유형>
<건축년도>2009</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 평창동</법정동>
<아파트>롯데캐슬로잔</아파트>
<월>12</월>
<일>3</일>
<전용면적>219.775</전용면적>
<중개사소재지> </중개사소재지>
<지번>108</지번>
<지역코드>11110</지역코드>
<층>3</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 31,500</거래금액>
<거래유형> </거래유형>
<건축년도>1998</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 평창동</법정동>
<아파트>삼성</아파트>
<월>12</월>
<일>6</일>
<전용면적>59.97</전용면적>
<중개사소재지> </중개사소재지>
<지번>596</지번>
<지역코드>11110</지역코드>
<층>9</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 39,490</거래금액>
<거래유형> </거래유형>
<건축년도>2000</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 무악동</법정동>
<아파트>현대</아파트>
<월>12</월>
<일>12</일>
<전용면적>60</전용면적>
<중개사소재지> </중개사소재지>
<지번>82</지번>
<지역코드>11110</지역코드>
<층>15</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 63,490</거래금액>
<거래유형> </거래유형>
<건축년도>2000</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 무악동</법정동>
<아파트>현대</아파트>
<월>12</월>
<일>15</일>
<전용면적>114.9</전용면적>
<중개사소재지> </중개사소재지>
<지번>82</지번>
<지역코드>11110</지역코드>
<층>6</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 62,000</거래금액>
<거래유형> </거래유형>
<건축년도>2008</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 무악동</법정동>
<아파트>인왕산아이파크</아파트>
<월>12</월>
<일>16</일>
<전용면적>84.858</전용면적>
<중개사소재지> </중개사소재지>
<지번>60</지번>
<지역코드>11110</지역코드>
<층>5</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 63,400</거래금액>
<거래유형> </거래유형>
<건축년도>2015</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 무악동</법정동>
<아파트>인왕산2차아이파크</아파트>
<월>12</월>
<일>22</일>
<전용면적>84.0284</전용면적>
<중개사소재지> </중개사소재지>
<지번>88</지번>
<지역코드>11110</지역코드>
<층>10</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
<item>
<거래금액> 61,000</거래금액>
<거래유형> </거래유형>
<건축년도>2008</건축년도>
<년>2015</년>
<동> </동>
<등기일자> </등기일자>
<매도자> </매도자>
<매수자> </매수자>
<법정동> 무악동</법정동>
<아파트>인왕산아이파크</아파트>
<월>12</월>
<일>25</일>
<전용면적>84.858</전용면적>
<중개사소재지> </중개사소재지>
<지번>60</지번>
<지역코드>11110</지역코드>
<층>13</층>
<해제사유발생일> </해제사유발생일>
<해제여부> </해제여부>
</item>
</items>
<numOfRows>10</numOfRows>
<pageNo>1</pageNo>
<totalCount>49</totalCount>
</body>
</response>

Power BI로 XML 문서 가져오기

거래유형, 동, 등기일자, 매도자, 매수자, 해제사유발생일, 해제여부Data가 비어있는 컬럼들이 Power BI로 불려오기 할 때, 어떠한 부분이 문제가 되는지 살펴보도록 하겠습니다.

데이터가져오기

데이터가져오기 선택팝업
데이터가져오기 선택팝업
xml문서 가져오기
xml문서 가져오기
xml문서 열기
xml문서 열기

데이터 변환

데이터변환 하기를 클릭하면, Power Query Editor (파워쿼리편집기) 창이 열리게 됩니다.

xml문서 데이터변환
xml문서 데이터변환

Power Query Editor (파워쿼리편집기) 창이 열린 후, body 컬럼 선택 후 다른 열 제거 합니다.

body외 다른열제거
body외 다른열제거

body컬럼 오른쪽 끝에 있는 양쪽화살표시테이블 확장하기 아이콘을 클릭합니다.

여기서 우리가 반드시 알아야 할 점은 이러한 UI(리본메뉴, 각종 버튼 등등)를 작동하고 있는 가운데 Power Query Editor (파워쿼리편집기)는 끊임없이 Power Query M 코드를 작성하고 있다는 사실입니다.

즉 Power Query Editor (파워쿼리편집기)는 이러한 Power Query M 코드를 쉽게 작성할 수 있도록 도와 주는 도구라고 생각하면 맞을 것 입니다.

body테이블 확장하기 UI
body테이블 확장하기 UI

아무튼 테이블 확장 버튼을 클릭하면 아래 그림처럼 테이블 속에 있는 열이름들이 나오게 되고, 여기서 원래 열 이름을 접두사로 사용 체크 해제합니다.

body확장하기
body확장하기

확장된 내용중 items 컬럼이 있으며, 해당 컬럼을 선택후 우클릭 > 다른 열 제거 합니다.

items컬럼외 다른열제거
items컬럼외 다른열제거

역시 items컬럼은 Table로 이루어져 있기 때문에 역시 테이블 확장하기 버튼을 클릭합니다.

items확장하기
items확장하기

items > item 안에 드디어 우리가 원하던 정보들이 있는 것을 확인할 수 있습니다.

item테이블확장하기
item테이블확장하기

이런 정보들 중 거래유형, 동, 등기일자, 매도자, 매수자, 해제사유발생일, 해제여부 등 컬럼들은 Table로 이루어져 있기 때문에 역시 확장하기 버튼을 클릭해 주어야 합니다.

그렇지만 이전 처럼 다르게 열을 찾을 수 없습니다. 라는 메세지만 나올 뿐, 기존 처럼 정보가 담겨있는 열(컬럼)을 만날 수 없음을 깨닫게 됩니다.

열을찾을수없습니다
열을찾을수없습니다

바로 이 문제를 ChatGPT로 해결해 보도록 하겠습니다. ChatGPT 이전에는 당연히 구글링으로 해결 하였을 것입니다. 하지만 ChatGPT 등장 이후 이러한 문제들은 당연히 ChatGPT로 해결하게 되었습니다.

ChatGPT로 문제 해결하기

요즘 구글링 없이는 문제 해결이란 상상도 못 하겠죠? 특히 Power BI 같은 거 어렵게 느껴지는 도구 쓸 때는 더 그렇고요. 영어 문서를 마주할 때면, 번역기 돌려가며 뭐라도 찾아보려 애쓰는 상황, 다들 한 번쯤은 겪어보셨을 거예요. 그런데 말이죠, ChatGPT 등장 이후로 이 모든 게 조금 달라졌습니다.

ChatGPT랑 대화하듯 프롬프트 해결해 나가는 게 가능해졌습니다. 그냥 프롬프트 던지면 되니까, 웹 서핑하며 정답 찾는 수고로움도 줄어들고, 영어 때문에 골치 아파할 일도 줄어들었습니다. 물론 아직은 구글링을 완전히 대체하진 못합니다. 아직까지는 ChatGPT가 모르는 것도 많으니까요. 그래도 Power BI 관련해서, 또는 데이터 분석하다가 막힌 부분에 대해 프롬프트 하면, 생각보다 적절하고 유용한 답변을 주는 경우가 많습니다.

진짜 편리한 건, ChatGPT가 여러 언어로 대답해준다는 겁니다. 영어로 된 자료를 한국어로 번역하느라 생기는 오해의 소지도 줄어들고, 무엇보다도 내가 이해하기 쉽게 설명해주니까 문제 해결하는 속도가 훨씬 빨라지더라고요. 그래서 요즘은 Power BI 쓸 때 궁금한 점이 생기면 바로 ChatGPT에게 프롬프트 하는 편입니다.

아, 물론 이 모든 걸 써보면서 느낀 건데, ChatGPT에게 잘 프롬프트 하려면 어떻게 질문을 구성해야 하는지도 좀 알아야 합니다. 처음엔 몇 번 실패도 겪고, ‘이게 정말 도움이 되나?’ 싶을 때도 있었는데, 프롬프트를 어떻게 하느냐에 따라 답변의 질이 확 달라지더라고요. 여튼, 이런 경험들을 통해 조금씩 더 나은 프롬프트를 만들어가는 중입니다. 프롬프트에 따라서 ChatGPT의 능력은 훨씬 달라지게 되니까요.

프롬프트(prompt) 작성하기

Power BI 문제해결을 위한 ChatGPT사용
Power BI 문제해결을 위한 ChatGPT사용

ChatGPT로 문제를 해결하기 위해서는 프롬프트(prompt)를 잘 작성해야 합니다. 이 프롬프트를 어떻게 작성하는지 따라서 ChatGPT가 답해주는 내용은 아주 많이 달라지는 편입니다.

프롬프트(prompt)는 ChatGPT에게 던지는 질문이라고 보면 됩니다. 제대로 된 질문을 하여야 우리가 기대하는 문제에 대한 올바른 답을 ChatGPT가 제시해 주게 될 것 입니다.

아래는 ChatGPT에게 던지는 첫번째 프롬프트 입니다. 이제 까지 기록된 power query M 코드를 고급편집기를 열어서 복사한 후 아래 처럼 붙여넣기 합니다. 그리고 이후 부터 문제해결에 단초가 될 만 한 사항들을 서술해 줍니다.

```
let
    원본 = Xml.Tables(File.Contents("C:\Users\Administrator\Downloads\11110-201512.xml")),
    #"변경된 유형" = Table.TransformColumnTypes(원본,{{"script", type text}}),
    #"제거된 다른 열 수" = Table.SelectColumns(#"변경된 유형",{"body"}),
    body = #"제거된 다른 열 수"{0}[body],
    #"변경된 유형1" = Table.TransformColumnTypes(body,{{"numOfRows", Int64.Type}, {"pageNo", Int64.Type}, {"totalCount", Int64.Type}}),
    #"제거된 다른 열 수1" = Table.SelectColumns(#"변경된 유형1",{"items"}),
    #"확장된 items" = Table.ExpandTableColumn(#"제거된 다른 열 수1", "items", {"item"}, {"item"}),
    #"확장된 item" = Table.ExpandTableColumn(#"확장된 items", "item", {"거래금액", "거래유형", "건축년도", "년", "동", "등기일자", "매도자", "매수자", "법정동", "아파트", "월", "일", "전용면적", "중개사소재지", "지번", "지역코드", "층", "해제사유발생일", "해제여부"}, {"거래금액", "거래유형", "건축년도", "년", "동", "등기일자", "매도자", "매수자", "법정동", "아파트", "월", "일", "전용면적", "중개사소재지", "지번", "지역코드", "층", "해제사유발생일", "해제여부"})
in
    #"확장된 item"
```
위 코드에서 다음 조건을 처리하는 코드를 추가하고 싶다.

조건 1: _ (거래유형 열의 각 값)이 테이블 형태인 경우, 두 가지 하위 조건을 확인합니다:
하위 조건 1: 해당 테이블이 비어 있다면 (Table.IsEmpty(_) == true), 빈 문자열 ("")로 대체합니다.
하위 조건 2: 비어 있지 않다면, Table.FirstValue(_)를 사용하여 테이블의 첫 번째 값을 가져옵니다.
조건 2: 현재 값이 테이블이 아닌 경우, 값을 변경하지 않고 그대로 둡니다.

위 조건을 수행하는 코드를 추가해서 전체 코드를 완성해줘

위 프롬프트에서 가장 중요한 부분은 조건을 설명하고 있는 부분입니다. 사실 이 조건들 즉 경우의 수를 알아가는 것이 데이터 분석의 처음이자 끝이라고 해도 과언이 아닐 것 입니다. 전개될 경우의 수를 알아야 조건에 따른 해결책을 제시할 수 있습니다. 이렇게 전개될 수 있는 경우의 수를 나열하고 이에 대한 해결 방안을 제시하는 글쓰기가 바로 코딩이라고 생각하면 됩니다. 완성된 코딩은 물론 하나의 프로그램이 되구요.

워크플로위에서작성한문제해결을위한조건문초안
워크플로위에서작성한문제해결을위한조건문초안

아무튼 위 조건이 나오게 된 배경은 다음과 같습니다.

비교적 최근에 추가된 거래유형,동,등기일자,매도자,매수자,중개사소재지,해제사유발생일,해제여부 컬럼들의 특성을 알아야 합니다.

우선 처음(매매실거래가 시작되는 2006년01월) 부터 존재하는 컬럼이 아니기 때문에 생겨난 시점 이전에는 컬럼은 있지만 빈값으로 존재합니다. 그러다가 생겨난 시점 이후 부터 Data가 있습니다. 하지만 모두 있는 것도 아닙니다. 중간 중간 빈값들은 여전히 존재합니다. 따라서 반드시 값들이 존재하는 컬럼이 아니라는 사실 입니다.

그리고 xml문서를 살펴보면 상위태그(상위요소)속에 하위태그(하위요소)들이 있는 형태를 하고 있는데 이는 Power BI에서는 Table로 표현이 됩니다. 이것은 빈값 이여도 Table로 표현이 되는데, 문제는 해당 xml속 컬럼 전체가 빈값 이라면 power bi에서 아래 처럼 확장하기 기능이 작동하지 않는 것을 알 수 있습니다.

열을찾을수없습니다
열을찾을수없습니다

따라서 이 부분은 부득이 Power Query Editor(파워쿼리편집기)의 UI로 해결할 수 없는 부분이고, 결국 Power Query M 코드를 직접 작성해서 해결해야 하는 문제입니다. 이전 포스팅에서도 설명을 드렸듯이 Power Query Editor(파워쿼리편집기)의 각종 리본메뉴 및 도구들은 Power Query M 코드를 잘 알 지 못하더라도 사용자들이 불편함 없이 Power Query M 코드를 작성할 수 있도록 만든 UI(유저인터페이스)들 입니다.

이 문제를 해결하기 위해서 ChatGPT에 던졌던 질문(프롬프트:prompt) 그리고 ChatGPT답변을 아래와 같이 공유합니다.

ChatGPT_열을찾을수없습니다_문제해결

https://chat.openai.com/share/45e16756-efba-497f-83bd-424584e07c0b

let
    원본 = Xml.Tables(File.Contents("C:\Users\Administrator\Downloads\11110-201512.xml")),
    #"변경된 유형" = Table.TransformColumnTypes(원본,{{"script", type text}}),
    #"제거된 다른 열 수" = Table.SelectColumns(#"변경된 유형",{"body"}),
    body = #"제거된 다른 열 수"{0}[body],
    #"변경된 유형1" = Table.TransformColumnTypes(body,{{"numOfRows", Int64.Type}, {"pageNo", Int64.Type}, {"totalCount", Int64.Type}}),
    #"제거된 다른 열 수1" = Table.SelectColumns(#"변경된 유형1",{"items"}),
    #"확장된 items" = Table.ExpandTableColumn(#"제거된 다른 열 수1", "items", {"item"}, {"item"}),
    #"확장된 item" = Table.ExpandTableColumn(#"확장된 items", "item", {"거래금액", "거래유형", "건축년도", "년", "동", "등기일자", "매도자", "매수자", "법정동", "아파트", "월", "일", "전용면적", "중개사소재지", "지번", "지역코드", "층", "해제사유발생일", "해제여부"}, {"거래금액", "거래유형", "건축년도", "년", "동", "등기일자", "매도자", "매수자", "법정동", "아파트", "월", "일", "전용면적", "중개사소재지", "지번", "지역코드", "층", "해제사유발생일", "해제여부"}),

    // 조건 1 및 2를 모든 열에 적용
    조건1및2적용 = Table.TransformColumns( #"확장된 item", {
        {"거래유형", each if Value.Is(_, type table) then if Table.IsEmpty(_) then "" else Table.FirstValue(_) else _},
        {"동", each if Value.Is(_, type table) then if Table.IsEmpty(_) then "" else Table.FirstValue(_) else _},
        {"등기일자", each if Value.Is(_, type table) then if Table.IsEmpty(_) then "" else Table.FirstValue(_) else _},
        {"매도자", each if Value.Is(_, type table) then if Table.IsEmpty(_) then "" else Table.FirstValue(_) else _},
        {"매수자", each if Value.Is(_, type table) then if Table.IsEmpty(_) then "" else Table.FirstValue(_) else _},
        {"중개사소재지", each if Value.Is(_, type table) then if Table.IsEmpty(_) then "" else Table.FirstValue(_) else _},
        {"해제사유발생일", each if Value.Is(_, type table) then if Table.IsEmpty(_) then "" else Table.FirstValue(_) else _},
        {"해제여부", each if Value.Is(_, type table) then if Table.IsEmpty(_) then "" else Table.FirstValue(_) else _}
    })
in
    조건1및2적용

위 코드를 복사하여 고급편집기를 열어서 적당한 위치에 붙여넣기 해줍니다.

마치며

이 글에서는 ChatGPT를 활용하여 Power BI의 특정 문제, 예를 들어 ‘테이블 확장 시 열을 찾을 수 없음’ 에러를 해결하는 과정을 소개했습니다. 중요한 점은, 효과적인 문제 해결을 위해선 적절한 프롬프트 작성이 필수적이라는 것입니다. 제 경험이 Power BI 사용자들에게 실질적인 도움이 되길 바랍니다.

1 개 댓글

Leave a Comment