모각코

[모각코 9주차] 인공지능플랫폼 - 데이터 분석 및 처리

y_unique 2024. 5. 30. 14:28
728x90

 

1. AWS Learner Lab을 통해 EC2 서버를 구동시키고, SSH로 접근

  • kmu-ai-platform-hw2로 하여 인스턴스 생성
  • SSH로 접근하기 위해 저번 과제에서 생성해놓은 키 페어 선택하기
  • 아래 명령어를 통해 ssh 접근을 진행한다.
ssh -i "kmu-ai-platform.pem" ubuntu@54.185.71.76
  • 성공적으로 인스턴스 생성 완료

2. EC2 서버에 Jupyter Notebook 설치

  • 아래 명령어를 통해 가상환경을 생성하기 위한 python3.10-venv 를 설치해준다
  • sudo apt update sudo apt install python3.10-venv
  • 설치가 완료된 후, 가상환경을 생성해준다.
  • 다음 아래 명령어를 통해 notebook 모듈을 설치해준다.
  • pip install notebook
  • notebook 비밀번호 세팅하기
    from jupyter_server.auth import passwd
    
  • python
  • 아래 명령어를 통해 jupyter notebook의 환경설정 파일을 생성한 뒤, 다음과 같은 수정을 진행한다.
  • jupyter notebook --generate-config sudo vi /home/ubuntu/.jupyter/jupyter_notebook_config.py
  • 환경설정 완료 후, 아래의 명령어를 통해 서버를 실행한다.
  • cd /home/ubuntu/.jupyter jupyter notebook --config jupyter_notebook_config.py
  • 위 과정만으로는 jupyter notebook에 접근할 수 없으므로 인바운드 규칙을 수정해주어야 한다.
    • EC2 보안그룹 진입 후, 인바운드 규칙 편집 탭에 들어간다. 아래와 같은 규칙을 추가해준 뒤, 규칙 저장을 해준다.
  • 다음과 같이 브라우저에 EC2의 퍼블릭 IP와 포트 8888을 지정해주면 다음과 같이 접속할 수 있다.

3. import-85.csv 파일 EC2 인스턴스로 옮기기

  • jupyter notebook에서 제공하는 업로드 기능을 활용해 imports-85.csv 파일을 업로드해준다.

4. 코드 실습

데이터 탐색

  • 먼저 해당 실습을 진행하기 위해 필요한 라이브러리를 설치해준다.
pip install pandas #데이터 조작과 분석을 위해 pandas 라이브러리 설치 
pip install scipy #ARFF 파일 처리를 위한 라이브러리 설치 
pip install matplotlib #데이터 시각화를 위한 라이브러리 설치 
  • 설치한 라이브러리 import하기
# 경고 무시하기
import warnings
warnings.simplefilter('ignore')

import requests  # 웹페이지 다운로드에 사용
import zipfile   # ZIP 파일 압축 해제에 사용
import io        # 데이터를 메모리에 로드하기 위해 사용
import pandas as pd   # 데이터를 다루기 위한 판다스 라이브러리
from scipy.io import arff  # ARFF 파일을 로드하기 위한 함수를 제공
  • 데이터 분석해보기
df.dtypes #데이터프레임의 데이터 타입 출력

df.columas #데이터프레임의 열 이름 출력

df.dtypes #데이처프레임의 데이터 타입 출력

 

  • 데이터 통계 정보 알아보기
df['pelvic_incidence'].describe() #pelvic_incidence 열의 통계 정보 출력

df.describe() #통계 정보 출력 

 

  • 데이터 시각화하기
import matplotlib.pyplot as plt #시각화를 위한 라이브러리 가져오기 
%matplotlib inline 
df.plot() #각 열을 선 그래프로 시각화 
df.plot(kind='density',subplots=True,layout=(4,2),figsize=(12,12),sharex=False) #각 열을 밀도 그래프로 시각화 
plt.show()

 

  • 위에 시각화 결과에서 확인할 수 있는 Outlier라고 예상되는 ‘degree_spondylolisthesis’ 열 분석하기
  • 각 열을 선으로 시각화 한 위 결과를 보면 degree_spondylolisthesis열의 값이 중간에 튀는 것을 확인할 수 있다. 따라서 눈에 띄는 값은 degree_spondylolisthesis 열에 해당되며 아래 코드를 통해 degree_spondylolisthesis열의 값들을 시각화 하여 분석하였다.
df['degree_spondylolisthesis'].plot.density() #'degree_spondylolisthesis' 열의 밀도그래프 

df['degree_spondylolisthesis'].plot.hist() #'degree_spondylolisthesis'열의 히스토그램

df['degree_spondylolisthesis'].plot.box() #'degree_spondylolisthesis'의 boxplot

💡 Q. 플롯을 통해 시각적으로 확인할 수 있는 이상치가 무엇인지 서술하기

  • 위 시각화 과정에서 확인했듯 ‘degree_spondylolisthesis’ 열에 대하여 이상치가 있음을 확인할 수 있었다.Abnormal 클래스에서 척추의 전방전위값 (degree_spondylolisthesis) 이 400을 넘어가는 이상치가 있음을 확인할 수 있다.
  • 아래는 ‘degree_spondylolisthesis’ 열의 값 별로 개수를 센 다음 Abnormal, Normal 클래스를 1과 0으로 매핑하는 과정을 거친다. 다음 산점도를 그려 시각화 하였는데, 생성된 자료를 보면
#열의 값 별로 개수를 세어 출력
df['degree_spondylolisthesis'].value_counts() 

#클래스를 숫자로 매핑하기 위한 딕셔너리를 생성 -> Abnomal을 1로, Normal을 0으로 매핑
class_mapper = {b'Abnormal':1,b'Normal':0} 

