Insight into the process (participants and dropouts) to get a TLC driver’s license. A TLC driver’s license is a driver’s license that gives you permission for special transportation in the USA.
Subject of this #FigureFriday: This week’s focus is on data concerning the number of individuals attempting to obtain a special TLC (Taxi and Limousine Commission) driver license for New York City, and at which stages in the process they drop out or get stuck.
“City Taxi and Limousine Commission. The TLC Driver License is required for drivers who wish to transport passengers in a medallion taxi, green taxi (street hail livery), livery car, black car, or luxury limousine.”
I didn’t have much time, but after reviewing the data and reading through related discussions on Reddit, I thought it would be interesting (and insightful) to create a funnel-style visualization showing how people move through the licensing process.
Instead of coding it myself, I handed the task off to AI, Gemini 2.5.
The first prompt already included a lot: details about the dataset, a link to the TLC licensing process, the intended output, and the filters I wanted to apply.
Step 2 involved modifying the prompt to remove time-based filtering and to exclude the dropout branches from the Sankey diagram that occur after each process step.
Used prompt
#SOURCE REDDIT: https://www.reddit.com/r/uberdrivers/comments/4qunum/complete_guide_tlc_licensing_for_nyc_drivers/
#Source datadict: https://data.cityofnewyork.us/Transportation/tlc-application/5tcw-4jtu/about_data
#Step 1: Upgrading DMV license: -
#Step 2: Defensive Driving Course Requirement ['Defensive Driving']
#Step 3: Medical Exam ['Medical Clearance Form']
#Step 4: APPLICATION?
#Step 6: Wheelchair accesss etc course ['WAV Course']
#Step 7: Drug Test => ['Drug Test']
#Step 8: Fingerprints
#Step 9 FRU interview? ['FRU Interview Scheduled'], 'Not applicable' means not needed=>pass.
#Step 10: Final Driver Exam => ['Driver Exam']
#STATUS
#"Incomplete": Your application is missing requirements.
#"Pending Fitness Interview": Your application has been forwarded to the Fitness Review Unit for a Fitness Interview.
#"Denied": Your application has been denied.
#"Under Review": Your application is still being processed.
#"Approved - License Issued": Your application has been approved and your license
#will be mailed to the address provided on your application.
# Allow up to two weeks after approval for delivery.
#I want something like this with on the left applications going in {count by month} => assume a y-m filter, use 2025-01 as default
#on the right, the varius statusses
#on the x-as the decision points where people are
#datastructure ungrouped, type will be a filter, make an all types and selected type view possible
# 0 Type 3334 non-null object
# 1 Status 3334 non-null object
# 2 FRU Interview Scheduled 3334 non-null object
# 3 Drug Test 3334 non-null object
# 4 WAV Course 3334 non-null object
# 5 Defensive Driving 3334 non-null object
# 6 Driver Exam 3334 non-null object
# 7 Medical Clearance Form 3334 non-null object
# 8 Other Requirements 3334 non-null object
# 9 App y-m 3334 non-null period[M]
print(df_raw['Status'].unique())
print(df_raw['FRU Interview Scheduled'].unique())
print(df_raw['Drug Test'].unique())
print(df_raw['WAV Course'].unique())
print(df_raw['Defensive Driving'].unique())
print(df_raw['Driver Exam'].unique())
print(df_raw['Medical Clearance Form'].unique())
print(df_raw['Other Requirements'].unique())
#Order ['Defensive Driving', 'Medical Clearance Form', 'WAV Course', 'Drug Test', 'FRU Interview Scheduled', 'Driver Exam']
#type and y-m are going to be filters
#STEP 2 AFTER THE FIRST RESULT WAS CONFUSING FOR THE USER
#Leave out the months, leave out "not passed, denied etc" flows from the sankey and make it more like a salesfunnel.
Vibe Coding
I called this “vibe coding” because, throughout the process, the only real checkpoint I used for myself was how many people had actually received a date for their health interview. Out of 3,334 applicants, only 6 had an appointment planned instead of passed or failed. I gave those individuals the benefit of the doubt and assumed they were still progressing through the process.
Result
To put the outcome into perspective, I compared my figures with submissions from others working on the same assignment. In the spirit of “everyone can code with AI,” it was interesting to see whether the numbers aligned. Conclusion: they did. But of course, it wasn’t a particularly complex task to begin with.
Demo contains
- Start prompt for a simple dash/plotly app
- Sankey chart
Figure Friday is an initiative from the Dash/Plotly community. Every friday a new dataset is made available with some basic code to show a visual and an explanation of the subject. People are invited to adjust the code and improve the visual or create a small app. The next friday a zoom session takes place where some explain why they made what they made and others can give feedback, all in a constructive and respectful atmosphere. In the thread on the community site people share their visual, code and a demo if possible.