👉🏻 그래프를 통한 탐색적 분석
🧩 seaborn을 통해 그래프 그려보기
- boxplot으로 그리기
- x축은 year, y축은 cnt
✅ 연도 별로 확인해보기
- 강사님이 하라는대로 하면 에러가 난다...
- 윗줄은 하나의 subplot을 생성하는데 사용되고
밑 줄은 Seaborn라이브러리를 사용해 상자 그림을 그리는 것
a, b는 변수 플롯 객체(figure와 axes)를 나타냄
- 주된 이유는 boxplot()함수에 2개의 위치 인자가 전달되었는데, 이 함수는 0~1개의 위치 인자만 받아들인다고 한다
- 혹은 boxplot()함수가 하나의 subplot에 대해서만 동작하도록 설계되어 있어서 문제가 발생한다고 한다
그런데 첫 번째 줄로 subplot을 생성하고 a, b로 변수에 할당한 후 sns.boxplot()을 호출할 때 두 개의 인자가 전달되었다
이 문제를 해결하려면 sns.boxplot() 함수에 데이터프레임 전체를 전달하고, 각 변수를 지정해주어야 한다고 한다
- 또한 여러개의 subplot을 생성하고 싶다면 plt.subplots()함수를 통해 여러개의 axes를 반환하고
그에 따라 seaborn의 boxplot을 호출하면 된다고 한다
- a는 figure객체, 즉 전체 그림판
b는 axes객체, 즉 그림판 위에 위치한 개별 subplot
- 이처럼 ax를 지정해줘야 그림이 그려진다
- b 변수가 가리키는 axes 객체를 ax 변수에 할당
axes는 개별 subplot, ax 변수에 할당함으로써 해당 subplot에 그래프를 그릴 때 더 편리하게 작업 가능
- 일반적으로 Matplotlib을 사용하여 그림을 그릴 때, 생성된 서브플롯에 그림을 추가하기 위해 ax라는 변수를 사용
Seaborn 함수를 사용할 때는 이 함수 자체가 ax를 사용하여 플로팅을 수행, ax를 직접 명시해주지 않아도 된다
- 왜 에러가 났는지, ax를 왜 설정해줘야하는지는 이해를 했는데 왜 강사님은 원래 코드가 되고 나는 에러가 난건지에 대해서는 좀 의문이다,,
- 2017년에 이용자 수가 감소했다
- 이상치를 확인하는 방법은 여러가지가 있는데 그 중 하나는 boxplot에서 max값을 초과하는 값들이다
- 변수로 모형을 만들 때 데이터 특성마다 다른 특성을 나타내는 것들이 모형 학습 시 좋은 영향을 나타낼 수 있다
✅ 월별로 확인해보기
- 7, 8월에 이용자수가 높고 겨울에는 낮아진다
✅ 요일 별로 확인해보기
- 큰 차이는 없지만 주말에 감소한다
✅ 시간별로 확인해보기
- 출근시간에 이용객이 많다
- 위에서 평일에 이용객이 더 많았던 것과 연관
- 변수와 이용객(우리가 예측하려고 하는 것)간의 상관관계를 시각화해본 것
- 이렇게 하나하나 입력해도 되고, 단축키를 만들듯 함수를 만들어도 된다
🧩 그래프 함수 만들기
- 데이터와 변수만 넣으면 그래프가 자동으로 그려지게끔
✅ 시간 데이터 넣어보기
✅ 요일 데이터 넣어보기
- 그래프를 통해 탐색적 분석을 수행해서 모형을 만들기 전에 데이터 구성, 이용객과 변수들이 어떤 영향을 미치는지 분석
👉🏻 데이터 전처리
- 아웃라이어 제거, 카테고리형 변수로 변경, 훈련/테스트 데이터 분리
🧩 아웃라이어 제거
- 아웃라이어 = 이상치
- 모든 데이터에는 잡음이 있다
- 모형을 만들기 전에 이상치 제거를 해줘야 한다
- 방법에는 여러가지가 있다
- σ²
- IQR
- 군집분석
- k-means
- DB 스캔
- 가장 쉬운 것이 σ²과 boxplot을 이용한 IQR 이다
🧩 IQR
- boxplot에서 최대/최소값을 벗어나는 값들을 이상치로 판단하고 제거
🧩 σ²
- 데이터를 정규분포라고 봤을 때
- 양 극단에 있는 값을 이상치로 보고 이를 제거한다
- 우리가 정의한 함수는 평균*3만큼 최소최대를 지정함, 우리가 제거하는 값들은 양 극단에서 0.3% 를 제거하는 것
- 함수 만들기
- 평균에서 편차의 3배를 뺀 값을 lower_limit에, 더한 값을 upper_limit에 할당
- lower_limit보다 작거나 upper_limit보다 큰 경우 아웃라이어로 True를 반환한다
- 이상치 제거 함수를 시간대별로 아웃라이어를 제거한 이용객 수를 보여달라
- hour열을 기준으로 df를 그룹화한다
- 각 그룹에 대해 cnt열에 is_outlier함수를 적용하여 아웃라이어를 식별한 불리언 시리즈 생성
- 위 결과를 반전시켜 이상치가 아닌 것을 True, 이상치를 False로 표시하는 불리언 시리즈 생성
- 이 불리언 시리즈를 바탕으로 원본 데이터프레임 df에서 아웃라이어가 아닌 데이터만을 선택한다
✅ shape 확인하기
- shape 함수는 데이터의 구조를 보는 함수
또 나만 에러나지,,
- 불리언 시리즈를 사용하여 데이터 프레임을 인덱싱하려고 할 때 발생하는 에러
- 인덱싱이 제대로 정렬되지 않았음을 나타냄
- 그룹화된 데이터프레임에서 아웃라이어를 제거하고 다시 원래 데이터프레임에 적용할 때 발생할 수 있다
- 이를 해결하기 위해서는 아웃라이어를 제거한 후 인덱스를 다시 설정해주는 작업이 필요하다
이게 chatGPT가 처음 고쳐준 코드인데 그래도 에러가 났다
이렇게 고치니 에러가 나지 않는다
- hour열을 기준으로 데이터프레임 df를 그룹화한다
- 각 그룹에 대해 아웃라이어를 제거한 데이터 프레임을 생성한다
- lambda함수를 사용해 각 그룹에 대해 아웃라이어를 제거한다
- 각 그룹에서 cnt열을 선택해 해당 열을 시리즈로 만든다
- 앞서 정의한 아웃라이어 제거 함수를 사용하여 아웃라이어가 아닌 데이터를 선택한다
- 불리언 시리즈를 반전시켜 아웃라이어가 아닌 데이터를 True로, 아웃라이어를 False로 표시한다
- 해당 그룹에서 아웃라이어가 아닌 데이터만 선택한다
- 각 그룹별로 선택된 데이터프레임의 인덱스를 재설정한다
- drop=True는 기존 인덱스를 제거하는 옵션
- 아웃라이어가 제거된 데이터프레임을 df_out에 할당한다
- 대략 150개정도가 제거됨
- 이상치 제거를 반드시 진행해야한다
✅ type 확인하기
- 정수형과 실수형이 있음
✅ 카테고리형 데이터로 바꾸기
- 최종적으로 하려는 것이 시간대별 자전거 이용자수를 예측
- 딥러닝이나 머신러닝으로 학습하려면 범주형 데이터(ex. 1이 어떠한 뜻을 내포하는 등)는 카테고리형으로 변경해줘야한다
범주형 데이터를 카테고리형 데이터로 바꿔라? 범주형이나 카테고리형이나 비슷하게 들리는데 바꾸라는 설명이 잘 이해가 가지 않아 chatGPT에게 물어봤다
강사님이 말씀하신 내용은 조금 혼란스러울 수 있습니다. 범주형 데이터와 카테고리형 데이터는 기본적으로 비슷한 의미를 갖기 때문에 변환의 필요성이 크게 느껴지지 않습니다. 일반적으로 범주형 데이터라고 하면 카테고리형 데이터를 의미하는 경우가 많습니다.
그러나 강사님이 언급한 내용을 해석해보자면, "특정 숫자가 어떤 내용을 가지고 있는 데이터에 대해서는 카테고리형으로 변경해줘야 한다"는 것은 아마도 특정 숫자 값이 의미적인 순서나 계층을 나타내지 않는 경우, 이를 명시적으로 범주로 표현하기 위해 카테고리형으로 변환해주어야 한다는 의미로 이해될 수 있습니다.
예를 들어, 주택 가격 범주를 나타내는 열이 있을 때, 이 열이 단순히 숫자로 표현되어 있지만 이 숫자 값 자체가 의미적인 순서를 갖지 않는다면, 이를 카테고리형 데이터로 변환하여 모델이 해당 값들을 범주로 이해하게 할 수 있습니다. 이는 모델이 특정 숫자의 크기에 대한 의미를 부여하지 않고, 주택 가격이라는 범주로 이해하도록 유도하는 것입니다.
종합하면, 범주형 데이터와 카테고리형 데이터는 비슷한 의미를 갖기 때문에 명확한 구분이 필요하지 않습니다. 하지만 일부 특정한 문맥에서, 모델의 학습을 원활하게 하기 위해 숫자 값을 가진 범주형 데이터를 명시적으로 카테고리형으로 변환하는 경우가 있을 수 있습니다.
- 위 데이터프레임에서 weather_code, season, year, month, hour을 카테고리형으로 바꾸겠다
- 위 다섯개를 카테고리형이라고 하고 카테고리형으로 바꾸겠다고 하시는데... 카테고리형이어야하는 것이 카테고리형으로 안 되어 있어서 바꿔주겠다는건가..
- df_out에 있는 weather_code를 category형으로 바꾸고 df_out의 weather_code에 할당시키라는 코드
- 나머지도 마찬가지
강사님은 경고창 나왔는데 나는 안 나옴.. 무시해도 된다고 함!
- df_out 데이터 타입 다시 확인해보기
🧩 더미 처리
- 머신러닝의 경우 이 작업이 모형에 영향을 주지 않을 수 있지만
- 딥러닝의 경우 필수
예를 들어 season을 확인해보면
- 0.0, 1.0, 2.0, 3.0으로 나눠져 있다
- 컴퓨터가 학습하기 용이하도록, 기계 언어(2진 숫자)로 바꿔주는 것이 더미처리
- 더미변수로 만들어줘야 한다
- Pandas에 있는 get_dummies()를 통해서
- df_out에 있는 해당 컬럼들을 더미변수 처리해서 df_out에 넣어줘
- hour가 14면 1(True) 아니면 0(False) 이런식으로 이진수로 나타냄
- 이렇게되면 딥러닝시 컴퓨터가 학습하는데 있어서 도움이 될 수 있다
- 17265개의 행
- 59개의 열
🧩 종속변수와 독립변수 구분하기
- 우리가 예측하려는 것이 시간대별 자전거 수요(이용객)
- 종속변수(y): 우리가 예측하고자 하는 것, cnt
- 독립변수(x): 나머지
- 종속변수와 독립변수를 분리하는 작업 필요
- df_out의 cnt는 y로 사용
- cnt를 제외한 나머지는 x로 사용
- timestamp는 이미 연월일시간 등을 다 추출했기 때문에 필요가 없다
- drop시킬 때 axis를 1로 설정하면 '열을 기준으로 데이터를 버려라' 라는 뜻
- x만 확인해보기
- y 확인해보기
🧩 훈련용 데이터와 테스트 데이터 구분하기
- 수학시험을 예로 들자면
- 시험 전에 문제집으로 공부함. 문제집 문제는 약 1,000개정도
- 그 문제집으로 시험을 보면 당연히 시험 점수가 잘 나옴
- 그렇기 때문에 처음부터 1,000개 중에서 700개는 공부하는데 사용하고 300개는 시험보는데 사용하는 것
- 전체 문제 1,000개 중에서 랜덤으로 700개와 300개를 나누는 것
- 이렇게 해야 (학습이 잘 됐는지)제대로된 테스트를 할 수 있다
- 모형을 만들기 전에 추후 학습이 잘 됐는지 체크하기 위해서 훈련데이터셋과 테스트데이터셋을 분리하기
✅ 라이브러리
- 스마트폰에 필요에 따라 어플들을 설치
- 파이썬 분석에 필요한 기능이 생길 때 마다 설치하는 어플이라고 생각하기
- 독립변수를 분류했던 것 처럼 x(독립변수)중에서도 훈련용과 테스트용을 분류하고
- 종속변수도 훈련용과 테스트용을 분류해주기
- 랜덤하게 분류하는데 매번 달라지면 안되니 random_state를 설정해주기
- test_size는 5:5로 나눌거면 0.5, 7:3으로 나눌거면 0.3
- shuffle을 통해 데이터를 순서대로 섞을 수 있으나, 시계열 데이터는 그러면 안돼서 False로 지정
- 전체 약 17,000여개 중에 12,000여개로 학습하고 5,000여개로 테스트함
✏️ 더 알아본 내용
💡 σ²
아웃라이어를 제거하는 또 다른 방법은 통계적 방법 중 하나인 시그마 제곱을 사용하는 것입니다. 이 방법은 데이터의 평균과 표준 편차를 활용하여 데이터가 일반적인 범위를 벗어나는 값을 아웃라이어로 간주합니다.
여기서 사용되는 개념은 Z-스코어(Z-score)이라고 불리는 표준화된 값입니다. Z-스코어는 데이터가 평균으로부터 몇 표준 편차만큼 떨어져 있는지를 나타냅니다. Z-스코어를 계산하는 공식은 다음과 같습니다:
일반적으로 특정한 Z-스코어의 절댓값이 특정 임계값을 넘으면 해당 데이터는 아웃라이어로 간주됩니다. 흔히 사용되는 임계값은 보통 2.0 또는 3.0입니다.
시그마 제곱을 사용하여 아웃라이어를 제거하는 일반적인 절차는 다음과 같습니다:
- Z-스코어 계산: 각 데이터 포인트에 대해 Z-스코어를 계산합니다.
- 임계값 설정: 일반적으로 2.0 또는 3.0과 같은 임계값을 설정합니다.
- 아웃라이어 식별: Z-스코어의 절댓값이 임계값을 초과하는 데이터를 아웃라이어로 식별합니다.
- 아웃라이어 제거 또는 대체: 아웃라이어로 식별된 데이터를 제거하거나 다른 값으로 대체합니다.
이 방법은 특히 정규분포에 가까운 데이터에 대해 효과적이며, 데이터가 정규분포를 따르지 않을 경우에는 다른 방법을 고려해야 할 수 있습니다.
💡 IQR
IQR(Interquartile Range, 사분범위)는 데이터의 중간 50%에 해당하는 값들의 범위를 나타내는 통계적 측도입니다. 데이터를 정렬했을 때, 25% 위치에 있는 값(Q1, 1사분위수)과 75% 위치에 있는 값(Q3, 3사분위수)을 사용하여 계산됩니다.
IQR은 데이터의 스프레드(분포의 퍼짐 정도)를 나타내므로, 아웃라이어를 식별하고 제거하는 데에 자주 사용됩니다. 아래는 IQR을 계산하는 간단한 단계입니다:
- Q1, Q3 계산:
- : 데이터의 하위 25%에 해당하는 값. 데이터를 정렬했을 때, 첫 번째 사분위수의 위치.
- : 데이터의 상위 25%에 해당하는 값. 데이터를 정렬했을 때, 세 번째 사분위수의 위치.
- IQR 계산:
IQR은 데이터의 중간 50% 범위를 나타내므로, 이 값은 데이터의 중간 부분에 대한 분포를 설명합니다. IQR이 크면 데이터가 흩어져 있고, 작으면 데이터가 밀집되어 있는 것으로 해석할 수 있습니다.
IQR을 사용한 아웃라이어 식별:
- 아웃라이어는 주로 아래의 규칙을 따릅니다:
- : Lower Bound보다 작거나 Upper Bound보다 큰 값
IQR을 사용하면 데이터의 중간 부분을 기반으로 하여 극단적인 값(아웃라이어)을 식별할 수 있습니다.
💡 DB SCAN
DB 스캔(DBSCAN; Density-Based Spatial Clustering of Applications with Noise)은 데이터베이스에서 밀도 기반 군집화를 수행하는 알고리즘으로, 아웃라이어를 식별하는 데에도 사용될 수 있습니다. 하지만 DBSCAN은 특정 데이터 포인트를 아웃라이어로 판단하는 대신, 데이터 포인트를 군집으로 분류하면서 밀도가 낮은 부분을 아웃라이어로 간주하는 방식으로 작동합니다.
DBSCAN은 다음과 같은 개념을 기반으로 합니다:
- 코어 포인트(Core Point): 주어진 반경(epsilon, ) 내에 최소 개수의 이웃 데이터 포인트가 있는 데이터 포인트를 코어 포인트로 간주합니다.
- 이웃 포인트(Neighbor Point): 코어 포인트의 반경 내에 위치한 다른 데이터 포인트를 이웃 포인트로 간주합니다.
- 경계 포인트(Border Point): 코어 포인트의 반경 내에는 이웃이 있지만 코어 포인트가 아닌 데이터 포인트를 경계 포인트로 간주합니다.
- 아웃라이어(Outlier): 코어 포인트와 경계 포인트가 아닌 나머지 데이터 포인트를 아웃라이어로 간주합니다.
DBSCAN을 사용하여 아웃라이어를 제거하는 일반적인 절차는 다음과 같습니다:
- DBSCAN 알고리즘 적용: DBSCAN 알고리즘을 사용하여 데이터 포인트를 군집화하고 아웃라이어를 식별합니다.
- 아웃라이어 제거 또는 대체: 아웃라이어로 식별된 데이터를 제거하거나 다른 값으로 대체합니다.
DBSCAN은 주로 공간 데이터 또는 군집화가 뚜렷한 데이터에 적합하며, 데이터베이스에서 아웃라이어를 찾거나 클러스터링을 수행하는 데 유용합니다.
💡 ~
~는 비트 NOT 연산자입니다. 이 연산자는 비트 단위로 반전된 값을 생성합니다. 그러나 여기서 사용된 ~는 판다스(Pandas)의 데이터프레임 또는 시리즈에서 불리언(Boolean) 값을 반전시키는 역할을 합니다.
판다스에서 ~를 사용하면 불리언 값이 반전되어 True는 False로, False는 True로 변경됩니다.
여기서 is_outliers 함수에서 사용된 ~s.between(lower_limit, upper_limit)는 시리즈 s의 각 요소가 lower_limit보다 작거나 upper_limit보다 큰지 여부를 나타내는 불리언 시리즈를 생성합니다. 그리고 ~를 사용하여 이 불리언 시리즈를 반전시켜서, 아웃라이어가 아닌 데이터를 True로, 아웃라이어를 False로 표시합니다.
따라서 이 코드는 주어진 데이터 시리즈에서 아웃라이어를 식별하는 함수입니다. 아웃라이어는 해당 시리즈의 평균에서 표준 편차의 3배 이상 떨어진 값으로 정의되어 있습니다.
출처: https://youtu.be/SF6_Lrm5Q-Q?si=VrCudn_Id0tZ9F9A
https://youtu.be/yNEXO0PyK_Q?si=5mEUtFaQPRPSz-Jc
'데이터분석 > Kaggle' 카테고리의 다른 글
[캐글로 시작하는 머신러닝, 딥러닝] 8. 머신러닝 (0) | 2024.01.13 |
---|---|
[캐글로 시작하는 머신러닝, 딥러닝] 7. 딥러닝 (0) | 2024.01.11 |
[캐글로 시작하는 머신러닝, 딥러닝] 3~4 .데이터 및 커널 소개, 데이터 불러오기와 기본적 탐색 (0) | 2023.12.29 |
[캐글로 시작하는 머신러닝, 딥러닝] 1~2. 캐글 소개 (1) | 2023.12.20 |
[T아카데미강의] 1. 캐글 및 대회 이해 (0) | 2023.12.20 |