머신러닝의 구성요소

  • 데이터 셋: 데이터 모음
  • 입력 데이터 특징(Feature): 데이터셋의 개별 속성
  • 출력 데이터 레이블(lable): 예측하고자 하는 예측 변수
  • 모델: 정다(레이블)을 예측할 수 있는 지식을 학습할 수 있는 프로그램
  • 학습: 모델이 데이터를 통해 패턴을 인식하고, 이를 기반으로 예측을 수행 할 수 있도록 함수 내의 가중치를 조정하는 과정
  • 훈련: 모델이 데이터를 통해 학습하는 과정
  • 테스트: 학습된 모델의 성능을 평가하는 과정

🔎 학습방법

지도학습(레이블 O)

회귀: 연속적인 값 예측 (주택 가격, 주식 가격)

분류: 이산적인 값 예측(스팸 필터링, 이미지 분류)

 

비지도 학습(레이블 X)

군집화: 데이터를 유사 그룹으로 묶는 문제(고객 세분화, 이미지 세그멘테이션)

이미지 세그멘테이션: 이미지을 픽셀단위로 나누어 어떤 객체에 또는 어떤 영역에 속하는지 구분하는 기술

차원축소: 고차원 데이터를 저차원으로 변환(PCA, t-SNE)

 

앙상블 학습(여러개의 모델 결합)

배깅: 여러 모델을 독립적으로 학습시키고, 에측을 평균내거나 다수결 투표(랜덤 포레스트)

부스팅: 여러 모델을 순차적 학습시키고, 이전 모델의 오차를 보완

스태킹: 여러 모델을 학습시키고 예측결과를 새로운 데이터로 사용하여 메타 모델을 학습

 

 


☑️ 데이터 셋 다운 및 기본정보 확인

kaggle

예시 : 타이타닉 데이터셋 다운로드

  • kaggle competitions download -c titanic

다운로드한 데이터 import

  • import pandas as pd
  • train_df = pd.read_csv('train.csv')
  • test_df = pd.read_csv('test.csv')

 

데이터 확인

  • 행열 확인 print(df.shape)
  • 컬럼명 확인 print(df.columns)
  • 타입확인 print(df.dtypes)
  • 통계 확인 print(df.describe())
  • 정보확인(NULL갑스 타입 등) print(df.info()) 

 


☑️ 데이터 전처리

🔎 결측치 처리

  • 제거

df_dropped_rows = df.dropna() # null 행 제거

df_dropped_cols = df.dropna(axis=1) #null 열 제거

  • 대체

df_filled = df.fillna(0) 0으로 대체

df_filled_mean = df.fillna(df.mean())평균값으로 대체

df_filled_median = df.fillna(df.median()) 중간값으로 대체

df_filled_mode = df.fillna(df.mode().iloc[0]) 각 열의 최빈값으로 대체

  • 예측

#sklearn의 linear에서 LinearRegression 회귀모델 임포트

from sklearn.linear_model import LinearRegression

 

#결측치 있는 열과 없는 열 구분

df_with_na = df[df['column_with_na'].isnill()]

df_without_na = df[df['column_with_na'].notnull()]

 

model = LinearRegression()

model.fit(df_without_na[['feature1', 'feature2']], df_without_na['column_with_na'])

 

