1. Pandas 
  2. Numpy
  3. 데이터 전처리
  4. 개인과제
  5. 총평

 

판다스란?

 📚 판다스(Pandas)는 Python에서 데이터를 쉽게 다룰 수 있게 해주는 데이터 분석 라이브러리예요! 데이터를 표(테이블) 형식으로 다루기 쉽게 만들어주고, 다양한 데이터 조작 기능을 제공해요. 데이터를 정리하고 분석하는 데 아주 강력한 도구랍니다. 

 

구성요소

  • 데이터프레임(DataFrame)

판다스의 핵심 자료 구조로, 엑셀의 스프레드시트처럼 행(row)과 열(column)로 구성된 2차원 데이터 구조예요.

  • 시리즈(Series)

단일 열을 나타내는 1차원 데이터 구조로, 데이터프레임의 구성 요소 중 하나예요. 판다스를 이용하면 데이터의 필터링, 정렬, 집계 등 다양한 작업을 간단한 코드로 수행할 수 있어요.

 

 

활용

  • 데이터 분석

판다스는 방대한 양의 데이터를 효율적으로 처리하고 분석하는 데 매우 유용해요. 통계 분석, 트렌드 파악, 데이터 시각화 등 다양한 작업에 사용돼요.

  • 데이터 전처리

머신러닝 모델을 만들기 전에, 데이터를 정리하고 변환하는 과정에서 판다스는 없어서는 안 될 도구예요. 결측값 처리, 이상치 제거, 데이터 변환 등 다양한 작업을 지원해요.

  • 비즈니스 인텔리전스(BI)

기업에서 중요한 의사결정을 내리기 위해 데이터에서 인사이트를 도출하는 과정에서도 판다스가 널리 쓰여요. 고객 데이터 분석, 판매 데이터 추적 등 다양한 분석 작업에 활용돼요.

  • 금융 데이터 분석

금융 시장 데이터를 분석하고, 투자 전략을 수립하는 데도 판다스가 많이 사용돼요. 주식 가격 데이터, 경제 지표 등을 분석하는 데 강력한 도구예요.

  • 연구 및 학술 분석

연구 데이터의 수집, 정리, 분석에 판다스가 필수적이에요. 특히 사회과학, 생명과학 등 다양한 분야에서 데이터를 다루는 연구에 활용돼요.

 


 

NumPy란?

 📚 NumPyNumerical Python의 줄임말로, 과학 계산에 강력한 성능을 제공하는 파이썬 라이브러리입니다.

 

🔎 NumPy?

  • 다차원 배열 객체인 ndarray와 배열을 효율적으로 처리할 수 있는 다양한 함수들을 제공합니다.
  • 데이터 분석, 머신러닝, 딥러닝에서 기초가 되는 라이브러리로, 판다스와 함께 자주 사용됩니다.

🔎 NumPy의 주요 특징

  • 고속 배열 연산: C언어로 작성되어 있어 파이썬 기본 리스트보다 훨씬 빠른 연산 가능.
  • 다양한 수학 함수: 배열 간의 덧셈, 뺄셈, 곱셈 등의 연산을 효율적으로 수행.
  • 선형대수, 통계 함수: 복잡한 수학 계산도 간단히 처리 가능. 

활용

 

브로드캐스팅(Broadcasting)

  • 작은 배열이 큰 배열의 형태에 맞게 자동으로 확장되어 연산이 이루어지는 것을 의미해요. 이 기능 덕분에 코드를 더 간결하게 작성할 수 있습니다. 

 기본적인 수학 함수와 통계 함수

  •  NumPy는 배열을 다룰 때 자주 사용하는 다양한 수학 함수와 통계 함수를 제공합니다.

 


 

 

데이터 전처리란?

 📚  데이터 분석, 머신러닝, 또는 딥러닝 모델의 성능을 극대화하고, 정확하고 신뢰할 수 있는 결과를 얻기 위함입니다.

 📚 데이터는 대부분 그 자체로 불완전하거나, 노이즈가 많거나, 잘못된 형식으로 존재하기 때문에 필수적인 과정입니다.

 

활용

 

