📌 학습목표
1. 함수 적용 .apply(func)
2.
🔗 실습링크 : https://www.kaggle.com/datasets/imakash3011/customer-personality-analysis
Customer Personality Analysis
Analysis of company's ideal customers
www.kaggle.com
컬럼 살펴보기 (사람 정보)
속성 | 설명 | 범주 |
ID | 고객의 고유 식별자 | |
Year_Birth | 고객의 출생 연도 | |
Education | 고객의 교육 수준 | 'Basic' : 고졸 'Graduation' : 학사졸업 '2nd Cycle' : 대학원 재학생 'Master' : 석사 'PhD' : 박사 |
Martial_Status | 고객의 결혼 여부 | |
Income | 고객의 연간 가구 소득 | |
Kidhome | 고객 가구의 어린이 수 | |
Teenhome | 고객 가구의 십대 수 | |
Dt_Customer | 고객이 회사에 등록한 날짜 | |
Racency | 고객의 마지막 구매로부터 경과한 일 수 | |
Complain | 고객이 지난 2년동안 불만을 제기했는지 여부 | 1 : 불만을 제기함 0 : 불만을 제기하지 않음 |
데이터 불러오기
# 참조
import pandas as pd
# 데이터 불러오기 (ID를 인덱스로 설정)
customers = pd.read_csv('marketing_campaign.csv', sep='\t', index_col='ID') # tab키로 구분됨
customers
각 데이터에 함수 적용 .apply(func)
값 매핑 Series.map(arg)
DataFrame 요소 함수 적용 .applymap(func)
: 모든 요소에 `.apply(func)`을 처리하고 값 매핑(적용)을 해준다.
- 체인형으로 여러개의 함수 적용 가능하다.
타입변환 .astype()
'Kidhome'과 'Teenhome' 열을 보면 1 아니면 0의 값을 갖고 있다.
info()의 결과를 보았을 때 int64 데이터 타입을 갖고 있음을 알 수 있다.
아래의 표를 보면 int64 혹은 int32의 경우 0부터 8*10^19, 0부터 4.2*10^9 까지의 숫자를 표현할 수 있는데,
'Kidhome'과 'Teenhome' 컬럼의 경우 최소 0, 최대 1의 값을 갖고 있다.
즉, 불필요한 메모리를 사용하고 있다는 의미이다.
이러한 경우 타입변환 `.astype()`을 통해서 메모리 사용을 절약할 수 있다.
값 교체 .replace()
Series.replace() 와 DataFrame.replace()는 탐색&변경의 범위 차이
없는 값을 변경해도 아무런 에러가 발생하지 않으며, 그냥 원본 데이터를 반환한다.
조건식 .where()
조건에 맞는 데이터가 아니면 NA를 반환한다. (비파괴적 처리)
- `other` : 조건에 맞지 않는 데이터에 대해서 반환할 값 (`NaN`이 디폴트)
여러 집계함수 동시 적용 .agg()
: 지정된 축을 기준으로 하나 이상의 연산을 사용하여 데이터를 집계하는 메소드
parameter
- `func` : 데이터를 집계하는데 사용할 함수 지정(※ DataFrame의 `.apply()` 메소드에 사용할 수 있는 함수여야함)
- function : 함수
- str : 함수 이름의 문자열
- list : 함수 or 함수 이름이 포함된 리스트
- dict : 축 레이블과 함수 or 함수 이름이 포함된 딕셔너리 형태의 조합
- `axis` : 데이터를 집계할 축 지정
- `0` 또는 `'index'` : 각 열을 기준으로 함수 적용
- `1` 또는 `'columns'` : 각 행을 기준으로 함수 적용
- `*args` : 함수에 전달할 위치 인자 지정
- `**kwargs` : 함수에 전달할 키워드 인자 지정
return값
- Scalar : `Series.agg()` 메소드가 단일 함수로 호출될 때 반환됨
- Series : `DataFrame.agg()` 메소드가 단일 함수로 호출될 때 반환됨
- DataFrame : `DataFrame.agg()` 메소드가 여러 함수로 호출될 때 반환됨
customers.agg(['max', 'min', 'mean'])
- customers 데이터프레임의 ['Education', 'Marital_Status', 'Dt_Customer'] 컬럼에 숫자가 아닌 데이터타입이 퐇마되어 있기 때문에 NaN으로 반환된다.
- 이를 방지하려면 집계 연산에서 해당 컬럼을 제외하거나 원본 데이터에서 해당 열을 삭제 해야 한다.
- `.agg()` 메소드 내에 `numeric_only=True`옵션은 지원되지 않는다.
(`numeric_only=True`옵션은 `max()`, `min()`, `mean()`과 같은 집계 함수에 적용될 때 사용)
데이터 프레임 복제 .copy() & 일치확인 .equals()
copy()
: 원본과 분리해서 작업하고 싶을 때 사용하는 메소드로, DataFrame 혹은 Series를 복제하는 기능
equals()
: 두 객체가 일치하는지 여부를 Boolean으로 반환한다.
예제)
# 복제 방법
customers_copy = customers.copy()
Q. 원본을 복제한 복제본을 만들었을 때, 원본과 복제본은 같다고 말할 수 있을까?
A. 비교 기준을 무엇으로 삼느냐에 따라 다르겠지만, 엄연히 말하면 "메모리 주소"가 다르다.
# 메모리 주소 비교
id(customers), id(customers_copy)
# 값 비교
customers.equals(customers_copy)
# 주소 비교
customers is customers_copy
Slicing을 통해 값을 변경하려고 하면 `SettingWithCopyWarning` 경고가 뜬다.
그 이유는, 슬라이싱을 통해 데이터의 '일부'를 얻어온 상태이기 때문에 그 상태에서 값을 변경하려고 하니까
컴퓨터는 사용자가 복사본에 작업을 하려고 했는데 실수로 원본에 작업을 수행한 줄 알고 경고를 준다.
즉, 데이터프레임의 슬라이싱이 원본 데이터프레임의 View가 아닌 Copy인 경우에 발생하는 경고
멀티 인덱싱
: 하나 이상의 인덱스 레벨을 가지는 인덱스 구조로, DataFrame이나 Series의 다차원적인 인덱싱을 지원하기 위해 사용된다.
- 멀티인덱스로 인해 데이터를 계층적으로 조직화할 수 있음
- 다양한 차원(Multi-Level)에서 데이터에 접근 가능
- 멀티인덱스 생성은 DataFrame 또는 Series를 생성할 때 인덱스를 array(ex. list, tuple)같은 형태로 지정함
특정 열을 조회할 때 발생하는 문제
해결방법 1
튜플로 인덱스에 대해서 적용할 때 첫번째 인덱스가 생략된다면 `:`대신 `Slice(None)`를 넣어서 해결한다.
해결방법 2
Pandas의 `.IndexSlice[]`를 사용해서 해결한다.
움직이는 시각화 Bar Chart Race
🔗 실습 링크 : https://www.kaggle.com/datasets/muhammadkhalid/most-popular-programming-languages-since-2004
Most Popular Programming Languages Since 2004
Popularity of Programming Languages from 2004 to 2023
www.kaggle.com
<Bar Chart Race 튜토리얼 참고>
https://www.dexplo.org/bar_chart_race/tutorial/#plot-properties
Tutorial - Bar Chart Race
Animated bar chart races in Python with the bar_chart_race package
www.dexplo.org
Bar Chart Race 설치 및 참조
# 설치
!pip install bar_chart_race
# 참조
import pandas as pd
import bar_chart_race as bcr
데이터 가공
1) Date열을 인덱스로 설정
2) Date 열을 날짜 데이터(시계열 데이터)로 변환
- Index → DatetimeIndex
- 문자열(Object) → 특정 시간(Timestamp) → 기간(Period)
Timestamp : 특정 시간 표현
Timedelta : 특정 기간
오류 존나뜸 ... 아나콘다 삭제하고 재설치하라는데 그것부터 해야겟다. ㅠ