Day38_Python분석_32 Python시각화 - bonniekwon0721/Dataanalytics-study GitHub Wiki
14/APR/2024
31. 이론 - folium으로 집 값 평균 및 거래량 지도 시각화하기
folium 라이브러리
특정 위치에 동그라미를 그려줌 location : 그릴 원심의 위치
radius : 원의 크기 popup : 마우스를 올려놨을 때(호버) 나오는 팝업의 메시지
!pip install folium 필요
32. 실습 - follium으로 집 값 평균 및 거래량 지도 시각화하기
import folium
m = folium.Map(location=[37.5, 127], zoom_start=11)
m # 지도 그리기
folium.CircleMarker(location=[37.5, 127], radious=50, color='red').add_to(m)
m # 동그라미 하나 그리기
for idx, row in merge_df.iterrows():
location = [row['loc'], row['lat']]
folium.CircleMarker(
location=location,
popup=row['dong'] + str(int(row['mean_price'])),
radius=row['mean_price']/10000,
fill=True,
fill_color='red'
).add_to(m)
m # 파란 mean_price 맵 만들기
for idx, row in merge_df.iterrows():
location = [row['loc'], row['lat']]
folium.CircleMarker(
location=location,
popup=row['dong'] + str(int(row['count'])),
radius=row['count']/1000,
color='red',
fill=True
).add_to(m)
m # 빨간 count 맵 만들기
33. 이론 - 데이터 컬럼 추가
브로드캐스트
차원이 작은 행렬(또는 value)의 차원을 키워서 차원이 큰 행렬에 맞춰서 계산함 ex) [1, 2, 3] + 2를 하면 list에서는 오류가 나지만, np.array or pd.Series(Or DF)에서는 [3,4, 5]로 값이 나옴 [1, 2, 3]+ [2, 2, 2] 배열로 계산해서 나온 것.
ex) [1, 2, 3] + [0], [1], 2를 계산하면 [1,2,3], [2,3,4], 3,4,5 가 나옴
[1,2,3]이 [1,2,3], [1,2,3], 1,2,3이 되고 [0], [1], 2가 [0,0,0], [1,1,1], 2,2,2가 됨
[1,2,3], [1,2,3], 1,2,3 + [0,0,0], [1,1,1], 2,2,2 = [1,2,3], [2,3,4], 3,4,5
리스트 컴프리핸션
[표현식 for 아이템 in 반복가능한_객체] [표현식 for 아이템 in 반복가능한_객체 If 조건] [표현식1 if 조건 else 표현식2 for 아이템 in 반복가능한_객체] 와 같은 모양으로 생겼음, 리스트 내에서 for문을 돌려서, 리스트로 만들어 줌
ls= [표현식 for 아이템 in 반복가능한_객체]
Is =[] for 아이템 in 반복가능한 객체 :
Is.append(표현식)
둘은 같은 결과가 나옴.
그러나 성능, 간결성 부분에서 리스트 컴플리헨션이 더 유리함.
- 식이 간결하다면 전통적 for문보다 리스트 컴플리헨션을 사용하는게 유리 (리스트컴플리헨션은 이미 리스트 내부에서 돌기 때문에 append 메소드의 시간의 영향을 받지 않음)
전통적인 for 루프 사용
start_tine= tine.time() traditional _list = [] for x in rangel 1000000): traditional_list. append(x*2) end_time - time.time() print(f"for문: tend_tine - start_tiner seconds") 리스트 컴프리헨션: 0.331923246383667 seconds for문: 0. 6755423545837402 seconds 그러나 성능, 간결성 부분에서 리스트 컴플리헨션이 더 유리함.
- 식이 간결하다면 전통적 for문보다 리스트 컴플리헨션을 사용하는게 유리 (리스트컴플리헨션은 이미 리스트 내부에서 돌기 때문에 append 메소드의 시간의 영향을 받지 않음)
34. 실습 - 데이터 컬럼 추가 1
의미 있는 컬럼을 더 만들어보자
(df['transaction_year_month']/100).astype(int) # 숫자형 year month의 year 가져오기 구문
(df['transaction_year_month']%100).astype(int) # 숫자형 year month의 month 가져오기 구문
df['ransaction_year'] = (df['transaction_year_month']/100).astype(int)
df['ransaction_month'] = (df['transaction_year_month']%100).astype(int)
df
np.unique(df['transaction_date'])
df['transaction_date'].str.split('~')
df['transaction_date'].str.split('~').str[0] # objet 의 열 나누기
df['transaction_date_first'] = df['transaction_date'].str.split('~').str[0].astype(int)
df
df['real_price_per_m2'] = df['transaction_real_price'] / df['exclusive_use_area'] # m2당 가격 구하기
df
35. 실습 - 데이터 컬럼 추가 2
# 숫자형 데이터만 선택하여 num_df 생성
num_df = df.select_dtypes(include=[np.number])
# 'dong' 열을 문자열로 변환
df['dong'] = df['dong'].astype(str)
# num_df와 'dong' 열을 가로로 합치기 (axis=1은 열 방향으로 합침을 의미)
result_df = pd.concat([num_df, df['dong']], axis=1)
# 결과 출력
result_df
dong_groupby = result_df.groupby('dong').mean()
dong_groupby
corr_df = dong_groupby.corr()
sns.clustermap(corr_df, annot=True, cmap="RdYlBu_r", vmin=-1, vmax=1) # 클러스터 맵
dong_groupby = dong_groupby['exclusive_use_area', 'transaction_real_price', 'real_price_per_m2'](/bonniekwon0721/Dataanalytics-study/wiki/'exclusive_use_area',-'transaction_real_price',-'real_price_per_m2').reset_index()
dong_groupby # 필요 열만 추림
dong_groupby.columns = ["dong_" + column if column != 'dong' else column for column in dong_groupby.columns]
dong_groupby # 열이름 중복이니까 열이름 교체 (dong열 제외)
df = pd.merge(df, dong_groupby, on='dong') # df와 dong_groupby를 merge 시킴
df
36. 실습 - 데이터 컬럼 추가 3
# 숫자형 데이터만 선택하여 num_df 생성
num_df = df.select_dtypes(include=[np.number])
# 결과 출력
num_df
apart_groupby = num_df.groupby('apartment_id').mean()
apart_groupby
corr_df = apart_groupby.corr()
corr_df
sns.clustermap(corr_df, annot=True, cmap="RdYlBu_r", vmin=-1, vmax=1, annot_kws={'fontsize': 8}) # 클러스터 맵
apart_groupby = apart_groupby['exclusive_use_area', 'transaction_real_price', 'real_price_per_m2'](/bonniekwon0721/Dataanalytics-study/wiki/'exclusive_use_area',-'transaction_real_price',-'real_price_per_m2').reset_index()
apart_groupby
apart_groupby.columns = ["apart_" + column if column != 'apartment_id' else column for column in apart_groupby.columns]
apart_groupby
df = pd.merge(df, apart_groupby)
df
38. 실습 - 추가 데이터 상관관계 확인하기 - heatmap
import pandas as pd
# 열 이름 리스트
columns_to_convert = [
'dong_exclusive_use_area',
'dong_transaction_real_price',
'dong_real_price_per_m2',
'apart_exclusive_use_area',
'apart_transaction_real_price',
'apart_real_price_per_m2'
]
# 해당 열들의 데이터 타입을 int64로 변환하는 함수
df[columns_to_convert] = df[columns_to_convert].astype('int64')
# 변환 후 데이터 타입 확인
print(df.dtypes)
# 데이터프레임 df 로부터 int64 타입의 열만 선택
int64_df = df.select_dtypes(include=['int64'])
# 선택된 열에 대해 상관계수 계산
corr_df = int64_df.corr()
corr_df
sns.heatmap(corr_df, annot=True, fmt='.1f', cmap='RdYlBu_r', vmin=-1, vmax=1, cbar=False, annot_kws={'fontsize': 8})
sns.clustermap(corr_df, annot=True, fmt='.1f', cmap="RdYlBu_r", vmin=-1, vmax=1, annot_kws={'fontsize': 8}) # 클러스터 맵
39. 실습 - 추가 데이터 신뢰성 확인 - boxplot
import seaborn as sns
import matplotlib.pyplot as plt
# 데이터프레임에서 boxplot 생성
sns.boxplot(data=int64_df, y='transaction_real_price', fliersize=7, linewidth=1.5)
# 레이아웃 조정
plt.tight_layout()
# 플롯 표시
plt.show()
# 데이터프레임에서 boxplot 생성
sns.boxplot(data=df, y='real_price_per_m2', fliersize=7, linewidth=1.5)
# 레이아웃 조정
plt.tight_layout()
# 플롯 표시
plt.show()
df.sort_values('real_price_per_m2', ascending=False).iloc[0] # outlider data 비교 확인
df.sort_values('real_price_per_m2', ascending=False).iloc[1] # outlider data 비교 확인
검색해봤을 때, 실재로는 충정로3가 피어리스는 3-7억에 거래되고 있다. 하지만 11, 12층에 37억이 있긴 하다
# 데이터프레임에서 boxplot 생성
sns.boxplot(data=int64_df, y='dong_real_price_per_m2', fliersize=7, linewidth=1.5)
# 레이아웃 조정
plt.tight_layout()
# 플롯 표시
plt.show()
40. 실습 - 추가 데이터 집 값 시각화 - scatterplot
location = pd.read_csv('data/data_chap3/동별좌표(구).csv')
location.columns = ['dong', 'loc', 'lat']
location
price_for_dong = result_df.groupby('dong').mean()['real_price_per_m2'](/bonniekwon0721/Dataanalytics-study/wiki/'real_price_per_m2')
price_for_dong = price_for_dong.reset_index()
price_for_dong
price_for_dong = pd.merge(price_for_dong, location, on='dong', how="inner")
price_for_dong
price_for_dong = price_for_dong.drop_duplicates('dong', keep='first') # 중복값을 한번 제거하겠습니다.
px.scatter(price_for_dong, x='lat', y='loc', color='dong', size='real_price_per_m2')
41. 실습 - 추가 데이터 집 값 시각화 - folium
import folium
m = folium.Map(location=[37.5, 127], zoom_start=11)
m # 지도그리기 초기화
for idx, row in price_for_dong.iterrows():
location = [row['loc'], row['lat']]
folium.CircleMarker(
location=location,
popup=row['dong'] + str(int(row['real_price_per_m2'])),
radius=row['real_price_per_m2']/100,
fill=True,
fill_color='red'
).add_to(m)
m
42. 실습 - 활용을 위한 groupby 데이터 저장
result_df.groupby('dong').mean()['exclusive_use_area', 'transaction_real_price', 'real_price_per_m2'](/bonniekwon0721/Dataanalytics-study/wiki/'exclusive_use_area',-'transaction_real_price',-'real_price_per_m2').to_csv('data/data_chap3/서울특별시/apartment_df_by_dong.csv')
Studied from 제로베이스 데이터 스쿨