[빅데이터분석기사/실기] 이기적 빅데이터분석기사 실기 기본서 python 간단 정리
확실히 일반적으로 시중의 풀이보다 타이핑이나 시간이 오래걸린다. 데이터마님이나 다른 방법을 추천하기는 한다. 그러나 기본서는 확실히 기본서이다.
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('두 그룹의 평균은 유의미하게 다르지않습니다.')