이전 분석글
3. 복수 응답에 대한 Plot
1 ) 질문과 응답
복수 응답을 요구하는 질문에서 위와 같은 방법으로 질문을 출력하려고 하면 에러가 발생한다.
question["Q7"]
KeyError: 'Q7'
이때 pandas의 filter 기능을 사용한다. 하지만 단순하게 question.filter("Q7")로 실행하면 아무것도 출력되지 않는다.
question.filter("Q7")
Series([], Name: 0, dtype: object)
설문 데이터에 “Q7”이라는 컬럼이 없기 때문이다. 이 처럼 특정 문자가 포함된 컬럼을 찾을 경우 regex 옵션으로 검색해야 한다.
question.filter(regex = "Q7")
Q7_1 What products or platforms did you find to be ...
Q7_2 What products or platforms did you find to be ...
Q7_3 What products or platforms did you find to be ...
Q7_4 What products or platforms did you find to be ...
Q7_5 What products or platforms did you find to be ...
Q7_6 What products or platforms did you find to be ...
Q7_7 What products or platforms did you find to be ...
Name: 0, dtype: object
question.filter(regex = "Q7")[0]
'What products or platforms did you find to be most helpful when you first started studying data science? (Select all that apply) - Selected Choice - University courses'
질문의 전체 문장을 보면 질문과 뒤에 선택된 보기를 같이 나열했다. 여기서 질문만을 가져오기 위해 "-"를 기준으로 split 하면 좀 더 정확한 질문만을 가져올 수 있다.
question.filter(regex = "Q7")[0].split("-")[0]
'What products or platforms did you find to be most helpful when you first started studying data science? (Select all that apply) '
복수응답은 질문에서 “Q7”가 포함된 모든 결괏값을 확인한다.
answer_Q7 = answer.filter(regex = "Q7")
answer_Q7
위의 결과를 각 항목에 대해 counting하기 위해 Null 값 여부를 조사하고, 그에 대한 논리값의 합을 구하면 각 항목에 대한 값을 구할 수 있다.
answer_Q7.isnull()
isnull()의 경우 값이 Null일 때 True를, Null이 아닌 경우 False를 반환한다. 하지만 각 항목에 해당할 때 True인 경우를 counting해야하기 때문에 isnull()이 아닌 이에 대한 반대되는 결과를 출력하는 notnull()에 대한 합계를 구한다
answer_Q7.notnull().sum()
Q7_1 6851
Q7_2 13714
Q7_3 3310
Q7_4 12871
Q7_5 12700
Q7_6 1022
Q7_7 1944
dtype: int64
위 결과를 테이블 형태로 나타내기 위해 describe()를 활용한다. describe() 함수는 수치형 변수들만을 기준으로 각종 통계량을 요약해 테이블로 출력해 준다.
answer_Q7_desc = answer_Q7.describe()
answer_Q7_desc
top은 해당 컬럼에서 가장 많은 값을 의미한다. 각각의 항목은 오로지 각각 해당하는 응답의 개수이기 때문에 unique값이 1이며 count와 freq의 값이 동일하게 나타난다.
이러한 결과에 대해서 응답에 해당하는 top과 이에 해당하는 count(또는 freq)를 가져온다.
answer_Q7_desc.loc[["top", "count"]]
여기서 top과 count를 컬럼으로 가져오기 위해 전치시킨다(T). 또한 top과 count를 컬럼으로 가져온 후에 top을 행으로, count를 열로 하기 위해 top을 index화 한다. 이 과정에서 set_index() 함수를 사용한다.
answer_Q7_desc.loc[["top", "count"]].T
# loc : 행의 값 가져오기
answer_Q7_desc.loc[["top", "count"]].T.set_index("top")
sort_values() 함수를 이용해 위 결과를 count 기준으로 내림차순으로 정렬한다. 이때 오름차순이 디폴트 이기 때문에 ascending 옵션을 False로 한다.
answer_Q7_desc.loc[["top", "count"]].T.set_index("top").sort_values("count", ascending = False)
이 과정을 바탕으로 중복 응답항목에 대해 테이블을 출력하는 새로운 함수를 정의할 수 있다.
def get_multiple_answer_by_qno(qno):
answer_qno = answer.filter(regex = qno)
answer_desc = answer_qno.describe()
answer_count = answer_desc.loc[["top", "count"]].T.set_index("top")
answer_count = answer_count.sort_values("count", ascending = False)
return answer_count
get_multiple_answer_by_qno("Q13")
seaborn(sns)를 이용한 Plot 그리기
중복 응답항목에 대해 테이블을 출력하는 get_multiple_answer_by_qno() 함수를 이용해 쉽게 테이블을 생성할 수 있고, 이를 이용해 plot을 그릴 수 있다.
Q7_answer_table = get_multiple_answer_by_qno("Q7")
sns.barplot(data = Q7_answer_table, y = Q7_answer_table.index,x = "count",
palette = "Blues_r").set_title(question.filter(regex = "Q7")[0].split("-")[0])
다양한 질문에 대해 plot을 그리기 위해 plot을 출력하는 함수를 새로 정의한다.
# 질문
def get_question_title_by_qno(qno):
return question.filter(regex = qno)[0].split("-")[0]
# Bar Plot
def show_multiple_answer_plot(qno):
multiple_answer = get_multiple_answer_by_qno(qno)
plt.figure(figsize = (10,6))
sns.barplot(data = multiple_answer, x = "count", y = multiple_answer.index,
palette = "Blues_r").set_title(get_question_title_by_qno(qno))
다른 중복 응답 항목에 대해서도 잘 출력되는 것을 확인할 수 있다.
show_multiple_answer_plot("Q13")
'Study > Python' 카테고리의 다른 글
[Python]pandas를 이용한 2022 kaggle survey 분석 및 시각화 - 4 (1) | 2023.04.14 |
---|---|
[Python]pandas를 이용한 2022 kaggle survey 분석 및 시각화 - 3 (0) | 2023.04.13 |
[Python]pandas를 이용한 2022 kaggle survey 분석 및 시각화 - 1 (0) | 2023.04.04 |
[python] 지역 경계 데이터 전처리를 위한 Geopandas 설치하기 (0) | 2022.06.09 |
[Python] 데이터 시각화 - plot,barplot, boxplot (+ matplotlib, plot 한글 설정) (0) | 2021.11.27 |