이번 포스팅을 시작으로 총 3개의 포스팅을 통해 뉴욕시 Airbnb 데이터를 활용한 탐색적 자료 분석 을 수행하겠습니다. Python의 Pandas, numpy, matplotlib, seaborn 등의 라이브러리를 사용하여 “New York City Airbnb Open Data” 데이터 세트에 대한 탐색적 자료 분석 (Explorary Data Analysis)를 수행합니다.
이를 통하여 데이터에 대한 기본적인 특성을 이해하고 의미 있는 인사이트를 도출하겠습니다. 포괄적인 탐색적 자료 분석으로 시작하여 기술 통계를 조사하고 시각화를 생성하여 변수 간의 분포와 관계에 대해서 살펴 보겠습니다. 가격과 리뷰 수의 관계, 예약 가능 여부와 가격, 가격과 최소 숙박 일수 등의 질문에 답을 구하겠습니다.
실습에 필요한 아래 데이터를 D드라이브에 다운로드 하세요.
필요 라이브러리 로드
우선, 뉴욕시 Airbnb 데이터를 활용한 탐색적 자료 분석을 위해 필요한 라이브러리를 가져옵니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import time
import plotly.express as px
import plotly.graph_objects as go
import folium as fl
CSV 파일 형식의 데이터 읽기 및 탐색
Pandas 라이브러리를 사용하여 D드라이브에 다운로드 한 “AB_NYC_2019.csv”라는 CSV 파일을 읽습니다. read_csv 함수는 Pandas DataFrame에 데이터를 로드하는 데 사용됩니다. 데이터를 읽은 후 head 함수를 사용하여 처음 몇 개의 행을 표시하여 데이터를 탐색할 수 있습니다.
airbnbData = pd.read_csv("D:/AB_NYC_2019.csv")
airbnbData .head()
--------------------------------------------------------------------------
id name host_id host_name neighbourhood_group neighbourhood latitude longitude room_type price minimum_nights number_of_reviews last_review reviews_per_month calculated_host_listings_count availability_365
0 2539 Clean & quiet apt home by the park 2787 John Brooklyn Kensington 40.64749 -73.97237 Private room 149 1 9 2018-10-19 0.21 6 365
1 2595 Skylit Midtown Castle 2845 Jennifer Manhattan Midtown 40.75362 -73.98377 Entire home/apt 225 1 45 2019-05-21 0.38 2 355
2 3647 THE VILLAGE OF HARLEM....NEW YORK ! 4632 Elisabeth Manhattan Harlem 40.80902 -73.94190 Private room 150 3 0 NaN NaN 1 365
3 3831 Cozy Entire Floor of Brownstone 4869 LisaRoxanne Brooklyn Clinton Hill 40.68514 -73.95976 Entire home/apt 89 1 270 2019-07-05 4.64 1 194
4 5022 Entire Apt: Spacious Studio/Loft by central park 7192 Laura Manhattan East Harlem 40.79851 -73.94399 Entire home/apt 80 10 9 2018-11-19 0.10 1 0
데이터의 형태 이해
airbnbData.shape을 사용하여 데이터의 형태를 이해합니다. Pandas DataFrame의 shape 속성은 DataFrame의 크기(행과 열)을 나타내는 튜플을 반환합니다.
airbnbData.shape
----------------
(48895, 16)
튜플은 DataFrame의 행 수와 열 수라는 두 가지 값으로 구성됩니다.
예를 들어 airbnbData.shape이 (48895, 16)을 반환하면 DataFrame에는 48895개의 행과 16개의 열이 있다는 의미입니다.
airbnbData.shape를 사용하면 작업 중인 데이터 세트의 크기와 구조를 빠르게 확인할 수 있습니다.
열 이름 추출
list(airbnbData.columns)는 DataFrame에서 열 이름을 추출하는 데 사용됩니다. Pandas DataFrame의 columns 속성은 DataFrame에 있는 열 이름 리스트를 반환합니다.
list(airbnbData.columns)
------------------------------------------------
['id',
'name',
'host_id',
'host_name',
'neighbourhood_group',
'neighbourhood',
'latitude',
'longitude',
'room_type',
'price',
'minimum_nights',
'number_of_reviews',
'last_review',
'reviews_per_month',
'calculated_host_listings_count',
'availability_365']
list() 함수를 airbnbData.columns에 적용하여 Pandas Index 개체의 열 이름을 표준 Python 리스트로 변환합니다. 이를 통해 열 이름에 더 쉽게 접근하고 조작할 수 있습니다.
분석이나 시각화를 위해 특정 열을 선택할 때와 같이 DataFrame의 열 이름을 검사하거나 작업하려는 경우에 매우 유용하게 활용할 수 있습니다.
임대 가격(Rental Price) 통계 계산
임대 가격(Rental Price) 데이터에 대한 계산을 수행합니다. Rental_price 변수에는 DataFrame의 ‘price’ 열 값이 할당됩니다.
# 변수 할당
rentalPrice = airbnbData.loc[:, 'price']
# 임대 가격(rental price) 통계 계산
meanRent = np.mean(rentalPrice)
print('평균 임대 가격 : $', round(meanRent, 2))
maxRent = np.max(rentalPrice)
print('제일 비싼 임대 가격 : $', round(maxRent, 2))
minRent = np.min(rentalPrice)
print('제일 저렴한 임대 가격 : $', round(minRent, 2))
rentStd = np.std(rentalPrice)
print('임대 가격의 표준편차 : $', round(rentStd, 2))
medianRent = np.median(rentalPrice)
print('임대 가격의 중앙값 : $', round(medianRent, 2))
--------------------------------------------------------------
평균 임대 가격 : $ 152.72
제일 비싼 임대 가격 : $ 10000
제일 저렴한 임대 가격 : $ 0
임대 가격의 표준편차 : $ 240.15
임대 가격의 중앙값 : $ 106.0
- 평균($152.72): 이 값은 평균적으로 뉴욕시의 임대 가격이 약 $152.72라는 것을 나타냅니다. 평균값은 매우 비싸거나 매우 저렴한 임대료의 영향을 받아 평균을 왜곡할 수 있습니다.
- 최대($10,000): 이는 뉴욕시에 등록된 가장 높은 임대 가격입니다. 이는 극단적인 가치이며 대다수 임대의 현실을 나타내지는 않을 것으로 판단됩니다.
- 최소값($0): 이 값은 무료 숙박 시설 목록이 있음을 나타냅니다. 이는 데이터 입력 오류이거나 특정 프로모션일 수 있습니다.
- 표준 편차($240): 수치가 높은 값은 임대 가격에 큰 변동이 있음을 나타냅니다. 즉, 일부 임대료는 매우 저렴하지만 다른 임대료는 매우 비쌉니다.
- 중앙값($106): 이 값은 뉴욕시 임대료의 절반이 $106 미만이고 나머지 절반은 $106 보다 높다는 것을 나타냅니다. 중앙값은 극단적인 값에 덜 민감하며 “일반적인 임대료”를 더 잘 나타낸다고 할 수 있습니다.
요약하자면, 뉴욕시의 임대료는 매우 다양하며 일부 극도로 비싼 임대료는 평균을 부풀리는 효과를 발휘합니다. 그러나 대부분의 임대료는 평균 106달러로 알 수 있듯이 더 저렴한 것으로 보입니다. 무료 대여의 존재는 매우 흥미롭고 추가 조사가 필요할 수 있습니다.
유일한 이웃 그룹(Neighborhood Groups)
“고유한 지역(distinct regions)”은 데이터 내의 고유한 이웃 그룹(Unique Neighborhood Groups) 또는 지역을 나타냅니다. 각 이웃 그룹은 뉴욕시와 같은 더 큰 지리적 영역 내의 특정 지역이나 지구를 나타냅니다.
# 변수 할당
region = airbnbData.loc[:, 'neighbourhood_group']
# 변수로부터 고유값 추출
uniqueRegions = pd.unique(region)
print('고유한 지역 : ', uniqueRegions)
--------------------------------------------------------------------------
고유한 지역 : ['Brooklyn' 'Manhattan' 'Queens' 'Staten Island' 'Bronx']
위 코드는 ‘neighbourhood_group’의 열 값을 ‘region’ 변수에 할당합니다. 그런 다음 pd.unique() 함수를 사용하여 ‘region’ 변수에서 고유한 값(Unique Value)을 추출하고 저장합니다. 이러한 고유한 값은 데이터 세트에 존재하는 고유한 이웃 그룹 또는 지역을 나타냅니다.
고유한 동네 그룹을 식별하고 추출함으로써 데이터 세트 내의 다양한 지역에 대한 통찰력을 얻을 수 있으므로 보다 세부적인 수준에서 데이터를 분석하고 이해할 수 있습니다.
고유한 값 계산
이 코드에서는 ‘neighbourhood_group’ 열의 고유 값 수를 계산합니다. .value_counts() 함수는 열에서 각 고유 값의 발생 횟수를 계산하는 함수입니다.
# 고유값 계산
uniqueRegionsCount = airbnbData['neighbourhood_group'].value_counts().count()
print('고유한 지역 수 : ', uniqueRegionsCount)
--------------------------------------------------------------------------------
고유한 지역 수 : 5
지역별 부동산 비율 계산
이 코드에서는 ‘neighbourhood_group’ 열에서 각 지역 또는 동네 그룹이 나타내는 속성의 비율을 계산합니다. .value_counts(normalize=True) 함수는 열에서 각 고유 값의 발생 횟수를 계산하고 대신 백분율을 나타내기 위해 횟수를 비율로 산출합니다.
Normalize=True로 설정하면 개수를 총 속성 수로 나누어 각 지역의 비율을 산출합니다.
# 지역별 부동산 비율 계산
percentByRegion = round(airbnbData['neighbourhood_group'].value_counts(normalize=True) * 100, 2)
percentByRegion
--------------------------------------------
Manhattan 44.30
Brooklyn 41.12
Queens 11.59
Bronx 2.23
Staten Island 0.76
Name: neighbourhood_group, dtype: float64
결과에 100을 곱하여 비율을 백분율로 변환하고, round() 함수를 적용하여 백분율을 소수점 이하 두 자리로 반올림합니다.
마지막으로 지역별 부동산 비율이 ‘percentByRegion’ 변수에 저장되어 표시됩니다.
이번 포스팅에서는 뉴욕시 Airbnb 데이터를 활용한 탐색적 자료 분석의 첫번째 단계로 기초적인 데이터 탐색 방법에 대해서 알아 보았습니다. 다음 포스팅에서는 뉴욕시 Airbnb 데이터를 활용한 탐색적 자료 분석 두번째 단계로 동일 데이터를 활용하여 데이터 시각화 방법에 대해서 알아 보겠습니다.