Day08_Python_1‐4 핵심 - bonniekwon0721/Dataanalytics-study GitHub Wiki

17/FEB/2024


01 Getting & Knowing Data

1. 데이터 로드:

  • Q1: pd.read_csv() 함수를 사용하여 CSV 파일을 DataFrame으로 로드합니다.
  • 코드 예: df = pd.read_csv("경로/파일명.csv")

2. 데이터 확인:

  • Q2: .head() 메서드로 데이터의 상위 5개 행을 확인합니다.
  • 코드 예: df.head()
  • Q10: .tail() 메서드로 데이터의 하위 3개 행을 확인합니다.
  • 코드 예: df.tail(3)

3. 데이터 로딩 및 확인

  • 데이터 로드(Q11): **pd.read_csv()**를 사용하여 데이터를 로드하고, encoding='euc_kr' 옵션을 통해 한글 인코딩 문제를 해결합니다. 이 과정은 한글 데이터를 포함하는 파일을 올바르게 읽어들이기 위해 필요합니다.

4. 데이터 탐색 및 확인

  • 데이터 탐색(Q12-Q14): 데이터의 기본적인 구조를 파악하기 위해 .head(), .tail(), .info(), .describe() 등의 함수를 사용합니다. 이러한 함수들은 데이터의 상위 및 하위 행을 미리 보고, 각 컬럼의 데이터 타입과 결측치 정보, 수치형 변수의 기초 통계량을 제공하여 데이터에 대한 이해를 돕습니다.
  • 컬럼 및 데이터 타입 확인(Q13, Q14): .columns, **.dtypes**를 사용하여 데이터프레임의 컬럼 이름과 각 컬럼의 데이터 타입을 확인합니다. 이는 데이터 처리 및 분석 과정에서 적절한 함수와 방법을 선택하는 데 도움을 줍니다.

5. 데이터 구조 파악:

  • Q3: .shape 속성으로 데이터의 행과 열의 개수를 확인합니다.
  • 코드 예: print(df.shape)
  • Q4: .columns 속성으로 모든 열의 이름을 확인합니다.
  • 코드 예: df.columns

6. 특정 데이터 접근:

  • Q5: 인덱스를 사용해 특정 열의 이름을 얻습니다.
  • 코드 예: df.columns[5]
  • Q6: .dtype 속성으로 특정 열의 데이터 타입을 확인합니다.
  • 코드 예: df.iloc[:,5].dtype
  • Q7: .index 속성으로 데이터프레임의 인덱스 구조를 확인합니다.
  • 코드 예: df.index
  • Q8: **.iloc**을 사용해 특정 위치의 데이터 값을 얻습니다.
  • 코드 예: df.iloc[2,5]

7. 데이터 선택 및 필터링

  • 특정 컬럼 값 선택(Q15-Q19): 데이터프레임에서 특정 컬럼을 선택하고, 그 컬럼의 특정 값이나 조건을 만족하는 데이터를 필터링합니다. 예를 들어, .loc[], **.iloc[]**을 사용하여 특정 행이나 열을 선택하고, 조건부 필터링을 통해 데이터를 추출합니다.

8. 한글 데이터 처리:

  • Q9: 한글이 포함된 파일을 올바른 인코딩(euc-kr)으로 로드합니다.
  • 코드 예: df = pd.read_csv("파일_경로", encoding="euc-kr")

9. 데이터 조작 및 변환

  • 조건부 새 컬럼 생성(Q17): lambda 함수나 조건식을 사용하여 특정 조건을 만족하는 새로운 컬럼을 생성합니다. 이는 데이터 분석 시 특정 기준에 따른 새로운 정보를 도출하기 위해 필요합니다.
  • 데이터 변환 및 결측치 처리(Q18, Q19): 데이터의 변환(예: 문자열에서 숫자로의 변환)이나 결측치 처리(예: 특정 값으로의 대체)를 수행합니다. 이 과정은 분석을 위해 데이터를 정제하고 준비하는 데 중요한 단계입니다.

02 Filtering & Sorting

