{
  "source_file": "0930",
  "source_platform": "Dev.to",
  "author": "Bala Priya C",
  "title_listed": "Descriptive Statistics with Python for Beginner Data Scientists",
  "keywords": "",
  "domain": "文本处理",
  "content_type": "深度技术解析",
  "is_paid_flag": "否",
  "url": "https://dev.to/balapriya/descriptive-statistics-with-python-for-beginner-data-scientists-1001",
  "publish_date": "2026-03-11",
  "corpus_stage": "",
  "notes": "",
  "id": "e28623cf0d93",
  "collected_at": "2026-10-02T14:01:15",
  "title": "Descriptive Statistics with Python for Beginner Data Scientists - DEV Community",
  "body_markdown": "You've probably heard that data scientists spend most of their time cleaning and exploring data... not building fancy models. That's true, and\ndescriptive statistics\nis the foundation of that exploration.\nBefore you can ask \"what does this data predict?\", you need to ask \"what does this data\nlook\nlike?\" Descriptive statistics gives you the tools to answer that. It tells you where your data is centered, how spread out it is, and whether it's shaped in a way that might cause problems for the models you'll build later.\nIn this article, you'll work through the core concepts of descriptive statistics using Python,\npandas\n, and\nmatplotlib\n. Along the way you'll build intuition — not just know which function to call, but understand what the numbers are actually telling you.\nIf you'd like, you can follow along with the\nGoogle Colab notebook\n.\nPrerequisites\nBefore reading this article, you should be comfortable with:\nBasic Python (variables, lists, loops, functions)\nWhat a DataFrame is in\npandas\n(you don't need to be an expert; knowing\npd.DataFrame()\nand\ndf.head()\nis enough)\nInstalling packages with\npip\nYou do\nnot\nneed any prior statistics knowledge. We'll build everything from scratch.\nTable of Contents\nWhat Is Descriptive Statistics?\nThe Dataset\nMeasures of Central Tendency — Mean and Median\nMeasures of Spread — Std Dev, Variance, IQR\nThe Five-Number Summary\nSkewness — Is Your Distribution Symmetric?\nPutting It All Together\nWhich Chart for Which Job?\nSummary\nWhat Is Descriptive Statistics?\nDescriptive statistics is the practice of\nsummarizing and describing the features of a dataset\n. Unlike inferential statistics — which draws conclusions about a larger population from a sample — descriptive statistics just tells you about the data you actually have in front of you.\nThink of it this way: if a colleague hands you a spreadsheet of 10,000 sales transactions and asks \"what do you see?\", you can't read every row. Descriptive statistics is how you compress that spreadsheet into a handful of numbers that tell the real story.\nThere are three categories of descriptive statistics you'll use often:\nCategory\nWhat it answers\nExamples\nCentral tendency\nWhere is the \"middle\" of my data?\nmean, median, mode\nSpread / variability\nHow spread out is the data?\nvariance, std dev, range, IQR\nShape\nWhat does the distribution look like?\nskewness, kurtosis\nLet's work through each one.\nThe Dataset\nWe'll use sales records from 12 retail store branches across a single quarter. Each row represents one branch's performance: total revenue, units sold, and product return rate.\nThis is small enough to reason about by hand but realistic enough to make the statistics meaningful.\nimport\npandas\nas\npd\nimport\nnumpy\nas\nnp\nimport\nmatplotlib.pyplot\nas\nplt\ndata\n=\n{\n\"\nbranch\n\"\n:\n[\n\"\nAtlanta\n\"\n,\n\"\nBoston\n\"\n,\n\"\nChicago\n\"\n,\n\"\nDallas\n\"\n,\n\"\nDenver\n\"\n,\n\"\nHouston\n\"\n,\n\"\nMiami\n\"\n,\n\"\nNashville\n\"\n,\n\"\nPhoenix\n\"\n,\n\"\nPortland\n\"\n,\n\"\nSeattle\n\"\n,\n\"\nTampa\n\"\n],\n\"\nrevenue_usd\n\"\n:\n[\n142000\n,\n198000\n,\n175000\n,\n161000\n,\n134000\n,\n189000\n,\n210000\n,\n123000\n,\n155000\n,\n168000\n,\n202000\n,\n139000\n],\n\"\nunits_sold\n\"\n:\n[\n940\n,\n1280\n,\n1105\n,\n1020\n,\n870\n,\n1190\n,\n1340\n,\n790\n,\n985\n,\n1060\n,\n1295\n,\n855\n],\n\"\nreturn_rate_pct\n\"\n:\n[\n3.1\n,\n2.4\n,\n2.9\n,\n4.2\n,\n3.8\n,\n2.1\n,\n1.9\n,\n5.1\n,\n3.4\n,\n2.7\n,\n2.2\n,\n4.6\n]\n}\ndf\n=\npd\n.\nDataFrame\n(\ndata\n)\nprint\n(\ndf\n.\nhead\n())\nEnter fullscreen mode\nExit fullscreen mode\nOutput:\nbranch  revenue_usd  units_sold  return_rate_pct\n0  Atlanta       142000         940              3.1\n1   Boston       198000        1280              2.4\n2  Chicago       175000        1105              2.9\n3   Dallas       161000        1020              4.2\n4   Denver       134000         870              3.8\nEnter fullscreen mode\nExit fullscreen mode\nMeasures of Central Tendency\nCentral tendency tells you the \"typical\" value in your data — the value around which everything else clusters.\nMean\nThe mean is the sum of all values divided by the count. It's the most commonly used measure of center, but it has a weakness: it is sensitive to outliers.\nIf one branch had a super good quarter at $900,000, the mean would shoot up and no longer represent the typical branch.\nMedian\nThe median is the middle value when your data is sorted. Half the values fall below it, half above.\nBecause it only cares about position — and\nnot\nmagnitude — extreme values don't move it. This makes it more\nrobust\nthan the mean.\nA useful rule of thumb:\nif mean ≠ median, something interesting is going on.\nIt could be outliers, skewness, or both.\nLet's compute both:\nrevenue\n=\ndf\n[\n\"\nrevenue_usd\n\"\n]\nmean_rev\n=\nrevenue\n.\nmean\n()\nmedian_rev\n=\nrevenue\n.\nmedian\n()\nprint\n(\nf\n\"\nMean revenue:   $\n{\nmean_rev\n:\n,.\n0\nf\n}\n\"\n)\nprint\n(\nf\n\"\nMedian revenue: $\n{\nmedian_rev\n:\n,.\n0\nf\n}\n\"\n)\nEnter fullscreen mode\nExit fullscreen mode\nOutput:\nMean revenue:   $166,333\nMedian revenue: $164,500\nEnter fullscreen mode\nExit fullscreen mode\nThe two values are close — only $1,833 apart. That tells us no single branch is substantially distorting the average. The data is reasonably balanced.\nVisualizing Mean vs Median\nA bar chart with reference lines is the clearest way to see this relationship in action. Bars below the mean are colored blue, above it green, so you can immediately see which branches are performing above and below average.\nfig\n,\nax\n=\nplt\n.\nsubplots\n(\nfigsize\n=\n(\n10\n,\n5\n))\ncolors\n=\n[\n\"\n#4a90d9\n\"\nif\nv\n<\nmean_rev\nelse\n\"\n#2ecc71\n\"\nfor\nv\nin\ndf\n[\n\"\nrevenue_usd\n\"\n]]\nax\n.\nbar\n(\ndf\n[\n\"\nbranch\n\"\n],\ndf\n[\n\"\nrevenue_usd\n\"\n]\n/\n1000\n,\ncolor\n=\ncolors\n,\nedgecolor\n=\n\"\nwhite\n\"\n,\nlinewidth\n=\n0.8\n)\nax\n.\naxhline\n(\nmean_rev\n/\n1000\n,\ncolor\n=\n\"\n#e74c3c\n\"\n,\nlinewidth\n=\n2\n,\nlinestyle\n=\n\"\n--\n\"\n,\nlabel\n=\nf\n\"\nMean: $\n{\nmean_rev\n/\n1000\n:\n.\n0\nf\n}\nk\n\"\n)\nax\n.\naxhline\n(\nmedian_rev\n/\n1000\n,\ncolor\n=\n\"\n#f39c12\n\"\n,\nlinewidth\n=\n2\n,\nlinestyle\n=\n\"\n-.\n\"\n,\nlabel\n=\nf\n\"\nMedian: $\n{\nmedian_rev\n/\n1000\n:\n.\n0\nf\n}\nk\n\"\n)\nax\n.\nset_title\n(\n\"\nQ3 Revenue by Branch with Mean and Median\n\"\n,\nfontsize\n=\n14\n,\nfontweight\n=\n\"\nbold\n\"\n)\nax\n.\nset_xlabel\n(\n\"\nBranch\n\"\n)\nax\n.\nset_ylabel\n(\n\"\nRevenue (USD thousands)\n\"\n)\nax\n.\nlegend\n()\nax\n.\ntick_params\n(\naxis\n=\n\"\nx\n\"\n,\nrotation\n=\n45\n)\nplt\n.\ntight_layout\n()\nplt\n.\nsavefig\n(\n\"\nrevenue_central_tendency.png\n\"\n,\ndpi\n=\n150\n)\nplt\n.\nshow\n()\nEnter fullscreen mode\nExit fullscreen mode\nOutput:\nIn the above dataset, Nashville is the branch with the lowest sales. Miami, Boston, and Seattle lead. The two reference lines sitting almost on top of each other confirms:\nno outlier is pulling the average off-center\n.\nMeasures of Spread\nTwo datasets can have identical means and still look completely different. One might have all values clustered tightly around the center; another might be all over the place. Measures of spread capture that difference.\nStandard Deviation\nStandard deviation tells you the\ntypical distance of a data point from the mean\n. A small std dev means values are packed tightly together. A large one means they're spread out widely.\nIt's expressed in the same units as your data — dollars here — which makes it easy to interpret directly.\nVariance\nVariance is the square of the standard deviation. It's used heavily in statistical formulas behind the scenes, but its units are squared (dollars²), which makes it awkward to communicate. Day-to-day, stick with std dev.\nRange and IQR\nThe\nrange\n(max − min) is simple but not quite robust because one extreme value changes it completely.\nThe\nIQR (interquartile range)\nis the distance between the 25th and 75th percentiles. It describes the spread of the\nmiddle 50%\nof your data. Because it ignores the top and bottom 25%, it's resistant to outliers — just like the median.\nstd_rev\n=\nrevenue\n.\nstd\n()\nvar_rev\n=\nrevenue\n.\nvar\n()\nrange_rev\n=\nrevenue\n.\nmax\n()\n-\nrevenue\n.\nmin\n()\niqr_rev\n=\nrevenue\n.\nquantile\n(\n0.75\n)\n-\nrevenue\n.\nquantile\n(\n0.25\n)\nprint\n(\nf\n\"\nStd deviation: $\n{\nstd_rev\n:\n,.\n0\nf\n}\n\"\n)\nprint\n(\nf\n\"\nVariance:      $\n{\nvar_rev\n:\n,.\n0\nf\n}\n\"\n)\nprint\n(\nf\n\"\nRange:         $\n{\nrange_rev\n:\n,.\n0\nf\n}\n\"\n)\nprint\n(\nf\n\"\nIQR:           $\n{\niqr_rev\n:\n,.\n0\nf\n}\n\"\n)\nEnter fullscreen mode\nExit fullscreen mode\nOutput:\nStd deviation: $28,908\nVariance:      $835,696,970\nRange:         $87,000\nIQR:           $50,000\nEnter fullscreen mode\nExit fullscreen mode\nThe typical branch deviates from the mean by about $29k. The middle 50% of branches span a $50k revenue range. These are the numbers you'd quote in a report. The variance of $831 million — while mathematically correct — would confuse anyone you hand it to.\nVisualizing Spread: The Box Plot\nThe box plot helps visualize the spread of the data. It encodes five numbers in one chart:\nthe minimum, Q1, median, Q3, and maximum\n.\nThe box represents the IQR.\nThe line inside the box is the median. Points beyond the whiskers are potential outliers.\nfig\n,\naxes\n=\nplt\n.\nsubplots\n(\n1\n,\n3\n,\nfigsize\n=\n(\n12\n,\n5\n))\ncols\n=\n[\n\"\nrevenue_usd\n\"\n,\n\"\nunits_sold\n\"\n,\n\"\nreturn_rate_pct\n\"\n]\nlabels\n=\n[\n\"\nRevenue (USD)\n\"\n,\n\"\nUnits Sold\n\"\n,\n\"\nReturn Rate (%)\n\"\n]\ncolors\n=\n[\n\"\n#4a90d9\n\"\n,\n\"\n#2ecc71\n\"\n,\n\"\n#e67e22\n\"\n]\nfor\nax\n,\ncol\n,\nlabel\n,\ncolor\nin\nzip\n(\naxes\n,\ncols\n,\nlabels\n,\ncolors\n):\nbp\n=\nax\n.\nboxplot\n(\ndf\n[\ncol\n],\npatch_artist\n=\nTrue\n,\nwidths\n=\n0.5\n,\nmedianprops\n=\ndict\n(\ncolor\n=\n\"\nblack\n\"\n,\nlinewidth\n=\n2\n))\nbp\n[\n\"\nboxes\n\"\n][\n0\n].\nset_facecolor\n(\ncolor\n)\nbp\n[\n\"\nboxes\n\"\n][\n0\n].\nset_alpha\n(\n0.7\n)\nax\n.\nset_title\n(\nlabel\n,\nfontsize\n=\n12\n,\nfontweight\n=\n\"\nbold\n\"\n)\nax\n.\nset_xticks\n([])\nplt\n.\nsuptitle\n(\n\"\nSpread of Key Metrics Across Branches\n\"\n,\nfontsize\n=\n14\n,\nfontweight\n=\n\"\nbold\n\"\n,\ny\n=\n1.02\n)\nplt\n.\ntight_layout\n()\nplt\n.\nsavefig\n(\n\"\nboxplots_spread.png\n\"\n,\ndpi\n=\n150\n)\nplt\n.\nshow\n()\nEnter fullscreen mode\nExit fullscreen mode\nOutput:\nThe Five-Number Summary\nThe\nfive-number summary\n— min, Q1, median, Q3, max — gives you a compact, complete picture of a column's spread. In pandas,\ndescribe()\ngives you this plus the mean and standard deviation for every numeric column at once.\nMake this the first thing you run on any new dataset:\nprint\n(\ndf\n[[\n\"\nrevenue_usd\n\"\n,\n\"\nunits_sold\n\"\n,\n\"\nreturn_rate_pct\n\"\n]].\ndescribe\n().\nround\n(\n2\n))\nEnter fullscreen mode\nExit fullscreen mode\nOutput:\nrevenue_usd  units_sold  return_rate_pct\ncount        12.00       12.00            12.00\nmean     166333.33     1060.83             3.20\nstd       28908.42      184.29             1.04\nmin      123000.00      790.00             1.90\n25%      141250.00      922.50             2.35\n50%      164500.00     1040.00             3.00\n75%      191250.00     1212.50             3.90\nmax      210000.00     1340.00             5.10\nEnter fullscreen mode\nExit fullscreen mode\nA few things stand out:\nThe return rate range (1.9% to 5.1%) is wide relative to its mean of 3.2%\nRevenue mean ($166k) and median ($164.5k) are close — no major outlier distortion\nThe\ncount\nrow is your quick data quality check: if any column shows fewer rows than expected, you have missing data\nSkewness\nSkewness measures whether your distribution is symmetric around the mean or has a longer \"tail\" pulling to one side.\nSkewness ≈ 0\n— roughly symmetric; the normal distribution is the classic example\nSkewness > 0\n— right-skewed; a few very high values stretch the tail to the right\nSkewness < 0\n— left-skewed; a few very low values stretch the tail to the left\nWhy does this matter? Many statistical tests — and some machine learning algorithms — assume your data is roughly symmetric. If it isn't, results can be unreliable. Knowing skewness early lets you decide whether to transform the data before going further.\nfor\ncol\nin\n[\n\"\nrevenue_usd\n\"\n,\n\"\nunits_sold\n\"\n,\n\"\nreturn_rate_pct\n\"\n]:\nskew\n=\ndf\n[\ncol\n].\nskew\n()\nprint\n(\nf\n\"\n{\ncol\n:\n<\n25\n}\nskewness =\n{\nskew\n:\n.\n3\nf\n}\n\"\n)\nEnter fullscreen mode\nExit fullscreen mode\nOutput:\nrevenue_usd               skewness = 0.095\nunits_sold                skewness = 0.167\nreturn_rate_pct           skewness = 0.549\nEnter fullscreen mode\nExit fullscreen mode\nVisualizing Skewness: The Histogram\nHistograms are the best way to\nsee\nskewness. The shape of the bars tells you where data clusters and where it trails off. Overlaying the mean and median makes the direction of any skew immediately visible — when they're apart, the tail is on the side of the mean.\nfig\n,\naxes\n=\nplt\n.\nsubplots\n(\n1\n,\n3\n,\nfigsize\n=\n(\n13\n,\n4\n))\ncols\n=\n[\n\"\nrevenue_usd\n\"\n,\n\"\nunits_sold\n\"\n,\n\"\nreturn_rate_pct\n\"\n]\nlabels\n=\n[\n\"\nRevenue (USD)\n\"\n,\n\"\nUnits Sold\n\"\n,\n\"\nReturn Rate (%)\n\"\n]\ncolors\n=\n[\n\"\n#4a90d9\n\"\n,\n\"\n#2ecc71\n\"\n,\n\"\n#e67e22\n\"\n]\nfor\nax\n,\ncol\n,\nlabel\n,\ncolor\nin\nzip\n(\naxes\n,\ncols\n,\nlabels\n,\ncolors\n):\nax\n.\nhist\n(\ndf\n[\ncol\n],\nbins\n=\n6\n,\ncolor\n=\ncolor\n,\nedgecolor\n=\n\"\nwhite\n\"\n,\nlinewidth\n=\n0.8\n,\nalpha\n=\n0.85\n)\nmean_val\n=\ndf\n[\ncol\n].\nmean\n()\nmedian_val\n=\ndf\n[\ncol\n].\nmedian\n()\nax\n.\naxvline\n(\nmean_val\n,\ncolor\n=\n\"\n#e74c3c\n\"\n,\nlinestyle\n=\n\"\n--\n\"\n,\nlinewidth\n=\n1.8\n,\nlabel\n=\n\"\nMean\n\"\n)\nax\n.\naxvline\n(\nmedian_val\n,\ncolor\n=\n\"\nblack\n\"\n,\nlinestyle\n=\n\"\n-.\n\"\n,\nlinewidth\n=\n1.8\n,\nlabel\n=\n\"\nMedian\n\"\n)\nskew_val\n=\ndf\n[\ncol\n].\nskew\n()\nax\n.\nset_title\n(\nf\n\"\n{\nlabel\n}\n\\n\nskew =\n{\nskew_val\n:\n.\n3\nf\n}\n\"\n,\nfontsize\n=\n11\n,\nfontweight\n=\n\"\nbold\n\"\n)\nax\n.\nlegend\n(\nfontsize\n=\n9\n)\nplt\n.\nsuptitle\n(\n\"\nHistograms with Mean vs Median — Detecting Skewness\n\"\n,\nfontsize\n=\n13\n,\nfontweight\n=\n\"\nbold\n\"\n,\ny\n=\n1.03\n)\nplt\n.\ntight_layout\n()\nplt\n.\nsavefig\n(\n\"\nhistograms_skewness.png\n\"\n,\ndpi\n=\n150\n)\nplt\n.\nshow\n()\nEnter fullscreen mode\nExit fullscreen mode\nOutput:\nLook at the return rate panel on the right. The mean (red dashed line) sits to the right of the median (black dash-dot). That gap is the visual fingerprint of positive skew. Revenue and units sold, by contrast, are not as skewed.\nPutting It All Together\nHere's a reusable function that prints the key descriptive stats for any numeric column:\ndef\nsummarize\n(\nseries\n,\nlabel\n):\nprint\n(\nf\n\"\n\\n\n──\n{\nlabel\n}\n──\n\"\n)\nprint\n(\nf\n\"\nMean:\n{\nseries\n.\nmean\n()\n:\n>\n10.2\nf\n}\n\"\n)\nprint\n(\nf\n\"\nMedian:\n{\nseries\n.\nmedian\n()\n:\n>\n10.2\nf\n}\n\"\n)\nprint\n(\nf\n\"\nStd Dev:\n{\nseries\n.\nstd\n()\n:\n>\n10.2\nf\n}\n\"\n)\nprint\n(\nf\n\"\nIQR:\n{\nseries\n.\nquantile\n(\n0.75\n)\n-\nseries\n.\nquantile\n(\n0.25\n)\n:\n>\n10.2\nf\n}\n\"\n)\nprint\n(\nf\n\"\nSkew:\n{\nseries\n.\nskew\n()\n:\n>\n10.3\nf\n}\n\"\n)\nsummarize\n(\ndf\n[\n\"\nrevenue_usd\n\"\n],\n\"\nRevenue (USD)\n\"\n)\nsummarize\n(\ndf\n[\n\"\nunits_sold\n\"\n],\n\"\nUnits Sold\n\"\n)\nsummarize\n(\ndf\n[\n\"\nreturn_rate_pct\n\"\n],\n\"\nReturn Rate (%)\n\"\n)\nEnter fullscreen mode\nExit fullscreen mode\nOutput:\n── Revenue (USD) ──\n  Mean:     166333.33\n  Median:   164500.00\n  Std Dev:   28908.42\n  IQR:       50000.00\n  Skew:         0.095\n\n── Units Sold ──\n  Mean:       1060.83\n  Median:     1040.00\n  Std Dev:     184.29\n  IQR:         290.00\n  Skew:         0.167\n\n── Return Rate (%) ──\n  Mean:          3.20\n  Median:        3.00\n  Std Dev:       1.04\n  IQR:           1.55\n  Skew:         0.549\nEnter fullscreen mode\nExit fullscreen mode\nDrop this function into any exploratory notebook and run it on every column before you analyze the data further.\nWhich Chart for Which Job?\nHere's an overview of which chart you should use:\nWhat you want to show\nBest chart\nKey method\nDistribution shape and skewness\nHistogram\nax.hist()\nSpread, median, and outliers\nBox plot\nax.boxplot()\nComparing values across categories\nBar chart\nax.bar()\nMean vs median on a bar chart\nBar + reference lines\nax.axhline()\nSummary\nConcept\nWhat it tells you\npandas method\nMean\nAverage value\n.mean()\nMedian\nMiddle value — outlier-robust\n.median()\nStd deviation\nTypical distance from the mean\n.std()\nIQR\nSpread of the middle 50%\n.quantile()\nSkewness\nSymmetry of the distribution\n.skew()\nFive-number summary\nFull spread at a glance\n.describe()\nWhat's Next?\nIn this article you learned to describe your data with numbers and charts. But there's a deeper question behind all of this:\nwhy\ndo values cluster and spread the way they do? The answer lies in\nprobability distributions\n, and that's exactly what we'll cover in the next article in this series.",
  "metadata": {
    "title": "Descriptive Statistics with Python for Beginner Data Scientists - DEV Community",
    "description": "You've probably heard that data scientists spend most of their time cleaning and exploring data...... Tagged with python, statistics.",
    "keywords": "python, statistics, software, coding, development, engineering, inclusive, community",
    "author": null,
    "og:type": "article",
    "og:url": "https://dev.to/balapriya/descriptive-statistics-with-python-for-beginner-data-scientists-1001",
    "og:title": "Descriptive Statistics with Python for Beginner Data Scientists",
    "og:description": "You've probably heard that data scientists spend most of their time cleaning and exploring data......",
    "og:site_name": "DEV Community",
    "og:image": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymjgilqxq18hmw1kye7t.png",
    "twitter:site": "@thepracticaldev",
    "twitter:creator": "@",
    "twitter:title": "Descriptive Statistics with Python for Beginner Data Scientists",
    "twitter:description": "You've probably heard that data scientists spend most of their time cleaning and exploring data......",
    "twitter:card": "summary_large_image",
    "twitter:widgets:new-embed-design": "on",
    "twitter:image:src": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymjgilqxq18hmw1kye7t.png"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/e28623cf0d93/code/body-000.txt",
      "chars": 713,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-001.txt",
      "chars": 318,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-002.txt",
      "chars": 176,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-003.txt",
      "chars": 50,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-004.txt",
      "chars": 788,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-005.txt",
      "chars": 321,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-006.txt",
      "chars": 97,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-007.txt",
      "chars": 733,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-008.txt",
      "chars": 80,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-009.txt",
      "chars": 432,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-010.txt",
      "chars": 133,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-011.txt",
      "chars": 129,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-012.txt",
      "chars": 1008,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-013.txt",
      "chars": 483,
      "language": "text"
    },
    {
      "file": "attachments/e28623cf0d93/code/body-014.txt",
      "chars": 391,
      "language": "text"
    }
  ],
  "images": [
    {
      "status": "ok",
      "url": "https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foz11ruajxji1gr5e4ead.png",
      "bytes": 53082,
      "reused": true,
      "local_path": "attachments/e28623cf0d93/images/002.png",
      "src": "https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foz11ruajxji1gr5e4ead.png",
      "alt": "Q3 Revenue by Branch with Mean and Median",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukljuwjcfg5qxyml61dg.png",
      "bytes": 30228,
      "reused": true,
      "local_path": "attachments/e28623cf0d93/images/003.png",
      "src": "https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukljuwjcfg5qxyml61dg.png",
      "alt": "Three side-by-side box plots. Revenue (blue) and Units Sold (green) have compact symmetric boxes with the median near the center. Return Rate (orange) has an asymmetric box skewed upward",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxrmvapi04soevzhe9w6.png",
      "bytes": 56066,
      "reused": true,
      "local_path": "attachments/e28623cf0d93/images/004.png",
      "src": "https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxrmvapi04soevzhe9w6.png",
      "alt": "Three histograms side by side. ",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://github.com/balapriyac/python-basics/blob/main/stats-with-python/stats_with_python_1.ipynb",
      "label": "Google Colab notebook",
      "type": "a"
    },
    {
      "href": "https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foz11ruajxji1gr5e4ead.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukljuwjcfg5qxyml61dg.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxrmvapi04soevzhe9w6.png",
      "label": "",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:49:07Z",
  "source_url": "https://dev.to/balapriya/descriptive-statistics-with-python-for-beginner-data-scientists-1001",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 15701,
  "expected_body_images": 3,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/e28623cf0d93/pages/source.html",
  "local_html": "attachments/e28623cf0d93/pages/article.html",
  "body_base_path": "attachments/e28623cf0d93/pages/",
  "body_markdown_path": "attachments/e28623cf0d93/pages/article.md"
}