Skip to content
Doheon Kim
Go back

Jeonse Safety Recommendation System

April 2026 · Snowflake Hackathon, two-person team

Code
The app showing a fit score of 64.3 out of 100 for one Seoul neighborhood

Demo

The problem

Jeonse is a Korean rental system where the tenant pays a large lump-sum deposit instead of monthly rent and gets it back when the lease ends. If home prices fall below the deposit, the tenant can lose part of it.

Price data for Seoul apartments is easy to find. Judging whether a specific home is safe is left to the renter, and the data needed to judge it is scattered across several sources.

We started with the question “is this home safe?” and changed it within a day to “where would be safer for me?”. A grade on its own, something like “jeonse ratio 78%, grade B”, does not tell a renter what to do next. They need safer options inside their budget and area, and two renters with different tolerance for risk should not get the same ranking.

What the app does

The renter first answers six statements on a five-point scale, such as whether they would accept a longer commute for a safer deposit. The answers place them in one of three profiles: conservative, moderate, or adventurous.

The survey screen with two of the six statements

The six-statement survey that sets the renter’s risk profile.

They then enter the neighborhood they are considering, their deposit, where they commute to, and the apartment size they want. The app scores that neighborhood for them and ranks it against all 288.

Recommendation cards and a bar chart of ranked neighborhoods

Three recommended alternatives, each with the reason it was picked.

A ranked table of neighborhoods with safety grades and scores

The full ranking, with each neighborhood’s safety grade and fit score.

How it is built

Government sale and rent records all 25 Seoul districts, last 24 months Python loader retries failed calls, builds a key per record Snowflake raw tables original records kept as loaded Clean and monthly views median price per neighborhood per month Scoring engine and risk model rule score 80%, model risk 20% Streamlit app survey, recommendations, explanations
How a record travels from the government API to a recommendation.

I built the data loader, the scoring engine, the survey, and the first version of the app. My teammate built the machine learning model, the AI features, and the final interface. The sections below say which is which.

The data loader

The first version of the app, on April 5, read from Snowflake Marketplace data and was hard-coded to three districts. On April 8 I replaced that with a loader that pulls apartment sale and rent records for all 25 districts from the government’s real-estate API. The views the app queries kept the same shape, so the app did not have to change.

The loader walks through every month, district, and page of results. Three decisions shaped it:

On the Snowflake side, the raw tables keep each record as it arrived. A clean layer drops cancelled deals and computes price per unit of floor area. A monthly layer takes the median for each neighborhood and month, and that is what the scoring engine reads.

The scoring engine

The engine first removes neighborhoods that are over budget, outside the search area, too thinly traded to judge, or priced with a jeonse deposit above 90% of the sale price. It then scores what is left.

The components I wrote are:

The risk profile changes how much each component counts. For a conservative renter, loss exposure counts 1.4 times as much as for a moderate one. For an adventurous renter it counts 0.7 times as much.

The final score is 80% this rule-based score and 20% my teammate’s model. My teammate also rewrote how the survey answers map to a profile and normalized the weights.

I also wrote a backtest. For each neighborhood and each starting month, it looks at the following 12 months and records the worst drop and the ending change in jeonse prices, then turns that history into a resilience score. In the final app it only breaks ties and explains why a neighborhood was excluded. It never became a headline number.

The detail view for one neighborhood

The detail view for a single neighborhood.

What my teammate built

My teammate trained a gradient boosting model that estimates the chance of jeonse prices dropping 5% or more within six months (ROC AUC 0.738). They also built the three Snowflake Cortex features, which write plain-language explanations, a market briefing, and answers to free-form questions. They priced neighborhoods by apartment size and redesigned the interface. Their two-pass loading cut the wait for first content from about 15 seconds to under 1.

The market briefing screen

The market briefing, generated with Snowflake Cortex.

What changed along the way

What I would fix next


Previous Project
Betman Predictor
Next Project
Sharefair