반응형
Numpy
👉 여기서 numpy list를 편의상 n1, n2...로 칭함
속성 혹은 메서드 | 설명 |
---|---|
np.array(리스트) |
리스트를 넘파이 리스트로 변경 |
np.array(리스트, dtype=np.float64) |
리스트 변환 시 타입 결정 |
np.arange(1,7) |
1부터 7 전까지의 정수로 이뤄진 넘파이 배열 생성 |
n1.shape |
축을 기준으로 몇개씩 있는지 알려줌 |
n1.ndim |
몇차원인지 알려줌 |
n1.size |
총 배열의 크기가 몇인지 알려줌 |
n1[:, 2] |
슬라이싱(이 예시의 경우 모든 행의 index가 2인 원소 추출) |
n1[n1>=3] |
Boolean Indexing(조건에 따른 추출) |
n1.astype(dtype=np.float64) |
배열의 타입 변경 |
n1.reshape(3, -1) |
행이 3개인 배열로 재정의(이때 size가 바뀌면 안됨) |
np.zeros((행, 열)) |
해당 행 열의 크기로 0을 꽉채운 넘파이 배열 생성 |
np.ones((행, 열)) |
1로 채워진 배열 |
np.full((행, 열), 특정값) |
특정 값으로 채워진 배열 |
np.eye(n) |
크기가 n인 단위 행렬 |
np.random.random((행, 열)) |
랜덤값으로 채운 배열 생성 |
n1.add(n2) |
+ |
n1.subtract(n2) |
- |
n1.multiply(n2) |
* |
n1.divide(n2) |
/ |
n1**(n2) |
제곱 |
n1.sqrt |
제곱근 |
np.sum(n1, axis) |
합(axis= 값을 통해 방향 설정) |
np.mean(n1) |
평균(axis= 값을 통해 방향 설정) |
np.std(n1) |
표준편차(axis= 값을 통해 방향 설정) |
np.min(n1) |
최솟값(axis= 값을 통해 방향 설정) |
np.max(n1) |
최댓값(axis= 값을 통해 방향 설정) |
np.argmax(n1, axis =) |
가장 큰 값의 인덱스 반환 |
np.argmin(n1, axis =) |
가장 작은 값의 인덱스 반환 |
np.where(조건문, 참, 거짓) |
조건에 따라 값을 바꿔 출력해줌 |
np.linspace(0, 10, 5) |
0부터 10까지의 수를 5등분하는 값 |
Pandas
👉 pandas DataFrame을 편의상 df1, df2 와 같은 형식으로 표기
👉 *는 여러 컬럼들을 받을 수 있다는 뜻(리스트형태로)
속성 혹은 메서드 | 설명 |
---|---|
pd.DataFrame(딕셔너리) |
딕셔너리를 데이터프레임으로 |
pd.read_csv(파일주소 or url) |
csv파일을 데이터프레임으로 읽어옴 |
df1.head() |
데이터프레임 앞부분 추출 |
df1.tail() |
데이터프레임 뒷부분 추출 |
df1.shape |
데이터 프레임 형태 확인 |
df1.values |
값 정보 확인(2차원 넘파이 배열로 변경) |
df1.columns |
열의 이름 확인 |
df1.dtypes |
열 자료형 확인 |
df1.info() |
열에 대한 상세한 정보 확인 |
df1.describe() |
기초 통계 정보 확인 |
df1[조건식] |
조건식을 만족하는 데이터프레임 추출 |
df1.loc[행, 원하는 열의 이름] |
행 추출(열의 이름을 적지 않으면 행 자체 추출) |
df1.loc[:, 원하는 열] |
열 추출 |
df1.iloc[행의 인덱스, 열의 인덱스] |
인덱스로 행 및 열 추출 |
df1.sort_values(by=[*'column명'], ascending=[*bool] ) |
데이터프레임 정렬(ascending=True : 오름차순) |
df1.set_index(컬럼명) |
해당 컬럼을 index로 |
df1.reset_index(drop= ) |
인덱스를 초기화(drop=False라면 바뀌기전 인덱스를 남겨둠) |
df1['컬럼명'].unique() |
컬럼의 고유값 추출 |
df1['컬럼명'].values |
해당 컬럼의 값을 뽑아냄(시리즈 👉 넘파이 배열로) |
df1['컬럼영'].value_counts() |
컬럼의 값 별 개수 |
df1[[*컬럼명]] |
해당 컬럼명들로 데이터프레임 구성 |
df1['컬럼명'] |
해당 컬럼명으로 시리즈 구성 |
df1[[*컬럼명]].sum() |
합 |
df1[[*컬럼명]].max() |
최댓값 |
df1[[*컬럼명]].mean() |
평균 |
df1[[*컬럼명]].median() |
중앙값 |
df1.loc[df1['컬럼명'].isin([1, 2])] |
해당 컬럼에 1과 2만 추출 |
df1.loc[df1['컬럼명'].between([1, 2], inclusive = )] |
해당 컬럼값이 1과 2사이에 있는가(inclusive로 포함관계 표현 가능) |
df1.groupby([*컬럼명], as_index= )[[추출 컬럼명]].집계함수() |
*컬럼명 들을 기준으로 집계해서 추출 컬럼명들을 집계함수(sum, mean..)된 결과를 데이터 프레임으로 추출 1. 추출 컬럼명을 [추출컬럼명]과 같이 감싸면 시리즈 2.as_index = True는 집계기준이 인덱스 열이 됨 |
df1.groupby(컬럼명, as_index =)[[특정컬럼]].agg({'원하는 컬럼명':집계함수, ...}) |
집계함수의 결과를 원하는 형식으로 설정 가능 |
df1.columns=[컬럼 명 전체] |
행이름을 전체 컬럼명 리스트로 변경 |
df1.rename(columns={'이전 컬럼명':'바꿀 컬럼명'}) |
특정 컬럼명만 바꿀 경우 사용 |
df1['새로운 컬럼명'] = 해당 컬럼의 값 |
새로운 열 추가 |
df1.drop([*삭제할 컬럼명, axis=, inplace=True) |
컬럼 삭제, inplace =True이면 실제 반영, axis=0은 행, 1은 열 |
df1['특정 컬럼'] = 바꾸고 싶은 값 |
열 전체 값 변경 |
df1.loc[ df1['컬럼']<10, 참일때 값] |
조건 만족시 참일때의 값으로 변경 |
df1['컬럼'] = np.where(data['컬럼']<10, 참, 거짓) |
np.where를 사용해서 값 변경 |
df1['컬럼'] = df1['컬럼'].map({'Male':1, 'Female':0}) |
딕셔너리 형식으로 특정 값에 따른 값 변경 |
pd.cut(df1['컬럼'], bins=[범위 쪼개기], labels=[라벨]) |
범위를 기준으로 라벨의 명대로 값을 변경 |
pd.to_datetime(date 컬럼명, format='%d-%m-%Y') |
특정 컬럼을 합쳐서 date타입의 컬럼 만들기 |
pd.concat([df1, df2], axis = 0, join = 'inner') |
데이터 프레임을 합침(axis로 합치는 방향 설정) |
pd.merge(df1, df2, how='inner', on='특정 컬럼') |
특정 컬럼을 기준으로 두 데이터프레임을 합침 |
df1.pivot(index, column, values) |
index와 column을 기준으로 values에 해당하는 컬럼을 표시 |
df1.corr() |
숫자형 - 숫자형의 상관계수 계산 |
pd.crosstab(행, 열, normalize) |
교차표 |
Series.apply(function) |
시리즈의 모든 데이터를 function에 적용한 결과를 출력 |
pd.options.display.max_columns = n |
n개 까지 데이터프레임의 개수를 보여줌 |
df[컬럼명].str.contains(문자열) |
특정 컬럼명에 해당 문자열이 있으면 True, 없으면 False |
df.fillna(특정값) |
결측치를 특정값으로 채움 특정값 대신 사용할 수있는 방법 method='ffill' : 뒤의 결측치를 앞의 값으로 채우기 method='bfill' : 앞의 결측치를 뒤의 값으로 채우기 |
df.interpolate() |
() # Nan값을 앞뒤의 값의 동일 간격으로 채우기 (method='time') # 시계열날짜 index를 기준으로 결측값을 채움 (method='values') # 선형으로 비례하는 값들로 결측치를 채움 (method='values', limit=1) # 연속적으로 보간하는 개수를 1개로 제한함. (method='values', limit=1, limit_direction='backward') # 연속적으로 보간하는 개수가 1이면서 뒤 방향에서 채움. |
concat과 merge
pd.concat()
- 매핑 기준 : 인덱스(행), 컬럼이름(열)
- axis = 0
- 세로 행으로 합치기(위, 아래로 붙여라)
- 컬럼 명 기준
- axis = 1
- 가로로 합치기(옆으로 붙이기)
- 행 인덱스 기준(index가 같은것 기준으로 살릴지 말지 정함)
- join
- 'outer' : 모든 행과 열 합치기(기본값)
- 'inner' : 같은 행과 열만 합치기
pd.merge()
- 매핑 기준 : 특정 컬럼(key)의 값 기준으로 결합
- 옆으로만 병합
- 어떤 컬럼을 기준 삼을 것인가? = 키가 무엇인가?
- 데이터베이스 테이블 조인과 같음
- how
- inner : 같은 값만
- outer : 모두
- left : 왼쪽 df는 모두, 오른쪽 df는 같은 값만
- right : 오른쪽 df는 모두, 왼쪽 df는 같은 값만
- 매핑 기준 : 특정 컬럼(key)의 값 기준으로 결합
pd.pivot
- 집계된 데이터를 재구성
- groupby로 집계 먼저
- pivot
- dataframe.pivot(index, column, values)
- 집계된 데이터를 재구성
scipy
import scipy.stats as spst
속성 혹은 메서드 | 설명 |
---|---|
spst.pearsonr(a, b) |
a와 b의 상관계수와 p-value 출력 |
spst.ttest_ind(a, b) |
a와 b의 t 통계량(평균차이) 이때, a와 b는 범주별로 구분이 끝난 시리즈 |
spst.f_oneway(*arg) |
a와 b의 ANOVA(분산분석) 이때 a와 b는 범주별로 구분이 끝난 시리즈 |
spst.chi2_contingency(pd.crosstab(행, 열)) |
카이제곱검정 |
시계열
df1['컬럼명'].shift()
- 시계열 데이터에서 시간의 흐름 전 후로 정보를 이동시킬 때 사용
df1.['컬럼명'].rolling().mean()
- 시간의 흐름에 따라 일정 기간 동안 평균을 이동하면서 구하기
df1.['컬럼명'].rolling(n)
- n 기본값은 1
- min_periods : 최소 데이터수
- rolling함수 뒤에 mean(), max(), sum()등을 붙여서 연산 가능
df1['컬럼명'].diff()
- 특정 시점 데이터, 이전시점 데이터와의 차이 구하기
시각화_기본
- plt.plot(1차원)
- x축 : 인덱스
- y축 : 1차원 값
- plt.plot(x축, y축)
- plt.plot(x축, y축, data = )
- plt.title(제목) # 제목
- plt.xticks(rotation = 각도) # x축의 범례 각도만큼 기울여서 작성하기
- plt.xlabel('x축 이름') # x축 이름 지정
- plt.ylabel('y축 이름') # y축 이름 지정
- color=
- 'red','green','blue' ...
- 혹은 'r', 'g', 'b', ...
- https://matplotlib.org/stable/gallery/color/named_colors.html
- color=
- linestyle=
- 'solid', 'dashed', 'dashdot', 'dotted'
- 혹은 '-' , '--' , '-.' , ':'
- marker
marker | description |
---|---|
"." | point |
"," | pixel |
"o" | circle |
"v" | triangle_down |
"^" | triangle_up |
"<" | triangle_left |
">" | triangle_right |
- 범례
- plt.plot(x축, y축, label = 범례명) # 범례 추가
- 이후 plt.legend(loc = "원하는 위치") # 레이블 표시하기
- 그리드 추가
- plt.grid()
- 겹쳐 그리기
- plt로 2개 그린 후 plt.show()
- 축 범위 조정하기
- plt.xlim(시작, 끝)
- plt.ylim(시작, 끝)
- 수평선, 수직선 추가
- plt.axhline(40, color = 'grey', linestyle = '--') # 값, 색, 라인스타일
- plt.axvline(10, color = 'red', linestyle = '--')
- 그래프에 텍스트 추가
- plt.text(5, 41, '40') # x좌표, y좌표, 텍스트
- 여러개 그래프 한번에 그리기
- .subplot(행, 열, 현재가 몇번째 plot인가?)
- 순서는 왼쪽에서 오른쪽, 위에서 아래 순
- .tight_layout() : 그래프간 간격을 적절히 맞추기
- .subplot(행, 열, 현재가 몇번째 plot인가?)
시각화 분석
1. 단변량 분석
밀집, 희박구간을 찾기
왜 이 구간이 밀집 혹은 희박할지 생각해보기
숫자형_변수
- 숫자
- 기초통계량 : 평균, 중앙값, 최빈값, 사분위수
- 구간을 나눈 후 빈도수
그래프 | 그래프 형태 | plt | sns |
---|---|---|---|
Histogram | plt.hist(x축, bins = 구간수, edgecolor = 엣지색) |
sns.histplot(x=컬럼명, data = df명, bins = 구간 수) sns.histplot(x=컬럼명, data=df명, kde = True) kde그래프 추가 |
|
Density plot | - | sns.kdeplot(x축데이터) sns.kdeplot(x=컬럼명, data=df명) |
|
Box Plot | plt.boxplot(x축데이터, vert = ) |
sns.boxplot(x = x축 데이터) = 가로 sns.boxplot(y = y축데이터) = 세로 |
---
범주형_변수
- 숫자
- 범주별 빈도수 :
시리즈.value_counts()
value_counts(normalize = True)
0 ~ 1 사이의 수 (비율)로 표현
- 범주별 비율
- 범주별 빈도수 전체 count로 나누기
- df.shape
- 범주별 빈도수 :
그래프 | 그래프 형태 | plt | sns |
---|---|---|---|
Bar plot | temp = titanic['Pclass'].value_counts() plt.bar() |
sns.countplot(x='컬럼명', data=df1, order['컬럼명들']) |
|
Pie chart | temp = titanic['Pclass'].value_counts() plt.pie(값, labels = , autopct = '%.2f%%', startangle = , counterclock = ) labels : 라벨 autopct : 그래프 표시 값 비율 startangle : 시작각도 counterclock : False(시계방향) |
- | |
Count plot | - | sns.countplot(x= , data= ) |
|
+ Count plot : 범주별 개수 count |
2. 이변량 분석
숫자형👉숫자형
수치화
- 상관관계 : 얼마나 직선에 가깝나를 수치화 한 것
- -1 ~ 1
- p-value : 상관계수가 유의미한지를 검정
- p-value < 0.05 : 두 변수 간에 관계가 있다(상관계수가 의미가 있다)
- p-value >= 0.05 : 두 변수 간에 관계가 없다(상관계수가 의미가 없다)
import scipy.stats as spst
spst.pearsonr(수치형 시리즈1, 수치형 시리즈 2)
spst.pearsonr(air['Temp'], air['Ozone'])
# null인지 까지 체크해야 하는 경우
# .notnull() null 인지 아닌지
temp = air.loc[air['Solar.R'].notnull()] # .notna()
spst.pearsonr(temp['Solar.R'], temp['Ozone'])
# 상관계수 한번에 구하기
df1.corr()
시각화
그래프 | 그래프형태 | plt | sns |
---|---|---|---|
Scatter | plt.scatter(x = , y = , data = ) |
sns.scatterplot(x = , y =, data = , hue = x컬럼의 범주화) |
|
pairplot | - | sns.pairplot(dataframe) |
|
jointplot | - | sns.jointplot(x= , y=, data =) |
|
regplot | - | sns.regplot(x=, y=, data=) |
|
Heatmap | - | sns.heatmap(df1.corr(), annot = , fmt = , cmap = , vmin = , vmax = ) annot = True(상관계수 표기 여부) fmt = '.3f'(숫자 포멧) cmap = 'RdYlBu_r'(칼라맵) vmin = -1(값의 최소) vmax = 1(최댓값) |
|
lmplot | - | sns.lmplot(x= , y= , hue= , data=, fit_reg=True, lowess=True) |
범주형👉숫자형
수치화
- t-test : 2 그룹간 평균에 차이가 있는가?(평균차이)
- 범주의 수 2개 일때
- 절댓값 2 이상이면 유효
- anova : 여러 집단 간에 차이 비교(분산 분석)
- 범주가 3개 이상
- 어느 그룹 간에 차이가 있는지는 알 수 없음
- 값이 2~3 이상이라면 유효값
- t-test 코드(ttest_ind)
# t-test는 기본적으로 null이 있으면 안되기 때문에 체크 titanic.isna().sum()
NaN 행 제외
temp = titanic.loc[titanic['Age'].notnull()]
두 그룹으로 데이터 저장
died = temp.loc[temp['Survived']==0, 'Age']
survived = temp.loc[temp['Survived']==1, 'Age']
#t test
spst.ttest_ind(died, survived)
<br>
+ Anova 코드(f_oneway())
```python
# 분산 분석을 위한 데이터 만들기
# NaN 행 제외
temp = titanic.loc[titanic['Age'].notnull()]
# 그룹별 저장
P_1 = temp.loc[temp.Pclass == 1, 'Age']
P_2 = temp.loc[temp.Pclass == 2, 'Age']
P_3 = temp.loc[temp.Pclass == 3, 'Age']
spst.f_oneway(P_1, P_2, P_3)
시각화
그래프 | 그래프 형태 | plt | sns |
---|---|---|---|
Bar plot | - | sns.barplot(x= ,y=, data= ) |
def bivariate_analysis(data, x, y):
# 데이터 유효성 검사
if x not in data.columns:
print(f"Invalid column name '{x}' for x. Please check the column name.")
return
if y not in data.columns:
print(f"Invalid column name '{y}' for y. Please check the column name.")
return
# 데이터 시각화
plt.figure(figsize=(16, 6))
# 범주가 2개인 경우 t-검정 수행 및 시각화 (Bar Plot) if len(data[x].unique()) == 2:
plt.subplot(1, 3, 1)
sns.boxplot(x=x, y=y, data=data)
plt.title(f'Box Plot: {x} vs {y}')
plt.subplot(1, 3, 2)
sns.barplot(x=x, y=y, data=data)
plt.title(f'Bar Plot: {x} vs {y}')
category1 = data[data[x] == data[x].unique()[0]][y]
category2 = data[data[x] == data[x].unique()[1]][y]
t_stat, p_value = ttest_ind(category1, category2)
print(f'T-Test Results (p-value): {t_stat}, {p_value}')
# 범주가 3개 이상인 경우 일원 분산분석 (ANOVA) 수행 및 시각화 (Violin Plot) elif len(data[x].unique()) >= 3:
plt.subplot(1, 3, 1)
sns.violinplot(x=x, y=y, data=data)
plt.title(f'Violin Plot: {x} vs {y}')
plt.subplot(1, 3, 2)
sns.barplot(x=x, y=y, data=data)
plt.title(f'Bar Plot: {x} vs {y}')
categories = [data[data[x] == category][y] for category in data[x].unique()]
f_stat, p_value = f_oneway(*categories)
print(f'ANOVA Results (p-value): {f_stat}, {p_value}')
plt.tight_layout()
plt.show()
숫자형👉범주형
시각화
- kdeplot
- 두가지 방법
- ① kdeplot( , hue = 'Survived')
- 생존여부의 비율이 유지된 채로 그려짐
- 두 그래프의 아래 면적의 합이 1
- ② kdeplot( , hue = 'Survived', common_norm = False)
- 생존여부 각각 아래 면적의 합이 1인 그래프
- ③ kdeplot( , hue = 'Survived', multiple = 'fill')
- 나이에 따라 생존여부 비율을 비교해볼 수 있음. (양의 비교가 아닌 비율!)
- ① kdeplot( , hue = 'Survived')
- 두가지 방법
- histplot
- bin을 적절히 쪼개면 kdeplot에서 보이지 않던 경향성(내려가는 부분도 내려갔다 올라갔다 하는 것)
그래프 | 그래프형태 | plt | sns |
---|---|---|---|
kdeplot | - | sns.kdeplot(x= , data=, hue= (target), common_norm = False) |
|
kdeplot | - | sns.kdeplot(x=, data=, hue=, multiple='fill') plt.axhline(target.mean(), color='r') |
|
histplot | - | sns.histplot(x=, data=, hue=, bins= , multiple='fill') |
범주형👉범주형
교차표가 기본 👉 이후 수치화 혹은 시각화
교차표
- normalize
- 'columns' : 열 기준 집계
- 'index' : 행 기준 집계
- 'all' : 전체 표 기준 집계
pd.crosstab(행, 열, normalize = )
수치화
- 카이제곱검정
- 범주형 변수들 사이에 어떤 관계가 있는지, 수치화 하는 방법
- $Σ\frac{(관측빈도 - 기대빈도)^2}{기대빈도}$
- 카이제곱 검정 보는법
- 카이제곱검정 값의 크기가 클수록 대립가설이 맞다는 뜻(기대빈도로 부터 실제 값에 차이가 큼)
# 1) 먼저 교차표 집계
table = pd.crosstab(titanic['Survived'], titanic['Pclass'])
# 2) 카이제곱검정
spst.chi2_contingency(table)
시각화
- mosaic plot : 범주별 양과 비율을 나타냄
- 빨간 선 : 전체 평균(모자이크 플롯 외에 따로 선을 추가)
- x축 길이 : Column별 비율
- y축 길이 : 각각의 Column별 행의 범주의 비율
- 전체 비율 평균과 각 column별 선을 이용해 두 column이 관계 있는지 없는지 확인 가능
from statsmodels.graphics.mosaicplot import mosaic
mosaic(titanic, [ 'Pclass','Survived'])
plt.axhline(1- titanic['Survived'].mean(), color = 'r')
plt.show()
그래프 | 그래프 형태 | plt | mosaic |
---|---|---|---|
mosaic plot | - | mosaic(데이터, [행, 열]) |
|
stacked bar | temp = pd.crosstab(행, 열, normalize) temp.plot.bar(stacked=Ture) |
- | |
+ 위 의 경우 plot을 그리고 전체평균을 구해서 표시 후 비교하기 | |||
+ plt.axhline(1-titanic['Survived'].mean(), color = 'r') |
데이터_유형별_코드
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.graphics.mosaicplot import mosaic
import scipy.stats as spst
def eda_1_n(data, var, bins = 30) :
display(data[[var]].describe().T)
print('-' * 70)
plt.figure(figsize = (8,6))
plt.subplot(2,1,1)
sns.histplot(x=var, data = data, bins = 20, kde = True)
plt.grid()
plt.subplot(2,1,2)
sns.boxplot(x=var, data = data)
plt.grid()
plt.tight_layout()
plt.show()
def eda_1_c(data, var) :
print(f'<< {var} >>')
temp1 = data[var].value_counts()
temp2 = data[var].value_counts()/ data.shape[0]
temp3 = pd.DataFrame({'class':temp1.index, 'count':temp1.values, 'prop':temp2.values})
display(temp3)
print('-' * 70)
sns.countplot(x = var, data = data)
plt.grid()
plt.show()
def eda_2_nc(data, target, var) :
plt.figure(figsize = (8,6))
plt.subplot(2,1,1)
sns.kdeplot(x=var, data = data, hue =target, common_norm=False)
plt.xlim(data[var].min(), data[var].max())
plt.grid()
plt.subplot(2,1,2)
sns.kdeplot(x=var, data = data, hue =target, multiple='fill')
plt.axhline(data[target].mean(), color = 'r')
plt.xlim(data[var].min(), data[var].max())
plt.grid()
plt.tight_layout()
plt.show()
def eda_2_cc(data, target, var) :
print(data[target].mean())
temp1 = pd.crosstab(data[target], data[var])
display(temp1)
temp2 = pd.crosstab(data[target], data[var], normalize = 'columns')
display(temp2)
mosaic(data, [ var,target], gap = 0.01)
plt.axhline(data[target].mean(), color = 'r')
plt.show()
# 카이제곱검정
print(spst.chi2_contingency(temp1))
def eda_2_nn(data, col1, target):
display(spst.pearsonr(data[col1], data[target]))
plt.figure(figsize = (14,7))
plt.subplot(1,2, 1)
sns.regplot(x=col1, y=target, data=data)
plt.subplot(1, 2, 2)
sns.jointplot(x=col1, y=target, data=data)
plt.tight_layout()
plt.show()
def eda_2_nn_h(data, col1, target, h):
display(spst.pearsonr(data[col1], data[target]))
plt.figure(figsize = (21,7))
plt.subplot(1,3, 1)
sns.regplot(x=col1, y=target, data=data)
plt.subplot(1, 3, 2)
sns.scatterplot(x=col1, y=target, data=data, hue=h)
plt.subplot(1, 3, 3)
sns.jointplot(x=col1, y=target, data=data, hue=h)
plt.tight_layout()
plt.show()
def eda_2_cn_ttest(data, col1, target, checklist):
temp = data.loc[data[col1].notnull(), :]
s1 = temp.loc[temp[col1] == checklist[0], target]
s2 = temp.loc[temp[col1] == checklist[1], target]
display(spst.ttest_ind(s1 , s2))
plt.figure(figsize=(6,6))
sns.barplot(x=col1, y=target, data=temp)
def eda_2_cn_anova(data, col1, target):
sns.barplot(x=col1, y=target, data=temp)
데이터 처리 및 이해의 궁극적인 목표
- 가설검정과 이변량분석 등을 통해 X(feature)와 Y(target)사이의 관계를 확인
- 통계적으로 유의미한지를 확인
- 비지니스를 파악하고 의미있는 정보를 추출하는 단계
- 상관계수, t-test등에 의해 관계가 없다고 판단되는 X(feature)가 나온 경우 제거하는 작업을 진행
- 불필요한 변수를 제거하여 모델링 단계에서 모델의 복잡도를 줄이고 성능을 개선
- 하지만 상관계수, t-test등에 의해 해당 feature를 제거했다고 해서 모델성능이 좋아진다고 장담할 수는 없음
- 상관계수, t-test말고도 여러요인으로 의해 해당feature와 모델성능은 관계가 있을 수도 있기 때문
단변량 => 쓸수 있나 없나 => 이변량 => 독립 1개 종속 1개, 독립을 두고 종속변수를 바꿔보기
반응형
'데이터분석&ML&DL' 카테고리의 다른 글
YOLO 이미지 직접 Annotate하기 (0) | 2023.09.22 |
---|---|
YOLO 동영상 처리 (0) | 2023.09.22 |
시각지능 딥러닝 정리 (0) | 2023.09.22 |
머신러닝 정리 (0) | 2023.09.22 |