[25.03.20]본캠프 22일차 시각화 완강+기초프로젝트발제+Pandas개인과제 해설+데이터전처리(결측치 처리)

김명서·2025년 3월 20일
2

TIL_sparta

목록 보기
43/60
post-thumbnail

시각화 완강

내일, 시각화 라이브세션이 있는 날이라, sql 코드카타 대신 남은 2강을 들었다.
이전에 배웠던 그래프들, boxplot 등을 어떻게 jupyter Notebook에서 작업할 수 있는지에 대해 실습했다.
오늘도 모닝 코딩..마냥 열심히 타이핑을 하며 하루를 시작했다.
ㅋㅋㅋ덕분에 잠시나마 타자가 빨라진 느낌이었다

import matplotlib.pyplot as plt
import seaborn as sns
data= sns.load_dataset('flights')

data_grouped = data[['year','passengers']].groupby('year').sum().reset_index()
data_grouped

plt.plot(data_grouped['year'], data_grouped['passengers'])
plt.xlabel('year')
plt.ylabel('passengers')
plt.show
#Bar 
import pandas as pd
df=pd.DataFrame({
    '도시': ['서울', '부산', '대구', '인천'],
    '인구':[990,250,250,290]
})
df

plt.bar(df['도시'], df['인구'])
plt.xlabel('도시')
plt.ylabel('인구')
plt.title('막대 그래프 예시')
plt.show()

# Histogram
import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성 (랜덤 데이터)
data = np.random.randn(1000)

# 히스토그램 그리기
#bins 파라미터는 히스토그램의 가로축 구간의 개수를 지정 
plt.hist(data, bins=30)
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram')
plt.show()
#pie
import matplotlib.pyplot as plt

# 데이터 생성
sizes = [30, 20, 25, 15, 10]
labels = ['A', 'B', 'C', 'D', 'E']

# 원 그래프 그리기
#autopct 각 범위의 백분율
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title('Pie Chart')
plt.show()
import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
np.random.seed(10)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# 박스 플롯 그리기
plt.boxplot(data)
plt.xlabel('Data')
plt.ylabel('Value')
plt.title('Box Plot')
plt.show()
iris=sns.load_dataset("iris")
species=iris['species'].unique()

sepal_lengths_list = [iris[iris['species']==s]['sepal_length'].tolist() for s in species]

len (sepal_lengths_list[2])

plt.boxplot(sepal_lengths_list, labels = species)
plt.xlabel('sepal_lengths')
plt.ylabel('species')
plt.title('Box Plot')
plt.show()



#또다른 방법
sns.boxplot(x='species', y='sepal_length', data=iris)
plt.show()
# Scatter
plt.scatter(iris['petal_length'], iris['petal_width'])
plt.xlabel('petal_length')
plt.ylabel('petal width')
plt.show()

plt.scatter(iris['sepal_length'], iris['sepal_width'])
plt.xlabel('sepal_length')
plt.ylabel('sepal_width')
plt.show()

iris.corr(numeric_only=True)

plt.scatter(iris['sepal_length'], iris['petal_length'])
plt.xlabel('sepal_length')
plt.ylabel('spetal_length')
plt.show()

기초프로젝트 발제

우리는 최종적으로 이 데이터를 선택했다.

서울 열린 데이터 광장

주제 선정 이유

<공공데이터>라는 점에서, 분석 및 결과 도출 과정에서 객관성과 신뢰성을 확보할 수 있을 것이라 생각하였습니다.

프로젝트 명 : 사도될家?

(지금 사도 될까? 데이터로 매수 적기 완벽 분석!)

프로젝트 목적과 목표

서울 부동산 시장의 변동성을 고려하여 거주 목적(A) 및 투자 목적(B) 매수 고객이 데이터를 기반으로 최적의 결정을 내릴 수 있도록하는 것이 목적입니다.
실거래가·건축 연도·건물 용도·층수 등 다양한 핵심 지표를 분석하여 신뢰도 높은 의사결정을 지원하는 것을 목표로 할 것입니다.

프로젝트 핵심 내용

  1. 각 고객의 목적 달성을 위한 추가적인 예시탐색 및 현황조사.

  2. 데이터 전처리(결측치,이상치,데이터 정규화 등)
    +(1)번 조사내용을 토대로 논리적인 가설 설정 및 수정.

  3. SQL과 Python 을 사용한 분석 실시.
    <👧고객A> 핵심 분석 항목
    최근 5년간 평균 거래 금액 변동성 분석 , 학군 수준(특목고 및 명문고 비율), 학원가 밀집도 분석 etc
    결과:

  • 안정적인 거주 지역 순위 선정
  • 직주근접성과 학군 프리미엄을 고려한 맞춤형 제안

<🧑고객B> 핵심 분석 항목
최근 5년간 가격 상승률, 최근 5년간 실거래가 상승률 및 거래량 증가율 분석, 신규지역발굴 etc
결과:

  • 고성장 가능성이 높은 지역 및 매물 추천
  • 미래 인프라 및 개발 계획 반영한 장기 투자 전략 제공
  1. 고객 편리 및 효과적인 정보전달을 위한 맞춤형 시각화 데이터 생성
    (ex.지도 기반 시각화, 시계열 분석)

