
Renting an apartment in big cities in Germany can be an exciting experience, but also an expensive one. With the high demand for rental properties, the cost of renting has skyrocketed in the past years, making it challenging for many to find an affordable living space. The steep rental costs are due to various factors such as population growth in large cities, lack of available properties, and high demand from international students and expatriates. In this blog article, we will delve into the current rental costs of apartments in big German cities and explore the true living costs in large German cities based on the gathered data of offers and derived statistics. So, if you are planning to move to a big German city soon, keep reading for some insights on the current state of the housing market in those cities.
In my free time, I enjoy coding scraping bots that crawl specific websites and extract and save information into local datasets or databases. Similar as for France and Paris, for this article, I coded a scraper in Python that collected a large dataset of apartment offers for rent from various web portals in Germany. The data was collected in December 2022. After processing the data, I created a handful of plots and diagrams to provide a bird’s-eye view on the current state of the market (December 2022). This article will focus on apartments offered for rent in German large cities only. It needs to be noted that the rent prices mentioned in this post are exclusively so called “cold rental prices” (Kaltmiete), meaning that the mentioned monthly cost goes directly to the landlord. The prices do not included council charges, community service fees and monthly energy costs. Those additional expenses have to be applied on top.
I used the Python 3 library Scrapy for the scraping code, along with standard data science libraries such as Pandas/GeoPandas, NumPy, and SciPy for data processing. Scrapy gathered raw data from various websites, and Pandas was essential for post-processing it. Finally, I used Matplotlib or Seaborn libraries for visualization.
I) Overview
In this section of the article, we will first examine the rental prices of apartments in larger German cities with a population of over 100,000 inhabitants. According to Wikipedia, there are 80 such cities as of 2023. Therefore, Fig. 1 shows the average square meter rental prices and their average price range for each of these cities. The average value was estimated by calculation of the median square meter rental price of all offers in the particular city. The lower boundary of the square meter price range was estimated by taking the median of the 50% most affordable offers, while the upper boundary was estimated by taking the median value of the 50% most expensive offers. So, we are talking here about an 25-75 interquartile (IQR) range, meaning that 50% of the offers will fall within the displayed price range.
Therefore, according to Fig. 1, the 80 cities have been ranked based on the absolute average square meter rental price per month of apartments. Unsurprisingly, Munich is the most expensive city in Germany, with even its most affordable rental prices being equivalent to premium class offers in Cologne. Stuttgart, Frankfurt, and Hamburg follow Munich on the list. The figure also shows that Berlin has the widest range of price ranges, mainly due to the fact that the city is large in terms of area size and is, in fact, a conglomeration of several large parts of the city that can have very different living standards within the same city. On the other hand, the most affordable cities are Hagen, Magdeburg, Gelsenkirchen, and Chemnitz. Two of these cities are located in the former Democratic Republic of Germany, while the other two are located in the Ruhr-Area, the former industrial hub of West-Germany.
The living costs in the Ruhr area are generally lower compared to the rest of Germany due to the region’s history as an industrial hub. While this may make the area an attractive place to live for those seeking affordable living, it also poses challenges in terms of economic development. The region has struggled to attract investment and create new job opportunities in industries beyond the traditional manufacturing sector. This has resulted in a brain drain as young, skilled workers leave the area in search of better job prospects. Additionally, the region is also facing the challenge of an aging population, which further compounds the economic and social issues faced by the area. Overall, while the low cost of living in the Ruhr area may be attractive for some, it also highlights the need for continued efforts to revitalize the region and create a sustainable economic future.

Fig. 2 shows that the typical size of apartments in these cities is around 60 m². Fig. 3 displays the total average rent without additional utility fees, with the y-axis showing cities with more than 200’000 inhabitants ranked in the same way as Fig. 1, and the x-axis showing the square meter size of the apartment. The most reliable values are estimated for 40, 60, and 80m², as these apartment sizes had the most data points. Apartments smaller than 40 m² or larger than 80 m² are considered “atypical,” so corresponding values should be treated with care. For the gray areas of Fig. 3 where there were fewer than 50 data points, the average value was considered unreliable and thus not published.

Fig. 3 displays the typical rent prices for an average apartment in the 39 largest German cities with more than 200,000 inhabitants. It’s important to note that these prices are the typical average rental prices for an apartment in the particular city with the particular square meter size. Higher prices may be justified by additional beneficial features of the apartment, such as a quieter environment, a renovated house or apartment, or close proximity to green spaces of the city.

in different large German cities and sizes of the apartment
II) distribution of the square meter price
While the mean or median of the square meter price is representative of living costs in a particular city, it’s also interesting to examine the distribution of the square meter price for apartments in that city. Fig. 4 shows these distributions for the 10 most expensive cities. In each plot, the distribution of the square meter price for rent in the entire Germany (blue) can be compared to that of the particular city (orange). In Germany overall, the average (median) square meter price for an apartment rental is around 8-9 €/m² per month, but the distribution shows that it’s possible to find offers even for 5-6 €/m². For Munich, however, the mean square meter price is around 22.5 €/m², with most apartments offered between 18-22 €/m². This makes Munich 2.4 times (144%) more expensive to live in than the national average. The distribution in Munich is mostly normal, except for a peak at around 5 €/m², which could be due to social housing.

