본문 바로가기

파이썬 & 머신러닝과 딥러닝

데이터 수집 및 정제 (데이터 결합, 데이터 변환, 데이터 정제), 시각화

 

데이터 결합 

병합(merge), 결합(join)

: 데이터프레임의 공통 열(column) 혹은 인덱스(index)를 기준으로 두 개의 데이터프레임 합침

이 때 기준이 되는 열, 행을 key(키)라고 

 

병합 merge

비교 기준 항목이 같으면 결측치 없는게 일반적

비교 기준이 되는 열(column) 이름이 서로 다를 경우, left_on과 right_on 매개변수를 사용하여 지정

 

 

 

 

결합 join

기존 데이터에 추가로 결합

 

 

 


 

데이터 변환

 

pivot

데이터프레임의 특정 열들을 새로운 행 또는 열로 변환하여 데이터를 재구조화하는 데 사용

 

 

  • 데이터 재구조화 (Reshape):
    • index, columns, values 세 가지 인수를 사용하여 데이터를 재구성
    • pivot 함수는 데이터를 재구성하여 더 쉽게 분석할 수 있도록 힘(긴 형식의 데이터를 넓은 형식으로 변환)
  • 집계 (Aggregation):
    • pivot 함수 자체는 집계 기능을 제공하지 않지만, pivot_table 함수는 데이터를 요약하고 집계하는 데 사용됨.
  • 데이터 요약 (Summarization):
    • pivot을 사용하여 특정 값들에 대한 요약 통계를 쉽게 확인 가능

 

pd.DataFrame.pivot(index = None, columns = None, values = None)

 

Agruments - 기능

  • index : 새로운 데이터프레임의 index에 해당하는 열, 없으면 기존의 index 사용
  • columns : 새로운 데이터프레임의 열에 해당하는 열
  • values : 새로운 데이터프레임의 값에 해당하는 열, 지정하지 않으면 나머지 열 모두 사용

df.pivot(index = 'foo', columns = 'bar', values = 'baz')
# DataFrame의 특정 열(foo, bar, baz)을 기준으로 DataFrame을 재구조화

df.pivot(index = 'foo', columns = 'bar')['baz']
# 첫 번째 방법과 결과가 동일하지만, pivot 메서드의 결과에서 특정 열을 선택하는 방식

 


 

crosstab

  • crosstab 함수는 교차표(크로스탭)를 생성하는 데 사용
  • 두 개 이상의 범주형 변수를 교차하여 빈도 또는 다른 집계값을 계산
  • 주로 범주형 변수 간의 관계를 분석 -> 기본적으로 두 범주형 변수의 빈도수를 계산
  • index와 columns를 지정하기만 하면, 각 조합의 빈도수를 교차표 형태로 나타냄
  • values와 aggfunc를 추가로 지정하지 않으면 빈도수를 계산

 

pd.crosstab(index, columns, rownames = None, colnames = None, margins = False, margins_name = 'All',

dropna = True, normalize = False)

 

Agruments - 기능

 

 

  • index:
    • 교차표(crosstab)에서 행 인덱스로 사용할 데이터
    • 데이터프레임의 열 이름 또는 특정 열을 지정하여 사용할 수 있음
  • columns:
    • 교차표에서 열 인덱스로 사용할 데이터
    • 데이터프레임의 열 이름 또는 특정 열을 지정하여 사용할 수 있음
  • rownames:
    • 행 인덱스의 이름으로 사용될 값
    • 리스트 형태로 여러 개의 이름을 지정할 수 있음
  • colnames:
    • 열 인덱스의 이름으로 사용될 값
    • 리스트 형태로 여러 개의 이름을 지정할 수 있음
  • margins:
    • 부분 합계를 포함할지 여부를 결정하는 매개변수
    • 기본값은 False이며, True로 설정하면 부분 합계가 추가됨
  • margins_name:
    • 부분 합계의 이름을 지정하는 매개변수
    • 기본값은 'All'
  • dropna:
    • True로 설정하면 NaN 값을 포함하지 않고, False로 설정하면 NaN 값을 포함
    • 기본값은 True
  • normalize:
    • normalize=False : 기본 설정으로, 각 범주형 변수의 조합에 대한 빈도수를 계산
    • 반면, normalize 파라미터를 사용하여 결과를 정규화할 수 있습니다. normalize에는 여러 가지 옵션이 있음

 

  1. normalize=True 또는 normalize='all': 전체 데이터의 비율을 계산
  2. normalize='index': 각 행의 비율을 계산
  3. normalize='columns': 각 열의 비율을 계산

 

# index, columns 지정 # 행/열 명칭부여 및 margin 추가

 

