내일배움캠프(QA,QC_5기)

[내일배움캠프] QA/QC_5기 ( 15일차 )

lshxkwh 2026. 3. 27. 19:26

[ 데이터 전처리 & 시각화 ] ( 4주차 강의 )

  • 데이터를 시각화한 예시 ( 바다거북 ,  나폴레옹 , 나이팅게일 )
  • Matplotlib 알아보기
  • 그래프 그리기 & 합치기
  • 실시간 세션 실습 정리

[ Part 01 ] - 데이터를 시각화 한 예시

더보기
  1. 나이팅 게일 - 사망원인 분석
    1. 시각화 : 로즈 다이어그램(원형 그래프 변형)
    2. 핵심 인사이트
      : 전투보다 감염병으로 많이 죽음
      : 위생 개선 필요성 강조

 

 

  2. 나폴레옹 러시아 원정 - 미나르 지도

        1. 인사이트

            : 군대 규모 , 이동 경로 , 온도 변화 , 퇴각 과정

        2. 핵심 내용

            : 추위 + 거리 + 보급 문제로 군대 붕괴

 

 

   3 . 존 스노우 - 콜레라 지도

        1. 핵심 인사이트

           : 특정 우물 주변에서 집중 발생

        2. 결과

           : 오염된 물이 원인 - > 펌프 제거

 

[ Part 02 ] - Matplotlib 알아보기

더보기
  1. Matplotlib이란?
    - 파이썬 시각화를 위한 라이브러리 중 하나이다.
    - 2D 그래픽을 생성하는데 주로 사용
    1. Matplotlib 선언하기
      : import matplotlib.pyplot as plt

[ Part 03 ] - 그래프 그리기

더보기
  1. .Plot()
    - Pandas에서 plot() 메서드는 DataFrame객체에서 데이터를 시각화 하는데 사용된다.
    - import pandas as pd
      import matplotlib.pyplot as plt
    # 샘플 데이터프레임 생성
    data = {
    'A': [1, 2, 3, 4, 5],
     'B': [5, 4, 3, 2, 1]
    }
    df = pd.DataFrame(data)
    # 선 그래프 그리기
    df.plot(x='A', y='B')
    plt.show()
  2. 그래프 스타일 정하기 ( color , linestyle , marker )
    1. color (색상)
      : 문자열로 지정할 수 있으며 , 'blue' , 'green' ,'red','cyan' 등과 같은 색상 이름 또는 RGB값을 지정할 수 있다.
    2. Linestyle (선 스타일)
      : 선의 스타일은 '-'(실선) , '--'(대시선) , ':'(점선) , '-.'(점-대시선) 등으로 지정할 수 있다.
    3. Marker (마커)
      : 마커는 데이터 포인트를 나타내는 기호로 'o'(원) , '^'(삼각형) , 's'(사각형) , '+'(플러스) 등으로 지정할 수 있다.

      - Plt.plot(x , y , color = "     "  , Linestyle == '  '  , Marker = '  ' ) 
  3. 범례 추가하기 ( label , legend )
    1. label 
      : Plt.plot(x ,y ,color = '      ' , Linestyle == ' ' , Marker = ' ' , label = '      ' )
    2. legend()
      :a.legend(['Data Series'])
  4. 축 , 제목 입력하기 ( xlabel , ylabel , title )
    1.  . set_xlabel( ' ' )
    2.  . set_ylabel( ' ' )
    3.  . set_title ( ' ' )
  5. 텍스트 추가 (text)
    1.  a.text(x , y ," text " , fontsize = 숫자 )

< 총 다 합쳐서 데이터 시각화 하기 >

import matplotlib.pyplot as plt
# 데이터 생성
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
# 그래프 그리기
plt.plot(x, y, color='green', linestyle='--', marker='o', label='Data Series')
# 추가 설정
plt.xlabel('X-axis Label')
plt.ylabel('Y-axis Label')
plt.title('Title of the Plot')
plt.legend()
plt.text(3, 8, 'Some Text', fontsize=12) # 특정 좌표에 텍스트 추가
# 그래프 출력
plt.show()

[ Part 04 ] - 데이터를 직접 시각화 해보기!

더보기
  1.  line plot ( 선 그래프 )
    : 선그래프는 연속적인 데이터의 추이를 보여줄 때 사용됩니다.
  2. bar plot ( 막대 그래프 )
    : 범주형 데이터 간의 비교를 나타낼 때 주로 사용 됩니다.
  3.  Histogram ( 히스토그램 )
    : 연속형 데이터의 분포를 보여줄 때 사용됩니다.

  4.  Pie Chart ( 원 그래프 )
    : 범주형 데이터의 상대적 비율을 시각화 하는데 사용된다.
  5.  Box Plot
    : 연속형 데이터의 분포와 이상치를 시각화 하는데 주로 사용된다.

 

