<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mustapha Yusuf</title>
    <description>The latest articles on DEV Community by Mustapha Yusuf (@mustapha8484).</description>
    <link>https://dev.to/mustapha8484</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1882955%2Fc2e67661-0d3c-419f-8bda-0c46df44cad2.png</url>
      <title>DEV Community: Mustapha Yusuf</title>
      <link>https://dev.to/mustapha8484</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mustapha8484"/>
    <language>en</language>
    <item>
      <title>Predicting Socioeconomic Status with Machine Learning: Building an End to End ML App</title>
      <dc:creator>Mustapha Yusuf</dc:creator>
      <pubDate>Mon, 17 Aug 2026 15:18:29 +0000</pubDate>
      <link>https://dev.to/mustapha8484/predicting-socioeconomic-status-with-machine-learning-building-an-end-to-end-ml-app-4ne2</link>
      <guid>https://dev.to/mustapha8484/predicting-socioeconomic-status-with-machine-learning-building-an-end-to-end-ml-app-4ne2</guid>
      <description>&lt;p&gt;Socioeconomic status is at the heart of everything we do in life from healthcare access to education to housing. And historically it has been measured by surveys which are slow, expensive, and prone to self-report bias. For my MSc Data Science dissertation at the University of Hertfordshire, I wanted to explore whether machine learning could be a faster, more scalable alternative to census data.&lt;br&gt;
I used Folktables, an open source Python library that pulls curated, cleaned data directly from the US Census Bureau's American Community Survey. This eliminates a lot of the noise you get with self reported survey data, and it's fully reproducible since anyone can pull the same dataset.&lt;br&gt;
The goal was to predict if an individual's income is above or below 50000 dollars a year, based on age, education level, occupation, hours worked per week, marital status, and sex.&lt;br&gt;
I trained and tuned three classifiers.&lt;br&gt;
Logistic regression as a fast and interpretable baseline. Random forest for a stronger nonlinear model. Gradient Boosting for the best possible predictive performance.&lt;br&gt;
Each was scored in accuracy, precision, recall, F1 score, and AUC ROC. The linear model used Recursive Feature Elimination for feature selection, while the tree based models used feature importance scores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gradient Boosting was the best at 80 percent accuracy and an AUC of 0.88. Random Forest was close with an AUC of 0.87 and Logistic Regression was third at 0.81, as it failed to capture the nonlinear relationships of the data.&lt;/p&gt;

&lt;p&gt;The five most important features of all models were occupation, education level, age, hours worked per week, and sex in line with current sociological research on income inequality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;br&gt;
I didn’t want this to be another notebook that never gets used again. So I built a Flask web app around the final Gradient Boosting model, with a clean interface where anyone can enter a few demographic details and get a real time prediction. It’s deployed on Replit.&lt;br&gt;
The next step is to focus on fairness. Any model for predicting income from demographic data must be very sensitive to bias, especially around protected characteristics. That’s something I’d like to explore further, possibly using the same Folktables framework to test fairness metrics across different demographic groups.&lt;/p&gt;

&lt;p&gt;The full paper is openly published with a DOI through Zenodo and the code is on GitHub if you want to see the methodology or build on it.&lt;/p&gt;

&lt;p&gt;Paper: &lt;a href="https://doi.org/10.5281/zenodo.21963185" rel="noopener noreferrer"&gt;https://doi.org/10.5281/zenodo.21963185&lt;/a&gt;&lt;br&gt;
Code: &lt;a href="https://github.com/Mustaphayinka/Msc_Data_Science_Project" rel="noopener noreferrer"&gt;https://github.com/Mustaphayinka/Msc_Data_Science_Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would really like to talk to anyone working on fairness-aware ML or applied data science more generally. Feedback and critique are welcome.&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>datascience</category>
      <category>python</category>
      <category>flask</category>
    </item>
    <item>
      <title>Why Economists Might Actually Make Better Data Scientists</title>
      <dc:creator>Mustapha Yusuf</dc:creator>
      <pubDate>Mon, 10 Aug 2026 15:42:36 +0000</pubDate>
      <link>https://dev.to/mustapha8484/why-economists-might-actually-make-better-data-scientists-5a0p</link>
      <guid>https://dev.to/mustapha8484/why-economists-might-actually-make-better-data-scientists-5a0p</guid>
      <description>&lt;p&gt;I built a small app called StatMate (getstatmate.com), and while working on it I kept running into the same realization over and over. A lot of data science is econometrics wearing a different name tag. Nobody tells economists this early enough, and I think it's part of why so many of them assume data science is some separate, more advanced world they're not qualified to enter.&lt;/p&gt;

