Statistics/ML | Python

머신러닝이 뭐여 5탄 (feat. 데이터 종류, 조건을 이용한 추출, 결측치, 이상치)

clodagh 2023. 2. 18. 20:44

Intro

- 데이터 종류

- Numpy 와 Pandas

- 데이터 불러오기

- 데이터 살펴보기

- 새로운 열 만들기

- 특정 조건으로 검색

- 결측치

- 이상치

 

데이터 사이언스란?

  • 데이터로부터 원하는 내용을 얻기 위해 과학적인 방법을 사용하는 모든 분야를 통틀어서 부르는 용어
  • 데이터를 통해 얻은 지식과 인사이트를 신제품 개발이나 마케팅 등 여러가지 필요한 목적에 따라 활용
  • 여러가지 분석방법을 알고 있을 수록 데이터가 가지고 있는 숨은 가치를 발견할 확률이 높아짐

데이터의 종류

데이터의 구성 형태에 따른 분류

코딩엑스

정형 데이터

  • 규칙에 따라 정리된 데이터
  • 정해 놓은 형식과 구조에 맞게 저장
  • 데이터에 대한 부분 검색이나 갱신, 삭제, 연산, 분석 작업이 편리
  • 학교의 성적 데이터, 회사의 매출 데이터

비정형 데이터

  • 미리 설정된 구조가 없는 데이터를 뜻함
  • SNS나 웹에서 끊임없이 생성되고 있는 글, 사진, 동영상 등이 모두 비정형 데이터에 속함

 

Numpy 와 Pandas

Numpy

  • 파이썬에서 산술적인 계산을 할 때 핵심적으로 사용되는 라이브러리
  • Numerical Python (수에 관한)
  • 선형대수를 계산, 난수 생성, 다차원 배열 객체를 다룸

Pandas

  • 형태가 정해져 있는 정형 데이터를 손쉽게 다룰 수 있도록 제작됨
  • MS EXcel과 비슷한 기능

 

Pandas 알아보기

데이터 불러오기

‘import 라이브러리이름’ 을 작성하면 해당 라이브러리를 불러올 수 있음

 

Excel과 CSV 파일

  • csv 파일을 불러올 때는 pandas에 있는 read_csv 기능을 사용
  • data = pd.read_csv('데이터파일경로와이름')
import pandas as pd

data = pd.read_csv('./public/csv/practice01.csv')
print(data)

# 데이터의 처음,끝 5개 줄을 보는 코드는 데이터 이름 뒤에 .head()를 붙여 사용합니다. 

data.head()
data.tail()

 

데이터 살펴보기

 

특정 데이터 검색

  • data[시작숫자 : 끝다음숫자] → 행 검색의 시작과 끝을 정할 수 있음
  • 시작부터 특정 번호까지
    • data[ : 번호숫자]
  • 특정 번호부터 끝까지
    • data[번호숫자 : ]

데이터의 특성 이름 확인하여 출력

  • print(data.columns)

특성을 통한 데이터 선택

  • data[‘특성이름’]

행(Row)과 열(Column)을 동시에!

  • iloc이라는 기능을 활용하면 행과 열을 동시에 고려하여 데이터를 선택할 수 있음
  • 데이터 뒤에 .iloc[,]을 입력하고 쉼표를 기준으로 앞쪽은 행, 뒤쪽은 열
    • data.iloc[행의숫자,열의숫자]

여러개의 행과 여러개의 열 선택

  • data.iloc[시작행숫자 : 끝행다음숫자, 시작열숫자 : 끝열다음숫자])
#3~5번 행, 2~3번 열을 선택하여 출력해(print) 보세요
import pandas as pd
data = pd.read_csv('./public/csv/practice01.csv')

print(data.iloc[2:5,1:3])

 

데이터의 복사

1. 전체 데이터 복사

  • 데이터를 복사하는 방법은 데이터 뒤에 .copy()를 붙여서 새로운 이름에 저장하는 것
  • 새로운 이름 = data.copy()

2. 원하는 특성만 골라서 복사

  • 때에 따라선 데이터의 전체가 아니라 필요한 특성만 선정하여 복사하고 사용할 수 있음
  • 새로운이름 = data[['특성이름','특성이름']]

특성의 생성과 삭제

 