predicted_values = model.predict(df_with_na[['feature1', feature2']])

 

df.loc[df['column_with_na'].isnull(), 'column_with_na'] = predicted_valuse

 

🔎이상치 처리

데이터 셋에서 비정상적인 값 처리

  • 확인IQR

#특정 열의 이상치 확인

#25%보다 작거나 75%보다 크면 이상치로 처리

#quantile로 이상치의 기준점 설정

Q1 = df['C'].quantile(0.25)

Q3 = df['C'].quantile(0.75)

IQR = Q3 - Q1 

 

#이상치 범위 설정

lower_bound = Q1 - 1.5 * IQR

upper_bound = Q3 + 1.5 * IQR

 

#여기서 |는 OR의 논리연산자

#C열의 값중 lower_bound보다 작거나 upper_bound보다 큰 수를 이상치로 간주해 outliers에 저장해서 확인

outliers = df[(df['C'] < lower_bound) | (df['C'] > upper_bound)]

print(outliers)

 

#C 열의 값이 lower_bound와 크거나 같은 값 그리고upper_bound보다 작거나 같은 값을 df_no_outliers에 저장

df_no_outliers = df[(df['C'] >= lower_bound) & (df['C'] <= upper_bound)]
print(df_no_outliers)

 

#C열의 평균값을 mean_value에 저장

#apply를 사용해서 C에 대해 특정 함수나 연산을 적용

#lambda로 함수식을 한줄로 정리 x에는 c열의 각 값이 들어간다.

#C 열의 각 값을 검사하여, 값이 lower_bound보다 작거나 upper_bound보다 크면 그 값을 해당 열의 평균값으로 대체, 아니면 값 유지

mean_value = df['C'].mean()

df['C'] = df['C'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)

 

🔎중복값 제거

#중복된 행 확인

print(df.duplicated().sum())

#제거

df_no_duplicates = df.drop_duplicates()

 

🔎데이터 타입 변환

df['column_name'] = df['column_name'].astype(int)

df['column_name'] = df['column_name'].astype(str)

df['column_name'] = df['column_name'].astype(float)

 

🔎인코딩

머신러닝은 수치형 데이터를 인자로 받기 때문에 범주형 데이터를 수치형으로 변환 하는거다.

원핫 인코딩

#get_dummies를 활용해 수치형 데이터로 바꾼다.

#get_dummies를 진행할 df데이터 프레임의 category_column카테고리 컬럼을 지정

df_encoded = pd. get_dummies(df, columns=['category_column'])

print(de_encoded.head())

 

🔎샘플링 랜덤으로 추출

#50% 샘플 추출

#비율 frac

df_sampled = df.sample(frac=0.5)

#100개 샘플 추출

#개수 n

df_sampled_n = df.sample(n=100)

 

🔎특징 선택 및 추출

#SelectKBest k개의 특징을 선택하는 방법을 제공하는 클래스

#f_classif 독립변수와 종속변수 사이의 상관성을 측정하여 높은 상관성을 가진 특성을 선택(분류문제에서 사용)

from sklearn.feature_selection import SelectKBest, f_classif

 

#selector객체 생성

#score_func = f_classif 특징에 F-값을 계산해 높은 값 가진 특징이 더 중요하다고 간주

#k는 가장 중요한 5개의 특징 선택 지정 

selector = SelectKBest(score_func=f_classif, k=5)

#fit_transform입력 데이터(주어진 데이터)X, 타겟 레이블(정답 값)y 특징 선택 수행

#X_new에 선택된 5개의 특징으로 된 새로운 데이터셋 지정

X_new = selector.fit_transform(X, y)

 

#get_support(indices=True)는 선택된 특징들의 인덱스를 반환

selected_features = selector.get_support(indices=True)

print(selected_features)

 

# 두 열의 곱을 새로운 특징으로 추가
df['new_feature'] = df['feature1'] * df['feature2']

# 두 열의 합을 새로운 특징으로 추가
df['new_feature_sum'] = df['feature1'] + df['feature2']


☑️ 회귀모델 학습

Scikit_learn

기능

데이터 전처리

모델 학습

모델 평가

모델 예측

 

Scikilt-learn 설치

conda install scikit-learn

pip install scikit-learn

 

회귀 모델 예제

import pandas as pd

import numpy as np

# train_test_split 데이터를 훈련 세트와 테스트 세츠로 나누기 위한 함수

#  LinearRegression연속적인 값 예측하는 회귀 문제 해결

# mean_squared_error, r2_score모델의 성능을 평가하기 위한 메트릭

from sklearn.model_selection import train_test_split

from sklearn.linear import LinearRegression

from sklearn.metrics import mean_squared_error, r2_score

 

#데이터 생성

#X는 독립변수(특징) 데이터 (6개의 샘플, 2개의 특징)

#y는 종속변수(타겟) 데이터(각 샘플의 정답값)

X = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5],[6,6]])
y = np.array([1, 2, 3, 4, 5, 6])

 

#데이터 분할

# train_test_split(...)주어진 데이터를 훈련 데이터와 테스트 데이터로 나누는 함수

#test_size=0.2 전체 데이터의 20%를 데스트 데이터로 설정 나머지는 훈련 데이터 설정

#random_state=42 데이터 분할의 일관성을 위해 랜덤 시드를 설정

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