&lt;p&gt;It isn't. It's mostly the same tools with a rebrand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Same math, different vocabulary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you studied economics, you already know linear regression and logistic regression. You just learned them as core parts of econometrics, not as "machine learning algorithms," which is what the data science world calls them. Same equations. Same assumptions. Different label on the box.&lt;/p&gt;

&lt;p&gt;It goes further than that. In economics, when you run a regression, you talk about independent variables and dependent variables. In data science, the exact same thing gets called features and labels, or features and the target variable. It's not a different concept. It's a different dialect for describing the same relationship between inputs and an outcome.&lt;/p&gt;

&lt;p&gt;A few more that trip people up:&lt;/p&gt;

&lt;p&gt;In econometrics you talk about coefficients. In data science, people call the same numbers weights or parameters, especially once you're working with anything beyond a simple regression.&lt;/p&gt;

&lt;p&gt;Economists estimate a model. Data scientists train a model. Same process, fitting a function to data so it predicts well, just described with a different verb.&lt;/p&gt;

&lt;p&gt;Economists check goodness of fit, often with R squared. Data scientists check model performance using accuracy, precision, recall, or other evaluation metrics depending on the problem. Different names, same underlying question: how well does this thing actually predict reality.&lt;/p&gt;

&lt;p&gt;Multicollinearity is a term every economics student learns to fear. In data science, the same problem shows up as feature correlation or redundant features, and it causes the exact same headaches.&lt;/p&gt;

&lt;p&gt;Even overfitting, one of the most talked about problems in machine learning, is something econometrics has dealt with for decades under different framing, usually tied to model specification and out of sample prediction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where economists actually have an edge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the part that gets overlooked. Economists are trained to obsess over causality, not just correlation. Concepts like instrumental variables, difference in differences, and regression discontinuity exist because economists were forced to ask a harder question than "does this predict well." They had to ask "does this actually cause the outcome, or are we fooling ourselves with a pattern in the data."&lt;/p&gt;

&lt;p&gt;A lot of data science, especially outside of causal inference specific work, is comfortable stopping at prediction. Economists are trained to be suspicious of prediction until they've ruled out confounding variables and reverse causality. That instinct alone is worth more than people give it credit for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I think the real issue is that economics students rarely get told, explicitly, that they already have the statistical foundation for data science. They learn regression, hypothesis testing, and causal reasoning inside an economics classroom, then look at a data science job posting and see words like features, labels, and model training, and assume they're starting from zero.&lt;/p&gt;

&lt;p&gt;They're not starting from zero. They're starting from a translation problem.&lt;/p&gt;

&lt;p&gt;If more economists understood that machine learning algorithm often just means regression with a new name, and that a feature is just an independent variable that got renamed somewhere along the way, the field would feel a lot less intimidating to walk into. Data science is broader than econometrics, no argument there, but the core statistical spine underneath a huge amount of it is something economists already know cold.&lt;/p&gt;

&lt;p&gt;That gap between the two vocabularies is part of what pushed me to build StatMate in the first place, something that makes the statistical side of this world less about memorizing new terminology and more about actually understanding what's happening underneath it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If the tools are the actual blocker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Half the time, it's not even the concepts that scare people off. It's the tools. Someone understands regression perfectly well from their economics degree, then opens up a statistical package with a wall of syntax and menus and suddenly feels like a beginner again, even though the stats knowledge was never the problem.&lt;/p&gt;

&lt;p&gt;That's the specific gap I built StatMate (getstatmate.com) to close. If you already get the underlying logic, whether from economics, econometrics, or just self study, and the thing holding you back is fighting with clunky statistical software instead of actually working with your data, it's worth a look. The goal was to strip out the friction and let the statistics speak for themselves instead of getting buried under a difficult interface.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I work on AI training and evaluation, and I built StatMate (getstatmate.com), a tool aimed at making statistical analysis more approachable for people crossing over from fields like economics into data driven work.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>economics</category>
      <category>econometrics</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Why Accuracy Is the Hardest Thing to Get Right When Training AI</title>
      <dc:creator>Mustapha Yusuf</dc:creator>
      <pubDate>Mon, 10 Aug 2026 15:27:52 +0000</pubDate>
      <link>https://dev.to/mustapha8484/why-accuracy-is-the-hardest-thing-to-get-right-when-training-ai-5c34</link>
      <guid>https://dev.to/mustapha8484/why-accuracy-is-the-hardest-thing-to-get-right-when-training-ai-5c34</guid>
      <description>&lt;p&gt;I've spent the last while evaluating AI model outputs as part of training and fine tuning work, and if there's one thing that surprised me, it's this: accuracy breaks more often than anything else, and it breaks in ways that are easy to miss if you're not paying close attention.&lt;/p&gt;

