관리 메뉴

ilovechoonsik

[STARTERS 4기 TIL] 공공 데이터 분석 (230209) 본문

STARTERS 4기 🚉/TIL 👶🏻

[STARTERS 4기 TIL] 공공 데이터 분석 (230209)

춘시기좋아 2023. 2. 9. 17:51

 

 

📖 오늘 내가 배운 것

 

공공 데이터 분석

서울시 코로나 19현황

서울시 공공자전거

서울시 물가정보

지하철 승하차 현황

 

1. 분석 프로세스

1.1 분석 목적/가설 설정

: 이번 학습에서는 현황 파악에 초점

ex) 우리 지역에서 삼겹살 제일 싼 곳이 어디야! 거기로 가자~~

 

1.2 전처리

방안 사용 도구
데이터 크기 확인 shape
결측치, 이상치 확인 및 제거 isnull, info, dropna
컬럼별 데이터 확인 unique, nunique
데이터 타입 확인 및 변경 astype, to_datetime (가능하면 카테고리형으로! = 메모리 절약)
필요 없는 컬럼 삭제 drop
새로운 컬럼 생성/분리, 테이블 생성 loc, iloc, concat, melt, apply

-> 전 과정을 필히 수행할 필요는 없다! 목적 달성을 위해 필요한 경우 적절히 사용

 

1.3 EDA/시각화

방안 사용 도구
EDA (전처리 방안 6의 도구 사용) groupby, query, loc/iloc, pivot_table
시각화 seaborn, matplotlib

EDA를 완벽하게 준비하여 전처리해놓는 게 아닌 이상 전처리-EDA-전처리-EDA의 반복

시각화는 plot, bar(h), histogram, scatter 등 기초 그래프들 간단 실습! 차후에 깊게 다루는 강의 수강 시 정리

 

2. 다시 볼만한 내용

2.1 컬럼 분리 후 concat 사용해서 테이블 생성하기

  • 좌측 테이블의 공통 컬럼, 승차 컬럼으로 승차 데이터 테이블을 만드세요~

좌측 : 요고를 / 우측 : 요롷게

공통컬럼승차에 해당하는 컬럼을 분리 후 concat

# 공통 컬럼
df1 = df.iloc[:,:3]

# 승차 컬럼만 가져오기
df2 = df.iloc[:,3::2]
df2.columns = df2.columns.str.split(' ').str[0]

# 공통컬럼과 승차컬럼 연결하기
df_in = pd.concat([df1,df2], axis=1)
df_in

 

2.2 nlargest, nsmallest (정렬 후 추출)

  • 데이터를 오름차순/내림차순 정렬 후, 위에서 n개의 행을 출력
  • 사실상 df.sort_values(columns, ascending=True/False).head(n)와 사용방식이 완전히 동일
df.nlargest(n, columns, keep='first')
df.nsmallest(n, columns, keep='first')

# n : 정렬 후 출력할 행의 수
# columns : 정렬의 기준이 될 열
# keep : {first, last, all} 동일한 값일경우 어느 행을 출력할지 정함, first면 위부터, last면 아래부터, all이면 모두 출력

 

  • 예시
    • 출근시간에 가장 많은 사람이 승차하는 역은 어디일까? (08시-09시)

좌측 : 전 / 우측 : nlargest~

df_in_202108.nlargest(10,'08시-09시')[['지하철역','08시-09시']]
# '08~09시' 컬럼 기준으로 내림차순 10개 출력
# 출력할 컬럼은 '지하철역','08시~09시'
# 중복이 있을 경우 keep으로 우선 순위 줄 수도 있음

 

2.3 apply로 승차정보 집계 데이터 만들기

  • 데이터 프레임을 조작하다보면 함수를 Row, Col에 적용시켜 새로운 Row, Col을 만들거나, 기존 값을 대체하고 싶은 경우가 있는데! 이럴 경우 apply()를 활용하면 된다

df.apply(함수, axis=0 or 1)


 

# axis=0 : Row 방향 계산(함수 적용)

# axis=1 : Col 방향 계산(함수 적용)

# lambda와 함께 사용하면👍🏻

 

  • 예시
    • 우측 테이블 처럼 좌측 테이블에 총 집계 컬럼, 행을 추가하려면?

# loc을 이용해 'sum' 이라는 인덱스를 만드는데
# apply로 해당 행에 들어갈 value들을 넣어준다
# sum, aixs=0으로 행에 포함된 각 열 합계를 계산
df_in_202108_agg.loc['sum'] = df_in_202108_agg.apply('sum', axis=0)


