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에 수렴해서 의사를 직업으로 삼은 이들은 모두 남성이라는 걸 확인할 수 있다.
'Programming > python' 카테고리의 다른 글
파이썬 python drop, rename, isin 함수로 데이터 정제하기 -1 (0) | 2021.07.19 |
---|---|
판다스 pandas IQR 활용해서 이상점(outlier) 찾고 삭제하기 (0) | 2021.07.12 |
판다스 axis 매개변수 개념 완벽정리 (0) | 2021.07.01 |
파이썬 python drop 함수 활용해서 행 삭제하기 (0) | 2021.06.07 |
DataFrame과 for문 이용하여 큰 데이터 다루기 (0) | 2021.05.27 |