&lt;p&gt;When you evaluate AI responses at scale, you're usually working against a handful of core criteria. In my case it came down to four: accuracy, efficiency and instruction following. Each one sounds simple on paper. In practice, they pull against each other constantly, and accuracy is the one that quietly fails the most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem with "sounding right"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A model can produce a response that reads as confident, well structured, and fluent, while being factually wrong or subtly off. This is the part that's hard to explain to anyone who hasn't sat with hundreds of outputs and had to mark them line by line. The model isn't lying. It's pattern matching its way to something plausible. And plausible is not the same as correct.&lt;/p&gt;

&lt;p&gt;What I noticed reviewing output after output is that accuracy failures rarely look like obvious mistakes. They look like small, confident errors buried inside otherwise solid answers. A slightly wrong number in a calculation. A citation that sounds real but isn't. A code snippet that runs but solves a subtly different problem than the one asked. These are the failures that are easy to approve if you're moving fast, and that's exactly why careful evaluation matters so much.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instruction following versus accuracy: a real tension&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One thing that took me longer to appreciate is how instruction following and accuracy can actually work against each other. A model that follows instructions rigidly might produce an answer that technically does what was asked, while ignoring context that would have made the answer actually useful or correct. On the flip side, a model trying too hard to be "accurate" or thorough sometimes drifts away from what was actually requested.&lt;/p&gt;

&lt;p&gt;Getting both right at once, doing exactly what was asked while also being factually solid, turned out to be one of the harder things to consistently reward during evaluation. It's not a binary pass or fail. It's a judgment call, every single time, and that judgment call is where a lot of the real work in AI training actually happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Efficiency is not a nice to have&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Efficiency gets talked about less than accuracy, but it matters more than people assume. A response can be accurate and still be a bad response if it buries the answer inside three paragraphs of padding. Part of evaluating AI output well is recognizing when a model is technically correct but has failed to actually communicate that correctness clearly. Rewarding concise, direct answers over long winded ones is its own skill, and it's one that directly shapes how useful a model feels in practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this taught me&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If I had to summarize the biggest lesson from this work, it's that accuracy in AI systems isn't a single checkbox. It's the result of dozens of small, careful judgment calls made consistently over time by people who are willing to slow down and actually read the output in front of them rather than skim for a vibe. The models that improve are the ones being evaluated by people who catch the quiet failures, not just the obvious ones.&lt;/p&gt;

&lt;p&gt;It's easy to assume AI training is mostly a technical, automated process. A meaningful part of it is still human judgment, applied one response at a time, and accuracy is where that judgment is tested the most.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I work on AI model evaluation and training, focused on output quality across accuracy, instruction following, and efficiency. Always interested in conversations with others doing similar work.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>I built a free tool that runs real regressions for students who can't afford Stata</title>
      <dc:creator>Mustapha Yusuf</dc:creator>
      <pubDate>Tue, 28 Jul 2026 17:34:21 +0000</pubDate>
      <link>https://dev.to/mustapha8484/i-built-a-free-tool-that-runs-real-regressions-for-students-who-cant-afford-stata-9k</link>
      <guid>https://dev.to/mustapha8484/i-built-a-free-tool-that-runs-real-regressions-for-students-who-cant-afford-stata-9k</guid>
      <description>&lt;p&gt;A few months ago I started building something small and it's turned into the most useful thing I've shipped in a while, so I wanted to write up how it actually works, since a lot of the interesting decisions were in what I &lt;em&gt;didn't&lt;/em&gt; build rather than what I did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem, briefly
&lt;/h2&gt;

&lt;p&gt;When I was doing my economics degree, a good chunk of the class either couldn't afford Stata or EViews, or had it installed and running but genuinely didn't understand what the output meant. Durbin-Watson, Breusch-Pagan, VIF — these get taught for maybe one lecture and then you're expected to just know how to read them for the rest of your degree. And your supervisor has thirty other students, so they can't sit with you through every regression you run.&lt;/p&gt;

