Analysis of Airbnb’s Market in Chicago, Illinois

This report provides insight into Chicago’s Airbnb data for the last few years as we try to gain an understanding of the landscape of the Chicago market for Airbnb. Chicago is the 3rd largest city in the US and largest Midwestern city in the country. It is a big tourist destination featuring diverse museums, food, outdoor spaces, parks, and sports teams. It is a very attractive market for those looking for short-term or long-term stays, which is a perfect recipe for the Airbnb market.

Airbnb was established in 2007 and is an online platform that allows property owners or hosts to rent their spaces to travelers. The hosts earning potential can vary and depends on several factors including property type, location, quality, average rating they receive from prior renters, and time of the year. The company (Airbnb) takes up a portion of the booking fee from both the host and renter since they run the site that brings the host and the renter together. Since Airbnb was created, how people travel and find places to stay has changed as they are no longer just tied to a hotel selection. It also provides more options for larger families, that in the past had to reserve multiple rooms or spaces to travel.

Chicago has become one of the popular locations for Airbnb business as the size of the city and how many tourists visit the city each year creates a demand for short-term rentals. Since this has become a popular option for travelers, the city of Chicago has put many different regulations and policies in place. One of the regulations that the city of Chicago has put a policy in place for short-term rentals to prevent huge parties that create a lot of noise in Chicago neighborhoods. Since some travelers were renting for 1-2 nights, some would throw large parties that created a lot of noise in these neighborhoods. The current policies were “designed to verify the host information submitted by property owners who want to rent their homes on a short-term basis and make sure city officials can hold those who break the rules accountable through an online portal.” This means Airbnb hosts must obtain proper licenses and go through proper protocols in order to start renting their space to the public.

This analysis will look to show the various metrics in the Airbnb dataset to better understand the Chicago Airbnb Market. The goal would be to share the findings to help those looking to travel in Chicago as well as those who are interested in opening their space as short-term rentals and getting into the Airbnb business.The goal would be to provide information that best helps these two groups make good well-informed decisions based on the information displayed.

import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'c:/ProgramData/Anaconda3/Library/plugins/platforms'

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
import folium
from matplotlib.ticker import FuncFormatter
import matplotlib
import seaborn as sns

warnings.filterwarnings("ignore")

path = "U:/"

filename = path + 'Chicago_AIRBNB_Listings.csv'

df = pd.read_csv(filename)

#Counts of number of occurrences per room type
df.room_type.value_counts();

#check to see if there are NA values in this column
df.room_type.isna().sum()

Dataset

This dataset was provided by Airbnb’s data portal on its website insideairbnb.com/Chicago/. The data that I used in this report was last updated in January 2025. This report only contains information about hosts’ information and activity in Chicago, Illinois. The data comes from Inside Airbnb’s website, a site where they provide public data to the community. On the Inside Airbnb site, it says they publish this information so others are empowered to work “towards a vision where communities are empowered with data and information to understand, decide and control the role of renting residential homes to tourists.” This data has 8,269 rows and 18 columns with columns containing host name, host id, the neighborhood, and name of the Airbnb on the website. It also contains important information like room type, location, minimum nights, price, availability per 365 days of the year, as well as the reviews per month.

Findings

Available Room Types in Chicago

#grouping by room_type and getting a count for the xdata frame
x = df.groupby(['room_type']).agg({'room_type':['count']}).reset_index()

#Giving the Columns in the x datadframe Column Headers
x.columns = ['Room_Type', 'Count']

#sorting data by room types with the largest number at the bottom and resetting index number
x = x.sort_values('Count', ascending=True)
x.reset_index(inplace=True, drop=True)

plt.figure(figsize=(18, 10))
plt.barh(x.loc[0:3, 'Room_Type'], x.loc[0:3, 'Count'], label = 'Count of Occcurences', color="skyblue")