1. 결측값 처리 (Missing Values)

  • 이유: 대부분의 데이터셋은 완전하지 않아서 값이 누락된 경우가 많습니다. 결측값을 무시하거나 적절히 대체하지 않으면 모델의 성능이 저하됩니다.
  • 처리 방법: 결측값을 제거하거나 평균, 중앙값, 최빈값으로 대체하는 등의 방법을 사용합니다.

2. 이상치 제거 (Outlier Removal)

  • 이유: 이상치는 데이터에 큰 영향을 미쳐 통계적 분석이나 머신러닝 모델의 성능을 왜곡할 수 있습니다.
  • 처리 방법: 이상치 탐지 후, 이상값을 제거하거나 적절히 수정합니다.

3. 데이터 스케일링 (Data Scaling) 

  • 이유: 데이터의 값이 서로 다른 스케일을 가질 때, 특히 거리 기반 알고리즘(예: K-최근접 이웃, SVM, 신경망)에서 모델이 제대로 작동하지 않을 수 있습니다.
  • 처리 방법: Min-Max Scaling, Standardization 등을 통해 값을 동일한 범위로 변환합니다.

4. 정규화 (Normalization)

  • 이유: 데이터를 정규화하면 다양한 피처 간의 차이를 줄여, 학습 알고리즘이 더 효율적으로 학습할 수 있게 합니다.
  • 처리 방법: 피처 값을 특정 범위(예: 0~1)로 변환합니다.

 5. 범주형 데이터 인코딩 (Categoical Encoding)

  • 이유: 머신러닝 알고리즘은 숫자 데이터를 처리하는 것이 일반적이기 때문에, 범주형 데이터를 수치형 데이터로 변환할 필요가 있습니다.
  • 처리 방법: One-Hot Encoding, Label Encoding 등을 사용합니다.

6. 데이터 정제 (Data Cleaning)

  • 이유: 중복된 데이터, 불필요한 공백 또는 불완전한 데이터는 분석 결과에 부정적인 영향을 미칠 수 있습니다.
  • 처리 방법: 중복 데이터 제거, 공백 제거, 불필요한 특성(feature) 제거 등으로 데이터를 정리합니다.

7. 데이터 변환 (Data Transformation)

  • 이유: 특정한 분석 또는 모델링 요구에 맞게 데이터를 변환할 필요가 있습니다. 비선형 관계를 선형으로 만들거나, 로그 변환을 통해 데이터를 안정화할 수 있습니다.
  • 처리 방법: 로그 변환, 제곱근 변환, 다항식 변환 등을 사용하여 데이터의 분포를 조정합니다.

8. 특성 선택 및 추출 (Feature Selection & Extraction)

  • 이유: 모든 피처가 분석이나 모델 성능에 기여하지 않으며, 불필요한 피처가 모델의 복잡성을 증가시킬 수 있습니다.
  • 처리 방법: 유용한 피처만 선택하거나 주성분 분석(PCA) 등 기법으로 중요한 피처를 추출합니다.

9. 데이터 균형화 (Data Balancing)

  • 이유: 분류 문제에서 특정 클래스가 다른 클래스에 비해 많이 나타나면, 학습이 편향될 수 있습니다.
  • 처리 방법: 오버샘플링, 언더샘플링 또는 SMOTE 같은 기법으로 데이터의 불균형을 해결합니다.

 

개인과제

1. 숫자 맞추기 게임

while True: #전체 반복 조건문 시작
    computer_num = random.randint(1,10) #1에서10사이의 숫자를 랜덤으로 가져오게 지정
    print('''1과 10 사이의 숫자를 하나 정했습니다.
이 숫자는 무엇일까요?''')  #위 메서드가 작용 했을 때 출력 되는 문장 작성



    while True:#조건이 참일 때까지 반복 설정
        user_num = int(input('숫자를 입력하세요.'))
        #사용자가 직접 숫자를 입력하고 정수로 바꿔주게 설정
    
        if user_num > 10: #입력 값이 10보다 클 때 작동
            print(f'숫자가 너무 큽니다. 10 이하의 숫자만 입력해주세요.') #위 조건이 충족 되었을 때 출력 되는 메세지 작성
    
        elif computer_num == user_num: #랜덤 숫자와 사용자 숫자가 동일할 때 작동 설정
            print(f'정답입니다.') #동일 시 출력 되는 메시지 설정       
            break  #위 조건이 작동 시 반복을 멈추게 설정
    

        elif user_num < computer_num: #사용자 입력 숫자가 컴퓨터 보다 적을때 작동 설정
            print("너무 작습니다. 다시입력하세요.")#위 조건이 작동 시 출력 되는 메시지 작성

        else:#위 조건이 거짓일 때 작동 설정
            print("너무 큽니다. 다시입력하세요.") #else 조건이 작동 시 출력 되는 메시지 작성 
    

    
    restart = input('다시 시작하겟습니까? (y/n)') #다시 시작여부 입력 받는 restart 생성

    if restart != 'y': #y가 아닐 때 작동
        print('게임이 끝났습니다.')  #위 조건에 맞으면 출력 되는 메세지       
 
    
        break #조건 충족 시 멈춤

 

 

 