# index 1개, column은 복수개 컬럼 지정 가능, # 각 셀의 빈도 기준 정규화 확률 산출

 

 


 

 

데이터 중복 확인

 

중복 데이터 처리 : duplicated, drop_duplicates

  • 중복되는 행을 Boolean 값으로 표시 -> 데이터프레임.duplicated()
  • 데이터프레임.drop_duplicates(['컬럼1']) -> 컬럼1을 기준으로 중복된 행을 제거하고 유니크한 행만 표시

 

# 중복데이터 조회
# 중복데이터 제거

 

 


 

파이썬을 이용한 데이터변환 연습

 

1. 데이터 불러오기

 

 

2. CCTV 데이터 확인

 

# NaN값이 있는 개수 확인 가능

 

# 최근 3년간 cctv증가율 비교
# 증가율 = 2019 ~ 2021 cctv수 / 2019 이전 cctv수

-> 최근 3년간 CCTV가 이전 대비 많이 증가한 구는 '강북구', '중랑구', '송파구', '도봉구', '은평구'라는 것을 알 수 있음

 

 

3. 서울시 인구 데이터 확인

 

# 구별 '외국인비율'과 '고령자비율' 을 계산

 

# 전체 '외국인비율', '외국인'로 정렬

-> 외국인 비율이 높은 구는 중구, 영등포구, 용산구, 구로구, 금천구순으로 나타나고 있다

-> 고령자 비율이 높은 구는 강북구, 도봉구, 중구, 은평구, 중량구 순으로 나타나고 있다

 

 

4. CCTV데이터와 서울시 인구 데이터 병합

 

# cctv_seoul의 '구별'열의 내용이 글자사이 공백으로 인해 병합이 되지 않기 때문에 rename 실시

 

-> 구별 열을 기준으로 cctv_seoul과 pop_seoul을 합친 데이터 생성

 

#의미없는 컬럼을 del 명령어로 제거
# 일반적으로 행을 삭제할 때는 drop, 열을 삭제할 때는 del을 사용
# 2011~21년까지의 cctv수는 의미가 없으므로 삭제

 


 

데이터 정제

데이터 확인을 통해 발견된 결측치나 이상치에 대한 적절한 처리를 통해

데이터 품질을 보강하는 작업

분석 결과의 신뢰성 향상을 위한 사전 작업으로 매우 중요

 

 

결측치

: 데이터 값이 반드시 존재해야함에도 불구하고 누락된 데이터를 의미

(수집 오류, 데이터 처리 오류 등)

일반적인 통계 분석에서는 결측치 자료(행)은 제외됨 -> 분석에 사용되는 데이터양 감소

 

 

연속형 변수의 경우

  • 평균값으로 대체
  • 중앙값으로 대체
  • 최소, 최대값의 중앙값으로 대체 (최소값 + 최대값) / 2
  • 분포 기반 대체 - 자료의 랜덤화 비율 고려
  • 모델(회귀분석, 트리 등)에 의한 대체 (발생 유형이 유사한 값 참조)

 

범주형 변수의 경우

  • 최빈값으로 대체
  • 분포 기반 대체  - 자료의 랜덤화 비율 고려
  • 모델(트리(비선형) 등)에 대한 대체  (발생 유형이 유사한 값 참조)

 

이상치 이해

: 데이터 값이 발생할 수 있는 범위를 벗어난 데이터를 의미 (프로세스 불안정, 급격한 변동 등)

이상치라고 해서 무조건 의미없는 값은 아니라서 충분한 사전 검토 필요

 

이상치 판단 기준

: 일반적으로 IQR을 사용하여 이상치를 판단할 때, 다음과 같은 기준을 적용

  • Lower Fence (이하 한계): Q1 - 1.5 * IQR
  • Upper Fence (이상 한계): Q3 + 1.5 * IQR
  • Lower Fence보다 작거나 Upper Fence보다 큰 데이터는 이상치로 간주함

 

파생변수 생성 및 변환

: 분석 모델이 요구하는 조건을 만족시키기 위해 변수의 값을 변환하거나

새로운 변수를 생성하는 작업

 

  • 모델이 요구하는 가정을 만족시키기 위해 분포의 형태를 변환 ( 정규성, 등분산성, 선형성 가정을 만족시키기 위해 )
  • 서로 다른 단위(ton, g)를 통일시키거나 자료의 크기(scale)이 다른 변수를 척도화하여 분석
  • 기존의 x변수를 사용해서 또 다른 x 변수를 생성

1. 데이터의 변수간의 특성과 수집된 데이터의 단위를 확인

