공부/자격증

[빅데이터분석기사/실기] 이기적 빅데이터분석기사 실기 기본서 python 간단 정리

Moonie' 2024. 11. 30. 00:23
반응형

확실히 일반적으로 시중의 풀이보다 타이핑이나 시간이 오래걸린다. 데이터마님이나 다른 방법을 추천하기는 한다. 그러나 기본서는 확실히 기본서이다.

1. 작업 1유형

1.1 데이터 분석

df.info() :데이터셋 전체 구조와 특징(각 변수들의 타입과 변수별 값의 개수(Non-Null Counts) 등 )을 보여줌

df.['컬럼명'].astype(str) :변수 타입을 변형

df.describe(include = 'all') : 데이터셋의 수치형 변수에 대해서 기초통계량을 보여줌, include='all'로 모든 변수에 대한 통계와 분포를 보여줌

df.groupby("컬럼병") : 컬럼병별로 그룹핑 시킴

df.size(): 변수별 수를 계산

 

1.2 데이터 전처리

정규분포를 따르는 난수발생

np.random.rand(n) : 0 ~ 1사이의 균일한 분포를 갖는 난수  n개를 생성한다.

np.random.randint(min,max,size=n) : min~max 상의 균일한 분포를 갖는 임의의 정수 n개를 생성

np.random.randn(n): 평균 0, 표준편차 1의 표준정규분포를 갖는 난수 n개 생성

                                  평균  μ , 표준편차 σ의 졍규 분포를 갖는 난수 - 

                                    σ  * np.random.randn(n)  + μ의 식을 사용.

 

● Z-표준화 : Z-score는 각 데이터 값에서 평균을 뺀 후 표준편차로 나누어 준값(변환 후 평균은 0, 표준편차는 1)

방법 1 numpy >> z = (x - mean(x))/std(x)

import numpy as np
컬럼명_avg = np.mean(df['컬럼명'])
컬럼명_std = np.std(df['컬럼명'])
df['컬럼명_Z점수'] = (df['컬럼명'] - 컬럼명_avg) / 컬럼명_std

 

방법 2 scipy.stats >> zscore()

import scipy.stats as ss
df['컬럼명_정규화']= ss.zscore(df)

 

방법 3 sklearn.preprocessing >> StandardScaler().fit_transform()

from sklearn.preprocessing import StandardScaler
sclaer = StandardScaler()
df['컬럼명_정규화'] = scaler.fit_transform(df['컬럼명'])

 

Min-Max 정규화

Min-Max 정규화는 연속형 변수의 값과 0과 1 사이의 값으로 변환.

 

방법1 numpy 이용하여 식을 직접 입력

컬럼명_min = np.min(df['컬럼명'])
컬럼명_max = np.max(df['컬럼명'])
df['컬럼명_정규화'] = (df['기말'] - 컬럼명_min)/(컬럼명_max - 컬럼명_min)

 

방법 2 sklearn 사용

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df['컬럼명'] = scaler.fit_transform(df[['컬럼명']])

 

결측치 확인

1) 결측치 확인과 제거

결측값 식별

df.info()로 컬럼별 결측값 개수확인

df.isnull() : 결측치일 경우 True를 반환, 값이 존재하는 경우 False를 반환

df.isnull().sum() : 컬럼별 결측치 갯수 확인

 

결측치 대체 

1)결측치 제거

dropna()

용도 사용 예
결측치가 있는 모든 행 삭제 df.dropna(axis=0)
결측치가 있는 모든 열 삭제 df.dropna(axis=1)
특정열의 결측치가 있는 모든 행 삭제 df.dropna(subset=['컬럼명'],axis=0)

 

2) 결측치를 지정값으로 대체

fillna()를 이용하여 결측값을 지정한 값으로 대체

# 평균값 대체
컬럼명_mean = df['컬럼명'].mean()
df['컬럼명'].fillna(컬럼명_mean,inplace = True)

# 최빈값 대체
컬럼명_mode = df['컬럼명'].mean()
df['컬럼명'].fillna(컬럼명_mode[0],inplace=True)

# 인접값으로 대체
df['컬럼명].fillna(method = 'ffill',inplace=True)

# 결측치를 그룹별 평균값으로 대체
df['컬럼명'].fillna(df.groupby('특정그룹')['컬럼명'].transform('mean'),inplace=True)

 

 이상치

IQR(Interquartile Range, 사분위범위) 

IQR = Q3(3사분위수) - Q1(1사분위수)

Q1 = df['값'].quantile(.25) # 1사분위수
Q2 = df['값'].quantile(.5) # 2사분위수
Q3 = df['값'].quantile(.75) # 3사분위수
IQR = Q3-Q1

 

이상치는 3사분위수 + IQR *1.5 혹은 1사분위수 - IQR*1.5

upper_condition = df['값'] > (Q3 + IQR*1.5)
lower_condition = df['값'] < (Q1 - IQR*1.5)
upperOutlier = df[upper_condition]
lowerOutlier = df[lower_condition]

 

2. 작업 2유형

1.1 빅데이터 분석 과정

작업 순서

필요 패키지 임포트 --> 데이터 불러오기 --> 데이터 살펴보기 --> 데이터 전처리 --> 분석 데이터셋 준비 --> 분석 데이터셋 준비 --> 데이터 분석 수행--> 성능평가 및 시각화

1) 필요패키지 임포트

