JHJ

[내일배움캠프 QAQC 부트캠프]VS Code와 데이터2(15일차, 260601) 본문

[내일배움캠프 QAQC 부트캠프]/TIL

[내일배움캠프 QAQC 부트캠프]VS Code와 데이터2(15일차, 260601)

Jo, Hongjin 2026. 6. 1. 16:57

1. 오늘 학습 키워드:

(VS Code) 데이터 전처리(생성부터 정렬까지)

AI로 생성한 야무치 자세. (원본은 드래곤볼Z)


2. 오늘 학습 한 내용을 나만의 언어로 정리하기:

AI로 생성된 이미지

데이터 레벨업! 전처리 & 시각화 세션

3회차
titanic.describe(percentiles=[.1, .25, .5, .75, .9, .95])
백분위 분석으로 볼 수도 있음(왜도나 이상치 확인에 유용)
titanic.describe() 은 결국 기술적 통계(숫자)을 요약해줌
--> str 계열 등의 범주형 데이터는 요약 곤란
titanic.describe(include='all')
범주형 변수까지 전부 호출(대신 NaN)
titanic.describe(include='object')
범주형 변수만 출력(유니크 값에 주목할 필요)
titanic['Sex'].value_counts(normalize=True)
노말라이즈를 True로 할 시, 상대값 구할 수 있음
평균과 중앙값
중앙값 기준으로 평균의 위치에 따라 이상치 여부 파악 가능
왜도: 데이터의 치우침 정도(+: 높은값 이상치)
첨도: 데이터가 평균 몰림 정도(+: 중간 과몰림)

막대 그래프: 범주 데이터의 막대 비교
히스토그램: 연속 데이터의 막대 분포

상관관계(corr): 양의 상관(1), 음의 상관(-1), 상관無(0), 주로 히트맵, 0.3~0.7 정도면 상관관계가 있다고 봄.
상관관계가 인과관계를 의미하진 않음

결측치: NaN, N/A, Null, "", 0, 9999 등등 값이 없거나 누락된 상태
데이터 수집 과정의 문제(설문 미응답), 입력 실수(누락), 시스템적 결측(특정 조건, 버그 등), 의도적 결측 등 
결측치 탐색: df.isnull().sum()
결측치 삭제: df.dropna()
다만 결측치가 너무 많으면 남은 데이터의 신뢰 down --> 때에 따라 대체할 필요
df.dropna(axis=1): 컬럼 기준으로 삭제(기본은 행(인덱스) 삭제)
subset으로 특정 컬럼의 결측치만 있는 행 삭제 가능
결측치 대체: df[].fillna(대체값)

시간 순서가 있는 데이터는, 앞뒤 값을 활용한 대체가 효과적
.ffill : 앞 값으로 채우기
.bfill: 뒤 값으로 채우기
선형보강법: 앞 뒤의 값으로 선형 함수화, 중간값 예측
데이터 타입
df.dtypes() 타입 확인
df.astype(int) int 타입으로 변경 
pd.to_numeric 문자열을 숫자로 변환하되, 변환할 수 없는 값은 NaN
문자형 날짜간 차를 구해야 할 때 --> pd.to_datetime()
.dt.days, .dt.month, .dt.day_name() 등을 활용해 추출 가능
 
AI로 생성된 이미지

데이터 전처리&시각화

3강 


2차원 데이터 생성
data = {
    'A':[1,2,3], 'B': [4,5,6], 'C': [7,8,9] 
}
df = pd.DataFrame(data)
A열 호출
df['A']
열 인덱스 확인
df. columns
열 인덱스 변경1
df.columns = {'a', 'b', 'c'}
열 인덱스 변경2
df = df.rename(columns= {'a':'에이'})
열 추가(리스트 형태나 계산식 등으로도 추가 가능)
df['d'] = '9'
df['D'] = (df['A'] + df['B']) * df['C'] * 2
열 삭제
del df['d']
데이터 불러오기(seaborn)
data = pd.read_csv("tips_data.csv")

data.head() 위에서부터 n행 데이터
data.info() 데이터 요약(null 값 확인가능)
data.describe() 기초통게량 확인
df.isnull().sum() 결측치 확인
df.dropna() 결측치 제거
df.duplicated(subset=['컬럼1', '컬럼2', '컬럼3']) 중복 데이터 확인
df.drop_duplicates(subset=['컬럼1', '컬럼2', '컬럼3']) 중복 데이터 제거
IQR(Interquartile Range) 계산
Q1 = df['컬럼1'].quantile(0.25) 
Q3 = df['컬럼1'].quantile(0.75)
IQR = Q3 - Q1
이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
이상치 제거
df[(df['컬럼1'] >= lower_bound) & (df['컬럼1'] <= upper_bound)]

데이터 타입 확인
df['컬럼명'].dtype
데이터 타입 변경
df['column_name'].astype(int)
+그 외 타입 float, str, bool, 'category', 'datetime64[ns]', complex, object
데이터 타입 변경 틀
DataFrame['column_name'] = DataFrame['column_name'].astype(new_dtype)

 


iloc은 정수 기반의 인덱스(숫자기반)
loc은 레이블 기반의 인덱스(이름기반)

df.iloc[0:4:2] df 데이터에서 인덱스번호 0부터 4-1까지 2간격으로 출력
df.loc[0:4:2] df 데이터에서 라벨명 0부터 4까지 2간격으로 출력
행/열 인덱스가 존재하는 데이터는 df.iloc [a:b, c:d] 등으로도 가능

데이터 호출시 df[['A','C']] 등으로 컬럼명을 리스트로 묶어야 함
*늘 명심할 것. 슬라이싱 [a,b]에선 기본적으로 b는 포함되지 않음.(단, loc는 예외)
불리언 인덱싱
df[df['A'] == 'B']  A열 데이터가 B인 경우만 호출
&, | 으로 and, or 조건 추가 가능
df.loc[df['A'] >= B, 'C'] 'A' 열에서 B 이상인 경우의 'C' 열만 선택
df['A'].isin(['B']) A열 안에 'B'가 있는지 T/F로 반환
df.isin({'A': [1, 3], 'B': ['apple', 'orange']}) 여러 열에 적용 가능
데이터 병합
concat
pd.concat([df1,df2,df3],axis = 0).reset_index(drop=True)
axis = 0 세로로 병합
axis = 1 가로로 병합
병합할 때, 값이 없으면 NaN 값 발생
merge
pd.merge(df1, df2, on='key',how = 'inner' )
key 값을 기준으로 join
inner/outer/left/right 4가지
데이터 집계
df.groupby('카테고리')   카테고리 기준으로 그룹화 명령
.sum(), .count(), .max(), .min() 등을 groupby 뒤에 붙혀서 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).agg({'Value1': ['mean', 'sum'], 'Value2': 'sum'}) 두가지 카테고리로, 값마다 집계를 다르게.
피벗테이블
pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc={'Value1': 'mean', 'Value2': 'sum'}) 기본틀

pivot.plot(kind='line') 피벗테이블로 시각화시.
plt.show()
데이터 정렬
sorted_by_score = df.sort_values('A',ascending=Ture/False) 컬럼 기준 
sorted_by_index = df.sort_index(ascending=True/False) 인덱스 기준

 


3. 학습하며 겪었던 문제점& 에러 + 회고

3-1 문제점& 에러: X

3-2 회고: 2차원 데이터 쪽은 직접 몇번 해보면 감을 잡을 듯 하다.


4. 내일 학습할 것은 무엇인지(기본적인 AI 진단퀴즈, 코드카타, TIL 제외)

- 화요일(2일): 강의(전처리/시각화 4강), 개인 과제 수행