랜덤 시드는 어떻게 결정해야하는가?

임의로 정한다. 일반적으로 정수 값을 사용하며, 0 이상의 정수를 설정한다

42라는 정수를 사용했을 뿐, 특별한 의미는 없다.

 

#회귀 모델 생성 및 학습

model = LinearRegression() #선형 회귀 모델의 인스턴스 생성

model.fit(X_train, y_train) #생성한 모델에 훈련 데이터를 학습 시킨다. x_train과 y_train 데이터 기반으로 학습

인스턴스는 왜 생성하는가?

선형 회귀 알고리즘을 사용하여 데이터에 대해 학습(fit)하고 예측(predict), 모델 파라미터 확인(model.coed_로 회귀계수를 model.intercept_로 절편을 확인 가능)하기 위함

 

#예측

# model.predict(X_test) 학습된 모델을 사용하여 테스트데이터 X_test에 대한 예측값을 계산.예측 결과는 y_pred에 저장

y_pred = model.predict(X_test)

 model.predict도 메서드 함수인가?

메서드이다. 메서드는 특정 클래스의 인스턴스에서 사용할 수 있는 함수

 

#모델 평가

# mean_squared_error(y_test, y_pred): 테스트 데이터에 대한 실제 값 y_test와 예측 값 y_pred 간의 평균 제곱 오차(MSE)를 계산

# MSE는 예측의 정확성을 나타내는 지표로, 값이 작을수록 모델의 성능이 좋다는 의미

mse = mean_squared_error(y_test, y_pred)

# r2_score(y_test, y_pred): 결정 계수 R2R^2를 계산. R2R^2 값은 모델의 설명력을 나타내며, 1에 가까울수록 모델이 실제 데이터를 잘 설명한다는 뜻. 0이면 모델이 종속 변수의 평균으로 예측하는 것과 같고, 음수일 경우 모델이 평균보다 더 나쁜 성능을 보이는 것.
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')

 

 


☑️ 로지스틱모델 학습

import numpy as np
import pandas as pd

#  load_breast_cancer 유방암 데이터셋 로드
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

# StandardScaler데이터의 평균을 0, 분산을 1로 스케일링
from sklearn.preprocessing import StandardScaler

스케일링을 왜 진행하고 왜 평균을 0, 분산을 1로 만드는 건가

모델 성능과 학습 속도에 긍정적인 영향

스케일링을 통해 입력 특징이 동일한 스케일로 변환되면, 알고리즘이 더욱 빠르고 효율적으로 수렴하고 정규화 가능

평균을 0으로 만드는 이유: 스케일링을 통해 데이터의 중심을 원점으로 이동시킴으로써 모델이 각 변수에 대한 가중치를 더 공정하게 학습할 수 있도록 합니다.

분산을 1로 만드는 이유: 데이터의 변동성을 통일하여 스케일 차이로 인해 발생하는 문제를 완화.


# 데이터 로드
data = load_breast_cancer()
X = data.data
y = data.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 데이터 스케일링
scaler = StandardScaler()

#훈련 세트, 테스트 세트를 스케일링하고 변환
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

 

#모델 학습

# LogisticRegression 이진 분류 문제를 해결

from sklearn.linear_model import LogisticRegression

# accuracy_score 모델의 정화도 계산 함수

# classifcation_report 정밀도, 재현율, F1점수 등 모델의 성능을 요약한 보고서 생성 함수

# confusion_matrix 예측 결과와 실제 값을 비교하여 혼동 행렬 생성 함수(모델의 분류 성능 시각화)

from sklearn.metrics import accuracy_score, classifcation_report, confusion_matrix

 

model = LogisticRegression()

model.fit(X_train, y_train)

 

y_pred = model.predict(X_test)

 

# accuracy_score(y_test, y_pred) 실제값 y_test와 예측 값 y_pred를 비교하여 정확도 계산

print(f"Accuracy: {accuracy_score(y_test, y_pred)}")

# classification_report(y_test, y_pred) 모델의 성능을 요약하여 출력(정밀도, 재현율,F1점수, 지원)

print(f"Classification Report:\n{classification_report(y_test, y_pred)}")

# confusion_matrix(y_test, y_pred) 혼동 행렬을 생성하여 모델의 성능을 시각적으로 나타낸다.

print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")

 

정밀도Precision

재현율 Recall