import numpy as np
import pandas as pd
import sklearn

# 의사결정나무 분류모델을 위한 패키지 임포트
from sklearn.tree import DecisionTreeClassfier

# 학습 및 테스트 데이터셋 분리를 위한 패키지 임포트
from sklearn.model_selection import train_test_split

# 기출에서는 RnandomForestClassifier가 주로 사용
from sklearn.ensemble import RandomForestClassifier

 

2) 데이터 불러오기

df = pd.read_csv('데이터.csv')

 

3) 데이터 살펴보기

df 나 df.head() 로 전체나 상위 일부의 데이터 확인

df.shape # 데이터프레임의 열과 행의 수를 출력
df.info() # 데이터프레임의 요약정보 출력
df.describe() # 데이터프레임의 기술통계 보여주기

 

4) 데이터 전처리

필요한 경우 수행

이상치, 결측치 판단하여 데이터 품질 높임

ex) 레이블 인코딩

# 텍스트로 되어 있는 species 컬럼의 데이터를 0,1,2로 변환
df['컬럼명'].replace({'setosa':0, 'versicolor':1, 'virginica':2},inplace=True)

 

5) 분석데이터셋 준비

#x는 독립변수(설명변수), y는 종속변수(목표변수)
# 방법 1. 직접 입력
x = df[['speal_length','special_widht','petal_length','petal_width']]
y = df['species']

# 방법 2. 함수 이용
x = df.drop(columns=['species'])
y = df['species']

#test_size로 train, test 분리 
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2, random_state=11)

 

6) 데이터분석 수행

분석 알고리즘 선택하고, 분석을 수행.

지도학습 - 분류 의사결정나무(분류), KNN, SVM, 로지스틱 회귀분석, 랜덤포레스트, 인공신경망
지도학습 - 회귀(예측) 선형회귀분석 다중회귀분석, 의사결정나무(회구)
비지도학습 군집분석, 연관분석, 인공신경망

 

객체 생성 후 학습 수행

- 학습용 데이터(x_train), 결정값 데이터(y_train) 입력해 호출하면 학습이 수행.

# DecisionTreeClassifier 객체 생성
dt = DecisionTreeClassifier(random_state=11)
dt.fit(x_train,y_train) # 학습 수행

 

학습이 완료된 dt 객체(모델)에서 테스트 데이터셋(x_test)으로 분류(예측) 수행

pred = dt.predict(x_test)

 

 

7) 성능평가 및 시각화

분류(예측) 결과(pred) 와 실제 분류 결과(y_test)를 비교하여 정확도를 평가

# 모델 성능 - 정확도 측정
from sklearn.metrics import accuracy_score
acc= accuracy_score(y_test,pred)
print(acc)

 

2.2 지도학습 - 분류

랜덤 포레스트를 이용한 분류 문제 해결

1) 랜덤 포레스트(Random Forest) 알고리즘

나는 pd.get_dummies(df) 를 사용하여 원핫인코딩을 진행함

아래는 책의 내

# 타이타닉 데이터셋
import numpy as np
import pandas as pd
import sklearn

# 랜덤 포레스트 분류모델을 위한 패키지 임포트
from sklearn.ensemble import RandomForestClassifier

#학습 및 테스트 데이터셋 분리르 위한 패키지 임포트
from sklearn.model_selection import train_test_split

#웹에 있는 csv 파일을 읽어와서 데이터프레임 df로 넣는다.
df = pd.read_csv('https://raw.githubusercontent.com/YoungjinBD/dataset/main/titanic.csv')

#Age 컬럼의 결측값을 평균으로 대체한다.
d_mean = df['Age'].mean()
df['age'].fillna(d_mean, inplace=True)

#Embarked 컬럼의 결측값을 최빈값으로 대체
d_mode = df['Embarked'].mode()
df['Embarked'].fillna(d_mode, inplace=True)

#Sex 컬럼의 값을 1과 0의 레이블인코딩 한다.
from sklearn.preprocessing import LabelEncoder
df['Sex'] = LabelEncoder().fit_transform(df['Sex'])