2. 파생변수의 필요성 검토 및 처리 

  • 변수 (목표변수, 설명변수)의 특성 고려 - 변수 값의 형태(2차식, log함수), 변수의 측정단위 고려
  • 범주형 변수에 대한 Dummy 변수 파생 여부 검토
  • One-Hot Encoding : 범주형 변수를 0 또는 1의 이진 형태로 변환하는 과정
  • Label Encoding : 각 범주에 순차적으로 번호를 매기는 방식 ( 선형 회귀와 같은 알고리즘 )

3. 변수의 크기 조정 필요성 검토 및 처리

  • 평균 - 표준편차 척도화 (Standardization) : 변수의 값들을 평균이 0이고 표준편차가 1이 되도록 변환
  • 최대 / 최소 척도화 (Min-Max Scaling) : 일반적으로 0과 1 사이의 값으로 변환
  • 로버스트 척도화 (Robust Scaling) : 변수의 값들을 중앙값과 IQR(사분위 범위)을 사용하여 변환하는 방법

 

데이터 정제_ 연습

  • 결측치 확인 : isnull(), isna()
  • 결측치 빈도 집계(컬럼단위로 결측치 몇개) : isnull().sum()
  • 결측치 대체: fillna(value=결측치 대체할 값, method=연속 자료의 결측치 대체 방법, axis=처리기준 0:행,1:변수, inplace =False 결측치 대체 후 저당)
  • Dummy 변수 생성(범주형 설명변수 변환) : get_dummies(더미변수생성데이터, prefix = 생성될 더미변수 접두어, prefix_sep='_' 접두어 뒤 구분자)
  • 요약통계량 : describe()

 

Scale 변환

1. 표준(평균, 표준편차), StandardScaler()

sklearn.preprocessing.StandardScaler(X, axis = 0, with_mean= True, with_std = True)

 

2. 최소최대 척도화, MinmaxScaler()

sklearn.preprocessing.MinMaxScaler(feature_range = (0, 1) 최소최대 범위지정)

 

3. 이상치에 둔감, RobustScaler()

sklearn.preprocessing.RobustScaler(X, axis=0, with_centering = True 척도화 전에 중심화 적용,

                                                           with_scaling = True 단위 변동 기준 척도화 적용,

                                                           quantile_range = (25.0, 75.0) 분위수 지정)

 


 

0. 패키지 불러오기, 환경 설정

 

1. 데이터 불러오기

-> GENDER, WEIGHT 변수에 결측치 존재

 

 

2. 결측치 확인 

-> GENDER 변수에 1개의 결측치 존재

-> WEIGHT 변수에 2개의 결측치 존재

 

 

3. 결측치 처리

: 범주형 변수

# 문자형 결측치 처리 : pandas.DataFrame.fillna(값, inplace = 결측치 입력후 저장여부)

-> GENDER 변수의 결측치를 '여성'으로 대체

 

 

수치형 변수

# 숫자형 결측치 처리 : groupby(범주형 변수), agg('집계함수')

-> GENDER별 WEIGHT 변수의 평균

 

 

4. 이상치 확인 및 처리

: 상자 수염도표를 이용한 이상치 확인

 

-> RSTPULSE 변수에 이상치 포함 확인 -> 100보다 큰 값은 이상치로 판단

 

 

: 조건에 해당하는 데이터 직접 확인

 

 

: 이상치 제거

28번째 제외됨

 

조정된 index

 

 

5. 변수 생성 및 표준화

: 파생변수 생성

 

# 일자 속성 변환 및 파생변수 생성

 

 

# 분석에 필요하지 않은 변수 제외

 

# 범주형 변수의 Dummy 변수화

 

 

: Standard Scaler

# scale 변환 : 평균 - 표준편차 척도 기준

 

 

: Min-Max Scaler

# scale 변환 : 최소 - 최대값 척도 기준

-> 최소값 = 0, 최대값 = 1인 데이터로 변환

 

 

: Robust Scaler

# scale 변환 : 로버스트 척도 기준

 

 

: 표준화 결과 비교

-> 변환 데이터 확인

 

-> 요약 통계량

 

-> 분포 비교

 


 

데이터 시각화

 

탐색적 분석

: 다양한 시각화, 통계분석을 이용하여 데이터의 패턴, 특성 및 변수간의 관계 파악 등 데이터를 종합적으로 이해하는 과정

최근에는 그래프와 정보를 통합한 인포그래픽스(info- graphics) 사용이 급증

 

그래프 분석

: 시각화를 통한 탐색적 분석 기법, 직관적 이해가 용이하고 대략적 의사결정 기능

  • 현상 분석 : Histogram, Time Series
  • 변수간 상관성 분석 : Box Plot, Scatter Plot, Bar Chart

 