&lt;p&gt;So I built GetStatMate. You upload your data, tell it what you're testing (does X affect Y, a yes/no outcome, or something over time), it runs the actual statistical test, and it explains what came out in plain English instead of just spitting numbers at you.&lt;/p&gt;

&lt;p&gt;It's live at &lt;a href="https://getstatmate.com" rel="noopener noreferrer"&gt;getstatmate.com&lt;/a&gt; and the code's on &lt;a href="https://github.com/Mustaphayinka/statmate" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; if you want to poke at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;Frontend's just HTML, JS, and Tailwind, sitting on Netlify. Backend's FastAPI on Render, and the actual statistics run through &lt;code&gt;statsmodels&lt;/code&gt;, not anything I wrote myself. That last part matters more than it sounds — I'll get to why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I actually spent time on: not letting anything guess a number
&lt;/h2&gt;

&lt;p&gt;Here's the decision that shaped basically everything else about the project. When I got to the part where GetStatMate explains the results in plain economic language, the obvious move is to throw the numbers at an LLM and ask it to write something nice.&lt;/p&gt;

&lt;p&gt;I didn't do that. Every explanation is built from a template engine with conditional logic — check the R-squared band, check which p-value threshold a coefficient falls under, check which diagnostics failed — and stitch together sentences from that. No language model touches the actual interpretation.&lt;/p&gt;

&lt;p&gt;Why. Because an LLM narrating freely can restate a coefficient slightly wrong and sound completely confident doing it. For a tool students are trusting with an actual grade, "confidently wrong" is worse than "boring but correct." The template can only ever say what its logic explicitly allows, built directly off numbers that already came out of a real regression. It literally cannot invent a result.&lt;/p&gt;

&lt;p&gt;A snippet of what that looks like, since code's more honest than a description:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_sig_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not testable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;significant at the 1% level&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;significant at the 5% level&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;significant at the 10% level&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not statistically significant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing clever. That's the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling three different kinds of questions
&lt;/h2&gt;

&lt;p&gt;Students don't all need the same test. So the question type a student picks routes to a genuinely different engine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Does X affect Y" → OLS, with the full diagnostic battery (Breusch-Pagan for heteroskedasticity, VIF for multicollinearity, Durbin-Watson for autocorrelation, Jarque-Bera for normality)&lt;/li&gt;
&lt;li&gt;"Does X affect the probability of Y" → logistic regression, reporting odds ratios and a pseudo R-squared instead of the OLS diagnostics, which don't apply here&lt;/li&gt;
&lt;li&gt;"Does X affect Y over time" → runs an Augmented Dickey-Fuller stationarity test on every variable &lt;em&gt;before&lt;/em&gt; the regression, because regressing one trending series on another gives you a spurious, meaningless R-squared that looks great and means nothing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is probably the thing I'm proudest of getting right. It's an easy mistake for a student to make and a genuinely common one in real undergrad time-series projects — running a regression on two things that are both just trending upward and mistaking the fit for a real relationship.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks, and how I handle it breaking
&lt;/h2&gt;

&lt;p&gt;Early versions of this just let a raw exception surface if someone picked a text column as their Y variable, or picked the same column for both X and Y. That's a bad experience for a non-technical user, so the validation layer now catches these specifically and returns a plain sentence instead of a stack trace — "this column contains text, not numbers" rather than a &lt;code&gt;ValueError&lt;/code&gt; traceback.&lt;/p&gt;

&lt;p&gt;There's also a genuinely fun one: when X variables are perfectly correlated, &lt;code&gt;statsmodels&lt;/code&gt; throws a &lt;code&gt;LinAlgError&lt;/code&gt; because the underlying matrix becomes singular. Caught that one specifically too, since it's a real and common student mistake, not a bug in my code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Getting real students and lecturers to actually use it and tell me what's broken matters more right now than adding features. I've got a WhatsApp reply I'm hoping for from my department head, and I posted this on LinkedIn hoping a few coursemates mid-project would try it on real data.&lt;/p&gt;

&lt;p&gt;Longer term: panel data support, cointegration testing for the time series path, and probably a downloadable report format so the output can go straight into an actual project write-up instead of living only on screen.&lt;/p&gt;

&lt;p&gt;If you're a student, a lecturer, or just enjoy seeing what other people build, I'd genuinely like feedback: &lt;a href="https://getstatmate.com" rel="noopener noreferrer"&gt;getstatmate.com&lt;/a&gt;, repo's &lt;a href="https://github.com/Mustaphayinka/statmate" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