1. 데이터 필터링:

  • Q20: 데이터 로드. pd.read_csv() 함수로 특정한 데이터 세트를 로드합니다.
    • 코드 예: df = pd.read_csv(download_URL, encoding = 'euc_kr')
  • Q21 & Q22: 조건에 따른 데이터 필터링. **.loc**와 조건을 사용해 특정 조건을 만족하는 데이터를 필터링하고, **.reset_index()**로 인덱스를 재설정합니다.
    • 코드 예: df.loc[df['quantity']==3].head().reset_index(drop=True)
  • Q23: 특정 컬럼 선택. **['column1', 'column2'](/bonniekwon0721/Dataanalytics-study/wiki/'column1',-'column2')**를 사용하여 특정 컬럼만을 포함하는 새로운 데이터프레임을 정의합니다.
    • 코드 예: df['quantity', 'item_price'](/bonniekwon0721/Dataanalytics-study/wiki/'quantity',-'item_price')
  • Q24 & Q25: 문자열 처리 및 조건부 필터링. 문자열 메서드와 조건을 활용해 데이터를 필터링하고 새로운 컬럼에 저장합니다.
    • 코드 예: df['new_price'] = df['item_price'].str[1:].astype('float')

2. 데이터 정렬:

  • Q28: 데이터 정렬 및 인덱스 재설정. .sort_values() 메서드로 데이터를 특정 컬럼 기준으로 정렬하고, **.reset_index()**로 인덱스를 초기화합니다.
    • 코드 예: df.sort_values('new_price').reset_index(drop=True)

3. 특정 조건에 따른 데이터 변환:

  • Q36: 조건에 따른 값 변경. **.loc**를 사용하여 특정 조건을 만족하는 데이터의 컬럼 값을 변경합니다.
    • 코드 예: df.loc[df.item_name == 'Izze', 'item_name'] = 'Fizzy Lizzy'
  • Q38: 결측치 대체. **.loc**와 **.isnull()**을 활용해 결측치를 가진 데이터를 특정 값으로 대체합니다.
    • 코드 예: df.loc[df.choice_description.isnull(), 'choice_description'] = 'NoData'

03 Grouping

1. 데이터 그룹화 및 집계:

  • Q44: 데이터 로드 및 상위 5개 컬럼 출력. 데이터를 로드하고, .head() 메소드를 사용하여 상위 5개 행을 출력합니다.
  • Q45 & Q46: host_name 별로 데이터를 그룹화하고, .value_counts(), .groupby().size(), .sort_index(), .sort_values() 등을 사용하여 그룹별 빈도수를 계산하고 정렬합니다. 이는 데이터셋 내에서 각 호스트가 가진 숙소의 수를 파악하는 데 사용됩니다.
  • Q49: **groupby**를 사용하여 **neighbourhood_group**에 따른 **price**의 평균, 분산, 최대값, 최솟값을 계산합니다. 이는 각 지역 그룹별 숙박 비용의 분포를 이해하는 데 도움을 줍니다.
    • 코드 예: df.groupby('neighbourhood_group')['price'].agg(['mean', 'var', 'max', 'min'])
  • Q55: **neighbourhood_group**에 따른 **room_type**의 분포를 계산하고, 각 그룹 내에서 **room_type**의 비율을 계산합니다. 이는 지역 그룹별로 제공되는 숙소 유형의 분포를 파악하는 데 사용됩니다.
    • 코드 예: df['neighbourhood_group', 'room_type'](/bonniekwon0721/Dataanalytics-study/wiki/'neighbourhood_group',-'room_type').groupby(['neighbourhood_group', 'room_type']).size().unstack()

2. 조건부 로직 적용:

  • Q56 & Q57: Income_Category 값을 새로운 카테고리 값으로 매핑합니다. map 함수나 apply 메소드를 사용하여 각 소득 구간을 새로운 레이블로 변환합니다. 이는 데이터 내의 범주형 변수를 다루고, 새로운 의미를 부여하는 데 유용합니다.
  • Q59: Customer_Age 값을 사용하여 나이 구간을 정의하고, map 함수를 사용하여 각 연령대를 계산합니다. 그 후, **.value_counts()**를 사용하여 각 연령대별 빈도수를 출력합니다. 이는 연령대별 고객 분포를 파악하는 데 도움을 줍니다.

04 Apply, Map

