지난 포스팅에서 데이터셋을 다운받아서 압축을 푸는 것까지 했다. 아래는 지난 포스팅 링크.
2024.09.02 - [프로젝트] - 머신러닝 경진대회 1 | 대회 파악 & 환경 세팅
이제 본격적으로 데이터를 열고 대략적으로 분석해보자!
데이터셋은 csv 형태이며, 아래와 같이 5개의 csv파일이 있다. csv 파일을 누르면 VS Code에서 바로 열어볼 수 있는데, train.csv 파일은 용량이 너무 커서 진짜 열꺼냐고 다시 물어본다. 무려 244MB
크다는데 억지로 열면 안좋다고 하니 다른 방법을 찾아봐야 할듯.
판다스 라이브러리를 사용해서 EDA를 진행해보자!
df.shape를 출력 - (1118822, 52) 무려 100만개가 넘는 인스턴스를 가지고 있다. (인스턴스 대신에 행, 관측치, 샘플, 레코드 등으로 불리기도 함. 그런데 머신러닝에서는 인스턴스라고 주로 부른다고.) 그리고 52개의 특성(또는 변수, 컬럼, 피쳐)을 가지고 있다. 피쳐 52개는 열거하기 많아 접은 글에 넣었다. 학습 데이터의 기간은 2007년 1월 1일부터 2023년 6월 30일까지. 주요 정보로는, 시군구, 아파트명, 전용면적, 건축년도가 있고, 전체 세대수도 나름 중요하지 않을까 생각이 든다.
Index(['시군구', '번지', '본번', '부번', '아파트명', '전용면적(㎡)', '계약년월', '계약일', '층', '건축년도', '도로명', '해제사유발생일', '등기신청일자', '거래유형', '중개사소재지', 'k-단지분류(아파트,주상복합등등)', 'k-전화번호', 'k-팩스번호', '단지소개기존clob', 'k-세대타입(분양형태)', 'k-관리방식', 'k-복도유형', 'k-난방방식', 'k-전체동수', 'k-전체세대수', 'k-건설사(시공사)', 'k-시행사', 'k-사용검사일-사용승인일', 'k-연면적', 'k-주거전용면적', 'k-관리비부과면적', 'k-전용면적별세대현황(60㎡이하)', 'k-전용면적별세대현황(60㎡~85㎡이하)', 'k-85㎡~135㎡이하', 'k-135㎡초과', 'k-홈페이지', 'k-등록일자', 'k-수정일자', '고용보험관리번호', '경비비관리형태', '세대전기계약방법', '청소비관리형태', '건축면적', '주차대수', '기타/의무/임대/임의=1/2/3/4', '단지승인일', '사용허가여부', '관리비 업로드', '좌표X', '좌표Y', '단지신청일', 'target'], dtype='object')
쓸데없는 정보도 많은 것 같아서 이런 건 없애거나 해야할 듯?!
아래와 같이 하면 원하는 컬럼들만 뽑아서 볼 수 있다.
데이터셋의 개요를 파악하기 위해서는 df.info(), df.describe()로 데이터타입과 결측치, 기본 통계 정보를 확인할 수 있다.
건축년도에 따라 아파트 가격 분포 살펴보기
뭘 해야할지 잘 모르겠는데, 1987년에 지어진 아파트값이 대충 어떤 분포를 띄고 있었는지 보면 좋을 것 같다. 그리고 최근에 지어진 아파트의 분포랑 비교해보면, 최근 아파트일수록 비쌀 것이라고 예측이 되니 그걸 확인해보자.
일단 불필요한 컬럼이 너무 많아 제외하는 함수를 만들고,
#불필요한 컬럼을 제외하는 함수를 만들자
except_cols = ['시군구', '번지', '본번', '부번', '계약년월', '계약일', '층',
'도로명', '해제사유발생일', '등기신청일자', '거래유형', '중개사소재지', 'k-단지분류(아파트,주상복합등등)',
'k-전화번호', 'k-팩스번호', '단지소개기존clob', 'k-세대타입(분양형태)', 'k-관리방식', 'k-복도유형',
'k-난방방식', 'k-전체동수', 'k-전체세대수', 'k-건설사(시공사)', 'k-시행사', 'k-사용검사일-사용승인일',
'k-연면적', 'k-주거전용면적', 'k-관리비부과면적', 'k-전용면적별세대현황(60㎡이하)',
'k-전용면적별세대현황(60㎡~85㎡이하)', 'k-85㎡~135㎡이하', 'k-135㎡초과', 'k-홈페이지',
'k-등록일자', 'k-수정일자', '고용보험관리번호', '경비비관리형태', '세대전기계약방법', '청소비관리형태',
'건축면적', '주차대수', '기타/의무/임대/임의=1/2/3/4', '단지승인일', '사용허가여부', '관리비 업로드',
'좌표X', '좌표Y', '단지신청일']
def get_display_cols(except_cols):
return [col for col in df.columns if col not in except_cols]
display_cols = get_display_cols(except_cols)
#newdf로 저장해주고, 여기서 건축년도 1987 기준으로 데이터를 뽑아준다.
newdf = df[display_cols]
data1987 = newdf[newdf["건축년도"]==1987]
#히스토그램 그리기
sns.set(style="whitegrid")
plt.figure(figsize=(10, 5))
sns.histplot(data=data1987["target"], bins=100, kde=True)
히스토그램을 보면 1987년도에 지어진 오래된 아파트의 가격 분포(?)가 이렇게 나온다.
그리고 놀랍게도 2023년에 지어진 아파트 가격 분포도 있었는데(당황;)
max_value = newdf["건축년도"].max()
#결과값으로 2023이 나옴
data2023 = newdf[newdf["건축년도"]==2023]
#79 rows × 4 columns 이 나왔는데 오피스텔(?)로 보이는 값도 포함됨
sns.set(style="whitegrid")
plt.figure(figsize=(10, 5))
sns.histplot(data=data2023["target"], bins=100)
뭔게 1987년과 2023년의 갭이 너무 커서인지 비교하기가 어려웠다. 이걸 해보니까 갑자기 10년단위로 히스토그램을 살펴보고 싶었다. 아파트가 지어진 개수가 달라서 비교하기가 어렵다.
모두 겹쳐서 그려보면 이렇게 나오는데 10억 넘어가는 쪽을 보면 건축년도가 2007년, 2017년아파트들이 대부분인 것 같다.
사실 EDA로 뭘 해야하는건지 잘 모르겠어서 아무거나 해보고있는데, 여러 변수들의 상관관계를 분석해보는 게 EDA인 것 같다.
결측치 분석
결측치도 꽤나 많아서 일단 접어놓기..
시군구 0 번지 225 본번 75 부번 75 아파트명 2126 전용면적(㎡) 0 계약년월 0 계약일 0 층 0 건축년도 0 도로명 0 해제사유발생일 1112839 등기신청일자 0 거래유형 0 중개사소재지 0 k-단지분류(아파트,주상복합등등) 870691 k-전화번호 870274 k-팩스번호 872742 단지소개기존clob 1050240 k-세대타입(분양형태) 869563 k-관리방식 869563 k-복도유형 869890 k-난방방식 869563 k-전체동수 870630 k-전체세대수 869563 k-건설사(시공사) 871058 k-시행사 871254 k-사용검사일-사용승인일 869696 k-연면적 869563 k-주거전용면적 869608 k-관리비부과면적 869563 k-전용면적별세대현황(60㎡이하) 869608 k-전용면적별세대현황(60㎡~85㎡이하) 869608 k-85㎡~135㎡이하 869608 k-135㎡초과 1118495 k-홈페이지 1005647 k-등록일자 1107832 k-수정일자 869608 고용보험관리번호 913304 경비비관리형태 870988 세대전기계약방법 878747 청소비관리형태 871178 건축면적 869714 주차대수 869714 기타/의무/임대/임의=1/2/3/4 869563 단지승인일 870286 사용허가여부 869563 관리비 업로드 869563 좌표X 869670 좌표Y 869670 단지신청일 869625 target 0 dtype: int64
변수별로 결측치 비율은 그래프가 있어서 가져왔다. 결측치를 어떻게 처리해주느냐에 따라 성능이 많이 갈린다고 하니, 어떻게 하면 좋을지 생각해보자.. (돌아라 머리야)
결측치가 없는 값들 중에서 숫자로 된 값이 그나마 전용면적과 target(가격) 피쳐였는데, 이걸로 전체 데이터를 스캐터링해보니 이런 모양새가 나왔다.
변수도 다뤄야하는데, 강의는 들었으나 아직 이해를 못했다ㅠㅠㅠㅠ
구간화 : 수치형 변수를 범주형 변수로 전환시키는 방법이 있고
범주형 변수로 변환하기 위해서 여러 인코딩 기법이 있었다.
일단 생각나는 것은
1) 면적 데이터가 너무 지저분(?)하니 구간화로 단순하게 만들어주는 것
2) 시군구 데이터나 x, y 좌표(위도 경도를 말하는 것 같다) 이걸 이용해서 주소를 범주형으로 나눠도 좋을 것 같다. 이때 범주는 레이블 인코딩이 되야할 것 같고.
3) 특정 아파트의 계약년월에 따른 타겟값을 평균이나 중앙값같은 걸로 묶어주면 편리하지 않을까...?
4) 그리고 추가로 주어지는 서울시의 버스정류장과 지하철역 정보 csv가 있는데 이걸 주소 범주형에 결합(?)시켜야 하는건가..
어떻게 해야하는 건지 감이 잘 안온다.
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
VS Code 터미널에 브랜치 이름 표시하기 (0) | 2024.09.04 |
---|---|
GIT | Git 쓰는 법 다시 정리!!! (초보용) (0) | 2024.09.04 |
머신러닝 경진대회 1 | 대회 파악 & 환경 세팅 (2) | 2024.09.02 |
패스트캠퍼스 Upstage AI Lab 부트캠프 4기, “특강: 캐글(kaggle)로 공부, 취업준비” (5) | 2024.08.27 |
머신러닝 | Supervised Learning: 회귀와 분류 (2) | 2024.08.27 |