본문 바로가기
Python/seaborn & matplotlib

query, where 함수를 활용한 전처리 및 시각화 예제

by Mr.DonyStark 2024. 2. 16.

□ 라이브러리 호출 및 데이터 불러오기

#라이브러리 호출
import pandas as pd
import numpy as np
import seaborn as sns

#데이터 불러오기
raw_welfare = pd.read_spss("C:/Users/Lenovo/Downloads/Koweps_hpwc14_2019_beta2.sav")
#데이터 변수에 카피
welfare = raw_welfare.copy()

 

□ 복수개의 컬럼명변경

welfare = welfare.rename(columns = {
    'h14_g3' : 'sex',
    'h14_g4' : 'birth',
    'h14_g10' : 'marriage_type',
    'h14_g11':'religion',
    'p1402_8aq1':'income',
    'h14_eco9':'code_job',
    'h14_reg7':'code_region'
})

 

□ where 문을 활용한 특정 필드의 값 변환(barplot)

  ○ np.where() 함수는 NumPy 라이브러리에서 제공하는 함수로, 조건에 따라 배열의 값을 선택하여 반환. 조건을 나타내는 배열 또는 조건식을 만족하는 경우에는 앞 값으로, 그렇지 않은 경우에는 뒤 값으로 대체

 ○ groupby

   - groupby('sex', as_index=False): 'sex' 열을 기준으로 그룹화. as_index=False로 그룹의 인덱스를 다시 지정하지 않도록 설정
   - .agg(mean_income=('income','mean')): 각 그룹에 대해 'income' 열의 평균을 계산하여 'mean_income'이라는 새로운 열로 결과집계

#결측치 확인 및 값 변환
welfare['sex'].isna().sum() # 출력 0, 결측값 : 없음
welfare['sex'].value_counts() # 2.0 : 7913  1.0 : 6505
welfare['sex'] = np.where(welfare['sex'] == 1, '남', '여')

welfare['sex'].head(30)
welfare[welfare['income'] ==9999] #출력 0, 결측값 : 없음
welfare['income'] = np.where(['income'] == 9999, np.nan, welfare['income'])

# #그룹바이
sex_income = welfare.dropna(subset=['income']).groupby('sex',as_index=False).agg(mean_income=('income','mean'))
sns.barplot(data=sex_income, x='sex', y='mean_income')

 

□ 다른 파일 불러온 후 불러온 파일과 기존 파일 머지

#다른파일불러오기
list_data = pd.read_excel("C:/Users/Lenovo/Downloads/Koweps_Codebook_2019.xlsx", sheet_name='직종코드')
#머지
welfare1 = welfare.merge(list_data, how='left',on='code_job')

기존 파일에 새파일을 머지하여 필드 1개 증가

□ 직업별 그룹화 및 평균급여산출

job_income = welfare1.dropna(subset=['job','income'])
job_income_grp = job_income.groupby('job',as_index=False).agg(mean_income=('income','mean'))

  ○ TIP!!!

    1) as_index=True를 진행하면 job필드가 인덱스로 잡힘

    2) .job_income.groupby('job',as_index=False) 까지만 코딩후 변수저장했다면 해당 변수는 Series로 저장됨

    3)  agg()함수는 그룹화된 데이터프레임을 대상으로 집계연산을 해주는 함수임

      - 'income'필드로 평균산출

 

□ 직업별 급여가 많고 적고에 대한 top 10 시각화

top_10_gj = job_income_grp.sort_values('mean_income',ascending=False).head(10)
top_10_bj = job_income_grp.sort_values('mean_income',ascending=True).head(10)

sns.barplot(data=top_10_gj, x='mean_income', y='job')
sns.barplot(data=top_10_bj, x='mean_income', y='job')

 

□ .query함수를 활용한 그룹화 및 시각화

  ○ .query 함수

    - 판다스의 .query() 함수는 데이터프레임에서 특정 조건을 기반으로 행을 선택하는 데 사용되는 강력한 메서드

    - SQL과 유사한 방식으로 데이터를 필터링할 수 있음

    - .query() 함수는 특정 조건을 문자열로 표현하여 사용하며, 이 조건은 데이터프레임의 열에 대한 비교, 논리 연산 등을 포함할 수 있음

DataFrame.query(expr, inplace=False, **kwargs)

  ▶ expr: 문자열로 된 조건 표현식으로 데이터프레임의 컬럼에 대한 비교와 논리 연산을 포함할 수 있음
  ▶ inplace: 기본값은 False이며, True로 설정하면 원본 데이터프레임을 수정하며 False로 설정하면 새로운 데이터프레임을 반환
  ▶  **kwargs: 추가적인 키워드 인자로, 조건 표현식에서 사용되는 변수에 값을 전달할 때 사용됩니다.

job_man = welfare.dropna(subset='job').query("sex=='남'").groupby('job',as_index=False).agg(num_cnt=('job','count')).sort_values('num_cnt',ascending=False).head(10)
job_woman = welfare.dropna(subset='job').query("sex=='여'").groupby('job',as_index=False).agg(num_cnt=('job','count')).sort_values('num_cnt',ascending=False).head(10)