728x90
반응형

 데이터 분석을 하기 위해선, 제일 먼저 데이터가 필요하다. 난수 데이터를 생성하거나, 직접 데이터를 만드는 것도 나쁜 방법은 아니지만, 해당 포스팅을 보는 사람이 실제 데이터를 이용해서 논문을 쓰거나, 특정 결과물을 만들고 싶을 가능성이 높다고 생각하고, 실제 데이터 속에 숨어 있는 진짜 정보를 찾아내는 것이 지식이 되므로, 원시 자료(Rawdata)를 구하고, 학습에 필요한 변수들만 일부 추출하여, 기초 통계분석을 위한 학습용 데이터를 만들어보겠다.

 

 

0. 분석 환경 설명

분석 환경 구축은 상황에 따라 그 수준이 크게 차이가 나지만, 본 포스트에서는 윈도우 환경에서 아나콘다를 설치하고, 이를 통해 Python을 사용할 예정이다.

  • conda 4.9.2 버전, Python 3.7 버전을 사용하겠다.
  • 자세한 설치 방법은 이전 포스트인 "Python 파이썬과 아나콘다"를 참고하기 바란다.
  • Python을 사용할 방법은 아나콘다를 설치하면서 함께 설치 된 주피터 노트북을 사용할 것이나, 보다 편한 툴을 원하는 사람은 파이참("Python 파이썬과 파이참")을 사용하길 바란다.
  • 분석에는 기본적으로 pandas, numpy, scipy, matplotlib를 사용할 것이며, pandas는 1.1.3 버전, numpy는 1.19.2 버전, scipy는 1.5.2 버전, matplotlib는 3.3.2 버전을 사용할 것이다.
  • pandas, numpy, scipy, matplotlib는 아나콘다 설치 시, 기본적으로 설치되므로, 굳이 다른 라이브러리를 다운로드할 필요는 없으나, 이에 관심 있는 경우, "Python 필요한 모듈들을 설치해보자"를 참고하기 바란다.

 

 

 

 

1. 필요한 원시 자료 구하기

  • 원시 자료(Rawdata)는 말 그대로, 아무런 가공도 하지 않은, 가장 기본적인 데이터 상태를 가리킨다.
  • 정부 4.0 이후로, 수많은 공공 기관, 의료 기관 등에서 자체 관리하던 데이터를 통합 관리하려는 시도가 있었고, 그덕에 질 높은 원시 자료 구하기가 꽤 쉬워졌다.
  • 추천하는 원시자료 홈페이지는 다음과 같다.
  • 공공데이터포털 - 행정안전부에서 운영하는 각종 공공 데이터가 모여있는 곳
  • 보건복지데이터포털 - 건강위험인지조사, 노인실태조사 등
  • 고용조사 분석시스템 - 청년패널조사, 대졸자직업이동경로조사, 고령화연구패널조사
  • 보건의료빅데이터개방시스템 - 전국 병의원 및 약국 현황, 의료장비 상세 현황, 요양기관 개설 현황 등
  • 청소년건강행태조사 - 질병관리청
  • 게임이용자 패널 연구 - 한국콘텐츠진흥원
  • 한국복지패널 - 한국보건사회연구원
  • 해당 포스트에서는 비교적 접근하기 쉽고, 데이터의 질도 상당히 좋은 한국복지패널을 사용하도록 하겠다.

 

 

 

 

2. 청소년건강행태조사 원시자료 구하기

  • 위 참조를 통해 질병관리청의 청소년건강행태조사를 다운로드하자.
  • 청소년건강행태조사는 흡연, 음주, 신체활동과 같은 변수를 통해 청소년층의 건강행태를 파악하는 것을 목적으로, 2005년부터 매년마다 중·고등학교 재학생을 대상으로 꾸준히 실시해온 국가승인통계조사로, 직관적인 데이터와 높은 참여율로, 다루기 매우 편한 데이터다.
  • Python을 사용하여 분석할 것이기 때문에, SAS나 SPSS 무엇을 다운로드 받든 지 큰 상관은 없으나, 본 포스트에서는 SPSS를 사용하여 분석을 진행하도록 하겠다.
  • 본 포스트에서 다운로드할 데이터는 "제15차(2019) 청소년건강행태조사"다.

  • 해당 원시자료에 관심이 있거나, 이를 이용하여 연구를 해보고 싶다면, 지침서나 통계집 등의 산출물을 자세히 읽어보는 것을 추천한다.

 

 

 

 

3. 데이터 가져오기

  • spss, sas 데이터는 pandas를 이용해서 쉽게 가지고 올 수 있다.
