[25.03.24]본캠프 기초프로젝트- EDA마무리, 1차분석

김명서·2025년 3월 24일
1

TIL_sparta

목록 보기
45/60

팀프로젝트

아침에 코드를 보기좋게 프레임 생성+넣어가며 정리했다.

# 0. 초기 데이터프레임 준비 및 컬럼 이름 변경
dfs = [df_2018, df_2019, df_2020, df_2021, df_2022, df_2023, df_2024]

# 컬럼 이름 변경
for df in dfs:
    df.rename(columns={
        'RCPT_YR': '접수년도', 'CGG_CD': '자치구코드', 'CGG_NM': '자치구명', 'STDG_CD': '법정동코드',
        'STDG_NM': '법정동명', 'LOTNO_SE': '지번구분', 'LOTNO_SE_NM': '지번구분명', 'MNO': '본번',
        'SNO': '부번', 'BLDG_NM': '건물명', 'CTRT_DAY': '계약일', 'THING_AMT': '물건금액(만원)',
        'ARCH_AREA': '건물면적(m²)', 'LAND_AREA': '토지면적(m²)', 'FLR': '층', 'RGHT_SE': '권리구분',
        'RTRCN_DAY': '취소일', 'ARCH_YR': '건축년도', 'BLDG_USG': '건물용도', 'DCLR_SE': '신고구분',
        'OPBIZ_RESTAGNT_SGG_NM': '신고한 개업공인중개사 시군구명'
    }, inplace=True)

# 1. '취소일', '신고구분', '공인중개사', '권리구분' 컬럼 제거
dfs_1 = []
for df in dfs:
    df_new = df.drop(columns=['취소일', '신고구분', '신고한 개업공인중개사 시군구명', '권리구분'], inplace=False)
    dfs_1.append(df_new)

# 2. '지번구분'과 '지번구분명' 결측치를 '1'과 '대지'로 대체
dfs_2 = []
for df in dfs_1:
    df_new = df.copy()
    df_new['지번구분'] = df_new['지번구분'].fillna('1')
    df_new['지번구분명'] = df_new['지번구분명'].fillna('대지')
    dfs_2.append(df_new)

# 3. '본번', '부번' 결측치 중 '단독다가구'인 경우 '단독_미상'으로 대체
dfs_3 = []
for df in dfs_2:
    df_new = df.copy()
    condition = (df_new['건물용도'] == '단독다가구')
    df_new.loc[condition & df_new['본번'].isna(), '본번'] = '단독_미상'
    df_new.loc[condition & df_new['부번'].isna(), '부번'] = '단독_미상'
    dfs_3.append(df_new)

# 4. '본번'과 '부번' 결측치 행 제거
dfs_4 = []
for df in dfs_3:
    df_new = df.dropna(subset=['본번', '부번'], inplace=False)
    dfs_4.append(df_new)

# 5. '건물명'이 결측치이고 '건물용도'가 '단독다가구'인 경우 '단독다가구'로 대체
dfs_5 = []
for df in dfs_4:
    df_new = df.copy()
    condition = (df_new['건물명'].isna()) & (df_new['건물용도'] == '단독다가구')
    df_new.loc[condition, '건물명'] = '단독다가구'
    dfs_5.append(df_new)

# 6. '층' 결측치를 '단독'으로 대체
dfs_6 = []
for df in dfs_5:
    df_new = df.copy()
    df_new['층'] = df_new['층'].fillna('단독')
    dfs_6.append(df_new)

# 7. '건축년도' 결측치와 0인 행 제거, '토지면적' 결측치와 0인 행 제거
dfs_7 = []
for df in dfs_6:
    df_new = df[(df['건축년도'].notna()) | (df['건축년도'] != 0)]
    dfs_7.append(df_new)

# 결과 확인
for i, df in enumerate(dfs_7, 2018):
    print(f"df_{i} 최종 행 개수:", len(df))
    print(f"df_{i} 열 목록:", df.columns)