plt.title("Count of Available Room Types in  Chicago, Illinois", fontsize=18, fontweight='bold')
plt.xlabel('Count', rotation=0, horizontalalignment = 'center', fontsize=14)
plt.ylabel('Room Type', fontsize=14)

def form_func(x, pos):
    return f'{int(x):,}'
plt.gca().xaxis.set_major_formatter(FuncFormatter(form_func))

for row_counter, value_at_row_counter in enumerate(x.Count):
    plt.text(value_at_row_counter+20, row_counter, f'{value_at_row_counter:,}', color="black", fontsize=12, fontweight='bold',
            ha='left', va='center')
plt.xlim(0, x.Count.max()*1.1);

plt.show()

In this horizontal bar chart this shows the breakdown of room types available in Chicago, Illinois. It is no surprise that the most common room type that is available happens to be the “whole room or apartment” available to the buyer. There is a total of 4 different room types available; Whole Room/Apartment, Private Room, Hotel Room, and Shared Rooms available in Chicago. If you have seen a recent Airbnb commercial recently, a lot of the commercials have been centered around families planning a vacation where they have small children. The option of having an entire apartment/house to yourself allows you to put the kids to sleep in one room while the parents can enjoy each others company in the other room. This option provides them a competitive advantage with hotels since they still have the same ability to provide privacy with the upside in some cases as having more space than a traditional hotel room would offer.

Location of 300 Airbnb’s in Chicago

#graph 2 Python Folium Maps Airbnb Chicago, Illinois

df.price.fillna('0', inplace=True)
df['price'] = pd.to_numeric(df['price'], errors = 'coerce')
df_filtered = df[df['price'] > 1]
df_sample = df_filtered.sample(n=300, random_state=42)

map_center = [df_sample['latitude'].mean(), df_sample['longitude'].mean()]
my_map = folium.Map(location=map_center, zoom_starts=12,
                   width = '90%',
                   height = '100%',
                   left = '5%',
                   right = '5%',
                   top = '0%')

tiles = ['cartodbpositron', 'openstreetmap']
for tile in tiles:
    folium.TileLayer(tile).add_to(my_map);
    
for lat, lon, price, neighbourhood, room_type in zip(df_sample['latitude'], df_sample['longitude'], df_sample['price'], df_sample['neighbourhood'], df_sample['room_type']):

#Customized Marker popups (background color based on price)
    price = float(price)
    
#Marker Color Logic
    if price < 90:
        marker_color = 'green'
    elif 90 <= price < 200:
        marker_color = 'darkblue'
    else:
        marker_color = 'lightred'

    popup_content = f'<b>Neighborhood:</b> {neighbourhood}<br><b>Room Type:</b> {room_type}<br><b>Price:</b> ${price}'
    folium.Marker(
        location = [lat, lon],
        popup = popup_content,
        icon = folium.Icon(color=marker_color, icon="cloud")
    ).add_to(my_map);
    
folium.LayerControl().add_to(my_map);

my_map
Make this Notebook Trusted to load map: File -> Trust Notebook

This is a map of the 7,347 Airbnb options in Chicago this is a sample of 300 random different Airbnb locations in Chicago. If you click on any of the popup markers you will see the Neighborhood Location, Room Type, and Price.

The icons on ther map reflect the various price ranges. The price is calculated based on the “trip rate” which means that it takes into account the minimum night requirement an Airbnb has to book that specific location. The ranges are as follows:

Green = $90 and below

Dark Blue = $90 and $200

Light Red = Anything over $200

The ranges were determined based on affordability, a short trip or a budget conscious customer may want something less than $100 dollars, where others are more comfortable with a middle of the market price between $90 and $200. The ones above $200 are put in Red for those looking at a higher price and may want to spend more depending on location and comfortability of spending more on the place. You can see a lot of the light red are in the center of the city.

Average Price Per Night by Neighborhood in Chicago

chicago_geo = path + 'chicago.txt'