import pandas as pd
>>> Rawdata = pd.read_spss("kyrbs2019.sav")

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-2-a3be1637ac91> in <module>
----> 1 Rawdata = pd.read_spss("kyrbs2019.sav")

~\anaconda3\lib\site-packages\pandas\io\spss.py in read_spss(path, usecols, convert_categoricals)
     34     DataFrame
     35     """
---> 36     pyreadstat = import_optional_dependency("pyreadstat")
     37 
     38     if usecols is not None:

~\anaconda3\lib\site-packages\pandas\compat\_optional.py in import_optional_dependency(name, extra, raise_on_missing, on_version)
    108     except ImportError:
    109         if raise_on_missing:
--> 110             raise ImportError(msg) from None
    111         else:
    112             return None

ImportError: Missing optional dependency 'pyreadstat'.  Use pip or conda to install pyreadstat.
  • 처음 spss 데이터를 가지고 오는 경우, 위와 같은 오류가 뜰 수 있는데, ImportError에서 요청한 데로, pyreadstat 패키지를 깔면 해결된다.
>>> !pip install pyreadstat
Collecting pyreadstat
  Downloading pyreadstat-1.0.9-cp38-cp38-win_amd64.whl (1.2 MB)
Requirement already satisfied: pandas>0.24.0 in c:\users\gooop\anaconda3\lib\site-packages (from pyreadstat) (1.1.3)
Requirement already satisfied: python-dateutil>=2.7.3 in c:\users\gooop\anaconda3\lib\site-packages (from pandas>0.24.0->pyreadstat) (2.8.1)
Requirement already satisfied: pytz>=2017.2 in c:\users\gooop\anaconda3\lib\site-packages (from pandas>0.24.0->pyreadstat) (2020.1)
Requirement already satisfied: numpy>=1.15.4 in c:\users\gooop\anaconda3\lib\site-packages (from pandas>0.24.0->pyreadstat) (1.19.2)
Requirement already satisfied: six>=1.5 in c:\users\gooop\anaconda3\lib\site-packages (from python-dateutil>=2.7.3->pandas>0.24.0->pyreadstat) (1.15.0)
Installing collected packages: pyreadstat
Successfully installed pyreadstat-1.0.9
WARNING: You are using pip version 20.3.3; however, version 21.0.1 is available.
You should consider upgrading via the 'c:\users\gooop\anaconda3\python.exe -m pip install --upgrade pip' command.
>>> Rawdata = pd.read_spss("kyrbs2019.sav")
>>> Rawdata

  • 총 57303명의 객체(Rows)와 183개의 변수(Columns)가 있는 데이터가 가져와졌다.
  • 위 표를 DataFrame이라고 하며, 이에 대한 보다 자세한 정보를 알고자 한다면, 해당 포스팅("Pandas-데이터 프레임의 구조와 용어 정리")을 참고하길 바란다.

 

 

 

 

4. 필요 변수(Columns)만 추출하기

  • 이번에는 "제15차(2019) 청소년건강행태조사 원시자료(지침서)"를 보고, 가져온 원시자료를 파악해보자.
  • 변수의 이름은 겹치지 않는 것이 매우 중요하며, 그 내용이 길면 다루기 어려워지므로, 보통 영어 알파벳과 숫자로 구성한다.
  • 때문에, 원시자료 지침서를 참고하지 않는다면, 자신이 다룰 데이터의 변수들을 파악하기 쉽지 않으므로, 원시자료를 다루고자 한다면, 반드시 변수들이 정리되어 있는, 지침서나 코딩 북 등을 참고하기 바란다.
  • 모든 변수를 보는 것은 매우 비효율적이므로, 앞으로 분석에 필요할 청소년건강행태조사의 대표적인 변수 16개만 골라, 앞으로 학습할 데이터를 만들도록 하겠다.
  • 선택 변수 설명
변수명 변수 설명 변수명 변수 설명
SEX 성별 PA_TOT 하루 60분 이상 신체활동 일수
AGE 만나이 M_STR 평상시 스트레스 인지
HT 신장 M_SLP_EN 잠으로 피로 회복 정도
WT 체중 AC_LT 평생 음주 경험
E_S_RCRD 학업성적 TC_LT 평생 흡연 경험
E_SES 가정의 경제상태 INT_WD_MM 주중 학습 목적 이외 평균 인터넷 이용 시간
PR_HT 주관적 건강인지 INT_WK_MM 주말 학습 목적 이외 평균 인터넷 이용 시간
Target_DF = Rawdata[["SEX", "AGE", "HT", "WT", "E_S_RCRD", "E_SES",
                     "PR_HT", "PA_TOT", "M_STR", "M_SLP_EN", "AC_LT",
                     "TC_LT", "INT_WD_MM", "INT_WK_MM"]]
  • 변수의 수를 줄였으므로, 변수 이름을 아예 한글로 바꿔서 알아보기 쉽게 만들자.
Target_DF.columns = ["성별", "연령", "키", "몸무게", "학업성적",
                     "경제상태", "건강인지", "운동일수", "스트레스인지",
                     "피로회복정도", "음주경험", "흡연경험",
                     "주중_인터넷이용시간","주말_인터넷이용시간"]
                     
Target_DF

  • Python은 UTF-8을 기반으로 만들어졌기 때문에, 한글을 사용했을 때, 문제가 발생하기 쉬운 다른 언어들과 달리 한글을 Column의 이름으로 사용하거나, 객체를 담는 변수의 이름으로 사용할 수도 있다.
  • 물론, 가능은 하지만 실전에서는 가능한 한글을 사용하지 않기를 바란다.

 

 

 

 

5. 결측값 처리하기

  • 출력된 표를 보니 NaN이라는 이상한 문자가 있는 것을 볼 수 있다.
  • 이는 결측값(Missing Value)로 어떠한 연유에 의해 값이 누락된 것이다.
  • 결측값을 해결하는 문제는 데이터 분석에서 매우 민감하고 중요한 부분이지만, 이는 현 포스트에서 다루고자 하는 기초 통계학 부분과는 거리가 있으므로, 이를 아주 단순하게 처리하고 가도록 하겠다.
  • 결측값이 존재하는 변수는 다음과 같다.
>>> Target_DF.isna().sum()
성별                0
연령              234
키              1555
몸무게            1555
학업성적              0
경제상태              0
건강인지              0
운동일수              0
스트레스인지            0
피로회복정도            0
음주경험              0
흡연경험              0
주중_인터넷이용시간    14297
주말_인터넷이용시간    12488
dtype: int64
  • 결측값이 발생한 이유에 대한 분석은 보고서를 읽는 것이 가장 정확하지만, 매우 단순하게 해당 부분을 해결하겠다.
  • "주중_인터넷이용시간", "주말_인터넷이용시간"은 결측값 제외 시, 최솟값이 10.0인 것을 볼 때, 인터넷을 사용하지 않은 사람을 결측값으로 처리한 것으로 판단하고, 모두 0으로 바꾸도록 하겠다.
  • 연령, 키, 몸무게가 누락된 대상은 전체 데이터 셋 57,303명에서 차지하는 비중이 매우 작으므로, 제거하여 무시하도록 하겠다.
Target_DF["주중_인터넷이용시간"] = Target_DF.주중_인터넷이용시간.fillna(0)
Target_DF["주말_인터넷이용시간"] = Target_DF.주말_인터넷이용시간.fillna(0)
Target_DF.dropna(inplace = True)
Target_DF.reset_index(drop = True, inplace = True)
Target_DF

  • 위 코드 실행 시, 붉은색으로 SettingWithCopyWarning이 뜨는데, 이는 pandas의 메모리를 절약하기 위한 방법인, 데이터 종속성으로 인해 발생하는 문제로, 기존의 Rawdata와 Target_DF가 별개로 존재하게 되므로, 발생하는 문제다. 이를 해결하기 위해선, copy함수를 이용해서 Target_DF를 생성할 때, Rawdata와 별개로 흐르게 만들면 되지만, 딱히 결과에 영향을 주진 않으므로, 그냥 넘어가도록 하자.
  • 추출된 데이터 셋을 추후 쉽게 사용하기 위해 저장해놓도록 하겠다.
Target_DF.to_csv("Data_for_study.csv", index=False)

Data_for_study.csv
3.39MB

 

 Python으로 하는 기초통계학은 해당 데이터를 사용하여 진행할 것이다. 해당 데이터를 참고 파일로 올려놓을 테니, 위 부분을 생략하고 진행하고자 하는 경우, 바로 데이터만 다운로드하고 사용해도 괜찮다.

728x90
반응형

'Python으로 하는 기초통계학 > 기본 개념' 카테고리의 다른 글

중심경향치(1) - 최빈값, 중앙값  (0) 2021.03.03
도수분포표와 시각화  (0) 2021.03.02
도수분포표  (0) 2021.03.02
변수(Variable)  (0) 2021.03.01
통계학이란?  (0) 2021.02.26

+ Recent posts