복습 노트

데이터 분석 1

에이블러 2025. 10. 18. 00:48

<데이터 분석(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’)

'복습 노트' 카테고리의 다른 글

딥러닝  (0) 2025.11.05
머신러닝  (0) 2025.10.25
데이터 분석 2  (0) 2025.10.19
파이썬 기초  (0) 2025.10.16
DX의 이해  (0) 2025.10.14