- Pandas
- Numpy
- 데이터 전처리
- 개인과제
- 총평
판다스란?
📚 판다스(Pandas)는 Python에서 데이터를 쉽게 다룰 수 있게 해주는 데이터 분석 라이브러리예요! 데이터를 표(테이블) 형식으로 다루기 쉽게 만들어주고, 다양한 데이터 조작 기능을 제공해요. 데이터를 정리하고 분석하는 데 아주 강력한 도구랍니다.
구성요소
- 데이터프레임(DataFrame)
판다스의 핵심 자료 구조로, 엑셀의 스프레드시트처럼 행(row)과 열(column)로 구성된 2차원 데이터 구조예요.
- 시리즈(Series)
단일 열을 나타내는 1차원 데이터 구조로, 데이터프레임의 구성 요소 중 하나예요. 판다스를 이용하면 데이터의 필터링, 정렬, 집계 등 다양한 작업을 간단한 코드로 수행할 수 있어요.
활용
- 데이터 분석
판다스는 방대한 양의 데이터를 효율적으로 처리하고 분석하는 데 매우 유용해요. 통계 분석, 트렌드 파악, 데이터 시각화 등 다양한 작업에 사용돼요.
- 데이터 전처리
머신러닝 모델을 만들기 전에, 데이터를 정리하고 변환하는 과정에서 판다스는 없어서는 안 될 도구예요. 결측값 처리, 이상치 제거, 데이터 변환 등 다양한 작업을 지원해요.
- 비즈니스 인텔리전스(BI)
기업에서 중요한 의사결정을 내리기 위해 데이터에서 인사이트를 도출하는 과정에서도 판다스가 널리 쓰여요. 고객 데이터 분석, 판매 데이터 추적 등 다양한 분석 작업에 활용돼요.
- 금융 데이터 분석
금융 시장 데이터를 분석하고, 투자 전략을 수립하는 데도 판다스가 많이 사용돼요. 주식 가격 데이터, 경제 지표 등을 분석하는 데 강력한 도구예요.
- 연구 및 학술 분석
연구 데이터의 수집, 정리, 분석에 판다스가 필수적이에요. 특히 사회과학, 생명과학 등 다양한 분야에서 데이터를 다루는 연구에 활용돼요.
NumPy란?
📚 NumPy는 Numerical 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)
100번 까지 풀었습니다.
개인과제를 끝내고 실습이 가장 중요해 보여
팀원분들이 공유해준
초보자를 위한 파이썬 300제를 진행했습니다.
아주 간단한 파이썬 함수, 문자열 등 많은 문제를 보았습니다.
강의에서 들었지만 시간이 지나 기억나지 않던 문제들이 많았습니다.
이후
300제까지 풀어보며 TIL에 까먹은 것과 새로 배운 내용을 꼼꼼히 정리할 것으로 복습에 도움이 될 것 같습니다.
총평
- 강의를 처음 들었을 때는 Pandas나 Numpy 등 사용하는 이유를 잘 모르겟어서 이해가 가지 않았습니다.
- 개인과제로 이해도가 높아진 것 같습니다!.
- 코딩을 배우며 처음으로 해보는 실습과제 였습니다.
- 처음 문제를 보았을 때 반복문? 조건문? 어떤걸 어떻게 써야하는지 감이 안왔습니다.
- 인터넷 검색으로 하나하나 해결했습니다.
- 대부분 검색으로 진행했지만 어떻게 적용하는지 어떻게 적용 되는지 자세하게 알게되는 과정이였습니다.
- 계속 다른 실습문제들을 다뤄보며 익숙해지고 다양한 경험을 하는것이 중요해보입니다.
'WIL' 카테고리의 다른 글
내일배움캠프 WIL 24.11.10 (1) | 2024.11.10 |
---|---|
내일배운캠프 WIL + 머신러닝 (0) | 2024.10.27 |