2022 연구데이터 활용분석 경진대회 활동 회고 & 코드 리뷰

목록으로 돌아가기

Summary


Description

2022년 7월부터 9월까지 진행한 연구 데이터 활용분석 경진대회 관련 글입니다.

제가 맡은 주요한 과제는 국민건강영양조사 데이터의 메타데이터를 연도별로 구축하는 것입니다.

메타데이터는 각 년도별 국민건강영양조사 원시자료 이용지침서를 기준으로,

1998, 2001, 2005, 2007-2009, 2010-2012, 2013,2015, 2014, 2016-2018, 2019-2020으로 나눠 구축되었습니다.


workflow

  1. 각 연도별 원시자료 이용지침서를 바탕으로 엑셀파일에 “변수명, 변수설명, 내용”컬럼의 내용들을 복사하여 붙여줍니다.

    (맥북은 한글파일 작업을 못해 한글파일 작업하기 번거롭다..)

    이용지침서에 없는 변수명을 다른 년도의 이용지침서를 참고하여 보강했습니다.

  2. 1차로 필요 데이터를 가공합니다.

    “변수명, 변수설명, 내용” 컬럼 데이터 중 데이터분석에 중요하지 않은 내용들을 etc라는 컬럼에 저장합니다.
    (“내용” 컬럼 데이터에 “\xa0” 나 여러 자세한 설명들이 기재되어 있어 코드가 점점 늘어납니다.)

    etc

  3. 2차로 선택지 설명 컬럼 데이터를 가공합니다.

    “내용” 컬럼을 “선택지_설명”으로 이름을 바꿔줍니다.

    각 데이터가 없을 경우 nan, NaN으로 같은 nan값이 다른 모습으로 나타나 있어 통일시켜 주고, 각 선택지를 ,에서 |로 구분합니다.

  4. 최종 데이터를 병합하여 엑셀파일로 다시 저장해줍니다.



다른 년도의 메타데이터는 코드내용이 각각 달라, 대회에서 주로 활용한 2019-2020년도 메타데이터 구축 코드 첨부하였습니다.


Contents

필요 모듈 임포트

import pandas as pd
import numpy as np

필요 데이터 가공

df=pd.read_excel('/Users/i/Downloads/variable.xlsx',sheet_name='2019-2020')
variable=pd.DataFrame({'변수명':[],'변수설명':[],'내용':[],'etc':[]})
df2=df[['변수명','변수설명','내용']]
df2
변수명 변수설명 내용
0 mod_d 최종 DB 수정일 NaN
1 ID 개인 아이디 NaN
2 ID_fam 가구 아이디 NaN
3 year 조사연도 NaN
4 region 17개 시도 1. 서울
... ... ... ...
3211 HE_prg 임신여부 0. 아니오
3212 NaN NaN 1. 예
3213 NaN NaN 8. 비해당(남자)
3214 HE_dprg 임신개월수 □□ 개월
3215 wt_oent (건강설문(건강면접/건강행태) OR 검진) AND 영양 연관성분석 가중치 NaN

3216 rows × 3 columns

1차 데이터 생성 ( 데이터 전처리 )

lis=[]
col=[]
for j in range(len(df2)):
    data1 = df2.loc[j][0]
    data2 = df2.loc[j][1]
    data3 = df2.loc[j][2]
    if j==0:
        lis.append(data1)
        lis.append(data2)
        lis.append(data3)
    else:
        if df2.loc[j][0] == data1: #변수명에 값이 있다면  #변수명, 변수설명 추가 
            variable = pd.concat([variable,pd.DataFrame({'변수명': [lis[0]],'변수설명':[lis[1]],'내용':[lis[2:]],'etc':[col]})])
            lis=[] #변수명, 변수설명, 내용
            col=[] #기타
            lis.append(data1) #변수명 
            lis.append(data2) #변수설명
            if df2.loc[j][2] != data3: #내용이 없다면
                continue #계속 
            elif df2.loc[j][2] == data3: #있다면
                if (data3[0].isdigit()==True and not data3.startswith('1일') and '.' in data3) or (data3.startswith(' ')):
                    data3=data3.replace(". "," : ")
                    data3=data3.replace("\xa0","")
                    lis.append(data3) #리스트에 일단 저장
                elif data3.startswith('(청'):
                    lis[-1]+=data3
                elif data3.startswith('1일'):
                    col.append(data3)
                else:
                    col.append(data3)

        elif df2.loc[j][0] != data1: #변수명에 값이 없다면
            if type(data3)==str:
                if (data3[0].isdigit()==True and '.' in data3) or (data3.startswith(' ')):
                    data3=data3.replace(". "," : ")
                    data3=data3.replace("\xa0","")
                    lis.append(data3)
                elif data3.startswith('(청'):
                    lis[-1]+=data3
                else:
                     col.append(data3)
