250401_Data_6기 TIL 31일차
- 통계학 기초 강의 2주차 수강 ✅
- 기초프로젝트 코드 분석 ✅
- 코드카타 1문제 ✅
- 10분 판다스 ✅
- 라이브 세션 수강 ✅
- 아티클 스터디 정리 ✅
오늘은 위에 일정대로 진행해보려한다.
기초 프로젝트 코드 분석 #2
먼저 전체코드는 이렇다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 스타일 설정
sns.set_style("whitegrid")
plt.rcParams['axes.labelsize'] = 12
plt.rcParams['xtick.labelsize'] = 10
plt.rcParams['ytick.labelsize'] = 10
# 날짜 처리 및 year-month 컬럼 생성
tran_df["t_dat"] = pd.to_datetime(tran_df["t_dat"])
tran_df["year_month"] = tran_df["t_dat"].dt.to_period("M").astype(str)
# 제품 카테고리 병합
tran_merged = tran_df.merge(
art_df[['article_id', 'index_group_name']],
on='article_id',
how='left'
)
# "Baby/Children" 카테고리 필터링
baby_trans = tran_merged[tran_merged["index_group_name"] == "Baby/Children"].copy()
# 실제 가격(USD) 계산
baby_trans["actual_price_usd"] = baby_trans["price"] * 590
# 월별 아동의류 거래 건수 및 매출 계산
monthly_baby_summary = baby_trans.groupby("year_month").agg(
total_transactions=("customer_id", "count"),
total_revenue_usd=("actual_price_usd", "sum")
).reset_index().sort_values("year_month")
# 결과 출력 (USD 단위)
print("Monthly 'Baby/Children' Sales Summary (USD)")
display(monthly_baby_summary)
# 시각화 (이중 축으로 합쳐진 그래프)
fig, ax1 = plt.subplots(figsize=(14, 7))
# 거래 건수 (왼쪽 Y축)
sns.lineplot(
data=monthly_baby_summary,
x="year_month",
y="total_transactions",
marker="o",
linewidth=2.5,
color="#D8283D",
ax=ax1,
label='Transactions'
)
ax1.set_xlabel("Year-Month")
ax1.set_ylabel("Total Transactions", color="#D8283D", fontsize=12)
ax1.tick_params(axis='y', labelcolor="#D8283D")
ax1.tick_params(axis='x', rotation=45)
# 매출 (오른쪽 Y축)
ax2 = ax1.twinx()
sns.lineplot(
data=monthly_baby_summary,
x="year_month",
y="total_revenue_usd",
marker="o",
linewidth=2.5,
color="#595959",
ax=ax2,
label='Revenue (USD)'
)
ax2.set_ylabel("Total Revenue (USD)", color="#595959", fontsize=12)
ax2.tick_params(axis='y', labelcolor="#595959")
# 제목 및 범례 설정
fig.suptitle("Monthly 'Baby/Children' Transactions and Revenue (USD)", fontsize=15, fontweight='bold')
# 범례 위치 조정
fig.legend(loc='upper left', bbox_to_anchor=(0.15, 0.85))
plt.tight_layout()
plt.show()
먼저 이 시각화 코드의 목적은 아동의류 카테고리의 월별 판매 건수와 매출액을 계산 한 뒤 두개의 그래프로 비교하기 위한 코드이다.
그럼 이제 각 단계별로 나누어서 정리해보자.
1. 라이브러리와 스타일 설정
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# seaborn 스타일 설정
sns.set_style("whitegrid")
# 축과 눈금의 글씨 크기 설정
plt.rcParams['axes.labelsize'] = 12
plt.rcParams['xtick.labelsize'] = 10
plt.rcParams['ytick.labelsize'] = 10
2. 날짜 처리 및 월 데이터 생성
tran_df["t_dat"] = pd.to_datetime(tran_df["t_dat"])
tran_df["year_month"] = tran_df["t_dat"].dt.to_period("M").astype(str)
- 거래 데이터(tran_df)의 날짜 컬럼(t_dat)을 datetime 형태로 바꿔준다.
- 연월(YYYY-MM)만 추출하여 year_month 컬럼으로 별도로 저장.
3. 제품 카테고리 정보 결합(병합)
tran_merged = tran_df.merge(
art_df[['article_id', 'index_group_name']],
on='article_id',
how='left'
)
- 아동복 카테고리 데이터가 필요하므로 거래 데이터(tran_df)와 제품 카테고리 정보(art_df)를 결합하여 어떤 품목이 판매되었는지 정보를 추가
4. 아동의류(Baby/Children)만 별도 추출
baby_trans = tran_merged[tran_merged["index_group_name"] == "Baby/Children"].copy()
- 전체 거래 중에서 아동의류 품목만 필터링하여 별도의 데이터(baby_trans)로 저장
5. 실제 가격(USD) 계산
baby_trans["actual_price_usd"] = baby_trans["price"] * 590
- 해당 데이터프레임의 price값은 스케일링된 값이므로 590을 곱해 대략적인 USD로 값을 바꿔준다.
6. 월별 아동의류 판매 건수 및 매출 집계
6-7번은 굳이 필요하진 않지만 표 형태의 값도 필요한 경우를 대비해 만들어두었다.
monthly_baby_summary = baby_trans.groupby("year_month").agg(
total_transactions=("customer_id", "count"), # 월별 판매 건수
total_revenue_usd=("actual_price_usd", "sum") # 월별 매출 합계(USD)
).reset_index().sort_values("year_month")
7. 계산된 월별 데이터를 표 형태로 출력
print("Monthly 'Baby/Children' Sales Summary (USD)")
display(monthly_baby_summary)
8. 이중 축 그래프로 시각화 (Dual-axis)
# 기본 그래프 및 왼쪽 축 생성 (판매 건수)
fig, ax1 = plt.subplots(figsize=(14, 7))
# 판매 건수 그래프 (왼쪽 Y축)
sns.lineplot(
data=monthly_baby_summary,
x="year_month",
y="total_transactions",
marker="o",
linewidth=2.5,
color="#D8283D",
ax=ax1,
label='Transactions'
)
ax1.set_xlabel("Year-Month")
ax1.set_ylabel("Total Transactions", color="#D8283D", fontsize=12)
ax1.tick_params(axis='y', labelcolor="#D8283D")
ax1.tick_params(axis='x', rotation=45)
# 매출액 그래프 (오른쪽 Y축)
ax2 = ax1.twinx()
sns.lineplot(
data=monthly_baby_summary,
x="year_month",
y="total_revenue_usd",
marker="o",
linewidth=2.5,
color="#595959",
ax=ax2,
label='Revenue (USD)'
)
ax2.set_ylabel("Total Revenue (USD)", color="#595959", fontsize=12)
ax2.tick_params(axis='y', labelcolor="#595959")
- ax2 = ax1.twinx()를 사용하는 이유는 판매량과 매출액은 서로 다른 y축 값을 가진다.
- 이러한 값들을 같은 그래프에서 동시에 표현하기 위해 왼쪽 y축에는 판매량 값을 표현해주고, 오른쪽 y축에는 매출액을 표현해준다.
- 사용 이유는 각각 다른 기준을 가지는 값을 하나의 그래프에서 표현하여 비교 분석에 용이하게 돕기 때문이다.
- 서로 다른 단위(판매량과 매출액) 또는 범위를 가진 데이터를 동시에 효과적으로 비교 가능
- 데이터 간의 관계나 동향을 한 눈에 직관적으로 볼 수 있도록 시각화
- 빨간색 선은 판매 건수, 검정색 선은 매출액을 나타냅니다.
9. 제목 및 범례 설정
fig.suptitle("Monthly 'Baby/Children' Transactions and Revenue (USD)", fontsize=15, fontweight='bold')
# 범례 위치 조정
fig.legend(loc='upper left', bbox_to_anchor=(0.15, 0.85))
plt.tight_layout()
plt.show()
코드 실행시 나타나는 시각화 그래프는 이와 같다.
아티클 스터디 - 파이썬 초보자가 저지르는 10가지 실수.
이전에 진행했던 아티클이라 내 인사이트랑 공통 인사이트 정도만 정리하고 넘어가도록 하겠다.
- 인사이트 : 초보자들의 10가지 실수에 대해 다뤘는데, 실수로 명명하는 이유는 대부분 비효율적이거나 문제를 야기할 수 있는 경우들이기 때문이다. 그러므로 숙련 과정으로 넘어 갈수록 코드 실행 성공여부 외에도 자신이 작성한 코드를 다듬어 효율적이고 이해하기 쉬운 코드를 작성하는 것이 중요하다.
- 공통 인사이트 : 가독성 있는 코드 → 연산을 쉽게 하고, 오류를 줄이기 위한 코드를 짜자!
통계학 기초 2주차
1. 모집단과 표본
☑️ 모집단
관심의 대상이 되는 전체 집단. ex) 한 국가의 모든 성인.
☑️ 표본
모집단에서 추출한 일부 ex) 그 국가의 성인 중 일부를 조사
표본을 사용하는 이유
- 현실적인 제약
- 비용과 시간 : 전체 모집단을 조사하는 것은 비효율적임, 표본 조사는 이러한 자원을 절약하며 유의미한 결과를 도출할 수 있는 방법.
- 접근성
- 모든 데이터를 수집하는 것이 물리적으로 불가능한 경우가 많다.
- 대표성
- 표본의 대표성
- 잘 설계된 표본은 모집단의 특성을 반영할 수 있다.
- 무작위 표본 추출을 통해 편향을 최소화하고 모집단의 다양한 특성을 포함할 수 있다.
- 데이터 관리
- 데이터 처리의 용이성
- 데이터 품질 관리
- 모델 검증 용이
- 모델 적합도 테스트
실 사용 예시)
- 도시 연구
- 의료 연구
- 시장 조사
- 정치 여론 조사
2. 표본 오차와 신뢰구간
☑️ 표본오차 (Sampling Error)
- 표본에서 계산된 통계량과 모집단의 진짜 값 간의 차이
- 표본 크기가 클수록 표본오차는 작아짐.
☑️ 신뢰구간 (Confidence Interval)
- 신뢰구간은 모집단의 특정 파라미터(예: 평균, 비율)에 대해 추정된 값이 포함될 것으로 기대되는 범위를 나타낸다
- 신뢰구간 계산 방법
- 신뢰구간=표본평균±z×표준오차
- 여기서 z는 선택된 신뢰수준에 해당하는 z-값이다. 예를 들어, 95% 신뢰수준의 z-값은 1.96
- 일반적으로 95% 신뢰수준을 많이 사용
3. 정규분포
☑️ 정규분포
- 정규분포는 종 모양의 대칭 분포로, 대부분의 데이터가 평균 주위에 몰려있는 분포이다.
- 평균을 중심으로 좌우 대칭이며, 평균에서 멀어질수록 데이터의 빈도가 감소한다.
- 표준편차는 분포의 퍼짐 정도를 나타낸다.
4. 긴 꼬리 분포
☑️ 긴 꼬리 분포
- 긴 꼬리 분포는 대부분의 데이터가 한쪽 끝에 몰려 있고, 반대쪽으로 긴 꼬리가 이어지는 형태의 분포이다.
- 정규분포와 달리 대칭적이지 않고 비대칭적이다.
- 특정한 하나의 분포를 의미하지 않고 여러 종류의 분포(ex. 파레토 분포, 지프의 법칙, 멱함수)를 포함할 수 있다.
☑️ 특징
- 소득 분포, 웹사이트 방문자 수 등에서 관찰되는 분포이다.
- 좀 더 자세한 예시로 온라인 쇼핑의 베스트 셀러, 도서 판매의 베스트셀러가 전체 판매량의 대부분을 차지하고 나머지가 적은 판매를 가질때 긴 꼬리 분포를 보임.
5. 스튜던트 t 분포
☑️ 스튜던트 t 분포
- t분포는 모집단의 표준편차를 알 수 없고 표본의 크기가 작은 경우(일반적으로 30미만)에 사용되는 분포
- 정규분포와 유사하지만, 표본의 크기가 작을수록 꼬리가 두꺼워지는 특징이 있다.
- 표본의 크기가 커지면 정규분포에 가까워짐.
실 사용 예시)
- 작은 표본의 평균 비교
- 약물 실험 (소규모 임상 실험)
6. 카이제곱분포
☑️ 카이제곱분포
- 카이제곱분포는 범주형 데이터의 독립성 검정이나 적합도 검정에 사용되는 분포
☑️ 특징
- 자유도에 다라 모양이 달라짐.
- 상관관계나 인과관계를 판별하고자하는 원인의 독립변수가 '완벽하게 서로 다른 질적 자료'일 때 활용
- ex) 성별이나 나이에 따른 선거 후보 지지율
- 범주형 데이터 분석에 사용
실제 사용 예시)
독립성 검정
- 두 범주형 변수 간의 관계가 있는지 확인할 때 사용
적합도 검정
- 관측한 값들이 특정 분포에 해당하는지 검정할 때 사용
7. 이항분포
☑️ 이항분포
- 성공/실패와 같이 두 가지 결과를 가지는 실험을 여러 번 반복할 했을 때 성공 횟수의 분포
- 독립적인 시행이 n번 반복되고, 각 시행에서 성공과 실패 중 하나의 결과만 가능한 경우를 모델링하는 분포
- 성공확률을 p라고 할때, 성공의 횟수를 확률적으로 나타냄
- 실험 횟수(n)와 성공 확률(p)로 정의
실제 사용 예시)
결과가 2개만 나오는 상황을 여러번 하는 경우에 사용
- 동전 던지기
- 품질 관리 - 제조업체가 제품의 불량률을 모니터링할 때, 무작위로 선택된 100개의 제품중 불량품의 수가 이항 분포를 따른다.
8. 푸아송 분포
☑️ 푸아송 분포
- 단위 시간 또는 단위 면적 당 발생하는 사건의 수를 모델링할 때 사용하는 분포.
- 푸아송 분포는 평균 발생률 람다를 가진 사건이 주어진 시간 또는 공간 내에서 몇 번 발생하는지를 나타낸다.
실제 사용 예시)
☑️ 특정 공간이나 특정 시간에 사건이 발생하는 경우
- 콜센터
- 교통사고
- 문자 메세지
- 웹사이트 트래픽
9. 분포 정리하기
- 결국 데이터 수가 엄청 많아지면 정규분포에 수렴(중심극한정리) <- 긴 꼬리 분포는 아니지 않나?
- 데이터 수가 많으면 묻지도 따지지도 말고 정규분포로 가정
- 하지만, 데이터가 적을 경우 각 상황에 맞는 분포를 선택 <- 여러가지 분포를 배우는 이유인듯 각 상황에 맞는 분포를 적재적소에 사용하는 방법 터득!
- long tail distribution(긴 꼬리 분포)는 데이터가 아무리 많아도 정규분포에 수렴하지 않는 분포!
그럼 분포는 어떻게 골라야 하는가?
데이터 수가 충분하다 → 정규분포
데이터 수가 적다 → 스튜던트 t 분포
일부 데이터가 전체적으로 큰 영향을 미친다 → 롱테일 분포(긴꼬리 분포)
범주형 데이터의 독립성 검정 또는 적합성 검정 → 카이 제곱 분포
결과가 두 개(성공 OR 실패)만 나오는 상황 → 이항 분포
특정 시간, 공간에서 발생하는 사건 → 푸아송 분포
마무리
오늘 하루도 끝나간다. 오늘은 비교적 집중이 잘됐던 것 같다. 발 받침대 샀는데 싸구려라 그런가 좀 별론거 같다...사실 그렇게 싸구려도 아닌데 2만5천원인디..; 요새 전에 사둔 뽀모도로 타이머로 시간제한 두고 할거 하는데 나름 집중 잘되는 거 같다.
https://www.youtube.com/watch?v=N9nWdq0Q5r0&t=9747s
그리고 대학생때부터 내 공부를 함께 해오던 lofi 플레이리스트까지
'데이터 분석 입문 주차' 카테고리의 다른 글
250407_Data_6기 TIL 35일차 - 통계학 기초 5주차 (0) | 2025.04.07 |
---|---|
250404_Data_6기 TIL 34일차 - 파이썬 스탠다드 #2 (0) | 2025.04.04 |
데이터 분석 입문 주차데이터 분석 입문 주차250403_Data_6기 TIL 33일차 - 통계학 기초, 통계 라이브세션, 파이썬 스탠다드 복습 (0) | 2025.04.03 |
데이터 분석 입문 주차250402_Data_6기 TIL 32일차 - 통계학 기초, 라이브세션 복습 (0) | 2025.04.02 |
250331_Data_6기 TIL 30일차 - 통계학 기초 1주차, 기초 프로젝트 코드 분석 (0) | 2025.03.31 |