2022년 7월부터 9월까지 진행한 연구 데이터 활용분석 경진대회 관련 글입니다.
제가 맡은 주요한 과제는 국민건강영양조사 데이터의 메타데이터를 연도별로 구축하는 것입니다.
메타데이터는 각 년도별 국민건강영양조사 원시자료 이용지침서를 기준으로,
1998, 2001, 2005, 2007-2009, 2010-2012, 2013,2015, 2014, 2016-2018, 2019-2020으로 나눠 구축되었습니다.
각 연도별 원시자료 이용지침서를 바탕으로 엑셀파일에 “변수명, 변수설명, 내용”컬럼의 내용들을 복사하여 붙여줍니다.
(맥북은 한글파일 작업을 못해 한글파일 작업하기 번거롭다..)
이용지침서에 없는 변수명을 다른 년도의 이용지침서를 참고하여 보강했습니다.
1차로 필요 데이터를 가공합니다.
“변수명, 변수설명, 내용” 컬럼 데이터 중 데이터분석에 중요하지 않은 내용들을 etc라는 컬럼에 저장합니다.
(“내용” 컬럼 데이터에 “\xa0” 나 여러 자세한 설명들이 기재되어 있어 코드가 점점 늘어납니다.)
etc
2차로 선택지 설명 컬럼 데이터를 가공합니다.
“내용” 컬럼을 “선택지_설명”으로 이름을 바꿔줍니다.
각 데이터가 없을 경우 nan, NaN으로 같은 nan값이 다른 모습으로 나타나 있어 통일시켜 주고, 각 선택지를 ,에서 |로 구분합니다.
최종 데이터를 병합하여 엑셀파일로 다시 저장해줍니다.
다른 년도의 메타데이터는 코드내용이 각각 달라, 대회에서 주로 활용한 2019-2020년도 메타데이터 구축 코드 첨부하였습니다.
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
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
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
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
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')
장려상
지금 다시 돌아보면 제가 역량적으로 부족한 부분이 많았음을 알게 된 프로젝트였고,
각자의 자리에서 최선을 다 한 팀원들에게 감사합니다.
댓글