Fig. 4 also shows that in Freiburg, there is an approximately normal distribution for the square meter price, ranging from 5-25 €/m². However, there is a large amount of expensive apartments between 30-40 €/m², which could be due to new apartment buildings built within the last 10 years. A similar situation can be observed in Berlin, which is generally a cheaper city with most apartments offered between 8-15 €/m². However, there is a strong plateau between 15-22 €/m². This is due to a special legal case applied to landlords in Berlin, where rent prices for buildings built before 2013 are regulated by the state [Link], but this doesn’t apply to buildings built after 2013. This plateau between 15-22 €/m² could be partly due to the impact of this legislation.
III) Conclusion
In conclusion, the rental prices in Germany can be quite high, especially in larger cities like Munich and Frankfurt. While the mean or median square meter price can give an idea of the overall living costs in a particular city, it’s also important to look at the actual distribution of the prices to get a clearer picture of the rental market. In some cities, there may be a large number of expensive apartments due to factors such as new construction or special legislation, while in other cities, there may be more affordable options available. Ultimately, the cost of renting an apartment in Germany can vary widely depending on location, apartment size, and other factors. By understanding the rental market, tenants can make informed decisions and find a home that suits their needs and budget.
Currently, Germany is facing a shrinking demography, and the European Central Bank (ECB) has increased interest rates to counteract Euro inflation. Typically, the housing market is heavily influenced by these two factors. A shrinking demography can result in a surplus of available living space, while increased interest rates make housing loans more expensive and can create difficulties for landlords attempting to refinance their loans. However, the effects on the housing market can be complex and depend on other factors such as the overall state of the economy, the availability of credit, and government policies related to housing. Therefore, it will be interesting to analyze the impact of these factors on rental costs in Germany and throughout Europe in the future. As a result, I will continue to monitor the housing market in Germany and other countries and provide periodic updates on this blog.
If you you like such analyses, please, leave a like and subscribe to this blog.
IV) Appendix
As an appendix you can find the data from Fig. 1 as a sortable table:
| City ▲ ▼ | Inhabitants ▲ ▼ | Number of data points ▲ ▼ | Lower median ▲ ▼ | Total median ▲ ▼ | Upper median ▲ ▼ |
|---|---|---|---|---|---|
| Berlin | 3677472 | 1579 | 10.55 | 14.29 | 21.43 |
| Hamburg | 1853935 | 991 | 12.53 | 16.13 | 20.83 |
| München | 1487708 | 532 | 18.00 | 22.50 | 27.94 |
| Köln | 1073096 | 457 | 12.31 | 15.08 | 19.27 |
| Frankfurt am Main | 759224 | 400 | 13.69 | 16.67 | 20.96 |
| Stuttgart | 626275 | 332 | 14.03 | 16.85 | 20.83 |
| Düsseldorf | 619477 | 379 | 11.43 | 13.58 | 17.27 |
| Leipzig | 601866 | 534 | 8.01 | 9.82 | 11.76 |
| Dortmund | 586852 | 602 | 8.00 | 9.28 | 11.00 |
| Essen | 579432 | 670 | 7.42 | 8.74 | 10.17 |
| Bremen | 563290 | 328 | 9.36 | 11.39 | 13.76 |
| Dresden | 555351 | 819 | 7.81 | 9.45 | 11.77 |
| Hannover | 535932 | 384 | 9.54 | 11.38 | 13.67 |
| Nürnberg | 510632 | 346 | 10.59 | 12.48 | 15.54 |
| Duisburg | 495152 | 430 | 6.67 | 7.90 | 9.61 |
| Bochum | 363441 | 351 | 7.50 | 8.65 | 10.01 |
| Wuppertal | 354572 | 237 | 6.83 | 8.33 | 10.50 |
| Bielefeld | 334002 | 288 | 8.27 | 9.86 | 12.00 |
| Bonn | 331885 | 161 | 10.95 | 13.01 | 15.03 |
| Münster | 317713 | 221 | 10.90 | 13.00 | 16.00 |
| Mannheim | 311831 | 144 | 10.69 | 13.50 | 17.64 |
| Karlsruhe | 306502 | 95 | 11.14 | 12.94 | 17.24 |
| Augsburg | 296478 | 143 | 12.00 | 14.67 | 16.67 |
| Wiesbaden | 278950 | 174 | 11.15 | 13.41 | 16.86 |
| Mönchengladbach | 261001 | 154 | 8.05 | 9.86 | 11.82 |
| Gelsenkirchen | 260126 | 511 | 5.74 | 6.51 | 7.50 |
| Aachen | 249070 | 197 | 9.36 | 11.00 | 14.04 |
| Braunschweig | 248823 | 223 | 8.90 | 10.23 | 12.30 |
| Kiel | 246243 | 210 | 9.62 | 11.66 | 13.58 |
| Chemnitz | 243105 | 1621 | 5.00 | 5.50 | 6.11 |
| Halle (Saale) | 238061 | 91 | 7.35 | 8.06 | 9.57 |
| Magdeburg | 236188 | 730 | 6.01 | 6.71 | 7.71 |
| Freiburg im Breisgau | 231848 | 88 | 12.78 | 15.17 | 20.35 |
| Krefeld | 227050 | 151 | 8.00 | 9.20 | 11.13 |
| Mainz | 217556 | 138 | 12.00 | 14.51 | 17.56 |
| Lübeck | 216277 | 96 | 9.51 | 12.21 | 14.80 |
| Erfurt | 213227 | 272 | 7.65 | 8.53 | 10.01 |
| Oberhausen | 208752 | 115 | 7.00 | 8.42 | 10.62 |
| Rostock | 208400 | 212 | 10.00 | 12.22 | 15.69 |
| Kassel | 200406 | 366 | 8.00 | 9.40 | 12.04 |
| Hagen | 188713 | 1105 | 5.94 | 6.79 | 7.95 |
| Potsdam | 183154 | 80 | 11.04 | 12.99 | 17.76 |
| Saarbrücken | 179634 | 307 | 7.61 | 8.91 | 11.00 |
| Hamm | 179238 | 111 | 7.02 | 8.70 | 11.54 |
| Ludwigshafen am Rhein | 172145 | 83 | 10.53 | 12.22 | 14.17 |
| Mülheim an der Ruhr | 170739 | 81 | 7.74 | 9.12 | 10.85 |
| Oldenburg | 170389 | 256 | 9.33 | 10.89 | 12.79 |
| Osnabrück | 165034 | 96 | 8.54 | 10.03 | 11.85 |
| Leverkusen | 163851 | 79 | 9.05 | 10.46 | 13.02 |
| Darmstadt | 159631 | 69 | 13.49 | 15.62 | 20.50 |
| Heidelberg | 159245 | 51 | 12.22 | 15.56 | 21.56 |
| Solingen | 158957 | 79 | 7.10 | 8.46 | 10.53 |
| Herne | 156621 | 291 | 6.59 | 7.31 | 8.40 |
| Regensburg | 153542 | 154 | 12.29 | 13.85 | 16.40 |
| Neuss | 152731 | 53 | 9.81 | 11.47 | 14.69 |
| Paderborn | 152531 | 183 | 8.29 | 9.97 | 11.88 |
| Ingolstadt | 138016 | 110 | 12.22 | 13.82 | 16.85 |
| Offenbach am Main | 131295 | 101 | 11.06 | 13.97 | 16.17 |
| Fürth | 129122 | 73 | 7.82 | 11.00 | 13.89 |
| Ulm | 126949 | 58 | 8.15 | 12.51 | 16.25 |
| Würzburg | 126933 | 103 | 11.33 | 13.00 | 16.36 |
| Heilbronn | 125613 | 123 | 10.44 | 12.86 | 15.99 |
| Pforzheim | 125529 | 78 | 9.64 | 11.01 | 14.06 |
| Wolfsburg | 123949 | 287 | 8.15 | 9.33 | 11.00 |
| Bottrop | 117311 | 40 | 7.06 | 8.18 | 9.81 |
| Göttingen | 116557 | 145 | 8.87 | 10.62 | 12.85 |
| Reutlingen | 116456 | 25 | 10.75 | 12.67 | 16.33 |
| Koblenz | 113638 | 89 | 8.50 | 9.65 | 12.65 |
| Erlangen | 113292 | 48 | 11.19 | 12.53 | 15.83 |
| Bremerhaven | 113173 | 149 | 6.09 | 7.33 | 9.43 |
| Remscheid | 111770 | 104 | 5.98 | 7.19 | 8.37 |
| Bergisch Gladbach | 111645 | 52 | 10.92 | 12.52 | 14.67 |
| Recklinghausen | 110714 | 99 | 6.00 | 7.01 | 8.82 |
| Trier | 110570 | 167 | 10.00 | 11.54 | 14.11 |
| Jena | 110502 | 171 | 9.63 | 10.06 | 11.82 |
| Moers | 103725 | 55 | 7.20 | 8.75 | 10.98 |
| Salzgitter | 103694 | 124 | 6.00 | 7.26 | 9.72 |
| Siegen | 101516 | 149 | 7.64 | 8.91 | 11.12 |
| Gütersloh | 101158 | 47 | 7.80 | 9.46 | 11.00 |
| Hildesheim | 100319 | 64 | 8.05 | 9.51 | 11.43 |
Amazing analysis!!! Keep it up. Looking forward to your follow up analysis!