5.(선택) 주요 변수 추가, 고객 행동 예상 시나리오 등


Pandas개인과제 해설

제대로 기억하기 !! 데이터 필터링

슬라이싱 기능 [] 기호 사용

아니 나는...칼럼을 ... 데이터프레임명['abc'] 이렇게 적어주는 건 줄 알았는데,
원리 맥락이 살짝 달랐다. []로 슬라이싱을 해주는 거였다 !!

mask 사용

mask 사용할 때 ( ) 잊지말기 !
.
.

🏃‍♂️도전문제

  • 도전1.
    나는 rrule 함수의 byweekday property사용했다.
    dt.day_name()가 무엇인지 잘 몰랐기 때문이다..!
    그치만 오늘 해설을 들어보니, dt.day_name()이 더 간단하게 풀 수 있는 방법인 것 같았다.
#예약 날짜 컬럼을 datetime 형식으로 변환하는 것은 공통적인 부분이었고,
df['Date_of_Journey'] = pd.to_datetime(df['Date_of_Journey'],infer_datetime_format=True)

# 차이점은 요일 컬럼을 추가해서
df['Day_of_Week'] = df['Date_of_Journey'].dt.day_name()

# 수요일에 예약된 항공권의 평균 가격을 계산하는 방법이었다. 
wednesday_avg_price = df[df['Day_of_Week'] == 'Wednesday']['Price'].mean()
wednesday_avg_price

예약 날짜 컬럼을 datetime 형식으로 변환하는 것은 공통적인 부분이었고,
차이점은 요일 컬럼을 추가해서
수요일에 예약된 항공권의 평균 가격을 계산하는 방법이었다.


데이터전처리(결측치 처리) - 회고형식으로 작성

우선, 실제 데이터를 열어보니 결측치가 생각보다 여러컬럼에 다양한 정도(?)로 있었다.
모든 컬럼이 NaN인 경우, 열 제거를 해줬고 남은 컬럼들을 어떻게 할 것인지에 머리를 맞대었다.

단순히 범주형 데이터니까 최빈값으로, 수치형 데이터는 중앙값 또는 평균값으로 대체하자 스탠스가 아니라 각자 가지고 있는 배경지식을 토대로 의견을 나눈 과정이, 굉장히 의미있었다고 생각한다. 이 과정에서 더 다양한 코드를 작성해보며 특정 패턴을 찾았고, 이에 따라 분류해도 괜찮을지 튜터님께 질문해보려한다!

이렇게 나름 뇌피셜도 공유해봤다. (그냥 just 뇌피셜이다 ㅋㅋㅋ)

배운 점: 조건 필터링과 len() vs count() 차이.

회고: len()은 행 수, count()는 결측치 제외 값 개수를 구한다는 점을 다시한 번 이해했다. 질문 의도에 맞는 함수 선택이 중요하겠다.

배운 점: 데이터 합치기와 피벗 테이블로 다차원 분석

'단독다가구'가 2018년에 사라진 건 '미상을 제외한 탓이었다..! 다시 추가하여
aggfunc='size' 를 사용한 피벗테이블 코드를 작성했다.

반복문을 이용한 다년도 결측치 처리

dfs = [df_2018, df_2019, df_2020, df_2021, df_2022, df_2023, df_2024]
for df in dfs:
    df['지번구분'].fillna('미상', inplace=True)

.
.

총평

Pandas로 데이터 크기 확인부터 결측치 처리, 다년도 피벗 테이블까지 EDA의 전반을 경험했다. 특히 코드와 함께 논리적 근거를 고민하며 진행한 점이 기억에 남는다. 앞으로 데이터 분포 확인과 처리 전후 비교를 습관화해 객관성을 높이고 싶다. 실습과 개념이 연결되는 과정이 흥미로웠다! 내일은 결측치 처리 마무리하고 이상치+정규화 작업을 들어가야겠다.



느낀점&회고

오늘.. TIL쓸 게 없으면 어쩌지.. 했는데 생각보다 잘 정리된 것 같다. 부동산이라는 도메인 비즈니스가 충분하지는 않지만, 이번 프로젝트에도 최선을 다해봐야겠다. 금요일에 QCC가 없어서 보다 부담을 덜고 프로젝트를 할 수 있을 것 같다. 아직 코드를 열심히 구글링하고, 세션 자료를 찾아가면서 작성하는 단계이지만ㅜㅜ 점점 익숙해져서 멋지게 핸들링 할 수 있었음 좋겠다 !!
내일 EDA도 잘 마무리 해보자✨🚀

profile
경영학도의 데이터분석 성장기💥

2개의 댓글

comment-user-thumbnail
2025년 3월 21일

손필기 좋아요 ✍🏻👍🏻

1개의 답글

관련 채용 정보