설문조사를 분석하고 시각화하는데 좋은 자료가 있어서 포스팅을 한다.

자료는 아래서 참조하였다.

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 ==================================


+ Recent posts