<데이터 분석(Data Analysis)>
데이터를 수집, 정리, 가공, 분석하여 의미 있는 정보를 도출하는 과정이다.
- CRISP-DM (데이터 마이닝과 분석 프로젝트를 위한 표준 프로세스 모델, Cross-Industry Standard Process for Data Mining)
1. 비즈니스 이해 (Business Understanding)
2. 데이터 이해 (Data Understanding)
3. 데이터 준비 (Data Preparation)
4. 모델링 (Modeling)
5. 평가 (Evaluation)
6. 배포 (Deployment)
<파이썬 모듈과 라이브러리>
모듈 (Module): 파이썬에서 모듈은 여러 개의 함수, 클래스, 변수를 포함한 하나의 파일(모듈명.py)
- 모듈을 불러와서 사용하기 ( import 모듈명 )
모듈에서 특정 함수만 가져오기
- from 모듈명 import 함수명 : 모듈명을 생략하고 함수만 사용 가능.
모듈에서 모든 함수 가져오기
- from 모듈명 import * : 모듈 내 모든 함수를 가져온다.
패키지 사용 예시
패키지는 관련된 모듈들을 묶어서 관리할 때 유용하다.
mypackage 폴더에 있는 calc.py, geometry.py 모듈을 사용한다.
<NumPy>
NumPy(Numerical Python): 대용량의 데이터 수치 계산을 빠르게 수행할 수 있도록 최적화된 필수 라이브러리 제공
- 설치 방법 : !pip install numpy
NumPy 배열(ndarray) 만들기 # ndarray=행렬
- 리스트를 NumPy 배열로 전환
- 다양한 방법으로 배열 생성
1. zeros( , ) 모든 요소가 0인 배열
2. ones( , ) : 모든 요소가 1인 배열
3. arrange() : 특정 범위의 숫자로 배열 생성 # 간격 생성 가능
(이상, 미만, 간격)
4. linspace() : 지정된 범위에서 균일한 간격으로 숫자 생성
- (이상, 이하, 간격) # 이상과 이하를 포함한 간격 생성
5. random.rand() : 난수 배열 생성
- np.random.seed(고유한 숫자) #난수 생성 방식 고정
ex. seed(1)로 생성하면 다음에 seed(1)을 생성할 때 똑같이 생성 됨
6. argmax() : 최대값의 인덱스를 알려줌
NumPy 배열의 주요 연산
- 기본 사칙 연산 (덧셈 뺄셈, 곱하기, 나누기)
- 배열의 형태(shape)와 크지(size) 확인
- 열 인덱싱&슬라이싱
n mean() 평균 구하기
n sum() 합계 구하기
n max() & min() 최대값&최소값 구하기
n reshape() 배열의 형태 변경
입력: import numpy as np
<pandas> # NumPy에서 유래
입력: import pandas as pd
데이터 분석과 데이터 조작을 위한 Python 라이브러리
- Series : 1차원 데이터(하나의 열,) # 리스트와 유사함
n 인덱스는 별도의 시리즈가 아니라 모든 시리즈에 같이 포함되어 있음
# 인덱스는 첫번째 열이 아님. 그냥 별개
n series = pd.Series(data, index=???)
# inedex=???은 인덱스의 이름들 설정. 숫자가 아니라 그렇다고 순서(숫자 인덱스)가 사라지는 건 아님. 사용 가능
n 원래는 한 번에 여러 개 인덱싱이 불가능하지만 pandas에선 가능
u series[ [인덱스1, 인덱스2, ---] ]
- DataFrame : 2차원 데이터(엑셀과 유사)
n Series가 여러 개 모이면 그게 DataFrame
n df = pd.DataFrame(data, columns = [n, m , ---], index=[???])
u df[컬럼이름] # series로 결과값 나옴
l 조건문을 사용해서 필터링 가능 ex. df[df[“나이”] > 20]
u df.loc[행이름or인덱싱] # 행 가져오기(여러 개 가능)
- IBM HR Analytics Employee.csv 를 활용해 자료 구조 탐색
1. 데이터 불러오기
n pd.read_csv(파일경로) # !dir 로 파일경로 검색 가능
2. 데이터프레임 기본 정보 확인
n df.info() : 열의 데이터 타입, 누락된 값의 개수, 메모리 사용량 등 확인 가능
3. 기술 통계량 확인
n df.describe() : 평균, 표준편차, 최솟값, 최댓값, 사분위수 등 # 숫자형 데이터만 가능
4. 카테고리별 개수 확인
n df[컬럼명].value_counts() : 범주형 데이터(종류)의 고유값별 개수를 세줌
5. 첫 5행과 마지막 5행만 확인
n df.head() # 괄호 안의 숫자만큼 보여줌(기본값이 5)
n df.tail()
<데이터 유형>
데이터 유형에 따라 적절한 분석 기법과 전처리 방법이 달라진다.
1. 범주형(Categorical Data) : 범주(Category)로 구분되는 데이터 ex.성별, 도시, 혈액형
- 명목형(Nominal) : 순서가 없는 범주형 데이터
- 서열형(Ordinal) : 순서가 있는 범주형 데이터
NumPy -> Pandas(Series, DataFrame(엑셀)) // df.info() ->object (숫자형을 제외한 모든 형태 가능, but 문자열이 대부분)
범주형 데이터 분석할 때는 문자열 데이터를 정수 등의 다른 형태로 변환(인코딩) 먼저 해야 함.
서열형은 숫자 형태로 변환할 때 순서를 유지해야 함.(차등을 둔다던가)
2. 숫자형(Numerical Data) : 숫자 연산이 가능 ex.나이, 키, 온도
- 이산형(Discrete) : 정수 값으로 표현되는 데이터
- 연속형(Continuous) : 실수 값으로 표현되는 데이터
3. 날짜 및 시간 데이터(Temporal Data)
시계열 데이터 : 날짜와 시간이 포함 되 있으면서 오름차순으로 정렬된 데이터
<데이터 살펴보기>
- shape
- Head() : 상위(언제부터?) Tail() : 하위(언제까지?)
- 데이터 정보 확인: info()
- value_counts()
- describe()
n unique : 고유 개수
n top : 최빈값
n freq : top 값의 등장 횟수
- columns
n 컬럼명을 수정 가능
- dtypes : 모든 값 형태 확인
- loc[행, “컬럼명”] # 컬럼명을 알 때는 loc
n 행도 문자열이면 “ “ 필요
n 여러 개를 보고 싶을 땐 loc[0, [“a”, “b”]]
n 행이름, 컬럼이름 검색은 loc 이용
n 행인덱스, 컬럼인덱스로 검색할 땐 iloc
n 슬라이싱 가능
u df.loc[0:3, “이상”:”이하”] (순서도 모르고 앞이 뭔지도 모르니까)
너무 자세히 외울 필요 없다. 기능이 너무 많으니까 그때 그때 써보면서 수정할 것!
- Iloc[m행, n열] # 인덱스를 알 때는 iloc
n n열의 m번째 행 index를 알 수 있다.
n 행 인덱스가 숫자일 때만 사용(인덱스로 검색!). 문자면 loc 사용(숫자도 가능하나 이름 그대로, 인덱스X)
n 슬라이싱 가능
u df.iloc[“이상”: “미만”]
- df[“날씨”].unique()
- df[“날씨”].nunique(dropna=True) #값이 없는 건 무시하라는 의미
- df[“날씨”].value_counts(dropna=False) #True가 기본값, False로 하면 결측치가 몇 개인지 확인 가능
주요 데이터 필터링
- 조건식 : df[df[“날씨”] == “눈”]
df[(df[“날씨”] == “눈”) & (df[“공휴일”] == “X”)] #다중 조건 필터
n 논리연산자 기호 (반드시 기호로 써야함, 글자X)
l not ( ~ 또는 ! )
l and ( & )
l or ( | )
- df[df[“날씨”].isna( )] #결측치
- df[df[“날씨”].notna( )] #결측치가 아닌 것
- loc를 활용한 조건 필터링
n df.loc[df[“날씨”] == “눈”] #loc 생략 가능
n df.loc[(df[“날씨”] == “눈”) & (df[“공휴일”] == “X”)] #loc 생략 가능
u df[df[“날씨”] == “눈”], [[“날짜”, “유료합계”]] #위와 똑같다!
n df.loc[df[“날짜”].str.contains(“-12-“)] #loc 생략 가능
# .str 은 pandas에서 사용 가능한 형변환 메서드
n 있으면 출력 해주세요
u df.loc[df["날씨"].isin(["맑음", "구름 많음"])]
이런 구조이다~ 정도만 이해하면 됨. 자세히 외울 필요X 어차피 주어짐
n 특정 범위 내 값 필터링
u df.loc[df["날짜"].between("2016-01-03","2016-01-10")]
<데이터 전처리>
데이터 분석에서 데이터 전처리(Data Preprocessing)는 필수적인 과정이다.
대표적인 전처리 작업 -> 결측치 제거, 중복 데이터 제거, 이상치(이상한 값) 제거
데이터 직접 처리 (열 추가/삭제)
- Columns 추가
n df[“성별”] = “남자” #‘성별’이라는 열을 추가하고 모든 값은 남자
- Columns 삭제
n df = df.drop(columns = [“도시”]) #’도시’열을 삭제
u df = df.drop(“도시”, axis=1) #’도시’라는 열을 정확히 지우기 위해서 axis 사용. #axis=1 열 삭제 , axis=0 행 삭제
결측치 제거
데이터가 누락된 상태(null, NaN, na)를 의미.
1. 결측치 확인 : isnull( )
A. 결측치 카운팅
df.isnull( ).sum( ) #일반적으로 False=0, True=1로 취급하므로
2. 결측치 제거 : dropna( )
A. df.dropna( ) #결측치가 있는 행을 모두 제거
3. 결측치 대체 : fillna( )
A. df[“나이”].fillna(df[“나이”].mean( ))
B. df[“도시”].fillna(“알수없음”)
중복 데이터 제거
1. 중복 데이터 확인하기 : duplicated( )
A. 중복 카운팅
duplicated( ).sum( )
2. 중복 데이터 제거 : drop_duplicates( ) #pandas에 따라 인덱싱 정렬 해줄수도 있음
A. subset 옵션 # 특정 열을 기준으로 중복을 판단
B. keep옵션 # 처음 나온 데이터는 유지하고 후에 중복되는 데이터 지움
3. value_counts( )
이상치 제거
정상적인 패턴에서 벗어난 극단적인 값
1. 이상치 확인 (IQR 방법 사용)
A. Q2 = 중앙값 = Median # 데이터 개수 기준
중앙값은 평균값이 아니다! # 평균값은 이상치에 영향을 크게 받음
<데이터 결합>
1. Merge : 특정 key를 중심으로 두 데이터프레임을 병합.
A. 기준 데이터가 무엇인지 중요
i. inner : 교집합
ii. left : 왼쪽에 쓴 데이터 기준(절대 지워지면 안됨, 원본 유지)
iii. right : 오른쪽에 쓴 데이터 기준(절대 지워지면 안됨, 원본 유지)
iv. outer : 합집합
2. Concat : 여러 데이터프레임을 행 또는 열에 이어 붙임. #데이터의 순서가 동일해야 함
< scikit-learn >
scikit-learn은 Python 기반의 머신러닝 라이브러리로, 머신러닝 모델을 쉽게 학습하고 평가할 수 있도록 다양한 기능을 제공. #데이터 전처리, 머신러닝 모델, 모델 평가, 하이퍼파라미터 튜닝, 딥러닝까지…
설치방법: pip install scikit-learn #설치는 scikit-learn, 파이썬에서 사용할 땐 sklearn
범주형 주의사항: 통계(수치)를 활용하려면 수치로 변환해야 함(인코딩)
범주형 데이터 처리 #object라는 d타입 가지고 있다??
1. 레이블 인코딩(Label Encoding)
A. 문자열을 사전 순으로 정렬 후 순서대로 숫자 배열 #0, 1, 2, ---
B. 다중 데이터 처리를 위해 class와 객체가 필요
C. 순서가 존재하게 되므로 문제가 발생할 수도 있다 -> 원핫인코딩 ㄱㄱ
2. 원-핫 인코딩(One-Hot Encoding)
A. 각 범주를 별도의 열로 만들어 1 또는 0(T/F)로 표현하는 변환 방법
B. column의 개수가 너무 많아질 수 있다는 단점
C. 원-핫 인코딩은 pandas 사용하는 게 더 편함
scikit-learn과 전처리
Normalization(정규화)과 Standardization(표준화)는 데이터의 크기를 조정하는 대표적인 방법이다.
머신러닝이나 딥러닝 모델을 학습할 때, 특정 특성(feature)의 값이 너무 크거나 작으면 모델이 제대로 학습하지 못할 수 있다.
- Normalization(정규화) : 데이터를 0과 1 사이의 값으로 변환하는 방법
컬럼 = 열 = 특성 = feature = 변수
n 최소-최대 정규화(Min-Max Scaling) 이용
n 이상치에 크게 영향 받을 수 있다.
- Standardization(표준화) : 데이터를 평균이 0, 표준편차가 1인 정규 분포로 변환 방법
n 이상치가 있어도 크게 영향을 받지 않는다.
n 평균과 분산이 크게 차이가 나는 경우에 사용
n 데이터가 정규분포를 따르는 경우, 분석이 더 정확해질 수 있다.
n Z분포 표준화(Z-Score Standardization) 이용
수치형 데이터의 전처리는 필수는 아니지만 분석의 정확성을 높이기 위해 한다.
<기술 통계>
복잡한 데이터를 한눈에 이해할 수 있도록 요약하는 과정
- 중심 경향성 (데이터의 대표값 찾기)
1. 평균(Mean)
2. 중앙값(Median)
A. 데이터의 개수가 짝수라면 중앙 2개 값의 평균이 중앙값
3. 최빈값(Mode)
- 산포도(데이터의 퍼짐 정도 측정)
1. 범위(Range)
2. 분산(Varience
3. 표준편차(Standard Deviation)
- 분포(데이터의 형태 분석)
1. 왜도(Skewness): 데이터가 좌우 어느 쪽으로 치우쳐 있는지를 측정
A. 왜도 > 0 #오른쪽으로 치우침
B. 왜도 < 0 #왼쪽으로 치우침
C. 왜도 = 0 #정가운데 치우침
2. 첨도(Kurtosis): 데이터가 얼마나 뾰족한 지를 나타냄
A. 첨도 > 3 #뾰족 분포
B. 첨도 < 3 #평평한 분포
#scipy 고급수학,고급과학 용
평균의 함정 – 심슨의 역설 #그룹별 집계의 필요성
상관관계
두 변수 간의 선형 관계의 정도를 정량적으로 나타내는 값 ( -1 <= r <= 1 )
<그룹별 집계>
그룹별로 데이터를 나누고 세분화된 분석이 가능하다.
- groupby() # 쓰임성이 좋다
- df.groupby(‘그룹컬럼’)[‘컬럼명’].sum()
- df.groupby(‘그룹컬럼’).agg({‘A’:’mean’, ‘B’:’sum’})
집계 결과 시각화
import matplotlib.pyplot as plt #국룰
- 막대 그래프: plot(kind=’bar’)
- 파이 차트: plot(kind=’pie’)
- 라인 그래프: plot(kind=’line’)