#'degree_spondylolisthesis'열의 값을 위에서 정의한 매핑에 따라 대체 
df['degree_spondylolisthesis']=df['degree_spondylolisthesis'].replace(class_mapper) 

#산점도를 그리기위해 matplotlib의 scatter함수를 사용
df.plot.scatter(y='degree_spondylolisthesis',x='class') 

 

  • 여러 변수를 시각화하기
  • # seaborn 라이브러리 설치하기 pip install seaborn # seaborn 라이브러리 import 하기 import seaborn as sns # 새로운 그림과 축을 생성하고, 크기를 (10, 10)으로 설정하기 fig, ax = plt.subplots(figsize=(10, 10)) # 색상 팔레트를 BrBG로 지정하기 colormap = sns.color_palette("BrBG", 10) # 상관행렬을 히트맵으로 표시 # 색상 맵은 위에서 정의한 팔레트를 사용하고, 각 셀에는 값을 표시하며, 소수점 두자리까지 표현 sns.heatmap(corr_matrix, cmap=colormap, annot=True, fmt=".2f") # 그림을 표시하기 plt.show()
  • # df를 class열을 기준으로 그룹화 한 뒤, boxplot을 그리기 # 폰트 크기 20, x축 라벨을 90도 회전, 그림 크기를 (20, 10) 설정, 상자를 색으로 채운다. df.groupby('class').boxplot(fontsize=20,rot=90,figsize=(20,10),patch_artist=True) # df의 상관 행렬을 계산하여 corr_matrix에 저장하기 corr_matrix = df.corr() # class 열과 다른 열 간의 상관관계 값을 내림차순으로 정렬하기 corr_matrix["class"].sort_values(ascending=False) # df에 대한 산점도 행렬을 생성, 그림 크기를 (12, 12)로 설정 pd.plotting.scatter_matrix(df,figsize=(12,12)) # 생성된 그림을 표시 plt.show()
  • 💡 Q. 눈에 띄는 시각화 결과가 있다면, 해당 항목에 대하여 데이터 분석하기
  • 데이터 인코딩
    # url 변수에 저장된 위치의 csv파일을 읽어온 뒤 "?"를 결측값으로 처리하며
    # 열 이름은 파일에 포함되어있지 않으므로 header=None으로 설정
    df_car = pd.read_csv(url,sep=',',names = col_names ,na_values="?", header=None)
    
    df_car.shape # 데이터프레임의 차원 확인
    df_car.head(5) # 데이터프레임의 처음 5개 행을 출력하여 미리 확인하기
    df_car.info() # 데이터프레임의 각 열에 대한 정보 출력 -> 열 이름, 버이있지 않은 데이터 수, 타입 등을 확인할 수 있음 
    df_car.columns # 데이터프레임의 열 이름 출력
    

    # 'num-of-doors' 열의 각 값들의 개수를 세어준다 
    df_car['num-of-doors'].value_counts()
    
    # 'num-of-doors' 열의 값을 숫자로 매핑하기 위한 딕셔너리를 생성 
    # 여기서는 "two"를 2로, "four"를 4로 매핑
    door_mapper = {"two": 2,"four": 4}
    
    # 새로운 'doors' 열을 생성
    df_car['doors'] = df_car["num-of-doors"].replace(door_mapper)
    
    # 새로운 df_car의 처음 5개 행을 출력
    df_car.head()
    

    # 'drive-wheels' 열의 각 값들의 개수를 세기
    df_car['drive-wheels'].value_counts()
    
    # 'drive-wheels' 열의 값들을 더미변수로 변환하여 one-hot 인코딩을 수행
    # 해당 카테고리에 해당하는 경우에는 1을, 그렇지 않은 경우에는 0을 할당
    df_car = pd.get_dummies(df_car, columns=['drive-wheels'])
    
    # 변환된 데이터프레임의 처음 5개 행 출력
    df_car.head()
    
    💡 Q. 서수형 데이터와 서수형이 아닌 데이터를 어떻게 인코딩했는지 서술하시오.
    • 서수형 데이터와 서수형이 아닌 데이터서수형이 아닌 데이터는 카테고리간에 상대적인 순서나 등급이 없는 데이터를 말한다. 순서를 갖지 않으며 각 카테고리는 독립적으로 존재한다. 이는 보통 범주형 데이터라고 말한다.
    • 서수형 데이터는 카테고리 사이에 상대적인 순서 또는 등급이 있는 데이터를 말한다. 숫자로 표현되어 있을수도, 아닐수도 있지만 그 값 자체가 큰 의미를 가지지 않을 수도 있는 데이터이다.
    • 우리 데이터에서 서수형 데이터는 ‘num-of-doors’및 ‘num-of-cylinders’ 열에 해당한다. 이러한 열의 카테고리들을 숫자로 매핑하여 변환하였다. 위 코드에서 볼 수 있듯이 ‘two’는 2로, ‘four’는 4로 매핑하여 숫자형으로 변환하였다.
    • 서수형이 아닌 데이터는 ‘drive-wheels’, ‘aspiration’열에 해당한다. 이 열은 더미변수로 변환하여 one-hot 인코딩을 진행하였다. 여기서 더미변수란 각 카테고리를 새로운 이진변수로 변환하는 방법을 말한다. 각각의 범주에 대해 새로운 열을 생성하고, 해당 범주에 해당한다면 1을, 그렇지 않은 경우에 0으로 처리하게 된다. 이러한 처리를 통해 숫자형으로 변환하고, 모델에 적용하기에 적합한 형태로 바꿀 수 있었다.