# Embarked 컬럼의 값을 레이블 인코딩 한다.
df['Embarked'] = LabelEncoder().fit_transform(df['Embarekd'])

# SibSp, Parch 의 값을 더해서 FamilySize 컬럼(파생변수)를 생성한다.
df['FamilySize'] = df['SibSp']+df['Parch'] #형제자매 + 부모님

#분석 데이터셋 준비
#X는 독립변수(설명변수), y는 종속변수(목표변수)
x = df[['Pclass','Sex','Age','Fare','Embarked','FamilySize']]
y= df['Survived']

# 분석 데이터셋 분할(8:2)
x_train,x_test,y_train,y_test = train_test_spli(x,y,test_size=0.2,random_state=11)

#RandomForestClassifier 객체 생성
rf = RandomForestClassifier(n_estimators=50, max_depth=3, random_state=20)
rf.fit(x_train,y_train) # 학습수행

#학습이 완료된 rf객체에서 테스트 데이터셋으로 예측 수행
pred = rf.predict(x_test)

#모델 성능 - 정확도 측정
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_test,pred)
print(acc)

2.3 지도학습 - 회귀

분류는 예측값이 카테고리, 회귀는 예측값이 연속형 숫자

단순은 넘어가고 다중회귀 분석 중 랜덤포레스트회귀 분석을 적어본다.

# 주택중위가치(median_house_value)에 영향을 주는 변수 찾고 트리모델 생성하고 성능 평가
import numpy as np
import pandas as pd
import sklearn
import matplotlib.pyplot as plt

# 랜덤포레스트 모델
from sklearn.ensemble import RandomForestRegressor
# 학습 및 테스트 데이터셋 분리를 위한 패키지 임포트
from sklearn.model_selection import train_test_split
#데이터 불러오기
df=pd.read_csv('https://raw.githubusercontent.com/YoungjinBD/dataset/main/housing.csv')

#결측값 행 제거(axis=1은 열을 제거
df = df.dropna(axis=0)

#ocean_proximity는 범주형 값으로 분석에서 제외
df = df.drop('ocean_proximity',axis=1)

#median_house_value를 제외한 나머지를 독립변수로 함
x=df.drop('median_house_value',axis=1)
y=df['median_house_value'] # 종속변수(목표변수)

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=42)

# RandomForestRegressor 객체 생성
rfr = RandomForestRegressor()
rfr.fit(x_train,y_train)

#학습이 완료된 rfr 객체에서 테스트 데이터셋으로 예측 수행
pred = rfr.predict(x_test)

#모델 성능 평가 - 테스트 데이터셋
from sklearn.metrics import mean_squared_error
mse = mean_sequred_error(y_test,pred)
print(mse)

 

3. 작업 3유형

3.2. 통계정 가설 검정 기법 실습

3.2.1. 표본 평균 검정

import numpy as np
import pandas as pd
from scipy as stats

#데이터 불러오기
mtcars = pd.read_csv('https://raw.githubusercontetn.com/YOungjinBD/dataset/main/mtcars.csv')

# mpg 열의 표본평균 계산 및 반올림
mpg_mean = round(np.mean(mtcars['mpg']),4)

# mpg 열의 표본분산 계산 및 반올림
mpg_var = round(np.var(mtcars['mpg'],ddof=1),4)

# 단일 표본 t-검정 수행, mpg 열의 평균이 20인지 검정
t_stat, p_value = stats.ttest_1sample(mtcars['mpg'], 20)
print('t-통계량', t_stat)
print('p-값:', p_value)

# mpg 평균의 95% 신뢰구간 계산 및 출력
conf_interval = stats.t.interval(0.95, len(mtcars['mpg']) -1, loc= np.mean(mtcars['mpg']),scale=stats.sem(mtcars['mpg']))
print('mpg 평균의 95% 신뢰구간:', round(conf_interval[0],4), "-",round(conf_interval[1],4))

 

3.2.1. 두 독립표본의 평균, 중앙값 차이 검정

import scipy.stats as stats
import numpy as np

# 두 독립 표본 데이터
sample1 = [23, 25, 28, 30, 32]
sample2 = [19, 21, 24, 26, 29]

# t-검정 실행
t_static, p_value = stats.ttest_ind(sample1, sample2)

# 각샘플위 평균
mean_sample1 = np.mean(sample1)
mean_sample2 = np.mean(sample2)

# 결과 출력
alpha = 0.05 # 유의수준 일반적으로 0.05 사용
print('t-검정통계량:', t_static)
print('sample 1 평균:', mean_sample1)
print('sample 2 평균:', mean_sample2)
print('p-값 (two-tailed):', p_value)
if p_value < alpha:
  print('두 그룹의 평균은 유의미 하게 다릅니다.")
else:
  print('두 그룹의 평균은 유의미하게 다르지않습니다.')
반응형