#Make price and minimum night a numeric value to be read into this visualization
df['price'] = pd.to_numeric(df['price'], errors='coerce')
df['minimum_nights'] = pd.to_numeric(df['minimum_nights'], errors='coerce')

#remove 0 values from minimum nights
df = df[df['minimum_nights'] > 0]

group_by_neighborhood = df.groupby('neighbourhood')

df['price_per_night'] = df['price'] / df['minimum_nights']

average_price = df.groupby('neighbourhood')['price_per_night'].mean().reset_index()

map_center = [df['latitude'].mean(), df['longitude'].mean()]

my_map2 = folium.Map(location = map_center,
                     zoom_start = 12,
                     tiles = 'cartodbpositron',
                     width = '90%',
                     height = '100%',
                     left = '5%',
                     right = '5%',
                     top = '0%')

ch_map = folium.Choropleth(geo_data = chicago_geo,
                          name = 'choropleth',
                          data = average_price,
                          columns = ['neighbourhood', 'price_per_night'],
                          key_on = 'feature.properties.name',
                          fill_color = 'RdPu',
                          fill_opacity = 0.9,
                          line_opacity = 0.4,
                          legend_name = 'Neighborhood Based on Price Per Night',
                          highlight=True).add_to(my_map2)

#Display Region/Neigh Label
ch_map.geojson.add_child(
    folium.features.GeoJsonTooltip(fields=['name'], aliases=['Neighbourhood: '],
                                    labels = True, style=('background-color: black; color: white;')));
                                    

my_map2.save(path + 'Choropleth_Chicago_Airbnb.html')

my_map2
Make this Notebook Trusted to load map: File -> Trust Notebook

This visualization is showing the average price per night by neighborhood in the city of Chicago. This map is slightly different from the previous one because it shows the average price per night by neighborhood and does not take into account how many locations are in that neighborhood. It also tells the story that North Chicago and Downtown Chicago tend to have a higher price per night compared to the South Side of Chicago.

Top 10 Chicago Neighborhood Airbnb Available Sites

# Pie Chart - Top 10 Chicago Neighborhood Airbnb Available Sites (Airbnb)
pie_df = df.groupby(['neighbourhood']).agg({'neighbourhood':['count']}).reset_index()
pie_df.columns = ['Neighborhood', 'Count']
pie_df = pie_df.sort_values('Count', ascending=False)
pie_df.reset_index(inplace=True, drop=True)
 
pie_df_top10 = pie_df.groupby(['Neighborhood'])['Count'].sum().nlargest(10).sort_values(ascending=False).reset_index()
 
number_outside_colors = len(pie_df_top10.Neighborhood.unique()[:10])
outside_color_ref_number = np.arange(number_outside_colors)

colormap = plt.get_cmap("tab20c")
outer_colors = colormap(outside_color_ref_number)

total_count = pie_df_top10['Count'].sum()

fig, ax = plt.subplots(figsize=(10, 10)) 

pie_df_top10.plot(
    y='Count',
    labels=pie_df_top10['Neighborhood'],
    kind='pie',
    colors=outer_colors,
    pctdistance=0.85,
    labeldistance=1.1,
    wedgeprops=dict(edgecolor='w'),
    textprops={'fontsize': 12},
    autopct=lambda p: f'{p:.2f}%\n({p * total_count / 100:.0f})',
    startangle=90,
    legend=False,
    counterclock=False,
    ax=ax)

ax.set_title("Top 10 Chicago Neighborhood Airbnb Available Sites", fontsize=18, fontweight='bold')
ax.set_ylabel('')  
plt.tight_layout()
plt.show()

You can see on this pie chart that these are the Top 10 Neighborhoods in Chicago based on the number of Airbnb available sites in the city. The number of available sites are pretty much captured between 4 Neighborhoods; Near North Side (19.1%), West Town (16.1%), Lake View (12.3%), and Near West Side (12%). This takes up about 60% of the top 10 Neighborhoods in this graph. If you were to look at a map of Chicago these neighborhoods are very close to each other and are near the Northern/Center Part of the City. These neighborhoods are a little bit of a distance from both the International Airports but near a lot of local attractions. This gives the consumer some options to decide if they want to Uber/Lyft in the city or walk depending on distance to the sites they want to visit.