F1-score 정밀도와 재현율 간의 조화 평균

지원Support 각 클래스의 속한 실제 샘플 수

평균 Average 나온 숫자들이 비슷할 수록 좋다.

혼동행렬에서 행은 실제 클래스, 열을 예측 클래스


☑️ 생성형 AI를 활용한 학습 방법과 Prompt Engineering

프로그래밍 vs인공지능 모델

공통점: 개발자가 주어진 입력이 무엇을 출력할지 설계

차이점:

프로그래밍은 입출력의 관계에 대한 알고리즘을 직접구현

인공지능 모델을 입출력의 관계를 데이터를 통해 학습

 

생성형AI

이미지 생성AI DALL-E, Midjourney, Stable Diffusion Web UI

동영상 생성AI Gen-3, 

텍스트 생성 AI: 챗지피티, Claide, Gemimi, Preflexty

음악 생성AI Suno, Udio

 

LLM대규모 언어 모델

텍스트 생성, 번역, 질문 답변, 요약 등

다양한 언어 관련 작업을 하나의 모델에서 수행

대표적

OpenAI(GPT)

Google(Gemini)

Meta(LLaMA3)

 

LLM의 원리

입력과 출력 사이의 조건부 확률 분포를 학습합니다.

새로운 입력이 주어졌을 때 학습된 조건부 확률 분포를 통해 모든 토큰별 확률을 예측하고, 그 중 가장 가능성이 높은 토큰을 선택하여 답변

 

몬티홀 문제(조건부 문제)

 

LLM의 한계

실제로 계산 하는게 아니라서 학습 데이터 분포를 벗어난 입력을 넣으면 신뢰할 수 없는 출력을 생성할 확률이 매우 큼

데이터 편향

데이터 오류

 

모호한 지시 처리: 다양한 해석을 할 수 있는 질문이나 지시 => 세부적인 정보와 구체적인 답변 예시 등을 통해 답변 할 수 있도록 유도

 

맥락 유지의 어려움: 핵심정보 요약해 맥락 유지

 

할루시네이션: 문맥에 맞는 듯 보이지만 실제로는 근거없는 내용을 생성하는 현상으로, 사용자에게 잘못된 정보를 제공할 수 있음

외부 지식 및 데이터 베이스의 내용을 프롬프트에 넣어 해당 내용에 근거해 답변을 생성하도록 함 (RAG, Retrieval-Augmented Generation)

 

정보의 한계: 최신 정보 및 새로운 전문적인 지식을 제공 못함

질문에 대한 내용을 인터넷에서 검색 후 LLM

 

 

프롬프트 엔지니어링 기초

명확한 지침 제공: 중요한 세부 사항이나 문맥 및 제약 조건 등을 명시

페르소나 부여: 시스템 메세지를 사용하여 모델에 페르소나 부여

프롬프트 명시적 구조화(형식적 구조 예시화)

줄임말 순화 프로그램 만들기


☑️ 회고

랜덤 시드는 어떻게 결정해야하는가?

임의로 정한다. 일반적으로 정수 값을 사용하며, 0 이상의 정수를 설정한다

42라는 정수를 사용했을 뿐, 특별한 의미는 없다.

 

인스턴스는 왜 생성하는가?

선형 회귀 알고리즘을 사용하여 데이터에 대해 학습(fit)하고 예측(predict), 모델 파라미터 확인(model.coed_로 회귀계수를 model.intercept_로 절편을 확인 가능)하기 위함

 

 model.predict도 메서드 함수인가?

메서드이다. 메서드는 특정 클래스의 인스턴스에서 사용할 수 있는 함수

 

스케일링을 왜 진행하고 왜 평균을 0, 분산을 1로 만드는 건가

모델 성능과 학습 속도에 긍정적인 영향

스케일링을 통해 입력 특징이 동일한 스케일로 변환되면, 알고리즘이 더욱 빠르고 효율적으로 수렴하고 정규화 가능

평균을 0으로 만드는 이유: 스케일링을 통해 데이터의 중심을 원점으로 이동시킴으로써 모델이 각 변수에 대한 가중치를 더 공정하게 학습할 수 있도록 합니다.

분산을 1로 만드는 이유: 데이터의 변동성을 통일하여 스케일 차이로 인해 발생하는 문제를 완화.

  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