202209 2022 연구데이터 활용분석 경진대회 1

목록으로 돌아가기

Summary

Description

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

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

메타데이터는 각 년도별 국민건강영양조사 원시자료 이용지침서를 기준으로, 1998, 2001, 2005, 2007-2009, 2010-2012, 2013,2015, 2014, 2016-2018, 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]})])
            #variable.append({'변수명': lis[0],'변수설명':lis[1],'내용':lis[2:],'etc':col},ignore_index=True)
            #variable.loc[j-1]=[lis[0],lis[1],lis[2:],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

댓글