merge()를 사용해서 두 데이터프레임을 공통 열을 기준으로 병합할 수 있으며, concat()으로 행 또는 열 단위로 데이터프레임을 연결할 수 있고, join()으로는 인덱스를 기준으로 데이터프레임을 병합할 수 있다.
groupby()함수를 통해 데이터를 특정 열을 기준으로 그룹화할 수 있는데, 그룹화한 데이터에 대해 다양한 집계함수를 사용할 수 있으며, 여러 열을 기준으로 그룹화할 수도 있다.
pivot_table() 함수로 피벗테이블을 생성하여 데이터를 요약하고 특정 기준에 따라 재구조화할 수 있다. aggfunc에 여러 집계함수를 지정해 다양한 요약 통계를 얻을 수 있다. margins 옵션을 사용해 전체 합계를 추가할 수도 있다.
# 점수의 합계와 평균을 계산하는 피벗테이블 생성
pivot_multi = pd.pivot_table(df, index='이름', columns='과목', values='점수', aggfunc=['sum', 'mean'])
판다스에서는 결측치와 이상치를 탐지하고 처리하는 다양한 기능을 제공한다. 결측치는 isna()나 isnull()로 탐지하고, 여기에 sum()을 조합해 결측치의 개수를 확인할 수 있다. 결측치를 제거할 때는 dropna()함수를 사용하는데, 기본으로 행을 제거하고, 열을 제거하려면 axis=1을 지정해야 한다. 결측치를 대체할 때는 fillna()함수를 사용하는데, 평균, 중앙값, 최빈값 등과 결합해 사용할 수 있다. 결측치를 주변 값들을 기반으로 보간할 때는 interpolate() 함수를 사용한다. 이외에도 특정 조건을 기반으로 결측치를 처리하거나 apply()를 사용해 결측치를 처리하는 사용자 정의 함수를 적용할 수 있다. describe() 함수로 데이터의 기본 통계량을 확인하고 이상치를 의심할 수 있으며, 박스플롯과 히스토그램을 사용해 데이터의 분포를 시각적으로 확인하면서 이상치를 찾아볼 수도 있다. IQR은 가장 일반적인 이상치 탐지 방법으로 쓰인다. 이상치도 제거, 대체할 수 있으며, 이상치가 중요하다고 생각되면 그대로 유지하기도 한다.
데이터 전처리 중 데이터 정규화는 데이터의 범위를 0과 1 사이로 변환하는 과정이다. 이는 서로 다른 범위를 가진 데이터를 동일한 스케일로 맞춰 비교하기 쉽게 한다. 데이터 표준화 중 z-점수 표준화는 데이터에서 평균을 빼고 표준편차로 나누어, 모든 데이터가 표준 정규분표(평균이 0, 표준편차가 1)을 따르게 만든다. 비선형 변환에는 데이터의 분포를 좁히는 데 유용한 로그 변환, 데이터의 분포를 평탄하게 만드는 제곱근 변환, 다양한 형태의 데이터 분포를 정규분포에 가깝게 변환하는 박스-콕스 변환 등이 있다.
인코딩은 범주형 데이터를 수치형 데이터로 변환하는 과정이다. 레이블 인코딩은 범주형 데이터를 순서가 있는 숫자로 변환하며, 원-핫 인코딩은 각 범주를 이진 벡터로 변환하고, 차원 축소 인코딩은 각 범주를 데이터셋 내에서의 출현 빈도로 인코딩하고, 순서형 인코딩은 순서가 있는 범주형 데이터를 그 순서에 따라 숫자로 변환한다. 임베딩은 딥러닝에서 주로 사용되며, 범주형 데이터를 벡터 공간에 매핑하여 변환한다.
멀티 인덱스는 하나 이상의 인덱스를 사용해 데이터프레임의 행과 열을 구조화하는 방법이다. set_index()로 여러 열을 사용해 멀티 인덱스를 설정할 수 있다. pd.MultiIndex.from_tuples()로 튜플로 구성된 멀티 인덱스를 생성할 수 있다. loc[]으로 멀티 인덱스에서 특정 데이터를 선택할 수 있으며, 하위 레벨까지 지정해 데이터를 더 구체적으로 접근할 수도 있으며, 슬라이싱으로 특정 구간의 데이터를 선택할 수 있다. 또, xs()로 특정 레벨에서 데이터를 선택하거나, 레벨을 넘어서 데이터를 선택할 수 있다.
* 이 때 loc[]은 특정 인덱스를 정확히 지정하여 단일 값을 선택하고, xs는 지정한 레벨에서 특정 값을 선택하여 해당 값과 관련된 모든 데이터를 반환한다.
# '서울'의 2021년 데이터 선택
print(df_multi_index.loc[('서울', 2021)])
# 부산의 모든 데이터를 선택
df_multi_index = df_multi_index.sort_index()
print(df_multi_index.loc['부산':'부산'])
# '도시' 레벨에서 '서울'의 데이터를 선택
print(df_multi_index.xs('서울', level='도시'))
멀티 인덱스는 sort_index()로 정렬한 후 관리하는 게 일반적이다. unstack()으로 멀티 인덱스를 열로 변환할 수 있고, stack()으로 열을 인덱스로 변환할 수 있다. 그룹화한 데이터를 멀티 인덱스로 변환해 복잡한 분석을 수행할 수 있다.
unstack() | stack() |
멀티 인덱스 -> 열 | 열 -> 멀티 인덱스 |
데이터프레임의 구조를 재조정해 데이터를 원하는 형태로 변형할 수 있다. melt() 함수는 피벗된 데이터를 다시 긴 형식으로 변환할 때 사용되며, 이는 여러 열을 하나의 열로 통합할 수 있게 한다. stack()은 열 데이터를 인덱스의 하위 레벨로, unstack()은 인덱스를 열 데이터의 하위 레벨로 이동시킨다. 행과 열을 추가, 제거할 수 있는데, axis=0은 행을, axis=1은 열을 추가, 제거한다. concat()과 merge()를 사용해 데이터를 병합해 데이터프레임의 크기를 확장시킬 수도 있다.
[머신 러닝]
이미 90년대 이전에 머신러닝의 핵심 알고리즘들이 등장했지만, 데이터와 학습능력이 부족해 사용되지 못했다. 그러나 현재 그 문제들이 해결되었고, 머신러닝이 발전하게 되었다. 딥러닝은 머신러닝의 한 부분이다.
머신러닝에는 세가지 부류의 분류가 있다. 첫 번째는 데이터에 정답이 포함돼있는 지도학습이고, 두 번째는 데이터는 있는데 정답은 없는 비지도학습, action이라는 특정 행위를 하는 인공지능인 강화학습이다. 강화학습은 부류가 머신러닝과는 많이 달라서 우리 캠프에서는 학습하지 않는다.
머신러닝의 핵심 요소들을 알아보자. 머신러닝의 베이스가 데이터기 때문에 데이터셋은 항상 존재한다. 데이터셋은 맞추기 위한 정답인 레이블이라고 부르는 출력 데이터와, 정답을 추론하기 위해 사용하는 정보들인 입력 데이터로 구성된다.
Feature(특징)은 머신러닝의 부류의 목적에 따라 다른데, 지도학습에서는 정답을 위해, 비지도학습에서는 클러스터링을 위해, 강화학습에서는 action을 위해 모델이 학습할 수 있는 개별 속성들을 말한다. 즉, 입력 데이터가 특징이다.
모델은 데이터의 특징으로부터 정답(레이블)을 예측할 수 있는 지식을 학습할 수 있는 프로그램이나 함수다. 즉, 머신러닝 모델이 다르다는 것은 데이터로부터 특징이나 규칙을 찾아내는 방법이 다르다는 것을 의미한다. 오버피팅은 일반 지식이 아니라 학습 데이터의 모델이 과도하게 학습된 현상을 말한다. 우리는 모델이 학습 데이터로부터 오버피팅이 아닌 일반 지식을 학습하는 것이 목표이다.
학습은 데이터로부터 규칙과 논리를 배우는 과정이다. 테스트(test)는 모델이 학습을 완료했을 때 새로운 혹은 실제 데이터를 통해 성능을 분석하는 작업을 말한다.
머신러닝의 학습 과정을 살펴보자. 데이터를 수집하고 -> 데이터 전처리 작업을 하고 -> 중요한 Feature는 선택하고 불필요한 피쳐는 제거하고 -> 문제에 적합한 머신러닝 알고리즘을 선택하고 -> 트레이닝 데이터셋을 사용해 모델을 학습시키고 -> 테스트 데이터셋을 사용해 모델 성능을 평가하고 -> 학습된 모델을 실제 환경에 배포하여 예측을 수행한다.
즉, 실제로 배포된 이후에도 처음 단계로 돌아가서 학습을 진행한다.
학습 방법은 3가지가 있다. 먼저, 지도학습(Supervised Learning)은 정답이 있고 그것을 맞추는 형태의 학습이다. 정답이 없는데 문제를 풀어야 할 경우의 비지도 학습 방법을 선택한다. 또 여러 개의 머신러닝 모델을 결합해 더 나은 성능을 얻는 앙상블 학습이 있다.
머신러닝은 특성을 골라줄 필요가 있다고 말하는데, 딥러닝은 머신러닝 중에 특성을 골라줄 필요가 없는 머신러닝 알고리즘의 분류라고 말할 수 있다.
판다스는 데이터 분석 측면에서의 전처리를 말하고, scikit-learn은 머신러닝 입장에서의 전처리를 말한다. 이 둘을 병합해서 사용해야 하는 경우가 대부분이므로 우리는 둘 다 사용하게 될 것이다.
강의 외부에서 추가로 알게된 내용
- while b != 0:과 while b:는 같은 의미다.
- 둘 다 b가 0이 아닐 때 반복문을 실행하도록 한다.
- 차이점
while b != 0: | while b: |
- b가 0과 같지 않을 때 반복이 계속 됨. - 명확하게 조건을 표현하고 싶을 때 사용할 수 ㅇ. - 결과적으로는 b가 0일 경우에만 반복이 종료됨. |
- b가 0이 아닐 때 반복이 계속 됨. - 간단하고 직관적임. - 0이면 거짓(False)으로 평가되기 때문에 반복문이 실행되지 x. |
- 유클리드 알고리즘
- 아래의 코드는 최대공약수(GCD)를 구하는 알고리즘인 유클리드 알고리즘을 구현한 것.
while b:
a, b = b, a % b
return a
- $
- 문자열의 끝을 의미한다. 이 기호는 문자열의 끝을 나타내는 기호.
- 즉, $를 사용하면 해당 패턴이 문자열의 마지막 위치에서만 일치하는지를 확인하게 됨.
- 정규 표현식 & regex=True
- 정규 표현식(regular expression) : 문자열에서 특정 패턴을 찾기 위한 언어.
- '서$' : 문자열의 끝에 있는 '서'를 찾는 패턴
- '\d+' : 숫자를 나타내는 패턴
- '^a' : 문자열이 'a'로 시작하는지 확인하는 패턴
- 이런 복잡한 패턴을 사용해서 교체할 때는 정규 표현식이 필요하고, regex=True 옵션이 필수적임.
- regex=True는 정규 표현식을 사용할 수 있도록 해주는 옵션으로, 단순한 텍스트 교체가 아니라, 특정한 패턴을 찾아서 바꾸고 싶을 때 사용됨.
- where() 메서드
- Pandas에서 DataFrame이나 Series의 조건을 기준으로 값을 필터링하거나 수정할 때 사용됨.
- 이 메서드는 주어진 조건을 만족하는 값은 그대로 유지하고, 조건을 만족하지 않는 값은 다른 값(주로 NaN이나 지정한 값)으로 대체함.
DataFrame.where(condition, other=None)
- condition : Boolean 배열이나 조건식으로, 각 요소가 True일 때 원래 값을 유지하고, False일 때 대체할 값을 지정함.
- other : 조건을 만족하지 않는 요소를 대체할 값. 기본값은 NaN.
'AI 부트캠프 > 챕터2(10.14~11.08)' 카테고리의 다른 글
WIL 3 (0) | 2024.10.18 |
---|---|
TIL 16 머신러닝 (0) | 2024.10.18 |
TIL 15 실무에 바로 쓰는 바닥부터 시작하는 머신러닝 (0) | 2024.10.17 |
TIL 14 코드카타 (0) | 2024.10.16 |
TIL 12 인공지능을 위한 파이썬 & 라이브러리 복습 (0) | 2024.10.14 |