len(variable)
    936
variable
변수명 변수설명 내용 etc
0 mod_d 최종 DB 수정일 [nan] []
0 ID 개인 아이디 [] []
0 ID_fam 가구 아이디 [] []
0 year 조사연도 [] []
0 region 17개 시도 [1 : 서울, 2 : 부산, 3 : 대구, 4 : 인천, 5 : 광주, 6 : 대... []
... ... ... ... ...
0 HE_DMdg 당뇨병 의사진단 여부 [0 : 아니오, 1 : 예] []
0 HE_DMdr 검진당일 당뇨병 약 복용 여부 [0 : 아니오, 1 : 예] []
0 HE_mens 생리여부 [0 : 아니오, 1 : 예, 8 : 비해당(남자)] []
0 HE_prg 임신여부 [0 : 아니오, 1 : 예, 8 : 비해당(남자)] []
0 HE_dprg 임신개월수 [] [□□ 개월]

936 rows × 4 columns

2차 데이터 생성 ( 데이터 병합 )

tt=pd.DataFrame({'선택지_설명':[]})
for data in variable['내용']:
    if len(data)==0:
        data=np.nan
        tt=pd.concat([tt,pd.DataFrame({'선택지_설명':[data]})])
    elif np.nan in data:
        data=np.nan
        tt=pd.concat([tt,pd.DataFrame({'선택지_설명':[data]})])
    else:
        data=" ".join(j+" |" for j in data)
        tt=pd.concat([tt,pd.DataFrame({'선택지_설명':[data]})])
tt
선택지_설명
0 NaN
0 NaN
0 NaN
0 NaN
0 1 : 서울 | 2 : 부산 | 3 : 대구 | 4 : 인천 | 5 : 광주 | 6...
... ...
0 0 : 아니오 | 1 : 예 |
0 0 : 아니오 | 1 : 예 |
0 0 : 아니오 | 1 : 예 | 8 : 비해당(남자) |
0 0 : 아니오 | 1 : 예 | 8 : 비해당(남자) |
0 NaN

936 rows × 1 columns

최종 결과 데이터 생성 ( 1, 2차 데이터 병합 )

variable_total=pd.concat([variable,tt],axis=1)
variable_total=variable_total[['변수명','변수설명','선택지_설명','etc']]
variable_total
변수명 변수설명 선택지_설명 etc
0 mod_d 최종 DB 수정일 NaN []
0 ID 개인 아이디 NaN []
0 ID_fam 가구 아이디 NaN []
0 year 조사연도 NaN []
0 region 17개 시도 1 : 서울 | 2 : 부산 | 3 : 대구 | 4 : 인천 | 5 : 광주 | 6... []
... ... ... ... ...
0 HE_DMdg 당뇨병 의사진단 여부 0 : 아니오 | 1 : 예 | []
0 HE_DMdr 검진당일 당뇨병 약 복용 여부 0 : 아니오 | 1 : 예 | []
0 HE_mens 생리여부 0 : 아니오 | 1 : 예 | 8 : 비해당(남자) | []
0 HE_prg 임신여부 0 : 아니오 | 1 : 예 | 8 : 비해당(남자) | []
0 HE_dprg 임신개월수 NaN [□□ 개월]

936 rows × 4 columns

최종 결과 데이터 csv파일로 변환

variable_total.to_csv('hn_19_variable.csv',index=False,encoding='utf-8')
variable_total.to_csv('hn_20_variable.csv',index=False,encoding='utf-8')


결과

장려상


회고

지금 다시 돌아보면 제가 역량적으로 부족한 부분이 많았음을 알게 된 프로젝트였고,

각자의 자리에서 최선을 다 한 팀원들에게 감사합니다.

author-profile
Written by Jins

댓글