-데이터프레임 생성
import pandas as pd
# 예제 데이터프레임 생성
data = {
'age': [25, 30, 35, 40, 45],
'salary': [50000, 60000, 70000, 80000, 90000],
'sex': ['M', 'F', 'F', 'M', 'F']
}
df = pd.DataFrame(data)
#기존 변수의 조합하여 새로운 변수 생성
df['age_salary_sum'] = df['age'] + df['salary']
print(df)
#변수를 변환하여 새로운 변수 생성
df['log_salary'] = np.log(df['salary']) #기존 변수를 변환하여 새로운 변수 만들기
print(df)
1. 데이터 불러오기
가. 라이브러리 Import
import pandas as pd
import numpy as np
나. 데이터 프레임 변수로 저장
- csv : pd.read_csv("파일이름. csv")
- txt : pd.read_csv("파일이름. csv", sep="구분자")
- xlsx : pd.read_excel('파일이름.xlsx')
- pickle : pd.read_pickle("파일이름.pkl")
[참고] pickle은 파이썬의 모든 객체를 파일로 저장할 수 있는 방법으로 DataFrame,List,Dict 등 모든 객체 저장 가능(특히 sklearn라이브러리를 통해 모델을 학습시키고, 저장할 때 많이 사용)
df = pd.read_csv("onenavi_train.csv")
df #데이터프레임 확인하기
df.shape #데이터프레임의 shape을 확인
다. 학습데이터와 평가데이터 합치기
https://yganalyst.github.io/data_handling/Pd_12/
=> merge, join, concat 설명
merge함수
-두 데이터프레임을 특정 열 또는 인덱스를 기준으로 병합
-기준 열은 병합할 때 사용할 열을 지정한다.
-how 유형은
inner(교집합 : 두 데이터프레임에 모두 존재하는 키를 기준),
outer(합집합, 두 데이터프레임의 모든 키를 포함),
left( 왼쪽 데이터프레임의 모든 키를 포함하며, 오른쪽 데이터프레임에 일치하는 키가 없으면 NaN으로 표시),
right( 오른쪽 데이터프레임의 모든 키를 포함하며, 왼쪽 데이터프레임에 일치하는 키가 없으면 NaN으로 표시 )가 있다.
ex) result = pd.merge(df1, df2, on='key', how='inner') # key 열을 기준으로 inner join
join함수
-데이터프레임의 인덱스를 기준으로 결합
-기본적으로 왼쪽 데이터프레임의 인덱스를 기준으로 결합
ex) result = df1.join(df2, how='left')
concat함수
-데이터프레임이나 시리즈를 축(axis)을 따라 결합
-행(row) 또는 열(column)을 기준으로 결합
- axis=0은 행을 기준으로, axis=1은 열을 기준으로 결합
ex) result = pd.concat([df1, df2], axis=0)
=>concat은 단순히 데이터프레임을 이어붙이는 데 적합하다.
학습 데이터와 평가 데이터를 결합하여 일관된 전처리를 수행한 후, 다시 분할하는 작업에 유리
merge는 공통 열을 기준으로 복잡한 조인을 수행할 떄 사용된다.
학습 데이터와 평가 데이터를 결합하는 경우 필요하지 않는다.
df = pd.read_csv("onenavi_train.csv",sep="|")
df_eval = pd.read_csv("onenavi_evaluation.csv",sep="|")
# 학습/평가 데이터의 전처리 기준을 통일하기위해 데이터 합본
df_total=pd.concat([df,df_eval],ignore_index=True)
df_total #데이터확인
2. 추가변수 생성
df_pnu = pd.read_csv("onenavi_pnu.csv", sep="|")
df_siganl = pd.read_csv("onenavi_siganl.csv", sep="|")
df_total = pd.merge(df_total, df_pnu, on="RID")
df_total = pd.merge(df_total, df_siganl, on="RID")
df_total
3. 데이터 분석하기
가. 라이브러리 import
!pip install seaborn
import seaborn as sns
import matplotlib.pyplot as plt
나. Seaborn을 활용한 데이터 시각화
1) CountChart (데이터 시각화에서 특정 범주형 변수의 각 카테고리별로 데이터의 개수를 세어 시각화하는 차트를 의미)
# 필요한 모듈 임포트
import matplotlib.font_manager as fm
# 시스템에 설치된 모든 폰트의 경로 리스트를 가져옵니다.
fm.get_fontconfig_fonts()
# 폰트 관리자에서 TTF(TrueType Font) 리스트를 가져와 폰트 이름을 추출합니다.
font_list = [font.name for font in fm.fontManager.ttflist]
# 폰트 이름 리스트를 출력합니다.
font_list
sns.set(font="NanumGothicCoding",
rc={"axes.unicode_minus":False}, # 마이너스 부호 깨짐 현상 해결
style='darkgrid')
#sns.countplot() 범주형 데이터의 빈도를 시각화하는 막대 그래프를 생성
#x=df_total['level1_pnu']: x축에 사용할 데이터로, df_total 데이터프레임의 'level1_pnu' 열을 지정
#palette="RdBu": 막대 그래프의 색상 팔레트를 "Red-Blue" 스케일로 설정
ax = sns.countplot(x=df_total['level1_pnu'], palette = "RdBu")
2) DistChart
x = df_total['signaltype'] # 샘플 생성
sns.distplot(x) #seaborn의 distplot 함수를 사용하여 x 데이터의 분포를 시각화
plt.show() #matplotlib의 show 함수를 사용하여 그래프를 화면에 출력
3)Boxplot
# 만들어진 데이터프레임으로 BoxPlot을 그려보겠습니다.
sns.boxplot(x = df_total['level1_pnu'], y = df_total['A_DISTANCE'], data = df_total, palette = "RdBu")
plt.show()
# 만들어진 데이터프레임으로 BoxPlot을 그려보겠습니다.
sns.boxplot(x = df_total['level1_pnu'], y = df_total['ET'], data = df_total, palette = "RdBu")
plt.show()
4) Heatmap
uniform_data = np.random.rand(10, 12) # 난수로 데이터 만들기
sns.heatmap(uniform_data)
plt.show()
5) Pairplot
sns.pairplot(df_total)
plt.show()
다. 상관관계 분석(Pandas/ Seaborn)
1) 상관관계 구하기:pandas는 corr함수를 통해 상관계수를 손쉽게 구하도록 도와준다.
df_total.corr()
2) seaborn의 Heatmap을 활용한 시각화
sns.heatmap(df_total.corr(), annot=True, cmap="RdBu")
plt.show()
라.요인분석
1) 라이브러리 import
# FactorAnalyzer는 설치안된 경우가 많을 것입니다. 설치를 먼저 진행합니다.
!pip install factor-analyzer
2) Kaiser-Meyer-Olkin (KMO) 검정: 요인 분석을위한 데이터의 적합성을 측정(0.6 미만의 KMO 값은 부적절한 것으로 간주)
# 요인분석은 수치형변수(int, float 등)으로만 이루어진 데이터에서 가능함으로 문자형 변수는 제거 필요
df.drop(['RID','TIME_DEPARTUREDATE','TIME_ARRIVEDATE'],axis=1)
kmo_all,kmo_model=calculate_kmo(df.drop(['RID','TIME_DEPARTUREDATE','TIME_ARRIVEDATE'],axis=1))
kmo_model # 0.642878086837649 : 0.6 이상으로 양호함
3) ScreePlot을 활용한 요인수 결정 : Elbow 기법
- 고유값(각각의 요인으로 설명할 수 있는 변수들의 분산 총합) 시각화
# 요인분석 오브젝트를 만들고 실행해보겠습니다.
fa = FactorAnalyzer()
fa.set_params(rotation=None)
fa.fit(df.drop(['RID','TIME_DEPARTUREDATE','TIME_ARRIVEDATE'],axis=1))
# 고유값 확인 * 고유값(eigenvalue):각각의 요인으로 설명할 수 있는 변수들의 분산 총합
ev, v = fa.get_eigenvalues()
ev
# Scree Plot을 그려서 Elbow 지점을 찾아봅시다.
plt.scatter(range(1,df.drop(['RID','TIME_DEPARTUREDATE','TIME_ARRIVEDATE'],axis=1).shape[1]+1),ev)
plt.plot(range(1,df.drop(['RID','TIME_DEPARTUREDATE','TIME_ARRIVEDATE'],axis=1).shape[1]+1),ev)
plt.title('Scree Plot')
plt.xlabel('Factors')
plt.ylabel('Eigenvalue')
plt.grid()
plt.show()
4) 요인부하량 확인 및 시각화
# 요인분석 오브젝트를 만들고 실행해보겠습니다.
fa = FactorAnalyzer()
fa.set_params(n_factors=3, rotation=None)
fa.fit(df.drop(['RID','TIME_DEPARTUREDATE','TIME_ARRIVEDATE'],axis=1))
pd.DataFrame(fa.loadings_) # 요인부하량 확인 : 0.4이상 유의미, 0.5이상 중요
# Heat Map으로 그려서 확인해보겠습니다.
plt.figure(figsize=(6,10))
sns.heatmap(fa.loadings_, cmap="Blues", annot=True, fmt='.2f')
5) 크론바흐 계수(신뢰도) 계산 : 0.8이상 양호
# 크론바흐 계수를 계산하는 함수를 선언하겠습니다.
def CronbachAlpha(itemscores):
itemscores = np.asarray(itemscores)
itemvars = itemscores.var(axis=0, ddof=1)
tscores = itemscores.sum(axis=1)
nitems = itemscores.shape[1]
return (nitems / (nitems-1)) * (1 - (itemvars.sum() / tscores.var(ddof=1)))
# ET와 ETA 신뢰계수
print(CronbachAlpha(df[['ET','ETA']]))
# ET와 ETAA 신뢰계수
print(CronbachAlpha(df[['ET','A_DISTANCE']]))
6) 요인점수를 활용한 변수 생성
fa.transform(df.drop(['RID','TIME_DEPARTUREDATE','TIME_ARRIVEDATE'],axis=1))
'자격증 > AICE' 카테고리의 다른 글
AICE ex3 (1) | 2024.07.12 |
---|---|
AICE ex2 (0) | 2024.07.12 |
AICE Associate 정리 (0) | 2024.07.10 |