# '토지면적(m²)' 컬럼 제거
dfs_8 = []
for df in dfs_7:
    df_new = df.drop(columns=['토지면적(m²)'], inplace=False)
    dfs_8.append(df_new)

# 결과 확인
for i, df in enumerate(dfs_8, 2018):
    print(f"df_{i} 열 목록:", df.columns)

토지면적 컬럼은 결국 제거하고,
LB에 단독다가구 경우만 남겨뒀다.

# '건물용도'가 '단독다가구'이면서 '토지면적(m²)'이 0이거나 결측치가 아닌 행만 유지
df_year_LB = df_year_LB[(df_year_LB['건물용도'] == '단독다가구') &
                        (df_year_LB['토지면적(m²)'].notna()) &
                        (df_year_LB['토지면적(m²)'] != 0)]

도로명 주소 찾기 사이트를 통해
본번 부번을 검색해서, 건물명을 찾아서 채워줬다.

# 새로운 리스트 생성 (dfs_8 기반)
dfs_9 = []

# 각 연도별 데이터프레임에 대해 작업 수행
for df in dfs_8:
    df_new = df.copy()

    # 1. 법정동명: 화양동, 본번: 0111, 부번: 0012 → 건물명: 빌리브인테라스
    condition_1 = (df_new['법정동명'] == '화양동') & (df_new['본번'] == '0111') & (df_new['부번'] == '0012')
    df_new.loc[condition_1, '건물명'] = '빌리브인테라스'

    # 2. 법정동명: 사당동, 본번: 0182, 부번: 0003 → 건물명: Studio사당35
    condition_2 = (df_new['법정동명'] == '사당동') & (df_new['본번'] == '0182') & (df_new['부번'] == '0003')
    df_new.loc[condition_2, '건물명'] = 'Studio사당35'

    # 3. 법정동명: 신정동, 본번: 0988, 부번: 0005 → 건물명: 목동중앙하이츠펠리시티
    condition_3 = (df_new['법정동명'] == '신정동') & (df_new['본번'] == '0988') & (df_new['부번'] == '0005')
    df_new.loc[condition_3, '건물명'] = '목동중앙하이츠펠리시티'

    # 4. 법정동명: 개포동, 본번: 1194, 부번: 0001 → 건물명: 런던빌 개포
    condition_4 = (df_new['법정동명'] == '개포동') & (df_new['본번'] == '1194') & (df_new['부번'] == '0001')
    df_new.loc[condition_4, '건물명'] = '런던빌 개포'

    # 5. 법정동명: 시흥동, 본번: 0888, 부번: 0014 → 건물명: 신영메트로시티
    condition_5 = (df_new['법정동명'] == '시흥동') & (df_new['본번'] == '0888') & (df_new['부번'] == '0014')
    df_new.loc[condition_5, '건물명'] = '신영메트로시티'

    # 6. 법정동명: 명일동, 본번: 0121, 부번: 0000 → 건물명: 명일동 121
    condition_6 = (df_new['법정동명'] == '명일동') & (df_new['본번'] == '0121') & (df_new['부번'] == '0000')
    df_new.loc[condition_6, '건물명'] = '명일동 121'

    dfs_9.append(df_new)

반복문 사용해서 구할 수도 있었다.

# 연도별 행 개수 출력 및 전체 개수 계산
total_rows = 0
for i, df in enumerate(dfs_9, 2018):
    row_count = len(df)
    print(f"df_{i} 행 개수: {row_count}")
    total_rows += row_count

이렇게 나름 필터링 해봤지만!
팀원들과 맞춰본 결과, 좀 달라서 한분 코드로 통일했다 ㅠㅠ 모가 문제지ㅣㅣ..ㅠ

페르소나 설정

📌페르소나 : 은퇴 후 자산관리 목적의 중장년층