2. 클래스 함수 사용

class Person:  # 클래스 이름은 관례상 첫 글자를 대문자로 시작합니다.
    def __init__(self, name, gender, age):  # 초기화 메서드
        self.name = name  # 속성 정의
        self.gender = gender
        self.age = age
        
    def display(self):  # 정보 출력 함수
        print(f"""이름: {self.name}, 성별: {self.gender}, 
나이: {self.age}""")   
        
    def greet(self): #조건식에 따라 성인 미성년자를 구분해서 인사하는 함수 추가
        if age >= 20:
            print("안녕하세요!name님 성인이군요!!")
        else:
            print("안녕하세요!name님 미성년자군요!!")
    
# 사용자 입력
name = input('이름을 입력해주세요: ')
while True:
    gender = input('성별을 입력해주세요 (male OR female): ').strip().lower()  # 소문자로 변환하여 비교를 용이하게 함
    if gender == 'male' or gender == 'female':  # gender 조건
        break
    else:
        print('male과 female 중 하나만 입력해주세요.')

while True:
    try:
        age = int(input('나이를 숫자로 입력해주세요: '))  # 나이 입력을 숫자로 받음
        if age > 0:  # age 조건
            break
        
        else:
            print('0보다 큰 숫자만 입력해 주세요.')
    except ValueError:
        print('유효한 숫자를 입력해주세요.')  # 숫자가 아닌 값을 입력했을 때 예외 처리
        
 


person1 = Person(name, gender, age)

 

person1.display()
person1.greet()

 

 

 

3. Python 라이브러리로 데이터 분석하기

import pandas as pd #pandas 가져오기

 

data_df = pd.read_excel("관서별 5대범죄 발생 및 검거.xlsx") #엑셀파일 가져오기

 

df = pd.DataFrame(data_df) #df라는 데이터 프레임 생성

 

map_df = {'서대문서': '서대문구', '수서서': '강남구', '강서서': '강서구', '서초서': '서초구',
'서부서': '은평구', '중부서': '중구', '종로서': '종로구', '남대문서': '중구',
'혜화서': '종로구', '용산서': '용산구', '성북서': '성북구', '동대문서': '동대문구',
'마포서': '마포구', '영등포서': '영등포구', '성동서': '성동구', '동작서': '동작구',
'광진서': '광진구', '강북서': '강북구', '금천서': '금천구', '중랑서': '중랑구',
'강남서': '강남구', '관악서': '관악구', '강동서': '강동구', '종암서': '성북구', 
'구로서': '구로구', '양천서': '양천구', '송파서': '송파구', '노원서': '노원구', 
'방배서': '서초구', '은평서': '은평구', '도봉서': '도봉구'}

 #맵핑(비교)을 하기 위한 mpa_df 생성


df['구별'] = df['관서명'].map(map_df).fillna('구 없음')
#'구별' 이라는 새로운 열 생성 하며 관서명 열에 .map() 함수를 적용시켜 맵핑 진행
# fillna함수로 결측치에 '구 없음'값 지정

pivot = pd.pivot_table(df, index = '구별', aggfunc = 'sum')
#결과 값에 관서명 열이 사라지지 않음 (colums과 valuse를 지정하지 않고 시도)

 

pivot_dropped = pivot.drop(columns=['관서명'])
#drop함수를 사용해서 관서명 열 삭제


pivot_dropped.drop(['구 없음'])

 

df = pivot_dropped
#이름이 길어져서 간단하게 바꿈

 