그래프 종류

  • Bar Chart : 빈도수 기준, 범주형 데이터 표현, 이산형에 대해 빈도수로 그린다
  • Histogram : 연속형만 그린다, x축에 구간, y축에 빈도수 나타냄, 일반적으로 구간 수는 7~10(등간격) 이
  • Box Plot : 사분위범위 IQR로 나타냄 , x축은 범주형 변수의 그룹, y축은 수치형 데이터 -> t검정, 아노바검정
  • Pie Chart : 구성 요소별 비율, 이산형 데이터만 그릴 수 있다
  • Scatter Plot : 두 연속형 변수간의 직선(관계)
  • Scatter Matrix : 산점도를 행렬로
  • Heatmap : 색깔의 밝기정보로 크기의 값 나타냄
  • Trend Chart : 수요 예측 품목별 선정 용도, 경향성 보기
  • Contour plot : 등고선 차트는 확률 분포로 그린다, x y축의 연속형 자료값에 대응하는 z값 표시
  • Parallel Plot : 여러개의 연속형 데이터로 분포 특성 보기, 2차원 평면에 평행으로 표시

 

그래프분석_연습

0. 패키지 불러오기, 환경설정

 

사용할 파일 불러오기

# parse_dates : 날짜 변수 지정

 

파이썬을 이용한 Bar Chart 연습

1. 성별 Bar Chart 그리기

 

2. 연령대별 Bar Chart 그리기

# sort_index(inplace = True) : 정렬 결과를 저장

 

3. 성 + 연령대별 Bar Chart 그리기

 

+ 누적막대그래프

 

 

+ 총합을 100으로 비율 나누기

 


파이썬을 이용한 Histogram 히스토그램 연습

1. 혈당 산소 요구량(OXY)의 Histogram 그리기

판다스 사용시 그리드 자동으로 생성된 모습

 

2. 숫자형 변수에 대한 Histogram 그리기

# figsize = (x축 크기, y축 크기)

 

 

3. 성별로 혈당 산소 요구랑(OXY) 의 Histogram 그리기

# hist(column = 변수, by = 그룹변수, range = (최소값, 최대값)) - x축 범위 동일

 

 

# seaborn 활용. FacetGrid(데이터지정, col = 컬럼지정)

 

4. 성별로 혈당 산소 요구량(OXY)을 중첩해서 Histogram 그리기

# x축 구간(bin) 조정(상세분포 확인)

구간 개수 20개

 


 

파이썬을 이용한 Box Plot 연습

1. 성 + 연령대별 혈당 산소 요구량 Box Plot 그리기

 

 

 


 

파이썬을 이용한 Pie Chart 연습

 

1. 성별 Pie Chart 그리기

 

# 성별 그래프

 

# 성 + 연령대별 그래프

 

 


 

파이썬을 이용한 Scatter plot 연습

1. 성별로 운동시간과 혈당 산소 요구량에 대한 Scatter Plot 그리기

 

# scatterplot(x, y, hue: 그룹변수, style : 그룹별 marker 구분, data)

 

+ 회귀선 포함하여 그리기

size 대신 height 사용

 

 


 

파이썬을 이용한 Scatter Matrix 연습

1. 수치형 전체변수에 대한 Scatter Matrix 그리기

 

# pairplot(데이터) : Scatter Plot 그래프 생성

 

 

+ 성별로 그리기

 

 

2. 운동시 맥박수, 최대맥박수, 운동시간과 혈당 산소 요구량에 대한 Scatter Matrix 그리기
# y변수 : 혈당산소 요구량, x변수 : 맥박(운동), 맥박(최대), 운동시간 Scatter Matrix 생성

데이터를 색상으로 구분할 기준 : hue = 'GENDER'

 

 


 

파이썬을 이용한 Heatmap 연습

1. 성별, 연령대별 혈당 산소 요구량에 대한 Heatmap 생성

# 성별과 연령대별 혈당 산소 요구량 평균 계산, groupby: (성별, 연령), agg = ('mean')

# pivot(성별, 연령대, 혈당산소요구량) : x축(연령대), y축(성별), 값(혈당산소요구량의 평균)으로 피벗

# seaborn활용 : heatmap(데이터, cmap : 색상)

 

 

2. 상관계수 heatmap 그리기

 

 


 

파이썬을 이용한 Contour plot 연습

1. 운동시간과 혈당 산소요구량에 대한 Contour plot 생성

 

 


파이썬을 이용한 Parallel plot 연습

1. 성별에 따른 혈당 산소 요구량, 몸무게, 휴식시 맥박수에 대한 Parallel Plot 그리기

 


파이썬을 이용한 Trend Chart 연습

1. 통화별로 환율에 대한 Trend Chart 그리기