오늘은 pandas의 남은 내용들을 실습하면서
동시에 실제로 작용하는 방법또한 체크하기 위해서 이커머스 활용 데이터 분석 실습을
같은 수업내용에서 함께 진행하며 병행적으로 수업하였다.
아마 내일쯤이면 정리될 것 같다.
인덱싱 내용


인덱싱은 컬럼값을 가져오는 기능으로 작용한다,
왼쪽의 인덱스처럼 보이는 값을 인덱싱한다면 출력되지 않는다.
이를 가져오는 방법은 슬라이싱이다.
슬라이싱
기본 슬라이싱 -> 행 중심
- 차원 유지
- df[ 시작 인덱스 : 끝 인덱스 : step ]
- 인덱스 사용
- 행 중심 -> 가로 단위


슬라이싱은 기존 문법과 똑같이 작동한다.
인덱스 값 세팅방법
1. 인덱스 값 설정 후 변경 내용

loc
- location 위치 정보를 이용하여 특정, 추출
- 컬럼값, 인덱스 값 사용
- (컬럼값, 인덱스 값)


loc 하나로 인덱싱, 슬라이싱 모두 사용할 수 있다.

인덱스와 컬럼값을 사용하면 좌표처럼 사용할 수 있다

차원유지할 값을 바꾸면 이렇게 위치를 수정할 수도 있다.

차원을 유지하며 슬라이싱과 인덱스 조합

컬럼값 추가도 가능하다

컬럼에 슬라이싱을 사용해서 customer_name ~ age 까지 출력한 모습이다.

불리언 인덱싱 적용 케이스 = 조건식을 추가하여 추출한다.

특정 컬럼 제거 후 추출 코드
iloc
- 인덱스, 컬럼상에 존재하는 암묵적 순서 (인덱스값으로 0, 1, 2, 3, . . .)를 이용하여 추출
- index location



전체를 복사하고, 특정 컬럼값만 추출하는 방식으로 사용한 결과이다.
결론
- loc | iloc [ 행 (인덱스)표현 , 열(컬럼)표현]
불리언 인덱싱 (numpy에서 계승)

groupby같은 기능을 사용할 수 있게 된다.