df['강간검거율'] = df['강간(검거)'] / df['강간(발생)'] * 100
df['강도검거율'] = df['강도(검거)'] / df['강도(발생)'] * 100
df['살인검거율'] = df['살인(검거)'] / df['살인(발생)'] * 100
df['절도검거율'] = df['절도(검거)'] / df['절도(발생)'] * 100
df['폭력검거율'] = df['폭력(검거)'] / df['폭력(발생)'] * 100
#범죄별 검거율 열 생성


df['강간검거율'] = df['강간검거율'].astype(int)
df['강도검거율'] = df['강도검거율'].astype(int)
df['살인검거율'] = df['살인검거율'].astype(int)
df['절도검거율'] = df['절도검거율'].astype(int)
df['폭력검거율'] = df['폭력검거율'].astype(int)
# float이라 값이 너무 커서 안되나 싶어서 정수 변환시킴 


df['검거율'] = df[['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']].mean(axis=1)
#검거율 열을 생성하며 df안의 특정 열들을 리스트형식으로 가온다 표시하고 mean(axis=1)으로 평균값을 계산하며 행을 기준으로 계산 지정

 

del df['소계(발생)']
# 정상 작동 하는 것을 확인

 

del df['소계(검거)'], df['살인(검거)'], df['강도(검거)'], df['강간(검거)'], df['절도(검거)'], df['폭력(검거)']
# 정상작동

 

df = df.rename(columns = { '강간(발생)' : '강간', '강도(발생)' :'강도', '살인(발생)':'살인', '절도(발생)':'절도', '폭력(발생)':'폭력' })
#검색을 통해 rename 작성법을 보고 적었다.

pop_kor_df = pd.read_csv("pop_kor.csv", index_col='구별', encoding='utf-8') 
#csv파일 가져오기, '구별' 열을 인덱스 지정, 한글파일 읽어오기


df_csv = pd.DataFrame(pop_kor_df)

#df_csv라는 데이터 프레임 생성


df_csv2 = df_csv.dropna() #결측치 존재하는 행 제거

 

df2 = df.dropna() 

 

df3 = df2.join(df_csv2) #df2와 df_csv2를 join해서 df3 생성 

 

df3 = df3.dropna() #df3에서 결측치가 존재해 sort가 진행 되지않아 제거

 

sort_df = df3.sort_values(by = '검거율',ascending=True)  #검거율을 기준으로 오름차순 정렬

 


초보자를 위한 파인썬 300제

https://wikidocs.net/7014)

 

001 ~ 010

.answer {margin-top: 10px;margin-bottom: 50px;padding-top: 10px;border-top: 3px solid LightGray;bo…

wikidocs.net

 

100번 까지 풀었습니다.

 

 

개인과제를 끝내고 실습이 가장 중요해 보여 

 

팀원분들이 공유해준 

 

초보자를 위한 파이썬 300제를 진행했습니다.

 

아주 간단한 파이썬 함수, 문자열 등 많은 문제를 보았습니다.

 

강의에서 들었지만 시간이 지나 기억나지 않던 문제들이 많았습니다.

 

이후

 

300제까지 풀어보며 TIL에 까먹은 것과 새로 배운 내용을 꼼꼼히 정리할 것으로 복습에 도움이 될 것 같습니다.

 


총평

  • 강의를 처음 들었을 때는 Pandas나 Numpy 등 사용하는 이유를 잘 모르겟어서 이해가 가지 않았습니다.

 

  • 개인과제로 이해도가 높아진 것 같습니다!.

 

  • 코딩을 배우며 처음으로 해보는 실습과제 였습니다.

 

  • 처음 문제를 보았을 때 반복문? 조건문? 어떤걸 어떻게 써야하는지 감이 안왔습니다.

 

  • 인터넷 검색으로 하나하나 해결했습니다.

 

  • 대부분 검색으로 진행했지만 어떻게 적용하는지 어떻게 적용 되는지 자세하게 알게되는 과정이였습니다.

 

  • 계속 다른 실습문제들을 다뤄보며 익숙해지고 다양한 경험을 하는것이 중요해보입니다.

 

'WIL' 카테고리의 다른 글

내일배움캠프 WIL 24.11.10  (1) 2024.11.10
내일배운캠프 WIL + 머신러닝  (0) 2024.10.27

+ Recent posts