# 피어슨 상관계수란 ?
: 두 변수 간의 선형적인 관계를 측정하기 위한 통계적인 방법중 하나이다

  주로 연속형 변수 들 간의 상관관계를 평가 하는데 사용된다.
# 피어슨 상관계수의 특징:
 - 범위: -1에서 1 사이의 값을 가집니다.
 - 양의 상관관계: 1에 가까울수록 강한 양의 선형관계를 나타냅니다.
 - 음의 상관관계: -1에 가까울수록 강한 음의 선형관계를 나타냅니다.
 - 무상관 관계: 0에 가까울수록 선형관계가 거의 없거나 약한 관계를 가집니다.

[ 실시간 세션 03/26(목) 실습 ] 

1) 데이터 준비 및 시계열 변환 (datetime)
 - tips 데이터에는 날짜가 없습니다. 실습을 위해 가상의 날짜(2024년 1월 1일부터)를 만들어 부여해 봅시다.


import Pandas as pd

import Seaborn as sns

import Matplotlib.pyplot as plt

 

df = sns.load_dataset('tips')

df. head()


㉮ 가상의 날짜 데이터 생성 ( 2024-01-01 부터 데이터 개수 만큼 날짜 생성 ) 

    - HINT : pd.date_range()

 

dates = pd.date_range(start = "2024-01-01" , periods = len(df))

df['order_date'] = dates

 

# pd.date_range(start = "    ' , end= "     " , periods = "       " )

 

㉯ 날짜가 제대로 들어갔는지 확인

 1. df.dtypes 
     : 데이터 프레임 안 모든 데이터 타입 확인

 

2) 중복 데이터 제거하기 ( duplicated() )


df_dirty = pd.concat([df , df.iloc[ :5]])

print(f"중복 제거 전 : {len(df_dirty)}행")

print("중복된 행 개수 : " ,df_dirty.duplicated().sum())

 

df_clean = df_dirty.drop_duplicates()

print(f"중복 제거 후 : {len(df_clean)}행")


3) 날짜 정보 추출 및 정렬 ( dt accessor , sort_values )

 

㉮ 요일 , 월 정보를 추출해서 새로운 컬럼 만들기


df['month'] = df['order_date'].dt.month_name()

df['weekday'] = df['order_date'].dt.day_name()


㉯ 최신 날짜 순으로 정렬해보기 (내림차순)


df_sorted = df.sort_values(by = 'order_date' , ascending = False)

df_sorted.head()


4) 데이터 변환하기 ( map , apply )

 

㉮ [Map] 성별을 한글로 변환


gender_map = {'Female' : '여성' , 'Male' : '남성'}

df_sorted['성별'] = df_sorted['sex'].map(gender_map)

df_sorted.head()


㉯ [Apply] 팁 비율에 따라 고객 등급 분류 ( 팁이 총액의 20% 이상이면 "VIP" 아니면 "Normal" )


def classify_customer(row):

     if row['tip'] / row['total_bill'] >= 0.2:

            return "VIP"

     else :

             return "Normal"

 

 

df_sorted['고객등급'] = df_sorted.apply(classify_customer,axis=1)

df_sorted[['성별','total_bill','tip','고객등급']].head()


 

5) 데이터 합치기 1 ( merge )

 

㉮ 요일별 할인율 테이블 생성


discount_policy = pd.DataFrame({

'day': ['Thur', 'Fri', 'Sat', 'Sun'],

'discount_rate': [0.05, 0.0, 0.1, 0.15] #

})

discount_policy


㉯ merge로 병합


df_merged = pd.merge(df_sorted , discount_policy , on = 'day')

df_merged.head()


㉰ 할인이 적용된 값 계산


df_merged['final_price'] = df_merged['total_bill'] * (1 - df_merged['discount_rate'])

df_merged[['day', 'total_bill', 'discount_rate', 'final_price']].head()

 

 

6) 데이터 합치기 2 ( concat )

 

㉮ vip룸 추가 데이터 생성


vip_data = pd.DataFrame({
    'total_bill': [150.0, 200.0],
    'tip': [20.0, 30.0],
    'sex': ['Male', 'Female'],
    'smoker': ['No', 'No'],
    'day': ['Sat', 'Sun'],
    'time': ['Dinner', 'Dinner'],
    'size': [5, 6],
    'order_date': pd.to_datetime(['2024-02-01', '2024-02-02'])
})

vip_data


㉯ concat으로 위 아래로 합치기


df_final = pd.concat([df_merged,vip_data],axis=0,ignore_index=True)

df_final.head()


7) 그룹 집계 ( groupby )

 

report = pd.groupby('day)[['total_bill' ,'tip']].agg(['mean','max'])

report