# 'sum' 이라는 컬럼을 생성하는데
# apply 사용해 데이터를 추가!
# sum, axis=1으로 열에 포함된 각 행의 합계를 계산
df_in_202108_agg['sum'] = df_in_202108_agg.apply('sum',axis=1)

 

2.4 카테고리형 안에 0 날리기

반납대여소번호 앞 0 제거하려면?

# 현재 category 이므로 -> str -> lstrip 사용, 좌우측 원하는 문자 제거 -> 다시 int -> category

# 반납대여소 번호 처리 (str형으로 변환)
df['반납대여소번호'] = df['반납대여소번호'].astype('str')

# 반납대여소 번호 처리 (왼쪽의 '0' 제거)
df['반납대여소번호'] = df['반납대여소번호'].str.lstrip('0')
# strip([chars]) : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거
# lstrip([chars]) : 인자로 전달된 문자를 String의 왼쪽에서 제거
# rstrip([chars]) : 인자로 전달된 문자를 String의 오른쪽에서 제거
# 인자를 전달하지 않을 수도 있으며, 인자를 전달하지 않으면 String에서 공백 제거

# 반납대여소 번호 처리 (int형으로 변환)
df['반납대여소번호'] = df['반납대여소번호'].astype('int')

# 반납대여소 번호 처리 (category형으로 변환)
df['반납대여소번호'] = df['반납대여소번호'].astype('category')

 

2.5 etc

 (1) 문자열이 포함되어있는지 확인 : .str.contains(문자열)

df['품목 이름'].str.contains('삼겹살')

 

 (2) 삼겹살을 먹을 마트를 찾는다? (컬럼들 고유한 리스트로 만들기) : drop_duplicates()

.drop_duplicates()

 

 (3) 요일 뽑아오기 : dt.strftime()

 

# dtype = date_time 여야 dt 가능, 반환값은 object로 나옴

 

지시자 의미
%a 요일 이름 축약 Sun, Mon ...
%A 요일 이름 전체 Sunday, Monday ...
%w 요일 이름 0~6
0 : 일요일 / 6 : 토요일
0 ~ 6
%d 월중 일을 0이 채워진 10진수로 01 ~ 31
%b 월 이름 축약 Jan, Feb ...
%B 월 이름 전체 January, February ...
%m 0이 채워진 월 01 ~ 12
%y 세기를 제외한 연도
2001 -> 01, 2021 -> 21
2001 -> 01, 2021 -> 21
00 ~ 99
%Y 전체 연도 0000 ~ 9999
%H 24시간제 시간 00 ~ 23
%I 12시간제 시간 00 ~ 11
%M 분 00 ~ 59 00 ~ 59
%S 초 00 ~ 59 00 ~ 59
%f microsec 000000 ~ 999999
%z HHMM 형태의 UTC 오프셋 +0000, -0400, ...
%Z 시간대 이름 UTC, GMT, ...
%j 연중 일 001 ~ 366

참고 한 자료, 참고하기 좋은 자료

[1] Pandas str, dt, 조건문

[2] strftime() — 날짜/시간을 스트링으로 변환

[3] Python - String strip(), rstrip(), lstrip() 사용 방법 및 예제

[4] Pandas의 apply 동작 이해

[5] 데이터 프레임 값에 apply로 함수 적용하는 다양한 방법

[6] 정렬 후 추출 (nlargest, nsmallest)

 


 

🎖️ 오늘 잘한 점

 

일찍 일어나 교육장에 안 늦고 잘 도착했다는 점!

...

 

 


 

💪🏻 앞으로 개선해야 할 점 (추가로 배워야 할 점)

 

📌 4일 차에 TIL 1개 작성😿

부족한 만큼 채워 넣으려 하는데 아직 효율적인 방법을 찾지 못해 시간이 오래 걸린다

- 금-토간 TIL 전부 추가💪🏻 (공모전 압박으로 대실패)

- 효율적인 학습 방안을 고민해 보고 금주 내 확립하기

 

📌 STARTERS 참여하며 다른 활동들을 병행하기에 아직 역량이 많이 부족하다

- 포기하기 아쉬운 것들이지만 최대한 교육에 집중해서 빠르게 역량 키운 후 더 고도화하여 진행

 

 

 

 

#유데미, #유데미코리아, #유데미부트캠프, #취업부트캠프, #부트캠프후기, #스타터스부트캠프, #데이터시각화 #데이터분석 #태블로

Comments