1. apply 메소드 사용:

  • Q58: **Income_Category**의 카테고리를 변경하여 newIncome 컬럼에 매핑합니다. apply 함수를 사용하여 주어진 함수를 데이터프레임의 열에 적용합니다.
    • 예: df['newIncome'] = df['Income_Category'].apply(changeCategory)
  • Q62: 결혼 상태(Marital_Status)와 카드 카테고리(Card_Category)를 기준으로 새로운 상태(newState)를 정의합니다. apply 메소드를 사용하여 여러 조건을 만족하는 경우 1, 그렇지 않으면 0을 반환하는 함수를 행 단위로 적용합니다.
    • 예: df['newState'] = df.apply(check, axis=1)

2. map 메소드 사용:

  • Q57: **Income_Category**의 값을 새로운 값으로 매핑하여 newIncome 컬럼에 저장합니다. map 함수를 사용하여 사전에 정의된 매핑을 적용합니다.
    • 예: df['newIncome'] = df['Income_Category'].map(lambda x: dic[x])
  • Q59: **Customer_Age**를 사용하여 나이 구간을 AgeState 컬럼으로 정의합니다. map 메소드를 사용하여 나이를 10년 단위로 구분하여 새로운 컬럼에 저장합니다.
    • 예: df['AgeState'] = df['Customer_Age'].map(lambda x: x//10 * 10)

3. 조건부 로직 적용:

  • Q60 & Q61: 특정 조건을 만족하는 경우 1, 그렇지 않으면 0을 반환하는 새로운 컬럼(newEduLevel, newLimit)을 생성합니다. map 또는 lambda 함수를 사용하여 간단한 조건부 로직을 적용합니다.
    • 예: df['newEduLevel'] = df['Education_Level'].map(lambda x: 1 if 'Graduate' in x else 0)

05 Time_Series

1. 데이터 로딩 및 타입 변환

  • 데이터 로딩 및 초기 탐색(Q64): **pd.read_csv()**와 **df.info()**를 사용하여 데이터를 로드하고 각 열의 데이터 타입을 확인합니다.
  • Datetime 타입 변환(Q65): **pd.to_datetime()**을 사용하여 "Yr_Mo_Dy" 열을 datetime64 타입으로 변환합니다. 이는 시계열 데이터를 효과적으로 다루기 위한 필수 변환 작업입니다.

2. 데이터 전처리

  • 잘못된 년도 데이터 수정(Q67): 사용자 정의 함수 **fix_century**를 통해 2061년 이상의 잘못된 년도 데이터를 수정합니다.
  • 결측치 처리(Q72): **.fillna(method='ffill').fillna(method='bfill')**을 사용하여 모든 결측치를 컬럼 기준 직전의 값으로 대체한 후, 필요한 경우 뒤의 값으로 대체합니다.

3. 데이터 파악 및 분석

  • 년도별 평균값 계산(Q68): **.groupby().mean()**을 사용하여 년도별 각 컬럼의 평균값을 계산합니다.
  • 월별 평균값 계산(Q71): 각 달의 평균값을 계산하여 시계열 데이터의 월별 경향성을 파악합니다.
  • 년도-월 기준 평균 및 최대값 계산(Q73, Q74): 년도-월을 기준으로 모든 컬럼의 평균값과 최대값을 계산합니다.

4. 요일 및 시간 분석

  • 요일 정보 추출 및 분석(Q69, Q70, Q78): **.dt.weekday**와 **.dt.day_name()**을 사용하여 요일 정보를 추출하고, 주말과 평일을 구분하는 "WeekCheck" 컬럼을 생성합니다. 이를 통해 요일별 데이터 분석을 수행합니다.
  • 시간대별 데이터 분석(Q80): **.groupby(df['(년-월-일:시)'].dt.hour).mean()**을 사용하여 오전 10시와 오후 10시(22시)의 PM10의 평균값을 계산합니다.

5. 이동평균 및 시계열 데이터 인덱싱

  • 이동평균 계산(Q75): **.rolling(7).mean()**을 사용하여 "RPT"와 "VAL" 컬럼의 7일 이동평균을 계산합니다. 이는 데이터의 단기적 변동성을 줄이고, 장기적인 경향을 파악하기 위한 기법입니다.
  • 시계열 데이터 인덱싱(Q81): **.set_index('(년-월-일:시)', inplace=True)**을 사용하여 날짜 컬럼을 DataFrame의 인덱스로 설정합니다. 이는 시계열 데이터를 더 효과적으로 다루기 위한 기본적인 작업입니다.

Studied from 제로베이스 데이터 분석 스쿨