Impact of Number of Monthly Reviews on Price

#5 Scatterplot

plt.figure(figsize=(12, 8))
sns.scatterplot(data=df, x= 'reviews_per_month', y= 'price')
                
plt.title("Impact of Reviews on Price", fontsize=18, fontweight='bold')
plt.xlabel('Number of Reviews', fontsize=14)
plt.ylabel('Price Per Night', fontsize=14)

This Scatterplot shows the Impact of Monthly Reviews on Price. One of the aspects I was curious about was how the price would be impacted by monthly reviews. My thinking was that if an Airbnb location is popular and has a lot of positive reviews the Airbnb Host might be more likely to charge a higher price to the customer. The customer would in theory, be willing to pay the higher price because of the positive reviews/experience others have had. The customer would want to assurance that if they purchase this Airbnb they would have a higher probability of having a good experience as well. However, as you can see the graph above shows that there is little to no correlation between price and the number of reviews. This shows that the number of reviews does not have a direct impact to price. It seems oher factors like room size and location have a higher impact.

If I was able to request additional data, a few items that I would like to test is the average review score to price. In this dataset we only have the number of reviews along with the reviews per month. It does not show the specific ratings that the Airbnb Sites and Hosts received. If I was able to test average review score I wonder if it would have a higher correlation to impact on the pricing of the unit.

Top 10 Airbnb Hosts by Number of Listings

#6 Bar Chart for the Top 10 Airbnb Hosts in Chicago

top_10_hosts = df.groupby(['host_name'])['id'].count().nlargest(10).reset_index()

plt.figure(figsize=(16,16))
bars = plt.bar(top_10_hosts['host_name'], top_10_hosts['id'], color='lightgreen')
plt.xlabel('Host Name', fontsize=12)
plt.ylabel('Number of Listings', fontsize=14)
plt.title('Top 10 Airbnb Hosts by Number of Listings', fontsize=18, fontweight='bold')
plt.xticks(rotation=35, ha='right', fontsize=14);
plt.ylim(0, top_10_hosts['id'].max()*1.05);

for bar in bars:
    yval = bar.get_height()
    plt.text(bar.get_x() + bar.get_width() / 2, yval*1.01,
    f'{yval:,}', color='black', fontsize=12, fontweight='bold',
    ha='center', va='bottom')

plt.show

This vertical bar chart shows the top 10 Airbnb Hosts in Chicago. The top Airbnb host (Blueground) has about 400 more Airbnb locations then the second host which is Luxury Bookings FZE. The other thing to note is that the Top 5 Airbnb Hosts are all Luxury Travel and Accommodations companies. The remaining five look to be personal/small business Airbnb Host locations. It is interesting that in terms of quantity that these company’s have a ton of locations in the Chicago Market. These companies might offer different packages that could include travel, room, food, and possibly experiences.

Conclusion

The findings in this analysis are a detailed evaluation of the Airbnb’s in the Chicago Market. The City of Chicago has become a popular and growing market for Airbnb rentals which has lead to an increases in licensing and requirements by the City of Chicago to protect their city while also creating an environment where Airbnb Stakeholders can thrive.

The visualizations in this report should be useful resources for those looking to rent an Airbnb in Chicago as well as Hosts who have locations or future locations in Chicago. The key takeaways from this report is that the majority of Room Types available in Chicago are the entire apartment/house and the majority of the available renting options in Chicago are owned by Luxury Travel and Accommodations companies. The largest luxury company that owns 516 Airbnb locations is Blueground. You can see in the varous maps that the center of Chicago and downtown area has the most locations and also charge the higher rates than those in other neighborhoods around the city.