데이터 분석을 위한 라이브러리 종류
- numpy (numeric python) : 연속형 자료에 대한 과학, 통계, 수학 연산 관련 함수들의 집합
- pandas (panel dataset) : 정형데이터(execl, csv, sql, ...)를 처리, 분석, 통계 연산 함수들의 집합
- matplotlib (matlab plot library) : 연속형 자료들의 그래프를 시각화 하는 함수들의 집합
- seaborn : 정형데이터의 통계적 연산 및 시각화
- plotly : 정형데이터의 시각화 (동적 시각화)
- scipy (science python) : 응용통계(가설 검정, 회귀 분석, 시계열 분석) 함수들의 집합
- scikit-learn (science python learning toolkit) : 정형데이터에서 기계학습(데이터 마이닝) 함수들의 집합
- tensorflow (tensor flow) : 비정형데이터 처리 및 신경망 알고리즘(딥러닝) 함수들 집합
- keras : 신경망 알고리즘 함수들의 집합
- pytorch : 비정형 데이터 처리, 딥러닝, ...
- request : 웹으로 부터 정보를 주고 받거나 추출할 때 사용
- bs4 : 웹 기반(HTML)형식의 자료를 분해하여 정보를 추출할 때 사용
- selenium : 프로그램이나 어플리케이션의 진단 및 자동화, 크롤링 사용
Numpy
import numpy as np
data1 = np.array(list) # 리스트 자료구조를 배열 자료구조로 변환
print(data1.mean())
print(data1.min())
print(data1.max())
np.arange(a, b, d, dtype='float') # a에서 b까지 d간격으로 배열을 생성하고 이때 값의 타입을 dtype으로 정한다.
np.linspace(a, b, t) # 특정 간격[a, b] 내 데이터의 개수(t)를 지정하여 배열을 생성
np.vstack([matrix, [new_line]]) # 기존의 matrix에 new_lise을 추가
matrix.reshape(a, b) # a * b로 행렬 재구조화
matrix.sum(axis = 0) # 열 단위로 합 계산
matrix.sum(axis = 1) # 행 단위로 합 계산
Pandas
Series(시리즈)
Numpy의 1차원 배열을 기반으로 하는 구조로 인덱스와 값의 쌍으로 구성되어 있다.
정형 데이터를 다룰 때 유용하며, 파이썬의 딕셔너리와 유사한 형태를 가진다.
s1 = pd.Series([100,200,300,500])
s1.index # 시리즈의 Index
s1.values # 시리즈의 Value
pd.Series( [100,200,300,400], index=['1st','2nd','3rd','4th'] ) # Index의 정보를 숫자가 아닌 다른 정보를 입력
DataFrame(데이터프레임)
여러 개의 Series가 모여 행과 열 구조를 이루는 2차원 테이블 형태의 자료구조로 엑셀 표처럼 행과 열이 있어 다양한 데이터 분석 및 처리 작업에 적합하다.
df = pd.DataFrame([100,200,300,400]) # DataFrame 구조
df[col1] # Series형태로 하나의 Column을 추출
df[[co1, ..., coln]] # 두 개 이상의 Column 대해서는 DataFrame 형태로 추출
기술적 데이터 분석 (DDA, Descriptive Data Analysis)
데이터를 불러와 기본적인 정보를 파악하는 것으로 행/열과 같은 데이터의 구조와 숫자형, 문자형과 같은 타입을 확인한다.
문제 해결에 있어 가장 중요한 변수인 목표변수를 설정한다.
목표변수를 설명하는 설명변수를 구분한다.
각 열별로 평균, 중앙값, 분산과 같은 기술 통계량을 계산하여 데이터의 분포와 특성을 파악한다.
데이터 구조와 타입 확인
정형 데이터의 구조
Index : 데이터의 순서를 나타내는 고유 식별자로 인덱스를 통해 데이터의 개수를 확인할 수 있다.
데이터 개수에 따라 필요한 전처리 및 분석 기법이 달라질 수 있다.
Column : 데이터의 항목이다.
데이터 타입에 따라 분석 방법이 달라질 수 있기 때문에 각 컬럼의 데이터 타입을 확인해야 한다.
연속형 : 숫자 데이터 (int, float) → 평균, 분산 등 수치 분석
범주형 : 문자 데이터 (object) → 빈도 분석, 교차 분석 등
순서형 : 날짜/시간 데이터 (datetime) → 시계열 분석 등
Value : 각 데이터의 실제 값이다.
만약 날짜 데이터를 2025-03-26, 25년 3월 26일, 25.3.26처럼 혼합해서 입력하면, 프로그래밍 처리 시 오류가 발생할 수 있기 때문에 데이터의 형식을 통일해야한다.
결측값 확인
데이터 수집이나 처리 과정에서 누락 또는 오류로 인해 발생한 비어있는 데이터로 보통 None, NaN, Null, NA 등으로 표현된다.
결측값 처리는 데이터 품질 확보와 분석 정확도를 위해 필수적인 작업이다.
df.shape # 행/열 개수 확인
df.info() # 데이터의 구조와 타입을 확인
데이터 전처리
데이터 추출
df.head() # 상위 n개의 데이터 출력
df.tail() # 하위 n개의 데이터 출력
df.iloc[n : m] # n번째 부터 m번 이전까지 데이터를 출력
데이터 정렬
df.sort_values(by = 'col_name') # col_name으로 데이터를 정렬 (기본 오름차순)
df.sort_Values(by = 'col_name', ascending = False) # 내림차순으로 데이터 정렬
데이터 필터
cond = df['col_name'] >= 10000 # col_name의 행에서 값이 10000보다 크면 True
cond = df['col_name'].isin(['a', 'b']) # 하나의 범주형 항목에서 여러 개의 데이터를 한 번에 추출할 때
df.loc[cond] # 해당 cond을 만족하는 행만 남김
# 만약 조건이 여러개라면
df.loc[cond1 & cond2] # cond1과 cond2를 모두 만족하는 경우
df.loc[cond1 | cond2] # cond1을 만족하거나, cond2를 만족하는 경우
데이터 요약
# 특정 항목에 따라 특정 값의 통계량을 계산
df.pivot_table(index = 'col1', columns = 'col2', values = 'col3', aggfunc = ['mean', 'sum', 'max'], fill_value = 0, margins = True)
# index = : 나누고자 하는 범주형 항목
# values = : 계산하고자 하는 연속형 데이터
# aggfunc =: 계산하고자 하는 통계량
# fill_value = : 요약의 결과 중 결측값에 해당하는 값을 특정 값으로 대치
# margins = : 특정 행 또는 열 전체의 통계량을 계산
날짜 데이터 처리
df['datetime'] = pd.to_datetime(df['date']) # 날짜 데이터를 날짜 형식의 데이터 타입으로 변형
df1['Year'] = df1['Datetime_dt'].dt.year # 연도 추출
df1['Month']= df1['Datetime_dt'].dt.month# 월 추출
df1['Days'] = df1['Datetime_dt'].dt.day #일 추출
df1['Day_of_Week'] = df1['Datetime_dt'].dt.day_name() # 요일 추출
df1['Week'] = df1['Datetime_dt'].dt.isocalendar().week # 주차 추출
파생변수 생성
# 사용자 함수를 만들어서 특정 데이터를 처리
def func1(row):
if pd.isnull(row): # 특정 값이 결측값인지 확인
return '미확인'
if row >=70:
return '70대'
elif row >= 60:
return '60대'
elif row >=50:
return '50대'
elif row >=40:
return '40대'
else:
return '30대'
df1['Age_Group']= df1['Age'].apply(func1) # apply() : 특정 시리즈의 각 Row 값을 특정 함수의 매개변수로 할당
결측값 처리
- 결측값 제거
결측값이 존재하는 행 또는 열을 삭제하는 방법이다.
단, 데이터 손실이 크지 않을 때만 사용하는 것이 좋다.
dp.isnull().sum() # 각각의 열별로 결측값의 개수를 확인
df.dropna() # 특정 행에 결측값이 존재하면 해당 행 정보를 삭제
df.drop(columns = ['col1', 'col2', 'col3']) # 특정 행 또는 열을 삭제
- 결측값 대치(Imputation)
결측값을 다른 값으로 채워 넣는 방법이다.
단순 대치
평균, 중앙값, 최빈값과 같이 해당 컬럼을 대표할 수 있는 값으로 결측값을 대체한다.
df['col'].fillna(0) # 결측값을 0으로 대치
df['col'].fillna(df['col'].mean()) # 결측값을 평균으로 대치
알고리즘 대치
회귀, KNN, 랜덤포레스트와 같은 머신러닝 모델을 사용하여 결측값을 예측하고 대체한다.
이는 정교한 예측이 가능하지만, 추가적인 모델 학습이 필요하다.
보간법
시간 순서나 순서 간격을 고려하여 결측값을 예측하고 채운다.
주로 시계열 데이터에 사용된다.
데이터 병합 및 재구조화
pd.read_excel('a.xlsx', skiprows = 1) # 데이터를 불러오는 단계에서 특정 index생략
df.melt(id_vars = ['a', 'b', 'c', 'd']) # id_vars는 고정하고 나머지 열들은 value를 가진 데이터로 펼친다.
pd.merge(df1, df2, on = 'col', how = 'inner') # df1과 df2를 col을 key로 inner방식으로 병합
기술 통계량
데이터의 특성을 파악하기 위해 기본적으로 확인하는 통계량
df.describe()
연속형 데이터
대표값
평균: 전체 데이터를 합산한 후 데이터 개수로 나눈 값
중앙값: 데이터를 크기 순으로 정렬했을 때 중앙에 위치하는 값
평균은 이상치에 민감하므로 항상 중앙값과 함께 확인해야 한다.
df['col'].mean() # 평균
df['col'].median() # 중앙값
산포
표준편차: 데이터가 평균으로부터 얼마나 퍼져 있는지를 나타내는 지표로 표준편차가 작으면 데이터가 대표값 주변에 모여 있고, 표준편차가 크면 퍼져 있음을 의미한다.
데이터 수가 많아질수록 중심 극한 정리에 의해 대표값 주변으로 모이는 경향이 있다.
# 사분범위 (IQR) : 전체 데이터의 50% 모여있는 구간
print(df1['col'].std()) # 표준편차
print(df1['col'].quantile(0.25)) # 25% 1사분범위 값
print(df1['col'].quantile(0.75)) # 75% 3사분범위 값
분포 형태에 따라 적절한 가설검정 및 통계 분석 방법이 달라지기 때문에 데이터가 따르는 분포 형태를 시각화하여 확인한다.
정규분포: t-test, ANOVA 등 사용 가능
비정규분포: 비모수 검정 등 대안 필요
범주형 데이터
항목과 빈도수: 데이터에 존재하는 고유 값들의 종류와 각 값이 등장한 횟수를 확인한다.
필요에 따라 비율 분석도 함께 수행한다.
df['col'].unique() # 특정 범주형 항목에 있는 값 확인
df['col'].value_counts() # 특정 범주형 항목의 빈도수 확인
df['col'].value_counts().index # 빈도수가 높은 순서대로 나열된 시리즈에서 각 항목의 순서를 array형태로 출력
'컴퓨터 > 디지털 하나로' 카테고리의 다른 글
탐색적 데이터 분석(EDA) (0) | 2025.04.27 |
---|---|
데이터 분석 기초 통계 (0) | 2025.03.25 |