탈퇴한 고객들만 모은 이후, 고른 대상을 뒤집을때 사용할 수 있다. 그 기호는 ! 과 ~ 이다.
불리언 인덱싱의 다른 사용예시들
undelete_user.info() # 결측치 현 확인 -> end_date
<class 'pandas.core.frame.DataFrame'>
Index: 2842 entries, 0 to 2952
Data columns (total 18 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 customer_id 2842 non-null object
1 name 2842 non-null object
2 class 2842 non-null object
3 gender 2842 non-null object
4 start_date 2842 non-null object
5 end_date 0 non-null object
6 campaign_id 2842 non-null object
7 is_deleted 2842 non-null int64
8 class_name 2842 non-null object
9 price 2842 non-null int64
10 campaign_name 2842 non-null object
11 mean 2842 non-null float64
12 median 2842 non-null float64
13 max 2842 non-null int64
14 min 2842 non-null int64
15 routine_flg 2842 non-null int64
16 calc_date 2842 non-null object
17 membership_period 2842 non-null int64
dtypes: float64(2), int64(6), object(10)
memory usage: 421.9+ KB
----------------------------------------------------------------
# 특정 컬럼을 구성하는 모든 데이터(중복제거)를 나열하시오 -> 데이터 건건은 고유함
cus.gender.unique() # 범주형 데이터 -> 집계후 분석 흐름을 반드시 보임
array(['F', 'M'], dtype=object)
----------------------------------------------------------------
df.gender == 'M', df.age >= 40
(2012-12-01 True
2012-12-02 False
2012-12-03 False
2012-12-04 True
2012-12-05 True
...
2026-08-05 False
2026-08-06 False
2026-08-07 False
2026-08-08 False
2026-08-09 True
Freq: D, Name: gender, Length: 5000, dtype: bool,
2012-12-01 False
2012-12-02 False
2012-12-03 True
2012-12-04 True
2012-12-05 True
...
2026-08-05 True
2026-08-06 False
2026-08-07 True
2026-08-08 True
2026-08-09 False
Freq: D, Name: age, Length: 5000, dtype: bool)
----------------------------------------------------------------
# 남성 회원들중에서(고) 40세 이상인 고객들만 추출하시오 -> 조건 2개
# df에서 진행
#target = df[ ( df.gender == 'M' ) & ( df.age >= 40 ) ]
target = df.loc[ ( df.gender == 'M' ) & ( df.age >= 40 ) ]
target.shape
(1709, 8)
데이터 삭제
- DataFrame에서 특정 데이터 제거
- del
- 완전 삭제
- drop 계열
- 떨군다 -> 제거하여 사본 제공(=추출), 원본 유지
- 원본 변경을 원한다면
- inplace 옵션을 True 설정하면 적용됨
- inplace=True -> 원본조작 내제
- 리턴 x
- inplace=True -> 원본조작 내제
- 기본값 False임
- inplace 옵션을 True 설정하면 적용됨
- del

drop으로 컬럼을 제거한다면 원본에 영향을 주지 않고 출력값을 수정할 수 있다

만약 원본에 제거를 반영하고 싶으면 inplace 옵션을 주어서 삭제할 수 있다.
또는 del을 사용해도 된다.
파생 변수 (컬럼 추가)
- 기존 데이터를 이용 하여 새로운 컬럼 추가
- apply(), .str, ...

현재 is_z라는 컬럼이 없는 모습이다,.'

birth값에서 년도 정보를 추출한다,
이 때 파이썬의 map() 기능을 가진 apply 함수를 사용해서 새로운 변수의 값을 정해준다.
람다함수를 사용하고 조건식을 주어서 삼항연산자로 구성한다.
결과는 출력된다.

본 파생변수로 인해서 전체 인원수 중 z세대인 사람이 약 10퍼센트도 안된다는 인사이트를 도출할 수 있다.
고급기능
병합(단순, 조인)
- 단순 합치기
- index증가(axis=0), 컬럼증가(axis=1)으로 합치기
- 방향에 따라 결측치가 발생될수 있다
- n개의 df를 합칠때 주로 사용(주유소 가격 참고)
- 모든 대상 df의 컬럼이 일치할때 유용

concat


concat은 n개의 병합이 가능한 것이 특징이다.
merge
- 2개의 df 대상 (양자간 병합 처리)
- SQL의 join과 동일함
- 규칙 -> 공통된 컬럼이 존재하면 타겟이 됨

merge의 다양한 작용방식, 하지만 일단은 모두 같은 값을 제공한다.


merge의 left, right, outer 조인의 특성
전체적으로 pandas는 sql 데이터베이스 수업과 비슷한 것 같다.
merge 할때 느낌이 빡 왔다.
그 다음으로는 이커머스 데이터 활용, 데이터 분석을 각 수업때 배운것들을 하나하나 실습하면서 진행했다.
이커머스 데이터 활용 데이터분석
연구 목표
- 개요
- 실전 데이터를 이용하여 데이터 준비과정 체크
- 주제
- 고객, 상품, 주문정보에 대한 분석
- 정량적 분석
- 목표
- pandas 연습
데이터 수집(제공)
- level 1 : 사내 데이터 제공 (가정)
- 내역 (포맷 : csv)
- 고객의 마스터 데이터 1개
- 아이템(상품) 마스터 데이터 1개
- 주문정보 2개
- 주문 상세정보 2개
- 내역 (포맷 : csv)
(*)데이터 준비

csv파일을 가져오는 과정이다, 총 7개의 데이터를 제공받았다.

모듈 가져오고, raw 데이터를 df로 구성한다.
그리고 잘 만들어졌는지 일단 확인.
이 때 각 파일은 dfs의 인덱스 문법으로 확인할 수 있다.

head , tail 함수는 각 데이터의 상위값, 하위값을 보여준다, 값 입력 안햇을 시 기본 5개
이로 인해 도출해낸 인사이트
- 고객 마스터 데이터
- 한국 + 일본 믹스 데이터
- 2019 1월~ 7월 가입자 고객 데이터
- 5000명
- 성별, 나이, 가입일, 생년월일, 이메일, 고객관리번호, 거주지, 이름

describe()로 파일의 통계를 얻을 수 있다. 하지만 수치형 데이터만 가능하기 때문에 데이터를 파악해야 한다.

데이터의 타입을 파악하는 기능 dtype , info()
데이터 병합 -> 데이터 마트 준비
트렌젝션, 트렌젝션 디테일 병합(concat)

먼저 파일을 확인하면 transaction , transaction_detail 파일은 1,2 로 나누어져있는걸 볼 수 있다.
이는 해석하면 테이터를 5000단위로 끊어서 두 파일로 나눠진것이기때문에 이 두 파일을 먼저 병합해준다,
concat을 이용해서 파일을 병합하고 확인한다,.
근데 이 파일들이 합쳐지는 부분을 확인하니 인덱스가 바로 5001로 안 넘어가고 다시 0부터 시작한다.
그래서 ignore_index=True 옵션을 추가해줘서 인덱스는 무시하라고 말해줘야 한다.


트랜젝션 + 트랜젝션 디테일 병합(merge)
- transection_data_mart
이제 트랜젝션, 그리고 트랜젝션 디테일 파일을 병합해줄거다, 두 파일이기 때문에 merge로 병합한다,.

두 파일을 비교해보면 같은 컬럼은 transaction_id 컬럼이다, 그래서 키를 저 컬럼으로 지정해주고 merge해준다,
밑에 보면 컬럼이 추가되고 데이터가 합쳐진 모습을 확인할 수 있다. sql에서 view의 느낌이다.

같은 방식으로 item 파일도 병합해준다.

마지막으로 고객데이터까지 합친 모습이다. 이제 컬럼이 총 16개가 된다.
파생변수

파생변수 cal_price를 이용해서 데이터가 잘 합쳐졌는지 확인할 것이다.
파생변수 만드는 문법을 사용해서 만들어준다.

그리고 price 의 총합과 cal_price의 총합을 비교했는데 안맞는다, 뭐지?
이는 주문수와 주문 상세정보의 개수 차이로 인한 오류이다.
그래서 주문 번호의 고유값을 카운팅했는데 4로 중복이 있다.
예를 들어 상품을 한 주문에 4개 샀으면 가격은 한번 주문으로 끝인데
주문 상세정보에서는 4개가 4번 돌아서 price가 더 높아진 것이다.
이는 어떤 데이터를 중점으로 두냐에 따라서 merge하는 left와 right가 바뀌고 추출하는 데이터가 달라지기 때문이다.
그래서 주문 상세정보 기준으로 하면 price가 맞고 주문 기준 총액으로 하면 cal_price가 맞는것이다,
- 검증 결과 트렌젝션 디테일에 맞춰져서 데이터가 구성되었다 -> 제품에 중심을 맞출 경우 문제 없음
- 데이터별로 살펴보면 price는 개수 * 단가와 다를 수 있다
- cal_price를 사용하면 데이터는 정확하게 됨. => 파생변수 사용

데이터 분석
월별 데이터 집계 처리
- 실습
pay_month 파생변수 생성 - 월별 집계 가능함
payment_date 에서 추출 -> 201901, 201902 , , . 201912
pay_month를 기준으로 집계하여 각 데이터의 카운트 출력
1. pay_minth 파생변수 생성

파생변수 생성 코드
1-1. 파생변수 생성 다른 방법

문자열 데이터이고, 로직이 간단하면 str로 써도 된다.
1-2 파생변수 생성 다른 방법

문자열의 포맷이 시간형식이기 때문에 시간형으로 포맷팅해준다. 이 또한 sql에서 했었다
info() 내용에서 시간 부분컬럼 타입이 바뀐 모습이다.

시간정보로 pay_month 파생변수를 만들어 준 모습이다, 이 때 pay_month는 문자열 형식으로 온다,
2. pay_month로 그룹화 진행

group by 뿐 아니라 values_counts() 로도 그룹화를 진행할 수 있다.
오늘의 수업은 여기까지
오늘 수업 내용 복습도 해야되고 리뷰시간에 실습할 것도 있고 이번주까지 해야하는 과제도 있고 하
바쁘다바빠현대사회