주말 연휴 내 감기랑 세례준비로 정신줄 놓는 바람에 SQL 라이브세션 복습도 겨우겨우 하고 기획안 수정 내용도 80% 완료했다.
게다가 아침에 오른쪽 손목이 말썽이라 타이핑 칠 때 시큰시큰... 그래도 기획안 수정을 마무리 했다. (시간 관계상 이커머스 데이터 진행 하기로 했다)
1. 기획안 수정 내용
이전에 온라인 마케팅 채널 데이터 바탕으로 분석을 진행하려 했으나, 데이터 문제로 데이터셋을 변경하였다. e-commerce data로 변경 되면서 주제랑 내용이 변경이 불가피했다. pandas 라이브 세션을 복습 완료 하고 서둘러 기획안을 수정했다.
2. 데이터 전처리
수정된 데이터의 전처리 작업을 시작했다. 데이터 셋이 많고, 결측값과 문자들이 많다보니 SQL로 정리가 불가능하여 python (pandas)로 데이터 전처리를 진행 하기로 했다. merge로 고객정보+행동+ 상품정보 3가지를 합쳤다. 데이터를 합치고 합치다 보니 아래와 같았다.
# merge를 통한 병합 : 고객정보 + 행동로그 +상품정보
df_customer = pd.merge(df1_renamed, df2, on='Customer ID', how='left')
df_merged = pd.merge(df_customer, df3, on='Uniqe Id', how='left')
데이터가 10,000여개가 넘어갔는데 3,900여개로 생각보다 데이터의 범위가 줄어들었다. 이게 맞는건가...? 다시 데이터 셋을 정리해보니 분석하고자 하는 메인 데이터셋은 3,900개가 맞고... 10,000여개의 데이터는 부수적으로 분석을 돕는 데이터 셋이라 큰 문제는 없을듯 싶다 (내일 혹시 모르니 질문 정리해봐야지)

그래도... 뭔가 데이터 수가 적은건 기분탓인가... 더 덧붙여야 하나 욕심이 생기기도 하는데... 지금 내 상황을 보면 아닌것 같기도 하다.
어찌 되었든 ... 데이터 변경으로 딜레이가 되는 바람에 오늘, 내일은 후다닥 데이터 전처리를 완료하고 SQL로 분석 할 수 있도록 셋팅을 진행 해야겠다.
3. pandas 라이브세션
- 이전에도 Pandas를 꾸준하게 전처리를 진행 하고 나서 헷갈리는 부분이 좀 있었는데, 종합복습반에 이어서 다시 한 번 리마인드를 하였다.
- 특히 inplace에서 'True'를 하면서 원본을 날려 곤혹스러운 적이 있었는데... 이번에 전처리하며 너무 불안해서 'False'를 활용했다.
- 이전에 정신이 없다보니 데이터 확인을 제대로 하지 못했던 부분이 많이 아쉬웠는데, 이번 계기로 차근히 확인 해보고자 했다.
# pandas 라이브러리를 활용한 csv 파일 읽기
df = pd.read_csv("xxxx.csv")
# 테이블 확인하기
display(df, df2, df3)
# 처음 5 줄만 출력하기
#df2.head()
# 마지막 5 줄만 출력하기
#df2.tail()
# 각 테이블의 행(가로) 길이 파악하기
len(df)
# shape: 테이블의 행과 열의 갯수를 반환
df.shape
# dtypes: 테이블 내 컬럼타입(문자형, 숫자형, 배열 등) 확인
df.dtypes
# columns: 테이블 내 컬럼 확인
df.columns
# values: 테이블 내 각 행들을 배열 형태로 확인
df.values
# 테이블 기본 구조 한눈에 확인하기
df.info()
# 전체 행 갯수, 평균, 표준편차, 최솟값, 사분위수, 최댓값 확인
df2.describe()
#컬럼별로 결측치(데이터가 없는) 확인하기
df.isnull().sum()
# 특정 컬럼 1개 가져오기
#방법1: 속성. 사용
df.Category
#방법2: [] 연산자 사용
df['Category']
#방법3: iloc 사용
# : 은 모든 행을 가져오겠다는 의미이며 dataframe 의 인덱스 번호 4번(카테고리)컬럼을 가져오겠다는 희미
df.iloc[:,4]
# 특정 컬럼 여러개 가져오기
#방법1: [[]] 연산자 사용
# []를 하나 사용하면 결과값이 series 형태로 반환되어 key error 가발생되며, [[]] 는 dataframe 으로 반환되어 에러가 나지 않
df[['Category','Selling Price']]
#방법2: iloc 사용
# : 은 모든 행을 가져오겠다는 의미이며 dataframe 의 인덱스 번호 4번,7번 컬럼을 가져오겠다는 희미
df.iloc[:,[4,7]]
# 특정 컬럼 버리기
# axis=0 은 인덱스 기준, 1은 컬럼 기준 삭제를 의미
# inplace=True 는 원본을 변경하겠다는 의미, False 의 경우 원본테이블은 변경되지 않음
df3.drop('Interaction type', axis=1, inplace=True)
# 만약 원본을 유지 하고 싶다면 False
# 조건에 부합하는 데이터 가져오기1
# 조건에 만족하는 행은 정상출력 ,아닌 행은 NaN 으로 반환
df2.where(df2['Age']>50)
# 조건에 부합하는 데이터 가져오기 (메서드)
# true, false의 개념이 아닌 조건에 부합하는 데이터만 슬라이싱하고 싶다면 활용
(mask는 메서드의 의미이며 이름은 바꿔도 상관 없음)
mask = ((df2['Age']>50) & (df2['Gender']=='Male'))
df2[mask]
# 데이터 그루핑- 기준 1개
df2.groupby('Gender')['Customer ID'].count()
# 데이터 그루핑- 기준 여러개
df2.groupby(['Gender','Location'])['Customer ID'].count()
# 데이터 count 와 nunique(distinct, 중복제거) 차이
df2.groupby('Location')['Age'].count()
df2.groupby('Location')['Age'].nunique() # 중복제거
4. 스트림릿 라이브세션
- 스트림릿에 대한 개념도 배웠다. python을 통하여 대시보드를 제작하는 과정이 너무 흥미로웠는데, 나중에 머신러닝 활용 시 시각화 작업을 보여주기 편리할 것 같았다. tableau보다 깔끔해 보여 해보고 싶은 마음도 있지만, 아직 python 코드를 익히는게 서투르다보니... 조금 더 손에 익어보면 사용할 의향은 있다
'스터디 > TIL' 카테고리의 다른 글
| [TIL] 내일배움캠프 78일 - 감기 몸살 이슈 (2) | 2025.06.12 |
|---|---|
| [TIL] 내일배움캠프 76일 - 내 흐름을 맞추어 갈 것 (1) | 2025.06.10 |
| [TIL] 내일배움캠프 74일 - 데이터 변경 + 주제 수정 + 전처리 (1) | 2025.06.05 |
| [TIL] 내일배움캠프 73일 - 저는 바보 입니다 (프로젝트 데이터 전처리, SQL 코드카타 / 기획안 피드백) (0) | 2025.06.04 |
| [TIL] 내일배움캠프 72.5일 - 기획안 작성 (1) | 2025.06.04 |