설문조사를 분석하고 시각화하는데 좋은 자료가 있어서 포스팅을 한다.
자료는 아래서 참조하였다.
ref.
corazzon / KaggleStruggle / kaggle-survey-2017 / Kaggle-ML-DS-survey-2017-EDA-FAQ.ipynb
https://github.com/corazzon/KaggleStruggle/blob/master/kaggle-survey-2017/Kaggle-ML-DS-survey-2017-EDA-FAQ.ipynb
분석에 필요한 자료는 아래링크에서 Data탭에 들어가면 구할 수 있다.
https://www.kaggle.com/kaggle/kaggle-survey-2017
================================== Python ==================================
import pprint
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# 이미지를 그려주는 모듈.
import seaborn as sns
# 데이터 프레임의 컬럼을 최대 12개로 늘린다.
pd.set_option('display.max_columns', 12)
# schema.csv를 question 객체에 담기
question = pd.read_csv('schema.csv')
#print(question.head()) # 데이터 확인
#print(question.shape) # 행렬구조 확인. (290, 3) 290행, 3열
# multipleChoiceResponses.csv를 mcq에 담기. encoding='ISO-8859-1'은 범용적으로 사용되는 인코딩이다.
mcq = pd.read_csv('multipleChoiceResponses.csv', encoding='ISO-8859-1', low_memory=False)
# print(type(mcq)) # <class 'pandas.core.frame.DataFrame'>
# print(mcq.shape) # (16716, 228).
# pprint.pprint(mcq.columns.values.tolist()) # 각 컬럼명칭을 확인
# print(len(mcq.columns.values.tolist())) # 컬럼이 228개임을 확인
# print(mcq.head()) # 데이터 확인
# jupyter를 이용하면 plt.show()없이 출력 가능
# import missingno as msno # NaN(결측치) 데이터를 시각화해주는 모듈이다.
# msno.matrix(mcq, figsize=(12, 5))
# print(msno.matrix(mcq, figsize=(12, 5)))
# plt.show()
# 어떤 성별이 더 많이 응답하였는지 mcq에서 GenderSelect 컬럼을 뽑아 확인
# sns.countplot(y='GenderSelect', data=mcq)
# plt.show() # 남성이 훨씬 많은 것을 확인
# gen_df = pd.DataFrame(mcq['GenderSelect'].value_counts())
# print(gen_df) # 데이터를 확인한다.
'''
GenderSelect
Male 13610
Female 2778
A different identity 159
Non-binary, genderqueer, or gender non-conforming 74
'''
# mcq의 Country컬럼만 뽑아 나라별로 갯수를 세고 그것을 데이터 프레임으로 만든다.
con_df = pd.DataFrame(mcq['Country'].value_counts())
# print(con_df.head()) # 데이터 확인
# 국가 이름은 인덱스이고 국가 이름을 담고 있는 컬럼이 없으므로
# '국가'라는 컬럼을 만들어 국가 이름(인덱스)을 넣어준다.
con_df['국가'] = con_df.index
# print(con_df.hean()) # 제대로 되었는지 확인
# 국가별 응답수를 파이차트로 만든다.
# labels = con_df.국가.values.tolist()
# ratio = con_df.Country
#
# plt.pie(ratio, labels=labels, shadow=True, startangle=90)
# startangle은 시작지점을 선택하는 것이다.
# None이 아니면 원형 차트의 시작을 X 축에서 시계 반대 방향으로 각도만큼 회전한다.
# plt.show()
# 인덱스 컬럼을 지운다.
# axis = 0은 x, 행이고 axis = 1은 y, 열이다.
con_df = con_df.reset_index().drop('index', axis=1)
# print(con_df.head()) # 데이터 확인
# 나이 데이터를 요약한다.
# print(mcq['Age'].describe())
# sns.distplot(mcq[mcq['Age'] > 0]['Age'])
# plt.show() # x축 나이, y축 상대도수이다.
# 사람들의 학력을 알아본다.
# sns.countplot(y='FormalEducation', data=mcq)
# plt.show() # 석사 -> 학사 -> 박사 순으로 많다.
# 'MajorSelect' 컬럼에 있는 전공의 갯수를 세어준다.
mcq_major_count = pd.DataFrame(mcq['MajorSelect'].value_counts())
# 전공의 비율을 보여준다.
mcq_major_percent = pd.DataFrame(mcq['MajorSelect'].value_counts(normalize=True))
# 데이터베이스의 join과 같은 역할을 하는 merge.
# count, percent에 존재하는 인덱스를 조인키로 사용하기 위해서 인덱스를 전투 True로 한다.
mcq_major_df = mcq_major_count.merge(mcq_major_percent, left_index=True, right_index=True)
# 추가한 컬럼의 이름을 각각 '응답수', '비율'로 바꾼다.
mcq_major_df.columns = ['응답수', '비율']
# print(mcq_major_df.head()) # 데이터 확인
# mcq의 MajorSelect 컬럼을 시각화한다.
# plt.figure(figsize=(6, 8))
# sns.countplot(y='MajorSelect',data=mcq)
# plt.show()
# 취업상태를 확인.
mcq_es_count = pd.DataFrame(mcq['EmploymentStatus'].value_counts())
mcq_es_percent = pd.DataFrame(mcq['EmploymentStatus'].value_counts(normalize=True))
mcq_es_df = mcq_es_count.merge(mcq_es_percent, left_index=True, right_index=True)
mcq_es_df.columns = ['응답수','비율']
# print(mcq_es_df.head()) # 데이터 확인
# 그래프로 만들기.
# sns.countplot(y='EmploymentStatus', data=mcq)
# plt.show()
# 코딩 경험이 얼마나 있는지 확인
# sns.countplot(y='Tenure', data=mcq)
# plt.show()
### 이제부터 한국 통계 ###
# .loc[] 을 이용하여 특정 데이터만 추출한다.
korea = mcq.loc[mcq.Country == 'South Korea'] # 한국 데이터에 쉽게 접근하도록 korea객체를 생성해준다.
# print(korea.shape) # (194, 228). 194행 228열. 총 응답이 194명, 질문의 갯수가 228개 이다.
# print(korea.head()) # 데이터 확인
# NaN을 제외하고 'Age'컬럼을 이용해서 그래프를 그린다.
# sns.distplot(korea['Age'].dropna())
# plt.show()
# 각 성별이 얼마나 있는지를 확인한다.
# 컬럼 이름을 출럭하기 위해서 데이터를 데이터 프레임으로 바꿔서 출력한다.
# print(pd.DataFrame(korea['GenderSelect'].value_counts())) # 데이터 확인
# sns.countplot(x='GenderSelect', data=korea)
# plt.show()
# 나이 + 성별(남여 따로)을 그래프로 출력해본다.
# 두 개의 그래프를 각각 어디에 저장할 것인지 선택
# ncols는 열의 추가이므로 가로로 배열되고 nrows는 행의 추가이므로 세로로 배열된다.
# figure, (ax1, ax2) = plt.subplots(ncols=2)
# figure.set_size_inches(12, 5)
'''
figure.set_size_inches()는 (width, height) tuple in inches. 그래프의 (넓이, 높이)를 설정한다.
ref.
https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html
'''
# NaN값을 없애고 플롯을 만든다.
# sns.distplot(korea['Age'].loc[korea['GenderSelect'] == 'Female'].dropna(),
# norm_hist=False, color=sns.color_palette("Paired")[4], ax=ax1)
'''
'파라미터에 대한 설명'
norm_hist: True면 히스토그램 높이가 수가 아닌 밀도를 표시한다.
color: 색 지정. .color_palette()는 seaborn에 존재하는 함수로
deep, muted, bright, pastel, dark, colorblind를 쓸 수 있다.
ax: 위에서 지정한 figure에 ax1으로 이 설정을 집어넣는다.
ref.
https://seaborn.pydata.org/index.html
'''
# plt.title('Korea Female')
# sns.distplot(korea['Age'].loc[korea['GenderSelect'] == 'Male'].dropna(),
# norm_hist=False, color=sns.color_palette("Paired")[0], ax=ax2)
# plt.title('Korea Male')
# plt.show()
# 취업 여부를 확인.
# sns.barplot(x=korea['EmploymentStatus'].unique(),
# y=korea['EmploymentStatus'].value_counts()/len(korea))
'''
x에는 사람들이 응답한 문항이 들어가야 하기 때문에
.unique() 메서드를 사용해서 사람들이 답변한 내용 도메인을 리스트로 만든다.
y에는 x도메인의 상대도수를 구해 넣어준다.
'''
# plt.xticks(rotation = 30, ha='right') # xlabel을 오른쪽으로 30도 눕혀서 legend 이름을 읽기 쉽게 바꾼다.
# plt.title('EmploymentStatus') # 그래프의 타이틀을 붙여준다.
# plt.show()
### .unique()메서드에 대한 설명###
# a = korea['EmploymentStatus']
# print(a.head())
'''
'결과'
356 Employed full-time
363 Employed full-time
491 Employed part-time
565 Employed full-time
601 Employed full-time
Name: EmploymentStatus, dtype: object
'''
# b = korea['EmploymentStatus'].unique()
# print(b)
'''
'결과'
['Employed full-time' 'Employed part-time'
'Not employed, and not looking for work'
'Not employed, but looking for work' 'I prefer not to say'
'Independent contractor, freelancer, or self-employed' 'Retired']
'''
# 직장에 다니고 있는 사람과 구직중인 사람이 몇 명인지 확인
# full_time = korea.loc[(korea['EmploymentStatus'] == 'Employed full-time')]
# print(full_time.shape)
# looking_for_job = korea.loc[(
# korea['EmploymentStatus'] == 'Not employed, but looking for work')]
# print(looking_for_job.shape)
================================== Python ==================================
'데이터 분석 > 데이터 분석 프로젝트' 카테고리의 다른 글
[설문조사 분석] Python으로 분석한 Kaggle 2017 Survey -3 (1) | 2018.06.25 |
---|---|
[설문조사 분석] Python으로 분석한 Kaggle 2017 Survey -2 (0) | 2018.06.22 |
[Python] 네이버 금융 데이터를 크롤링하여 주식 데이터를 얻고 특정 종목에 대한 '종가-날짜' 반응형 그래프 만들기 (0) | 2018.06.18 |
[시계열, 트렌드 분석] 단역배우 자매 사망 사건의 시계열 및 트렌드 분석 -2(개요, 관심도 변화) (0) | 2018.06.14 |
[시계열 분석] 단역배우 자매 사망 사건의 시계열 및 트렌드 분석 -1(준비 단계) (0) | 2018.06.07 |