특성 이름 바꾸기

  • 기본적인 변경은 특성의 이름을 바꾸는 것
  • 수정할 때는 rename기능을 사용
  • data.rename(columns={‘기존특성이름':'변경할특성이름'}, inplace =True)
#’price’ 특성의 이름을 ‘sales’로 바꾸고 특성이름을(.columns) 출력해(print) 보세요
import pandas as pd
data = pd.read_csv('./public/csv/practice01.csv')

data.rename(columns={'price':'sales'}, inplace=True)

print(data.columns)

 

새로운 특성 생성 (mutate in R)

  • 데이터에 변형을 가하여 새로운 특성을 만들어 내는 것
  • 예를 들어, 데이터에 있는 time 특성이 시간 단위로 설정되어 있다고 가정. 분 단위의 분석을 하고 싶은 사람은 ‘시간’ 특성을 이용하여서 ‘분’ 특성을 만들 수 있음
  • data[‘새로운특성이름’] = data[‘기존특성’]을 이용한 수식이나 함수
    • ex) data[‘time_minute'] = data['time'] * 60
# ’time’ 특성에 60을 곱하여 ‘time_minute’특성을 새로 생성해 보세요.
# 데이터의 앞부분을(head) 출력하여(print) 확인해 보세요
import pandas as pd
data = pd.read_csv('./public/csv/practice01.csv')

data['time_minute'] = data['time'] * 60

print(data.head())

 

특정 조건으로 탐색

등호와 부등호

  • ‘A == B’ A와 B가 같다
  • ‘A != B’ A와 B가 같지 않다
  • ‘A < B’ A가 B보다 작다
  • ‘A > B’ A가 B보다 크다
  • ‘A <= B’ A가 B보다 작거나 같다
  • ‘A >= B’ A가 B보다 크거나 같다

조건을 가진 탐색

  • 특성에 조건을 붙여 필요한 데이터를 검색
  • data2 = data[(data[‘특성이름’]조건)]
    • ex) data[(data[‘grade’] > 3)]
#data2에 성별이(gender) 남성과(male) 같은(==) 데이터만 할당하여 출력해 보세요
import pandas as pd
data = pd.read_csv('./public/csv/practice01.csv')

data2 = data[data['gender'] == 'male']
print(data2)

#data2에 나이가(age) 30 미만(<)인 데이터만 할당하여 출력해 보세요
import pandas as pd
data = pd.read_csv('./public/csv/practice01.csv')

data2 = data[data['age'] < 30]
print(data2)
  • 두 개 이상 조건 → and , or 안돼 ! & | 쓰셈
#data2에 성별이(gender) 남성(male) 그리고(&) 나이가(age) 30 미만(<)인 데이터만 저장하여 출력해(print) 보세요
import pandas as pd
data = pd.read_csv('./public/csv/practice01.csv')

data2 = data[(data['age']<30) & (data['gender'] == 'male')]
print(data2)

 


결측치(Missing Value)

보통 데이터가 없는 부분에는 'Na', 'NaN' 혹은 'Null'이라고 표현 또는 빈칸인 경우도 있음

 

결측치의 종류

  • 완전 무작위 결측
    • 실수로 마킹을 하지 못해서 생기거나 데이터 수집 시스템의 오류 등, 예기치 못하게 발생하는 결측치
  • 비 무작위 결측
    • 여러 문항 중에 유독 너무 어려운 문제가 있어 답변을 못한 학생이 많다면, 문항의 난이도가 결측치에 영향을 미쳤을 지도 모름. 결측치로 신중한 관찰이 필요. → ‘어렵다’ 라는 의미 내포

 

결측치 찾기

결측치 개수 확인 : info()

  • 'info()' 함수를 사용하면 어떤 특성(칼럼, 열)에 결측치가 얼마나 있는지 한 눈에 확인
  • 데이터 변수의 이름 뒤에 .info()를 입력
    • RangeIndex 항목에 전체 데이터 수가 표시
    • Data columns 항목에 데이터 특성의 수가 표시
    • Non-Null Count 항목에 각 특성별 결측이 아닌 값이 표시

30개의 행 X 6개의 열

결측치 위치 확인 : isna(), isnull()

  • data.isna()
  • data.isnull()
    • T 또는 F 반환

 

이상치(outliers)

  • 데이터의 값이 나머지 다른 데이터와는 극명하게 다른 경우가 있습니다. 이런 데이터를 이상치(Outlier)
  • 파이썬에서 히스토그램(Histogram)을 그리기 위해 'matplotlib' 라이브러리를 사용
  • import matplotlib.pyplot as plt
  • plt.hist(data['특성이름'])
# 'grade'특성의 히스토그램을 출력 해보세요.
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('./public/csv/practice01.csv')

plt.hist(data['grade'])

 

이상치의 위치 확인

  • data[(data['특성이름']조건)].index
# 'grade' 특성이 30보다 크다면 이상치로 판단됩니다.
# 'grade' 특성에 조건을 사용하여 이상치의 인덱스를 출력해보세요.
import pandas as pd
data = pd.read_csv('./public/csv/practice01.csv')

print(data[(data['grade']>30)].index)

index 번호 18 번에 이상치(예상)가 있다는 것을 알 수 있음

 

결측치와 이상치의 처리

결측치와 이상치는 원활한 데이터 분석에 방해가 되는 요소

 

결측치의 제거 : dropna()

  • 가장 간단한 방법은 해당 데이터를 제거하는 것
  • 결측치에 비해 데이터의 수가 많으면 결측치를 제거해도 데이터의 손실이 크지 않음
  • 특히 완전 무작위 결측 같이 오류나 실수로 인해 발생한 결측치는 제거하는 것이 가장 효율적인 방법
  • 새로운데이터변수 = data.dropna()
    • 결측치가 있는 을 삭제

이상치의 제거 : drop()

  • 그 자체로 의미를 가지는 이상치의 경우에는 삭제를 하기 전에 신중하게 판단
  • drop 함수의 괄호 안에 인덱스 번호와 axis = 0 이 입력되면 해당 인덱스의 행이 삭제됨
  • 인덱스번호 = data[(data['특성이름']조건)].index
    • data.drop(인덱스번호, axis = 0)
# 'grade' 특성이 30보다 크다면 이상치로 판단됩니다.
# 'grade' 특성에 조건을 사용하여 이상치의 인덱스를 index_number 변수에 할당 해보세요.
# index_number 변수를 활용하여 이상치를 제거하고 data2에 할당 해보세요.
# data2 변수를 출력(print) 해보세요.
import pandas as pd
data = pd.read_csv('./public/csv/practice01.csv')

index_number = data[(data['grade']>30)].index
data2 = data.drop(index_number, axis = 0)
print(data2)