내일배운캠프 7일차 TIL + 데이터 확인 및 활용
- 데이터 미리보기 / 정보확인
- 데이터를 선택하는 기본 방법
- 조건부 필터링과 타입변환
- 데이터 정렬과 병합
- 그룹화 ,집계, 피벗테이블
- 데이터 전처리(결측치와 처리방법)
- 데이터 전처리 이상치 탐지/처리
- 데이터 정규화와 표준화
- 데이터 처리 인코딩
- TIL 작성 특강
- 회고
3-2
1. 데이터 미리보기 / 정보확인
1) 데이터프레임의 개별 데이터 확인하기
loc[ 인덱스, 컬럼명 ]
행과 열의 위치를 지정하여 접근하기
iloc[0,1] # 첫 번째 행의 두 번째 열 데이터 조회
행과 열의 위치 인덱스를 사용해 접근하기
데이터에 붙은 라벨 접근은 loc 그렇지않을땐 iloc
loc과 iloc에 인덱스나 컬럼, 행, 열은 리스트 형태/리스트의 슬라이싱 형태로도 가능하다.
2) 특정 열이나 행 전체를 선택하기
df["컬럼명"] 하나의 데이터를 선택할 때
df[ [ "컬럼명1", "컬럼명2" ] ] 여러개 데이터를 선택하기 리스트의 형태로 나타내야한다.
3-3
데이터를 선택하는 기본 방법
1) index를 사용한 데이터 선택
- 여러행이 동일한 인덱스를 가지고있어도 사용 가능
- 한지만 인덱스는 각 행을 식별하기 위해 사용 되기 때문에 인덱스가 고유하면 더 유용하다.
강의 예제에서 inplace = True의 정의와 True, False의 차이는 뭘까?
기존 프레임에 변경된 설정을 덮어 씌우겟다는 의미로 따로 코드를 추가하지 않아도 inplace = True를 추가 하면 된다.
inplace 옵션이 False이면, 명령어를 실행 한 후 메소드가 적용된 데이터 프레임을 기존 데이터 프레임으로 대체하겠다는 뜻이다. inplace 옵션이 True이면, 명령어를 실행 한 후 메소드가 적용된 데이터 프레임으로 반환 한다.
df.set_index는 뭘까?
기존의 열을 인덱스로 설정하는 메서드입니다.
RangeIndex(start=0, stop=891, step=1)
에서 step=1은 뭘까?
1단위의 간격을 가지고 있다.
set_index("컬럼", inplace = True)를 사용하게 되면 이전에 인덱스로 사용한 데이터는 열로있지않아 표현되지않는다.
그래서
기존 데이터를 보존하기 위해선 drop옵션을 주어야한다.
drop = True/False 해당 컬럼을 제외/포함 설정을 가능하게 한다.
2) 열을 지정해서 데이터 선택하기
df['컬럼']
df['컬럼', 컬럼2] #여러개의 열을 지정하기
3) 행을 지정해서 데이터 선택하기
df.iloc[0]
df.loc[요소]
df[0:1] #개별행을 지정하기 위해선 범위를 1로 지정해야한다.
df[0] #슬라이싱을 사용하지않으면 값이 나오지 않는다.
3-4
조건부 필터링과 타입변환
1. 조건부 필터링
titanic[titanic["Age"] >=25]
#25세 이상만 필터링
titanic[(titanic["Age"] >=25) & (titanic ["Age"] <= 60)]
#25세이상 & 60세이하 필터링
주의. 조건부끼리 ()로 지정해두지 않으면 에러가 뜰 수 있다.
파이썬의 기본 논리연산자인 and or not을 사용하면 안된다
#판다스의 논리연산자인 기호를(&, ,~) 사용해야한다.
titanic[(titanic["Age"] >=25) & (titanic["Age"] <= 60) & (titanic["Survived"] == True)] .loc[:,"Age"]
.loc[]을 사용해서 열만 보고 싶을땐 행 부분에 :(전체 행을 지정)해주고 확인이 가능하다.
.isin()
특정 값들이 포함된 행을 필터링할 때 유용합니다.
titanic["Sex"].isin(["male"])
2. 데이터 타입 변환
데이터의 정확한 타입을 지정함으로써 메모리 절약과 성능 향상, 특정작업을 위한 사전준비를 기대할 수 있다.
1) .dtypes 데이터 타입 확인
2) astype() 데이터 타입 변환
titanic["Age"] = titanic.astype(int)를 했을 때 값들중에 null값이 있을 경우 정수로 바꿀수가 없다.
그래서 fillna를 활용하여 null갑을 없애주고 사용하면 변환 가능해진다.
fillna 결측치를 적절한 값으로 전달해준다.(적절한 값은 사람이 직접 정해줘야한다.)
결측치란?
말 그대로 데이터에 값이 없는 것을 뜻한다.
3) 날자타입으로 데이터 변환
pd.to_datetime()
4) 카테고리타입으로 변환
.astype('category')
titanic["Embarked"] = titanic["Embarked"].astype('category')
타입을 변환할 때 문자열로 변환해야하기 때문에 'category'로 ""를 빼서는 안 된다.
4-1
데이터 정렬과 병합
정렬을 진행하면 인덱스는 별다르게 건들이지 않는다.
정렬
1) 값을 활용한 정렬
.sort_values(by = "")
sorted_df = df.sort_values(by = '나이')
by는 정렬할 데이터프레임
기존 값이 range index였는데 정렬을 수행하니 데이터프레임의 행 순서가 바뀌었다.
있는 인덱스들이 그대로 바뀌는데
range index는 연속적인 정수 시퀀스를 나타내는데
이 특징이 바뀌어 일반 index로 바뀌었다.
일반 index는 고유하거나 고유하지않는 값의 배열을 나타낸다.
항상 고유할 필요는 없다.
내림차순으로 정렬하기(기본은 오름차순이다.)
sorted_df_2 = df.sort_values(by = "이름", ascending = False)
tip. sorted_df = df.sort_values(by = ['나이', '이름'], ascending = [False, True])
정렬할 곳과 ascending을 리스트형식으로 값을 넣어 구분해서 정렬할 수 있다.
tip. ascending메서드는 sort함수에서 많이 사용 된다.
2) 인덱스를 활용한 정렬
sort_index()
데이터 병합
여러개의 데이터를 합치는 개념
1) 공통 열을 기준으로 병합
merge()
pd.merge(df1,df2, on = "이름")
on은 합쳐질 데이터 프레임
merge()는 기본값으로 inner를 사용하는데 이는 공통 된 값이 없으면 삭제해버린다.
merge_df = pd.merge(df1,df2, on = "이름", how = "left")
그래서 how = " "을 사용하는데따옴표 안에
- outer: 공통되지 않은 데이터도 포함하여 병합, 없는 값은 NaN으로 채움.
- left: 왼쪽 데이터프레임 기준으로 병합. 없는 값은 NaN으로 채움.
- right: 오른쪽 데이터프레임 기준으로 병합. 없는 값은 NaN으로 채움.
을 사용하면 삭제하지 않고 값을 낸다.
주의.
merge를 사용할 때 유일 값이 아닐떄 값을 내면 중복 값이 나올 수 있다.
merge는 여러차례 진행 할 수 있는데 옵션, 순서에 따라 결과값이 바뀔 수 있다.
2) 행(row) 또는 열(column) 단위로 데이터프레임을 연결
concat()
concat_df = pd.concat([df1, df2], axis=0)
axis에 0을 넣으면 행단위로 연결
axisdp 1을 넣으면 열단위로 연결
3) 인덱스를 기준으로 데이터프레임을 병합
join()
df1 = df1.set_index('이름')
df1.join(df3)
을 하게 되면 이름(인덱스)을 기준으로 병합된다.
4-2
그룹화 ,집계, 피벗테이블
1. 그룹화
groupby()
grouped = df.groupby('이름') #이름이란 요소로 그룹화
grouped["점수"].sum() #이름 그룹의 각 요소들의 점수의 합을 나타냄
grouped["점수"].agg(['sum','mean']) #여러 집계 함수를 사용하기
grouped_multi = df.groupby(['이름', '과목'])['점수'].sum()
# '이름'과 '과목'을 기준으로 그룹화하여 점수 합계 계산
2. 피벗테이블
데이터를 요약하고 분석해주는 도구
특정 기준으로 데이터를 그룹화하고 요약해서 표형식으로 보여준다.
1) 피벗테이블작성
행 그룹화할 행을 지정 가능
열 그룹화할 열을 지정가능
값 집계할 데이터 열을 지정가능
집계함수 어떤 데이터들로 요약할 것인지 설정가능
pivot_table(
df,
index = "이름", # 그룹화 할 행을 지정
columns = "과목", #그룹화 할 열 지정
values = "점수", #집계할 것 지정
aggfunc = "mean") # 집계 방식 지정 집계방식을['mean', 'sum']인 리스트 형식으로 쓰면 여러 방식으로 집계가능
뒤에 margins= True이 오면 사용한 모든 집계함수로 모든 수를 계산한 셀이 추가 됨
2) 그룹화 하여 특정 열에 특정 함수만 쓰기
agg_result = df.groupby('이름').agg({
"점수": ['mean', 'sum', 'max'],
'나이': 'max'
})
3) 특정 열을 기준으로 정렬
agg_result = df.groupby('이름').agg('sum').sort_values(by="점수")
4) none값 바꾸기
fill_values = 0
5-1 결측치 강의 재수강하고 결측치를 어디서 어떻게 쓰는 건지 확인 필요!!(결측치를 처리하는 이유는?)
결측치의 값을 채우는 것은 인공지능이나 데이터분석을 통해 예측할 수 있다.
데이터 전처리(결측치와 처리방법)
데이터에 값이 없는 것을 뜻한다. 줄여서 NA라고도 하고, Null 이라는 표현도 쓴다.
null과 na의 차이는? na는 수치적인 데이터none은 파이썬 코드에서 값이 없는 것을 말한다.
1) 결측치 확인 .isna(), .isnull()
결측치를 True값으로 반환 해분다
.isna().sum()을 하게 되면 결측치의 개수를 확인 할 수 있다.
2) 결측치 처리
.dropna()
결측치가있는 행을 삭제해준다.
.dropna(axis=1)/ (axis=0) axis를 사용하게 되면 열삭제/행삭제
3) 결측치 채우기
결측치 필드에 다른 텍스트로 채울 수 있다.
df_filled = df.fillna('없음')
4) 결측치 보간 (보간이란?)
행의 위치를 기준으로 선형보간한다.
.interpolate()
5) 사용자 정의 함수 적용
.apply()
def fill_missing_age(x):
if pd.isna(x):
return 18
return x
df['나이'] = df['나이'].apply(fill_missing_age)
5-2
데이터 전처리 이상치 탐지/처리
1. 이상치
이상치는 데이터의 일반적인 패턴에서 벗어난 값을 의미합니다.
해결하고자하는 문제에 일반적 지식을 판단할 수 없도록 만드는 이상한 값
평균(mean)과 표준편차(std)가 큰 차이를 보이는 경우, 또는 최대값(max)이
비정상적으로 높은 경우 이상치를 의심할 수 있습니다.
1) 데이터의 기본 통계량을 확인
.describe()
2) 이상치 시각화
!pip install matplotlib (쥬피터에서 터미널 사용시 앞에 !넣어야함)
import matplotlib.pyplot as plt # matplotlib.pyplot가져오기
plt.boxplot(df['나이'])
plt.title('나이의 박스플롯')
plt.show()
3) IQR을 사용한 측청 IQR코드 하나하나가 어떤 작용인지 해석을 모르겟음 복습하면서 정리 필요
# IQR 계산
Q1 = df['나이'].quantile(0.25)
Q3 = df['나이'].quantile(0.75)
IQR = Q3 - Q1
# IQR을 이용한 이상치 탐지
lower_bound = Q1 - 1.5 * IQR #보통 1.5는 고정치
upper_bound = Q3 + 1.5 * IQR #보통 1.5는 고정치
outliers = df[(df['나이'] < lower_bound) | (df['나이'] > upper_bound)]
print(outliers)
2. 이상치 처리 강의 재수강 필요 이해안감
tip.결측치를 어떻게 처리하냐는 데이터의 통계적 특성에 영향을 줘서 이상치 처리에도 영향을 주게 된다.
tip. 만일 데이터 양이 너무 없을때 언제 어떤 열에서 그러면 그 열을 삭제하는게 맞을 수 있다
tip. 어떤 행에서 컬럼은 총 13개인데 값이 1개있으면 12개를 채워 넣어야하는데 의미가없으니 행제거필요
5-3
데이터 정규화와 표준화
1. 정규화
Min-Max 정규화는 가장 일반적인 정규화 방법으로, 각 데이터를 최소값을 0, 최대값을 1로 변환합니다.
from sklearn.preprocessing import MinMaxScaler
data = {
'특성1': [10, 20, 30, 40, 50],
'특성2': [1, 2, 3, 4, 5]
} # 예시 데이터프레임 생성
df = pd.DataFrame(data) #data프레임 지정
scaler = MinMaxScaler()
normalized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns) # Min-Max 정규화
print(normalized_df)
2. 표준화(Standardization)
데이터를 평균이 0, 표준편차가 1이 되도록 변환하는 과정입니다. 이는 정규 분포를 가정한 많은 분석 기법에 유리합니다.
1) Z-점수 표준화
데이터에서 평균을 빼고 표준편차로 나누어, 모든 데이터가 표준 정규분포(평균 0, 표준편차 1)를 따르도록 만듭니다.
from sklearn.preprocessing import StandardScaler
# Z-점수 표준화
scaler = StandardScaler()
standardized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
print(standardized_df)
3. 비선형 변환
데이터의 비정상적인 분포를 정규 분포에 가깝게 만들기 위해 사용됩니다.
1) 로그 변환
양의 데이터에서 주로 사용되며, 데이터의 분포를 좁히는 데 유용합니다. 특히, 지수 분포를 가진 데이터를 다룰 때 효과적입니다.
df['특성1_log'] = np.log(df['특성1'])
지수분포란?
지수분포(exponential distribution)은 연속확률분포의 일정이다. 사건이 서로 독립적일 때, 일정 시간 동안 발생하는 사건의 횟수가 포아송분포를 따른다면, 다음 사건이 일어날 때까지의 대기 시간은 지수분포를 따른다. 이는 기하분포와 유사한 측면이 있다.
2) 제곱근 변환
데이터의 분포를 평탄하게 만들기 위한 또 다른 방법입니다. 특히, 포아송 분포를 가진 데이터에서 사용됩니다.
df['특성1_sqrt'] = np.sqrt(df['특성1'])
포아송분포란?
특정 시간 또는 공간에서 발생하는 사건의 개수에 관한 확률 분포입니다.
3) 박스-콕스 변환
다양한 형태의 데이터 분포를 정규분포에 가깝게 변환하기 위해 사용됩니다. 이 방법은 양수 데이터에서만 사용 가능합니다.(선형회귀 아노바 같은 모델에서 종속변수가 정규분포를 따를 때 더 좋은 성능을 보인다고 알려져있을 때 사용)
from scipy.stats import boxcox
df['특성1_boxcox'], _ = boxcox(df['특성1'])
회귀분석이란?
회귀분석의 기본 아이디어는 데이터에 가장 잘 맞는 '선'이나 '곡선'을 찾는 것입니다. 이를 통해 한 변수의 변화가 다른 변수(들)에 어떻게 영향을 미치는지의 관계를 수학적 함수로 표현합니다.
선형회귀모델
선형회귀분석은 회귀분석의 가장 기본적인 형태로, 독립 변수와 종속 변수 사이의 선형 관계를 모델링
ANOVA
분산 분석을 의미합니다.
세 개 이상의 독립 그룹의 평균 사이에 어떤 통계학적 차이가 있는지 알려줍니다.
정규분포
연속확률분포의 하나이다. 정규분포는 수집된 자료의 분포를 근사하는데에 자주 사용
5-4
데이터 처리 인코딩
범주형 데이터(Categorical Data)를 수치형 데이터로 변환하는 과정입니다.
import pandas as pd #판다스 가져오기
from sklearn.preprocessing import LabelEncoder #
data = {'과일': ['사과', '바나나', '사과', '오렌지', '바나나']}
df = pd.DataFrame(data)
label_encoder = LabelEncoder()
df['과일_인코딩'] = label_encoder.fit_transform(df['과일'])
print(df)
1) 원-핫 인코딩
각 범주를 이진 벡터로 변환합니다.
각 범주는 고유한 열을 가지며, 해당하는 열에는 1, 나머지 열에는 0이 할당됩니다.
df.one_hot = pd.get_dummies(df['과일'], prefix='과일')
get_dummies
prefix='과일' #열에다가 붙여주는 앞에있는 이름
2) 차원 축소 인코딩
범주형 데이터가 많을 때 유용합니다.
각 범주를 데이터셋 내에서의 출현 빈도로 인코딩합니다.
df['과일_빈도'] = df['과일'].map(df['과일'].value_counts())
3) 순서형 인코딩
순서가 있는 범주형 데이터를 그 순서에 따라 숫자로 변환하는 방식입니다
4) 임베딩
범주형 데이터를 저차원의 벡터로 바꿔준다.(벡터는 리스트)
특징. 유사성을 보존, 메모리 절약, 범주간의 내재된 관계 학습
활용 . 텍스트 같은걸 처리할 상황에 처했을 때
TIL 특강
효과적인 TIL 작성방법
1. 다른 사람도 읽을 수 있다고 생각하고 작성할 것. (문서형식으로 쓰는게 좋다.)
2. 문제 해결하는 과정에 대해 회고하는 내용을 필히 작성할 것
3. 본인이 관심을 갖고 연구할 수 있는 주제를 찾을 것.
4. 지원하려는 기업이 관심있어하는 주제에 진심을 담을 것.
5. 취업 준비에 더 간절해 질 것.
수학문제를 푼다긴보다 문제해석 할 정도
행렬 미적분 백터
구글 스칼라에서 논문
관련 직업군
llm, 비전ai, 채팅, 쇼핑, 기업분석, R&D, SI, SM 등(연구직으로 가려면 대학/석사는 나와야한다.)
어떤 ai를 하는게 좋은지 하고싶은지 생각해보기
개발자 구직 사이트(우대사항, 기술 등을 살펴보고 공부)
링크드인(해외연계) https://www.linkedin.com/
인텔리픽 https://intellipick.spartacodingclub.kr/company-introduce
사람인
회고
데이터를 선택하는 기본 방법
1) set_index 활용 방법이 자세하게 나오고 다른 함수들 설명이 좋은 싸이트
13-04 열을 인덱스로 설정 (set_index) - [Python 완전정복 시리즈] 2편 : Pandas DataFrame 완전정복 (wikidocs.net)
13-04 열을 인덱스로 설정 (set_index)
####DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False) ##개요 …
wikidocs.net
2) df.set_index는 뭘까?
기존의 열을 인덱스로 설정하는 메서드.
3)
RangeIndex(start=0, stop=891, step=1)
에서 step=1은 뭘까?
1단위의 간격을 가지고 있다.
4) 강의 예제에서 inplace = True의 정의
기존 프레임에 변경된 설정을 덮어 씌우겟다는 의미로 따로 코드를 추가하지 않아도 inplace = True를 추가 하면 된다.
5) True, False의 차이는 뭘까?
inplace 옵션이 False이면, 명령어를 실행 한 후 메소드가 적용된 데이터 프레임을 기존 데이터 프레임으로 대체하겠다는 뜻이다. inplace 옵션이 True이면, 명령어를 실행 한 후 메소드가 적용된 데이터 프레임으로 반환 한다.
조건부 필터링과 타입변환
1) fillna 결측치를 적절한 값으로 전달해준다.(적절한 값은 사람이 직접 정해줘야한다.)라고 말했는데 어떻게 정하는가?
df_filled = df.fillna('없음')
2) 결측치란?
말 그대로 데이터에 값이 없는 것을 뜻한다.
데이터 변형(정렬 병합 그룹화 피벗)
1) 인덱스로 정렬,병합하기와 그룹화의 차이점
인덱스로 정렬,병합하기는 말그대로 정렬하는 것이라 첫번째 행이 지정 되지 않은채로 정렬이 이루어지고
그룹화는 첫번째행(index)를 지정하여 다른 columns들로 함수를 사용하는 것이다.
2)
데이터 전처리 (결측치, 이상치, 정규화, 표준화
1) 결측치 강의 재수강하고 결측치를 어디서 어떻게 쓰는 건지 확인 필요!!(결측치를 처리하는 이유는?)
열에 결측치가 하나도 없거나 아예 비어있는 변수들은 의미있는 상관 관계를 나타내기 힘들기 때문에 자동으로 제거된다.
2) 보간이란?
보간은 주어진 데이터의 일련의 값을 근사하여, 주어진 구간에서 누락된 값들을 예측하는 기술
3) 표준화는 어떤 상황에서 사용하는지?
4) 지수분포란?(말이 이해가 안감)
지수분포(exponential distribution)은 연속확률분포의 일정이다. 사건이 서로 독립적일 때, 일정 시간 동안 발생하는 사건의 횟수가 포아송분포를 따른다면, 다음 사건이 일어날 때까지의 대기 시간은 지수분포를 따른다. 이는 기하분포와 유사한 측면이 있다.
5) 포아송분포란?
특정 시간 또는 공간에서 발생하는 사건의 개수에 관한 확률 분포입니다.
6) 회귀분석이란?
회귀분석의 기본 아이디어는 데이터에 가장 잘 맞는 '선'이나 '곡선'을 찾는 것입니다. 이를 통해 한 변수의 변화가 다른 변수(들)에 어떻게 영향을 미치는지의 관계를 수학적 함수로 표현합니다.
7) 선형회귀모델
선형회귀분석은 회귀분석의 가장 기본적인 형태로, 독립 변수와 종속 변수 사이의 선형 관계를 모델링
8) ANOVA
분산 분석을 의미합니다.
세 개 이상의 독립 그룹의 평균 사이에 어떤 통계학적 차이가 있는지 알려줍니다.
9) 정규분포
연속확률분포의 하나이다. 정규분포는 수집된 자료의 분포를 근사하는데에 자주 사용
10) 인코딩에서 사용한 요소들 의미 찾아 보기
.get_dummies()
.map()
.value_counts()
부수적인 것
.info()