데이터 분석 입문 주차

250401_Data_6기 TIL 31일차 - 통계학 기초 2주차, 기초 프로젝트 코드 분석, 아티클 스터디

juneoh20 2025. 4. 1. 19:29

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 플레이리스트까지