은퇴 후 자산관리 목적의 중장년층 (고객 D)

  • 거주 지역: 송파구
  • 특징:
    50대 후반~60대 초반, 자녀 독립 후 다운사이징** 고려 중
    자녀 독립 후 배우자와 단둘이 거주하며, 생활 편의성과 건강을 최우선으로 고려
  • 주거 목적: 투자보다는 안정적인 실거주 공간 확보
  • 관심사: 소형 아파트, 공원·병원 접근성, 안정적인 실거주 공간 확보
  • 분석 포인트: 강남3구 소형 아파트 가격 변화, 노년층 선호 지역, 은퇴 후 주거 트렌드
💡

다운사이징(Downsizing)이란?

다운사이징은 주거 공간이나 자산 규모를 축소하여 관리의 효율성을 높이고 생활비를 절감하는 것을 의미. 은퇴 후에는 자녀의 독립 등으로 큰 주거 공간이 필요하지 않게 되어, 소형 아파트나 주택으로 이사함으로써 주거비와 유지비를 절감하고 남은 자산을 활용하여 생활의 질을 향상시키는 전략.

목적:

  1. 넓은 집보다 관리하기 편한 주거 환경 조성
  2. 유지비 절감 (공과금, 관리비 등)
  3. 의료·여가 시설과 가까운 곳으로 이동하여 생활의 질 향상

고객 D의 추가 특징 - 주요 고려 요소

주거 환경 – 조용하고 편리한 지역 선호

병원 접근성 – 정기 검진과 응급 상황 대응 가능해야 함

교통 편의성 – 친척 및 지인 방문이 쉬운 곳

여가 및 문화생활 – 중장년층 커뮤니티 및 활동 공간 확보

송파구 고려사항

잠실동/문정동/가락동

  • 쾌적한 주거 환경
    • 올림픽공원, 석촌호수 등 대형 공원이 있어 자연 친화적
    • 아파트 단지 내 녹지 비율이 높은 곳이 많아 조용한 생활 가능
  • 우수한 의료 인프라
    • 서울아산병원, 잠실서울병원, 삼성서울병원 등 대형 병원이 가까워 의료 접근성이 뛰어남
    • 다양한 건강검진센터 및 전문 클리닉이 위치
  • 편리한 교통
    • 지하철 2·8·9호선이 지나가며, 버스 노선도 다양해 대중교통 이용이 용이
    • 강남권과 가까워 자녀 또는 친인척과의 교류가 수월

현재 고객 D의 자산 조건 및 재정 상황

이건 데이터를 보면서 좀 더 디테일하게 재설정해봐야겠다.

🔻

발표 인사이트

송파구 주요 주변 인프라를 아래에 표시해서 ppt발표 자료에 사용해봐야겠다 !!

데이터 분석 좁혀나가기

import pandas as pd
import matplotlib.pyplot as plt

라이브러리 불러오고

선그래프 몇개 돌려보면서 저녁 스터디 했다.

#낮은 층(예: 5층 이하) 선호 가능성 고려
affordable_apts_low_floor = affordable_apts[affordable_apts['층'].astype(str).str.contains('^[1-5]$', na=False)]
print("\n5층 이하 추천 아파트:")
print(affordable_apts_low_floor[['건물명', '법정동명', '물건금액(만원)', '건물면적(m²)', '건축년도', '층']].head(5))
#신축 아파트 선호 가능성 고려 (예: 2010년 이후 건축)
affordable_apts_new = affordable_apts[affordable_apts['건축년도'] >= 2010]
print("\n2010년 이후 건축된 추천 아파트:")
print(affordable_apts_new[['건물명', '법정동명', '물건금액(만원)', '건물면적(m²)', '건축년도', '층']].head(5))

추가 자료들을 조사하며 ...


느낀점&회고

내가 팀장이긴 하지만, 도메인지식이 충분하지는 못해.. 다른 팀원분이 열심히 리드해주시고 계시다. 감사하기도 하고 나두 더 열심히 해야겠다는 생각이 무지 드는 하루였다 ㅠ ㅋㅋㅋ

내일은 시각화를 토대로, 페르소나 빌드업을 고도화해봐야겠다 !!!
스크럼 + 프로젝트 노션 열심히 채워가며 화요일도 잘 보내봐야겠다!

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

0개의 댓글

관련 채용 정보