본문 바로가기
Programming/python

파이썬 python groupby 함수 이용해서 여성 비율이 높은 직업 알아보기

by 조창대 2021. 6. 25.
반응형

 

occupations.csv
0.02MB

import pandas as pd
df=pd.read_csv('occupations.csv')

 

 

위 csv 파일을 이용해서 여성 비율이 높은 직업을 알아보자. 비율은 평균을 구하면 알 수 있다. 'occupation' column을 활용해서 groupby 한다면 각 컬럼의 평균값을 'occupation'별로 나타낼 수 있다. 

 

  • groupby 함수
occupation_groups=df.groupby('occupation')
type(occupation_groups)

-> pandas.core.groupby.generic.DataFrameGroupBy

'occupation_groups'라는 변수에 직업 열을 기준으로 groupby한 결과값을 저장하고 변수의 타입을 알아보면 위와 같이 이 변수가 <DataFrameGroupBy>타입이라는 걸 알 수 있다. 

occupation_groups라는 변수는 'occuaption'이 index인 데이터프레임이다.

 

- groupby 오브젝트의 특이한 점은 항상 count(), sum(), mean()같은 통계 함수가 적용되어야 한다는 것이다. groupby 자체가 열들간의 관계를 나타내기 위해 쓰이기 때문인 것 같다. 

 

 

occupation_groups.count()

count() 함수를 적용시키면

 

 

 

 

 

 

 

 

 

이런 데이터프레임이 출력된다. 각 컬럼에서 각 직업에 속한 행들의 합계가 occupation을 기준으로 정렬된 것을 확인할 수 있다. 

 

 

 

 

 

 

 

 

 

 

 

occupation_groups.mean()

mean 함수는 평균값을 구하는 함수이다. 'occupation'을 기준으로 각 컬럼들의 평균값을 구하고 싶을 때 쓴다.

 

 

 

 

 

 

 

 

count 함수와 달리 gender와 zip_code 열의 평균값이 표시되지 않았다. 'gender'의 값들은 M,F와 같이 문자열 타입이라 평균을 구할 수 없어서 제외되었다는 건 알 수 있는데, 

얼핏보면 int로 보이는 'zip_code'의 평균은 왜 계산할 수 없는걸까?

 

 

 

 

 

 

 

 

 

 

 

df.dtypes

-> user_id int64

age int64

gender object

occupation object

zip_code object

dtype: object

 

df의 데이터 타입을 알아보니 정수인 줄 알았던 zip_code의 데이터타입이 오브젝트로 나타났다. mean 함수에 zip_code 열이 반응하지 않던 이유였다. 데이터타입을 변경하는 건 문제를 풀어가며 해보자.

 


이제 groupby에 대해 알아봤으니, 본격적으로 df를 이용하여 직업별 여성 비율을 알아보자. 

mean을 이용하여 성별 평균을 구하려면 'gender'열의 데이터 타입을 int로 바꿔줘야 한다. 

df['gender'][df['gender']=='F'] = 1
df['gender'][df['gender']=='M'] = 0

성별이 여성인 경우엔 1로 변경하고 남성인 경우엔 0으로 변경한다.

우리는 여성 비율을 알아보기 위한 것이기 때문에 직업별 평균이 1에 가까워지면 그 직업에 여성이 많다는 뜻이고, 0에 가까워지면 남성이 많다는 뜻이 된다.

이 코드는 주피터 노트북에서 실행해보니, 대충 파이썬에서 권장하지 않는 코드방식이라고 나온다.

 

 

df.loc[df['gender'] == 'F', 'gender'] = 1
df.loc[df['gender'] == 'M', 'gender'] = 0
df['gender'] = df['gender'].astype(int)

 

loc 메소드를 이용해서 수정해주자. 잘 실행된다. 

astype을 이용해 여전히 오브젝트 타입인 1과 0을 int로 변경해준다. 

 

occupation_groups.mean()['gender']

 

 

-> occupation

administrator 0.455696

artist 0.464286

doctor 0.000000

educator 0.273684

engineer 0.029851

entertainment 0.111111

executive 0.093750

healthcare 0.687500

homemaker 0.857143

lawyer 0.166667

librarian 0.568627

marketing 0.384615

none 0.444444

other 0.342857

programmer 0.090909

retired 0.071429

salesman 0.250000

scientist 0.096774

student 0.306122

technician 0.037037

writer 0.422222

Name: gender, dtype: float64

 

마지막으로

순서가 뒤죽박죽이니 여성 비율이 높은 직업부터 정렬해보자.

occupation_groups.mean()['gender'].sort_values(ascending=False)

sort_values는 컬럼 값이 작은 것부터 로우를 쭉 정렬시켜준다. 큰 순으로 정렬하고 싶으면 ascending=False를 뒤에 붙여준다. df.sort_values(by="column 이름") 의 형식으로 쓰며, by=""는 어떤 컬럼을 기준으로 정렬할 지 지정해준다. 

 

 

**전체보기**

df.loc[df['gender'] == 'M', 'gender'] = 0
df.loc[df['gender'] == 'F', 'gender'] = 1
df['gender'] = df['gender'].astype(int)

df.groupby('occupation').mean()['gender'].sort_values(ascending=False)

->

occupation

homemaker 0.857143

healthcare 0.687500

librarian 0.568627

artist 0.464286

administrator 0.455696

none 0.444444

writer 0.422222

marketing 0.384615

other 0.342857

student 0.306122

educator 0.273684

salesman 0.250000

lawyer 0.166667

entertainment 0.111111

scientist 0.096774

executive 0.093750

programmer 0.090909

retired 0.071429

technician 0.037037

engineer 0.029851

doctor 0.000000

Name: gender, dtype: float64

 

여성 비율이 가장 높은 직업 top 3는 주부, 보건 의료 계열, 사서 순이다.

주부의 경우, 약 10명 중 9명이 여성, 1명이 남성꼴이다. 

 

여성의 비율이 제일 낮은 직업은 의사로, 비율이 0에 수렴해서 의사를 직업으로 삼은 이들은 모두 남성이라는 걸 확인할 수 있다.

반응형