데이터 분석 미니프로젝트 진행 TIL

LSH·2023년 6월 9일
0

프로젝트 개요

한국 복지 패널 데이터를 사용한 한국 가구의 소득 현황 분석
📕 한국복지패널데이터: 한국보건사회연구원에서 가구의 경제 활동을 연구해 정책지원에 반영할 목적으로 발간하는 조사 자료

프로젝트 진행중 사용한 코드 복습 ✏️

데이터 불러오기(판다스, dta, xlsx)

  • dta, xlsx 파일을 pandas로 불러오는 방법
dta_df = pd.read_stata("file_link.dta")
xlsx_df = pd.read_excel("file_link.xlsx")

DataFrame Rename

  • 데이터 프레임의 column 값을 변경
meta1_17 = meta1[['17차 - 가구용, 가구원용, 복지인식 머지 데이터 파일'	, 'Unnamed: 50','Unnamed: 51']]
meta1_17.rename(columns = {'17차 - 가구용, 가구원용, 복지인식 머지 데이터 파일':'대구분', 
                        'Unnamed: 50': '소구분',
                        'Unnamed: 51': 'Code'},inplace = True)

Drop

  • 0번째 열을 Drop
meta1_17.drop([0],inplace = True)
  • 'Code' 컬럼이 빈 경우 drop
meta1_17.dropna(axis = 0, inplace= True, subset = ['Code'])
  • column 중 'jobcode'를 drop하고 원본에 적용
df2.drop(['jobcode'], axis=1, inplace = True)

결측치 확인 isna()

  • 결측치를 가지는 행을 반환
meta1_17[meta1_17['Code'].isna()]
  • 각 column의 결측치 갯수를 반환
df2.isna().sum()

결측치 일괄 채움

  • 지정한 데이터 프레임의 결측치를 이전 값으로 채움 fillna(method = ffill)
meta1_17['대구분'].fillna(method = 'ffill',inplace = True)

lambda를 사용하여 새 컬럼 생성

meta1_17['구분'] = meta1_17.apply(lambda x : (x['대구분']+'_'+x['소구분'])
                          if x['소구분']!='nan' 
                          else x['대구분'],
                          axis = 1)

특정 문자열을 포함한 데이터 반환

  • meta2['해당 차수'] 컬럼의 값이 '17'을 포함한 경우만 반환
meta2_17 = meta2[meta2['해당 차수'].str.contains('17',na=False)]

pandas 컬럼 표시 갯수 설정

  • 전체 column 보는 법
pd.set_option('display.max_columns', None) ## 모든 열을 출력한다.
  • 전체 데이터의 .info보기
df.info(verbose=True,show_counts=True)
  • 컬럼 표시 갯수 Default 값으로 되돌리기
pd.options.display.max_rows = 60
pd.options.display.max_columns = 20

특정값을 포함한 데이터 프레임을 반환

def find_code(codes):
  codes_temp=[]
  for code in codes:
      codes_temp.append(code.replace('17',""))
  #print(codes_temp)
  return meta2_17.loc[meta2_17['변수명\n(기존변수에서 차수를 삭제한 형태)'].isin(codes_temp)]

데이터프레임의 범주형 데이터 변환 map

  • dict와 map 함수로 변환
# 범주형 데이터 dict
col_opt_sex = {1:'남', 2:'여'}
col_opt_mar = {0:'비해당(18세 미만)', 1:'유배우', 2:'사별', 3:'이혼', 4:'별거', 5:'미혼', 6:'기타(사망등)'}
col_opt_rel = {1:'있음', 2:'없음'}
col_opt_reg = {1:'서울', 2:'수도권(인천/경기)',3:'부산/경남/울산', 4:'대구/경북', 5:'대전/충남', 6:'강원/충북', 7:'광주/전남/전북/제주도'}
# 범주형 데이터 한글변환 
df['Sex'] = df['Sex'].map(col_opt_sex)
df['MaritalStatus'] = df['MaritalStatus'].map(col_opt_mar)
df['Religion'] = df['Religion'].map(col_opt_rel)
df['RegionCode'] = df['RegionCode'].map(col_opt_reg)
  • 0,1만 가지는 항목 변환 np.where
import numpy as np
df['Sex'] = np.where(df['Sex'] == 1, 'male', 'female')

merge

df2= pd.merge(df, meta3_jobcode, left_on='Jobcode', right_on= 'jobcode',how='left')

컬럼에 함수 적용

  • 컬럼에 함수를 적용하여 새 컬럼을 생성
def age_div(birth):
  if birth > div1:
    return '미성년'
  elif div1 >= birth > div2:
    return '청년'
  elif div2 >= birth > div3:
    return '중년'
  elif div3 >= birth > div4:
    return '장년'
  elif div4 >= birth:
    return '노년'
df2['AgeGroup'] = df2['Birth'].apply(age_div)

특정 값을 만족하는 데이터 추출

  • 'Income'항목이 0이 아닌 데이터만 출력해서 df_inc에 저장
df_inc = df2[(df2['Income'] != 0)]

데이터 분석

  • 'Sex' 컬럼 값에 따른 'Income'의 평균을 내림차순으로 출력
df_inc.groupby('Sex')['Income'].mean().sort_values(ascending = False)
  • 'AgeGroup'의 값에 따른 항목 수를 'Sex' 컬럼 값으로 구분하여 출력하기
# 성별에 따른 연령대 분포
sns.countplot(data = df_inc, x= 'AgeGroup',hue = 'Sex', order = age_order)
plt.title('소득이 있는 인구의 성별에 따른 연령대 분포')
  • countplot(항목수)에서 x 값과 hue를 모두 순서 지정하여 출력하기
sex_order = ['남','여']
sns.countplot(data = df3, x= 'AgeGroup',hue = 'Sex', order = age_order, hue_order=sex_order)
profile
:D

0개의 댓글